Skip to content

Step 12: Mitochondrial Haplogroup

What This Does

Determines the maternal lineage from mitochondrial DNA (mtDNA) variants, and checks the mtDNA for a second person's reads (contamination).

Why

The mitochondrial haplogroup reveals deep maternal ancestry. Some haplogroups have known population-level health associations (e.g., longevity, metabolic traits).

A sample with DNA of two people shows two mtDNA haplogroups at once: the variants of the second one appear as heteroplasmies at a similar level. haplocheck looks for that pattern. It is a check of the sample, not of the person: YES means the calls of this sample, above all its heterozygous ones, may mix two people.

Tool

  • haplogrep3 (Medical University of Innsbruck): the haplogroup
  • haplocheck 1.3.3 (Weissensteiner et al., Genome Res 2021): the contamination check

Docker Image

  • HAPLOGREP3_IMAGE, HAPLOCHECK_IMAGE, and BCFTOOLS_IMAGE to prepare the calls

Pinned in versions.env; Image versions lists the current tags.

The image is the Bioconda build of haplogrep3 3.2.2. It classifies without a network: the image test runs it with --network none. It replaced a digest-pinned build of 3.2.1 from a personal Docker Hub account; on the image test's chrM calls of the HG002 fixture both give H5a7 with quality 1.0000 and the same found and remaining polymorphisms.

Input

The step reads, first match:

  1. ${SAMPLE}/mito/${SAMPLE}_chrM_filtered.vcf.gz, step 20's Mutect2 calls in mitochondrial mode. Mutect2 is the caller made for chrM: it reports each allele's fraction, so haplogrep3 sees heteroplasmies and haplocheck can run. The step keeps the PASS records (possible NuMTs are filtered by step 20) and splits multi-allelic records.
  2. Otherwise the chrM records of ${SAMPLE}/vcf/${SAMPLE}.vcf.gz (step 03). DeepVariant calls chrM as a diploid nuclear contig, so this is the fallback, and haplocheck does not run on it.

Run step 20 before step 12 for the Mutect2 input. The Nextflow pipeline does the same: with mito_variants in --tools (it is in the default set), mito_haplogroup reads MITO_VARIANTS' calls and runs HAPLOCHECK.

Command

./scripts/12-mito-haplogroup.sh your_sample

By hand, on step 20's calls:

source versions.env   # from the repository root
SAMPLE=your_sample
GENOME_DIR=/path/to/your/data
M=/genome/${SAMPLE}/mito

# PASS records, one allele per record
docker run --rm --network none -v "${GENOME_DIR}:/genome" "${BCFTOOLS_IMAGE}" bash -c \
  "bcftools view -f PASS ${M}/${SAMPLE}_chrM_filtered.vcf.gz | bcftools norm -m-any -Oz -o ${M}/${SAMPLE}_chrM_for_haplogroup.vcf.gz"

docker run --rm --network none -v "${GENOME_DIR}:/genome" "${HAPLOGREP3_IMAGE}" \
  haplogrep3 classify --tree phylotree-fu-rcrs@1.2 \
    --input ${M}/${SAMPLE}_chrM_for_haplogroup.vcf.gz \
    --output ${M}/${SAMPLE}_haplogroup.txt --extend-report

docker run --rm --network none -v "${GENOME_DIR}:/genome" "${HAPLOCHECK_IMAGE}" \
  haplocheck --out ${M}/${SAMPLE}_haplocheck.txt ${M}/${SAMPLE}_chrM_for_haplogroup.vcf.gz

Output

File Contents
mito/${SAMPLE}_haplogroup.txt haplogrep3's haplogroup and quality
mito/${SAMPLE}_haplocheck.txt haplocheck's report (Mutect2 input only): Contamination Status (YES, NO or ND, not determined), Contamination Level, the major and minor haplogroups it found
mito/${SAMPLE}_chrM_for_haplogroup.vcf.gz the chrM calls both tools read
mito/${SAMPLE}_chrM.fasta the mtDNA sequence, the file the services below read (about 17 kB). The Nextflow pipeline publishes the same file there (MITO_EXTRACT_CHRM)

Both reports (step 24 and the text report) show the haplogroup and the contamination status, or "not checked" when the input was the step 03 VCF, and the links of the next section built from the haplogroup.

The FASTA is the reference chrM (the rCRS, in GRCh38) with the sample's majority alleles applied: the Mutect2 calls with an allele fraction of 0.5 or more, or the haploid and homozygous ALT calls of the step 03 VCF. A position without a call reads as the reference, so the FASTA is only as complete as the chrM calls. A heteroplasmy below 0.5 is not in it.

Explore your branch further

A haplogroup is a branch of the maternal family tree. The routes below are free first. Each was checked on its own pages on 2026-10-25; prices and policies change, so read the service's page before you send anything.

This pipeline never uploads anything. An upload shares the file with that service, under its own terms. An mtDNA sequence is your maternal line, and through it your mother's, siblings' and maternal relatives' too.

Route Cost What you send What you get Checked 2026-10-25
FamilyTreeDNA Discover, https://discover.familytreedna.com/mtdna/<haplogroup> free, no account no file: the haplogroup name goes in the link the branch's age, the countries its testers name, ancient DNA samples on it, a migration map the page loads its data from https://discover.familytreedna.com/resources/mtdna/<haplogroup>.json, which answered for H5a7 with no login; its search (/HaplogroupSearchMt/<name>) found H5a7 exactly
YFull MTree, https://www.yfull.com/mtree/<haplogroup>/ free to browse no file: the haplogroup name goes in the link the branch on YFull's mtDNA tree, with its age estimates /mtree/H5a7/ answers 200
Decoding Us Navigator, https://decoding-us.com/download free nothing: the app runs on your computer and reads your BAM or CRAM haplogroup placement and coverage metrics; you choose later whether to publish anonymised summaries an alpha (v0.1.0-beta.1, 2026-09-03); its mtDNA tree is on T2T-CHM13 coordinates, not the rCRS names haplogrep3 uses; we have not run it on a GRCh38 BAM
YFull mtDNA analysis free after a paid YFull Y analysis (step 37) the FASTA above your branch on the MTree, your mutations against the rCRS and the RSRS YFull's FAQ says it analyses FASTA files of the full mtDNA sequence; its order page says the free mtDNA analysis opens only after payment for the Y. We found no mtDNA-only order on its site

Names differ between trees. haplogrep3 uses PhyloTree 17 names (phylotree-fu-rcrs@1.2); FamilyTreeDNA Discover uses its own Mitotree (release 2026.10.07 on the day we checked), and YFull its MTree, which started from PhyloTree 17. If a link shows no page, type the haplogroup into the service's search: Discover offers the nearest branch it has.

Runtime

4 to 22 seconds for the chrM extraction, haplogrep3 and haplocheck together, measured in three 30-40x WGS runs (runtime).

Interpretation

  • Common European haplogroups: H, U, J, T, K, V, W, X
  • Output includes quality score (0-1): >0.9 = high confidence
  • Discordant variants may indicate heteroplasmy (mixture of mtDNA types)
  • Contamination YES with a level of a few percent: compare with step 33's VerifyBamID2 estimate, which reads the nuclear genome. The two can differ when the mtDNA copy number differs between the two people's cells.