Adding neutral mutations to a population with existing ancestry#
The simulation done here is taken from another vignette.
Show code cell source
import fwdpy11
pop = fwdpy11.DiploidPopulation(500, 1.0)
rng = fwdpy11.GSLrng(54321)
GSSmo = fwdpy11.GaussianStabilizingSelection.single_trait(
    [
        fwdpy11.Optimum(when=0, optimum=0.0, VS=1.0),
        fwdpy11.Optimum(when=10 * pop.N - 200, optimum=1.0, VS=1.0),
    ]
)
rho = 1000.
p = {
    "nregions": [],
    "gvalue": fwdpy11.Additive(2.0, GSSmo),
    "sregions": [fwdpy11.GaussianS(0, 1., 1, 0.1)],
    "recregions": [fwdpy11.PoissonInterval(0, 1., rho / float(4 * pop.N))],
    "rates": (0.0, 1e-3, None),
    "prune_selected": False,
    "demography": fwdpy11.ForwardDemesGraph.tubes([pop.N], burnin=10),
    "simlen": 10 * pop.N,
}
params = fwdpy11.ModelParams(**p)
fwdpy11.evolvets(rng, pop, params, 100, suppress_table_indexing=True)
We can add mutations to the tables via fwdpy11.infinite_sites():
nmuts = fwdpy11.infinite_sites(rng, pop, 1e-3)
print(f"{nmuts} mutations added")
19 mutations added
We can check that the tables do indeed have these variants:
neut = 0
non_neut = 0
for m in pop.tables.mutations:
    if m.neutral is True:
        neut += 1
    else:
        non_neut += 1
print(f"There are {neut} neutral and {non_neut} non-neutral mutations")
There are 19 neutral and 16 non-neutral mutations
The number of genomes containing each mutation get recorded:
for m in pop.tables.mutations:
    if m.neutral is True:
        print(pop.mcounts[m.key])
1
1
17
1
9
1
27
20
10
31
143
444
1
4
528
21
5
1
267
Limitations#
- Only the infinitely-many sites model is implemented here. For more general models, you can transfer the data to - tskitformat and use that library to add mutations. See Converting data to tskit format.
- Currently, we only support a constant mutation rate across the genome. We will generalize this in a future release. In the mean time, you can add neutral mutations during the simulation as described here.