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 /**************************************************************************************************/
24 string PhyloTree::getNextTaxon(string& heirarchy){
26 string currentLevel = "";
28 currentLevel=heirarchy.substr(0,heirarchy.find_first_of(';'));
29 heirarchy=heirarchy.substr(heirarchy.find_first_of(';')+1);
35 /**************************************************************************************************/
37 void PhyloTree::addSeqToTree(string seqName, string seqTaxonomy){
41 map<string, int>::iterator childPointer;
46 tree[0].accessions.push_back(seqName);
47 string taxon;// = getNextTaxon(seqTaxonomy);
49 while(seqTaxonomy != ""){
53 //somehow the parent is getting one too many accnos
54 //use print to reassign the taxa id
55 taxon = getNextTaxon(seqTaxonomy);
57 childPointer = tree[currentNode].children.find(taxon);
59 if(childPointer != tree[currentNode].children.end()){ //if the node already exists, move on
60 currentNode = childPointer->second;
61 tree[currentNode].accessions.push_back(seqName);
63 else{ //otherwise, create it
64 tree.push_back(TaxNode(taxon));
66 tree[currentNode].children[taxon] = numNodes-1;
68 // int numChildren = tree[currentNode].children.size();
69 // string heirarchyID = tree[currentNode].heirarchyID;
70 // tree[currentNode].accessions.push_back(seqName);
72 currentNode = tree[currentNode].children[taxon];
73 tree[currentNode].accessions.push_back(seqName);
75 // tree[currentNode].level = level;
76 // tree[currentNode].childNumber = numChildren;
77 // tree[currentNode].heirarchyID = heirarchyID + '.' + toString(tree[currentNode].childNumber);
83 /**************************************************************************************************/
85 void PhyloTree::assignHeirarchyIDs(int index){
87 map<string,int>::iterator it;
90 for(it=tree[index].children.begin();it!=tree[index].children.end();it++){
91 tree[it->second].heirarchyID = tree[index].heirarchyID + '.' + toString(counter);
93 tree[it->second].level = tree[index].level + 1;
94 assignHeirarchyIDs(it->second);
100 /**************************************************************************************************/
102 void PhyloTree::print(ofstream& out){
104 out << tree[0].level << '\t'<< tree[0].heirarchyID << '\t' << tree[0].name << '\t' << tree[0].children.size() << '\t' << tree[0].accessions.size() << endl;
110 /**************************************************************************************************/
112 void PhyloTree::print(int i, ofstream& out){
114 map<string,int>::iterator it;
115 for(it=tree[i].children.begin();it!=tree[i].children.end();it++){
116 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;
117 print(it->second, out);
122 /**************************************************************************************************/