initialize() {
defineConstant("cut_rate", 0.98); //rate of double strand break occuring
defineConstant("resistance_rate", 0.078); //rate of repair with NHEJ
defineConstant("mutation_rate", 0); //drive specific mutation rate
defineConstant("nonres", 10000); //non-resistant allele (target population)
defineConstant("capacity" , 10000);
defineConstant("drive_size", 1000); //gene drive release
defineConstant("growth_rate", 53);
defineConstant("max_offspring", 14000);
defineConstant("mortality", c(1,0));
defineConstant("selfing_rate", 0.8);
defineConstant("inbreeding_depression", 0.063);
initializeSLiMModelType("nonWF");
//Assume no fitness cost
awt = initializeMutationType("m1", 0.5, "f", 0.0); //wildtype fertility allele
adr = initializeMutationType("m2", 0.5, "f", 0.0); //mutant fertility allele (drive allele)
ar2 = initializeMutationType("m3", 0.5, "f", 0.0); //resistant allele
avariations = c(awt, adr, ar2);
//Defining different alleles into one locus
initializeGenomicElementType("g1", avariations, c(1, 1, 1)); //locus a
//Defining each locus into a chromosome position
initializeGenomicElement(g1, 0, 0); //chromsosome position 0
avariations.mutationStackPolicy = "l"; //makes sure last mutation added is the most recent
avariations.mutationStackGroup = 1; //makes sure there is only one mutation/allele in one locus
initializeMutationRate(0);
initializeRecombinationRate(0.5);
}
//Reproduction rules - ones with no wild type alleles are infertile (doublesex genes are haplosufficient)
reproduction() {
//Calculation for carrying capacity
capacity_fitness_scaling = growth_rate / (((growth_rate-1) * (p1.individualCount / capacity)) + 1);
p = capacity_fitness_scaling * 2 / max_offspring ;
num_offspring = rbinom(1, max_offspring, p); //number of offspring depends on population and carrying capacity
for (i in seqLen(num_offspring)) {
if (subpop.size())
if (runif(1) < selfing_rate)
offspring = subpop.addSelfed(individual); //Add selfing rate
else
offspring = subpop.addCrossed(individual, subpop.sampleIndividuals(1)); //Add outcrossing rate
}
}
//Gene drive implementation in offspring in the germline - this is a double drive design
//convert to single gene drive
1: modifyChild() {
parent = c(parent1, parent2);
child_chromosome = c(childGenome1, childGenome2);
for (i in c(0,1))
if (sum(parent[i].genomes.countOfMutationsOfType(m2)) & sum(child_chromosome[i].countOfMutationsOfType(m1))) {
if ((runif(1) < cut_rate) & (runif(1) > resistance_rate)){
if (runif(1) < mutation_rate)
child_chromosome[i].addNewDrawnMutation(m3, 0);
else
child_chromosome[i].addNewDrawnMutation(m2, 0);
}
}
if (sum(parent[i].genomes.countOfMutationsOfType(m2)) & sum(child_chromosome[i].countOfMutationsOfType(m1))) {
if ((runif(1) < cut_rate) & (runif(1) < resistance_rate))
childGenome2.addNewDrawnMutation(m3, 0);
}
return T;
if (individual.countOfMutationsOfType(m2) >= 1) {
if (parent1 == parent2)
return F;
return T;
}
if (individual.countOfMutationsOfType(m3) >= 1) {
if (parent1 == parent2)
return F;
return T;
}
if (individual.countOfMutationsOfType(m1) == 0) {
if (parent1 == parent2)
return F;
return T;
}
if (parent1.countOfMutationsOfType(m2) >= 1) {
if (parent2.countOfMutationsOfType(m2) >= 1)
return F;
}
if (parent1.countOfMutationsOfType(m2) >= 1) {
if (parent2.countOfMutationsOfType(m3) >= 1)
return F;
}
if (parent1.countOfMutationsOfType(m3) >= 1) {
if (parent2.countOfMutationsOfType(m3) >= 1)
return F;
}
if (parent1.countOfMutationsOfType(m3) >= 1) {
if (parent2.countOfMutationsOfType(m2) >= 1)
return F;
}
if (parent1.countOfMutationsOfType(m1) < 2) {
if (parent2.countOfMutationsOfType(m1) < 2)
return F;
}
all = sim.subpopulations.individuals;
for (ind in all){
if (parent1 == parent2){
if (runif(1) < inbreeding_depression)
ind.fitnessScaling = 1 - inbreeding_depression;
}
}
}
//fitness scaling - discrete generations (non-overlapping generations)
late() {
all = sim.subpopulations.individuals;
for (ind in all) {
age_mortality_rate = mortality[ind.age];
ind.fitnessScaling = 1 - age_mortality_rate;
}
}
//introduce of drive allele
1 {
sim.addSubpop("p1", nonres);
p1.individuals.genomes.addNewDrawnMutation(m1, 0);
sim.addSubpop("p2", drive_size);
p2.individuals.genomes.addNewDrawnMutation(m2, 0);
drop = p2.individuals;
p1.takeMigrants(drop);
}
late() {
//Sum of each mutation type in population
all = sim.subpopulations.individuals;
num_awt = sum(all.genomes.countOfMutationsOfType(m1) > 0);
num_adr = sum(all.genomes.countOfMutationsOfType(m2) > 0);
num_ar2 = sum(all.genomes.countOfMutationsOfType(m3) > 0);
//Propotion of each mutation type in population
rate_awt = num_awt / (2 * size(all));
rate_adr = num_adr / (2 * size(all));
rate_ar2 = num_ar2 / (2 * size(all));
//output
cat(asInteger(sim.generation) + "\t " + rate_awt + "\t " + rate_adr + "\t " + rate_ar2 + "\t " + size(all) + "\n");
if (rate_awt == 0.0) {
catn("OUTCOME: DRIVE SUCCESS");
sim.simulationFinished();
}
if (rate_adr == 0.0) {
catn("OUTCOME: DRIVE LOST");
sim.simulationFinished();
}}
//// MAIN END CONDITION.
111 late() {
catn("OUTCOME: DRIVE PERSISTS");
sim.simulationFinished();
}
--
SLiM forward genetic simulation: http://messerlab.org/slim/
---
You received this message because you are subscribed to the Google Groups "slim-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to slim-discuss...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/slim-discuss/81a5529e-d3d4-49e8-a369-77198ac385cfn%40googlegroups.com.