X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=mothur.h;h=ec56c506c8c0c7654c4e436afa16222f14b1224f;hb=e7fe6dd9db877b98c362f9524c3130bbbd037200;hp=36d7b28ebf45dd3f4bf1d0555c74f4e99c841fe9;hpb=c5c7502f435e1413c19e373dab1dfebcaa67588d;p=mothur.git diff --git a/mothur.h b/mothur.h index 36d7b28..ec56c50 100644 --- a/mothur.h +++ b/mothur.h @@ -15,6 +15,7 @@ using namespace std; /* This file contains all the standard incudes we use in the project as well as some common utilities. */ +//#include //io libraries #include @@ -39,9 +40,32 @@ using namespace std; #include #include #include +#include + +#ifdef _WIN32 + #define exp(x) (exp((double) x)) + #define sqrt(x) (sqrt((double) x)) + #define log10(x) (log10((double) x)) + #define log2(x) (log10(x)/log10(2)) +#endif + typedef unsigned long long ull; +struct IntNode { + int lvalue; + int rvalue; + int lcoef; + int rcoef; + IntNode* left; + IntNode* right; +}; + +struct ThreadNode { + int* pid; + IntNode* left; + IntNode* right; +}; /***********************************************************************/ @@ -64,6 +88,19 @@ inline void convert(const string& s, T& x, bool failIfLeftoverChars = true){ } //********************************************************************************************************************** +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; +} + +//********************************************************************************************************************** + template inline bool convertTest(const string& s, T& x, bool failIfLeftoverChars = true){ istringstream i(s); @@ -95,7 +132,6 @@ string toHex(const T&x){ return output.str(); } - //********************************************************************************************************************** template @@ -118,6 +154,13 @@ inline void gobble(istream& f){ f.putback(d); } +/***********************************************************************/ + +inline bool isTrue(string f){ + + if ((f == "TRUE") || (f == "T") || (f == "true") || (f == "t")) { return true; } + else { return false; } +} /***********************************************************************/ @@ -206,11 +249,30 @@ inline string getSimpleName(string longName){ /***********************************************************************/ +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; + } /***********************************************************************/ @@ -424,8 +525,87 @@ inline bool inUsersGroups(string groupname, vector Groups) { } } -/**************************************************************************************************/ +/***********************************************************************/ +//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 == "") { 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 "; } + 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 class Function anyLabelsToProcess. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } + catch(...) { + cout << "An unknown error has occurred in the mothur class function anyLabelsToProcess. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; + exit(1); + } +} +/**************************************************************************************************/ #endif