]> git.donarmstrong.com Git - mothur.git/blobdiff - mothur.h
pat's edits of screen.seqs and summary.seqs
[mothur.git] / mothur.h
index 36d7b28ebf45dd3f4bf1d0555c74f4e99c841fe9..f07f343b05d91148c64ebccc79b7d165bf51c8f7 100644 (file)
--- 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 <cstddef>
 
 //io libraries
 #include <iostream>
@@ -42,7 +43,15 @@ using namespace std;
 
 typedef unsigned long long ull;
 
-
+struct IntNode {
+       int lvalue;
+       int rvalue;
+       int lcoef;
+       int rcoef;
+       IntNode* left;
+       IntNode* right;
+};
+       
 /***********************************************************************/
 
 // snagged from http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.2
@@ -64,6 +73,19 @@ inline void convert(const string& s, T& x, bool failIfLeftoverChars = true){
 }
 //**********************************************************************************************************************
 
+template<typename T>
+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<typename T>
 inline bool convertTest(const string& s, T& x, bool failIfLeftoverChars = true){
        istringstream i(s);
@@ -95,7 +117,6 @@ string toHex(const T&x){
 
     return output.str();
 }
-
 //**********************************************************************************************************************
 
 template<typename T>
@@ -203,6 +224,24 @@ inline string getSimpleName(string longName){
 
        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<y){   return x;    }
+    else   {   return y;    }
+}
 
 /***********************************************************************/
 
@@ -210,7 +249,7 @@ inline string getPathName(string longName){
  
        string rootPathName = longName;
        
-       if(longName.find_last_of("/") != longName.npos){
+       if(longName.find_last_of('/') != longName.npos){
                int pos = longName.find_last_of('/')+1;
                rootPathName = longName.substr(0, pos);
        }
@@ -220,6 +259,20 @@ inline string getPathName(string longName){
 
 /***********************************************************************/
 
+inline string getExtension(string longName){
+       
+       string extension = longName;
+       
+       if(longName.find_last_of('.') != longName.npos){
+               int pos = longName.find_last_of('.');
+               extension = longName.substr(pos, longName.length());
+       }
+       
+       return extension;
+}
+
+/***********************************************************************/
+
 inline int openInputFile(string fileName, ifstream& fileHandle){
 
        fileHandle.open(fileName.c_str());
@@ -246,6 +299,31 @@ inline int openOutputFile(string fileName, ofstream& fileHandle){
                return 0;
        }
 
+}
+/***********************************************************************/
+
+inline int openOutputFileAppend(string fileName, ofstream& fileHandle){
+       
+       fileHandle.open(fileName.c_str(), ios::app);
+       if(!fileHandle) {
+               cerr << "Error: Could not open " << fileName << endl;
+               return 1;
+       }
+       else {
+               return 0;
+       }
+
+}
+
+
+/***********************************************************************/
+
+inline int getNumSeqs(ifstream& file){
+       
+       int numSeqs = count(istreambuf_iterator<char>(file),istreambuf_iterator<char>(), '>');
+       file.seekg(0);
+       return numSeqs;
+
 }
 
 /***********************************************************************/
@@ -424,8 +502,87 @@ inline bool inUsersGroups(string groupname, vector<string> 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<string>& userLabels, string errorOff) {
+       try {
+               set<string>::iterator it;
+               vector<float> orderFloat;
+               map<string, float> userMap;  //the conversion process removes trailing 0's which we need to put back
+               map<string, float>::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