X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=mothurout.cpp;h=b30ee3ca630c91fea01343c9d873e709e027a4fb;hb=8173238f9f94af9baab8471de58bed7c8830948d;hp=fe3ea097e64faf1b0418f22fa3b248b026ad4dd1;hpb=27554f2d86c52785a573d4a9fb0cbcc6a3602269;p=mothur.git diff --git a/mothurout.cpp b/mothurout.cpp index fe3ea09..b30ee3c 100644 --- a/mothurout.cpp +++ b/mothurout.cpp @@ -9,6 +9,7 @@ #include "mothurout.h" + /******************************************************/ MothurOut* MothurOut::getInstance() { if( _uniqueInstance == 0) { @@ -60,6 +61,16 @@ void MothurOut::setDefaultPath(string pathname) { } } /*********************************************************************************************/ +void MothurOut::setOutputDir(string pathname) { + try { + outputDir = pathname; + } + catch(exception& e) { + errorOut(e, "MothurOut", "setOutputDir"); + exit(1); + } +} +/*********************************************************************************************/ void MothurOut::closeLog() { try { @@ -257,6 +268,8 @@ int MothurOut::mem_usage(double& vm_usage, double& resident_set) { /***********************************************************************/ int MothurOut::openOutputFileAppend(string fileName, ofstream& fileHandle){ try { + fileName = getFullPathName(fileName); + fileHandle.open(fileName.c_str(), ios::app); if(!fileHandle) { mothurOut("[ERROR]: Could not open " + fileName); mothurOutEndLine(); @@ -274,8 +287,9 @@ int MothurOut::openOutputFileAppend(string fileName, ofstream& fileHandle){ /***********************************************************************/ void MothurOut::gobble(istream& f){ try { + char d; - while(isspace(d=f.get())) {;} + while(isspace(d=f.get())) { ;} f.putback(d); } catch(exception& e) { @@ -346,14 +360,32 @@ string MothurOut::getline(ifstream& fileHandle) { } /***********************************************************************/ +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#ifdef USE_COMPRESSION +inline bool endsWith(string s, const char * suffix){ + size_t suffixLength = strlen(suffix); + return s.size() >= suffixLength && s.substr(s.size() - suffixLength, suffixLength).compare(suffix) == 0; +} +#endif +#endif + string MothurOut::getRootName(string longName){ try { string rootName = longName; - - if(longName.find_last_of(".") != longName.npos){ - int pos = longName.find_last_of('.')+1; - rootName = longName.substr(0, pos); + +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#ifdef USE_COMPRESSION + if (endsWith(rootName, ".gz") || endsWith(rootName, ".bz2")) { + int pos = rootName.find_last_of('.'); + rootName = rootName.substr(0, pos); + cerr << "shortening " << longName << " to " << rootName << "\n"; + } +#endif +#endif + if(rootName.find_last_of(".") != rootName.npos){ + int pos = rootName.find_last_of('.')+1; + rootName = rootName.substr(0, pos); } return rootName; @@ -445,6 +477,9 @@ string MothurOut::getExtension(string longName){ /***********************************************************************/ bool MothurOut::isBlank(string fileName){ try { + + fileName = getFullPathName(fileName); + ifstream fileHandle; fileHandle.open(fileName.c_str()); if(!fileHandle) { @@ -481,19 +516,29 @@ string MothurOut::getFullPathName(string fileName){ #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) if (path.find("~") != -1) { //go to home directory - string homeDir = getenv ("HOME"); + string homeDir; + + char *homepath = NULL; + homepath = getenv ("HOME"); + if ( homepath != NULL) { homeDir = homepath; } + else { homeDir = ""; } + newFileName = homeDir + fileName.substr(fileName.find("~")+1); return newFileName; }else { //find path - if (path.rfind("./") == -1) { return fileName; } //already complete name + if (path.rfind("./") == string::npos) { return fileName; } //already complete name else { newFileName = fileName.substr(fileName.rfind("./")+2); } //save the complete part of the name - char* cwdpath = new char[1024]; + //char* cwdpath = new char[1024]; + //size_t size; + //cwdpath=getcwd(cwdpath,size); + //cwd = cwdpath; + + char *cwdpath = NULL; + cwdpath = getcwd(NULL, 0); // or _getcwd + if ( cwdpath != NULL) { cwd = cwdpath; } + else { cwd = ""; } - size_t size; - cwdpath=getcwd(cwdpath,size); - - cwd = cwdpath; //rip off first '/' string simpleCWD; @@ -501,7 +546,7 @@ string MothurOut::getFullPathName(string fileName){ //break apart the current working directory vector dirs; - while (simpleCWD.find_first_of('/') != -1) { + while (simpleCWD.find_first_of('/') != string::npos) { string dir = simpleCWD.substr(0,simpleCWD.find_first_of('/')); simpleCWD = simpleCWD.substr(simpleCWD.find_first_of('/')+1, simpleCWD.length()); dirs.push_back(dir); @@ -512,7 +557,7 @@ string MothurOut::getFullPathName(string fileName){ int index = dirs.size()-1; - while((pos = path.rfind("./")) != -1) { //while you don't have a complete path + while((pos = path.rfind("./")) != string::npos) { //while you don't have a complete path if (pos == 0) { break; //you are at the end }else if (path[(pos-1)] == '.') { //you want your parent directory ../ path = path.substr(0, pos-1); @@ -532,12 +577,12 @@ string MothurOut::getFullPathName(string fileName){ return newFileName; } #else - if (path.find("~") != -1) { //go to home directory + if (path.find("~") != string::npos) { //go to home directory string homeDir = getenv ("HOMEPATH"); newFileName = homeDir + fileName.substr(fileName.find("~")+1); return newFileName; }else { //find path - if (path.rfind(".\\") == -1) { return fileName; } //already complete name + if (path.rfind(".\\") == string::npos) { return fileName; } //already complete name else { newFileName = fileName.substr(fileName.rfind(".\\")+2); } //save the complete part of the name char *cwdpath = NULL; @@ -558,7 +603,7 @@ string MothurOut::getFullPathName(string fileName){ int index = dirs.size()-1; - while((pos = path.rfind(".\\")) != -1) { //while you don't have a complete path + while((pos = path.rfind(".\\")) != string::npos) { //while you don't have a complete path if (pos == 0) { break; //you are at the end }else if (path[(pos-1)] == '.') { //you want your parent directory ../ path = path.substr(0, pos-1); @@ -591,9 +636,33 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle, string m){ try { //get full path name string completeFileName = getFullPathName(fileName); - +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#ifdef USE_COMPRESSION + // check for gzipped or bzipped file + if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { + string tempName = string(tmpnam(0)); + mkfifo(tempName.c_str(), 0666); + int fork_result = fork(); + if (fork_result < 0) { + cerr << "Error forking.\n"; + exit(1); + } else if (fork_result == 0) { + string command = (endsWith(completeFileName, ".gz") ? "zcat " : "bzcat ") + completeFileName + string(" > ") + tempName; + cerr << "Decompressing " << completeFileName << " via temporary named pipe " << tempName << "\n"; + system(command.c_str()); + cerr << "Done decompressing " << completeFileName << "\n"; + remove(tempName.c_str()); + exit(EXIT_SUCCESS); + } else { + cerr << "waiting on child process " << fork_result << "\n"; + completeFileName = tempName; + } + } +#endif +#endif fileHandle.open(completeFileName.c_str()); if(!fileHandle) { + //mothurOut("[ERROR]: Could not open " + completeFileName); mothurOutEndLine(); return 1; }else { //check for blank file @@ -610,8 +679,33 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle, string m){ int MothurOut::openInputFile(string fileName, ifstream& fileHandle){ try { + //get full path name string completeFileName = getFullPathName(fileName); +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#ifdef USE_COMPRESSION + // check for gzipped or bzipped file + if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { + string tempName = string(tmpnam(0)); + mkfifo(tempName.c_str(), 0666); + int fork_result = fork(); + if (fork_result < 0) { + cerr << "Error forking.\n"; + exit(1); + } else if (fork_result == 0) { + string command = (endsWith(completeFileName, ".gz") ? "zcat " : "bzcat ") + completeFileName + string(" > ") + tempName; + cerr << "Decompressing " << completeFileName << " via temporary named pipe " << tempName << "\n"; + system(command.c_str()); + cerr << "Done decompressing " << completeFileName << "\n"; + remove(tempName.c_str()); + exit(EXIT_SUCCESS); + } else { + cerr << "waiting on child process " << fork_result << "\n"; + completeFileName = tempName; + } + } +#endif +#endif fileHandle.open(completeFileName.c_str()); if(!fileHandle) { @@ -666,7 +760,27 @@ int MothurOut::openOutputFile(string fileName, ofstream& fileHandle){ try { string completeFileName = getFullPathName(fileName); - +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#ifdef USE_COMPRESSION + // check for gzipped file + if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) { + string tempName = string(tmpnam(0)); + mkfifo(tempName.c_str(), 0666); + cerr << "Compressing " << completeFileName << " via temporary named pipe " << tempName << "\n"; + int fork_result = fork(); + if (fork_result < 0) { + cerr << "Error forking.\n"; + exit(1); + } else if (fork_result == 0) { + string command = string(endsWith(completeFileName, ".gz") ? "gzip" : "bzip2") + " -v > " + completeFileName + string(" < ") + tempName; + system(command.c_str()); + exit(0); + } else { + completeFileName = tempName; + } + } +#endif +#endif fileHandle.open(completeFileName.c_str(), ios::trunc); if(!fileHandle) { mothurOut("[ERROR]: Could not open " + completeFileName); mothurOutEndLine(); @@ -692,6 +806,7 @@ void MothurOut::appendFiles(string temp, string filename) { //open output file in append mode openOutputFileAppend(filename, output); int ableToOpen = openInputFile(temp, input, "no error"); + //int ableToOpen = openInputFile(temp, input); if (ableToOpen == 0) { //you opened it while(char c = input.get()){ @@ -829,7 +944,8 @@ vector MothurOut::setFilePosFasta(string filename, int& num) /**************************************************************************************************/ vector MothurOut::setFilePosEachLine(string filename, int& num) { try { - + filename = getFullPathName(filename); + vector positions; ifstream in; openInputFile(filename, in); @@ -851,7 +967,7 @@ vector MothurOut::setFilePosEachLine(string filename, int& nu FILE * pFile; unsigned long int size; - + //get num bytes in file pFile = fopen (filename.c_str(),"rb"); if (pFile==NULL) perror ("Error opening file"); @@ -881,6 +997,8 @@ vector MothurOut::divideFile(string filename, int& proc) { FILE * pFile; unsigned long int size; + filename = getFullPathName(filename); + //get num bytes in file pFile = fopen (filename.c_str(),"rb"); if (pFile==NULL) perror ("Error opening file"); @@ -893,7 +1011,7 @@ vector MothurOut::divideFile(string filename, int& proc) { //estimate file breaks unsigned long int chunkSize = 0; chunkSize = size / proc; - + //file to small to divide by processors if (chunkSize == 0) { proc = 1; filePos.push_back(size); return filePos; } @@ -911,18 +1029,19 @@ vector MothurOut::divideFile(string filename, int& proc) { char c = in.get(); if (c == '>') { in.putback(c); newSpot = in.tellg(); break; } } - + //there was not another sequence before the end of the file unsigned long int sanityPos = in.tellg(); - if (sanityPos = -1) { break; } - else { filePos.push_back(newSpot); } + + if (sanityPos == -1) { break; } + else { filePos.push_back(newSpot); } in.close(); } //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--; } @@ -1089,7 +1208,20 @@ void MothurOut::getNumSeqs(ifstream& file, int& numSeqs){ //This function parses the estimator options and puts them in a vector void MothurOut::splitAtChar(string& estim, vector& container, char symbol) { try { - string individual; + string individual = ""; + int estimLength = estim.size(); + for(int i=0;i& container, char symbo } } //get last one - container.push_back(estim); + container.push_back(estim); */ } catch(exception& e) { errorOut(e, "MothurOut", "splitAtChar"); @@ -1112,7 +1244,21 @@ void MothurOut::splitAtChar(string& estim, vector& container, char symbo //This function parses the estimator options and puts them in a vector void MothurOut::splitAtDash(string& estim, vector& container) { try { - string individual; + string individual = ""; + int estimLength = estim.size(); + for(int i=0;i& container) { } } //get last one - container.push_back(estim); + container.push_back(estim); */ } catch(exception& e) { errorOut(e, "MothurOut", "splitAtDash"); @@ -1134,17 +1280,31 @@ void MothurOut::splitAtDash(string& estim, vector& container) { //This function parses the label options and puts them in a set void MothurOut::splitAtDash(string& estim, set& container) { try { - string individual; - - while (estim.find_first_of('-') != -1) { - individual = estim.substr(0,estim.find_first_of('-')); - if ((estim.find_first_of('-')+1) <= estim.length()) { //checks to make sure you don't have dash at end of string - estim = estim.substr(estim.find_first_of('-')+1, estim.length()); + string individual = ""; + int estimLength = estim.size(); + for(int i=0;i& userLabels, string } //go through users set and make them floats - for(it = userLabels.begin(); it != userLabels.end(); ++it) { + for(it = userLabels.begin(); it != userLabels.end();) { float temp; if ((*it != "unique") && (convertTestFloat(*it, temp) == true)){ convert(*it, temp); orderFloat.push_back(temp); userMap[*it] = temp; + it++; }else if (*it == "unique") { orderFloat.push_back(-1.0); userMap["unique"] = -1.0; + it++; }else { - if (errorOff == "") { cout << *it << " is not a valid label." << endl; } - userLabels.erase(*it); - it--; + if (errorOff == "") { mothurOut(*it + " is not a valid label."); mothurOutEndLine(); } + userLabels.erase(it++); } } @@ -1335,11 +1496,11 @@ bool MothurOut::anyLabelsToProcess(string label, set& userLabels, string if (orderFloat[i] < labelFloat) { smaller = true; if (orderFloat[i] == -1) { - if (errorOff == "") { cout << "Your file does not include the label unique." << endl; } + if (errorOff == "") { mothurOut("Your file does not include the label unique."); mothurOutEndLine(); } userLabels.erase("unique"); } else { - if (errorOff == "") { cout << "Your file does not include the label " << endl; } + if (errorOff == "") { mothurOut("Your file does not include the label "); mothurOutEndLine(); } string s = ""; for (it2 = userMap.begin(); it2!= userMap.end(); it2++) { if (it2->second == orderFloat[i]) { @@ -1349,7 +1510,7 @@ bool MothurOut::anyLabelsToProcess(string label, set& userLabels, string break; } } - if (errorOff == "") {cout << s << ". I will use the next smallest distance. " << endl; } + if (errorOff == "") {mothurOut( s + ". I will use the next smallest distance. "); mothurOutEndLine(); } } //since they are sorted once you find a bigger one stop looking }else { break; } @@ -1409,6 +1570,7 @@ bool MothurOut::checkReleaseVersion(ifstream& file, string version) { exit(1); } } + /**************************************************************************************************/