#include "DerevyankoReport.h" #include "individual/Trait.h" #include "individual/Phenotype.h" //#include "population/BreedingStrategies/PopulationBreedingStrategy.h" #include "population/BreedingStrategies/NeutralEvolutionBreedStrat.h" #include #include using std::string; BisexualPopulation* DerevyankoReport::populationFactory(int size, std::string initMtGenome){ BisexualPopulation* ans; std::list males; std::list females; Gene gene1(Gene::Sequence, "mtDna1", initMtGenome); Chromosome chrom1("Mitochondrial chromosome"); chrom1.insertGeneToEnd(gene1); std::vector fGenome; std::vector mGenome; fGenome.push_back(chrom1); mGenome.push_back(chrom1); // Фенотип Trait trait1(Trait::Discrete, "Age", 20); // Пул субстратов InnerSubstratesPool* subPool = 0; // (END) Пул субстратов for(int i = 0; i < size/2; i++){ Genotype* genotype = new Genotype(fGenome, mGenome); Phenotype* phenotype = new Phenotype(trait1); males.push_back(new Individual(genotype, phenotype, subPool, Individual::male, 0)); genotype = new Genotype(fGenome, mGenome); phenotype = new Phenotype(trait1); females.push_back(new Individual(genotype, phenotype, subPool, Individual::female, 0)); } ans = new BisexualPopulation(males,females); return ans; } void DerevyankoReport::reportRFBR2013_01(){ // Митохондриальная ДНК (популяция f) string initMtDNA = "TTCTTTCATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACC"; initMtDNA += "GCTATGTATTTCGTACATTACTGCCAGCCACCATGAATATTGTACGGTACCATAAATACT"; initMtDNA += "TGACCACCTGTAGTACATAAAAACCCAATCCACATCAAAACCCCCCCCTCATGCTTACAA"; initMtDNA += "GCAAGTACAGCAATCAACCTTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCT"; initMtDNA += "CACCCACTAGGATATCAACAAACCTACCCATCCTTAACAGTACATGGTACATAAAGCCAT"; initMtDNA += "TTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCA"; // Мутантная мтДНК (популяция G) string initMtDNA_G = initMtDNA; initMtDNA_G.replace(60,1,"T"); initMtDNA_G.replace(120,1,"A"); initMtDNA_G.replace(180,1,"C"); initMtDNA_G.replace(240,1,"G"); // Генерация стартовых популяций // int basePopSize = 5000; float initBirthRate = 0.25f; float deltaBirthRate = 0.0002f; BisexualPopulation* pop_f = populationFactory(basePopSize, initMtDNA); NeutralEvolutionBreedingStrategy* breedStrat_f = dynamic_cast(PopulationBreedingStrategy::getInstance("neutral")); breedStrat_f->setBirthRate(initBirthRate); breedStrat_f->setDeathRate(initBirthRate-deltaBirthRate); pop_f->setBreedingStrategy(breedStrat_f); BisexualPopulation* pop_G = populationFactory(basePopSize, initMtDNA_G); NeutralEvolutionBreedingStrategy* breedStrat_G = dynamic_cast(PopulationBreedingStrategy::getInstance("neutral")); breedStrat_G->setBirthRate(initBirthRate); breedStrat_G->setDeathRate(initBirthRate-deltaBirthRate); pop_G->setBreedingStrategy(breedStrat_G); /////////////////////////////////////////// // // Эволюционный процесс // /////////////////////////////////////////// unsigned int generation; // Шаг 1. // Вариант 1 int genPerMigr_f_G = 100; float part_f_to_G = 0.01f; float part_G_to_f = 0.01f; std::cout<<"Variant 1"<breedAll(); pop_f->mutationAll(); pop_G->breedAll(); pop_G->mutationAll(); if(generation != 0 && ((generation % genPerMigr_f_G) == 0)){ std::string code = BisexualPopulation::mutualMigration(pop_f, pop_G, part_f_to_G, part_G_to_f); std::cout<<"Migration f<->G\t"<createSubpopulation(fraction_e_founder); std::cout<<"pop_e has been created"<breedAll(); pop_e->mutationAll(); pop_G->breedAll(); pop_G->mutationAll(); } // Шаг 3. // Разделение популяции е на F и d // Далее эволюция 50 поколений // мажорная ветка - это популяция d, ей остаётся 90% популяции float fraction_F_founder = 0.1f; BisexualPopulation* pop_F = pop_e->createSubpopulation(fraction_F_founder); std::cout<<"pop_F has been created"<(PopulationBreedingStrategy::getInstance("neutral")); breedStrat_d->setBirthRate(initBirthRate); breedStrat_d->setDeathRate(initBirthRate-deltaBirthRate*2); pop_d->setBreedingStrategy(breedStrat_d); std::cout<<"pop_e -> pop_d\tPop dynamics coeffs have been changed:\td =\t"; std::cout<<(initBirthRate-deltaBirthRate*2)<breedAll(); pop_d->mutationAll(); pop_F->breedAll(); pop_F->mutationAll(); pop_G->breedAll(); pop_G->mutationAll(); } // Шаг 4. // Разделение популяции d на E и c // Далее эволюция 100 поколений // мажорная ветка - это популяция c, ей остаётся 90% популяции float fraction_E_founder = 0.1f; BisexualPopulation* pop_E = pop_d->createSubpopulation(fraction_E_founder); std::cout<<"pop_E has been created"<(PopulationBreedingStrategy::getInstance("neutral")); breedStrat_c->setBirthRate(initBirthRate); breedStrat_c->setDeathRate(initBirthRate-deltaBirthRate*2.5f); pop_c->setBreedingStrategy(breedStrat_c); std::cout<<"pop_d -> pop_c\tPop dynamics coeffs have been changed:\td =\t"; std::cout<<(initBirthRate-deltaBirthRate*2.5f)<breedAll(); pop_c->mutationAll(); pop_E->breedAll(); pop_E->mutationAll(); pop_F->breedAll(); pop_F->mutationAll(); pop_G->breedAll(); pop_G->mutationAll(); } // Шаг 5. // Разделение популяции c на D и b // Далее эволюция 100 поколений // мажорная ветка - это популяция b, ей остаётся 90% популяции float fraction_D_founder = 0.1f; BisexualPopulation* pop_D = pop_c->createSubpopulation(fraction_D_founder); std::cout<<"pop_D has been created"<(PopulationBreedingStrategy::getInstance("neutral")); breedStrat_b->setBirthRate(initBirthRate); breedStrat_b->setDeathRate(initBirthRate-deltaBirthRate*3.f); pop_b->setBreedingStrategy(breedStrat_b); std::cout<<"pop_c -> pop_b\tPop dynamics coeffs have been changed:\td =\t"; std::cout<<(initBirthRate-deltaBirthRate*3.f)<breedAll(); pop_b->mutationAll(); pop_D->breedAll(); pop_D->mutationAll(); pop_E->breedAll(); pop_E->mutationAll(); pop_F->breedAll(); pop_F->mutationAll(); pop_G->breedAll(); pop_G->mutationAll(); } // Шаг 6. // Разделение популяции b на C и a // Далее эволюция 200 поколений // мажорная ветка - это популяция a, ей остаётся 90% популяции float fraction_C_founder = 0.1f; BisexualPopulation* pop_C = pop_b->createSubpopulation(fraction_C_founder); std::cout<<"pop_C has been created"<(PopulationBreedingStrategy::getInstance("neutral")); breedStrat_a->setBirthRate(initBirthRate); breedStrat_a->setDeathRate(initBirthRate-deltaBirthRate*3.5f); pop_a->setBreedingStrategy(breedStrat_a); std::cout<<"pop_b -> pop_a\tPop dynamics coeffs have been changed:\td =\t"; std::cout<<(initBirthRate-deltaBirthRate*3.5f)<breedAll(); pop_a->mutationAll(); pop_C->breedAll(); pop_C->mutationAll(); pop_D->breedAll(); pop_D->mutationAll(); pop_E->breedAll(); pop_E->mutationAll(); pop_F->breedAll(); pop_F->mutationAll(); pop_G->breedAll(); pop_G->mutationAll(); } // Шаг 7. // Разделение популяции a на A и B // Далее эволюция 2540 поколений // полумажорная ветка - это популяция A, ей остаётся 50% популяции, // но чуть меньшая смертность. // На протяжении эволюции миграции между A и B, а также из A в C, D, E, F (G выводится из эволюции) float fraction_B_founder = 0.5f; BisexualPopulation* pop_B = pop_a->createSubpopulation(fraction_B_founder); std::cout<<"pop_B has been created"<(PopulationBreedingStrategy::getInstance("neutral")); breedStrat_A->setBirthRate(initBirthRate); breedStrat_A->setDeathRate(initBirthRate-deltaBirthRate*4.f); pop_A->setBreedingStrategy(breedStrat_A); std::cout<<"pop_a -> pop_A\tPop dynamics coeffs have been changed:\td =\t"; std::cout<<(initBirthRate-deltaBirthRate*4.f)<breedAll(); pop_A->mutationAll(); pop_B->breedAll(); pop_B->mutationAll(); pop_C->breedAll(); pop_C->mutationAll(); pop_D->breedAll(); pop_D->mutationAll(); pop_E->breedAll(); pop_E->mutationAll(); pop_F->breedAll(); pop_F->mutationAll(); if((generation % genPerMigr_A_B) == 0){ std::string code = BisexualPopulation::mutualMigration(pop_A, pop_B, part_A_to_B, part_B_to_A); std::cout<<"Migration A<->B\t"<C\t"<D\t"<E\t"<F\t"<putGeneticStatisticsToStream(file); file.close(); file.open("GenStatistics.pop_A.txt"); pop_A->putGeneticSimpleStatisticsToStream(file); file.close(); //////////////////////////////////////// file.open("GenStatistics.pop_B.fasta"); pop_B->putGeneticStatisticsToStream(file); file.close(); file.open("GenStatistics.pop_B.txt"); pop_B->putGeneticSimpleStatisticsToStream(file); file.close(); //////////////////////////////////////// //////////////////////////////////////// file.open("GenStatistics.pop_C.fasta"); pop_C->putGeneticStatisticsToStream(file); file.close(); file.open("GenStatistics.pop_C.txt"); pop_C->putGeneticSimpleStatisticsToStream(file); file.close(); //////////////////////////////////////// //////////////////////////////////////// file.open("GenStatistics.pop_D.fasta"); pop_D->putGeneticStatisticsToStream(file); file.close(); file.open("GenStatistics.pop_D.txt"); pop_D->putGeneticSimpleStatisticsToStream(file); file.close(); //////////////////////////////////////// //////////////////////////////////////// file.open("GenStatistics.pop_E.fasta"); pop_E->putGeneticStatisticsToStream(file); file.close(); file.open("GenStatistics.pop_E.txt"); pop_E->putGeneticSimpleStatisticsToStream(file); file.close(); //////////////////////////////////////// //////////////////////////////////////// file.open("GenStatistics.pop_F.fasta"); pop_F->putGeneticStatisticsToStream(file); file.close(); file.open("GenStatistics.pop_F.txt"); pop_F->putGeneticSimpleStatisticsToStream(file); file.close(); //////////////////////////////////////// //////////////////////////////////////// file.open("GenStatistics.pop_G.fasta"); pop_G->putGeneticStatisticsToStream(file); file.close(); file.open("GenStatistics.pop_G.txt"); pop_G->putGeneticSimpleStatisticsToStream(file); file.close(); //////////////////////////////////////// //////////////////////////////////////// file.open("GenStatistics.pop_flittle.fasta"); pop_f->putGeneticStatisticsToStream(file); file.close(); file.open("GenStatistics.pop_flittle.txt"); pop_f->putGeneticSimpleStatisticsToStream(file); file.close(); //////////////////////////////////////// }