]> git.donarmstrong.com Git - mothur.git/blobdiff - mothur.h
added groups option to read.otu, added qtrim option to trim.seqs, fixed bug in get...
[mothur.git] / mothur.h
index 07bb971347d974066ab5449614172c5e68d4c2a6..23b9f189c992f97e2e9a47823cacce62db363696 100644 (file)
--- a/mothur.h
+++ b/mothur.h
@@ -1,7 +1,6 @@
 #ifndef MOTHUR_H
 #define MOTHUR_H
 
-using namespace std;
 
 
 /*
@@ -41,7 +40,28 @@ using namespace std;
 #include <math.h>
 #include <algorithm>
 
-typedef unsigned long long ull;
+//misc
+#include <cerrno>
+#include <ctime>
+#include <limits>
+
+
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+       #include <sys/wait.h>
+       #include <unistd.h>
+#endif
+
+using namespace std;
+
+#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))
+#define isnan(x) ((x) != (x))
+#define isinf(x) (fabs(x) == std::numeric_limits<double>::infinity())
+
+
+typedef unsigned long ull;
 
 struct IntNode {
        int lvalue;
@@ -51,7 +71,21 @@ struct IntNode {
        IntNode* left;
        IntNode* right;
 };
-       
+
+struct ThreadNode {
+       int* pid;
+       IntNode* left;
+       IntNode* right;
+};
+
+/************************************************************/
+struct clusterNode {
+       int numSeq;
+       int parent;
+       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) {};
+};
+
 /***********************************************************************/
 
 // snagged from http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.2
@@ -71,6 +105,7 @@ inline void convert(const string& s, T& x, bool failIfLeftoverChars = true){
        if (!(i >> x) || (failIfLeftoverChars && i.get(c)))
                throw BadConversion(s);
 }
+
 //**********************************************************************************************************************
 
 template<typename T>
@@ -92,7 +127,7 @@ inline bool convertTest(const string& s, T& x, bool failIfLeftoverChars = true){
        char c;
        if (!(i >> x) || (failIfLeftoverChars && i.get(c)))
        {
-               cout << "'" << s << "' is unable to be converted into an integer.\n";
+               cout << "unable to be converted into an integer.\n" << endl;
                return false;
        } 
        return true;
@@ -128,8 +163,20 @@ string toString(const T&x, int i){
        
     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){
@@ -142,6 +189,110 @@ inline void gobble(istream& f){
 
 /***********************************************************************/
 
+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);
+               
+               cout << endl;  
+               out << endl;
+               
+               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){
+       
+       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);
@@ -224,6 +375,7 @@ inline string getSimpleName(string longName){
 
        return simpleName;
 }
+
 /***********************************************************************/
 
 inline int factorial(int num){
@@ -249,7 +401,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);
        }
@@ -259,14 +411,32 @@ 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());
        if(!fileHandle) {
-               cerr << "Error: Could not open " << fileName << endl;
+               mothurOut("Error: Could not open " + fileName);  mothurOutEndLine();
                return 1;
        }
        else {
+               //check for blank file
+               gobble(fileHandle);
+               if (fileHandle.eof()) { mothurOut(fileName + " is blank. Please correct."); mothurOutEndLine();  return 1;  }
+               
                return 0;
        }
        
@@ -278,7 +448,7 @@ inline int openOutputFile(string fileName, ofstream& fileHandle){
        
        fileHandle.open(fileName.c_str(), ios::trunc);
        if(!fileHandle) {
-               cerr << "Error: Could not open " << fileName << endl;
+               mothurOut("Error: Could not open " + fileName);  mothurOutEndLine();
                return 1;
        }
        else {
@@ -286,22 +456,17 @@ inline int openOutputFile(string fileName, ofstream& fileHandle){
        }
 
 }
+
 /***********************************************************************/
 
-inline int openOutputFileAppend(string fileName, ofstream& fileHandle){
+inline int getNumSeqs(ifstream& file){
        
-       fileHandle.open(fileName.c_str(), ios::app);
-       if(!fileHandle) {
-               cerr << "Error: Could not open " << fileName << endl;
-               return 1;
-       }
-       else {
-               return 0;
-       }
+       int numSeqs = count(istreambuf_iterator<char>(file),istreambuf_iterator<char>(), '>');
+       file.seekg(0);
+       return numSeqs;
 
 }
 
-
 /***********************************************************************/
 
 //This function parses the estimator options and puts them in a vector
@@ -320,14 +485,9 @@ inline void splitAtDash(string& estim, vector<string>& container) {
                container.push_back(estim);
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the mothur class Function splitAtDash. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               errorOut(e, "mothur", "splitAtDash");
                exit(1);
        }
-       catch(...) {
-               cout << "An unknown error has occurred in the mothur class function splitAtDash. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-
 }
 
 /***********************************************************************/
@@ -347,14 +507,9 @@ inline void splitAtDash(string& estim, set<string>& container) {
                container.insert(estim);
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the mothur class Function splitAtDash. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the mothur class function splitAtDash. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               errorOut(e, "mothur", "splitAtDash");
                exit(1);
        }
-
 }
 /***********************************************************************/
 //This function parses the line options and puts them in a set
@@ -376,14 +531,9 @@ inline void splitAtDash(string& estim, set<int>& container) {
                container.insert(lineNum);
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the mothur class Function splitAtDash. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the mothur class function splitAtDash. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               errorOut(e, "mothur", "splitAtDash");
                exit(1);
        }
-
 }
 /***********************************************************************/
 //This function parses the a string and puts peices in a vector
@@ -402,11 +552,7 @@ inline void splitAtComma(string& estim, vector<string>& container) {
                container.push_back(estim);
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the mothur class Function splitAtComma. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the mothur class function splitAtComma. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               errorOut(e, "mothur", "splitAtComma");
                exit(1);
        }
 }
@@ -425,14 +571,9 @@ inline void splitAtComma(string& prefix, string& suffix){
 
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the mothur class Function splitAtComma. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the mothur class function splitAtComma. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               errorOut(e, "mothur", "splitAtComma");
                exit(1);
        }
-
 }
 /***********************************************************************/
 
@@ -450,14 +591,9 @@ inline void splitAtEquals(string& key, string& value){
                }
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the mothur class Function splitAtEquals. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the mothur class function splitAtEquals. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               errorOut(e, "mothur", "splitAtEquals");
                exit(1);
        }
-
 }
 /**************************************************************************************************/
 
@@ -469,11 +605,62 @@ inline bool inUsersGroups(string groupname, vector<string> Groups) {
                return false;
        }
        catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the mothur class Function inUsersGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               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);
        }
-       catch(...) {
-               cout << "An unknown error has occurred in the mothur class function inUsersGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+}
+/***********************************************************************/
+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);
        }
 }
@@ -507,7 +694,7 @@ inline bool anyLabelsToProcess(string label, set<string>& userLabels, string err
                                orderFloat.push_back(-1.0);
                                userMap["unique"] = -1.0;
                        }else {
-                               if (errorOff == "") {  cout << *it << " is not a valid label." << endl;  }
+                               if (errorOff == "") {  mothurOut(*it + " is not a valid label."); mothurOutEndLine();  }
                                userLabels.erase(*it); 
                                it--;
                        }
@@ -525,11 +712,11 @@ inline bool anyLabelsToProcess(string label, set<string>& userLabels, string err
                        if (orderFloat[i] < labelFloat) {
                                smaller = true;
                                if (orderFloat[i] == -1) { 
-                                       if (errorOff == "") { cout << "Your file does not include the label unique." <<  endl; }
+                                       if (errorOff == "") { mothurOut("Your file does not include the label unique."); mothurOutEndLine(); }
                                        userLabels.erase("unique");
                                }
                                else {  
-                                       if (errorOff == "") { cout << "Your file does not include the label "; }
+                                       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]) {  
@@ -539,7 +726,7 @@ inline bool anyLabelsToProcess(string label, set<string>& userLabels, string err
                                                        break;
                                                }
                                        }
-                                       if (errorOff == "") { cout << s << ". I will use the next smallest distance. "  <<  endl; }
+                                       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; }
@@ -549,14 +736,9 @@ inline bool anyLabelsToProcess(string label, set<string>& userLabels, string err
                                                
        }
        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";
+               errorOut(e, "mothur", "anyLabelsToProcess");
                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);
-       }
-
 }
 
 /**************************************************************************************************/