|
18 | 18 | //#include "phylokernelmixture.h" |
19 | 19 | #include "modelpomomixture.h" |
20 | 20 | #include "modelgenotype.h" |
| 21 | +#include "modelgenotypeerror.h" |
21 | 22 |
|
22 | 23 | using namespace std; |
23 | 24 |
|
@@ -1059,33 +1060,47 @@ ModelSubst* createModel(string model_str, ModelsBlock *models_block, |
1059 | 1060 |
|
1060 | 1061 | // Parse model for genotypes. |
1061 | 1062 | bool genotype = false; |
1062 | | - string genotype_rate_str = ""; |
1063 | | - string genotype_subrates = ""; |
1064 | 1063 | string model_genotype = ""; |
1065 | 1064 | string::size_type gt_pos = posGENOTYPE(model_str); |
1066 | 1065 | genotype = (gt_pos != string::npos); |
1067 | | - // if the model contains +GT1* -> extract Genotype models |
1068 | | - if (genotype) { |
1069 | | - model_genotype = model_str.substr(gt_pos); |
1070 | | - model_str = model_str.substr(0, gt_pos); |
1071 | | - } |
| 1066 | + |
1072 | 1067 | // sequencing error model |
1073 | 1068 | string seqerr = ""; |
1074 | | - string::size_type spec_pos; |
1075 | | - while ((spec_pos = model_str.find("+E")) != string::npos) { |
1076 | | - string::size_type end_pos = model_str.find_first_of("+*", spec_pos+1); |
1077 | | - if (end_pos == string::npos) { |
1078 | | - seqerr = model_str.substr(spec_pos); |
1079 | | - model_str = model_str.substr(0, spec_pos); |
1080 | | - } else { |
1081 | | - seqerr = model_str.substr(spec_pos, end_pos - spec_pos); |
1082 | | - model_str = model_str.substr(0, spec_pos) + model_str.substr(end_pos); |
| 1069 | + |
| 1070 | + // if the model contains +GT1* -> extract Genotype models and check for +E |
| 1071 | + if (genotype) { |
| 1072 | + model_genotype = model_str.substr(gt_pos); // +GT10+E |
| 1073 | + model_str = model_str.substr(0, gt_pos); // HKY or GTR (case of GT10+E) |
| 1074 | + |
| 1075 | + // Check for genotype model has error model |
| 1076 | + string::size_type e_pos = model_genotype.find("+E"); |
| 1077 | + if (e_pos != string::npos) { |
| 1078 | + string::size_type end_pos = model_genotype.find_first_of("+*", e_pos+1); |
| 1079 | + if (end_pos == string::npos) { |
| 1080 | + seqerr = model_genotype.substr(e_pos); |
| 1081 | + model_genotype = model_genotype.substr(0, e_pos); |
| 1082 | + } else { |
| 1083 | + seqerr = model_genotype.substr(end_pos, end_pos - e_pos); |
| 1084 | + model_genotype = model_genotype.substr(0, e_pos) + model_genotype.substr(end_pos); |
| 1085 | + } |
| 1086 | + } |
| 1087 | + } else { |
| 1088 | + // For non-genotype models (DNA), check for +E in main model string |
| 1089 | + string::size_type spec_pos; |
| 1090 | + while ((spec_pos = model_str.find("+E")) != string::npos) { |
| 1091 | + string::size_type end_pos = model_str.find_first_of("+*", spec_pos+1); |
| 1092 | + if (end_pos == string::npos) { |
| 1093 | + seqerr = model_str.substr(spec_pos); |
| 1094 | + model_str = model_str.substr(0, spec_pos); |
| 1095 | + } else { |
| 1096 | + seqerr = model_str.substr(spec_pos, end_pos - spec_pos); |
| 1097 | + model_str = model_str.substr(0, spec_pos) + model_str.substr(end_pos); |
| 1098 | + } |
1083 | 1099 | } |
1084 | 1100 | } |
1085 | 1101 |
|
1086 | | - |
1087 | | - if (!seqerr.empty() && tree->aln->seq_type != SEQ_DNA) { |
1088 | | - outError("Sequencing error model " + seqerr + " is only supported for DNA"); |
| 1102 | + if (!seqerr.empty() && tree->aln->seq_type != SEQ_DNA && tree->aln->seq_type != SEQ_GENOTYPE) { |
| 1103 | + outError("Sequencing error model " + seqerr + " is only supported for DNA and Genotype"); |
1089 | 1104 | } |
1090 | 1105 | // Now that PoMo/Genotype stuff has been removed, check for model parameters. |
1091 | 1106 | size_t pos = model_str.find(OPEN_BRACKET); |
@@ -1170,10 +1185,11 @@ ModelSubst* createModel(string model_str, ModelsBlock *models_block, |
1170 | 1185 | } else if (tree->aln->seq_type == SEQ_MORPH) { |
1171 | 1186 | model = new ModelMorphology(model_str.c_str(), model_params, freq_type, freq_params, tree); |
1172 | 1187 | } else if (tree->aln->seq_type == SEQ_GENOTYPE) { |
1173 | | - if (genotype_rate_str == "") |
| 1188 | + if (seqerr.empty()) |
1174 | 1189 | model = new ModelGenotype(model_str.c_str(), model_params, freq_type, freq_params, tree); |
1175 | 1190 | else |
1176 | | - outError("Sorry! We have not supported rate heterogeneity model for genotype type."); |
| 1191 | + model = new ModelGenotypeError(model_str.c_str(), model_params, freq_type, freq_params, seqerr, tree); |
| 1192 | + //outError("Sorry! We have not supported rate heterogeneity model for genotype type."); |
1177 | 1193 | } else { |
1178 | 1194 | outError("Unsupported model type"); |
1179 | 1195 | } |
|
0 commit comments