]> git.donarmstrong.com Git - mothur.git/blobdiff - doTaxonomy.cpp
final fixes for 1.7
[mothur.git] / doTaxonomy.cpp
index 06337b446bf0d79ffad7b29f4fb904c99f54058e..40869b946075e4986bf5426cd688bd7f6d743d3b 100644 (file)
 /**************************************************************************************************/
 
 PhyloTree::PhyloTree(){
-       
-       numNodes = 1;
-       numSeqs = 0;
-       tree.push_back(TaxNode("Root"));
-       tree[0].heirarchyID = "0";
+       try {
+               numNodes = 1;
+               numSeqs = 0;
+               tree.push_back(TaxNode("Root"));
+               tree[0].heirarchyID = "0";
+       }
+       catch(exception& e) {
+               errorOut(e, "PhyloTree", "PhyloTree");
+               exit(1);
+       }
 }
 
 /**************************************************************************************************/
 
 string PhyloTree::getNextTaxon(string& heirarchy){
-       
-       string currentLevel = "";
-       if(heirarchy != ""){
-               currentLevel=heirarchy.substr(0,heirarchy.find_first_of(';'));
-               heirarchy=heirarchy.substr(heirarchy.find_first_of(';')+1);
+       try {
+               string currentLevel = "";
+               if(heirarchy != ""){
+                       currentLevel=heirarchy.substr(0,heirarchy.find_first_of(';'));
+                       heirarchy=heirarchy.substr(heirarchy.find_first_of(';')+1);
+               }
+               return currentLevel;
+       }
+       catch(exception& e) {
+               errorOut(e, "PhyloTree", "getNextTaxon");
+               exit(1);
        }
-       return currentLevel;
-       
 }
 
 /**************************************************************************************************/
 
 void PhyloTree::addSeqToTree(string seqName, string seqTaxonomy){
-
-       numSeqs++;
-
-       map<string, int>::iterator childPointer;
-
-       int currentNode = 0;
-       int level = 1;
-       
-       tree[0].accessions.push_back(seqName);
-       string taxon;// = getNextTaxon(seqTaxonomy);
-
-       while(seqTaxonomy != ""){
-
-               level++;
-
-//somehow the parent is getting one too many accnos
-//use print to reassign the taxa id
-               taxon = getNextTaxon(seqTaxonomy);
-
-               childPointer = tree[currentNode].children.find(taxon);
-
-               if(childPointer != tree[currentNode].children.end()){   //if the node already exists, move on
-                       currentNode = childPointer->second;
-                       tree[currentNode].accessions.push_back(seqName);
-                       name2Taxonomy[seqName] = currentNode;
-               }
-               else{                                                                                   //otherwise, create it
-                       tree.push_back(TaxNode(taxon));
-                       numNodes++;
-                       tree[currentNode].children[taxon] = numNodes-1;
-                       tree[numNodes-1].parent = currentNode;
-
-//                     int numChildren = tree[currentNode].children.size();
-//                     string heirarchyID = tree[currentNode].heirarchyID;
-//                     tree[currentNode].accessions.push_back(seqName);
+       try {
+               numSeqs++;
+               
+               map<string, int>::iterator childPointer;
+               
+               int currentNode = 0;
+               int level = 1;
+               
+               tree[0].accessions.push_back(seqName);
+               string taxon;// = getNextTaxon(seqTaxonomy);
+               
+               while(seqTaxonomy != ""){
                        
-                       currentNode = tree[currentNode].children[taxon];
-                       tree[currentNode].accessions.push_back(seqName);
-                       name2Taxonomy[seqName] = currentNode;
-//                     tree[currentNode].level = level;
-//                     tree[currentNode].childNumber = numChildren;
-//                     tree[currentNode].heirarchyID = heirarchyID + '.' + toString(tree[currentNode].childNumber);
-               }
+                       level++;
+                       
+                       //somehow the parent is getting one too many accnos
+                       //use print to reassign the taxa id
+                       taxon = getNextTaxon(seqTaxonomy);
+                       
+                       childPointer = tree[currentNode].children.find(taxon);
+                       
+                       if(childPointer != tree[currentNode].children.end()){   //if the node already exists, move on
+                               currentNode = childPointer->second;
+                               tree[currentNode].accessions.push_back(seqName);
+                               name2Taxonomy[seqName] = currentNode;
+                       }
+                       else{                                                                                   //otherwise, create it
+                               tree.push_back(TaxNode(taxon));
+                               numNodes++;
+                               tree[currentNode].children[taxon] = numNodes-1;
+                               tree[numNodes-1].parent = currentNode;
+                               
+                               //                      int numChildren = tree[currentNode].children.size();
+                               //                      string heirarchyID = tree[currentNode].heirarchyID;
+                               //                      tree[currentNode].accessions.push_back(seqName);
+                               
+                               currentNode = tree[currentNode].children[taxon];
+                               tree[currentNode].accessions.push_back(seqName);
+                               name2Taxonomy[seqName] = currentNode;
+                               //                      tree[currentNode].level = level;
+                               //                      tree[currentNode].childNumber = numChildren;
+                               //                      tree[currentNode].heirarchyID = heirarchyID + '.' + toString(tree[currentNode].childNumber);
+                       }
                
-               if (seqTaxonomy == "") {   uniqueTaxonomies[currentNode] = currentNode; }
+                       if (seqTaxonomy == "") {   uniqueTaxonomies[currentNode] = currentNode; }
+               }
+
+       }
+       catch(exception& e) {
+               errorOut(e, "PhyloTree", "addSeqToTree");
+               exit(1);
        }
 }
 /**************************************************************************************************/
@@ -100,38 +115,50 @@ vector<int> PhyloTree::getGenusNodes()    {
 /**************************************************************************************************/
 
 void PhyloTree::assignHeirarchyIDs(int index){
-       
-       map<string,int>::iterator it;
-       int counter = 1;
-       
-       for(it=tree[index].children.begin();it!=tree[index].children.end();it++){
-               tree[it->second].heirarchyID = tree[index].heirarchyID + '.' + toString(counter);
-               counter++;
-               tree[it->second].level = tree[index].level + 1;
-               assignHeirarchyIDs(it->second);
+       try {
+               map<string,int>::iterator it;
+               int counter = 1;
+               
+               for(it=tree[index].children.begin();it!=tree[index].children.end();it++){
+                       tree[it->second].heirarchyID = tree[index].heirarchyID + '.' + toString(counter);
+                       counter++;
+                       tree[it->second].level = tree[index].level + 1;
+                       assignHeirarchyIDs(it->second);
+               }
+       }
+       catch(exception& e) {
+               errorOut(e, "PhyloTree", "assignHeirarchyIDs");
+               exit(1);
        }
 }
 
 /**************************************************************************************************/
 
 void PhyloTree::print(ofstream& out){
-       
-       out << tree[0].level << '\t'<< tree[0].heirarchyID << '\t' << tree[0].name << '\t' << tree[0].children.size() << '\t' << tree[0].accessions.size() << endl;
-       print(0, out);
-
-       
+       try {
+               out << tree[0].level << '\t'<< tree[0].heirarchyID << '\t' << tree[0].name << '\t' << tree[0].children.size() << '\t' << tree[0].accessions.size() << endl;
+               print(0, out);
+       }
+       catch(exception& e) {
+               errorOut(e, "PhyloTree", "print");
+               exit(1);
+       }
 }
 
 /**************************************************************************************************/
 
 void PhyloTree::print(int i, ofstream& out){
-       
-       map<string,int>::iterator it;
-       for(it=tree[i].children.begin();it!=tree[i].children.end();it++){
-               out <<tree[it->second].level << '\t' << tree[it->second].heirarchyID << '\t' << tree[it->second].name << '\t' << tree[it->second].children.size() << '\t' << tree[it->second].accessions.size() << endl;
-               print(it->second, out);
+       try {
+               map<string,int>::iterator it;
+               for(it=tree[i].children.begin();it!=tree[i].children.end();it++){
+                       out <<tree[it->second].level << '\t' << tree[it->second].heirarchyID << '\t' << tree[it->second].name << '\t' << tree[it->second].children.size() << '\t' << tree[it->second].accessions.size() << endl;
+                       print(it->second, out);
+               }
+       }
+       catch(exception& e) {
+               errorOut(e, "PhyloTree", "print");
+               exit(1);
        }
-
 }
 
 /**************************************************************************************************/