Skip to content

The Best VCF Annotation Tools, and Which One to Run First

Oak
A huge fallen tree in a glowing forest covered in tiny marked notches, with two streams of luminous moths tagging and checking them.

If you have one whole-genome VCF and a laptop or a single cloud box, run Ensembl VEP offline for consequence prediction, then run vcfanno to attach population frequencies and clinical databases. That pairing covers almost everything a technically fluent person wants from a personal genome, it runs without network calls, and both tools are free. ANNOVAR remains the better choice if you want a wide, flat table of many precomputed scores in one pass 1. snpEff is the right answer when you need speed and a small install. Below is why we make that call, the exact flags, and the places where annotation quietly goes wrong.

Annotation is two separate jobs

The word “annotation” hides two operations that behave very differently. The first is consequence prediction: given a variant and a transcript model, work out whether the change is missense, splice-region, frameshift, or intergenic, and produce HGVS notation. This requires a gene model and a reference FASTA, and the answer depends on which transcript set you chose.

The second job is a database join. You have a variant and you want to know its allele frequency in gnomAD, whether ClinVar has a submission for it, and what CADD or REVEL score it carries. This is an interval or position lookup against large tabix-indexed files, and correctness depends almost entirely on coordinate normalization rather than on biology.

Conflating the two is the most common reason people pick the wrong tool. Reviews of the annotation ecosystem describe this split between structural or functional prediction and evidence aggregation from external resources 2. Keep the jobs separate in your pipeline and you can swap either half without rebuilding the other.

What we run for consequence prediction: VEP, offline

VEP with a local cache is our default. The cache removes network latency and version drift, and the plugin system lets you add scores without changing the core command. Budget tens of gigabytes of disk for a GRCh38 cache plus a reference FASTA, and expect the first download to dominate setup time.

A working invocation for a single-sample genome:

vep \
  --input_file sample.norm.vcf.gz \
  --output_file sample.vep.vcf.gz \
  --vcf --compress_output bgzip \
  --offline --cache --dir_cache /data/vep \
  --assembly GRCh38 --fasta /data/GRCh38.fa \
  --hgvs --symbol --numbers --canonical --biotype \
  --sift b --polyphen b \
  --pick_allele_gene \
  --fork 8 --buffer_size 10000 \
  --stats_file sample.vep.html

Two flags deserve comment. --fasta is what makes HGVS notation correct. Without it VEP will skip HGVS or produce it inconsistently. --pick_allele_gene collapses the transcript explosion to one consequence per allele per gene, which keeps the VCF readable. If you plan to do your own transcript selection, drop it and accept a much larger INFO field.

Avoid --everything on a whole genome unless you have time to spare. It turns on regulatory features, many database lookups, and per-transcript output at once. Runtime grows accordingly. Turn on what you will read.

bcftools csq is a good alternative for the consequence step alone. It is fast and it needs only a GFF3 and a FASTA. It also handles phased compound changes within a codon, which VEP does not do by default. In return it gives you far less than VEP, so we use it as a cross-check rather than a replacement.

What we run for database joins: vcfanno

vcfanno annotates a VCF from an arbitrary set of tabix-indexed VCF, BED, or GFF files described in a small TOML config. It parallelizes well and uses a chromosome-sweeping strategy that keeps memory flat, with reported throughput in the range of hundreds of thousands of variants per second against many annotation files 3. For a personal genome that means minutes. The job does not take hours.

A config fragment:

[[annotation]]
file = "gnomad.genomes.sites.vcf.gz"
fields = ["AF", "AF_grpmax", "nhomalt"]
names = ["gnomad_af", "gnomad_af_grpmax", "gnomad_nhomalt"]
ops = ["self", "self", "self"]

[[annotation]]
file = "clinvar.vcf.gz"
fields = ["CLNSIG", "CLNREVSTAT", "CLNDN"]
names = ["clnsig", "clnrevstat", "clndn"]
ops = ["self", "self", "self"]

[[annotation]]
file = "dbnsfp.txt.gz"
columns = [19, 25]
names = ["cadd_phred", "revel"]
ops = ["max", "max"]

Run it with vcfanno -p 8 -lua custom.lua conf.toml sample.vep.vcf.gz | bgzip > sample.annot.vcf.gz. The ops field matters: use self when the annotation file has one record per allele and you want exact allele matching, and max or mean when you are summarizing overlapping records. Choosing self on a file whose records do not align allele-by-allele produces missing values rather than wrong ones, which is the failure mode you want.

When ANNOVAR or snpEff is the better tool

ANNOVAR’s table_annovar.pl writes a tab-delimited matrix with one row per variant and one column per database. If your next step is pandas or R rather than a VCF parser, that format saves real work. The protocol is well documented and covers gene-based, region-based, and filter-based annotation plus the wANNOVAR web front end 1. The costs are licensing terms that are not fully open and a database download step you manage yourself.

snpEff is the lightest option. A single JAR, a downloadable genome database, and consequence annotations written into the ANN INFO field. We reach for it on machines where a VEP cache will not fit, or inside a container that must stay small. Its companion tool SnpSift handles frequency and ClinVar joins if you would rather not add vcfanno.

Larger aggregation pipelines exist when you want breadth over control. WGSA assembles a wide set of variant-level and gene-level annotations for whole-genome studies 4. FAVOR provides functional annotations across the genome through a web resource and a bulk annotator 5. GUI-first tools like VarAFT and VCF-Miner are built for filtering and browsing rather than scripting 6 7. variant tools takes the database-backed route, storing variants and annotations in a managed store you query 8. If you are comfortable at a shell, none of these beat VEP plus vcfanno for a single genome.

The failure modes that matter

Normalize before you annotate. Run bcftools norm -f GRCh38.fa -m -any -c w -Oz -o sample.norm.vcf.gz sample.vcf.gz. That splits multiallelic records, left-aligns indels, and warns on reference mismatches. An unnormalized indel will fail an exact-allele join against gnomAD and come back with no frequency, and you will read that absence as “rare”.

Transcript choice changes the answer. The same variant can be missense against one transcript and intronic against another, and a systematic comparison of annotation tools and clinical databases found substantial discordance in variant naming and consequence calls across tools 9. Record which cache version, which transcript set, and which tool version produced each annotated file. Two runs six months apart are not comparable otherwise.

Watch assembly and chromosome naming. A chr1 VCF joined against a 1 annotation file silently produces zero hits. Check with bcftools index -s on both files before you trust a run. Pipelines assembled from mixed sources are a recurring source of this class of error 10.

Finally, treat ClinVar fields as evidence rather than conclusions. Read CLNREVSTAT alongside CLNSIG, because a single-submitter assertion and an expert-panel review carry very different weight. Anything that looks clinically consequential in your own data belongs in front of a clinician or a genetic counselor who can order confirmatory testing. Research-grade annotation on a research-grade VCF is not a diagnostic result.

Questions people also ask

Which VCF annotation tools are free? VEP, snpEff, bcftools csq, vcfanno, and slivar are open source and free for any use. ANNOVAR is free for academic and personal use but requires registration and has restrictions on commercial use. The underlying databases carry their own terms, and gnomAD and ClinVar are both freely redistributable.

Are there good online VCF annotation tools? Yes, and they are the fastest way to check a handful of variants. wANNOVAR accepts a small VCF or variant list and returns an annotated table 1. FAVOR serves functional annotations through a browser and offers a bulk annotator for larger inputs 5. For a whole genome we would not upload the file: local annotation is faster, reproducible, and keeps your data on your own disk.

How long does annotating a whole-genome VCF take? With eight cores, expect roughly a few hours for VEP on four to five million variants with a moderate flag set, and minutes for the vcfanno pass. Turning on the full VEP plugin set can multiply that several times over.

Do I need both VEP and vcfanno? They do different jobs. VEP gives you consequence and HGVS from a transcript model. vcfanno attaches external data quickly and lets you add a new database by editing four lines of TOML 3.

Footnotes

  1. Hui Yang, Kai Wang. Genomic variant annotation and prioritization with ANNOVAR and wANNOVAR. Nature Protocols, 2015. https://doi.org/10.1038/nprot.2015.105 ↩ ↩2 ↩3

  2. Girum Fitihamlak Ejigu, Jaehee Jung. Review on the Computational Genome Annotation of Sequences Obtained by Next-Generation Sequencing. Biology, 2020. https://doi.org/10.3390/biology9090295 ↩

  3. Brent S. Pedersen, Ryan M. Layer, Aaron R. Quinlan. Vcfanno: fast, flexible annotation of genetic variants. Genome Biology, 2016. https://doi.org/10.1186/s13059-016-0973-5 ↩ ↩2

  4. Xiaoming Liu, Simon White, Bo Peng, et al. WGSA: an annotation pipeline for human genome sequencing studies. Journal of Medical Genetics, 2015. https://doi.org/10.1136/jmedgenet-2015-103423 ↩

  5. Hufeng Zhou, Theodore Arapoglou, Xihao Li, et al. FAVOR: functional annotation of variants online resource and annotator for variation across the human genome. Nucleic Acids Research, 2022. https://doi.org/10.1093/nar/gkac966 ↩ ↩2

  6. Jean-Pierre Desvignes, Marc Bartoli, Valérie Delague, et al. VarAFT: a variant annotation and filtration system for human next generation sequencing data. Nucleic Acids Research, 2018. https://doi.org/10.1093/nar/gky471 ↩

  7. Steven N. Hart, Patrick Duffy, Daniel J. Quest, et al. VCF-Miner: GUI-based application for mining variants and annotations stored in VCF files. Briefings in Bioinformatics, 2015. https://doi.org/10.1093/bib/bbv051 ↩

  8. F. Anthony San Lucas, Gao Wang, Paul Scheet, et al. Integrated annotation and analysis of genetic variants from next-generation sequencing studies with variant tools. Bioinformatics, 2011. https://doi.org/10.1093/bioinformatics/btr667 ↩

  9. Jennifer L. Yen, Sarah Garcia, Aldrin Montana, et al. A variant by any name: quantifying annotation discordance across tools and clinical databases. Genome Medicine, 2017. https://doi.org/10.1186/s13073-016-0396-7 ↩

  10. Zeeshan Ahmed, Eduard Gibert Renart, Saman Zeeshan. Genomics pipelines to investigate susceptibility in whole genome and exome sequenced data for variant discovery, annotation, prediction and genotyping. PeerJ, 2021. https://doi.org/10.7717/peerj.11724 ↩

Pothos builds longitudinal molecular profiles of individuals: whole-genome sequencing, single-cell RNA sequencing, and plasma proteomics, delivered as a detailed report, every data file, and stored cells. Build your profile.