X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=readtree.cpp;h=d3790df170ab0651c24987bc3541b62f48197c5f;hb=477e76a8a79b60f6cd4253324dd830bdea25e3e9;hp=a253741688c00ddc138d1353ac757456c03643da;hpb=9daea1c357d32c6a7b34c5cbec122b7cfc5c92e3;p=mothur.git diff --git a/readtree.cpp b/readtree.cpp index a253741..d3790df 100644 --- a/readtree.cpp +++ b/readtree.cpp @@ -100,31 +100,42 @@ float ReadTree::readBranchLength(istream& f) { } } - /***********************************************************************/ /***********************************************************************/ - //Child Classes Below /***********************************************************************/ /***********************************************************************/ //This class reads a file in Newick form and stores it in a tree. -void ReadNewickTree::read() { +int ReadNewickTree::read() { try { - int c; + holder = ""; + int c, error; int comment = 0; //if you are not a nexus file if ((c = filehandle.peek()) != '#') { while((c = filehandle.peek()) != EOF) { + while ((c = filehandle.peek()) != EOF) { + // get past comments + if(c == '[') { + comment = 1; + } + if(c == ']'){ + comment = 0; + } + if((c == '(') && (comment != 1)){ break; } + filehandle.get(); + } + //make new tree T = new Tree(); numNodes = T->getNumNodes(); numLeaves = T->getNumLeaves(); - readTreeString(); + error = readTreeString(); //save trees for later commands globaldata->gTree.push_back(T); @@ -158,12 +169,15 @@ void ReadNewickTree::read() { numLeaves = T->getNumLeaves(); //read tree info - readTreeString(); + error = readTreeString(); //save trees for later commands globaldata->gTree.push_back(T); } } + + if (error != 0) { readOk = error; } + return readOk; } catch(exception& e) { cout << "Standard Error: " << e.what() << " has occurred in the ReadNewickTree class Function read. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; @@ -221,7 +235,7 @@ void ReadNewickTree::nexusTranslation() { } /**************************************************************************************************/ -void ReadNewickTree::readTreeString() { +int ReadNewickTree::readTreeString() { try { int n = 0; @@ -235,6 +249,7 @@ void ReadNewickTree::readTreeString() { n = numLeaves; //number of leaves / sequences, we want node 1 to start where the leaves left off lc = readNewickInt(filehandle, n, T); + if (lc == -1) { cout << "error with lc" << endl; return -1; } //reports an error in reading if(filehandle.peek()==','){ readSpecialChar(filehandle,',',"comma"); @@ -245,6 +260,7 @@ void ReadNewickTree::readTreeString() { } if(rooted != 1){ rc = readNewickInt(filehandle, n, T); + if (rc == -1) { cout << "error with rc" << endl; return -1; } //reports an error in reading if(filehandle.peek() == ')'){ readSpecialChar(filehandle,')',"right parenthesis"); } @@ -261,7 +277,8 @@ void ReadNewickTree::readTreeString() { if(n!=0){ cerr << "Internal error: The only taxon is not taxon 0.\n"; - exit(1); + //exit(1); + readOk = -1; return -1; } lc = rc = -1; } @@ -274,6 +291,7 @@ void ReadNewickTree::readTreeString() { if(lc!=-1){ T->tree[lc].setParent(n); } if(rc!=-1){ T->tree[rc].setParent(n); } } + return 0; } catch(exception& e) { @@ -294,16 +312,20 @@ int ReadNewickTree::readNewickInt(istream& f, int& n, Tree* T) { if(c == '('){ int lc = readNewickInt(f, n, T); + if (lc == -1) { return -1; } //reports an error in reading readSpecialChar(f,',',"comma"); - int rc = readNewickInt(f, n, T); + int rc = readNewickInt(f, n, T); + if (rc == -1) { return -1; } //reports an error in reading if(f.peek()==')'){ - readSpecialChar(f,')',"right parenthesis"); + readSpecialChar(f,')',"right parenthesis"); } if(f.peek() == ':'){ - readSpecialChar(f,':',"colon"); - if(n >= numNodes){ cerr << "Error: Too many nodes in input tree\n"; exit(1); } + readSpecialChar(f,':',"colon"); + + if(n >= numNodes){ cerr << "Error: Too many nodes in input tree\n"; readOk = -1; return -1; } + T->tree[n].setBranchLength(readBranchLength(f)); }else{T->tree[n].setBranchLength(0.0); } @@ -322,7 +344,7 @@ int ReadNewickTree::readNewickInt(istream& f, int& n, Tree* T) { } int blen = 0; - if(d == ':') { blen = 1; } + if(d == ':') { blen = 1; } f.putback(d); @@ -333,34 +355,29 @@ int ReadNewickTree::readNewickInt(istream& f, int& n, Tree* T) { int n1 = T->getIndex(name); //adds sequence names that are not in group file to the "xxx" group - if(n1 == -1) { - cerr << "Name: " << name << " not found in your groupfile.. \n"; exit(1); + if(group == "not found") { + cout << "Name: " << name << " is not in your groupfile, and will be disregarded. \n"; //readOk = -1; return n1; - //globaldata->gTreemap->namesOfSeqs.push_back(name); - //globaldata->gTreemap->treemap[name].groupname = "xxx"; - //globaldata->gTreemap->treemap[name].vectorIndex = (globaldata->gTreemap->namesOfSeqs.size() - 1); + globaldata->gTreemap->namesOfSeqs.push_back(name); + globaldata->gTreemap->treemap[name].groupname = "xxx"; - //map::iterator it; - //it = globaldata->gTreemap->seqsPerGroup.find("xxx"); - //if (it == globaldata->gTreemap->seqsPerGroup.end()) { //its a new group - // globaldata->gTreemap->namesOfGroups.push_back("xxx"); - // globaldata->gTreemap->seqsPerGroup["xxx"] = 1; - //}else { - // globaldata->gTreemap->seqsPerGroup["xxx"]++; - //} + map::iterator it; + it = globaldata->gTreemap->seqsPerGroup.find("xxx"); + if (it == globaldata->gTreemap->seqsPerGroup.end()) { //its a new group + globaldata->gTreemap->namesOfGroups.push_back("xxx"); + globaldata->gTreemap->seqsPerGroup["xxx"] = 1; + }else { + globaldata->gTreemap->seqsPerGroup["xxx"]++; + } - //find index in tree of name - //n1 = T->getIndex(name); - //group = "xxx"; - //numLeaves++; - //numNodes = 2*numLeaves - 1; + group = "xxx"; } T->tree[n1].setGroup(group); T->tree[n1].setChildren(-1,-1); if(blen == 1){ - f.get(); + f.get(); T->tree[n1].setBranchLength(readBranchLength(f)); }else{ T->tree[n1].setBranchLength(0.0);