Skip to content
/file-formats/vcf

VCF (Variant Call Format)

A tab-delimited text format that records differences between a sequenced sample and a reference genome, one line per variant site, with per-sample genotypes and quality annotations.

A VCF file is a tab-delimited text record of the positions where your sequenced DNA differs from a reference genome, plus the evidence and genotype calls at each of those positions. It is the standard handoff point between a variant caller and everything downstream: annotation, filtering, polygenic scores, clinical review.

How it works

A VCF has two parts. The header is every line starting with ##, declaring the reference used, the contigs and their lengths, and the meaning of every key that appears later in the INFO and FORMAT columns. Then one #CHROM line names the eight fixed columns and the samples. Everything after is data, one variant per line:

#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1
chr1 817186 rs3094315 G A 1284.6 PASS AF=0.5;DP=42 GT:AD:DP:GQ:PL 0/1:21,21:42:99:1293,0,1287

POS is 1-based. REF is the reference allele at that position, ALT is the alternate (comma-separated if multiallelic). QUAL is a Phred-scaled confidence that a variant exists there. FILTER is PASS or a comma-separated list of filter names defined in the header. INFO holds site-level annotations; FORMAT declares which per-sample fields follow, in order.

The genotype field GT is what most people want. 0/1 is heterozygous, 1/1 homozygous alternate, 0/0 homozygous reference, ./. no call. A pipe (0|1) means the call is phased: you know which alleles sit on the same chromosome copy. AD is the allelic depth (reference reads, alt reads), DP the total depth, GQ the genotype quality, PL the Phred-scaled likelihoods of each genotype.

Indels are represented with padding. A single-base deletion at position 1000 appears as REF=CA ALT=C at POS 1000, not as a two-base event at 1001. This left-alignment and padding convention is the source of most “why don’t these two VCFs agree” problems, because the same deletion in a homopolymer can be written at several positions. Normalize before comparing: bcftools norm -f GRCh38.fa -m -any -c w input.vcf.gz -Oz -o norm.vcf.gz splits multiallelics and left-aligns everything against the reference.

In your own data

A 30x human WGS VCF contains roughly 4–5 million variants, about 4 million SNVs and 500k–900k small indels, and compresses to a few hundred megabytes as .vcf.gz. It must be bgzip-compressed, not gzip, and indexed with tabix -p vcf or bcftools index -t before any tool can do a random-access region query.

Start here:

  • bcftools stats sample.vcf.gz | head -40 gives counts, the transition/transversion ratio (expect ~2.0–2.1 genome-wide, ~3.0 in exons; a Ti/Tv far below 2 usually means the call set carries too many false positives), and the het/hom ratio (~1.5–1.7 for most human samples).
  • bcftools view -f PASS -i 'FORMAT/DP>10 & FORMAT/GQ>20' sample.vcf.gz is a sane starting filter for exploration.
  • bcftools query -f '%CHROM\t%POS\t%REF\t%ALT[\t%GT]\n' -r chr9:133255000-133280000 sample.vcf.gz pulls a region as plain TSV you can pipe into anything.

Three mistakes to avoid. First, confusing a VCF with a gVCF: a gVCF from GATK HaplotypeCaller with -ERC GVCF also contains non-variant blocks with <NON_REF> ALT alleles, so a raw row count is meaningless and naive filtering discards reference confidence. Second, mixing reference builds. A chr7 position in GRCh37 is a different base in GRCh38 and different again in T2T-CHM13; read the ##reference header line and the contig names (chr1 versus 1) before merging anything. Third, treating absence of a variant line as reference. If a region had zero coverage, the VCF simply has no row there, which is not the same as a confident 0/0.

Phasing is the field people most often need and most often lack. Short-read pipelines emit unphased genotypes except where a caller locally phases within a haplotype window (GATK writes PS tags for these). Linked-read and long-read approaches recover phase blocks across megabases and resolve structural and repeat-adjacent variation that short reads miss entirely.1 Long-read assembly-based calling meaningfully raises sensitivity for the variant classes short-read alignment handles poorly.2

Limitations

A VCF is a statement about a reference, so it inherits the reference’s blind spots. Sequence present in you but absent from GRCh38 has nowhere to be written, which is the argument for graph-based genome inference.3 Benchmarks against a fully resolved diploid assembly show that call accuracy still varies sharply by region, with segmental duplications and other hard regions far behind the genome-wide average.4 Different callers on identical reads disagree, particularly on indels; comparisons of alignment-based and assembly-based SNV calling show systematic differences in which variants each recovers.5 Evaluations across callers report tool-dependent precision and recall that shift with coverage and genome complexity.6 Treat any single VCF as one caller’s opinion, and where a specific variant would inform a health decision, that needs a clinical-grade laboratory and a genetics professional, not a bcftools query.

Woolf Software builds longitudinal molecular profiles of individuals: whole-genome sequencing, RNA sequencing, proteomics, blood biomarkers, and continuous glucose data, integrated into one model of you. Build your profile.

Computational Angle

Your whole-genome VCF is a few million rows describing how you differ from GRCh38 or T2T-CHM13; almost every downstream question you ask about your genome starts with a bcftools query against it.

Related Terms

References

  1. Patrick Marks, Sarah Garcia, Álvaro Martínez Barrio, et al.. Resolving the full spectrum of human genome variation using Linked-Reads . Genome Research, 2019. DOI
  2. Shloka Negi, Sarah L. Stenton, Seth Berger, et al.. Advancing long-read nanopore genome assembly and accurate variant calling for rare disease detection . The American Journal of Human Genetics, 2025. DOI
  3. Benedict Paten, Adam M. Novak, Jordan M. Eizenga, et al.. Genome graphs and the evolution of genome inference . Genome Research, 2017. DOI
  4. Nancy F. Hansen, Nathan Dwarshuis, Hyun Joo Ji, et al.. A complete diploid human genome benchmark for personalized genomics . Cell, 2026. DOI
  5. Leihong Wu, Gökhan Yavaş, Huixiao Hong, et al.. Direct comparison of performance of single nucleotide variant calling in human genome with alignment-based and assembly-based approaches . Scientific Reports, 2017. DOI
  6. Zhen Yao, Frank M. You, Amidou N’Diaye, et al.. Evaluation of variant calling tools for large plant genome re-sequencing . BMC Bioinformatics, 2020. DOI