Back to Blog
Clinical GenomicsVariant AnnotationCancer Genomics

Variant Annotation and ACMG Classification: From VCF to Clinical Meaning with VEP

Why a raw VCF is clinically meaningless until annotated, how VEP, ANNOVAR, and SnpEff add evidence, and how it maps onto ACMG's five-tier classification.

SSSudipta SardarJuly 20, 202611 min read
Variant Annotation and ACMG Classification: From VCF to Clinical Meaning with VEP

A finished VCF looks like an answer, but clinically it is barely a question. A line that reads chr17 43093464 . C T tells you a single base changed on chromosome 17, and nothing else — not which gene it sits in, not whether it breaks a protein, not whether it's common and harmless, not whether a diagnostic lab has already logged it as pathogenic. Variant annotation is the step that attaches all of that missing context, and ACMG classification is the framework that turns the assembled context into a verdict a clinician can act on. This post traces that chain: how VEP, ANNOVAR, and SnpEff bolt evidence onto every variant, and how that evidence lands in one of five clinical tiers.

Why a Raw VCF Is Clinically Meaningless

A VCF encodes position, reference allele, and alternate allele precisely — see the VCF file format explained if the columns look unfamiliar — but position is not meaning. The same C→T change is silent in one gene, a premature stop codon in another, and a splice disruption in a third, depending on the transcript it falls in. Coordinates alone cannot tell you which.

A whole-genome VCF also carries roughly 4-5 million variants per individual, a whole-exome VCF tens of thousands, and the overwhelming majority are common, benign polymorphism. The clinical task is never "list the variants" — the caller already did that — it's "find the one or two that explain the phenotype," a triage impossible until every variant carries gene, consequence, frequency, and prior evidence. Annotation is the bridge from a technically correct list to a biologically interpretable one.

What Annotation Actually Adds

Annotation layers several independent kinds of evidence onto each row. It helps to keep them mentally separate, because ACMG later weighs them separately:

  • Genomic context: which gene and transcript the variant overlaps, and whether it is exonic, intronic, UTR, or intergenic.
  • Functional consequence: the predicted effect on the protein — missense_variant, stop_gained, frameshift_variant, splice_donor_variant, synonymous_variant, and so on, using Sequence Ontology terms.
  • Population frequency: how common the allele is in reference cohorts like gnomAD, broken down by ancestry.
  • Prior clinical assertions: whether ClinVar, HGMD, or a somatic database like COSMIC already records the variant and with what interpretation.
  • In silico predictions: computational guesses at deleteriousness from tools such as REVEL, CADD, SpliceAI, or AlphaMissense.

Only once all five layers exist can a variant be reasoned about. A stop_gained in a known haploinsufficient gene, absent from gnomAD, already flagged pathogenic in ClinVar, is a very different object from a missense_variant seen in 3% of Europeans.

Ensembl VEP, ANNOVAR, and SnpEff Compared

Three annotators dominate practice, overlapping heavily in what they report but differing in philosophy, data model, and operational friction.

FeatureEnsembl VEPANNOVARSnpEff
Core languagePerl (also REST/Docker)PerlJava
Transcript modelEnsembl/GENCODE, RefSeq optionalRefSeq default, others availableEnsembl/RefSeq per database
Consequence termsFull Sequence OntologyCustom + refGeneSequence Ontology + own effects
ExtensibilityRich plugin system (--plugin)-protocol/-operation stackingSnpSift companion for filtering
Frequency + ClinVarVia cache, custom, and pluginsVia downloaded -protocol DBsVia SnpSift annotate
Typical useDeep, canonical, per-transcriptFast, table-style, flexible DBsPipeline-friendly, HGVS effects

VEP, from Ensembl, is the most thorough. It annotates every affected transcript by default, emits precise HGVS nomenclature, and exposes a plugin ecosystem that pulls in gnomAD frequencies, REVEL scores, SpliceAI, and dbNSFP. A minimal run looks like:

bash
vep \
  -i sample.vcf.gz \
  --cache --offline --assembly GRCh38 \
  --everything \
  --plugin dbNSFP,/data/dbNSFP4.5a.gz,REVEL_score,CADD_phred \
  --vcf -o sample.vep.vcf.gz --compress_output bgzip

The --offline --cache combination makes VEP reproducible: it reads a versioned local cache instead of phoning the Ensembl API, so results stay stable over time. --everything switches on the common annotation bundle — frequencies, consequences, canonical flags — in one flag.

ANNOVAR takes a table-first approach. You stack "protocols" (databases) against "operations" (gene-based, filter-based, region-based), and it emits a flat multi-column table that many clinical pipelines find easy to parse:

bash
table_annovar.pl sample.avinput humandb/ \
  -buildver hg38 \
  -protocol refGene,gnomad41_exome,clinvar_20240917,dbnsfp47a \
  -operation g,f,f,f \
  -nastring . -vcfinput -out sample.annovar

SnpEff, written in Java, is the most pipeline-portable — a single jar, no compiled dependencies — and pairs with SnpSift for downstream filtering. It is popular inside nextflow and snakemake workflows because it installs cleanly through conda and bioconda and runs anywhere a JVM does.

The single most common annotation bug is a genome-build mismatch. Annotate a GRCh38 VCF against a GRCh37/hg19 cache and coordinates silently point at the wrong gene, corrupting every downstream call. Always confirm your VCF, annotation cache, and frequency databases share the same assembly before trusting a single line of output.

Population Frequency: gnomAD as the First Filter

Population frequency is the fastest, highest-yield filter in the workflow. The logic is simple: a variant causing a severe, penetrant, early-onset dominant disorder cannot also be common in a healthy adult cohort, because carriers would be selected against — so a high allele frequency is strong evidence against pathogenicity for such conditions.

gnomAD v4 aggregates hundreds of thousands of exomes and genomes, reporting allele frequency per ancestry group plus a global maximum. A rare-disease pipeline typically discards anything above a condition-specific threshold — often around AF > 0.01 for candidate genes, far lower for highly penetrant dominant disease. Use the population-maximum frequency, not the global average: a variant benign-but-common in one ancestry can look deceptively rare in a globally averaged number.

Frequency thresholds are not one-size-fits-all. A recessive carrier variant can sit at a few percent in gnomAD and still be pathogenic when inherited in trans with a second hit. Never auto-drop variants on frequency alone without accounting for the disorder's inheritance model.

From ClinVar and In Silico Scores to Evidence

Where frequency argues from absence, ClinVar argues from precedent. It is NCBI's public archive of variant-condition assertions submitted by clinical labs, each carrying a review status from a single submitter up to "reviewed by expert panel" and "practice guideline." A pathogenic call from multiple independent labs is powerful evidence; a lone "uncertain significance" submission is weak — the review-star level, not just the label, is what you weigh.

In silico predictors fill the gap for novel variants no lab has seen. Tools like REVEL and AlphaMissense score missense deleteriousness, SpliceAI predicts splice disruption from sequence, and CADD ranks overall deleteriousness genome-wide. These are supporting evidence only — they nudge a classification, they never decide it. Treating a CADD_phred > 20 as proof of pathogenicity is a classic overreach.

Mapping Evidence onto ACMG/AMP Tiers

The 2015 ACMG/AMP guidelines are the framework that turns this pile of annotations into a clinical verdict, via evidence codes weighted by strength and split into two directions:

  • Pathogenic evidencePVS1 (very strong: a null variant in a gene where loss of function causes disease), PS1-PS4 (strong), PM1-PM6 (moderate), PP1-PP5 (supporting).
  • Benign evidenceBA1 (stand-alone: allele frequency too high for the disorder), BS1-BS4 (strong), BP1-BP7 (supporting).

Each annotation layer feeds specific codes: a stop_gained in a loss-of-function gene triggers PVS1; absence from gnomAD contributes PM2; a frequency above the disorder's expectation triggers BA1 or BS1; concordant in silico predictions supply PP3, conflicting ones BP4; and prior ClinVar pathogenic assertions can support PS1 or PP5. Counting rules then combine the codes into five tiers:

TierLabelRough combining logic
5Pathogenice.g. 1 Very Strong + 1 Strong, or 2 Strong
4Likely Pathogenice.g. 1 Strong + 1-2 Moderate
3Uncertain Significance (VUS)evidence insufficient or conflicting
2Likely Benigne.g. 1 Strong + 1 Supporting benign
1Benigne.g. stand-alone BA1, or 2 Strong benign

Most variants land in tier 3, the VUS bucket — a genuine reflection of how much remains unknown, not a pipeline failure. Tools like InterVar, Franklin, and TAPES semi-automate code assignment from annotated VCFs, but ACMG guidelines require human expert judgment for final sign-off: automation proposes, a clinical scientist disposes.

Germline Versus Somatic: A Different Rulebook

One critical caveat: ACMG/AMP 2015 governs germline variants in inherited disease. Somatic cancer variants follow a separate framework — the AMP/ASCO/CAP tiers, which classify by clinical actionability rather than pathogenicity. A somatic caller like Mutect2, covered in somatic vs germline variant calling, produces variants annotated against COSMIC and OncoKB, not ClinVar and gnomAD. Applying germline ACMG rules to a tumor variant is a category error that surfaces more often than it should. Know which rulebook a variant belongs to before classifying it.

Practical Takeaways

  • A raw VCF is a coordinate list, not a diagnosis; annotation attaches gene, consequence, frequency, and prior evidence before any variant can be interpreted.
  • Use VEP for depth and canonical per-transcript detail, ANNOVAR for fast flexible table-style databases, and SnpEff for lightweight pipeline portability — many labs run two and reconcile.
  • Always confirm that VCF assembly, annotation cache, and frequency databases share the same genome build (GRCh38 vs hg19); a mismatch corrupts everything silently.
  • Population frequency from gnomAD is your highest-yield first filter, but tune the threshold to the disorder's inheritance model instead of blanket-dropping on AF > 0.01.
  • ClinVar review-star level and in silico scores are weighted evidence, never standalone proof; feed them into ACMG codes, don't shortcut past them.
  • ACMG/AMP 2015 five tiers apply to germline disease; somatic cancer variants use the separate AMP/ASCO/CAP actionability framework.

Annotation is only as reproducible as the environment it runs in, so pin your VEP cache version, database releases, and tool versions like any other dependency. Building a clinical-grade pipeline from scratch? Start upstream with a clean GATK4 variant-calling workflow and manage every tool through conda and bioconda channels, so the same VCF annotates identically today and a year from now.