How to Read a VCF File: A Practical Guide to Variant Call Format

Language: اردو ورژن پڑھیں
Scope: Educational and research use. A VCF records what a pipeline called; it does not by itself establish that a variant is real, pathogenic or clinically actionable.
Last reviewed: 2 November 2026.

After FASTQ quality control and alignment to a reference genome, most sequencing projects end up with a VCF (Variant Call Format) file. It is the file you send to annotation tools, upload to variant browsers, share with collaborators and, eventually, argue about in a review meeting. Yet many people open a VCF for the first time and see a wall of ## lines, semicolons and colon-separated numbers.

This guide walks through what each part of a VCF means, how to read genotypes, which mistakes cause most of the confusion, and a short, reproducible set of bcftools commands for checking a file. It follows the official VCF specification maintained by the GA4GH/samtools hts-specs project, whose current canonical version is VCFv4.5.

On this page
  1. The three parts of a VCF file
  2. The eight fixed columns
  3. Reading the genotype columns
  4. Special alleles you will meet
  5. Five common mistakes
  6. A small, reproducible bcftools check
  7. What a VCF cannot tell you
  8. Practical checklist
  9. Sources and further reading

The three parts of a VCF file

A VCF is a tab-separated text file, usually compressed with bgzip (.vcf.gz) and indexed so tools can jump to a region. It has three parts:

  1. Meta-information lines beginning with ##. These declare the format version, the reference, the contigs, and the definition of every INFO, FORMAT and FILTER field used in the file.
  2. One header line beginning with a single #, naming the columns: #CHROM POS ID REF ALT QUAL FILTER INFO, then FORMAT and one column per sample if genotypes are present.
  3. Data lines, one per variant site.

Here is a small, made-up example:

##fileformat=VCFv4.5
##reference=GRCh38
##contig=<ID=chr1,length=248956422>
##INFO=<ID=DP,Number=1,Type=Integer,Description="Total read depth">
##FILTER=<ID=LowQual,Description="Low variant quality">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##FORMAT=<ID=AD,Number=R,Type=Integer,Description="Allelic depths">
##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Sample read depth">
##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype quality">
#CHROM  POS      ID  REF  ALT  QUAL   FILTER   INFO   FORMAT       SAMPLE1
chr1    1234567  .   A    G    812.4  PASS     DP=58  GT:AD:DP:GQ  0/1:30,28:58:99
chr1    1234890  .   CTT  C    45.1   LowQual  DP=9   GT:AD:DP:GQ  0/1:6,3:9:38

Treat the ## header as part of the data, not decoration. It tells you which reference build the coordinates belong to and exactly how each field was defined by the tool that wrote it.

The eight fixed columns

  • CHROM and POS: the contig and position. POS is 1-based: the first base of a chromosome is position 1. (BED files, by contrast, are 0-based, which is a classic source of off-by-one errors.) Coordinates only mean something together with the reference build, so chr1 on GRCh38 and 1 on GRCh37 are not interchangeable.
  • ID: an identifier such as a dbSNP rs number, or . when none is assigned.
  • REF and ALT: the reference allele and one or more alternate alleles separated by commas. For insertions and deletions, both alleles include the base before the event, often called the padding base. In the second example line, CTT → C is a two-base deletion of TT after the C at position 1234890.
  • QUAL: a Phred-scaled confidence that the ALT call is not wrong, using the same −10 log10 idea as FASTQ base qualities. It is caller-specific and not comparable across tools.
  • FILTER: PASS if the site passed all filters, otherwise a semicolon-separated list of the filters it failed (for example LowQual). A . means filters were not applied, which is not the same as passing.
  • INFO: site-level annotations as KEY=value pairs separated by semicolons, such as total depth or allele frequency in the call set.

Reading the genotype columns

The FORMAT column is a key that tells you how to split each sample column. With GT:AD:DP:GQ and 0/1:30,28:58:99, the sample has:

  • GT = 0/1: one copy of the REF allele (0) and one of the first ALT allele (1), a heterozygous call. 1/1 is homozygous ALT, 0/0 homozygous REF, and 1/2 carries two different ALT alleles.
  • AD = 30,28: 30 reads support REF and 28 support ALT, so the ALT fraction is about 0.48, close to the 0.5 expected for a germline heterozygote.
  • DP = 58: reads covering the site for this sample.
  • GQ = 99: Phred-scaled confidence in the genotype itself. Many callers cap it at 99.

The separator matters: / means unphased (we do not know which parental chromosome carries each allele), while | means phased. A . marks a missing allele, so ./. is a no-call, not a reference call. In a multi-sample VCF, a missing genotype and a confident 0/0 are very different statements.

Special alleles you will meet

  • * (star allele): the allele is missing at this site because an overlapping upstream deletion removed it. It is not a nucleotide.
  • Symbolic alleles in angle brackets, such as <DEL> or <DUP>, describe structural variants whose sequence is not spelled out.
  • <*> or <NON_REF>: used in genome VCF (gVCF) files to represent “any other allele” in reference blocks, so that a file also records where a sample was confidently reference.

Five common mistakes

  1. Mixing reference builds. A position on GRCh37 points to a different base on GRCh38. Check the ##reference and ##contig lines before merging or annotating.
  2. Comparing un-normalised indels. The same deletion in a repeat can be written at several positions. Left-align and normalise against the same reference FASTA before comparing call sets or matching to databases.
  3. Treating multi-allelic sites as one variant. A line with ALT=G,T holds two alternate alleles. Many annotation tools work best after splitting these into one allele per line.
  4. Ignoring FILTER. Counting every line as a variant includes calls the pipeline itself flagged as doubtful.
  5. Reading QUAL as allele frequency or pathogenicity. QUAL is confidence in the call, not how common the variant is or whether it matters clinically.

A small, reproducible bcftools check

With bcftools and htslib installed (for example in the WSL2 setup described earlier), these commands cover most first-look checks:

# Validate compression and index the file
bgzip -t sample.vcf.gz
bcftools index -t sample.vcf.gz

# Look at the header: version, reference, contigs and field definitions
bcftools view -h sample.vcf.gz | less -S

# Summary statistics: counts of SNVs, indels, Ts/Tv ratio
bcftools stats sample.vcf.gz > qc/sample.stats.txt

# Keep only PASS sites
bcftools view -f PASS -Oz -o sample.pass.vcf.gz sample.vcf.gz

# Split multi-allelic sites and left-align indels against the same reference
bcftools norm -m -any -f GRCh38.fa -Oz -o sample.norm.vcf.gz sample.pass.vcf.gz

# Export a readable table of selected fields
bcftools query -f '%CHROM\t%POS\t%REF\t%ALT\t%FILTER[\t%GT\t%AD\t%DP]\n' sample.norm.vcf.gz | head

Record the tool versions, the reference FASTA with its checksum, and every command alongside the outputs. The Ts/Tv ratio from bcftools stats is a useful sanity signal for human germline SNVs, but the expected value depends on whether you sequenced a whole genome or an exome, so compare with similar data rather than one fixed number.

What a VCF cannot tell you

A VCF is the output of a model applied to aligned reads. A PASS line with a good QUAL is a well-supported call, not proof. Low-complexity regions, segmental duplications, sample contamination and reference errors can all produce confident-looking false calls. Before a variant is reported in a clinical setting, laboratories apply validated pipelines, inspect read alignments, may confirm by an orthogonal method such as Sanger sequencing, and interpret it with frameworks such as the ACMG/AMP guidelines. Computational scores, including tools like AlphaGenome, add evidence but do not replace that process.

Practical checklist

  • Confirm the VCF version, reference build and contig names in the header.
  • Check that the file is bgzip-compressed and indexed.
  • Read the INFO, FORMAT and FILTER definitions written by your caller.
  • Decide explicitly how you treat non-PASS sites and no-calls.
  • Split multi-allelic sites and normalise indels before comparing or annotating.
  • Look at allele depth and allele fraction, not just the GT field.
  • Keep the original VCF unchanged and document every transformation.

Research and education note: This article explains a file format. It is not medical advice, and a VCF should not be used on its own to make decisions about diagnosis, treatment or genetic counselling.

Featured image: a single nucleotide polymorphism, two DNA molecules differing at one base pair. “Dna-SNP.svg” by David Eccles (gringer), Wikimedia Commons, CC BY 4.0; rendered as PNG.

Sources and further reading

Don’t miss out on Science!

We don’t spam! Read our privacy policy for more info.

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to Top