X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=mothur.h;h=32f4778a7c1ee19db25eeb4e1eafaf74fabcd617;hp=f839328cd2c304330fb18f31fb97eea531ef625a;hb=d1c97b8c04bb75faca1e76ffad60b37a4d789d3d;hpb=a5afca18544555fba2d9c3670ad1f8574916b0a0 diff --git a/mothur.h b/mothur.h index f839328..32f4778 100644 --- a/mothur.h +++ b/mothur.h @@ -23,6 +23,7 @@ #include #include + //exception #include #include @@ -35,21 +36,30 @@ #include #include #include +#include //math #include #include #include +#include //misc #include #include #include +#ifdef USE_MPI + #include "mpi.h" +#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 @@ -57,10 +67,14 @@ #include #endif - //#include - //#include #else #include //allows unbuffered screen capture from stdin + #include //get cwd + #include + #include + #include + #include + #endif using namespace std; @@ -74,6 +88,7 @@ using namespace std; typedef unsigned long ull; +typedef unsigned short intDist; struct IntNode { int lvalue; @@ -93,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; @@ -100,7 +149,84 @@ struct clusterNode { int smallChild; //used to make linkTable work with list and rabund. represents bin number of this cluster node clusterNode(int num, int par, int kid) : numSeq(num), parent(par), smallChild(kid) {}; }; - +/************************************************************/ +struct seqDist { + int seq1; + int seq2; + double dist; + seqDist() {} + 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 @@ -112,669 +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 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 void mothurOut(string message) { - try{ - ofstream out; - string logFileName = "mothur.logFile"; - openOutputFileAppend(logFileName, out); - - cout << message; - out << message; - - out.close(); - } - catch(exception& e) { - cout << "Error in mothur class mothurOut" << endl; - exit(1); - } -} -/**************************************************************************************************/ - -inline void mothurOut(string message, string precision) { - try{ - ofstream out; - string logFileName = "mothur.logFile"; - openOutputFileAppend(logFileName, out); - - cout << precision << message; - out << precision << message; - - out.close(); - } - catch(exception& e) { - cout << "Error in mothur class mothurOut" << endl; - exit(1); - } -} - -/**************************************************************************************************/ - -inline void mothurOutEndLine() { - try { - ofstream out; - string logFileName = "mothur.logFile"; - openOutputFileAppend(logFileName, out); + stringstream output; - cout << endl; - out << endl; + output.precision(i); + output << fixed << x; - out.close(); - } - catch(exception& e) { - cout << "error in mothur mothurOutEndLine" << endl; - exit(1); - } -} - - -/**************************************************************************************************/ - -inline void errorOut(exception& e, string object, string function) { - - mothurOut("Error: "); - mothurOut(toString(e.what())); - mothurOut(" has occurred in the " + object + " class function " + function + ". Please contact Pat Schloss at mothur.bugs@gmail.com, and be sure to include the mothur.logFile with your inquiry."); - mothurOutEndLine(); - -} - -/***********************************************************************/ - -inline bool isTrue(string f){ + return output.str(); - 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 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; - - 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(file),istreambuf_iterator(), '>'); - file.seekg(0); - return 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 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) { - errorOut(e, "mothur", "splitAtDash"); - 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) { - errorOut(e, "mothur", "splitAtDash"); - 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) { - errorOut(e, "mothur", "splitAtDash"); - 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) { - errorOut(e, "mothur", "splitAtComma"); - 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) { - errorOut(e, "mothur", "splitAtComma"); - 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) { - errorOut(e, "mothur", "splitAtEquals"); - 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) { - errorOut(e, "mothur", "inUsersGroups"); - exit(1); - } -} - -/**************************************************************************************************/ - -inline void mothurOutJustToLog(string message) { - try { - ofstream out; - string logFileName = "mothur.logFile"; - openOutputFileAppend(logFileName, out); - - out << message; - - out.close(); - } - catch(exception& e) { - errorOut(e, "mothur", "mothurOutJustToLog"); - exit(1); - } -} - - -/**************************************************************************************************/ - -inline void mothurOut(float num) { - try { - ofstream out; - string logFileName = "mothur.logFile"; - openOutputFileAppend(logFileName, out); - - cout << num; - out << num; - - out.close(); - } - catch(exception& e) { - cout << "Error in mothur class mothurOut float" << endl; - exit(1); - } -} -/***********************************************************************/ -inline void mothurOut(double value) { - try { - ofstream out; - string logFileName = "mothur.logFile"; - openOutputFileAppend(logFileName, out); - - cout << value; - out << value; - - out.close(); - } - catch(exception& e) { - cout << "Error in mothur class mothurOut double" << endl; - exit(1); - } +template +T fromString(const string& s){ + istringstream stream (s); + T t; + stream >> t; + return t; } -/***********************************************************************/ -//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 { convert(label, labelFloat); } - - //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 == "") { mothurOut(*it + " is not a valid label."); mothurOutEndLine(); } - 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 == "") { mothurOut("Your file does not include the label unique."); mothurOutEndLine(); } - userLabels.erase("unique"); - } - else { - 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]) { - s = it2->first; - //remove small labels - userLabels.erase(s); - break; - } - } - 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; } - } - - return smaller; - - } - catch(exception& e) { - errorOut(e, "mothur", "anyLabelsToProcess"); - exit(1); - } -} +//********************************************************************************************************************** -/**************************************************************************************************/ #endif