X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=mothur.h;h=9c9e23cf5a7a09279af66848fe1b1e3d972d8055;hb=4f4070ac3fbb5da75f834b48062e9123364b006e;hp=8ad1645a57a5345a7f48ca8236d83963d8700afc;hpb=50ed3b6104d5821d6184f882e1e1423d47dcbf10;p=mothur.git diff --git a/mothur.h b/mothur.h index 8ad1645..9c9e23c 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,6 +40,15 @@ 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; @@ -72,6 +82,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); @@ -125,6 +148,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; } +} /***********************************************************************/ @@ -221,6 +251,13 @@ inline int factorial(int num){ return total; } +/************************************************************************************************** + +double min(double x, double y) +{ + if(x(file),istreambuf_iterator(), '>'); + file.seekg(0); + return numSeqs; + } /***********************************************************************/ @@ -442,8 +518,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