]> git.donarmstrong.com Git - mothur.git/blobdiff - unweighted.cpp
sped up unifrac unweighted.
[mothur.git] / unweighted.cpp
index b038f388af1c3ef027c66339523ce8bc87b55661..d9b3b586ad7487b0782277955c3ad53e40642851 100644 (file)
@@ -19,9 +19,6 @@ EstOutput Unweighted::getValues(Tree* t) {
                double UniqueBL;  //a branch length is unique if it's chidren are from the same group
                double totalBL; //all branch lengths
                double UW;              //Unweighted Value = UniqueBL / totalBL;
-               map<string, int>::iterator it;  //iterator to traverse pgroups
-               map<string, int> copyIpcount;
-
        
                //if the users enters no groups then give them the score of all groups
                int numGroups = globaldata->Groups.size();
@@ -43,55 +40,30 @@ EstOutput Unweighted::getValues(Tree* t) {
                                UniqueBL=0.0000;  //a branch length is unique if it's chidren are from the same group
                                totalBL = 0.00; //all branch lengths
                                UW = 0.00;              //Unweighted Value = UniqueBL / totalBL;
-                               copyIpcount.clear();
+                               //copyIpcount.clear();
                                
                                //groups in this combo
                                groups.push_back(globaldata->Groups[a]); groups.push_back(globaldata->Groups[l]);
                
-                               for(int i=t->getNumLeaves();i<t->getNumNodes();i++){
-               
-                                       int lc = t->tree[i].getLChild();  //lc = vector index of left child
-                                       int rc = t->tree[i].getRChild();  //rc = vector index of right child
-                       
-                                       /**********************************************************************/
-                                       //This section adds in all lengths that are non leaf
-                       
-                                       copyIpcount = t->tree[i].pcount;
-                                       for (it = copyIpcount.begin(); it != copyIpcount.end(); it++) {
-                                               if (inUsersGroups(it->first, groups) != true) { copyIpcount.erase(it->first);   }
-                                       }
-                       
-                                       //if i's children are from the same group then i's pcount size will be 1 
-                                       //if copyIpcount.size() = 0 they are from a branch that is entirely from a group the user doesn't want
-                                       if (copyIpcount.size() == 0) { }
-                                       else if ((t->tree[i].getBranchLength() != -1) && (copyIpcount.size() == 1)) {  UniqueBL += t->tree[i].getBranchLength();        }
-                       
-                                       //add i's BL to total if it is from the groups the user wants
-                                       if ((t->tree[i].getBranchLength() != -1) && (copyIpcount.size() != 0)) {  
-                                               totalBL += t->tree[i].getBranchLength(); 
-                                       }
-                       
-                                       /**********************************************************************/
-                                       //This section adds in all lengths that are leaf
-                       
-                                       //if i's chidren are leaves
-                                       if (t->tree[rc].getRChild() == -1) {
-                                               //if rc is a valid group and rc has a BL
-                                               if ((inUsersGroups(t->tree[rc].getGroup(), groups) == true) && (t->tree[rc].getBranchLength() != -1)) {
-                                                       UniqueBL += t->tree[rc].getBranchLength();
-                                                       totalBL += t->tree[rc].getBranchLength(); 
-                                               }
+                               for(int i=0;i<t->getNumNodes();i++){
+                                       if (m->control_pressed) {  return data; }
+       
+                                       //pcountSize = 0, they are from a branch that is entirely from a group the user doesn't want
+                                       //pcountSize = 2, not unique to one group
+                                       //pcountSize = 1, unique to one group
+                                       
+                                       int pcountSize = 0;
+                                       for (int j = 0; j < groups.size(); j++) {
+                                               map<string, int>::iterator itGroup = t->tree[i].pcount.find(groups[j]);
+                                               if (itGroup != t->tree[i].pcount.end()) { pcountSize++; if (pcountSize > 1) { break; } } 
                                        }
+                                       
+                                       if (pcountSize == 0) { }
+                                       else if ((t->tree[i].getBranchLength() != -1) && (pcountSize == 1)) {  UniqueBL += abs(t->tree[i].getBranchLength());   }
                        
-                                       if (t->tree[lc].getLChild() == -1) {
-                                               //if lc is a valid group and lc has a BL
-                                               if ((inUsersGroups(t->tree[lc].getGroup(), groups) == true) && (t->tree[lc].getBranchLength() != -1)) {
-                                                       UniqueBL += t->tree[lc].getBranchLength();
-                                                       totalBL += t->tree[lc].getBranchLength(); 
-                                               }
+                                       if ((t->tree[i].getBranchLength() != -1) && (pcountSize != 0)) {  
+                                               totalBL += abs(t->tree[i].getBranchLength()); 
                                        }
-                       
-                                       /**********************************************************************/
                                }
                
                                UW = (UniqueBL / totalBL);  
@@ -109,7 +81,9 @@ EstOutput Unweighted::getValues(Tree* t) {
                        if (numGroups == 0) {
                                //get score for all users groups
                                for (int i = 0; i < tmap->namesOfGroups.size(); i++) {
-                                       groups.push_back(tmap->namesOfGroups[i]);
+                                       if (tmap->namesOfGroups[i] != "xxx") {
+                                               groups.push_back(tmap->namesOfGroups[i]);
+                                       }
                                }
                        }else {
                                for (int i = 0; i < globaldata->Groups.size(); i++) {
@@ -120,52 +94,27 @@ EstOutput Unweighted::getValues(Tree* t) {
                        UniqueBL=0.0000;  //a branch length is unique if it's chidren are from the same group
                        totalBL = 0.00; //all branch lengths
                        UW = 0.00;              //Unweighted Value = UniqueBL / totalBL;
-                       copyIpcount.clear();
                                
-                       for(int i=t->getNumLeaves();i<t->getNumNodes();i++){
-               
-                               int lc = t->tree[i].getLChild();  //lc = vector index of left child
-                               int rc = t->tree[i].getRChild();  //rc = vector index of right child
-                       
-                               /**********************************************************************/
-                               //This section adds in all lengths that are non leaf
-                       
-                               copyIpcount = t->tree[i].pcount;
-                               for (it = copyIpcount.begin(); it != copyIpcount.end(); it++) {
-                                       if (inUsersGroups(it->first, groups) != true) { copyIpcount.erase(it->first);   }
-                               }
-                       
-                               //if i's children are from the same group then i's pcount size will be 1 
-                               //if copyIpcount.size() = 0 they are from a branch that is entirely from a group the user doesn't want
-                               if (copyIpcount.size() == 0) { }
-                               else if ((t->tree[i].getBranchLength() != -1) && (copyIpcount.size() == 1)) {  UniqueBL += t->tree[i].getBranchLength();        }
-                       
-                               //add i's BL to total if it is from the groups the user wants
-                               if ((t->tree[i].getBranchLength() != -1) && (copyIpcount.size() != 0)) {  
-                                       totalBL += t->tree[i].getBranchLength(); 
-                               }
-                       
-                               /**********************************************************************/
-                               //This section adds in all lengths that are leaf
+                       for(int i=0;i<t->getNumNodes();i++){
                        
-                               //if i's chidren are leaves
-                               if (t->tree[rc].getRChild() == -1) {
-                                       //if rc is a valid group and rc has a BL
-                                       if ((inUsersGroups(t->tree[rc].getGroup(), groups) == true) && (t->tree[rc].getBranchLength() != -1)) {
-                                               UniqueBL += t->tree[rc].getBranchLength();
-                                               totalBL += t->tree[rc].getBranchLength(); 
-                                       }
+                               if (m->control_pressed) {  return data; }
+                               
+                               //pcountSize = 0, they are from a branch that is entirely from a group the user doesn't want
+                               //pcountSize = 2, not unique to one group
+                               //pcountSize = 1, unique to one group
+                               
+                               int pcountSize = 0;
+                               for (int j = 0; j < groups.size(); j++) {
+                                       map<string, int>::iterator itGroup = t->tree[i].pcount.find(groups[j]);
+                                       if (itGroup != t->tree[i].pcount.end()) { pcountSize++; if (pcountSize > 1) { break; } } 
                                }
-                       
-                               if (t->tree[lc].getLChild() == -1) {
-                                       //if lc is a valid group and lc has a BL
-                                       if ((inUsersGroups(t->tree[lc].getGroup(), groups) == true) && (t->tree[lc].getBranchLength() != -1)) {
-                                               UniqueBL += t->tree[lc].getBranchLength();
-                                               totalBL += t->tree[lc].getBranchLength(); 
-                                       }
+                               
+                               if (pcountSize == 0) { }
+                               else if ((t->tree[i].getBranchLength() != -1) && (pcountSize == 1)) {  UniqueBL += abs(t->tree[i].getBranchLength());   }
+                                       
+                               if ((t->tree[i].getBranchLength() != -1) && (pcountSize != 0)) {  
+                                       totalBL += abs(t->tree[i].getBranchLength()); 
                                }
-                       
-                               /**********************************************************************/
                        }
                
                        UW = (UniqueBL / totalBL);  
@@ -179,14 +128,9 @@ EstOutput Unweighted::getValues(Tree* t) {
        
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the Unweighted class Function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "Unweighted", "getValues");
                exit(1);
        }
-       catch(...) {
-               cout << "An unknown error has occurred in the Unweighted class function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-
 }
 
 /**************************************************************************************************/
@@ -199,13 +143,11 @@ EstOutput Unweighted::getValues(Tree* t, string groupA, string groupB) {
                double UniqueBL;  //a branch length is unique if it's chidren are from the same group
                double totalBL; //all branch lengths
                double UW;              //Unweighted Value = UniqueBL / totalBL;
-               map<string, int>::iterator it;  //iterator to traverse pgroups
-               map<string, int> copyIpcount;
                copyTree = new Tree;
 
                //if the users enters no groups then give them the score of all groups
                int numGroups = globaldata->Groups.size();
-               
+
                //calculate number of comparsions
                int numComp = 0;
                for (int r=0; r<numGroups; r++) { 
@@ -223,63 +165,41 @@ EstOutput Unweighted::getValues(Tree* t, string groupA, string groupB) {
                                UniqueBL=0.0000;  //a branch length is unique if it's chidren are from the same group
                                totalBL = 0.00; //all branch lengths
                                UW = 0.00;              //Unweighted Value = UniqueBL / totalBL;
-                               copyIpcount.clear();
                                
                                //copy random tree passed in
                                copyTree->getCopy(t);
+                                                               
+                               //groups in this combo
+                               groups.push_back(globaldata->Groups[a]); groups.push_back(globaldata->Groups[l]);
                                
                                //swap labels in the groups you want to compare
-                               copyTree->assembleRandomUnifracTree(globaldata->Groups[a], globaldata->Groups[l]);
+                               copyTree->assembleRandomUnifracTree(groups[0], groups[1]);
                                
-                               //groups in this combo
-                               groups.push_back(globaldata->Groups[a]); groups.push_back(globaldata->Groups[l]);
-               
-                               for(int i=t->getNumLeaves();i<t->getNumNodes();i++){
-               
-                                       int lc = t->tree[i].getLChild();  //lc = vector index of left child
-                                       int rc = t->tree[i].getRChild();  //rc = vector index of right child
-                       
-                                       /**********************************************************************/
-                                       //This section adds in all lengths that are non leaf
-                       
-                                       copyIpcount = t->tree[i].pcount;
-                                       for (it = copyIpcount.begin(); it != copyIpcount.end(); it++) {
-                                               if (inUsersGroups(it->first, groups) != true) { copyIpcount.erase(it->first);   }
-                                       }
-                       
-                                       //if i's children are from the same group then i's pcount size will be 1 
-                                       //if copyIpcount.size() = 0 they are from a branch that is entirely from a group the user doesn't want
-                                       if (copyIpcount.size() == 0) { }
-                                       else if ((t->tree[i].getBranchLength() != -1) && (copyIpcount.size() == 1)) {  UniqueBL += t->tree[i].getBranchLength();        }
-                       
-                                       //add i's BL to total if it is from the groups the user wants
-                                       if ((t->tree[i].getBranchLength() != -1) && (copyIpcount.size() != 0)) {  
-                                               totalBL += t->tree[i].getBranchLength(); 
+                               if (m->control_pressed) { delete copyTree; return data; }
+                               
+                               for(int i=0;i<copyTree->getNumNodes();i++){
+                       
+                                       if (m->control_pressed) {  return data; }
+                                       
+                                       //pcountSize = 0, they are from a branch that is entirely from a group the user doesn't want
+                                       //pcountSize = 2, not unique to one group
+                                       //pcountSize = 1, unique to one group
+                                       
+                                       int pcountSize = 0;
+                                       for (int j = 0; j < groups.size(); j++) {
+                                               map<string, int>::iterator itGroup = copyTree->tree[i].pcount.find(groups[j]);
+                                               if (itGroup != copyTree->tree[i].pcount.end()) { pcountSize++; if (pcountSize > 1) { break; } } 
                                        }
-                       
-                                       /**********************************************************************/
-                                       //This section adds in all lengths that are leaf
-                       
-                                       //if i's chidren are leaves
-                                       if (t->tree[rc].getRChild() == -1) {
-                                               //if rc is a valid group and rc has a BL
-                                               if ((inUsersGroups(t->tree[rc].getGroup(), groups) == true) && (t->tree[rc].getBranchLength() != -1)) {
-                                                       UniqueBL += t->tree[rc].getBranchLength();
-                                                       totalBL += t->tree[rc].getBranchLength(); 
-                                               }
+                                       
+                                       if (pcountSize == 0) { }
+                                       else if ((copyTree->tree[i].getBranchLength() != -1) && (pcountSize == 1)) {  UniqueBL += abs(copyTree->tree[i].getBranchLength());     }
+                                               
+                                       if ((copyTree->tree[i].getBranchLength() != -1) && (pcountSize != 0)) {  
+                                               totalBL += abs(copyTree->tree[i].getBranchLength()); 
                                        }
-                       
-                                       if (t->tree[lc].getLChild() == -1) {
-                                               //if lc is a valid group and lc has a BL
-                                               if ((inUsersGroups(t->tree[lc].getGroup(), groups) == true) && (t->tree[lc].getBranchLength() != -1)) {
-                                                       UniqueBL += t->tree[lc].getBranchLength();
-                                                       totalBL += t->tree[lc].getBranchLength(); 
-                                               }
-                                       }
-                       
-                                       /**********************************************************************/
                                }
-               
+
+                               
                                UW = (UniqueBL / totalBL);  
        
                                if (isnan(UW) || isinf(UW)) { UW = 0; }
@@ -295,7 +215,9 @@ EstOutput Unweighted::getValues(Tree* t, string groupA, string groupB) {
                        if (numGroups == 0) {
                                //get score for all users groups
                                for (int i = 0; i < tmap->namesOfGroups.size(); i++) {
-                                       groups.push_back(tmap->namesOfGroups[i]);
+                                       if (tmap->namesOfGroups[i] != "xxx") {
+                                               groups.push_back(tmap->namesOfGroups[i]);
+                                       }
                                }
                        }else {
                                for (int i = 0; i < globaldata->Groups.size(); i++) {
@@ -306,58 +228,35 @@ EstOutput Unweighted::getValues(Tree* t, string groupA, string groupB) {
                        UniqueBL=0.0000;  //a branch length is unique if it's chidren are from the same group
                        totalBL = 0.00; //all branch lengths
                        UW = 0.00;              //Unweighted Value = UniqueBL / totalBL;
-                       copyIpcount.clear();
                
                        //copy random tree passed in
                        copyTree->getCopy(t);
                                
                        //swap labels in all the groups you want to compare
-                       copyTree->assembleRandomUnifracTree();
-
-                       for(int i=t->getNumLeaves();i<t->getNumNodes();i++){
-               
-                               int lc = t->tree[i].getLChild();  //lc = vector index of left child
-                               int rc = t->tree[i].getRChild();  //rc = vector index of right child
-                       
-                               /**********************************************************************/
-                               //This section adds in all lengths that are non leaf
+                       copyTree->assembleRandomUnifracTree(groups);
                        
-                               copyIpcount = t->tree[i].pcount;
-                               for (it = copyIpcount.begin(); it != copyIpcount.end(); it++) {
-                                       if (inUsersGroups(it->first, groups) != true) { copyIpcount.erase(it->first);   }
-                               }
-                       
-                               //if i's children are from the same group then i's pcount size will be 1 
-                               //if copyIpcount.size() = 0 they are from a branch that is entirely from a group the user doesn't want
-                               if (copyIpcount.size() == 0) { }
-                               else if ((t->tree[i].getBranchLength() != -1) && (copyIpcount.size() == 1)) {  UniqueBL += t->tree[i].getBranchLength();        }
-                       
-                               //add i's BL to total if it is from the groups the user wants
-                               if ((t->tree[i].getBranchLength() != -1) && (copyIpcount.size() != 0)) {  
-                                       totalBL += t->tree[i].getBranchLength(); 
-                               }
-                       
-                               /**********************************************************************/
-                               //This section adds in all lengths that are leaf
+                       if (m->control_pressed) { delete copyTree; return data; }
+
+                       for(int i=0;i<copyTree->getNumNodes();i++){
                        
-                               //if i's chidren are leaves
-                               if (t->tree[rc].getRChild() == -1) {
-                                       //if rc is a valid group and rc has a BL
-                                       if ((inUsersGroups(t->tree[rc].getGroup(), groups) == true) && (t->tree[rc].getBranchLength() != -1)) {
-                                               UniqueBL += t->tree[rc].getBranchLength();
-                                               totalBL += t->tree[rc].getBranchLength(); 
-                                       }
+                               if (m->control_pressed) {  return data; }
+                               
+                               //pcountSize = 0, they are from a branch that is entirely from a group the user doesn't want
+                               //pcountSize = 2, not unique to one group
+                               //pcountSize = 1, unique to one group
+                               
+                               int pcountSize = 0;
+                               for (int j = 0; j < groups.size(); j++) {
+                                       map<string, int>::iterator itGroup = copyTree->tree[i].pcount.find(groups[j]);
+                                       if (itGroup != copyTree->tree[i].pcount.end()) { pcountSize++; if (pcountSize > 1) { break; } } 
                                }
-                       
-                               if (t->tree[lc].getLChild() == -1) {
-                                       //if lc is a valid group and lc has a BL
-                                       if ((inUsersGroups(t->tree[lc].getGroup(), groups) == true) && (t->tree[lc].getBranchLength() != -1)) {
-                                               UniqueBL += t->tree[lc].getBranchLength();
-                                               totalBL += t->tree[lc].getBranchLength(); 
-                                       }
+                               
+                               if (pcountSize == 0) { }
+                               else if ((copyTree->tree[i].getBranchLength() != -1) && (pcountSize == 1)) {  UniqueBL += abs(copyTree->tree[i].getBranchLength());     }
+                                       
+                               if ((copyTree->tree[i].getBranchLength() != -1) && (pcountSize != 0)) {  
+                                       totalBL += abs(copyTree->tree[i].getBranchLength()); 
                                }
-                       
-                               /**********************************************************************/
                        }
                
                        UW = (UniqueBL / totalBL);  
@@ -366,16 +265,14 @@ EstOutput Unweighted::getValues(Tree* t, string groupA, string groupB) {
        
                        data[count] = UW;
                }
-
+               
+               delete copyTree;
+               
                return data;
        
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the Unweighted class Function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the Unweighted class function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               m->errorOut(e, "Unweighted", "getValues");
                exit(1);
        }
 }