sim.PyOperator(env_update, at=atgen), #Set environmental value (env infoField) for each individual in the population #Takes place at each generation after the first fission sim.PyOperator(env_set, begin=atgen[1]), #Selection occures at selected loci according to env information field sim.PySelector(fit_env, loci=locisel, begin=atgen[1]), ], #Mating at random (pangamy) matingScheme=sim.RandomMating( #Fixed population size (fixed at 'popsize') subPopSize=demo, #Recombination ops=[sim.Recombinator(rates=0.002)]), postOps=[ #Mutation rate 10e-6 sim.SNPMutator(u=0.000001, v=0.000001) ], #Evolve for a number 'numgen' of generations gen=numgen) #Getting population informations (number of subpopulations, population size) sim.stat(pop, popSize=True) subsize = pop.dvars().subPopSize numpop = len(subsize) #Setting environmental value for all individuals in each subpopulation for i in range(numpop): pop.setIndInfo(vec_env[i], 'env', subPop=i) #Sampling 20 individuals at random in each population sample = drawRandomSample(pop, sizes=[20] * numpop) #Adding population name to the field of individuals sample.addInfoFields('pop_name') vecname = []
# record recombinations rc = RecombCollector(first_gen=pop.indInfo("ind_id"), ancestor_age=args.ancestor_age, length=2 * args.length, locus_position=locus_position + [args.length, 2 * args.length]) migr_mat = [[0, args.m, 0], [args.m, 0, args.M], [0, args.M, 0]] pop.evolve(initOps=[ sim.InitSex(), ] + init_geno, preOps=[ sim.PyOperator(lambda pop: rc.increment_time() or True), sim.Migrator(rate=migr_mat, mode=sim.BY_PROBABILITY), sim.SNPMutator(u=args.sel_mut_rate, v=args.sel_mut_rate), sim.PyMlSelector(fitness.left, subPops=fitness.left_subpops, output=">>" + selloci_file), sim.PyMlSelector(fitness.right, subPops=fitness.right_subpops, output=">>" + selloci_file), ], matingScheme=sim.RandomMating(ops=[ id_tagger, sim.Recombinator(intensity=args.recomb_rate, output=rc.collect_recombs, infoFields="ind_id"), ]), postOps=[ sim.Stat(numOfSegSites=sim.ALL_AVAIL, step=50),
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # This script is an example in the simuPOP user's guide. Please refer to # the user's guide (http://simupop.sourceforge.net/manual) for a detailed # description of this example. # import simuPOP as sim pop = sim.Population(size=[2000], loci=[1, 1], lociNames=['A', 'B'], infoFields='fitness') pop.evolve( initOps=sim.InitSex(), preOps=[ sim.SNPMutator(u=0.001), sim.MaSelector(loci='A', fitness=[1, 0.99, 0.98]), ], matingScheme=sim.RandomMating(), postOps=[ sim.Stat(alleleFreq=['A', 'B'], step=100), sim.PyEval(r"'%.3f\t%.3f\n' % (alleleFreq[0][1], alleleFreq[1][1])", step=100), ], gen=500 )
import simuPOP as sim from math import log pop = sim.Population(size=10000, loci=1) simu = sim.Simulator(pop, rep=3) simu.evolve( initOps=[ sim.InitSex(), # Because of the use of parameter reps, these operators are # applied to different populations. sim.InitGenotype(freq=(0.2, 0.8), reps=0), sim.InitGenotype(freq=(0.5, 0.5), reps=1), sim.InitGenotype(freq=(0.8, 0.2), reps=2) ], preOps=sim.SNPMutator(u=0.01, v=0.001), matingScheme=sim.RandomMating(), postOps=[ sim.Stat(alleleFreq=0, step=100), sim.PyEval('gen', reps=0, step=100), sim.PyEval(r"'\t%.3f' % alleleFreq[0][0]", step=100), sim.PyOutput('\n', reps=-1, step=100) ], gen=500)
def simuGWAS(pop, mutaRate=1.8e-8, recIntensity=1e-8, migrRate=0.0001, expandGen=500, expandSize=[10000], DPL=[], curFreq=[], fitness=[1, 1, 1], scale=1, logger=None): # handling scaling... mutaRate *= scale recIntensity *= scale migrRate *= scale expandGen = int(expandGen / scale) fitness = [1 + (x - 1) * scale for x in fitness] pop.dvars().scale = scale # Demographic function demoFunc = linearExpansion(pop.subPopSizes(), expandSize, expandGen) # define a trajectory function trajFunc = None introOps = [] if len(DPL) > 0: stat(pop, alleleFreq=DPL, vars='alleleFreq_sp') currentFreq = [] for sp in range(pop.numSubPop()): for loc in pop.lociByNames(DPL): currentFreq.append(pop.dvars(sp).alleleFreq[loc][1]) # if there is no existing mutants at DPL if sum(currentFreq) == 0.: endFreq = [(x - min(0.01, x / 5.), x + min(0.01, x / 5., (1 - x) / 5.)) for x in curFreq] traj = simulateForwardTrajectory(N=demoFunc, beginGen=0, endGen=expandGen, beginFreq=currentFreq, endFreq=endFreq, nLoci=len(DPL), fitness=fitness, maxAttempts=1000, logger=logger) introOps = [] else: traj = simulateBackwardTrajectory(N=demoFunc, endGen=expandGen, endFreq=curFreq, nLoci=len(DPL), fitness=fitness, minMutAge=1, maxMutAge=expandGen, logger=logger) introOps = traj.mutators(loci=DPL) if traj is None: raise SystemError( 'Failed to generated trajectory after 1000 attempts.') trajFunc = traj.func() if pop.numSubPop() > 1: pop.addInfoFields('migrate_to') pop.dvars().scale = scale pop.evolve( initOps=sim.InitSex(), preOps=[ sim.SNPMutator(u=mutaRate, v=mutaRate), sim.IfElse( pop.numSubPop() > 1, sim.Migrator( rate=migrSteppingStoneRates(migrRate, pop.numSubPop()))), ] + introOps, matingScheme=sim.ControlledRandomMating( loci=DPL, alleles=[1] * len(DPL), freqFunc=trajFunc, ops=sim.Recombinator(intensity=recIntensity), subPopSize=demoFunc), postOps=[ sim.Stat(popSize=True, structure=range(pop.totNumLoci())), sim.PyEval( r'"After %3d generations, size=%s\n" % ((gen + 1 )* scale, subPopSize)' ), sim.IfElse(pop.numSubPop() > 1, sim.PyEval(r"'F_st = %.3f\n' % F_st", step=10), step=10), ], gen=expandGen) return pop
haploid_labels = [(k, p) for k in first_gen for p in (0, 1)] node_ids = {x: j for x, j in zip(haploid_labels, init_ts.samples())} rc = RecombCollector(ts=init_ts, node_ids=node_ids, locus_position=locus_position) # initially, population is monogenic init_geno = [sim.InitGenotype(freq=1.0)] pop.evolve( initOps=[ sim.InitSex(), ] + init_geno, preOps=[ sim.PyOperator(lambda pop: rc.increment_time() or True), sim.SNPMutator(u=args.neut_mut_rate, v=0, loci=neutral_loci), sim.SNPMutator(u=args.sel_mut_rate, v=0, loci=selected_loci), sim.PyMlSelector(GammaDistributedFitness(args.gamma_alpha, args.gamma_beta), loci=selected_loci, output=">>" + selloci_file), ], matingScheme=sim.RandomMating(ops=[ id_tagger, sim.Recombinator(rates=args.recomb_rate, output=rc.collect_recombs, infoFields="ind_id"), ]), postOps=[ sim.Stat(numOfSegSites=sim.ALL_AVAIL, step=REPORTING_STEP,
locus_position=locus_position, benchmark=True, mode='binary') pre_ops = [sim.PyOperator(lambda pop: rc.increment_time() or True)] mating_ops = [id_tagger] logfile.write(time.strftime('%X %x %Z') + "\n") logfile.write("Started simulating! Generations:\n") post_ops = [sim.PyEval(r'" %d\n" % (gen)', step=100, output=logfile)] nselloci = int(args.sel_mut_rate / (args.mut_rate + args.sel_mut_rate)) selected_loci = random.sample(locus_position, nselloci) neutral_loci = list(set(locus_position) - set(selected_loci)) if args.record_neutral: pre_ops += [ sim.SNPMutator(u=args.mut_rate, v=args.mut_rate, loci=neutral_loci) ] mating_ops += [ sim.Recombinator(rates=args.recomb_rate, infoFields="ind_id") ] elif not args.record_neutral: mating_ops += [ sim.Recombinator(rates=args.recomb_rate, output=sim.WithMode(rc.collect_recombs, 'b'), infoFields="ind_id") ] post_ops += [ sim.PyOperator(lambda pop: rc.simplify(pop.indInfo("ind_id")) or True, step=args.simplify_interval) ] pop.evolve(
else: return 1. - 2. * s pop = sim.Population(size=args.popsize, loci=[args.nselloci], lociPos=locus_position, infoFields=['ind_id', 'fitness', 'migrate_to']) pop.evolve( initOps=[ sim.InitSex(), sim.IdTagger(), ] + init_geno, preOps=[ sim.SNPMutator(u=args.sel_mut_rate, v=0, loci=range(1, args.nselloci)), sim.PyMlSelector(GammaDistributedFitness(args.gamma_alpha, args.gamma_beta), loci=range(1, args.nselloci), output=">>" + selloci_file), ], matingScheme=sim.RandomMating(ops=[ sim.IdTagger(), sim.Recombinator(intensity=args.recomb_rate, output=rc.collect_recombs, infoFields="ind_id"), ]), postOps=[ sim.Stat(numOfSegSites=sim.ALL_AVAIL, step=50), sim.PyEval(r"'Gen: %2d #seg sites: %d\n' % (gen, numOfSegSites)", step=50)
def MutationSelection(N=1000, generations=10000, X_loci=100, A_loci=0, AgingModel='two_phases', seed=2001, reps=1, InitMutFreq=0.001, aging_a1=0.003, aging_a2=0.05, aging_b=-0.019, aging_k=0.1911, MutRate=0.001, StatsStep=100, OutPopPrefix='z1', PrintFreqs=False, debug=False): '''Creates and evolves a population to reach mutation-selection balance.''' if debug: sim.turnOnDebug('DBG_ALL') else: sim.turnOffDebug('DBG_ALL') sim.setRNG('mt19937', seed) pop = sim.Population(N, loci=[X_loci, A_loci], ploidy=2, chromTypes=[sim.CHROMOSOME_X, sim.AUTOSOME], infoFields=[ 'age', 'a', 'b', 'smurf', 'ind_id', 'father_id', 'mother_id', 'luck', 't0', 'fitness' ]) pop.setVirtualSplitter( sim.CombinedSplitter( splitters=[ sim.ProductSplitter(splitters=[ sim.InfoSplitter(field='age', cutoff=9), sim.InfoSplitter(field='smurf', values=[0, 1]) ]), sim.SexSplitter(), sim.InfoSplitter(field='age', values=0) ], vspMap=[(0), (2), (1, 3), (4), (5), (6)], names=['larvae', 'adults', 'smurfs', 'males', 'females', 'zero'])) pop.dvars().k = aging_k pop.dvars().N = N pop.dvars().seed = seed pop.dvars().X_loci = X_loci pop.dvars().A_loci = A_loci pop.dvars().AgingModel = AgingModel exec("import random\nrandom.seed(seed)", pop.vars(), pop.vars()) exec("import math", pop.vars(), pop.vars()) simu = sim.Simulator(pop, rep=reps) simu.evolve( initOps=[ sim.InitSex(), sim.InitGenotype(freq=[1 - InitMutFreq, InitMutFreq]), sim.InitInfo([0], infoFields='age'), sim.InitInfo([aging_a1], infoFields='a'), sim.InitInfo([aging_b], infoFields='b'), sim.InitInfo(lambda: random.random(), infoFields='luck'), sim.InfoExec('t0 = -ind.b / ind.a', exposeInd='ind'), sim.InfoExec( 'smurf = 1.0 if AgingModel == "two_phases" and (ind.smurf == 1 or (ind.age > ind.t0 and ind.luck < 1.0 - math.exp(-ind.a * ind.age + ind.a * ind.t0 - ind.a / 2.0))) else 0.0', exposeInd='ind'), sim.IdTagger(), sim.PyExec('XFreqChange={}'), sim.PyExec('AFreqChange={}') ], preOps=[ sim.InfoExec('luck = random.random()'), sim.InfoExec( 'smurf = 1.0 if AgingModel == "two_phases" and (ind.smurf == 1 or (ind.age > ind.t0 and ind.luck < 1.0 - math.exp(-ind.a * ind.age + ind.a * ind.t0 - ind.a / 2.0))) else 0.0', exposeInd='ind'), sim.DiscardIf(natural_death(AgingModel)), sim.InfoExec('age += 1'), sim.PySelector(func=fitness_func1) ], matingScheme=sim.HeteroMating([ sim.CloneMating(subPops=[(0, 0), (0, 1), (0, 2)], weight=-1), sim.RandomMating(ops=[ sim.IdTagger(), sim.PedigreeTagger(), sim.InfoExec('smurf = 0.0'), sexSpecificRecombinator( rates=[0.75 / X_loci for x in range(X_loci)] + [2.07 / A_loci for x in range(A_loci)], maleRates=0.0), sim.PyQuanTrait(loci=sim.ALL_AVAIL, func=TweakAdditiveRecessive( aging_a1, aging_a2, aging_b, X_loci), infoFields=['a', 'b']) ], weight=1, subPops=[(0, 1)], numOffspring=1) ], subPopSize=demo), postOps=[ sim.SNPMutator(u=MutRate, subPops=[(0, 5)]), sim.Stat(alleleFreq=sim.ALL_AVAIL, step=StatsStep), sim.IfElse( 'X_loci > 0', ifOps=[ sim.PyExec( 'XFreqChange[gen] = [alleleFreq[x][1] for x in range(X_loci)]' ) ], elseOps=[sim.PyExec('XFreqChange[gen] = []')], step=StatsStep), sim.IfElse( 'A_loci > 0', ifOps=[ sim.PyExec( 'AFreqChange[gen] = [alleleFreq[a][1] for a in range(X_loci, pop.totNumLoci())]', exposePop='pop') ], elseOps=[sim.PyExec('AFreqChange[gen] = []')], step=StatsStep), sim.IfElse( PrintFreqs, ifOps=[ sim.PyEval( r"str(rep) + '\t' + str(gen) + '\t' + '\t'.join(map('{0:.4f}'.format, XFreqChange[gen])) + '\t\t' + '\t'.join(map('{0:.4f}'.format, AFreqChange[gen])) + '\n'" ) ], step=StatsStep), sim.TerminateIf( 'sum([alleleFreq[x][0] * alleleFreq[x][1] for x in range(X_loci + A_loci)]) == 0' ) ], gen=generations) i = 0 for pop in simu.populations(): pop.save('{}_{}.pop'.format(OutPopPrefix, i)) i += 1