-
Notifications
You must be signed in to change notification settings - Fork 36
Closed
Description
Untested by unit tests, apparently, whoops. Just needs to be chromosome.length. Test model:
// set up a simple neutral simulation
initialize() {
initializeMutationRate(1e-7);
// m1 mutation type: neutral
initializeMutationType("m1", 0.5, "f", 0.0);
// g1 genomic element type: uses m1 for all mutations
initializeGenomicElementType("g1", m1, 1.0);
// uniform chromosome of length 100 kb with uniform recombination
initializeGenomicElement(g1, 0, 99999);
initializeRecombinationRate(1e-8);
}
// create a population of 500 individuals
1 early() {
sim.addSubpop("p1", 500);
sim.addSubpop("p2", 500);
}
2000 late() {
myCalcFST(p1.haplosomes, p2.haplosomes, NULL, start=100, end=50000);
}
function (float$)myCalcFST(object haplosomes1, object haplosomes2, [No muts = NULL], [Ni$ start = NULL], [Ni$ end = NULL])
{
if ((haplosomes1.length() == 0) | (haplosomes2.length() == 0))
stop("ERROR (calcFST): haplosomes1 and haplosomes2 must both be non-empty.");
species = haplosomes1[0].individual.subpopulation.species;
if (community.allSpecies.length() > 1)
{
if (any(c(haplosomes1, haplosomes2).individual.subpopulation.species != species))
stop("ERROR (calcFST): all haplosomes must belong to the same species.");
if (!isNULL(muts))
if (any(muts.mutationType.species != species))
stop("ERROR (calcFST): all mutations must belong to the same species as the haplosomes.");
}
chromosome = haplosomes1[0].chromosome;
if (species.chromosomes.length() > 1)
{
if (any(c(haplosomes1, haplosomes2).chromosome != chromosome))
stop("ERROR (calcFST): all haplosomes must be associated with the same chromosome.");
if (!isNULL(muts))
if (any(muts.chromosome != chromosome))
stop("ERROR (calcFST): all mutations must be associated with the same chromosome as the haplosomes.");
}
if (isNULL(muts))
muts = species.subsetMutations(chromosome=chromosome);
// handle windowing
if (!isNULL(start) & !isNULL(end))
{
if (start > end)
stop("ERROR (calcFST): start must be less than or equal to end.");
if ((start < 0) | (end >= chromosome.length))
stop("ERROR (calcFST): start and end must be within the bounds of the focal chromosome");
mpos = muts.position;
muts = muts[(mpos >= start) & (mpos <= end)];
}
else if (!isNULL(start) | !isNULL(end))
{
stop("ERROR (calcFST): start and end must both be NULL or both be non-NULL.");
}
// do the calculation; if the FST is undefined, return NULL
p1_p = haplosomes1.mutationFrequenciesInHaplosomes(muts);
p2_p = haplosomes2.mutationFrequenciesInHaplosomes(muts);
mean_p = (p1_p + p2_p) / 2.0;
H_t = 2.0 * mean_p * (1.0 - mean_p);
H_s = p1_p * (1.0 - p1_p) + p2_p * (1.0 - p2_p);
mean_H_t = mean(H_t);
if (isNULL(mean_H_t)) // occurs if muts is zero-length
return NAN;
if (mean_H_t == 0) // occurs if muts is not zero-length but all frequencies are zero
return NAN;
fst = 1.0 - mean(H_s) / mean_H_t;
return fst;
}
Found by Mingming Zhang in the Helsinki workshop.
Metadata
Metadata
Assignees
Labels
No labels