]> git.donarmstrong.com Git - mothur.git/blobdiff - tree.cpp
added tree reader class to handle reading trees. Reworked the tree map to tree class...
[mothur.git] / tree.cpp
index 432811ecaabf1e50161061e291985ca080ed7773..7c9671bf9a91e02b23cfd40b44804c38e3e4354d 100644 (file)
--- a/tree.cpp
+++ b/tree.cpp
@@ -16,7 +16,7 @@ Tree::Tree(int num, TreeMap* t) : tmap(t) {
                
                numLeaves = num;  
                numNodes = 2*numLeaves - 1;
-               
+        
                tree.resize(numNodes);
        }
        catch(exception& e) {
@@ -28,9 +28,6 @@ Tree::Tree(int num, TreeMap* t) : tmap(t) {
 Tree::Tree(string g) { //do not use tree generated by this its just to extract the treenames, its a chicken before the egg thing that needs to be revisited.
        try {
                m = MothurOut::getInstance();
-               
-               tmap = NULL;
-               
                parseTreeFile();  m->runParse = false;  
        }
        catch(exception& e) {
@@ -196,7 +193,8 @@ Tree::Tree(TreeMap* t, vector< vector<double> >& sims) : tmap(t) {
                //adjust tree to make sure root to tip length is .5
                int root = findRoot();
                tree[root].setBranchLength((0.5 - tree[root].getLengthToLeaves()));
-       }
+        
+    }
        catch(exception& e) {
                m->errorOut(e, "Tree", "Tree");
                exit(1);
@@ -329,12 +327,13 @@ void Tree::setIndex(string searchName, int index) {
        }
 }
 /*****************************************************************/
-int Tree::assembleTree() {
+int Tree::assembleTree(map<string, string> nameMap) {
        try {
-               //float A = clock();
+               //save for later
+        names = nameMap;
 
                //if user has given a names file we want to include that info in the pgroups and pcount info.
-               if(m->names.size() != 0) {  addNamesToCounts(m->names);  }
+               if(nameMap.size() != 0) {  addNamesToCounts(nameMap);  }
                
                //build the pGroups in non leaf nodes to be used in the parsimony calcs.
                for (int i = numLeaves; i < numNodes; i++) {
@@ -343,8 +342,7 @@ int Tree::assembleTree() {
                        tree[i].pGroups = (mergeGroups(i));
                        tree[i].pcount = (mergeGcounts(i));
                }
-               //float B = clock();
-               //cout << "assembleTree\t" << (B-A) / CLOCKS_PER_SEC << endl;
+               
                return 0;
        }
        catch(exception& e) {
@@ -352,7 +350,7 @@ int Tree::assembleTree() {
                exit(1);
        }
 }
-/*****************************************************************/
+/*****************************************************************
 int Tree::assembleTree(string n) {
        try {
                
@@ -380,7 +378,8 @@ void Tree::getSubTree(Tree* Ctree, vector<string> Groups) {
         //copy Tree since we are going to destroy it
         Tree* copy = new Tree(tmap);
         copy->getCopy(Ctree);
-        copy->assembleTree("nonames");
+        map<string, string> empty;
+        copy->assembleTree(empty);
         
                //we want to select some of the leaf nodes to create the output tree
                //go through the input Tree starting at parents of leaves
@@ -840,21 +839,23 @@ void Tree::randomBlengths()  {
 /*************************************************************************************************/
 void Tree::assembleRandomUnifracTree(vector<string> g) {
        randomLabels(g);
-       assembleTree("noNameCounts");
+    map<string, string> empty;
+       assembleTree(empty);
 }
 /*************************************************************************************************/
 void Tree::assembleRandomUnifracTree(string groupA, string groupB) {
-
        vector<string> temp; temp.push_back(groupA); temp.push_back(groupB);
        randomLabels(temp);
-       assembleTree("noNameCounts");
+    map<string, string> empty;
+       assembleTree(empty);
 }
 
 /*************************************************************************************************/
 //for now it's just random topology but may become random labels as well later that why this is such a simple function now...
 void Tree::assembleRandomTree() {
        randomTopology();
-       assembleTree();
+    map<string, string> empty;
+       assembleTree(empty);
 }
 /**************************************************************************************************/
 
@@ -907,6 +908,18 @@ void Tree::print(ostream& out) {
        }
 }
 /*****************************************************************/
+void Tree::print(ostream& out, map<string, string> nameMap) {
+       try {
+               int root = findRoot();
+               printBranch(root, out, nameMap);
+               out << ";" << endl;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "Tree", "print");
+               exit(1);
+       }
+}
+/*****************************************************************/
 void Tree::print(ostream& out, string mode) {
        try {
                int root = findRoot();
@@ -959,10 +972,82 @@ int Tree::findRoot() {
        }
 }
 /*****************************************************************/
-void Tree::printBranch(int node, ostream& out, string mode) {
+void Tree::printBranch(int node, ostream& out, map<string, string> names) {
 try {
 
 // you are not a leaf
+               if (tree[node].getLChild() != -1) {
+                       out << "(";
+                       printBranch(tree[node].getLChild(), out, names);
+                       out << ",";
+                       printBranch(tree[node].getRChild(), out, names);
+                       out << ")";
+                       
+            //if there is a branch length then print it
+            if (tree[node].getBranchLength() != -1) {
+                out << ":" << tree[node].getBranchLength();
+            }
+                       
+               }else { //you are a leaf
+            map<string, string>::iterator itNames = names.find(tree[node].getName());
+            
+            string outputString = "";
+            if (itNames != names.end()) { 
+                
+                vector<string> dupNames;
+                m->splitAtComma((itNames->second), dupNames);
+                
+                if (dupNames.size() == 1) {
+                    outputString += tree[node].getName();
+                    if (tree[node].getBranchLength() != -1) {
+                        outputString += ":" + toString(tree[node].getBranchLength());
+                    }
+                }else {
+                    outputString += "(";
+                    
+                    for (int u = 0; u < dupNames.size()-1; u++) {
+                        outputString += dupNames[u];
+                        
+                        if (tree[node].getBranchLength() != -1) {
+                            outputString += ":" + toString(0.0);
+                        }
+                        outputString += ",";
+                    }
+                    
+                    outputString += dupNames[dupNames.size()-1];
+                    if (tree[node].getBranchLength() != -1) {
+                        outputString += ":" + toString(0.0);
+                    }
+                    
+                    outputString += ")";
+                    if (tree[node].getBranchLength() != -1) {
+                        outputString += ":" + toString(tree[node].getBranchLength());
+                    }
+                }
+            }else { 
+                outputString = tree[node].getName();
+                //if there is a branch length then print it
+                if (tree[node].getBranchLength() != -1) {
+                    outputString += ":" + toString(tree[node].getBranchLength());
+                }
+                
+                m->mothurOut("[ERROR]: " + tree[node].getName() + " is not in your namefile, please correct."); m->mothurOutEndLine(); 
+            }
+                
+            out << outputString;
+               }
+               
+       }
+       catch(exception& e) {
+               m->errorOut(e, "Tree", "printBranch");
+               exit(1);
+       }
+}
+/*****************************************************************/
+void Tree::printBranch(int node, ostream& out, string mode) {
+    try {
+        
+        // you are not a leaf
                if (tree[node].getLChild() != -1) {
                        out << "(";
                        printBranch(tree[node].getLChild(), out, mode);
@@ -987,11 +1072,6 @@ try {
                                if (tree[node].getBranchLength() != -1) {
                                        out << ":" << tree[node].getBranchLength();
                                }
-                       }else if (mode == "deunique") {
-                               //if there is a branch length then print it
-                               if (tree[node].getBranchLength() != -1) {
-                                       out << ":" << tree[node].getBranchLength();
-                               }
                        }
                }else { //you are a leaf
                        string leafGroup = tmap->getGroup(tree[node].getName());
@@ -1017,53 +1097,6 @@ try {
                                if (tree[node].getBranchLength() != -1) {
                                        out << ":" << tree[node].getBranchLength();
                                }
-                       }else if (mode == "deunique") {
-                               map<string, string>::iterator itNames = m->names.find(tree[node].getName());
-                               
-                               string outputString = "";
-                               if (itNames != m->names.end()) { 
-                                       
-                                       vector<string> dupNames;
-                                       m->splitAtComma((itNames->second), dupNames);
-                                       
-                                       if (dupNames.size() == 1) {
-                                               outputString += tree[node].getName();
-                                               if (tree[node].getBranchLength() != -1) {
-                                                       outputString += ":" + toString(tree[node].getBranchLength());
-                                               }
-                                       }else {
-                                               outputString += "(";
-                                               
-                                               for (int u = 0; u < dupNames.size()-1; u++) {
-                                                       outputString += dupNames[u];
-                                                       
-                                                       if (tree[node].getBranchLength() != -1) {
-                                                               outputString += ":" + toString(0.0);
-                                                       }
-                                                       outputString += ",";
-                                               }
-                                               
-                                               outputString += dupNames[dupNames.size()-1];
-                                               if (tree[node].getBranchLength() != -1) {
-                                                       outputString += ":" + toString(0.0);
-                                               }
-                                               
-                                               outputString += ")";
-                                               if (tree[node].getBranchLength() != -1) {
-                                                       outputString += ":" + toString(tree[node].getBranchLength());
-                                               }
-                                       }
-                               }else { 
-                                       outputString = tree[node].getName();
-                                       //if there is a branch length then print it
-                                       if (tree[node].getBranchLength() != -1) {
-                                               outputString += ":" + toString(tree[node].getBranchLength());
-                                       }
-                                       
-                                       m->mothurOut("[ERROR]: " + tree[node].getName() + " is not in your namefile, please correct."); m->mothurOutEndLine(); 
-                               }
-                                       
-                               out << outputString;
                        }
                }