Example #1
0
         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),
Example #3
0
# 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
)

Example #4
0
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)
Example #5
0
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
Example #6
0
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,
Example #7
0
                     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(
Example #8
0
        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)
Example #9
0
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