def replicate_tuson_drift_simulation(self, pop, meta_population,
                                      meta_sample_size,
                                      recombination_rates):
     for replicate in pop.populations():
         replicate.dvars().gen = 0
     female_chooser = sim.RandomParentChooser(
         selectionField='female_fitness')
     male_chooser = sim.RandomParentChooser(selectionField='male_fitness')
     print("Beginning simulation of genetic drift with parameters:")
     breeding_params = {
         'n_breeding_females': self.number_of_breeding_females,
         'n_breeding_males': self.number_of_breeding_males,
         'sample_sizes': meta_sample_size}
     print("Breeding females: {n_breeding_females}, breeding males: "
           "{n_breeding_males}, "
           "sample sizes: {sample_sizes}".format(**breeding_params))
     return pop.evolve(
         initOps=[
             operators.ReplicateMetaPopulation(meta_population,
                                               meta_sample_size),
             sim.PyEval(
                 r'"Initial: Sampled %d individuals from generation %d Replicate: %d.\n" % (ss, gen_sampled_from, rep)'),
         ],
         preOps=[
             sim.PyEval(r'"Generation: %d\n" % gen'),
             sim.InfoExec('generation=gen'),
             operators.ReplicateMetaPopulation(meta_population,
                                               meta_sample_size,
                                               at=[2, 4, 6, 8]),
             # Evaluation specifying the generations should be the same as the evaluation at every generation.
             sim.PyEval(
                 r'"Sampled %d individuals from generation %d from replicate: %d.\n" % (ss, gen_sampled_from, rep)',
                 at=[2, 4, 6, 8]),
             operators.RandomlyAssignFemaleFitness(
                 self.number_of_breeding_females),
             operators.RandomlyAssignMaleFitness(
                 self.number_of_breeding_males),
         ],
         matingScheme=sim.HomoMating(
             sim.CombinedParentsChooser(female_chooser, male_chooser,
                                        allowSelfing=True),
             sim.OffspringGenerator(ops=[
                 sim.ParentsTagger(),
                 sim.IdTagger(),
                 sim.PedigreeTagger(),
                 sim.Recombinator(rates=recombination_rates)],
             ),
         ),
         finalOps=[
             sim.InfoExec('generation=gen'),
             operators.ReplicateMetaPopulation(meta_population,
                                               meta_sample_size),
             sim.PyEval(
                 r'"Final: Sampled %d individuals from generation %d\n" % (ss, gen_sampled_from)')
         ],
         gen=self.number_of_generations)
Exemple #2
0
 def __init__(self,
              intensity=0,
              rates=0,
              loci=sim.ALL_AVAIL,
              convMode=sim.NO_CONVERSION,
              maleIntensity=0,
              maleRates=0,
              maleLoci=sim.ALL_AVAIL,
              maleConvMode=sim.NO_CONVERSION,
              *args,
              **kwargs):
     # This operator is used to recombine maternal chromosomes
     self.Recombinator = sim.Recombinator(rates, intensity, loci, convMode)
     # This operator is used to recombine paternal chromosomes
     self.maleRecombinator = sim.Recombinator(maleRates, maleIntensity,
                                              maleLoci, maleConvMode)
     sim.PyOperator.__init__(self,
                             func=self.transmitGenotype,
                             *args,
                             **kwargs)
Exemple #3
0
 def create_self_crosses(self, existing_pop, offspring_per_individual):
     new_pop_size = offspring_per_individual * existing_pop.popSize()
     existing_pop.evolve(
         matingScheme=sim.SelfMating(
             replacement=False,
             numOffspring=offspring_per_individual,
             subPopSize=new_pop_size,
             ops=[
                 sim.IdTagger(),
                 sim.PedigreeTagger(),
                 sim.Recombinator(rates=0.01)
             ],
         ),
         gen=1,
     )
Exemple #4
0
 def random_mating(self, generations_of_random_mating, pop_size):
     """
     Randomly mates 'pop' for 'gens_of_random_mating' generations to further
     recombine founder genomes and dissolve population structure.
     """
     print("Initiating random mating for {} generations.".format(
         generations_of_random_mating))
     self.pop.evolve(
         matingScheme=sim.RandomMating(
             subPopSize=pop_size,
             ops=[
                 sim.IdTagger(),
                 sim.PedigreeTagger(),
                 sim.Recombinator(rates=self.recombination_rates)
             ]),
         gen=generations_of_random_mating,
     )
Exemple #5
0
    def recombinatorial_convergence(self, pop, recombination_rates):
        """
        Implements the MAGIC breeding scheme of breeding single individuals
        in pairs determined by the offspring of the initial population. The
        initial population is given by generate_f_one.
        :param pop:
        :type pop:
        :param recombination_rates:
        :type recombination_rates:
        :return:
        :rtype:
        """
        while pop.numSubPop() > 1:
            new_parents = list(pop.indInfo('ind_id'))
            new_parent_id_pairs = [(pid, pid + 1) for pid in new_parents[::2]]

            if len(new_parent_id_pairs) % 2 != 0 and \
                            len(new_parent_id_pairs) != 1:
                new_parent_id_pairs.append(random.choice(new_parent_id_pairs))

            new_os_size = len(new_parent_id_pairs)

            new_founder_chooser = breed.PairwiseIDChooser(new_parent_id_pairs)

            pop.evolve(
                preOps=[
                    sim.PyEval(r'"Generation: %d\t" % gen', ),
                    sim.Stat(popSize=True, numOfMales=True),
                    sim.PyEval(r'"popSize: %d\n" % popSize', ),
                ],
                matingScheme=sim.HomoMating(
                    sim.PyParentsChooser(new_founder_chooser.by_id_pairs),
                    sim.OffspringGenerator(ops=[
                        sim.IdTagger(),
                        sim.ParentsTagger(),
                        sim.PedigreeTagger(),
                        sim.Recombinator(rates=recombination_rates)
                    ],
                                           numOffspring=1),
                    subPopSize=new_os_size,
                ),
                gen=1,
            )
    def expansion_through_random_mating(self, pop, expanded_pop_size,
                                        recombination_rates):

        # The purpose of this function is to use the simuPOP pre-defined mating scheme
        # RandomMating to grow the population to an arbitrary size.
        # Self-pollination occurs frequently in maize so we need use HermaphroditicMating
        # instead of RandomMating.
        return pop.evolve(
            initOps=sim.InitSex(),
            preOps=[
                sim.PyEval(r'"Generation: %d\n" % gen'),
                sim.InfoExec('generation=gen'),
            ],
            matingScheme=sim.HermaphroditicMating(
                ops=[sim.Recombinator(rates=recombination_rates),
                     sim.IdTagger(),
                     sim.PedigreeTagger()],
                subPopSize=expanded_pop_size),
            gen=1)
Exemple #7
0
    def recombinatorial_convergence(self, multi_replicate_populations,
                                    number_sub_populations,
                                    offspring_per_pair):
        """
        Breeds individuals from different sub-populations together until a
        single hybrid sub-population is created.
        :note:`number_sub_populations*offspring_per_pair should equal operating_population_size.`
        :note:`For the time being only works with powers of 2.`


        :param sim.Simulator multi_replicate_populations:
        :param int number_sub_populations:
        :param int offspring_per_pair:
        :return:
        """
        print("Start of recombinatorial convergence.")
        while number_sub_populations > 1:
            mrc = MultiRandomCross(multi_replicate_populations,
                                   number_sub_populations, offspring_per_pair)
            mothers, fathers = mrc.determine_random_cross()
            multi_snd_order_chooser = MultiSecondOrderPairIDChooser(
                mothers, fathers)
            print("Prior to convergence: {}".format(number_sub_populations))
            multi_replicate_populations.evolve(
                matingScheme=sim.HomoMating(
                    sim.PyParentsChooser(
                        multi_snd_order_chooser.snd_ord_id_pairs),
                    sim.OffspringGenerator(ops=[
                        sim.IdTagger(),
                        sim.PedigreeTagger(),
                        sim.Recombinator(rates=self.recombination_rates)
                    ],
                                           numOffspring=1),
                    subPopSize=[
                        int(number_sub_populations * offspring_per_pair)
                    ]),
                gen=1,
            )
            number_sub_populations = int(number_sub_populations / 2)
            offspring_per_pair = int(2 * offspring_per_pair)
        self._convergence = True
Exemple #8
0
 def _mate_and_merge(self, pop: sim.Population):
     starting_gen = pop.vars()['gen']
     print("Initiating recombinatorial convergence at generation: %d" % pop.dvars().gen)
     while pop.numSubPop() > 1:
         pop.vars()['generations'][pop.vars()['gen']] = 'IG'+str(pop.vars()['gen'] - starting_gen)
         self.pop_halver(pop)
         self.odd_to_even(pop)
         self.pairwise_merge_protocol(pop)
         sub_pop_sizes = list(pop.subPopSizes())
         pop.evolve(
             preOps=[
                 sim.MergeSubPops(),
                 sim.PyEval(r'"Generation: %d\n" % gen'),
                 operators.CalcTripletFreq(),
                 sim.PyExec('triplet_freq[gen]=tripletFreq'),
                 sim.SplitSubPops(sizes=sub_pop_sizes, randomize=False),
             ],
             matingScheme=sim.RandomMating(ops=[sim.Recombinator(rates=0.01),
                                                sim.IdTagger(), sim.PedigreeTagger()]),
             gen=1,
         )
Exemple #9
0
 def interim_random_mating(self, pop, recombination_rates):
     """
     Randomly mates 'pop' for 'gens_of_random_mating' generations to further recombine founder genomes and dissolve
     population structure.
     :param pop: Founder population after mate_and_merge procedure
     :return: Population ready to be subjected to selection
     """
     print("Initiating interim random mating for {} generations.".format(
         self.generations_of_random_mating))
     pop.evolve(
         preOps=[
             sim.PyEval(r'"Generation: %d\n" % gen'),
         ],
         matingScheme=sim.RandomMating(
             subPopSize=self.operating_population_size,
             ops=[
                 sim.IdTagger(),
                 sim.PedigreeTagger(),
                 sim.Recombinator(rates=recombination_rates)
             ]),
         gen=self.generations_of_random_mating,
     )
Exemple #10
0
 def _generate_f_two(self, pop: sim.Population) -> sim.Population:
     """
     Creates an F2 subpopulations generation by selfing the individuals of 'pop'. Works on a population with one
     or more subpopulations.
     """
     pop.vars()['generations'][2] = 'F_2'
     self.odd_to_even(pop)
     num_sub_pops = pop.numSubPop()
     progeny_per_individual = int(self.selected_population_size/2)
     print("Creating the F_two population.")
     return pop.evolve(
         preOps=[
             sim.MergeSubPops(),
             sim.PyEval(r'"Generation: %d\n" % gen'),
             operators.CalcTripletFreq(),
             sim.PyExec('triplet_freq[gen]=tripletFreq'),
             sim.SplitSubPops(sizes=[1]*num_sub_pops, randomize=False),
         ],
         matingScheme=sim.SelfMating(subPopSize=[progeny_per_individual] * num_sub_pops,
                                     numOffspring=progeny_per_individual,
                                     ops=[sim.Recombinator(rates=0.01), sim.IdTagger(), sim.PedigreeTagger()],
                                     ),
         gen=1,
     )
 def population_structure_guided_expansion(self, pop, recombination_rates):
     """
     Uses a population structure matrix to determine the probability of
     selecting a second parent given the first parent's probability mass
     function.
     """
     ps_pc = breed.ForcedPopulationStructureParentChooser(
         self.population_size)
     print(
         "Executing population expansion using estimated population structure.")
     return pop.evolve(
         initOps=sim.InitSex(),
         preOps=[
             sim.InfoExec('generation=gen'),
         ],
         matingScheme=sim.HomoMating(
             sim.PyParentsChooser(ps_pc.forced_structure_parent_chooser),
             sim.OffspringGenerator(ops=[
                 sim.IdTagger(),
                 sim.PedigreeTagger(),
                 sim.Recombinator(rates=recombination_rates),
             ]),
             subPopSize=self.population_size),
         gen=1)
Exemple #12
0
def main():

    # Check for arguments passed
    try:
        opts, args = getopt.getopt(sys.argv[1:],
                                   shortopts="vhd:p1:p2:s:n:l:e:f:i:m:g:r:",
                                   longopts=[
                                       "verbose", "help", "distribution=",
                                       "parameter1=", "parameter2=", "size=",
                                       "number=", "loci=", "effect=", "mean=",
                                       "filename=", "heritability=", "gen=",
                                       "rrate="
                                   ])

    except getopt.GetoptError as err:
        print(err)
        usage()
        sys.exit()

    verbose = False
    filename = "my"
    size = 1000
    number = 100
    heritability = 0.2
    mean = 2.0
    gen = 5
    rrate = 0.0
    print "\n"

    for o in opts:
        if o[0] in ("-v", "--verbose"):
            verbose = True
            print("Verbose mode")
    for o in opts:
        if o[0] in ("-d", "--distribution"):
            distribution = float(o[1])
            if distribution == 0:
                parameter1 = None
                parameter2 = None
                if verbose:
                    print "Simulation will occur with Normal Distribution"
            elif distribution == 1:
                if verbose:
                    print "Simulation will occur with Gamma Distribution"
                for o in opts:
                    if o[0] in ("-p1", "--parameter1"):
                        parameter1 = float(o[1])
                        if verbose:
                            print "Gamma distribution will occur with alpha:", parameter1
                for o in opts:
                    if o[0] in ("-p2", "--parameter2"):
                        parameter2 = float(o[1])
                        if verbose:
                            print "Gamma distribution will occur with beta:", parameter2
            elif distribution != 0 or distribution != 1:
                sys.exit(
                    "Error message: Distribution option must be either 0 or 1")
    for o in opts:
        if o[0] in ("-p2", "--parameter2"):
            bbeta = float(o[1])
            if verbose:
                print "Gamma distribution will occur with beta:", bbeta
    for o in opts:
        if o[0] in ("-s", "--size"):
            individuals = o[1].split(",")
            individuals = map(int, individuals)
            if verbose:
                print "Population size/s is set at", individuals
    for o in opts:
        if o[0] in ("-h", "--help"):
            usage()
            sys.exit()
        elif o[0] in ("-n", "--number"):
            number = o[1]
            if verbose:
                print "Number of loci per individual is set at", number
        elif o[0] in ("-l", "--loci"):
            global loci
            loci = o[1].split(",")
            loci = map(int, loci)
            if verbose:
                print "Loci positions per individual are:", loci
        elif o[0] in ("-e", "--effect"):
            global effects
            effects = o[1].split(",")
            effects = map(float, effects)
            if verbose:
                print "Effects for loci per individual are:", effects
        elif o[0] in ("-f", "--filename"):
            filename = o[1]
            if verbose:
                print "File will be saved as:", filename
        elif o[0] in ("-i", "--heritability"):
            heritability = float(o[1])
            if verbose:
                print "Heritability for simulation specified as:", heritability
        elif o[0] in ("-m", "--mean"):
            mean = o[1].split(",")
            mean = map(float, mean)
            if len(mean) == 1 and len(individuals) > 1:
                mean = numpy.array(mean)
                mean = numpy.repeat(mean, len(individuals), axis=0)
                mean = list(mean)
            if verbose:
                print "Population mean/s specified as:", mean
        elif o[0] in ("-g", "--gen"):
            gen = int(o[1])
            if verbose:
                print "Generations to evolve specified as:", gen
        elif o[0] in ("-r", "--rrate"):
            rrate = float(o[1])
            if verbose:
                print "Recombination will occur with rate:", rrate

    ## Start quantitative trait simulation
    if verbose:
        print "Creating population..."

    pop = sim.Population(size=individuals,
                         loci=int(number),
                         infoFields=["qtrait"])

    if verbose:
        print "Evolving population..."

    pop.evolve(
        initOps=[sim.InitSex(),
                 sim.InitGenotype(prop=[0.7, 0.3])],
        matingScheme=sim.RandomMating(ops=sim.Recombinator(rates=rrate)),
        postOps=[
            sim.PyQuanTrait(loci=loci,
                            func=additive_model,
                            infoFields=["qtrait"])
        ],
        gen=gen)

    if verbose:
        print "Coalescent process complete. Population evolved with", pop.numSubPop(
        ), "sub-populations."

    genotypes = list()
    for i in pop.individuals():
        genotypes.append(i.genotype())

    phenotypes = list()
    for i in pop.individuals():
        phenotypes.append(i.qtrait)

    # fun() obtains the heritability equation set to zero for various settings of sigma (standard deviation)
    #NOTE: May need to tweak gamma distribution parameters to be appropriate for data!
    def fun(sigma, h):
        x_exact = list()
        count = 0
        for i in phenotypes:
            current_mean = mean[pop.subPopIndPair(count)[0]]
            x_exact.append(current_mean + i)
            count += 1
        x_random = list()
        #bbeta=((sigma**2)/current_mean) #Set up approximate beta variable for gamma distribution
        count = 0
        for each in phenotypes:
            current_mean = mean[pop.subPopIndPair(count)[0]]
            x_random.append(random.normalvariate(current_mean + each, sigma))
            count += 1
        r = pearsonr(x_exact, x_random)[0]
        return r - math.sqrt(h)

    if verbose:
        print "Building polynomial model for variance tuning..."

    # Fits a polynomial model in numpy to the values obtained from the fun() function
    points = list()
    for i in drange(0, max(effects) * 10, 0.001):
        points.append(i)
    y_points = list()
    for i in points:
        y_points.append(fun(i, heritability))
    z = numpy.polyfit(x=points, y=y_points, deg=3)
    p = numpy.poly1d(z)

    # Netwon's method finds the polynomial model's roots
    def newton(p):
        xn = 100
        p_d = p.deriv()
        count = 0
        while abs(p(xn)) > 0.01:
            if count > 1000:
                print "Unable to converge after 1000 iterations...\nPlease choose different settings."
                usage()
                sys.exit()
            count += 1
            xn = xn - p(xn) / p_d(xn)
        if xn < 0.0:
            xn = 0.0
        if verbose:
            print "Estimated variance of phenotypes for specified heriability: ", xn
        return xn

    if verbose:
        print "Using Newton's method to find polynomial roots..."

    # Files are saved to the specified location
    estimated_variance = newton(p)
    new_phenotypes = list()
    count = 0
    for o in opts:
        if o[0] in ("-d", "--distribution"):
            if distribution == 0:
                for each in phenotypes:
                    current_mean = mean[pop.subPopIndPair(count)[0]]
                    new_phenotypes.append(
                        random.normalvariate(current_mean + each,
                                             estimated_variance))
                    count += 1
            elif distribution == 1:
                for each in phenotypes:
                    current_mean = mean[pop.subPopIndPair(count)[0]]
                    new_phenotypes.append(
                        random.gammavariate(
                            (current_mean + each) / parameter2,
                            ((estimated_variance / parameter1)**0.5)))
                    count += 1
    f = open(filename + "_qtrait.txt", "w")
    f.write("\n".join(map(lambda x: str(x), new_phenotypes)))
    f.close()

    numpy.savetxt(filename + "_kt_ote2.txt",
                  numpy.column_stack((loci, numpy.array(effects))))

    export(pop, format='ped', output=filename + '_genomes.ped')
    export(pop, format='map', output=filename + '_genomes.map')
    print "\n\n"
Exemple #13
0
         #Selection process
         #Create new environmental values for new daughter populations
         #Only takes place when fission takes place (atgen)
         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)
Exemple #14
0
    return sz


pop1 = pop.clone()
pop1.evolve(
    preOps=[
        migr,
        sim.InfoExec('age += 1'),
    ],
    matingScheme=sim.HeteroMating(
        [
            # only adult individuals with age >=3 will mate and produce
            # offspring. The age of offspring will be zero.
            sim.RandomMating(ops=[
                sim.MendelianGenoTransmitter(),
                sim.Recombinator(intensity=0.1)
            ],
                             subPops=[(sim.ALL_AVAIL, '3 <= age < 9'),
                                      (sim.ALL_AVAIL, '9 <= age < 17')],
                             weight=-0.1),
            # individuals with age < 17 will be kept, but might be removed due to
            # population size decline
            sim.CloneMating(subPops=[(
                sim.ALL_AVAIL,
                'age < 3'), (sim.ALL_AVAIL,
                             '3 <= age < 9'), (sim.ALL_AVAIL, '9 <= age < 17')]
                            ),
        ],
        subPopSize=demoModel),
    postOps=[
        sim.Stat(popSize=True),
        sim.IdTagger(),
    ]+init_geno,
    preOps=[
        sim.Migrator(
            rate=migr2DSteppingStoneRates(
                migr, m=width, n=width, diagonal=False, circular=False),
            mode=sim.BY_PROBABILITY),
        sim.AcgtMutator(rate=[mut_rate], model='JC69'),
        sim.PyMlSelector(GammaDistributedFitness(alpha, beta),
            output='>>'+selloci_file),
    ],
    matingScheme=sim.RandomMating(
        ops=[
            sim.IdTagger(),
            sim.Recombinator(intensity=recomb_rate,
                output=outfile,
                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)
    ],
    gen = generations
)

logfile.write("Done simulating!\n")
logfile.write(time.strftime('%X %x %Z')+"\n")

# writes out events in this form:
# offspringID parentID startingPloidy rec1 rec2 ....
                     infoFields=['ind_id', 'fitness', 'migrate_to'])

pop.evolve(
    initOps=[
        sim.InitSex(),
    ] + init_geno,
    preOps=[
        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=[sim.Recombinator(intensity=args.recomb_rate)]),
    postOps=[
        sim.Stat(numOfSegSites=sim.ALL_AVAIL, step=50),
        sim.PyEval(r"'Gen: %2d #seg sites: %d\n' % (gen, numOfSegSites)",
                   step=50)
    ],
    gen=args.generations)

logfile.write("Done simulating!\n")
logfile.write(time.strftime('%X %x %Z') + "\n")
logfile.write("----------\n")
logfile.flush()

sample = drawRandomSample(pop, sizes=args.nsamples)

if args.outfile is None:
Exemple #17
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
Exemple #18
0
def simulateBySimuPOP():
    #starting variables
    directory = '/data/new/javi/toxo/simulations4/'
    input_path = 'Toxo20.txt'
    output_path = 'SimulatedToxo.txt'

    input_path = directory + input_path
    output_path = directory + output_path
    parents_path = directory + '/parents.txt'
    pedigree_path = directory + 'pedigree.txt'

    number_of_ancestors = 3
    expansion_pop_size = 15
    offsprings_sampled = number_of_ancestors + expansion_pop_size
    gen = 3
    translate_mode = 'toxoplasma'
    structure_mode = 'simupop'

    #parsing input
    init_info = parseSNPInput(input_path, number_of_ancestors)
    ancestral_genomes = init_info[0]
    ancestor_names = ancestral_genomes.keys()
    loci_positions = init_info[1]
    chromosome_names = sorted(loci_positions.keys(),
                              key=lambda x: cns.getValue(x, translate_mode))
    list_of_loci = [len(loci_positions[chr]) for chr in chromosome_names]
    lociPos = fc.reduce(lambda x, y: x + y,
                        [loci_positions[x] for x in chromosome_names])

    sp.turnOnDebug(code="DBG_GENERAL")

    #initializing
    print('Initializaing Population')
    population = sp.Population(size=[number_of_ancestors], loci=list_of_loci, ancGen = 5, lociPos = lociPos, \
                               chromNames = chromosome_names, lociNames = [], alleleNames = ['A','T','G','C'],\
                               infoFields=['name', 'ind_id', 'father_id', 'mother_id'])

    for individual, sample, ind_id in zip(population.individuals(),
                                          ancestral_genomes,
                                          range(len(ancestral_genomes))):
        individual.setInfo(ancestor_names.index(sample), 'name')
        individual.setInfo(ind_id, 'ind_id')
        for ind, chr in enumerate(chromosome_names):
            individual.setGenotype(ancestral_genomes[sample][chr],
                                   chroms=[ind])

    #Alternating rounds of recombination with clonal expansion. Clonal expansion gives + 2.
    #Mutation prior to each round

    simulator = sp.Simulator(population)
    rate_matrix = createRateMatrix(len(ancestor_names),
                                   0.0002)  #10,000 times the mutation rate.
    id_tagger = sp.IdTagger()
    ped_tagger = sp.PedigreeTagger(output='>>' + pedigree_path,
                                   outputFields=['name', 'ind_id'])
    inherit_tagger = sp.InheritTagger(infoFields='name')

    initOps1 = [sp.PyExec('print("Starting random selection")'), ped_tagger]
    initOps2 = [sp.PyExec('print("Starting random mating")'), ped_tagger]
    preOps1 = [sp.MatrixMutator(rate=rate_matrix)]
    preOps2 = [sp.InitSex(sex=[sp.MALE, sp.FEMALE])]

    matingScheme1 = sp.RandomSelection(
        ops=[sp.CloneGenoTransmitter(), inherit_tagger, id_tagger, ped_tagger],
        subPopSize=expansion_pop_size)
    matingScheme2 = sp.RandomMating(
        ops=[
            sp.Recombinator(intensity=0.01 / 105000,
                            convMode=(sp.GEOMETRIC_DISTRIBUTION, 0.001,
                                      0.01)),  #10x normal
            sp.PyTagger(func=addNames),
            id_tagger,
            ped_tagger
        ],
        subPopSize=expansion_pop_size)

    postOps = []
    finalOps = []

    print('Starting Evolution Cycles.')

    try:
        os.remove(pedigree_path)
    except:
        pass

    simulator.evolve(
        initOps=[id_tagger, ped_tagger],
        matingScheme=sp.CloneMating(ops=[
            sp.CloneGenoTransmitter(), ped_tagger, id_tagger, inherit_tagger
        ]),
        gen=1)

    for x in range(gen):
        simulator.evolve(initOps=initOps1,
                         preOps=preOps1,
                         matingScheme=matingScheme1,
                         postOps=postOps,
                         finalOps=finalOps,
                         gen=1)
        simulator.evolve(initOps=initOps2,
                         preOps=preOps2,
                         matingScheme=matingScheme2,
                         postOps=postOps,
                         finalOps=finalOps,
                         gen=1)

    offsprings = {
        ''.join([
            str(int(x.info('name'))),
            generateID(3),
            str(int(x.info('ind_id')))
        ]): x.info('ind_id')
        for x in simulator.population(0).individuals()
    }
    sampled_ones = rand.sample(offsprings.keys(), offsprings_sampled)

    #reorganizes the offspring genome. Extract info by chr.
    offspring_genomes = {name: {} for name in sampled_ones}
    for name in sampled_ones:
        for ind, chr in enumerate(chromosome_names):
            offspring_genomes[name][chr] = simulator.population(0).indByID(
                offsprings[name], idField='ind_id').genotype(ploidy=0,
                                                             chroms=[ind])

    offspring_genomes.update(ancestral_genomes)

    print('Parent Guide:')
    for ind, id in enumerate(ancestor_names):
        print(" : ".join([str(ind), str(id)]))

    print('Complete. Generating Output.')

    with open(parents_path, 'w') as parent_output:
        parent_output.write('Parent Guide:\n')
        for ind, id in enumerate(ancestor_names):
            parent_output.write(" : ".join([str(ind), str(id)]) + '\n')

    #output
    offspring_genomes = snp.restructure((offspring_genomes, loci_positions),
                                        structure_mode)
    snp.outputGriggFormat(offspring_genomes, output_path)
    print('Simulation Complete.')
Exemple #19
0
# 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(1000, loci=[5]*4,
    # one autosome, two sex chromosomes, and one mitochondrial chromosomes
    chromTypes=[sim.AUTOSOME, sim.CHROMOSOME_X, sim.CHROMOSOME_Y, sim.MITOCHONDRIAL],
    infoFields=['fitness'])
pop.evolve(
    initOps=[
        sim.InitSex(),
        sim.InitGenotype(freq=[0.25]*4)
    ],
    preOps=[
        sim.MapSelector(loci=17, fitness={(0,): 1, (1,): 1, (2,): 1, (3,): 0.4})
    ],
    matingScheme=sim.RandomMating(ops= [
        sim.Recombinator(rates=0.1),
        sim.MitochondrialGenoTransmitter(),
    ]),
    postOps=[
        sim.Stat(alleleFreq=17, step=10),
        sim.PyEval(r'"%.2f %.2f %.2f %.2f\n" % (alleleNum[17][0],'
            'alleleNum[17][1], alleleNum[17][2], alleleNum[17][3])', step=10),
    ],
    gen = 100
)

Exemple #20
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(10,
                     loci=[20],
                     ancGen=1,
                     infoFields=['father_idx', 'mother_idx'])
pop.evolve(
    initOps=[sim.InitSex(),
             sim.InitGenotype(genotype=[0] * 20 + [1] * 20)],
    matingScheme=sim.RandomMating(
        ops=[sim.Recombinator(
            rates=0.01), sim.ParentsTagger()]),
    gen=1)
pop.indInfo('mother_idx')  # mother of all offspring
ind = pop.individual(0)
mom = pop.ancestor(ind.mother_idx, 1)
print(ind.genotype(0))
print(mom.genotype(0))
print(mom.genotype(1))
Exemple #21
0
def test_generate_operating_population():

    genetic_map = pd.read_csv('nam_prefounders_genetic_map.txt', index_col=None,
                             sep='\t')

    pf_map = shelve.open('pf_map')
    misc_gmap = shelve.open('misc_gmap')
    uniparams = shelve.open('uniparams')

    locus_names = uniparams['locus_names']
    pos_column = uniparams['pos_column']
    allele_names = uniparams['allele_names']
    snp_to_integer = uniparams['snp_to_integer']
    integer_to_snp = uniparams['integer_to_snp']

    alleles = misc_gmap['alleles']
    chr_cM_positions = misc_gmap['chr_cM_positions']
    cM_positions = misc_gmap['cM_positions']
    integral_valued_loci = misc_gmap['integral_valued_loci']
    relative_integral_valued_loci = misc_gmap['relative_integral_valued_loci']
    recombination_rates = misc_gmap['recombination_rates']

    nam = sim.loadPopulation(uniparams['prefounder_file_name'])
    sim.tagID(nam, reset=True)
    nam.setSubPopName('maize_nam_prefounders', 0)

    selection_statistics = {
        'aggregate': {},
        'selected': {},
        'non-selected': {}
    }

    ind_names_for_gwas = {i: {} for i in range(uniparams[
        'number_of_replicates'])}
    uniparams['meta_pop_sample_sizes'] = {i: 100 for i in
                                          range(0, uniparams['generations_of_selection'] + 1, 2)
                                          }

    s = simulate.Truncation(uniparams['generations_of_selection'],
                           uniparams['generations_of_random_mating'],
                           uniparams['operating_population_size'],
                            uniparams[
                                'proportion_of_individuals_saved'],
                           uniparams['overshoot_as_proportion'],
                       uniparams['individuals_per_breeding_subpop'],
                           uniparams['heritability'],
                           uniparams['meta_pop_sample_sizes'],
                           uniparams['number_of_replicates'])

    ind_names_for_gwas = {i: {} for i in range(uniparams[
        'number_of_replicates'])}

    founders = uniparams['founders']
    replicated_nam = sim.Simulator(nam, rep=2, stealPops=False)
    pop = replicated_nam.extract(0)

    assert pop.popSize() == 26, "Population is too large."

    s.generate_f_one(pop, recombination_rates, founders, 100)

    assert pop.popSize() == 400, "Population should have size: {} after the F_1 mating " \
                                               "procedure." \
                                               "".format(len(founders) * 100)

    #pop.splitSubPop(0, [100] * 4)
    #subpop_list = list(range(pop.numSubPop()))

    intmd_os_struct = s.restructure_offspring(pop, 100, 4)
    snd_order = breed.SecondOrderPairIDChooser(intmd_os_struct, 1)

    pop.evolve(
        preOps=[sim.MergeSubPops()],
        matingScheme=sim.HomoMating(
            sim.PyParentsChooser(snd_order.snd_ord_id_pairs),
            sim.OffspringGenerator(ops=[
                sim.IdTagger(),
                sim.ParentsTagger(),
                sim.PedigreeTagger(),
                sim.Recombinator(rates=recombination_rates)
            ],
                numOffspring=1),
            subPopSize=[200],
        ),
        gen=1,
    )

    assert pop.popSize() == 1, "Population does not have correct size after second round of mating."

    second_intmd_os_struct = s.restructure_offspring(pop, 100, 2)
    third_order = breed.SecondOrderPairIDChooser(second_intmd_os_struct, 1)


    pop.evolve(
        preOps=[sim.MergeSubPops()],
        matingScheme=sim.HomoMating(
            sim.PyParentsChooser(third_order.snd_ord_id_pairs),
            sim.OffspringGenerator(ops=[
                sim.IdTagger(),
                sim.ParentsTagger(),
                sim.PedigreeTagger(),
                sim.Recombinator(rates=recombination_rates)
            ],
                numOffspring=1),
            subPopSize=[100],
        ),
        gen=1,
    )

    assert pop.popSize() == 100, "Second merge of breeding sub-populations. Offspring population does not have " \
                                 "correct size"
Exemple #22
0
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(
    initOps=[
        sim.InitSex(),
    ] + init_geno,
Exemple #23
0
        v = Fixed_pop_size2
        #print(geno[0], geno[1], v)
        return v



simu = sim.Simulator(pop1,rep=Replicates)


simu.evolve(
    initOps=[
    ],
    preOps=[

                        ],
    matingScheme=sim.RandomMating(subPopSize=sizeChange,numOffspring=(sim.POISSON_DISTRIBUTION, Offspring_Poisson_dist_mean),ops=sim.Recombinator(loci=[0, 1, 2, 3, 4, 5, 6, 7], rates=[0.095162582,	0.075960076,	0.094257292,	0.154646165,	0.005,	0.104165865,	0.071328306,0.5]))

    ,
    postOps=[
            sim.PySelector(loci=[4], func=sel),
            sim.Stat(alleleFreq=[0,1,2,3,4,5,6,7],numOfMales=True,popSize=True),

            #Output H per replicate per generation to file
            sim.PyEval(r"'%d\t%d\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f\n' % (rep,gen, 1-sum([x*x for x in alleleFreq[0].values()]), 1-sum([x*x for x in alleleFreq[1].values()]), 1-sum([x*x for x in alleleFreq[2].values()]), 1-sum([x*x for x in alleleFreq[3].values()]), 1-sum([x*x for x in alleleFreq[4].values()]), 1-sum([x*x for x in alleleFreq[5].values()]), 1-sum([x*x for x in alleleFreq[6].values()]), 1-sum([x*x for x in alleleFreq[7].values()]))", step=1,reps=(range(0,Replicates,1)),output=Output_file),

            sim.PyExec('from math import log'),

            #sim.Dumper(output='!"./Simulation_output_pops/pop%d.pop"%rep',step=69,max=500,width=3),

            #allelic richness for given locus
            #sim.PyEval(r"'%d\n' % (len(alleleNum[0].keys()))"),
Exemple #24
0
        Fstsample = sample.dvars().F_st
        sample.addInfoFields('order')
        order = list(range(100))
        fstsim = ''
        for rep in range(1000):
            merged = sample
            merged.mergeSubPops()
            np.random.shuffle(order)
            merged.setIndInfo(order, field='order')
            merged.sortIndividuals('order')
            merged.splitSubPop(0, [50] * 2)
            sim.stat(merged, structure=range(10), vars=['F_st'])
            fstsim += '%s\t' % merged.dvars().F_st
        sortie += '%3d\t%.6f\t%3d\t%.6f\t%s\n' % (pop.dvars().gen, Fstpop, a,
                                                  Fstsample, fstsim)
    reccord(sortie, "dataout")
    return True


pop = sim.Population([100000] * 2, loci=[10] * 10, infoFields='migrate_to')

pop.evolve(initOps=[
    sim.InitSex(),
    sim.InitGenotype(freq=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1])
],
           preOps=sim.Migrator(rate=[[0, 0.0001], [0.0001, 0]],
                               mode=sim.BY_PROPORTION),
           matingScheme=sim.RandomMating(ops=sim.Recombinator(rates=0.01)),
           postOps=[sim.PyOperator(func=calcFst, step=50)],
           gen=5000)
Exemple #25
0
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# 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(1000, loci=[1000, 2000], infoFields='ind_id')
pop.evolve(
    initOps=[
        sim.InitSex(),
        sim.IdTagger(),
    ],
    matingScheme=sim.RandomMating(ops=[
        sim.IdTagger(),
        sim.Recombinator(rates=0.001, output='>>rec.log', infoFields='ind_id')
    ]),
    gen=5)
rec = open('rec.log')
# print the first three lines of the log file
print(''.join(rec.readlines()[:4]))
Exemple #26
0
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# 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
simu = sim.Simulator(sim.Population(size=[1000], loci=[100]), rep=2)
simu.evolve(
    initOps=[sim.InitSex(),
             sim.InitGenotype(genotype=[0] * 100 + [1] * 100)],
    matingScheme=sim.RandomMating(ops=[
        sim.Recombinator(rates=0.01, reps=0),
        sim.Recombinator(rates=[0.01] * 10, loci=range(50, 60), reps=1),
    ]),
    postOps=[
        sim.Stat(LD=[[40, 55], [60, 70]]),
        sim.PyEval(
            r'"%d:\t%.3f\t%.3f\t" % (rep, LD_prime[40][55], LD_prime[60][70])'
        ),
        sim.PyOutput('\n', reps=-1)
    ],
    gen=5)
import simuPOP as sim
pop = sim.Population(size=10000, loci=10, lociPos=range(5) + range(10, 15))
pop.evolve(
    initOps=[
        sim.InitSex(),
        sim.InitGenotype(haplotypes=[[0]*10,[1]*10]),
    ],
    matingScheme=sim.RandomMating(ops=sim.Recombinator(intensity=0.0005)),
    postOps=[
        sim.Stat(LD=[[1,2],[4,5],[8,9],[0,9]], step=10),
        sim.PyEval(r"'gen=%d\tLD12=%.3f (%.3f)\tLD45=%.3f (%.3f)\tLD09=%.3f\n'%"
            "(gen, LD[1][2], 0.25*0.9995**(gen+1), LD[4][5],"
            "0.25*0.9975**(gen+1),LD[0][9])", step=10)
    ],
    gen=100
)
pop.evolve(
    initOps=[
        sim.InitSex(),
        sim.IdTagger(),
    ]+init_geno,
    preOps=[
        sim.SNPMutator(u=args.sel_mut_rate, v=args.sel_mut_rate),
        sim.PyMlSelector(FixedFitness(args.selection_coef),
            output=">>"+args.selloci_file),
    ],
    matingScheme=sim.RandomMating(
        ops=[
            sim.IdTagger(),
            sim.Recombinator(intensity=args.recomb_rate,
                output=">>" + args.treefile,
                infoFields="ind_id"),
        ] ),
    postOps=[
        sim.Stat(numOfSegSites=sim.ALL_AVAIL, step=10),
        sim.PyEval(r"'Gen: %2d #seg sites: %d\n' % (gen, numOfSegSites)", step=50)
    ],
    gen = args.generations
)

logfile.write("Done simulating!\n")
logfile.write(time.strftime('%X %x %Z')+"\n")
logfile.write("----------\n")
logfile.flush()

] + 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),
               sim.PyEval(
                   r"'Gen: %2d #seg sites: %d\n' % (gen, numOfSegSites)",
                   step=50)
           ],
           gen=args.generations)

logfile.write("Done simulating!\n")
logfile.write(time.strftime('%X %x %Z') + "\n")
logfile.write("----------\n")
logfile.flush()
number_of_pairs = len(founders)
example_pop.evolve(
    initOps=[
        sim.InitLineage(
            mode=sim.FROM_INFO
        ),  #assigns lineage of each allele to be tracked through pop.evolve
    ],
    preOps=[],
    matingScheme=sim.HomoMating(
        sim.PyParentsChooser(founder_chooser.by_id_pairs),
        sim.OffspringGenerator(
            ops=[
                sim.IdTagger(),
                sim.PedigreeTagger(output='>>pedigree0.ped'
                                   ),  #outputs pedigree file for checking
                sim.Recombinator(rates=recom_map)
            ],
            numOffspring=1),
        subPopSize=[offspring_per_pair * number_of_pairs],
    ),
    gen=1,
)

### Generate Double Hybrids
#Define mothers and fathers, this case is 3 crosses between each pair of hybrid
mothers = np.array([8., 8., 8., 10., 10., 10.])
fathers = np.array([9., 9., 9., 11., 11., 11.])
second_order_chooser = breed.SecondOrderPairIDChooser(
    mothers, fathers
)  #Defines parental pairs, 8 mated with 9 three times,10 mated with 11 three times
example_pop.evolve(