Software
Most of what I build at FamilyTreeDNA runs behind a product rather than shipping as a package. What follows is the part you can actually open: live tools, runnable tutorials, open repositories, and the documentation that specifies how the methods work.
FamilyTreeDNA tools
Production features I designed or co-designed. Several are public; the rest need a free FamilyTreeDNA account. Every Discover link below works with any valid haplogroup substituted into the URL.
Mitotree and the mitochondrial haplotree
The largest human phylogeny yet described: 53,588 haplogroups from 331,221 complete mitogenomes. I led the project and designed the search, QC, and dating framework behind it.
How it works.
Age estimates
The TMRCA method used across both haplotrees. It uses a relaxed clock, so each branch carries its own rate, and accounts for variable sequencing coverage instead of assuming it away. Calibrated and validated against documented genealogies.
How it works.
Globetrekker
Reconstructs the migration route of a paternal lineage across tens of thousands of years, drawn on a map of the world as it existed at the time, with sea level, ice sheets, and ocean currents rebuilt per date. Y-DNA only for now.
y-dna/A/globetrekker
How it works.
Ancestral paths and connections
- Ancestral path
- Every haplogroup between the root and yours. mtdna/U5a2b2a3/path
- Compare
- Where two haplogroups share a common ancestor, and when. mtdna/U5a2b2a3/compare
- Notable connections
- Historical figures on the same branch. mtdna/U5a2b2a3/notable
- Ancient connections
- Archaeological samples sharing your lineage. mtdna/U5a2b2a3/ancient
- Match time tree
- Your own matches placed on the dated tree. Requires a test and login; logged-out visitors see a demo. mtdna/U5a2b2a3/matches
Substitute any Y haplogroup and swap mtdna for y-dna to see the paternal equivalents.
For example: y-dna/A/classic
myOrigins 3.0 and the Chromosome Painter
Estimates global ancestry proportions and per-chromosome local ancestry jointly rather than in sequence, which keeps the segments and the percentages consistent and allowed the reference panel to grow from 24 populations to 90. I invented the method and authored the white paper.
How it works.
Family Finder Matching 5.0
Autosomal matching and relationship estimation that classifies whether a match pair is endogamous before predicting the relationship, which removes a systematic bias that inflates kinship estimates in founder populations. Co-authored.
How it works.
Archaic Origins
Neanderthal, Denisovan, and ghost-archaic ancestry as calibrated percentages and per-chromosome segments. Built and validated; release planned on Discover.
How it works.
Open source
Mitotree
The Mitotree release: tree files, haplogroup definitions, and the material needed to assign haplogroups against it. Distributed through HaploGrep v3 plugins, so an external lab can use it without changing its existing workflow.
github.com/genebygene/mitotree
corridoR
An R package that models genetic connectivity along migration corridors and forecasts how it shifts under climate change. It generalizes the method from the Heredity paper so it runs on any species and landscape: read genotypes from STRUCTURE, GENEPOP, VCF, GenAlEx, FSTAT or PLINK, compute pairwise FST and directional differentiation, widen least cost paths into weighted corridors, let each group of environmental features choose its own corridor bandwidth by cross-validation, fit Cubist models, and map the projected change with arrows for net migration direction. MIT licensed, under review at CRAN.
Documentation · tutorial · repository · the same analysis on real data
Maier P.A. corridoR: An R package for forecasting genetic range shifts along migration corridors. Methods in Ecology and Evolution, in review.
hybridclock
An R package that dates hybrid populations past the second generation. Tools like NewHybrids and HIest classify individuals as F1 or F2, but beyond that a single animal carries little information, because many different pedigrees land in the same place on the hybrid triangle. A whole population sample carries much more. hybridclock compares the sample against forward simulations that include drift, small breeding groups, sibling mating and separate breeding pools, so inbreeding is not mistaken for age, and estimates hybrid age, how long ago the rarer species entered, the number of backcrosses, and whether pure individuals are still arriving. Estimates come from Cubist models with split-conformal intervals. Works with diagnostic SNPs, non-fixed SNPs and microsatellites, with or without a genetic map. Validated on 23 published datasets: across 41 groups of known age, from F1 families to the 56th generation of an intercross line, every 90% interval contained the true age. MIT licensed, under review at CRAN.
Documentation · tutorial · repository
Maier P.A. hybridclock: Dating hybrid populations beyond F2, with or without a genetic map. Methods in Ecology and Evolution, in review.
Geo-genetic triangulation
Infers where a person’s autosomal ancestors lived by combining DNA segments they share identical by descent with several genetic matches and the birthplaces recorded in those matches’ family trees, keeping only locations that recur across the trees of the matches sharing each segment. Developed for the Beethoven genome study, where it placed his ancestry in the Rhine valley. Version 2 is a standalone package with tests, example data and bundled boundary and genetic-map layers, rebuilt on sf after rgdal and rgeos left CRAN, and about six times faster. PolyForm Noncommercial license; version 1 remains on Dryad under CC0.
repository · version 1 archive
fasta2genotype
Converts the per-sample haplotype FASTA written by Stacks into input for 14 population-genetic programs, including Structure, Genepop, Arlequin, migrate-n, TreeMix, BayeScan, GenAlEx and PHYLIP, with quality filters along the way. It treats each unique sequence at a locus as one allele, so short RAD loci behave like multi-allelic markers instead of being reduced to a single SNP. Written for my dissertation, where standard pipelines were discarding most of the signal. Version 2 is a rewrite with no dependencies beyond Python 3.9, correct sample sizes and allele counts, and a Structure file written in 3 seconds rather than 2 minutes. Installable from PyPI and Bioconda. MIT licensed.
repository · Bioconda
Everything else is at github.com/paulmaier.
Tutorials
Runnable walkthroughs in R, plus one interactive tool. Each opens on its own page.
Documentation and data
- myOrigins 3.0 white paper — full method description: phasing, segment classification, the conditional random field, phase correction, and how the 90-population reference panel was built.
- Family Finder Matching 5.0 white paper — the matching algorithm, endogamy classification, and relationship estimation.
- Anaxyrus hybrid panel — the diagnostic SNP panel and methods for identifying western toad and Yosemite toad hybrids.
Archived data and analysis scripts
- Yosemite toad phylogeography, gene pools, and connectivity — 4 GB covering three papers: phylogenetics, fastsimcoal2 demographic models, niche overlap, contact zones, hierarchical structure, AMOVA, hub and satellite analysis, isolation by distance, migration corridors, and ResistanceGA. Scripts included.
- Yosemite toad adaptive potential and future conservation units — outlier detection, gradient forest and generalized dissimilarity modeling, and the geo-genomic simulations behind the Geminate Evolutionary Unit framework.
- Yosemite toad transcriptome, speciation genes, and adaptive introgression — 3.4 GB covering the islands and rivers analysis across three replicate contact zones, the de novo larval transcriptome, and the tadpole growth-by-development GWAS.
- Geo-genetic triangulation — the script behind the biogeographic analysis in the Beethoven genome study.
- Raw sequence data — the reads behind all of the above.
PRJNA558546 — ddRADseq
PRJNA574353 — larval transcriptome
ON156774–ON156780 — L7 mitogenomes
PRJEB56343 — Beethoven genome
PRJNA510176 — Platycladus orientalis
Much of my production code is proprietary. Where that is the case I have linked the method description instead, which is detailed enough to reimplement. If you want to discuss any of it, or you are stuck reproducing something, get in touch.













