5 * Created by Pat Schloss on 6/17/09.
6 * Copyright 2009 Patrick D. Schloss. All rights reserved.
10 #include "doTaxonomy.h"
12 /**************************************************************************************************/
14 PhyloTree::PhyloTree(){
18 tree.push_back(TaxNode("Root"));
19 tree[0].heirarchyID = "0";
22 errorOut(e, "PhyloTree", "PhyloTree");
27 /**************************************************************************************************/
29 string PhyloTree::getNextTaxon(string& heirarchy){
31 string currentLevel = "";
33 currentLevel=heirarchy.substr(0,heirarchy.find_first_of(';'));
34 heirarchy=heirarchy.substr(heirarchy.find_first_of(';')+1);
39 errorOut(e, "PhyloTree", "getNextTaxon");
44 /**************************************************************************************************/
46 void PhyloTree::addSeqToTree(string seqName, string seqTaxonomy){
50 map<string, int>::iterator childPointer;
55 tree[0].accessions.push_back(seqName);
56 string taxon;// = getNextTaxon(seqTaxonomy);
58 while(seqTaxonomy != ""){
62 //somehow the parent is getting one too many accnos
63 //use print to reassign the taxa id
64 taxon = getNextTaxon(seqTaxonomy);
66 childPointer = tree[currentNode].children.find(taxon);
68 if(childPointer != tree[currentNode].children.end()){ //if the node already exists, move on
69 currentNode = childPointer->second;
70 tree[currentNode].accessions.push_back(seqName);
71 name2Taxonomy[seqName] = currentNode;
73 else{ //otherwise, create it
74 tree.push_back(TaxNode(taxon));
76 tree[currentNode].children[taxon] = numNodes-1;
77 tree[numNodes-1].parent = currentNode;
79 // int numChildren = tree[currentNode].children.size();
80 // string heirarchyID = tree[currentNode].heirarchyID;
81 // tree[currentNode].accessions.push_back(seqName);
83 currentNode = tree[currentNode].children[taxon];
84 tree[currentNode].accessions.push_back(seqName);
85 name2Taxonomy[seqName] = currentNode;
86 // tree[currentNode].level = level;
87 // tree[currentNode].childNumber = numChildren;
88 // tree[currentNode].heirarchyID = heirarchyID + '.' + toString(tree[currentNode].childNumber);
91 if (seqTaxonomy == "") { uniqueTaxonomies[currentNode] = currentNode; }
96 errorOut(e, "PhyloTree", "addSeqToTree");
100 /**************************************************************************************************/
101 vector<int> PhyloTree::getGenusNodes() {
104 //generate genusIndexes
105 map<int, int>::iterator it2;
106 for (it2=uniqueTaxonomies.begin(); it2!=uniqueTaxonomies.end(); it2++) { genusIndex.push_back(it2->first); }
110 catch(exception& e) {
111 errorOut(e, "PhyloTree", "getGenusNodes");
115 /**************************************************************************************************/
117 void PhyloTree::assignHeirarchyIDs(int index){
119 map<string,int>::iterator it;
122 for(it=tree[index].children.begin();it!=tree[index].children.end();it++){
123 tree[it->second].heirarchyID = tree[index].heirarchyID + '.' + toString(counter);
125 tree[it->second].level = tree[index].level + 1;
126 assignHeirarchyIDs(it->second);
129 catch(exception& e) {
130 errorOut(e, "PhyloTree", "assignHeirarchyIDs");
135 /**************************************************************************************************/
137 void PhyloTree::print(ofstream& out){
139 out << tree[0].level << '\t'<< tree[0].heirarchyID << '\t' << tree[0].name << '\t' << tree[0].children.size() << '\t' << tree[0].accessions.size() << endl;
142 catch(exception& e) {
143 errorOut(e, "PhyloTree", "print");
148 /**************************************************************************************************/
150 void PhyloTree::print(int i, ofstream& out){
152 map<string,int>::iterator it;
153 for(it=tree[i].children.begin();it!=tree[i].children.end();it++){
154 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;
155 print(it->second, out);
158 catch(exception& e) {
159 errorOut(e, "PhyloTree", "print");
164 /**************************************************************************************************/