Tree::Tree() {
try {
globaldata = GlobalData::getInstance();
+ m = MothurOut::getInstance();
if (globaldata->runParse == true) { parseTreeFile(); globaldata->runParse = false; }
//for(int i = 0; i < globaldata->Treenames.size(); i++) { cout << i << '\t' << globaldata->Treenames[i] << endl; }
//initialize leaf nodes
if (i <= (numLeaves-1)) {
tree[i].setName(globaldata->Treenames[i]);
- tree[i].setGroup(globaldata->gTreemap->getGroup(globaldata->Treenames[i]));
+ vector<string> tempGroups; tempGroups.push_back(globaldata->gTreemap->getGroup(globaldata->Treenames[i]));
+ tree[i].setGroup(tempGroups);
//set pcount and pGroup for groupname to 1.
tree[i].pcount[globaldata->gTreemap->getGroup(globaldata->Treenames[i])] = 1;
tree[i].pGroups[globaldata->gTreemap->getGroup(globaldata->Treenames[i])] = 1;
//intialize non leaf nodes
}else if (i > (numLeaves-1)) {
tree[i].setName("");
- tree[i].setGroup("");
+ vector<string> tempGroups;
+ tree[i].setGroup(tempGroups);
}
}
}
catch(exception& e) {
- errorOut(e, "Tree", "Tree");
+ m->errorOut(e, "Tree", "Tree");
exit(1);
}
}
//go through each leaf and update its pcounts and pgroups
for (int i = 0; i < numLeaves; i++) {
+
string name = tree[i].getName();
-
+
map<string, string>::iterator itNames = globaldata->names.find(name);
-
- if (itNames == globaldata->names.end()) { mothurOut(name + " is not in your name file, please correct."); mothurOutEndLine(); exit(1); }
+
+ if (itNames == globaldata->names.end()) { m->mothurOut(name + " is not in your name file, please correct."); m->mothurOutEndLine(); exit(1); }
else {
vector<string> dupNames;
splitAtComma(globaldata->names[name], dupNames);
}
}//end if
- }//end else
- }//end for
+ //update groups to reflect all the groups this node represents
+ vector<string> nodeGroups;
+ map<string, int>::iterator itGroups;
+ for (itGroups = tree[i].pcount.begin(); itGroups != tree[i].pcount.end(); itGroups++) {
+ nodeGroups.push_back(itGroups->first);
+ }
+ tree[i].setGroup(nodeGroups);
+ }//end else
+ }//end for
}
catch(exception& e) {
- errorOut(e, "Tree", "addNamesToCounts");
+ m->errorOut(e, "Tree", "addNamesToCounts");
exit(1);
}
}
}
catch(exception& e) {
- errorOut(e, "Tree", "getIndex");
+ m->errorOut(e, "Tree", "getIndex");
exit(1);
}
}
globaldata->gTreemap->setIndex(searchName, index);
}
catch(exception& e) {
- errorOut(e, "Tree", "setIndex");
+ m->errorOut(e, "Tree", "setIndex");
exit(1);
}
}
/*****************************************************************/
-void Tree::assembleTree() {
+int Tree::assembleTree() {
try {
//if user has given a names file we want to include that info in the pgroups and pcount info.
//build the pGroups in non leaf nodes to be used in the parsimony calcs.
for (int i = numLeaves; i < numNodes; i++) {
+ if (m->control_pressed) { return 1; }
+
tree[i].pGroups = (mergeGroups(i));
tree[i].pcount = (mergeGcounts(i));
}
+
+ return 0;
}
catch(exception& e) {
- errorOut(e, "Tree", "assembleTree");
+ m->errorOut(e, "Tree", "assembleTree");
exit(1);
}
}
}
catch(exception& e) {
- errorOut(e, "Tree", "getCopy");
+ m->errorOut(e, "Tree", "getCopy");
exit(1);
}
}
return parsimony;
}
catch(exception& e) {
- errorOut(e, "Tree", "mergeGroups");
+ m->errorOut(e, "Tree", "mergeGroups");
exit(1);
}
}
return parsimony;
}
catch(exception& e) {
- errorOut(e, "Tree", "mergeUserGroups");
+ m->errorOut(e, "Tree", "mergeUserGroups");
exit(1);
}
}
return sum;
}
catch(exception& e) {
- errorOut(e, "Tree", "mergeGcounts");
+ m->errorOut(e, "Tree", "mergeGcounts");
exit(1);
}
}
tree[z].pGroups = (tree[i].pGroups);
tree[i].pGroups = (lib_hold);
- string zgroup = tree[z].getGroup();
+ vector<string> zgroup = tree[z].getGroup();
tree[z].setGroup(tree[i].getGroup());
tree[i].setGroup(zgroup);
}
}
catch(exception& e) {
- errorOut(e, "Tree", "randomLabels");
+ m->errorOut(e, "Tree", "randomLabels");
exit(1);
}
}
-/**************************************************************************************************/
+/**************************************************************************************************
void Tree::randomLabels(string groupA, string groupB) {
try {
}
}
catch(exception& e) {
- errorOut(e, "Tree", "randomLabels");
+ m->errorOut(e, "Tree", "randomLabels");
exit(1);
}
}
}
}
catch(exception& e) {
- errorOut(e, "Tree", "randomBlengths");
+ m->errorOut(e, "Tree", "randomBlengths");
exit(1);
}
}
}
/*************************************************************************************************/
void Tree::assembleRandomUnifracTree(string groupA, string groupB) {
- randomLabels(groupA, groupB);
+
+ vector<string> temp; temp.push_back(groupA); temp.push_back(groupB);
+ randomLabels(temp);
assembleTree();
}
}
}
catch(exception& e) {
- errorOut(e, "Tree", "randomTopology");
+ m->errorOut(e, "Tree", "randomTopology");
exit(1);
}
}
out << ";" << endl;
}
catch(exception& e) {
- errorOut(e, "Tree", "print");
+ m->errorOut(e, "Tree", "print");
exit(1);
}
}
out << ";" << endl;
}
catch(exception& e) {
- errorOut(e, "Tree", "printForBoot");
+ m->errorOut(e, "Tree", "printForBoot");
exit(1);
}
}
out.close();
}
catch(exception& e) {
- errorOut(e, "Tree", "createNewickFile");
+ m->errorOut(e, "Tree", "createNewickFile");
exit(1);
}
}
return -1;
}
catch(exception& e) {
- errorOut(e, "Tree", "findRoot");
+ m->errorOut(e, "Tree", "findRoot");
exit(1);
}
}
}
}
}else { //you are a leaf
- out << tree[node].getGroup();
+ string leafGroup = globaldata->gTreemap->getGroup(tree[node].getName());
+
+ out << leafGroup;
if (mode == "branch") {
//if there is a branch length then print it
if (tree[node].getBranchLength() != -1) {
}
catch(exception& e) {
- errorOut(e, "Tree", "printBranch");
+ m->errorOut(e, "Tree", "printBranch");
exit(1);
}
}
}
}
filehandle.close();
+
+ //for (int i = 0; i < globaldata->Treenames.size(); i++) {
+//cout << globaldata->Treenames[i] << endl; }
+//cout << globaldata->Treenames.size() << endl;
}
catch(exception& e) {
- errorOut(e, "Tree", "parseTreeFile");
+ m->errorOut(e, "Tree", "parseTreeFile");
exit(1);
}
}
//cout << " at beginning of while " << k << endl;
if(c == ')') {
//to pass over labels in trees
- c=filehandle.get();
- while((c!=',') && (c != -1) && (c!= ':') && (c!=';')){ c=filehandle.get(); }
- filehandle.putback(c);
+ string label = readLabel(filehandle);
}
+
if(c == ';') { return 0; }
if(c == -1) { return 0; }
+
//if you are a name
if((c != '(') && (c != ')') && (c != ',') && (c != ':') && (c != '\n') && (c != '\t') && (c != 32)) { //32 is space
- name = "";
- c = filehandle.get();
- //k = c;
-//cout << k << endl;
- while ((c != '(') && (c != ')') && (c != ',') && (c != ':') && (c != '\n') && (c != 32) && (c != '\t')) {
- name += c;
- c = filehandle.get();
- //k = c;
-//cout << " in name while " << k << endl;
- }
-
-//cout << "name = " << name << endl;
+ name = readName(filehandle);
globaldata->Treenames.push_back(name);
- filehandle.putback(c);
-//k = c;
-//cout << " after putback" << k << endl;
}
if(c == ':') { //read until you reach the end of the branch length
- while ((c != '(') && (c != ')') && (c != ',') && (c != ';') && (c != '\n') && (c != '\t') && (c != 32)) {
- c = filehandle.get();
- //k = c;
- //cout << " in branch while " << k << endl;
- }
- filehandle.putback(c);
+ string bl = readBranchLength(filehandle);
}
c = filehandle.get();
return 0;
}
catch(exception& e) {
- errorOut(e, "Tree", "readTreeString");
+ m->errorOut(e, "Tree", "readTreeString");
exit(1);
}
}
/*******************************************************/
+string Tree::readLabel(ifstream& filehandle) {
+ try {
+
+ string label = "";
+
+ //to pass over labels in trees
+ int c=filehandle.get();
+ while((c!=',') && (c != -1) && (c!= ':') && (c!=';')){ label += c; c=filehandle.get(); }
+ filehandle.putback(c);
+
+ return label;
+
+ }
+ catch(exception& e) {
+ m->errorOut(e, "Tree", "readLabel");
+ exit(1);
+ }
+}
+/*******************************************************/
+string Tree::readName(ifstream& filehandle) {
+ try {
+
+ string name = "";
+ int c = filehandle.get();
+
+ while ((c != '(') && (c != ')') && (c != ',') && (c != ':') && (c != '\n') && (c != 32) && (c != '\t')) {
+ name += c;
+ c = filehandle.get();
+ }
+
+//cout << "name = " << name << endl;
+ filehandle.putback(c);
+
+ return name;
+
+ }
+ catch(exception& e) {
+ m->errorOut(e, "Tree", "readName");
+ exit(1);
+ }
+}
+/*******************************************************/
+string Tree::readBranchLength(ifstream& filehandle) {
+ try {
+
+ string br = "";
+ int c;
+ while ((c != '(') && (c != ')') && (c != ',') && (c != ';') && (c != '\n') && (c != '\t') && (c != 32)) {
+ br += c;
+ c = filehandle.get();
+ }
+ filehandle.putback(c);
+
+ return br;
+
+ }
+ catch(exception& e) {
+ m->errorOut(e, "Tree", "readBranchLength");
+ exit(1);
+ }
+}
/*******************************************************/
+/*******************************************************/