X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=mothur.h;h=32f4778a7c1ee19db25eeb4e1eafaf74fabcd617;hp=765c90ab27026ee256f15fc7efc582a06eec5303;hb=d1c97b8c04bb75faca1e76ffad60b37a4d789d3d;hpb=e4c80376cc4533f66c8dfc18f3e1a86a60ac17fe diff --git a/mothur.h b/mothur.h index 765c90a..32f4778 100644 --- a/mothur.h +++ b/mothur.h @@ -36,11 +36,13 @@ #include #include #include +#include //math #include #include #include +#include //misc #include @@ -52,10 +54,12 @@ #endif /***********************************************************************/ -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) #include #include #include + #include + #include #include #ifdef USE_READLINE @@ -68,6 +72,8 @@ #include //get cwd #include #include + #include + #include #endif @@ -80,7 +86,9 @@ using namespace std; #define isnan(x) ((x) != (x)) #define isinf(x) (fabs(x) == std::numeric_limits::infinity()) + typedef unsigned long ull; +typedef unsigned short intDist; struct IntNode { int lvalue; @@ -100,6 +108,40 @@ struct ThreadNode { IntNode* right; }; +struct diffPair { + float prob; + float reverseProb; + + diffPair() { + prob = 0; reverseProb = 0; + } + diffPair(float p, float rp) { + prob = p; + reverseProb = rp; + } +}; +/***********************************************************************/ +struct PDistCell{ + ull index; + float dist; + PDistCell() : index(0), dist(0) {}; + PDistCell(ull c, float d) : index(c), dist(d) {} +}; +/***********************************************************************/ +struct consTax{ + string name; + string taxonomy; + int abundance; + consTax() : name(""), taxonomy("unknown"), abundance(0) {}; + consTax(string n, string t, int a) : name(n), taxonomy(t), abundance(a) {} +}; +/***********************************************************************/ +struct consTax2{ + string taxonomy; + int abundance; + consTax2() : taxonomy("unknown"), abundance(0) {}; + consTax2(string t, int a) : taxonomy(t), abundance(a) {} +}; /************************************************************/ struct clusterNode { int numSeq; @@ -111,16 +153,80 @@ struct clusterNode { struct seqDist { int seq1; int seq2; - float dist; + double dist; seqDist() {} - seqDist(int s1, int s2, float d) : seq1(s1), seq2(s2), dist(d) {} + seqDist(int s1, int s2, double d) : seq1(s1), seq2(s2), dist(d) {} ~seqDist() {} }; +/************************************************************/ +struct distlinePair { + int start; + int end; + +}; +/************************************************************/ +struct seqPriorityNode { + int numIdentical; + string seq; + string name; + seqPriorityNode() {} + seqPriorityNode(int n, string s, string nm) : numIdentical(n), seq(s), name(nm) {} + ~seqPriorityNode() {} +}; +/************************************************************/ +struct compGroup { + string group1; + string group2; + compGroup() {} + compGroup(string s, string nm) : group1(s), group2(nm) {} + string getCombo() { return group1+"-"+group2; } + ~compGroup() {} +}; +/***************************************************************/ +struct spearmanRank { + string name; + float score; + + spearmanRank(string n, float s) : name(n), score(s) {} +}; +//*********************************************************************** +inline bool compareIndexes(PDistCell left, PDistCell right){ + return (left.index > right.index); +} +//******************************************************************************************************************** +inline bool compareSpearman(spearmanRank left, spearmanRank right){ + return (left.score < right.score); +} +//******************************************************************************************************************** +//sorts highest to lowest +inline bool compareSeqPriorityNodes(seqPriorityNode left, seqPriorityNode right){ + if (left.numIdentical > right.numIdentical) { + return true; + }else if (left.numIdentical == right.numIdentical) { + if (left.seq > right.seq) { return true; } + else { return false; } + } + return false; +} + +/************************************************************/ +//sorts lowest to highest +inline bool compareDistLinePairs(distlinePair left, distlinePair right){ + return (left.end < right.end); +} //******************************************************************************************************************** //sorts lowest to highest inline bool compareSequenceDistance(seqDist left, seqDist right){ return (left.dist < right.dist); -} +} +//******************************************************************************************************************** +//returns sign of double +inline double sign(double temp){ + //find sign + if (temp > 0) { return 1.0; } + else if (temp < 0) { return -1.0; } + return 0; +} /***********************************************************************/ // snagged from http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.2 @@ -132,1052 +238,92 @@ public: }; //********************************************************************************************************************** - template -inline void convert(const string& s, T& x, bool failIfLeftoverChars = true){ - istringstream i(s); - char c; - if (!(i >> x) || (failIfLeftoverChars && i.get(c))) - throw BadConversion(s); +void convert(const string& s, T& x, bool failIfLeftoverChars = true){ + + istringstream i(s); + char c; + if (!(i >> x) || (failIfLeftoverChars && i.get(c))) + throw BadConversion(s); + } - +//********************************************************************************************************************** +template int sgn(T val){ return (val > T(0)) - (val < T(0)); } //********************************************************************************************************************** template -inline bool convertTestFloat(const string& s, T& x, bool failIfLeftoverChars = true){ - istringstream i(s); - char c; - if (!(i >> x) || (failIfLeftoverChars && i.get(c))) - { - return false; - } - return true; +bool convertTestFloat(const string& s, T& x, bool failIfLeftoverChars = true){ + + istringstream i(s); + char c; + if (!(i >> x) || (failIfLeftoverChars && i.get(c))) + { + return false; + } + return true; + } //********************************************************************************************************************** template -inline bool convertTest(const string& s, T& x, bool failIfLeftoverChars = true){ - istringstream i(s); - char c; - if (!(i >> x) || (failIfLeftoverChars && i.get(c))) - { - cout << "unable to be converted into an integer.\n" << endl; - return false; - } - return true; +bool convertTest(const string& s, T& x, bool failIfLeftoverChars = true){ + + istringstream i(s); + char c; + if (!(i >> x) || (failIfLeftoverChars && i.get(c))) + { + return false; + } + return true; + } - //********************************************************************************************************************** - template string toString(const T&x){ - stringstream output; - output << x; - return output.str(); + + stringstream output; + output << x; + return output.str(); + } //********************************************************************************************************************** template string toHex(const T&x){ - stringstream output; - output << hex << x; + stringstream output; + + output << hex << x; - return output.str(); + return output.str(); + } //********************************************************************************************************************** template string toString(const T&x, int i){ - stringstream output; - - output.precision(i); - output << fixed << x; - - return output.str(); -} -/***********************************************************************/ -inline int openOutputFileAppend(string fileName, ofstream& fileHandle){ - - fileHandle.open(fileName.c_str(), ios::app); - if(!fileHandle) { - cout << "Error: Could not open " << fileName << endl; - return 1; - } - else { - return 0; - } - -} -/***********************************************************************/ - -inline void gobble(istream& f){ - - char d; - while(isspace(d=f.get())) {;} - f.putback(d); - -} -/***********************************************************************/ - -inline void gobble(istringstream& f){ - - char d; - while(isspace(d=f.get())) {;} - f.putback(d); - -} - -/***********************************************************************/ - -inline string getline(istringstream& fileHandle) { - try { - - string line = ""; - - while (!fileHandle.eof()) { - //get next character - char c = fileHandle.get(); - - //are you at the end of the line - if ((c == '\n') || (c == '\r') || (c == '\f')){ break; } - else { line += c; } - } - - return line; - - } - catch(exception& e) { - cout << "Error in mothur function getline" << endl; - exit(1); - } -} -/***********************************************************************/ - -inline string getline(ifstream& fileHandle) { - try { - - string line = ""; - - while (!fileHandle.eof()) { - //get next character - char c = fileHandle.get(); - - //are you at the end of the line - if ((c == '\n') || (c == '\r') || (c == '\f')){ break; } - else { line += c; } - } - - return line; - - } - catch(exception& e) { - cout << "Error in mothur function getline" << endl; - exit(1); - } -} -/***********************************************************************/ - -inline bool isTrue(string f){ - - if ((f == "TRUE") || (f == "T") || (f == "true") || (f == "t")) { return true; } - else { return false; } -} - -/***********************************************************************/ - -inline float roundDist(float dist, int precision){ - - return int(dist * precision + 0.5)/float(precision); - -} -/***********************************************************************/ - -inline float ceilDist(float dist, int precision){ - - return int(ceil(dist * precision))/float(precision); - -} - -/***********************************************************************/ - -inline int getNumNames(string names){ - - int count = 0; - - if(names != ""){ - count = 1; - for(int i=0;i > binomial(int maxOrder){ - - vector > binomial(maxOrder+1); - - for(int i=0;i<=maxOrder;i++){ - binomial[i].resize(maxOrder+1); - binomial[i][0]=1; - binomial[0][i]=0; - } - binomial[0][0]=1; - - binomial[1][0]=1; - binomial[1][1]=1; - - for(int i=2;i<=maxOrder;i++){ - binomial[1][i]=0; - } - - for(int i=2;i<=maxOrder;i++){ - for(int j=1;j<=maxOrder;j++){ - if(i==j){ binomial[i][j]=1; } - if(j>i) { binomial[i][j]=0; } - else { binomial[i][j]=binomial[i-1][j-1]+binomial[i-1][j]; } - } - } - - return binomial; -} - -/***********************************************************************/ - -inline string getRootName(string longName){ - - string rootName = longName; - - if(longName.find_last_of(".") != longName.npos){ - int pos = longName.find_last_of('.')+1; - rootName = longName.substr(0, pos); - } - - return rootName; -} -/***********************************************************************/ - -inline string getSimpleName(string longName){ - - string simpleName = longName; - - size_t found; - found=longName.find_last_of("/\\"); - - if(found != longName.npos){ - simpleName = longName.substr(found+1); - } - - //if(longName.find_last_of("/") != longName.npos){ - // int pos = longName.find_last_of('/')+1; - // simpleName = longName.substr(pos, longName.length()); - //} - - return simpleName; -} - -/***********************************************************************/ - -inline int factorial(int num){ - int total = 1; - - for (int i = 1; i <= num; i++) { - total *= i; - } - - return total; -} -/************************************************************************************************** - -double min(double x, double y) -{ - if(x 0) { simpleCWD = cwd.substr(1); } - - //break apart the current working directory - vector dirs; - while (simpleCWD.find_first_of('/') != -1) { - string dir = simpleCWD.substr(0,simpleCWD.find_first_of('/')); - simpleCWD = simpleCWD.substr(simpleCWD.find_first_of('/')+1, simpleCWD.length()); - dirs.push_back(dir); - } - //get last one // ex. ../../../filename = /user/work/desktop/filename - dirs.push_back(simpleCWD); //ex. dirs[0] = user, dirs[1] = work, dirs[2] = desktop - - - int index = dirs.size()-1; - - while((pos = path.rfind("./")) != -1) { //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); - index--; - if (index == 0) { break; } - }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; } - } - - for (int i = index; i >= 0; i--) { - newFileName = dirs[i] + "/" + newFileName; - } - - newFileName = "/" + newFileName; - return newFileName; - } - #else - if (path.find("~") != -1) { //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 - else { newFileName = fileName.substr(fileName.rfind(".\\")+2); } //save the complete part of the name - - char *cwdpath = NULL; - cwdpath = getcwd(NULL, 0); // or _getcwd - if ( cwdpath != NULL) { cwd = cwdpath; } - else { cwd = ""; } - - //break apart the current working directory - vector dirs; - while (cwd.find_first_of('\\') != -1) { - string dir = cwd.substr(0,cwd.find_first_of('\\')); - cwd = cwd.substr(cwd.find_first_of('\\')+1, cwd.length()); - dirs.push_back(dir); + stringstream output; - } - //get last one - dirs.push_back(cwd); //ex. dirs[0] = user, dirs[1] = work, dirs[2] = desktop - - int index = dirs.size()-1; - - while((pos = path.rfind(".\\")) != -1) { //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); - index--; - if (index == 0) { break; } - }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; } - } - - for (int i = index; i >= 0; i--) { - newFileName = dirs[i] + "\\" + newFileName; - } - - return newFileName; - } - - #endif - } - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function getFullPathName. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} -/***********************************************************************/ - -inline int openInputFile(string fileName, ifstream& fileHandle, string m){ - - //get full path name - string completeFileName = getFullPathName(fileName); - - fileHandle.open(completeFileName.c_str()); - if(!fileHandle) { - return 1; - }else { - //check for blank file - gobble(fileHandle); - return 0; - } -} -/***********************************************************************/ - -inline int openInputFile(string fileName, ifstream& fileHandle){ - - //get full path name - string completeFileName = getFullPathName(fileName); - - fileHandle.open(completeFileName.c_str()); - if(!fileHandle) { - cout << "Error: Could not open " << completeFileName << endl; - return 1; - } - else { - //check for blank file - gobble(fileHandle); - if (fileHandle.eof()) { cout << completeFileName << " is blank. Please correct." << endl; } + output.precision(i); + output << fixed << x; - return 0; - } + return output.str(); } -/***********************************************************************/ - -inline int renameFile(string oldName, string newName){ - - ifstream inTest; - int exist = openInputFile(newName, inTest, ""); - -#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - if (exist == 0) { //you could open it so you want to delete it - inTest.close(); - string command = "rm " + newName; - system(command.c_str()); - } - - string command = "mv " + oldName + " " + newName; - system(command.c_str()); -#else - remove(newName.c_str()); - int renameOk = rename(oldName.c_str(), newName.c_str()); -#endif - return 0; -} - -/***********************************************************************/ - -inline int openOutputFile(string fileName, ofstream& fileHandle){ - - string completeFileName = getFullPathName(fileName); - - fileHandle.open(completeFileName.c_str(), ios::trunc); - if(!fileHandle) { - cout << "Error: Could not open " << completeFileName << endl; - return 1; - } - else { - return 0; - } - -} - -/***********************************************************************/ - -inline int getNumSeqs(ifstream& file){ - - int numSeqs = count(istreambuf_iterator(file),istreambuf_iterator(), '>'); - file.seekg(0); - return numSeqs; - -} -/***********************************************************************/ -inline void getNumSeqs(ifstream& file, int& numSeqs){ - - string input; - numSeqs = 0; - while(!file.eof()){ - input = getline(file); - if (input.length() != 0) { - if(input[0] == '>'){ numSeqs++; } - } - } -} - -/***********************************************************************/ - -inline bool inVector(string member, vector group){ - - for (int i = 0; i < group.size(); i++) { - if (group[i] == member) { return true; } - } - - return false; -} -/***********************************************************************/ - -//This function parses the estimator options and puts them in a vector -inline void splitAtChar(string& estim, vector& container, char symbol) { - try { - string individual; - - while (estim.find_first_of(symbol) != -1) { - individual = estim.substr(0,estim.find_first_of(symbol)); - if ((estim.find_first_of(symbol)+1) <= estim.length()) { //checks to make sure you don't have dash at end of string - estim = estim.substr(estim.find_first_of(symbol)+1, estim.length()); - container.push_back(individual); - } - } - //get last one - container.push_back(estim); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function splitAtDash. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} - -/***********************************************************************/ - -//This function parses the estimator options and puts them in a vector -inline void splitAtDash(string& estim, vector& 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()); - container.push_back(individual); - } - } - //get last one - container.push_back(estim); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function splitAtDash. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} - -/***********************************************************************/ -//This function parses the label options and puts them in a set -inline void 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()); - container.insert(individual); - } - } - //get last one - container.insert(estim); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function splitAtDash. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} -/***********************************************************************/ -//This function parses the line options and puts them in a set -inline void splitAtDash(string& estim, set& container) { - try { - string individual; - int lineNum; - - 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()); - convert(individual, lineNum); //convert the string to int - container.insert(lineNum); - } - } - //get last one - convert(estim, lineNum); //convert the string to int - container.insert(lineNum); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function splitAtDash. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} -/***********************************************************************/ -//This function parses the a string and puts peices in a vector -inline void splitAtComma(string& estim, vector& 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 comma at end of string - estim = estim.substr(estim.find_first_of(',')+1, estim.length()); - container.push_back(individual); - } - } - //get last one - container.push_back(estim); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function splitAtComma. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} -/***********************************************************************/ - -//This function splits up the various option parameters -inline void splitAtComma(string& prefix, string& suffix){ - try { - prefix = suffix.substr(0,suffix.find_first_of(',')); - if ((suffix.find_first_of(',')+2) <= suffix.length()) { //checks to make sure you don't have comma at end of string - suffix = suffix.substr(suffix.find_first_of(',')+1, suffix.length()); - string space = " "; - while(suffix.at(0) == ' ') - suffix = suffix.substr(1, suffix.length()); - } - - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function splitAtComma. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} -/***********************************************************************/ - -//This function separates the key value from the option value i.e. dist=96_... -inline void splitAtEquals(string& key, string& value){ - try { - if(value.find_first_of('=') != -1){ - key = value.substr(0,value.find_first_of('=')); - if ((value.find_first_of('=')+1) <= value.length()) { - value = value.substr(value.find_first_of('=')+1, value.length()); - } - }else{ - key = value; - value = 1; - } - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function splitAtEquals. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} - -/**************************************************************************************************/ - -inline bool inUsersGroups(string groupname, vector Groups) { - try { - for (int i = 0; i < Groups.size(); i++) { - if (groupname == Groups[i]) { return true; } - } - return false; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function inUsersGroups. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} -/**************************************************************************************************/ -//returns true if any of the strings in first vector are in second vector -inline bool inUsersGroups(vector groupnames, vector Groups) { - try { - - for (int i = 0; i < groupnames.size(); i++) { - if (inUsersGroups(groupnames[i], Groups)) { return true; } - } - return false; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function inUsersGroups. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} -/***********************************************************************/ -//this function determines if the user has given us labels that are smaller than the given label. -//if so then it returns true so that the calling function can run the previous valid distance. -//it's a "smart" distance function. It also checks for invalid labels. -inline bool anyLabelsToProcess(string label, set& userLabels, string errorOff) { - try { - - set::iterator it; - vector orderFloat; - map userMap; //the conversion process removes trailing 0's which we need to put back - map::iterator it2; - float labelFloat; - bool smaller = false; - - //unique is the smallest line - if (label == "unique") { return false; } - else { - if (convertTestFloat(label, labelFloat)) { - convert(label, labelFloat); - }else { //cant convert - return false; - } - } - - //go through users set and make them floats - for(it = userLabels.begin(); it != userLabels.end(); ++it) { - - float temp; - if ((*it != "unique") && (convertTestFloat(*it, temp) == true)){ - convert(*it, temp); - orderFloat.push_back(temp); - userMap[*it] = temp; - }else if (*it == "unique") { - orderFloat.push_back(-1.0); - userMap["unique"] = -1.0; - }else { - if (errorOff == "") { cout << *it << " is not a valid label." << endl; } - userLabels.erase(*it); - it--; - } - } - - //sort order - sort(orderFloat.begin(), orderFloat.end()); - - /*************************************************/ - //is this label bigger than any of the users labels - /*************************************************/ - - //loop through order until you find a label greater than label - for (int i = 0; i < orderFloat.size(); i++) { - if (orderFloat[i] < labelFloat) { - smaller = true; - if (orderFloat[i] == -1) { - if (errorOff == "") { cout << "Your file does not include the label unique." << endl; } - userLabels.erase("unique"); - } - else { - if (errorOff == "") { cout << "Your file does not include the label " << endl; } - string s = ""; - for (it2 = userMap.begin(); it2!= userMap.end(); it2++) { - if (it2->second == orderFloat[i]) { - s = it2->first; - //remove small labels - userLabels.erase(s); - break; - } - } - if (errorOff == "") {cout << s << ". I will use the next smallest distance. " << endl; } - } - //since they are sorted once you find a bigger one stop looking - }else { break; } - } - - return smaller; - - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function anyLabelsToProcess. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} - -/**************************************************************************************************/ -inline void appendFiles(string temp, string filename) { - try{ - ofstream output; - ifstream input; - - //open output file in append mode - openOutputFileAppend(filename, output); - int ableToOpen = openInputFile(temp, input, "no error"); - - if (ableToOpen == 0) { //you opened it - while(char c = input.get()){ - if(input.eof()) { break; } - else { output << c; } - } - input.close(); - } - - output.close(); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function appendFiles. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} - -/**************************************************************************************************/ -inline string sortFile(string distFile, string outputDir){ - try { - - //if (outputDir == "") { outputDir += hasPath(distFile); } - string outfile = getRootName(distFile) + "sorted.dist"; - - - //if you can, use the unix sort since its been optimized for years - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - string command = "sort -n -k +3 " + distFile + " -o " + outfile; - system(command.c_str()); - #else //you are stuck with my best attempt... - //windows sort does not have a way to specify a column, only a character in the line - //since we cannot assume that the distance will always be at the the same character location on each line - //due to variable sequence name lengths, I chose to force the distance into first position, then sort and then put it back. - - //read in file line by file and put distance first - string tempDistFile = distFile + ".temp"; - ifstream input; - ofstream output; - openInputFile(distFile, input); - openOutputFile(tempDistFile, output); - - string firstName, secondName; - float dist; - while (input) { - input >> firstName >> secondName >> dist; - output << dist << '\t' << firstName << '\t' << secondName << endl; - gobble(input); - } - input.close(); - output.close(); - - - //sort using windows sort - string tempOutfile = outfile + ".temp"; - string command = "sort " + tempDistFile + " /O " + tempOutfile; - system(command.c_str()); - - //read in sorted file and put distance at end again - ifstream input2; - openInputFile(tempOutfile, input2); - openOutputFile(outfile, output); - - while (input2) { - input2 >> dist >> firstName >> secondName; - output << firstName << '\t' << secondName << '\t' << dist << endl; - gobble(input2); - } - input2.close(); - output.close(); - - //remove temp files - remove(tempDistFile.c_str()); - remove(tempOutfile.c_str()); - #endif - - return outfile; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function sortfile. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} -/**************************************************************************************************/ -inline vector setFilePosFasta(string filename, int& num) { +//********************************************************************************************************************** - vector positions; - ifstream inFASTA; - openInputFile(filename, inFASTA); - - string input; - while(!inFASTA.eof()){ - input = getline(inFASTA); - if (input.length() != 0) { - if(input[0] == '>'){ unsigned long int pos = inFASTA.tellg(); positions.push_back(pos - input.length() - 1); } - } - gobble(inFASTA); //has to be here since windows line endings are 2 characters and mess up the positions - } - inFASTA.close(); - - num = positions.size(); - - /*FILE * pFile; - long size; - - //get num bytes in file - pFile = fopen (filename.c_str(),"rb"); - if (pFile==NULL) perror ("Error opening file"); - else{ - fseek (pFile, 0, SEEK_END); - size=ftell (pFile); - fclose (pFile); - }*/ - - unsigned long int size = positions[(positions.size()-1)]; - ifstream in; - openInputFile(filename, in); - - in.seekg(size); - - while(char c = in.get()){ - if(in.eof()) { break; } - else { size++; } - } - in.close(); - - positions.push_back(size); - - return positions; +template +T fromString(const string& s){ + istringstream stream (s); + T t; + stream >> t; + return t; } -/**************************************************************************************************/ -inline vector setFilePosEachLine(string filename, int& num) { - vector positions; - ifstream in; - openInputFile(filename, in); - - string input; - while(!in.eof()){ - unsigned long int lastpos = in.tellg(); - input = getline(in); - if (input.length() != 0) { - unsigned long int pos = in.tellg(); - if (pos != -1) { positions.push_back(pos - input.length() - 1); } - else { positions.push_back(lastpos); } - } - gobble(in); //has to be here since windows line endings are 2 characters and mess up the positions - } - in.close(); - - num = positions.size(); - - FILE * pFile; - unsigned long int size; - - //get num bytes in file - pFile = fopen (filename.c_str(),"rb"); - if (pFile==NULL) perror ("Error opening file"); - else{ - fseek (pFile, 0, SEEK_END); - size=ftell (pFile); - fclose (pFile); - } - - positions.push_back(size); - - return positions; -} -/**************************************************************************************************/ -inline bool checkReleaseVersion(ifstream& file, string version) { - try { - - bool good = true; - - string line = getline(file); +//********************************************************************************************************************** - //before we added this check - if (line[0] != '#') { good = false; } - else { - //rip off # - line = line.substr(1); - - vector versionVector; - splitAtChar(version, versionVector, '.'); - - //check file version - vector linesVector; - splitAtChar(line, linesVector, '.'); - - if (versionVector.size() != linesVector.size()) { good = false; } - else { - for (int j = 0; j < versionVector.size(); j++) { - int num1, num2; - convert(versionVector[j], num1); - convert(linesVector[j], num2); - - //if mothurs version is newer than this files version, then we want to remake it - if (num1 > num2) { good = false; break; } - } - } - - } - - if (!good) { file.close(); } - else { file.seekg(0); } - - return good; - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the mothur.h function checkReleaseVersion. Please contact Pat Schloss at mothur.bugs@gmail.com." << "\n"; - exit(1); - } -} -/**************************************************************************************************/ #endif