Predict foal coat colors based on Sire and Dam genetics
Sire (Stallion) Genetics
Homozygous Black (EE) – Cannot produce Red
Heterozygous Black (Ee) – Black base, carries Red
Red (ee) – Chestnut base
Homozygous Agouti (AA) – Always restricts black
Heterozygous Agouti (Aa) – Carries non-agouti
Non-Agouti (aa) – Uniform black (if E present)
Non-Dilute (nn)
Single Dilute (nCr) – Palomino/Buckskin/Smoky Black
Double Dilute (CrCr) – Cremello/Perlino/Smoky Cream
Dam (Mare) Genetics
Homozygous Black (EE) – Cannot produce Red
Heterozygous Black (Ee) – Black base, carries Red
Red (ee) – Chestnut base
Homozygous Agouti (AA) – Always restricts black
Heterozygous Agouti (Aa) – Carries non-agouti
Non-Agouti (aa) – Uniform black (if E present)
Non-Dilute (nn)
Single Dilute (nCr) – Palomino/Buckskin/Smoky Black
Double Dilute (CrCr) – Cremello/Perlino/Smoky Cream
Foal Coat Color Probabilities
Based on standard Mendelian inheritance for Extension, Agouti, and Cream.
Phenotype (Color)
Probability
Visual
Understanding Horse Color Genetics
Predicting the color of a foal is a science based on Mendelian genetics. While there are many genes that influence horse coat color (such as Dun, Champagne, Silver, and White patterns), the three most common factors determining the base color are Extension, Agouti, and Cream. This calculator focuses on these three primary loci.
1. The Red Factor (Extension Locus – E)
All horses begin with a base color of either Black or Red (Chestnut). The Extension gene determines this base.
EE: The horse has a black base and cannot produce a red foal (unless the mate contributes genes to dilute/modify it, but the base remains black).
Ee: The horse is visually black based but carries the red gene (recessive).
ee: The horse is Red (Chestnut/Sorrel). It cannot produce black pigment in the coat.
2. The Agouti Factor (Bay Locus – A)
The Agouti gene controls the distribution of black pigment. It essentially "pushes" black pigment to the points (mane, tail, legs, ear rims), creating a Bay horse.
AA or Aa: Restricts black pigment to the points. A black base horse becomes Bay.
aa: No restriction. A black base horse remains solid Black.
Note: Agouti is not visually expressed on Red (ee) horses because they have no black pigment to restrict, but they can still carry and pass the gene to offspring.
3. The Cream Dilution (Cr)
The Cream gene dilutes the base color. It is an incomplete dominant trait, meaning one copy (heterozygous) looks different from two copies (homozygous).
nn: No cream dilution.
nCr (Single Dilute):
Chestnut base -> Palomino
Bay base -> Buckskin
Black base -> Smoky Black
CrCr (Double Dilute):
Chestnut base -> Cremello
Bay base -> Perlino
Black base -> Smoky Cream
Example Calculation
If you breed a Palomino (Chestnut base ee + Single Cream nCr) to a Buckskin (Bay base E_ A_ + Single Cream nCr), the genetics can get complicated.
Using the calculator above, you can determine exactly what percentage chance you have of getting a Cremello, Perlino, Buckskin, Palomino, or Smoky Black foal.
function calculateFoalColor() {
// 1. Get Genotypes from Inputs
var sireExt = document.getElementById('sire_ext').value; // EE, Ee, ee
var sireAgo = document.getElementById('sire_ago').value; // AA, Aa, aa
var sireCrm = document.getElementById('sire_crm').value; // nn, nCr, CrCr
var damExt = document.getElementById('dam_ext').value;
var damAgo = document.getElementById('dam_ago').value;
var damCrm = document.getElementById('dam_crm').value;
// 2. Helper function to get alleles array from string
function getAlleles(genotypeStr, type) {
// type: 'E' (2 chars), 'A' (2 chars), 'Cr' (special case handling)
if (type === 'Cr') {
if (genotypeStr === 'nn') return ['n', 'n'];
if (genotypeStr === 'nCr') return ['n', 'Cr'];
if (genotypeStr === 'CrCr') return ['Cr', 'Cr'];
}
return [genotypeStr.charAt(0), genotypeStr.charAt(1)];
}
var sE = getAlleles(sireExt, 'E');
var sA = getAlleles(sireAgo, 'A');
var sC = getAlleles(sireCrm, 'Cr');
var dE = getAlleles(damExt, 'E');
var dA = getAlleles(damAgo, 'A');
var dC = getAlleles(damCrm, 'Cr');
// 3. Logic: Calculate probabilities for each locus independent
// Returns object { 'EE': 0.25, 'Ee': 0.5 … }
function punnett(sireAlleles, damAlleles) {
var outcomes = {};
var total = 0;
for (var i = 0; i < 2; i++) {
for (var j = 0; j < 2; j++) {
// Combine, sort alphabetically/standardly to normalize keys
var a1 = sireAlleles[i];
var a2 = damAlleles[j];
var combo = '';
// Sorting logic for normalization
if (a1 === 'Cr' || a2 === 'Cr') {
if (a1 === 'Cr' && a2 === 'Cr') combo = 'CrCr';
else if (a1 === 'n' && a2 === 'n') combo = 'nn';
else combo = 'nCr';
} else {
// For E and A, uppercase comes first (Dominant)
if (a1 0) {
sortedResults.push([p, phenotypeProbs[p]]);
}
}
sortedResults.sort(function(a, b) {
return b[1] – a[1];
});
for (var i = 0; i < sortedResults.length; i++) {
var name = sortedResults[i][0];
var prob = sortedResults[i][1] * 100;
// Format row
var row = "