X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=mothurout.cpp;h=f98bea8ca92fbb387ad0d3727dbfbc858da49583;hb=ee8403d4eb5760187d62b42a9cf4272de8fc0ec4;hp=4df5f96eb6086e8d2e8e96e3f448948540a1c8b4;hpb=8da8321bc4d705f6c156248d6229c60a0204f750;p=mothur.git diff --git a/mothurout.cpp b/mothurout.cpp index 4df5f96..f98bea8 100644 --- a/mothurout.cpp +++ b/mothurout.cpp @@ -40,6 +40,7 @@ void MothurOut::printCurrentFiles() { if (taxonomyfile != "") { mothurOut("taxonomy=" + taxonomyfile); mothurOutEndLine(); } if (treefile != "") { mothurOut("tree=" + treefile); mothurOutEndLine(); } if (flowfile != "") { mothurOut("flow=" + flowfile); mothurOutEndLine(); } + if (biomfile != "") { mothurOut("biom=" + biomfile); mothurOutEndLine(); } if (processors != "1") { mothurOut("processors=" + processors); mothurOutEndLine(); } } @@ -73,6 +74,7 @@ bool MothurOut::hasCurrentFiles() { if (taxonomyfile != "") { return true; } if (treefile != "") { return true; } if (flowfile != "") { return true; } + if (biomfile != "") { return true; } if (processors != "1") { return true; } return hasCurrent; @@ -107,6 +109,7 @@ void MothurOut::clearCurrentFiles() { accnosfile = ""; taxonomyfile = ""; flowfile = ""; + biomfile = ""; processors = "1"; } catch(exception& e) { @@ -114,6 +117,81 @@ void MothurOut::clearCurrentFiles() { exit(1); } } +/***********************************************************************/ +string MothurOut::findProgramPath(string programName){ + try { + + string envPath = getenv("PATH"); + string pPath = ""; + + //delimiting path char + char delim; +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + delim = ':'; +#else + delim = ';'; +#endif + + //break apart path variable by ':' + vector dirs; + splitAtChar(envPath, dirs, delim); + + if (debug) { mothurOut("[DEBUG]: dir's in path: \n"); } + + //get path related to mothur + for (int i = 0; i < dirs.size(); i++) { + + if (debug) { mothurOut("[DEBUG]: " + dirs[i] + "\n"); } + + //to lower so we can find it + string tempLower = ""; + for (int j = 0; j < dirs[i].length(); j++) { tempLower += tolower(dirs[i][j]); } + + //is this mothurs path? + if (tempLower.find(programName) != -1) { pPath = dirs[i]; break; } + } + + if (debug) { mothurOut("[DEBUG]: programPath = " + pPath + "\n"); } + + if (pPath != "") { + //add programName so it looks like what argv would look like +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + pPath += "/" + programName; +#else + pPath += "\\" + programName; +#endif + }else { + //okay programName is not in the path, so the folder programName is in must be in the path + //lets find out which one + + //get path related to the program + for (int i = 0; i < dirs.size(); i++) { + + if (debug) { mothurOut("[DEBUG]: looking in " + dirs[i] + " for " + programName + " \n"); } + + //is this the programs path? + ifstream in; + string tempIn = dirs[i]; +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + tempIn += "/" + programName; +#else + tempIn += "\\" + programName; +#endif + openInputFile(tempIn, in, ""); + + //if this file exists + if (in) { in.close(); pPath = tempIn; if (debug) { mothurOut("[DEBUG]: found it, programPath = " + pPath + "\n"); } break; } + } + } + + return pPath; + + } + catch(exception& e) { + errorOut(e, "MothurOut", "findProgramPath"); + exit(1); + } +} /*********************************************************************************************/ void MothurOut::setFileName(string filename) { try { @@ -598,6 +676,48 @@ string MothurOut::getPathName(string longName){ } /***********************************************************************/ +bool MothurOut::dirCheck(string& dirName){ + try { + + string tag = ""; + #ifdef USE_MPI + int pid; + MPI_Comm_rank(MPI_COMM_WORLD, &pid); //find out who we are + + tag = toString(pid); + #endif + + //add / to name if needed + string lastChar = dirName.substr(dirName.length()-1); + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + if (lastChar != "/") { dirName += "/"; } + #else + if (lastChar != "\\") { dirName += "\\"; } + #endif + + //test to make sure directory exists + dirName = getFullPathName(dirName); + string outTemp = dirName + tag + "temp"; + ofstream out; + out.open(outTemp.c_str(), ios::trunc); + if(!out) { + mothurOut(dirName + " directory does not exist or is not writable."); mothurOutEndLine(); + }else{ + out.close(); + mothurRemove(outTemp); + return true; + } + + return false; + } + catch(exception& e) { + errorOut(e, "MothurOut", "dirCheck"); + exit(1); + } + +} +/***********************************************************************/ + string MothurOut::hasPath(string longName){ try { string path = ""; @@ -621,7 +741,7 @@ string MothurOut::hasPath(string longName){ string MothurOut::getExtension(string longName){ try { - string extension = longName; + string extension = ""; if(longName.find_last_of('.') != longName.npos){ int pos = longName.find_last_of('.'); @@ -972,10 +1092,14 @@ int MothurOut::appendFiles(string temp, string filename) { int numLines = 0; if (ableToOpen == 0) { //you opened it - while(char c = input.get()){ - if(input.eof()) { break; } - else { output << c; if (c == '\n') {numLines++;} } - } + + char buffer[4096]; + while (!input.eof()) { + input.read(buffer, 4096); + output.write(buffer, input.gcount()); + //count number of lines + for (int i = 0; i < input.gcount(); i++) { if (buffer[i] == '\n') {numLines++;} } + } input.close(); } @@ -1333,6 +1457,30 @@ float MothurOut::ceilDist(float dist, int precision){ exit(1); } } +/***********************************************************************/ + +vector MothurOut::splitWhiteSpace(string& rest, char buffer[], int size){ + try { + vector pieces; + + for (int i = 0; i < size; i++) { + if (!isspace(buffer[i])) { rest += buffer[i]; } + else { + pieces.push_back(rest); rest = ""; + while (i < size) { //gobble white space + if (isspace(buffer[i])) { i++; } + else { rest = buffer[i]; break; } //cout << "next piece buffer = " << nextPiece << endl; + } + } + } + + return pieces; + } + catch(exception& e) { + errorOut(e, "MothurOut", "parsePieces"); + exit(1); + } +} /**********************************************************************************************************************/ int MothurOut::readNames(string namefile, map& nameMap) { try { @@ -1340,14 +1488,25 @@ int MothurOut::readNames(string namefile, map& nameMap) { //open input file ifstream in; openInputFile(namefile, in); - + + string rest = ""; + char buffer[4096]; + bool pairDone = false; + bool columnOne = true; + string firstCol, secondCol; + while (!in.eof()) { if (control_pressed) { break; } - string firstCol, secondCol; - in >> firstCol >> secondCol; gobble(in); - - nameMap[firstCol] = secondCol; + in.read(buffer, 4096); + vector pieces = splitWhiteSpace(rest, buffer, in.gcount()); + + for (int i = 0; i < pieces.size(); i++) { + if (columnOne) { firstCol = pieces[i]; columnOne=false; } + else { secondCol = pieces[i]; pairDone = true; columnOne=true; } + + if (pairDone) { nameMap[firstCol] = secondCol; pairDone = false; } + } } in.close(); @@ -1367,21 +1526,33 @@ int MothurOut::readNames(string namefile, map >& nameMap) ifstream in; openInputFile(namefile, in); + string rest = ""; + char buffer[4096]; + bool pairDone = false; + bool columnOne = true; + string firstCol, secondCol; + while (!in.eof()) { if (control_pressed) { break; } - string firstCol, secondCol; - in >> firstCol >> secondCol; gobble(in); - - vector temp; - splitAtComma(secondCol, temp); - - nameMap[firstCol] = temp; + in.read(buffer, 4096); + vector pieces = splitWhiteSpace(rest, buffer, in.gcount()); + + for (int i = 0; i < pieces.size(); i++) { + if (columnOne) { firstCol = pieces[i]; columnOne=false; } + else { secondCol = pieces[i]; pairDone = true; columnOne=true; } + + if (pairDone) { + vector temp; + splitAtComma(secondCol, temp); + nameMap[firstCol] = temp; + pairDone = false; + } + } } in.close(); - + return nameMap.size(); - } catch(exception& e) { errorOut(e, "MothurOut", "readNames"); @@ -1398,17 +1569,30 @@ map MothurOut::readNames(string namefile) { ifstream in; openInputFile(namefile, in); + string rest = ""; + char buffer[4096]; + bool pairDone = false; + bool columnOne = true; + string firstCol, secondCol; + while (!in.eof()) { if (control_pressed) { break; } - string firstCol, secondCol; - in >> firstCol >> secondCol; gobble(in); - - int num = getNumNames(secondCol); - - nameMap[firstCol] = num; + in.read(buffer, 4096); + vector pieces = splitWhiteSpace(rest, buffer, in.gcount()); + + for (int i = 0; i < pieces.size(); i++) { + if (columnOne) { firstCol = pieces[i]; columnOne=false; } + else { secondCol = pieces[i]; pairDone = true; columnOne=true; } + + if (pairDone) { + int num = getNumNames(secondCol); + nameMap[firstCol] = num; + pairDone = false; + } + } } - in.close(); + in.close(); return nameMap; @@ -1427,27 +1611,41 @@ int MothurOut::readNames(string namefile, vector& nameVector, m ifstream in; openInputFile(namefile, in); + string rest = ""; + char buffer[4096]; + bool pairDone = false; + bool columnOne = true; + string firstCol, secondCol; + while (!in.eof()) { if (control_pressed) { break; } - string firstCol, secondCol; - in >> firstCol >> secondCol; gobble(in); - - int num = getNumNames(secondCol); - - map::iterator it = fastamap.find(firstCol); - if (it == fastamap.end()) { - error = 1; - mothurOut("[ERROR]: " + firstCol + " is not in your fastafile, but is in your namesfile, please correct."); mothurOutEndLine(); - }else { - seqPriorityNode temp(num, it->second, firstCol); - nameVector.push_back(temp); - } + in.read(buffer, 4096); + vector pieces = splitWhiteSpace(rest, buffer, in.gcount()); + + for (int i = 0; i < pieces.size(); i++) { + if (columnOne) { firstCol = pieces[i]; columnOne=false; } + else { secondCol = pieces[i]; pairDone = true; columnOne=true; } + + if (pairDone) { + int num = getNumNames(secondCol); + + map::iterator it = fastamap.find(firstCol); + if (it == fastamap.end()) { + error = 1; + mothurOut("[ERROR]: " + firstCol + " is not in your fastafile, but is in your namesfile, please correct."); mothurOutEndLine(); + }else { + seqPriorityNode temp(num, it->second, firstCol); + nameVector.push_back(temp); + } + + pairDone = false; + } + } } - in.close(); - + in.close(); + return error; - } catch(exception& e) { errorOut(e, "MothurOut", "readNames"); @@ -1882,6 +2080,26 @@ void MothurOut::splitAtDash(string& estim, set& container) { exit(1); } } +/***********************************************************************/ +string MothurOut::makeList(vector& names) { + try { + string list = ""; + + if (names.size() == 0) { return list; } + + for (int i = 0; i < names.size()-1; i++) { list += names[i] + ","; } + + //get last name + list += names[names.size()-1]; + + return list; + } + catch(exception& e) { + errorOut(e, "MothurOut", "makeList"); + exit(1); + } +} + /***********************************************************************/ //This function parses the a string and puts peices in a vector void MothurOut::splitAtComma(string& estim, vector& container) { @@ -1919,6 +2137,25 @@ void MothurOut::splitAtComma(string& estim, vector& container) { exit(1); } } +/***********************************************************************/ +//This function splits up the various option parameters +void MothurOut::splitAtChar(string& prefix, string& suffix, char c){ + try { + prefix = suffix.substr(0,suffix.find_first_of(c)); + if ((suffix.find_first_of(c)+2) <= suffix.length()) { //checks to make sure you don't have comma at end of string + suffix = suffix.substr(suffix.find_first_of(c)+1, suffix.length()); + string space = " "; + while(suffix.at(0) == ' ') + suffix = suffix.substr(1, suffix.length()); + } + + } + catch(exception& e) { + errorOut(e, "MothurOut", "splitAtComma"); + exit(1); + } +} + /***********************************************************************/ //This function splits up the various option parameters