Chatomics Field GuideWhat They Don't Teach You

Glossary · Genomics and Variants

Variant calling

The step where a coordinate-sorted BAM becomes a VCF of real mutations, if you know which artifacts a caller can't tell from truth.

By Ming "Tommy" Tang, Director of Bioinformatics in Big Pharma · Reviewed September 2026 · 3 min read

Also: SNV, indel, GATK

Definition

Variant calling is the process of comparing aligned sequencing reads against a reference genome to find positions where a sample's DNA differs: single-nucleotide variants (SNVs), small insertions and deletions (indels), and larger structural variants. A caller such as GATK HaplotypeCaller, bcftools, DeepVariant, or DRAGEN assigns each candidate site a genotype and a confidence score, and writes the result to a VCF file. It is one stage in a longer pipeline: align reads, mark duplicates, recalibrate base quality, call variants, then annotate and filter. The output is only as reliable as the alignment and quality control that came before it.

You hit variant calling right after alignment, once you have a coordinate-sorted, duplicate-marked BAM file and need to turn base-level differences into a list of mutations. The standard order is quality control, alignment (BWA-MEM for short reads, minimap2 for long reads), variant calling, annotation, then visualization and reporting. Whatever caller and settings you pick at this step becomes the ceiling on everything downstream: an annotation tool can only interpret what the caller reported.

This is also where a wet-lab result and a bioinformatics result diverge if you are not careful. A variant at 8% allele frequency in a tumor-only exome, a CHIP mutation in blood-derived "normal" DNA, and a deamination artifact in an FFPE block can all look like a plausible SNV sitting in a VCF. Whether you catch that before it reaches a report depends on what you know about the caller's assumptions, not just whether you ran the command correctly.

Why it matters

Get the caller and its assumptions wrong and you either miss real mutations or report ones that were never actually in the sample. FFPE-derived DNA is the clearest case: formalin fixation deaminates cytosine to uracil, which polymerases read as thymine, producing C>T and G>A artifacts that standard callers like DRAGEN and MuTect2 flag as low-VAF somatic variants. About 92% of FFPE-unique false calls sit at or below 5% VAF with exactly that signature, so a tumor-only pipeline without a matched normal or an FFPE-aware filter (FFPolish, DeepOmicsFFPE) hands a clinician a mutation list padded with chemical noise.

The mirror-image failure shows up in blood-based and liquid biopsy calling: CHIP mutations in genes like DNMT3A, TET2, and TP53 reach 10 to 40 percent or higher VAF in blood from older patients, well above the noise floor, so they look exactly like a genuine germline or tumor-derived variant. Without matched leukocyte sequencing to subtract shared calls, a ctDNA panel will attribute an age-related clonal mutation to the solid tumor and feed it into a treatment decision.

Where people get it wrong

The mistake is treating "the variant passed the caller's default filters" as equivalent to "the variant is real." Default filters are tuned for germline calling in fresh-frozen, high-input DNA; they say nothing about whether a low-VAF call is FFPE deamination, CHIP, or a genuine subclonal tumor mutation. A narrower version of the same mistake is mixing up bcftools' two calling models: -c is the legacy consensus caller and -m is the multiallelic caller you should default to now, since -c handles rare and multiallelic sites poorly. People also skip the visual check: opening the BAM in IGV around a candidate site takes two minutes and catches strand bias, mapping artifacts, and repeat-region misalignment that no automated filter reliably catches on its own.

A concrete example

A minimal single-sample call with bcftools pipes pileup output straight into the recommended multiallelic caller and keeps only variant sites. Say this produces a candidate SNV at 8% VAF in a tumor-only FFPE exome, with a C>T change. Don't report it yet: check whether the change matches the FFPE deamination signature (C>T or G>A specifically), look at the read pileup in IGV for strand bias, and check whether a matched normal exists to rule out CHIP or germline origin. A true somatic variant usually shows support on both strands at a VAF consistent with tumor purity; an FFPE artifact tends to cluster on one strand at low frequency.

bash
bcftools mpileup -f ref.fa input.bam | bcftools call -mv -Ov -o calls.vcf

Related terms

Questions people ask

What is the difference between variant calling and variant annotation?

Variant calling compares aligned reads to a reference and decides what differs, producing a VCF of genotyped positions. Variant annotation runs after calling and adds biological meaning to those positions: which gene, which transcript, which predicted protein consequence. Calling decides what counts as a variant; annotation decides what that variant means.

Should I use GATK or bcftools for variant calling?

GATK HaplotypeCaller, following the Broad's Best Practices workflow (duplicate marking, coordinate sorting, base quality score recalibration, then calling), is the default most germline WGS/WES clinical pipelines validate against. bcftools mpileup piped into bcftools call is lighter-weight and reasonable for quick single-sample or non-clinical work. Newer tools like DeepVariant and DRAGEN report improved accuracy in some benchmarks, but the field has not universally moved off GATK for germline calling.

Why do FFPE samples produce so many false positive variants?

Formalin fixation deaminates cytosine to uracil, and polymerases read that uracil as thymine, producing characteristic C>T and G>A artifacts. Roughly 92% of FFPE-unique false calls sit at or below 5% VAF with exactly that signature, so a caller with no FFPE-aware filtering will report chemical damage as somatic mutations.

What VAF threshold should I use to call a variant real?

There is no single threshold the field has settled on; it depends on input DNA quality, sequencing depth, and whether a matched normal exists. Treat variant allele frequency as one signal among several, alongside strand bias, repeat-region context, and presence in a population or normal database, rather than a cutoff you hardcode once and reuse everywhere.

Can CHIP mutations be mistaken for tumor mutations in liquid biopsy?

Yes. CHIP mutations in genes like DNMT3A, TET2, and TP53 come from clonal hematopoietic stem cells in blood, not the tumor, but they can reach 10 to 40 percent or higher variant allele frequency, well above typical ctDNA noise floors. Sequencing matched leukocyte DNA and subtracting shared variants is the standard way to separate CHIP from true tumor-derived ctDNA.

Related reading on the blog

Sources

  1. Navigating Variant Calling for Disease-Causing Mutations: The state-of-art process — pipeline stages, aligner choice (BWA-MEM vs minimap2), and tool landscape (GATK, bcftools, VarScan2, Strelka, DRAGEN, DeepVariant)
  2. Best Practices for Variant Calling with the GATK — GATK Best Practices workflow: duplicate marking, coordinate sorting, base quality score recalibration, HaplotypeCaller
  3. bcftools(1) manual page — consensus (-c) vs multiallelic (-m) calling models and the mpileup/call command
  4. SimFFPE and FilterFFPE: improving structural variant calling in FFPE samples — FFPE C>T|G>A false-positive signature concentrated at or below 5% VAF
  5. Combinatorial and Machine Learning Approaches for Improved Somatic Variant Calling From Formalin-Fixed Paraffin-Embedded Genome Sequence Data — standard callers (MuTect2, DRAGEN) underperforming on FFPE DNA and ML-based filtering alternatives