X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=parsimony.cpp;h=2a673b0cb622bd97b8f91dc4f1c2e9c69de19e8d;hb=692e0c1f69a78b568dc85cbdcea9fb6c189e2e6c;hp=6c184701e2a4d3054ddd8bb74e6d586afee4ccd4;hpb=fb5a52d8d7896ba00c9ccc6add22ed89c5fb2ad7;p=mothur.git diff --git a/parsimony.cpp b/parsimony.cpp index 6c18470..2a673b0 100644 --- a/parsimony.cpp +++ b/parsimony.cpp @@ -12,6 +12,8 @@ /**************************************************************************************************/ EstOutput Parsimony::getValues(Tree* t) { try { + globaldata = GlobalData::getInstance(); + data.resize(1,0); int score = 0; @@ -20,8 +22,42 @@ EstOutput Parsimony::getValues(Tree* t) { int lc = t->tree[i].getLChild(); int rc = t->tree[i].getRChild(); - if(t->tree[i].pGroups.size() > t->tree[rc].pGroups.size() || t->tree[i].pGroups.size() > t->tree[lc].pGroups.size()){ + int iSize = 0; + int rcSize = 0; + int lcSize = 0; + + //add in all the groups the users wanted + for (it = t->tree[i].pGroups.begin(); it != t->tree[i].pGroups.end(); it++) { + if (inUsersGroups(it->first) == true) { iSize++; } + } + + //if that leaves no groups give it 1 so it will cause no change to parent + if (iSize == 0) { iSize++; } + + //add in all the groups the users wanted + for (it = t->tree[rc].pGroups.begin(); it != t->tree[rc].pGroups.end(); it++) { + + if (inUsersGroups(it->first) == true) { rcSize++; } + } + + //if that leaves no groups give it 1 so it will cause no change to parent + if (rcSize == 0) { rcSize++; } + + + //add in all the groups the users wanted + for (it = t->tree[lc].pGroups.begin(); it != t->tree[lc].pGroups.end(); it++) { + + if (inUsersGroups(it->first) == true) { lcSize++; } + } + + //if that leaves no groups give it 1 so it will cause no change to parent + if (lcSize == 0) { lcSize++; } + + + //if you have more groups than either of your kids then theres been a change. + if(iSize > rcSize || iSize > lcSize){ score++; + } } @@ -40,3 +76,21 @@ EstOutput Parsimony::getValues(Tree* t) { } /**************************************************************************************************/ + +bool Parsimony::inUsersGroups(string groupname) { + try { + for (int i = 0; i < globaldata->Groups.size(); i++) { + if (groupname == globaldata->Groups[i]) { return true; } + } + return false; + } + catch(exception& e) { + cout << "Standard Error: " << e.what() << " has occurred in the Parsimony class Function inUsersGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + catch(...) { + cout << "An unknown error has occurred in the Parsimony class function inUsersGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } +} +/**************************************************************************************************/