try {
ifstream in;
- openInputFile(userTfile, in);
+ m->openInputFile(userTfile, in);
//read in users taxonomy file and add sequences to tree
string name, tax;
while(!in.eof()){
- in >> name >> tax; gobble(in);
+ in >> name >> tax; m->gobble(in);
addSeqToTree(name, tax);
//find out the sequences group
string group = groupmap->getGroup(seqName);
+ if (group == "not found") { m->mothurOut(seqName + " is not in your groupfile, and will be included in the overall total, but not any group total."); m->mothurOutEndLine(); }
+
//do you have a count for this group?
map<string, int>::iterator itGroup = tree[currentNode].groupCount.find(group);
tree[currentNode].total++;
currentNode = childPointer->second;
- }else{ //otherwise, create it
- m->mothurOut("Error: cannot find taxonomy in tree for " + seqName + "."); m->mothurOutEndLine();
- seqTaxonomy = "";
+ }else{ //otherwise, error
+ m->mothurOut("Warning: cannot find taxon " + taxon + " in reference taxonomy tree at level " + toString(tree[currentNode].level) + " for " + seqName + ". This may cause totals of daughter levels not to add up in summary file."); m->mothurOutEndLine();
+ break;
}
level++;
void PhyloSummary::print(ofstream& out){
try {
//print labels
- out << "taxlevel\t rank ID\t label\t daughterlevels\t total\t";
+ out << "taxlevel\t rankID\t taxon\t daughterlevels\t total\t";
if (groupmap != NULL) {
+ //so the labels match the counts below, since the map sorts them automatically...
+ //sort(groupmap->namesOfGroups.begin(), groupmap->namesOfGroups.end());
+
for (int i = 0; i < groupmap->namesOfGroups.size(); i++) {
out << groupmap->namesOfGroups[i] << '\t';
}
out << endl;
+ int totalChildrenInTree = 0;
+
+ map<string,int>::iterator it;
+ for(it=tree[0].children.begin();it!=tree[0].children.end();it++){
+ if (tree[it->second].total != 0) { totalChildrenInTree++; }
+ }
+
//print root
- out << tree[0].level << "\t" << tree[0].rank << "\t" << tree[0].name << "\t" << tree[0].children.size() << "\t" << tree[0].total << "\t";
+ out << tree[0].level << "\t" << tree[0].rank << "\t" << tree[0].name << "\t" << totalChildrenInTree << "\t" << tree[0].total << "\t";
map<string, int>::iterator itGroup;
if (groupmap != NULL) {
- for (itGroup = tree[0].groupCount.begin(); itGroup != tree[0].groupCount.end(); itGroup++) {
- out << itGroup->second << '\t';
- }
+ //for (itGroup = tree[0].groupCount.begin(); itGroup != tree[0].groupCount.end(); itGroup++) {
+ // out << itGroup->second << '\t';
+ //}
+ for (int i = 0; i < groupmap->namesOfGroups.size(); i++) { out << tree[0].groupCount[groupmap->namesOfGroups[i]] << '\t'; }
}
out << endl;
for(it=tree[i].children.begin();it!=tree[i].children.end();it++){
if (tree[it->second].total != 0) {
- out << tree[it->second].level << "\t" << tree[it->second].rank << "\t" << tree[it->second].name << "\t" << tree[it->second].children.size() << "\t" << tree[it->second].total << "\t";
+
+ int totalChildrenInTree = 0;
+
+ map<string,int>::iterator it2;
+ for(it2=tree[it->second].children.begin();it2!=tree[it->second].children.end();it2++){
+ if (tree[it2->second].total != 0) { totalChildrenInTree++; }
+ }
+
+ out << tree[it->second].level << "\t" << tree[it->second].rank << "\t" << tree[it->second].name << "\t" << totalChildrenInTree << "\t" << tree[it->second].total << "\t";
map<string, int>::iterator itGroup;
if (groupmap != NULL) {
- for (itGroup = tree[it->second].groupCount.begin(); itGroup != tree[it->second].groupCount.end(); itGroup++) {
- out << itGroup->second << '\t';
- }
+ //for (itGroup = tree[it->second].groupCount.begin(); itGroup != tree[it->second].groupCount.end(); itGroup++) {
+ // out << itGroup->second << '\t';
+ //}
+ for (int i = 0; i < groupmap->namesOfGroups.size(); i++) { out << tree[it->second].groupCount[groupmap->namesOfGroups[i]] << '\t'; }
}
out << endl;
}
/**************************************************************************************************/
void PhyloSummary::readTreeStruct(ifstream& in){
try {
+
+ //read version
+ string line = m->getline(in); m->gobble(in);
+
int num;
- in >> num; gobble(in);
+ in >> num; m->gobble(in);
tree.resize(num);
+
+ in >> maxLevel; m->gobble(in);
//read the tree file
for (int i = 0; i < tree.size(); i++) {
tree[i].total = 0;
- gobble(in);
+ m->gobble(in);
- if (tree[i].level > maxLevel) { maxLevel = tree[i].level; }
+ //if (tree[i].level > maxLevel) { maxLevel = tree[i].level; }
}
}