Hi, John - good question. There's just one minor thing to do, and you're almost there, but the way to do it is hard to figure out. The additional step is setting the "nucleotide_based" property in top-level metadata.
# generate an msprime simulation
demog = msprime.Demography()
demog.add_population(initial_size=1000)
ts = msprime.sim_ancestry(
samples=200,
demography=demog,
recombination_rate=1e-8,
sequence_length=1e6,
random_seed=5)
# annotate, add mutations
ts = pyslim.annotate(ts, model_type="nonWF", tick=1)
ts = msprime.sim_mutations(
ts, rate=1e-8,
model=msprime.SLiMMutationModel(type=0),
random_seed=9
)
# generate nucleotides
ts = pyslim.generate_nucleotides(ts)
# set top-level metadata property
tables = ts.dump_tables()
md = tables.metadata
md['SLiM']['nucleotide_based'] = True
tables.metadata = md
ts = tables.tree_sequence()
# write out
ts.dump("initialize_nonWF_nuc.trees")
and then the following SLiM script:
initialize()
{
initializeSLiMModelType("nonWF");
initializeSLiMOptions(nucleotideBased=T);
// we must generate ancestral nucleotides, but they will be unused,
// replaced by the reference sequence in the .trees file loaded below
initializeAncestralNucleotides(randomNucleotides(1e6));
initializeTreeSeq();
initializeMutationTypeNuc("m0", 0.5, "f", 0.0);
initializeGenomicElementType("g1", m0, 1.0, mmJukesCantor(1e-7));
initializeGenomicElement(g1, 0, 1e6-1);
initializeRecombinationRate(1e-8);
defineConstant("K", 1000);
}
reproduction(p1) {
subpop.addCrossed(individual,
subpop.sampleIndividuals(1));
}
1 early() {
sim.readFromPopulationFile("initialize_nonWF_nuc.trees");
catn("Loaded " + length(sim.subpopulations)
+ " populations from a file; now in generation " + sim.cycle);
catn("Population sizes: " + paste(sim.subpopulations.individualCount));
}
2: early() {
p0.fitnessScaling = K / p0.individualCount;
}
10 early() {
catn("Done.");
sim.simulationFinished();
}
Thanks, and happy slimulations!
--peter