Skip to content

Commit 4e67f9f

Browse files
committed
seqerr also for SEQ_GENOTYPE which leads to ModelGenotypeError and sequencing error model is supported for DNA and Genotypes
1 parent 954e312 commit 4e67f9f

File tree

1 file changed

+37
-21
lines changed

1 file changed

+37
-21
lines changed

model/modelmixture.cpp

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
//#include "phylokernelmixture.h"
1919
#include "modelpomomixture.h"
2020
#include "modelgenotype.h"
21+
#include "modelgenotypeerror.h"
2122

2223
using namespace std;
2324

@@ -1059,33 +1060,47 @@ ModelSubst* createModel(string model_str, ModelsBlock *models_block,
10591060

10601061
// Parse model for genotypes.
10611062
bool genotype = false;
1062-
string genotype_rate_str = "";
1063-
string genotype_subrates = "";
10641063
string model_genotype = "";
10651064
string::size_type gt_pos = posGENOTYPE(model_str);
10661065
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+
10721067
// sequencing error model
10731068
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+
}
10831099
}
10841100
}
10851101

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");
10891104
}
10901105
// Now that PoMo/Genotype stuff has been removed, check for model parameters.
10911106
size_t pos = model_str.find(OPEN_BRACKET);
@@ -1170,10 +1185,11 @@ ModelSubst* createModel(string model_str, ModelsBlock *models_block,
11701185
} else if (tree->aln->seq_type == SEQ_MORPH) {
11711186
model = new ModelMorphology(model_str.c_str(), model_params, freq_type, freq_params, tree);
11721187
} else if (tree->aln->seq_type == SEQ_GENOTYPE) {
1173-
if (genotype_rate_str == "")
1188+
if (seqerr.empty())
11741189
model = new ModelGenotype(model_str.c_str(), model_params, freq_type, freq_params, tree);
11751190
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.");
11771193
} else {
11781194
outError("Unsupported model type");
11791195
}

0 commit comments

Comments
 (0)