Skip to content

How to Check Your Own Genome Against ClinVar

Oak
A feathered dinosaur-like creature on a steel pedestal in a dark studio, its plumage marked with rows of glowing star shapes.

By the end of this you will have your own whole-genome VCF annotated with ClinVar classifications, review status, and condition names, a short triage list of high-confidence pathogenic and likely pathogenic hits filtered by review status and population frequency, and a script that re-runs the join against each weekly ClinVar release so you find out when one of your variants gets reclassified. You need the following.

  • a germline VCF called against GRCh38 (research-grade WGS is fine for this exercise)
  • the matching reference FASTA
  • bcftools 1.19 or newer
  • tabix
  • about 10 GB of free disk
  • a few hours

Nothing here is diagnostic. A pathogenic hit in a research VCF is a hypothesis about your sample and your pipeline, and confirming it takes an orthogonal assay in a CLIA/CAP lab plus a clinical geneticist or genetic counselor to interpret it against your history. Say that out loud before you start, because the failure mode of this exercise is believing a false positive.

1. Download the ClinVar files you need

Three files cover almost everything:

mkdir -p clinvar && cd clinvar
BASE=https://ftp.ncbi.nlm.nih.gov/pub/clinvar
curl -O $BASE/vcf_GRCh38/clinvar.vcf.gz
curl -O $BASE/vcf_GRCh38/clinvar.vcf.gz.tbi
curl -O $BASE/tab_delimited/variant_summary.txt.gz
curl -O $BASE/tab_delimited/submission_summary.txt.gz

The file clinvar.vcf.gz is the aggregated, per-variant view, with one line per ClinVar variant carrying the aggregate classification. The file variant_summary.txt.gz is the same content in TSV with more columns. The added columns are both assemblies, phenotype lists, submitter counts and VariationID. The file submission_summary.txt.gz is the layer most people skip and the one that matters. It has one row per submitted record (SCV). Each row gives the submitting lab, the date it was last evaluated, and often a free-text explanation.

The files at those paths are overwritten weekly. For anything you want to reproduce, pull a dated file instead. The vcf_GRCh38/ directory keeps dated releases, and older ones live under archive_2.0/<year>/. Record the filename in your notes. Otherwise a rerun three weeks later silently gives different answers.

Start by reading the INFO header rather than trusting a blog post, including this one:

bcftools view -h clinvar.vcf.gz | grep '^##INFO'

The fields you will use are listed here.

  • CLNSIG (aggregate germline classification)
  • CLNREVSTAT (review status, the stars)
  • CLNDN (condition names)
  • CLNSIGCONF (the breakdown when submitters conflict)
  • CLNHGVS
  • GENEINFO
  • ALLELEID
  • CLNVC (variant type)
  • RS

ClinVar added somatic and oncogenicity classifications in 2024, which appear as separate ONC* and SCI* fields. Those describe tumor variants and have no bearing on a germline blood sample, so leave them out of the join. The same 2024 change renamed several CLNSIG values, most visibly Conflicting_interpretations_of_pathogenicity to Conflicting_classifications_of_pathogenicity. Old scripts that string-match the former quietly stop matching anything.

2. Answer “how many pathogenic variants are in ClinVar” yourself

The number moves every week, so compute it instead of quoting one. Look at the header first, then index columns by name so the awk keeps working when NCBI adds a column:

zcat variant_summary.txt.gz | head -1 | tr '\t' '\n' | cat -n

zcat variant_summary.txt.gz | awk -F'\t' '
  NR==1 { for (i=1;i<=NF;i++) c[$i]=i; next }
  $c["Assembly"]=="GRCh38" &&
  $c["ClinicalSignificance"] ~ /^(Pathogenic|Likely pathogenic|Pathogenic\/Likely pathogenic)/ \
    { print $c["VariationID"] }' | sort -u | wc -l

Swap the regex for Uncertain significance and you get the VUS count, which is several times larger. That ratio is the real story of the database: most submitted variation has no confident classification, and most genes have no functional assay to resolve it, which is why systematic variant effect maps are being prioritized gene by gene 1.

3. Make the two VCFs coordinate-compatible

Two mismatches break this join more often than anything else: chromosome naming and indel representation.

ClinVar’s GRCh38 VCF uses 1, 2, … X, Y and MT. Most pipelines (GATK, DRAGEN) emit chr1 … chrX, chrM. Rename the ClinVar contigs and do not touch your own file:

for c in {1..22} X Y; do printf "%s\tchr%s\n" "$c" "$c"; done > chr_map.txt
printf "MT\tchrM\n" >> chr_map.txt
bcftools annotate --rename-chrs chr_map.txt clinvar.vcf.gz -Oz -o clinvar.chr.vcf.gz
tabix -p vcf clinvar.chr.vcf.gz

Then normalize your calls. ClinVar records are left-aligned and parsimonious against the reference. If yours are not, every indel silently fails to match while SNVs match fine, which is a convincing-looking partial result:

bcftools norm -m -any -f GRCh38.fa -c ws yours.vcf.gz -Ou \
  | bcftools norm -d exact -Oz -o yours.norm.vcf.gz
tabix -p vcf yours.norm.vcf.gz

-m -any splits multiallelic sites into one record per ALT, which is required because bcftools annotate matches on the full REF/ALT pair. -c ws warns on and fixes REF alleles that disagree with the reference, and a flood of those warnings means your VCF is not really GRCh38. If it is GRCh37, do not lift over ClinVar. Download vcf_GRCh37/clinvar.vcf.gz instead. Better still, realign and recall, because GRCh37 coordinates are where most cross-database inconsistency comes from.

4. Do the annotation and dump the hits

bcftools annotate -a clinvar.chr.vcf.gz \
  -c INFO/ALLELEID,INFO/CLNSIG,INFO/CLNSIGCONF,INFO/CLNREVSTAT,INFO/CLNDN,INFO/CLNVC,INFO/GENEINFO,INFO/RS \
  -Oz -o yours.clinvar.vcf.gz yours.norm.vcf.gz
tabix -p vcf yours.clinvar.vcf.gz

Now pull the records where you carry a non-reference allele and ClinVar calls it pathogenic or likely pathogenic:

bcftools query \
  -i 'CLNSIG~"athogenic" && CLNSIG!~"Conflicting" && GT!="0/0" && GT!="./."' \
  -f '%CHROM\t%POS\t%REF\t%ALT\t%INFO/GENEINFO\t%INFO/CLNSIG\t%INFO/CLNREVSTAT\t%INFO/CLNDN\t[%GT\t%DP\t%GQ]\n' \
  yours.clinvar.vcf.gz | sort -k6,6 > hits.tsv

The ~"athogenic" trick catches both Pathogenic and Likely_pathogenic without catching Benign, at the cost of also catching Conflicting_classifications_of_pathogenicity, which the second clause removes. Keep those conflicting records in a separate file, because a two-submitter conflict between a clinical lab and a 2013 research submission is a different object from a genuine split.

On a 30x WGS you should expect this list to be long, in the hundreds. That is not a finding. Most of it is recessive carrier status, low-penetrance risk alleles, old submissions, and mis-assertions.

5. Read the stars before you read the classification

CLNREVSTAT is the single most useful field in the file and the one casual users ignore. The mapping:

  • 4 stars, practice_guideline: classification comes from an accepted practice guideline.
  • 3 stars, reviewed_by_expert_panel: a ClinGen Variant Curation Expert Panel classified it using a gene-specific ACMG/AMP specification.
  • 2 stars, criteria_provided,_multiple_submitters,_no_conflicts.
  • 1 star, criteria_provided,_single_submitter or criteria_provided,_conflicting_classifications.
  • 0 stars, no_assertion_criteria_provided or no_classification_provided.

Our rule: treat 3 and 4 stars as the only classifications worth acting on without independent reading, treat 2 stars as a real signal that still deserves a look at the underlying submissions, treat 1 star as a lead, and treat 0 stars as noise until proven otherwise. Zero-star records include large legacy batches whose provenance you cannot reconstruct. Cross-database comparisons make the point concretely: integrative analysis of ClinVar, HGMD, and dbSNP across primary immunodeficiency genes finds substantial disagreement in which variants are called disease-causing and how confidently 2.

Filter accordingly:

awk -F'\t' '$7 ~ /practice_guideline|expert_panel|multiple_submitters,_no_conflicts/' hits.tsv > hits.2star.tsv

6. Filter by frequency and by gene, then stop filtering

Two more passes cut the list to something a human can read.

Frequency. A variant claimed to cause a rare dominant condition should be rare. If gnomAD v4 shows a global allele frequency above roughly 0.5%, and especially above 1%, the pathogenic assertion is suspect for a highly penetrant dominant phenotype. Such a frequency is perfectly consistent with a common recessive carrier allele such as HFE p.C282Y. Annotate from the gnomAD sites VCF with a second bcftools annotate -a gnomad.genomes.sites.vcf.bgz -c INFO/AF and sort by AF descending. Reading your list from the top down is an efficient way to see where ClinVar’s tail of over-called variants sits. Population surveys have found ClinVar pathogenic variants at higher frequencies in unselected clinical cohorts than the corresponding disease prevalence would predict, which is exactly the pattern you are looking for 3.

Gene scope. If your question is “is there anything here I could do something about,” restrict to the ACMG secondary-findings gene list (about 80 genes, published as SF v3.2) plus any pharmacogenes you care about. If your question is “what am I a carrier for,” restrict to recessive conditions with GT of 0/1. Build the gene list as a file and use grep -wFf genes.txt.

Do not add a third and fourth filter after this. Each one changes your false-negative rate in a way you cannot estimate, and the point of the exercise is to get to a small list you read carefully.

7. Go from a variant to its evidence

For each surviving row, get the VariationID and pull every individual submission:

VID=$(zcat variant_summary.txt.gz | awk -F'\t' -v ch=chr13 -v pos=32339132 '
  NR==1{for(i=1;i<=NF;i++)c[$i]=i; next}
  $c["Assembly"]=="GRCh38" && "chr" $c["Chromosome"]==ch && $c["PositionVCF"]==pos {print $c["VariationID"]}' | head -1)

zcat submission_summary.txt.gz | awk -F'\t' -v v="$VID" '$1==v' | cut -f2,3,7,10,11,13

That gives you the following for each SCV.

  • the classification
  • the date last evaluated
  • that submitter’s review status
  • the submitter name
  • the accession
  • the explanation text

Read it. A 2016 single-submitter “Likely pathogenic” with no explanation and a 2024 expert-panel “Benign” on the same variant is common, and the aggregate CLNSIG will show the conflict without telling you which side is credible. Then open https://www.ncbi.nlm.nih.gov/clinvar/variation/$VID/ and read the ClinGen criteria codes (PS3, PM2, PP3 and so on) where submitters provided them.

On the two questions people always ask here. “Likely pathogenic” is defined in the 2015 ACMG/AMP framework as greater than 90% certainty that the variant is disease-causing. The threshold was adopted as a working convention for reporting and is not a measured reclassification rate. Observed reclassification behavior varies by gene, by lab, and by how much population data has arrived since the classification date, so treat the 90% as a labeling convention. And “no pathogenic or likely pathogenic variants causative of the reported phenotype were detected” on a clinical report means three things at once: within the genes and regions the assay covered, within the variant types it can detect, and given today’s classifications. It is not a statement that your genome is clean. Any of the three can change.

For variants that come back Uncertain, resist the urge to settle the question with a prediction score. Modern in-silico predictors, including graph neural network models that classify multiple variant types, are trained on ClinVar labels. Their agreement with ClinVar is therefore partly circular, and their confidence on a genuinely novel variant is not calibrated the way the training metrics suggest 4. The same caution applies to noncoding variants, where a single global CADD cutoff performs poorly and region-aware thresholds are needed before a score means anything 5. If you want supporting evidence beyond the database, look for a published deep mutational scan of the gene 1, and check whether the gene-disease relationship itself is well supported in the literature rather than assumed 6.

8. Re-run it on a schedule and diff the classifications

Reclassification is the reason to keep your own copy of this pipeline. Save the annotated set each month, then diff:

bcftools query -f '%CHROM:%POS:%REF:%ALT\t%INFO/CLNSIG\t%INFO/CLNREVSTAT\n' \
  yours.clinvar.2026-08.vcf.gz | sort > aug.tsv
bcftools query -f '%CHROM:%POS:%REF:%ALT\t%INFO/CLNSIG\t%INFO/CLNREVSTAT\n' \
  yours.clinvar.2026-09.vcf.gz | sort > sep.tsv
join -t $'\t' aug.tsv sep.tsv | awk -F'\t' '$2!=$4 || $3!=$5'

Run it monthly from cron. Most weeks the diff is empty or shows a star upgrade. Occasionally a variant you carry moves from VUS to Likely pathogenic, or from Pathogenic to Benign, and that is worth knowing the week it happens rather than five years later.

Common problems

Zero indel matches, plenty of SNV matches. Your VCF is not normalized. Rerun step 3 and confirm with bcftools norm -c ws producing no REF mismatch warnings.

Everything matches on position but nothing gets annotated. Different ALT allele at the same position. bcftools annotate requires REF and ALT to match exactly. To catch these, do a second pass with bcftools isec -n=2 at position level, or intersect on CHROM:POS only. Then inspect the handful of rows by hand.

Mitochondrial variants missing. MT versus chrM in the rename file, or a reference built on rCRS versus the older Yoruba sequence. Check the contig length in your header: rCRS is 16,569 bp.

Hundreds of homozygous pathogenic calls. Look at DP and GQ in your query output. Homozygous-alt calls in low-coverage or segmental-duplication regions are a pipeline artifact. Genes with high-identity pseudogenes (PMS2, SMN1, CYP21A2, HBA1/HBA2 and NEB) are where short-read WGS misbehaves most, and no amount of ClinVar filtering fixes a mismapped read.

Variant classes your VCF cannot contain. Repeat expansions, large CNVs and exon-level deletions, structural rearrangements, and methylation-based imprinting defects. ClinVar contains many such records, and a small-variant VCF will never match them. If you want them, run a dedicated caller (ExpansionHunter, GATK-gCNV, Manta) and join those outputs separately.

Somatic records leaking in. If you annotated ONC* or SCI* fields, drop them. They describe tumor tissue and say nothing about a germline blood sample.

A confident-looking answer from a general annotation tool. VEP, snpEff, and commercial interpretation stacks all bundle a ClinVar snapshot, sometimes months stale, sometimes with the classification collapsed to a single word and the stars discarded. The review status is the part you need. Pipelines that report “Pathogenic” without it are throwing away the signal that separates an expert panel from a decade-old single submission 7.

Anything that survives all of the above. Stop analyzing and take it to a clinician. Research WGS is not a diagnostic test, confirmation requires an orthogonal assay in an accredited lab, and the interpretation depends on family history and phenotype that no database has.

Footnotes

  1. Da Kuang, Rebecca Truty, Jochen Weile, et al. Prioritizing genes for systematic variant effect mapping. Bioinformatics, 2020. https://doi.org/10.1093/bioinformatics/btaa1008 ↩ ↩2

  2. Lyubov E. Salnikova, Dmitry Kolobkov, Darya A. Sviridova, et al. An overview of germline variations in genes of primary immunodeficiences through integrative analysis of ClinVar, HGMD® and dbSNP databases. Human Genetics, 2021. https://doi.org/10.1007/s00439-021-02316-w ↩

  3. Dana C. Crawford, J. P. Lin, Jessica N. Cooke Bailey, et al. Frequency of ClinVar Pathogenic Variants in Chronic Kidney Disease Patients Surveyed for Return of Research Results at a Cleveland Public Hospital. 2019. https://doi.org/10.1142/9789811215636_0051 ↩

  4. Hongtao Yu, Guojing He, Wei Wang, et al. A graph neural network approach for accurate prediction of pathogenicity in multi-type variants. Briefings in Bioinformatics, 2025. https://doi.org/10.1093/bib/bbaf151 ↩

  5. Jude-Félix Tenywa, Jean-Baptiste Lamouche, Sarah Baer, et al. Genome region aware CADD thresholds for noncoding variant prioritization. NAR Genomics and Bioinformatics, 2025. https://doi.org/10.1093/nargab/lqaf157 ↩

  6. Peng-Hsuan Li, Yih-Yun Sun, Hsueh‐Fen Juan, et al. A large language model framework for literature-based disease–gene association prediction. Briefings in Bioinformatics, 2024. https://doi.org/10.1093/bib/bbaf070 ↩

  7. Mansura Akter Enni, Bangladesh. BIOINFORMATICS-DRIVEN APPROACHES IN PUBLIC HEALTH GENOMICS: A REVIEW OF COMPUTATIONAL SNP AND MUTATION ANALYSIS. 2025. https://doi.org/10.63125/e6pxkn12 ↩

Oak builds longitudinal molecular profiles of individuals: whole-genome sequencing, blood RNA sequencing, and plasma proteomics, delivered as a detailed report plus every data file. Build your profile.