]> git.donarmstrong.com Git - mothur.git/commitdiff
weightedcommand
authorwestcott <westcott>
Thu, 26 Feb 2009 14:44:51 +0000 (14:44 +0000)
committerwestcott <westcott>
Thu, 26 Feb 2009 14:44:51 +0000 (14:44 +0000)
12 files changed:
mothur.cpp
parsimony.h
tree.cpp
tree.h
treecalculator.h
treenode.cpp
unifracunweightedcommand.cpp
unifracweightedcommand.cpp
unifracweightedcommand.h
unweighted.h
weighted.cpp
weighted.h

index 3a91aa6e595393111416cf04b367af0a8ca38e6f..5142ca22eabb2d6a3121e6dc2701cb4a04fe9f1f 100644 (file)
@@ -17,7 +17,7 @@ GlobalData* GlobalData::_uniqueInstance = 0;
 
 int main(int argc, char *argv[]){
        try {
-       //      srand(54321);
+               //srand(54321);
                srand( (unsigned)time( NULL ) );
 
                Engine* dotur;
index ebe3d8d89d4ecf2174dc84f8796245a07f4384c9..11d4cc859b2c35295a273780499485ac70e1c052 100644 (file)
@@ -23,6 +23,7 @@ class Parsimony : public TreeCalculator  {
                Parsimony(TreeMap* t) : tmap(t) {};
                ~Parsimony() {};
                EstOutput getValues(Tree*);
+               EstOutput getValues(Tree*, string, string) { return data; };
                
        private:
                GlobalData* globaldata;
index eea3af4dea1f5db04cb689b052fb0177ef03e7f3..2689b037f6a494474ce1e008ba5efb1d250f0791 100644 (file)
--- a/tree.cpp
+++ b/tree.cpp
@@ -309,43 +309,32 @@ void Tree::randomLabels() {
                //set up the groups the user wants to include
                setGroups();
                
-               for(int i=numLeaves-1;i>=0;i--){
-                       if(tree[i].pGroups.size() == 0){
-                               continue;
-                       }
-                       
-                       int escape = 1;
+               for(int i = 0; i < numLeaves; i++){
                        int z;
-               
-                       while(escape == 1){
-                               //get random index to switch with
-                               z = int((float)(i+1) * (float)(rand()) / ((float)RAND_MAX+1.0));        
-                       
-                               if(tree[z].pGroups.size() != 0){
-                                       escape = 0;
-                               }
-                       }
+                       //get random index to switch with
+                       z = int((float)(i+1) * (float)(rand()) / ((float)RAND_MAX+1.0));        
                        
                        //you only want to randomize the nodes that are from a group the user wants analyzed, so
                        //if either of the leaf nodes you are about to switch are not in the users groups then you don't want to switch them.
                        bool treez, treei;
-                       
-                       //leaves have only one group so you can just set it to begin()
-                       it = tree[z].pGroups.begin();
-                       treez = inUsersGroups(it->first, globaldata->Groups);
-                       
-                       it = tree[i].pGroups.begin();
-                       treei = inUsersGroups(it->first, globaldata->Groups);
+               
+                       treez = inUsersGroups(tree[z].getGroup(), globaldata->Groups);
+                       treei = inUsersGroups(tree[i].getGroup(), globaldata->Groups);
                        
                        if ((treez == true) && (treei == true)) {
                                //switches node i and node z's info.
                                map<string,int> lib_hold = tree[z].pGroups;
                                tree[z].pGroups = (tree[i].pGroups);
                                tree[i].pGroups = (lib_hold);
-               
-                               tree[z].setGroup(tree[z].pGroups.begin()->first);
-                               tree[i].setGroup(tree[i].pGroups.begin()->first);
-               
+                               
+                               string zgroup = tree[z].getGroup();
+                               tree[z].setGroup(tree[i].getGroup());
+                               tree[i].setGroup(zgroup);
+                               
+                               string zname = tree[z].getName();
+                               tree[z].setName(tree[i].getName());
+                               tree[i].setName(zname);
+                               
                                map<string,int> gcount_hold = tree[z].pcount;
                                tree[z].pcount = (tree[i].pcount);
                                tree[i].pcount = (gcount_hold);
@@ -363,6 +352,45 @@ void Tree::randomLabels() {
 }
 /**************************************************************************************************/
 
+void Tree::randomLabels(string groupA, string groupB) {
+       try {
+               for(int i = 0; i < numLeaves; i++) {
+                       int z;
+                       //get random index to switch with
+                       z = int((float)(i+1) * (float)(rand()) / ((float)RAND_MAX+1.0));        
+                       
+                       //you only want to randomize the nodes that are from a group the user wants analyzed, so
+                       //if either of the leaf nodes you are about to switch are not in the users groups then you don't want to switch them.
+                       if (((tree[z].getGroup() == groupA) || (tree[z].getGroup() == groupB)) && ((tree[i].getGroup() == groupA) || (tree[i].getGroup() == groupB))) {
+                               //switches node i and node z's info.
+                               map<string,int> lib_hold = tree[z].pGroups;
+                               tree[z].pGroups = (tree[i].pGroups);
+                               tree[i].pGroups = (lib_hold);
+                               
+                               string zgroup = tree[z].getGroup();
+                               tree[z].setGroup(tree[i].getGroup());
+                               tree[i].setGroup(zgroup);
+                               
+                               string zname = tree[z].getName();
+                               tree[z].setName(tree[i].getName());
+                               tree[i].setName(zname);
+                               
+                               map<string,int> gcount_hold = tree[z].pcount;
+                               tree[z].pcount = (tree[i].pcount);
+                               tree[i].pcount = (gcount_hold);
+                       }
+               }
+       }
+       catch(exception& e) {
+               cout << "Standard Error: " << e.what() << " has occurred in the Tree class Function randomLabels. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+       catch(...) {
+               cout << "An unknown error has occurred in the Tree class function randomLabels. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }               
+}
+/**************************************************************************************************/
 void Tree::randomBlengths()  {
        try {
                for(int i=numNodes-1;i>=0;i--){
@@ -387,6 +415,11 @@ void Tree::assembleRandomUnifracTree() {
        randomLabels();
        assembleTree();
 }
+/*************************************************************************************************/
+void Tree::assembleRandomUnifracTree(string groupA, string groupB) {
+       randomLabels(groupA, groupB);
+       assembleTree();
+}
 
 /*************************************************************************************************/
 //for now it's just random topology but may become random labels as well later that why this is such a simple function now...
@@ -439,16 +472,18 @@ void Tree::randomTopology() {
 
 /*****************************************************************/
 // This prints out the tree in Newick form.
-void Tree::createNewickFile() {
+void Tree::createNewickFile(string f) {
        try {
                int root = findRoot();
-               filename = getRootName(globaldata->getTreeFile()) + "newick";
+               //filename = getRootName(globaldata->getTreeFile()) + "newick";
+               filename = f;
                openOutputFile(filename, out);
                
                printBranch(root);
                
                // you are at the end of the tree
                out << ";" << endl;
+               out.close();
        }
        catch(exception& e) {
                cout << "Standard Error: " << e.what() << " has occurred in the Tree class Function createNewickFile. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
@@ -493,7 +528,7 @@ void Tree::printBranch(int node) {
                        printBranch(tree[node].getRChild());
                        out << ")";
                }else { //you are a leaf
-                       tree[node].printNode();  //prints out name and branch length
+                       out << tree[node].getName() << ":" << tree[node].getBranchLength();
                }
                
        }
diff --git a/tree.h b/tree.h
index 6404db784eec791783e609dfc8ff8d8a971c61aa..b0ae873a0b5ac0c5d364e4d6a9cdc3b5a6a877a7 100644 (file)
--- a/tree.h
+++ b/tree.h
@@ -26,7 +26,8 @@ public:
        void getCopy(Tree*);  //makes tree a copy of the one passed in.
        void assembleRandomTree();
        void assembleRandomUnifracTree();
-       void createNewickFile();
+       void assembleRandomUnifracTree(string, string);
+       void createNewickFile(string);
        int getIndex(string);
        void setIndex(string, int);
        int getNumNodes() { return numNodes; }
@@ -51,6 +52,7 @@ private:
        void randomTopology();
        void randomBlengths();
        void randomLabels();
+       void randomLabels(string, string);
        int findRoot();  //return index of root node
        void printBranch(int);  //recursively print out tree
        void setGroups();
index 133330c46d1e0a75529eeb54aa577c9777f8c180..9ee47748d817c9255ab1aaf41dd23918f7d0a980 100644 (file)
@@ -29,6 +29,7 @@ public:
        TreeCalculator(string n) : name(n) {};
        ~TreeCalculator(){};
        virtual EstOutput getValues(Tree*) = 0; 
+       virtual EstOutput getValues(Tree*, string, string) = 0;
        
        virtual string getName()                {       return name;    }
                
index 7fff2c1deae9d687bba9f87229a4d7078cdc861d..cf7192e12e8c0d4e3b435b80e6cdefe8663f471c 100644 (file)
@@ -64,7 +64,8 @@ void Node::printNode() {
                for(it=pcount.begin();it!=pcount.end();it++){
                        cout << ' ' << it->first << ':' << it->second;
                }
-               cout << endl;
+               cout << endl; 
+               
                
        }
        catch(exception& e) {
index e2b085f76a8e951886d668915306667a7de1b5f2..9a1ad0c5c0b548fbedd5f453bffa07cbf3784b6e 100644 (file)
@@ -109,7 +109,6 @@ int UnifracUnweightedCommand::execute() {
                                //get percentage of random trees with that info
                                rscoreFreq[it->first] /= iters; 
                                rcumul-= it->second;  
-                               
                        }
                        
                        //save the signifigance of the users score for printing later
index 4ec2773d38eba93933015d8be8a77b8d078124bc..8fc5b3bcedd56c76200dfcb8889374906c9f28b3 100644 (file)
@@ -18,6 +18,9 @@ UnifracWeightedCommand::UnifracWeightedCommand() {
                tmap = globaldata->gTreemap;
                weightedFile = globaldata->getTreeFile() + ".weighted";
                openOutputFile(weightedFile, out);
+               //column headers
+               out << "Group" << '\t' << "Score" << '\t' << "UserFreq" << '\t' << "UserCumul" << '\t' << "RandFreq" << '\t' << "RandCumul" << endl;
+
                sumFile = globaldata->getTreeFile() + ".wsummary";
                openOutputFile(sumFile, outSum);
                                
@@ -42,111 +45,87 @@ int UnifracWeightedCommand::execute() {
                //get weighted for users tree
                userData.resize(numComp,0);  //data[0] = weightedscore AB, data[1] = weightedscore AC...
                randomData.resize(numComp,0); //data[0] = weightedscore AB, data[1] = weightedscore AC...
-               uscoreFreq.resize(numComp);  
-               validScores.resize(numComp);  
-               totalrscoreFreq.resize(numComp); 
-               uCumul.resize(numComp);         
-               
+                               
                //create new tree with same num nodes and leaves as users
                randT = new Tree();
                
                //get pscores for users trees
                for (int i = 0; i < T.size(); i++) {
-                       rscoreFreq.resize(numComp);  //data[0] = weightedscore AB, data[1] = weightedscore AC...
-                       rCumul.resize(numComp); //data[0] = weightedscore AB, data[1] = weightedscore AC...     
-                               
+                       rScores.resize(numComp);  //data[0] = weightedscore AB, data[1] = weightedscore AC...
+                       uScores.resize(numComp);  //data[0] = weightedscore AB, data[1] = weightedscore AC...
+                       validScores.resize(numComp); 
+                                                       
                        cout << "Processing tree " << i+1 << endl;
                        userData = weighted->getValues(T[i]);  //userData[0] = weightedscore
                        
                        //save users score
                        for (int s=0; s<numComp; s++) {
-                               //update uscoreFreq
-                               it = uscoreFreq[s].find(userData[s]);
-                               if (it == uscoreFreq[s].end()) {//new score
-                                       uscoreFreq[s][userData[s]] = 1;
-                               }else{ uscoreFreq[s][userData[s]]++; }
+                               //add users score to vector of user scores
+                               uScores[s].push_back(userData[s]);
                                
-                               //add user score to valid scores
-                               validScores[s][userData[s]] = userData[s];
+                               //add users score to vector of valid scores
+                               validScores[s].push_back(userData[s]);
 
                                //save users tree score for summary file
                                utreeScores.push_back(userData[s]);
                        }
                        
-                       //copy T[i]'s info.
-                       randT->getCopy(T[i]); 
-                       
                        //get scores for random trees
                        for (int j = 0; j < iters; j++) {
-                               //create a random tree with same topology as T[i], but different labels
-                               randT->assembleRandomUnifracTree();
-                               //get pscore of random tree
-                               randomData = weighted->getValues(randT);
-                               
-                               //save ramdoms score
-                               for (int p=0; p<numComp; p++) {
-                                       //add trees weighted score random score freq
-                                       it2 = rscoreFreq[p].find(randomData[p]);
-                                       if (it2 != rscoreFreq[p].end()) {//already have that score
-                                               rscoreFreq[p][randomData[p]]++;
-                                       }else{//first time we have seen this score
-                                               rscoreFreq[p][randomData[p]] = 1;
+                               int n = 1;
+                               int count = 0;
+                               for (int r=0; r<numGroups; r++) { 
+                                       for (int l = n; l < numGroups; l++) {
+                                               //copy T[i]'s info.
+                                               randT->getCopy(T[i]);
+                                                
+                                               if (globaldata->Groups.size() != 0) {
+                                                       //create a random tree with same topology as T[i], but different labels
+                                                       randT->assembleRandomUnifracTree(globaldata->Groups[r], globaldata->Groups[l]);
+                                                       //get wscore of random tree
+                                                       randomData = weighted->getValues(randT, globaldata->Groups[r], globaldata->Groups[l]);
+                                               }else {
+                                                       //create a random tree with same topology as T[i], but different labels
+                                                       randT->assembleRandomUnifracTree(tmap->namesOfGroups[r], tmap->namesOfGroups[l]);
+                                                       //get wscore of random tree
+                                                       randomData = weighted->getValues(randT, tmap->namesOfGroups[r], tmap->namesOfGroups[l]);
+                                               }
+
+                                               //save scores
+                                               rScores[count].push_back(randomData[0]);
+                                               validScores[count][randomData[0]] = randomData[0];
+                                               count++;
                                        }
-                                       
-                                       //add random score to valid scores
-                                       validScores[p][randomData[p]] = randomData[p];
+                                       n++;
                                }
                        }
-                       
-                       saveRandomScores(); //save all random scores for weighted file
+
+                       removeValidScoresDuplicates(); 
                        
                        //find the signifigance of the score for summary file
-                       for (int t = 0; t < numComp; t++) {
-                               float rcumul = 1.0000;
-                               for (it = validScores[t].begin(); it != validScores[t].end(); it++) { 
-                                       //make rscoreFreq map and rCumul
-                                       it2 = rscoreFreq[t].find(it->first);
-                                       rCumul[t][it->first] = rcumul;
-                                       //get percentage of random trees with that info
-                                       if (it2 != rscoreFreq[t].end()) {  rscoreFreq[t][it->first] /= iters; rcumul-= it2->second;  }
-                                       else { rscoreFreq[t][it->first] = 0.0000; } //no random trees with that score
-                               }
-                       }
-                       
-                       //save the signifigance of the users score for printing later
                        for (int f = 0; f < numComp; f++) {
-                               WScoreSig.push_back(rCumul[f][userData[f]]);
-                       }
+                               //sort random scores
+                               sort(rScores[f].begin(), rScores[f].end());
+                               
+                               //the index of the score higher than yours is returned 
+                               //so if you have 1000 random trees the index returned is 100 
+                               //then there are 900 trees with a score greater then you. 
+                               //giving you a signifigance of 0.900
+                               int index = findIndex(userData[f]);    if (index == -1) { cout << "error in UnifracWeightedCommand" << endl; exit(1); } //error code
                        
+                               //the signifigance is the number of trees with the users score or higher 
+                               WScoreSig.push_back((iters-index)/(float)iters);
+                       }
                        
-                       //clear random data
-                       rscoreFreq.clear();
-                       rCumul.clear();
-               }
-               
-               rCumul.resize(numComp);
-               for (int b = 0; b < numComp; b++) {
-                       float ucumul = 1.0000;
-                       float rcumul = 1.0000;
-                       //this loop fills the cumulative maps and put 0.0000 in the score freq map to make it easier to print.
-                       for (it = validScores[b].begin(); it != validScores[b].end(); it++) { 
-                               it2 = uscoreFreq[b].find(it->first);
-                               //make uCumul map
-                               uCumul[b][it->first] = ucumul;
-                               //user data has that score 
-                               if (it2 != uscoreFreq[b].end()) { uscoreFreq[b][it->first] /= T.size(); ucumul-= it2->second;  }
-                               else { uscoreFreq[b][it->first] = 0.0000; } //no user trees with that score
+                       out << "Tree# " << i << endl;
+                       //printWeightedFile();
                        
-                               //make rscoreFreq map and rCumul
-                               it2 = totalrscoreFreq[b].find(it->first);
-                               rCumul[b][it->first] = rcumul;
-                               //get percentage of random trees with that info
-                               if (it2 != totalrscoreFreq[b].end()) {  totalrscoreFreq[b][it->first] /= (iters * T.size()); rcumul-= it2->second;  }
-                               else { totalrscoreFreq[b][it->first] = 0.0000; } //no random trees with that score
-                                                       }
+                       //clear data
+                       rScores.clear();
+                       uScores.clear();
+                       validScores.clear();
                }
                
-               printWeightedFile();
                printWSummaryFile();
                
                //clear out users groups
@@ -166,21 +145,18 @@ int UnifracWeightedCommand::execute() {
                exit(1);
        }
 }
-/***********************************************************/
+/***********************************************************
 void UnifracWeightedCommand::printWeightedFile() {
        try {
-               //column headers
-               
-               out << "Group" << '\t' << "Score" << '\t' << "UserFreq" << '\t' << "UserCumul" << '\t' << "RandFreq" << '\t' << "RandCumul" << endl;
-                               
+                                               
                //format output
                out.setf(ios::fixed, ios::floatfield); out.setf(ios::showpoint);
                
                //for each group
                for (int e = 0; e < numComp; e++) {
                        //print each line in that group
-                       for (it = validScores[e].begin(); it != validScores[e].end(); it++) { 
-                               out << setprecision(6) <<  groupComb[e] << '\t' << it->first << '\t' << '\t' << uscoreFreq[e][it->first] << '\t' << uCumul[e][it->first] << '\t' << totalrscoreFreq[e][it->first] << '\t' << rCumul[e][it->first] << endl; 
+                       for (i = 0; i < validScores[e].size(); i++) { 
+                               out << setprecision(6) <<  groupComb[e] << '\t' << validScores[e][i] << '\t' << '\t' << uscoreFreq[e][it->first] << '\t' << uCumul[e][it->first] << '\t' << rscoreFreq[e][it->first] << '\t' << rCumul[e][it->first] << endl; 
                        } 
                }
                
@@ -230,28 +206,44 @@ void UnifracWeightedCommand::printWSummaryFile() {
 }
 
 /***********************************************************/
-void UnifracWeightedCommand::saveRandomScores() {
+void UnifracWeightedCommand::removeValidScoresDuplicates() {
        try {
                for (int e = 0; e < numComp; e++) {
-                       //update total map with new random scores
-                       for (it = rscoreFreq[e].begin(); it != rscoreFreq[e].end(); it++) { 
-                               //does this score already exist in the total map
-                               it2 = totalrscoreFreq[e].find(it->first);
-                               //if yes then add them
-                               if (it2 != totalrscoreFreq[e].end()) { 
-                                       totalrscoreFreq[e][it->first] += rscoreFreq[e][it->first];
-                               }else{ //its a new score
-                                       totalrscoreFreq[e][it->first] = rscoreFreq[e][it->first];
-                               }
+                       //sort valid scores
+                       sort(validScores[e].begin(), validScores[e].end());
+                       
+                       for (int i = 0; i< validScores[e].size()-1; i++) { 
+                               if (validScores[e][i] == validScores[e][i+1]) { validScores[e].erase(validScores[e].begin()+i); }
+                       }
+               }
+       }
+       catch(exception& e) {
+               cout << "Standard Error: " << e.what() << " has occurred in the UnifracWeightedCommand class Function removeValidScoresDuplicates. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+       catch(...) {
+               cout << "An unknown error has occurred in the UnifracWeightedCommand class function removeValidScoresDuplicates. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+}
+
+/***********************************************************/
+int UnifracWeightedCommand::findIndex(float score) {
+       try{
+               for (int e = 0; e < numComp; e++) {
+                       for (int i = 0; i < rScores[e].size(); i++) {
+//cout << rScores[e][i] << " number " << i << endl;
+                               if (rScores[e][i] >= score) { return i; }
                        }
                }
+               return -1;
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the UnifracWeightedCommand class Function saveRandomScores. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               cout << "Standard Error: " << e.what() << " has occurred in the UnifracWeightedCommand class Function findIndex. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
                exit(1);
        }
        catch(...) {
-               cout << "An unknown error has occurred in the UnifracWeightedCommand class function saveRandomScores. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               cout << "An unknown error has occurred in the UnifracWeightedCommand class function findIndex. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
                exit(1);
        }
 }
index 9deef732bfe100e27b99fb2e30551de0256e453e..d309566e45b0d58fb2631eeb1a0ad1816907f437 100644 (file)
@@ -38,20 +38,16 @@ class UnifracWeightedCommand : public Command {
                int iters, numGroups, numComp;
                EstOutput userData;                     //weighted score info for user tree
                EstOutput randomData;           //weighted score info for random trees
-               vector< map<float, float> > validScores;  //vector<contains scores from both user and random> each group comb has an entry
-               vector< map<float, float> > rscoreFreq;  //vector<weighted score, number of random trees with that score.> each group comb has an entry
-               vector< map<float, float> > uscoreFreq;  //vector<weighted, number of user trees with that score.> each group comb has an entry
-               vector< map<float, float> > totalrscoreFreq;  //vector<weighted score, number of random trees with that score.> each group comb has an entry
-               vector< map<float, float> > rCumul;  //vector<weighted score, number of random trees with that score or higher.> each group comb has an entry
-               vector< map<float, float> > uCumul;  //vector<weighted, cumulative percentage of number of user trees with that score or higher.> each group comb has an entry
-               map<float, float>::iterator it;
-               map<float, float>::iterator it2;
-               
+               vector< vector<float> > validScores;  //vector<contains scores from both user and random> each group comb has an entry
+               vector< vector<float> > rScores;  //vector<weighted scores for random trees.> each group comb has an entry
+               vector< vector<float> > uScores;  //vector<weighted scores for user trees.> each group comb has an entry
+                                                               
                ofstream outSum, out;
                
                void printWSummaryFile();
-               void printWeightedFile();  
-               void saveRandomScores();
+       //      void printWeightedFile();  
+               void removeValidScoresDuplicates();
+               int findIndex(float);
                void setGroups(); 
 };
 
index b6f225f07392fde58d7afd46536562ee5514b104..b24ad22a318624d8953b3f2e742fdc3e7c80d2ea 100644 (file)
@@ -22,6 +22,7 @@ class Unweighted : public TreeCalculator  {
                Unweighted(TreeMap* t) : tmap(t) {};
                ~Unweighted() {};
                EstOutput getValues(Tree*);
+               EstOutput getValues(Tree*, string, string) { return data; };
                
        private:
                GlobalData* globaldata;
index c43180d53409cf583ce86f3388dc9a8eb709988a..915cf368353dcdbb1617b9d239ce17ff6890450b 100644 (file)
@@ -173,4 +173,97 @@ EstOutput Weighted::getValues(Tree* t) {
 
 }
 
-/**************************************************************************************************/
\ No newline at end of file
+/**************************************************************************************************/
+EstOutput Weighted::getValues(Tree* t, string groupA, string groupB) { 
+ try {
+               globaldata = GlobalData::getInstance();
+               
+               data.clear(); //clear out old values
+               
+               //initialize weighted score
+               WScore[(groupA+groupB)] = 0.0;
+               float D = 0.0;
+               
+                                               
+               /********************************************************/
+               //calculate a D value for the group combo
+               for(int v=0;v<t->getNumLeaves();v++){
+                       int index = v;
+                       double sum = 0.0000;
+               
+                       //while you aren't at root
+                       while(t->tree[index].getParent() != -1){
+                                                       
+                               //if you have a BL
+                               if(t->tree[index].getBranchLength() != -1){
+                                       sum += t->tree[index].getBranchLength();
+                               }
+                               index = t->tree[index].getParent();
+                       }
+                                               
+                       //get last breanch length added
+                       if(t->tree[index].getBranchLength() != -1){
+                               sum += t->tree[index].getBranchLength();
+                       }
+                                               
+                       if ((t->tree[v].getGroup() == groupA) || (t->tree[v].getGroup() == groupB)) {
+                               sum /= (double)tmap->seqsPerGroup[t->tree[v].getGroup()];
+                               D += sum; 
+                       }
+               }
+               /********************************************************/                              
+               
+               //calculate u for the group comb 
+               for(int i=0;i<t->getNumNodes();i++){
+                       double u;
+                       //does this node have descendants from groupA
+                       it = t->tree[i].pcount.find(groupA);
+                       //if it does u = # of its descendants with a certain group / total number in tree with a certain group
+                       if (it != t->tree[i].pcount.end()) {
+                               u = (double) t->tree[i].pcount[groupA] / (double) tmap->seqsPerGroup[groupA];
+                       }else { u = 0.00; }
+               
+                                               
+                       //does this node have descendants from group l
+                       it = t->tree[i].pcount.find(groupB);
+                       //if it does subtract their percentage from u
+                       if (it != t->tree[i].pcount.end()) {
+                               u -= (double) t->tree[i].pcount[groupB] / (double) tmap->seqsPerGroup[groupB];
+                       }
+                                               
+                       u = abs(u) * t->tree[i].getBranchLength();
+                                       
+                       //save groupcombs u value
+                       WScore[(groupA+groupB)] += u;
+               }
+               
+               /********************************************************/
+               
+               //calculate weighted score for the group combination
+               double UN;      
+               UN = (WScore[(groupA+groupB)] / D);
+               
+               if (isnan(UN) || isinf(UN)) { UN = 0; } 
+               data.push_back(UN);
+                               
+               return data; 
+       }
+       catch(exception& e) {
+               cout << "Standard Error: " << e.what() << " has occurred in the Weighted class Function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+       catch(...) {
+               cout << "An unknown error has occurred in the Weighted class function getValues. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+
+}
+
+
+
+
+
+
+
+
+
index 7e4be7c6d0f4ebc95c7d3a224ba3c5e71a4e6d06..41b738b00be222d8f7075af9a0621733c6bcf2fc 100644 (file)
@@ -22,6 +22,7 @@ class Weighted : public TreeCalculator  {
                Weighted(TreeMap* t) : tmap(t) {};
                ~Weighted() {};
                EstOutput getValues(Tree*);
+               EstOutput getValues(Tree*, string, string);
                
        private:
                GlobalData* globaldata;