]> git.donarmstrong.com Git - mothur.git/blobdiff - parsimony.cpp
parsimony command now uses groups, fixed bug with unweighted groups
[mothur.git] / parsimony.cpp
index 6c184701e2a4d3054ddd8bb74e6d586afee4ccd4..2a673b0cb622bd97b8f91dc4f1c2e9c69de19e8d 100644 (file)
@@ -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);
+       }
+}
+/**************************************************************************************************/