X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=readtree.cpp;h=d3790df170ab0651c24987bc3541b62f48197c5f;hb=d873f7bf94309317a08c8757e0d0d60b06fbd473;hp=59239c8af0d24e089bfc7eade92ed055ffaa6e64;hpb=ef2b771b08a9753db3800b06b9860317204dad5b;p=mothur.git diff --git a/readtree.cpp b/readtree.cpp index 59239c8..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,12 +355,11 @@ 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); map::iterator it; it = globaldata->gTreemap->seqsPerGroup.find("xxx"); @@ -349,19 +370,14 @@ int ReadNewickTree::readNewickInt(istream& f, int& n, Tree* T) { globaldata->gTreemap->seqsPerGroup["xxx"]++; } - //find index in tree of name - n1 = T->getIndex(name); group = "xxx"; - numLeaves++; - numNodes = 2*numLeaves - 1; - //T->resetTree(); } 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);