X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=mothurout.cpp;h=6ecb86f94e5533165551ed5ae571f0c51f3c9ff9;hb=05c52893c6c2467381fe7e7b769d86b6209af2e1;hp=c80bff27e4ab69bf26d0fddaae534fe625f6df0b;hpb=ae57e166b2ed7b475ec3f466106bd76fabadd063;p=mothur.git diff --git a/mothurout.cpp b/mothurout.cpp index c80bff2..6ecb86f 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 { @@ -143,7 +221,7 @@ void MothurOut::setDefaultPath(string pathname) { //add / to name if needed string lastChar = pathname.substr(pathname.length()-1); - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) if (lastChar != "/") { pathname += "/"; } #else if (lastChar != "\\") { pathname += "\\"; } @@ -212,8 +290,8 @@ void MothurOut::mothurOut(string output) { if (pid == 0) { //only one process should output to screen #endif - cout << output; out << output; + logger() << output; #ifdef USE_MPI } @@ -234,8 +312,8 @@ void MothurOut::mothurOutEndLine() { if (pid == 0) { //only one process should output to screen #endif - cout << endl; out << endl; + logger() << endl; #ifdef USE_MPI } @@ -257,13 +335,15 @@ void MothurOut::mothurOut(string output, ofstream& outputFile) { if (pid == 0) { //only one process should output to screen #endif - cout << output; + out << output; outputFile << output; + logger() << output; #ifdef USE_MPI } #endif + } catch(exception& e) { errorOut(e, "MothurOut", "MothurOut"); @@ -280,9 +360,9 @@ void MothurOut::mothurOutEndLine(ofstream& outputFile) { if (pid == 0) { //only one process should output to screen #endif - cout << endl; out << endl; outputFile << endl; + logger() << endl; #ifdef USE_MPI } @@ -332,7 +412,7 @@ void MothurOut::errorOut(exception& e, string object, string function) { // // On failure, returns 0.0, 0.0 int MothurOut::mem_usage(double& vm_usage, double& resident_set) { - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) vm_usage = 0.0; resident_set = 0.0; @@ -434,7 +514,7 @@ void MothurOut::gobble(istream& f){ char d; while(isspace(d=f.get())) { ;} - f.putback(d); + if(!f.eof()) { f.putback(d); } } catch(exception& e) { errorOut(e, "MothurOut", "gobble"); @@ -446,7 +526,7 @@ void MothurOut::gobble(istringstream& f){ try { char d; while(isspace(d=f.get())) {;} - f.putback(d); + if(!f.eof()) { f.putback(d); } } catch(exception& e) { errorOut(e, "MothurOut", "gobble"); @@ -504,7 +584,7 @@ string MothurOut::getline(ifstream& fileHandle) { } /***********************************************************************/ -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) #ifdef USE_COMPRESSION inline bool endsWith(string s, const char * suffix){ size_t suffixLength = strlen(suffix); @@ -518,7 +598,7 @@ string MothurOut::getRootName(string longName){ string rootName = longName; -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) #ifdef USE_COMPRESSION if (endsWith(rootName, ".gz") || endsWith(rootName, ".bz2")) { int pos = rootName.find_last_of('.'); @@ -596,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 = ""; @@ -619,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('.'); @@ -673,7 +795,7 @@ string MothurOut::getFullPathName(string fileName){ string cwd; //get current working directory - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) if (path.find("~") != -1) { //go to home directory string homeDir; @@ -726,7 +848,7 @@ string MothurOut::getFullPathName(string fileName){ }else if (path[(pos-1)] == '/') { //you want the current working dir ./ path = path.substr(0, pos); }else if (pos == 1) { break; //you are at the end - }else { cout << "cannot resolve path for " << fileName << endl; return fileName; } + }else { mothurOut("cannot resolve path for " + fileName + "\n"); return fileName; } } for (int i = index; i >= 0; i--) { @@ -772,7 +894,7 @@ string MothurOut::getFullPathName(string fileName){ }else if (path[(pos-1)] == '\\') { //you want the current working dir ./ path = path.substr(0, pos); }else if (pos == 1) { break; //you are at the end - }else { cout << "cannot resolve path for " << fileName << endl; return fileName; } + }else { mothurOut("cannot resolve path for " + fileName + "\n"); return fileName; } } for (int i = index; i >= 0; i--) { @@ -796,7 +918,7 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle, string m){ try { //get full path name string completeFileName = getFullPathName(fileName); -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) #ifdef USE_COMPRESSION // check for gzipped or bzipped file if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { @@ -842,7 +964,7 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle){ //get full path name string completeFileName = getFullPathName(fileName); -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) #ifdef USE_COMPRESSION // check for gzipped or bzipped file if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { @@ -891,10 +1013,10 @@ int MothurOut::renameFile(string oldName, string newName){ try { ifstream inTest; int exist = openInputFile(newName, inTest, ""); + inTest.close(); - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) if (exist == 0) { //you could open it so you want to delete it - inTest.close(); string command = "rm " + newName; system(command.c_str()); } @@ -920,7 +1042,7 @@ int MothurOut::openOutputFile(string fileName, ofstream& fileHandle){ try { string completeFileName = getFullPathName(fileName); -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) #ifdef USE_COMPRESSION // check for gzipped file if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { @@ -958,7 +1080,7 @@ int MothurOut::openOutputFile(string fileName, ofstream& fileHandle){ } /**************************************************************************************************/ -void MothurOut::appendFiles(string temp, string filename) { +int MothurOut::appendFiles(string temp, string filename) { try{ ofstream output; ifstream input; @@ -968,15 +1090,19 @@ void MothurOut::appendFiles(string temp, string filename) { int ableToOpen = openInputFile(temp, input, "no error"); //int ableToOpen = openInputFile(temp, input); + int numLines = 0; if (ableToOpen == 0) { //you opened it - while(char c = input.get()){ + while(!input.eof()){ + char c = input.get(); if(input.eof()) { break; } - else { output << c; } + else { output << c; if (c == '\n') {numLines++;} } } input.close(); } output.close(); + + return numLines; } catch(exception& e) { errorOut(e, "MothurOut", "appendFiles"); @@ -993,7 +1119,7 @@ string MothurOut::sortFile(string distFile, string outputDir){ //if you can, use the unix sort since its been optimized for years - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) string command = "sort -n -k +3 " + distFile + " -o " + outfile; system(command.c_str()); #else //you are stuck with my best attempt... @@ -1148,7 +1274,7 @@ vector MothurOut::setFilePosEachLine(string filename, int& n while(isspace(d) && (d != in.eof())) { d=in.get(); count++;} } positions.push_back(count-1); - cout << count-1 << endl; + //cout << count-1 << endl; } in.close(); @@ -1179,7 +1305,6 @@ vector MothurOut::setFilePosEachLine(string filename, int& n vector MothurOut::divideFile(string filename, int& proc) { try{ - vector filePos; filePos.push_back(0); @@ -1187,7 +1312,7 @@ vector MothurOut::divideFile(string filename, int& proc) { unsigned long long size; filename = getFullPathName(filename); - + //get num bytes in file pFile = fopen (filename.c_str(),"rb"); if (pFile==NULL) perror ("Error opening file"); @@ -1196,7 +1321,9 @@ vector MothurOut::divideFile(string filename, int& proc) { size=ftell (pFile); fclose (pFile); } - + + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + //estimate file breaks unsigned long long chunkSize = 0; chunkSize = size / proc; @@ -1216,7 +1343,10 @@ vector MothurOut::divideFile(string filename, int& proc) { unsigned long long newSpot = spot; while (!in.eof()) { char c = in.get(); + if (c == '>') { in.putback(c); newSpot = in.tellg(); break; } + else if (int(c) == -1) { break; } + } //there was not another sequence before the end of the file @@ -1230,14 +1360,18 @@ vector MothurOut::divideFile(string filename, int& proc) { //save end pos filePos.push_back(size); - + //sanity check filePos for (int i = 0; i < (filePos.size()-1); i++) { if (filePos[(i+1)] <= filePos[i]) { filePos.erase(filePos.begin()+(i+1)); i--; } } proc = (filePos.size() - 1); - +#else + mothurOut("[ERROR]: Windows version should not be calling the divideFile function."); mothurOutEndLine(); + proc=1; + filePos.push_back(size); +#endif return filePos; } catch(exception& e) { @@ -1338,7 +1472,36 @@ int MothurOut::readNames(string namefile, map& nameMap) { } in.close(); - return 0; + return nameMap.size(); + + } + catch(exception& e) { + errorOut(e, "MothurOut", "readNames"); + exit(1); + } +} +/**********************************************************************************************************************/ +int MothurOut::readNames(string namefile, map >& nameMap) { + try { + + //open input file + ifstream in; + openInputFile(namefile, in); + + while (!in.eof()) { + if (control_pressed) { break; } + + string firstCol, secondCol; + in >> firstCol >> secondCol; gobble(in); + + vector temp; + splitAtComma(secondCol, temp); + + nameMap[firstCol] = temp; + } + in.close(); + + return nameMap.size(); } catch(exception& e) { @@ -1346,7 +1509,6 @@ int MothurOut::readNames(string namefile, map& nameMap) { exit(1); } } - /**********************************************************************************************************************/ map MothurOut::readNames(string namefile) { try { @@ -1361,7 +1523,8 @@ map MothurOut::readNames(string namefile) { if (control_pressed) { break; } string firstCol, secondCol; - in >> firstCol >> secondCol; gobble(in); + in >> firstCol; gobble(in); + in >> secondCol; gobble(in); int num = getNumNames(secondCol); @@ -1438,16 +1601,121 @@ int MothurOut::getNumNames(string names){ } /***********************************************************************/ -void MothurOut::mothurRemove(string filename){ +int MothurOut::getNumChar(string line, char c){ + try { + int count = 0; + + if(line != ""){ + for(int i=0;i > MothurOut::binomial(int maxOrder){ @@ -1736,6 +2004,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) { @@ -1773,6 +2061,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 @@ -1989,6 +2296,46 @@ bool MothurOut::isContainingOnlyDigits(string input) { } } /**************************************************************************************************/ +int MothurOut::removeConfidences(string& tax) { + try { + + string taxon; + string newTax = ""; + + while (tax.find_first_of(';') != -1) { + + if (control_pressed) { return 0; } + + //get taxon + taxon = tax.substr(0,tax.find_first_of(';')); + + int pos = taxon.find_last_of('('); + if (pos != -1) { + //is it a number? + int pos2 = taxon.find_last_of(')'); + if (pos2 != -1) { + string confidenceScore = taxon.substr(pos+1, (pos2-(pos+1))); + if (isNumeric1(confidenceScore)) { + taxon = taxon.substr(0, pos); //rip off confidence + } + } + } + taxon += ";"; + + tax = tax.substr(tax.find_first_of(';')+1, tax.length()); + newTax += taxon; + } + + tax = newTax; + + return 0; + } + catch(exception& e) { + errorOut(e, "MothurOut", "removeConfidences"); + exit(1); + } +} +/**************************************************************************************************/