diff --git a/src/libaevol/7/DnaMutator.cpp b/src/libaevol/7/DnaMutator.cpp index d8ae17647eb72903d473480b82a3d2bfcf8130f8..20917ac0840be7a08958f9879775f0b1d093d3fe 100644 --- a/src/libaevol/7/DnaMutator.cpp +++ b/src/libaevol/7/DnaMutator.cpp @@ -165,9 +165,14 @@ MutationEvent* DnaMutator::generate_next_mutation(int32_t length) { if (pos_1 < pos_2) { seqlen = pos_2 - pos_1; } else { - int32_t tmp1_len = length_ - pos_1; - int32_t tmp2_len = pos_2; - seqlen = tmp1_len + tmp2_len; + #ifdef __EUKARYOTE + Utils::exchange(pos_1, pos_2); + seqlen = pos_2 - pos_1; + #else + int32_t tmp1_len = length_ - pos_1; + int32_t tmp2_len = pos_2; + seqlen = tmp1_len + tmp2_len; + #endif } int32_t genome_size_after = length_ + seqlen; @@ -206,8 +211,13 @@ MutationEvent* DnaMutator::generate_next_mutation(int32_t length) { if (pos_1 < pos_2) { genome_size_after = length_ - (pos_2 - pos_1); } else { + #ifdef __EUKARYOTE + Utils::exchange(pos_1, pos_2); + genome_size_after = length_ - (pos_2 - pos_1); + #else genome_size_after = length_ - (length_ - pos_1); genome_size_after = genome_size_after - pos_2; + #endif } // printf("Remove %d %d : LB %d LA %d\n",pos_1,pos_2,length_,genome_size_after); @@ -226,6 +236,9 @@ MutationEvent* DnaMutator::generate_next_mutation(int32_t length) { } else if (random_value < nb_large_dupl_ + nb_large_del_ + nb_large_trans_) { + #ifdef __EUKARYOTE + std::cout << "Warning : performing a translocation with a eukaryotic individual"<<std::endl; + #endif nb_large_trans_--; if (length_ == 1) @@ -292,6 +305,7 @@ MutationEvent* DnaMutator::generate_next_mutation(int32_t length) { // if (pos_1 == pos_2) return nullptr; // Invert everything <=> Invert nothing! // Invert the segment that don't contain OriC + // Convenient for prokaryotes, absolutely necessary for eukaryotes if (pos_1 > pos_2) Utils::exchange(pos_1, pos_2); mevent = new MutationEvent(); @@ -374,6 +388,12 @@ MutationEvent* DnaMutator::generate_next_mutation(int32_t length) { if (length_ - nb_pos_to_del < min_genome_length_) return nullptr; + + #ifdef __EUKARYOTE + if (pos + nb_pos_to_del > length_){ + nb_pos_to_del = length_ - pos; // Doing the maximal possible deletion + } + #endif length_ = length_ - nb_pos_to_del;