+ m->errorOut(e, "PhyloTree", "PhyloTree");
+ exit(1);
+ }
+}
+/**************************************************************************************************/
+
+PhyloTree::PhyloTree(ifstream& in, string filename){
+ try {
+ m = MothurOut::getInstance();
+ calcTotals = false;
+ numNodes = 0;
+ numSeqs = 0;
+
+ #ifdef USE_MPI
+ MPI_File inMPI;
+ MPI_Offset size;
+ MPI_Status status;
+
+ char inFileName[1024];
+ strcpy(inFileName, filename.c_str());
+
+ MPI_File_open(MPI_COMM_WORLD, inFileName, MPI_MODE_RDONLY, MPI_INFO_NULL, &inMPI);
+ MPI_File_get_size(inMPI, &size);
+
+ char* buffer = new char[size];
+ MPI_File_read(inMPI, buffer, size, MPI_CHAR, &status);
+
+ string tempBuf = buffer;
+ if (tempBuf.length() > size) { tempBuf = tempBuf.substr(0, size); }
+ istringstream iss (tempBuf,istringstream::in);
+ delete buffer;
+
+ //read version
+ m->getline(iss); m->gobble(iss);
+
+ iss >> numNodes; m->gobble(iss);
+
+ tree.resize(numNodes);
+
+ for (int i = 0; i < tree.size(); i++) {
+ iss >> tree[i].name >> tree[i].level >> tree[i].parent; m->gobble(iss);
+ }
+
+ //read genus nodes
+ int numGenus = 0;
+ iss >> numGenus; m->gobble(iss);
+
+ int gnode, gsize;
+ totals.clear();
+ for (int i = 0; i < numGenus; i++) {
+ iss >> gnode >> gsize; m->gobble(iss);
+
+ uniqueTaxonomies[gnode] = gnode;
+ totals.push_back(gsize);
+ }
+
+ MPI_File_close(&inMPI);
+
+ #else
+ //read version
+ string line = m->getline(in); m->gobble(in);
+
+ in >> numNodes; m->gobble(in);
+
+ tree.resize(numNodes);
+
+ for (int i = 0; i < tree.size(); i++) {
+ in >> tree[i].name >> tree[i].level >> tree[i].parent; m->gobble(in);
+ }
+
+ //read genus nodes
+ int numGenus = 0;
+ in >> numGenus; m->gobble(in);
+
+ int gnode, gsize;
+ totals.clear();
+ for (int i = 0; i < numGenus; i++) {
+ in >> gnode >> gsize; m->gobble(in);
+
+ uniqueTaxonomies[gnode] = gnode;
+ totals.push_back(gsize);
+ }
+
+ in.close();
+
+ #endif
+
+ }
+ catch(exception& e) {
+ m->errorOut(e, "PhyloTree", "PhyloTree");