]> git.donarmstrong.com Git - mothur.git/blobdiff - mothurout.cpp
added oligos class. added check orient parameter to trim.flows, sffinfo, fastq.info...
[mothur.git] / mothurout.cpp
index 96c7305b6a1fb50f42f9c2a650d0c854ccbb6f2c..81436871d6fd14b8f40c7101b397c1637887bc96 100644 (file)
@@ -588,6 +588,26 @@ int MothurOut::openOutputFileAppend(string fileName, ofstream& fileHandle){
                exit(1);
        }
 }
+/***********************************************************************/
+int MothurOut::openOutputFileBinaryAppend(string fileName, ofstream& fileHandle){
+       try {
+               fileName = getFullPathName(fileName);
+               
+               fileHandle.open(fileName.c_str(), ios::app | ios::binary);
+               if(!fileHandle) {
+                       mothurOut("[ERROR]: Could not open " + fileName); mothurOutEndLine();
+                       return 1;
+               }
+               else {
+                       return 0;
+               }
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "openOutputFileAppend");
+               exit(1);
+       }
+}
+
 /***********************************************************************/
 void MothurOut::gobble(istream& f){
        try {
@@ -759,6 +779,8 @@ string MothurOut::getPathName(string longName){
 bool MothurOut::dirCheck(string& dirName){
        try {
         
+        if (dirName == "") { return false; }
+        
         string tag = "";
         #ifdef USE_MPI
             int pid; 
@@ -777,7 +799,7 @@ bool MothurOut::dirCheck(string& dirName){
 
         //test to make sure directory exists
         dirName = getFullPathName(dirName);
-        string outTemp = dirName + tag + "temp";
+        string outTemp = dirName + tag + "temp"+ toString(time(NULL));
         ofstream out;
         out.open(outTemp.c_str(), ios::trunc);
         if(!out) {
@@ -796,6 +818,39 @@ bool MothurOut::dirCheck(string& dirName){
        }       
     
 }
+//**********************************************************************************************************************
+
+map<string, vector<string> > MothurOut::parseClasses(string classes){
+       try {
+        map<string, vector<string> > parts;
+        
+        //treatment<Early|Late>-age<young|old>
+        vector<string> pieces; splitAtDash(classes, pieces); // -> treatment<Early|Late>, age<young|old>
+        
+        for (int i = 0; i < pieces.size(); i++) {
+            string category = ""; string value = "";
+            bool foundOpen = false;
+            for (int j = 0; j < pieces[i].length(); j++) {
+                if (control_pressed) { return parts; }
+                
+                if (pieces[i][j] == '<')        { foundOpen = true;         }
+                else if (pieces[i][j] == '>')   { j += pieces[i].length();  }
+                else {
+                    if (!foundOpen) { category += pieces[i][j]; }
+                    else { value += pieces[i][j]; }
+                }
+            }
+            vector<string> values; splitAtChar(value, values, '|');
+            parts[category] = values;
+        }
+        
+        return parts;
+    }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "parseClasses");
+               exit(1);
+       }
+}
 /***********************************************************************/
 
 string MothurOut::hasPath(string longName){
@@ -1087,6 +1142,105 @@ int MothurOut::openInputFile(string fileName, ifstream& fileHandle){
                exit(1);
        }       
 }
+/***********************************************************************/
+int MothurOut::openInputFileBinary(string fileName, ifstream& fileHandle){
+       try {
+        
+               //get full path name
+               string completeFileName = getFullPathName(fileName);
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
+#ifdef USE_COMPRESSION
+        // check for gzipped or bzipped file
+        if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) {
+            string tempName = string(tmpnam(0));
+            mkfifo(tempName.c_str(), 0666);
+            int fork_result = fork();
+            if (fork_result < 0) {
+                cerr << "Error forking.\n";
+                exit(1);
+            } else if (fork_result == 0) {
+                string command = (endsWith(completeFileName, ".gz") ? "zcat " : "bzcat ") + completeFileName + string(" > ") + tempName;
+                cerr << "Decompressing " << completeFileName << " via temporary named pipe " << tempName << "\n";
+                system(command.c_str());
+                cerr << "Done decompressing " << completeFileName << "\n";
+                mothurRemove(tempName);
+                exit(EXIT_SUCCESS);
+            } else {
+                cerr << "waiting on child process " << fork_result << "\n";
+                completeFileName = tempName;
+            }
+        }
+#endif
+#endif
+        
+               fileHandle.open(completeFileName.c_str(), ios::binary);
+               if(!fileHandle) {
+                       mothurOut("[ERROR]: Could not open " + completeFileName); mothurOutEndLine();
+                       return 1;
+               }
+               else {
+                       //check for blank file
+                       gobble(fileHandle);
+                       if (fileHandle.eof()) { mothurOut("[ERROR]: " + completeFileName + " is blank. Please correct."); mothurOutEndLine();  }
+                       
+                       return 0;
+               }
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "openInputFileBinary");
+               exit(1);
+       }       
+}
+/***********************************************************************/
+int MothurOut::openInputFileBinary(string fileName, ifstream& fileHandle, string noerror){
+       try {
+        
+               //get full path name
+               string completeFileName = getFullPathName(fileName);
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
+#ifdef USE_COMPRESSION
+        // check for gzipped or bzipped file
+        if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) {
+            string tempName = string(tmpnam(0));
+            mkfifo(tempName.c_str(), 0666);
+            int fork_result = fork();
+            if (fork_result < 0) {
+                cerr << "Error forking.\n";
+                exit(1);
+            } else if (fork_result == 0) {
+                string command = (endsWith(completeFileName, ".gz") ? "zcat " : "bzcat ") + completeFileName + string(" > ") + tempName;
+                cerr << "Decompressing " << completeFileName << " via temporary named pipe " << tempName << "\n";
+                system(command.c_str());
+                cerr << "Done decompressing " << completeFileName << "\n";
+                mothurRemove(tempName);
+                exit(EXIT_SUCCESS);
+            } else {
+                cerr << "waiting on child process " << fork_result << "\n";
+                completeFileName = tempName;
+            }
+        }
+#endif
+#endif
+        
+               fileHandle.open(completeFileName.c_str(), ios::binary);
+               if(!fileHandle) {
+                       //mothurOut("[ERROR]: Could not open " + completeFileName); mothurOutEndLine();
+                       return 1;
+               }
+               else {
+                       //check for blank file
+                       gobble(fileHandle);
+                       //if (fileHandle.eof()) { mothurOut("[ERROR]: " + completeFileName + " is blank. Please correct."); mothurOutEndLine();  }
+                       
+                       return 0;
+               }
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "openInputFileBinary - no error");
+               exit(1);
+       }
+}
+
 /***********************************************************************/
 
 int MothurOut::renameFile(string oldName, string newName){
@@ -1161,7 +1315,48 @@ int MothurOut::openOutputFile(string fileName, ofstream& fileHandle){
        }       
 
 }
+/***********************************************************************/
 
+int MothurOut::openOutputFileBinary(string fileName, ofstream& fileHandle){
+       try {
+        
+               string completeFileName = getFullPathName(fileName);
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
+#ifdef USE_COMPRESSION
+        // check for gzipped file
+        if (endsWith(completeFileName, ".gz") || endsWith(completeFileName, ".bz2")) {
+            string tempName = string(tmpnam(0));
+            mkfifo(tempName.c_str(), 0666);
+            cerr << "Compressing " << completeFileName << " via temporary named pipe " << tempName << "\n";
+            int fork_result = fork();
+            if (fork_result < 0) {
+                cerr << "Error forking.\n";
+                exit(1);
+            } else if (fork_result == 0) {
+                string command = string(endsWith(completeFileName, ".gz") ?  "gzip" : "bzip2") + " -v > " + completeFileName + string(" < ") + tempName;
+                system(command.c_str());
+                exit(0);
+            } else {
+                completeFileName = tempName;
+            }
+        }
+#endif
+#endif
+               fileHandle.open(completeFileName.c_str(), ios::trunc | ios::binary);
+               if(!fileHandle) {
+                       mothurOut("[ERROR]: Could not open " + completeFileName); mothurOutEndLine();
+                       return 1;
+               }
+               else {
+                       return 0;
+               }
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "openOutputFileBinary");
+               exit(1);
+       }       
+    
+}
 /**************************************************************************************************/
 int MothurOut::appendFiles(string temp, string filename) {
        try{
@@ -1169,8 +1364,8 @@ int MothurOut::appendFiles(string temp, string filename) {
                ifstream input;
        
                //open output file in append mode
-               openOutputFileAppend(filename, output);
-               int ableToOpen = openInputFile(temp, input, "no error");
+               openOutputFileBinaryAppend(filename, output);
+               int ableToOpen = openInputFileBinary(temp, input, "no error");
                //int ableToOpen = openInputFile(temp, input);
                
                int numLines = 0;
@@ -1195,6 +1390,36 @@ int MothurOut::appendFiles(string temp, string filename) {
                exit(1);
        }       
 }
+/**************************************************************************************************/
+int MothurOut::appendBinaryFiles(string temp, string filename) {
+       try{
+               ofstream output;
+               ifstream input;
+        
+               //open output file in append mode
+               openOutputFileBinaryAppend(filename, output);
+               int ableToOpen = openInputFileBinary(temp, input, "no error");
+               
+               if (ableToOpen == 0) { //you opened it
+            
+            char buffer[4096];
+            while (!input.eof()) {
+                input.read(buffer, 4096);
+                output.write(buffer, input.gcount());
+            }
+                       input.close();
+               }
+               
+               output.close();
+               
+               return ableToOpen;
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "appendBinaryFiles");
+               exit(1);
+       }       
+}
+
 /**************************************************************************************************/
 int MothurOut::appendFilesWithoutHeaders(string temp, string filename) {
        try{
@@ -1808,6 +2033,7 @@ int MothurOut::readTax(string namefile, map<string, string>& taxMap) {
         bool pairDone = false;
         bool columnOne = true;
         string firstCol, secondCol;
+        bool error = false;
         
                while (!in.eof()) {
                        if (control_pressed) { break; }
@@ -1832,7 +2058,7 @@ int MothurOut::readTax(string namefile, map<string, string>& taxMap) {
                         if (!ignore) { taxMap[firstCol] = secondCol; }
                         if (debug) {  mothurOut("[DEBUG]: name = '" + firstCol + "' tax = '" + secondCol + "'\n");  }
                     }else {
-                        mothurOut("[ERROR]: " + firstCol + " is already in your taxonomy file, names must be unique./n"); control_pressed = true;
+                        mothurOut("[ERROR]: " + firstCol + " is already in your taxonomy file, names must be unique.\n"); error = true;
                     }
                     pairDone = false; 
                 }
@@ -1860,7 +2086,7 @@ int MothurOut::readTax(string namefile, map<string, string>& taxMap) {
                         if (!ignore) { taxMap[firstCol] = secondCol; }
                         if (debug) {  mothurOut("[DEBUG]: name = '" + firstCol + "' tax = '" + secondCol + "'\n");  }
                     }else {
-                        mothurOut("[ERROR]: " + firstCol + " is already in your taxonomy file, names must be unique./n"); control_pressed = true;
+                        mothurOut("[ERROR]: " + firstCol + " is already in your taxonomy file, names must be unique./n"); error = true;
                     }
 
                     pairDone = false; 
@@ -1868,6 +2094,8 @@ int MothurOut::readTax(string namefile, map<string, string>& taxMap) {
             } 
         }
                
+        if (error) { control_pressed = true; }
+        if (debug) {  mothurOut("[DEBUG]: numSeqs saved = '" + toString(taxMap.size()) + "'\n"); }
                return taxMap.size();
 
        }
@@ -2502,6 +2730,92 @@ int MothurOut::getNumChar(string line, char c){
                exit(1);
        }
 }
+/***********************************************************************/
+string MothurOut::getSimpleLabel(string label){
+       try {
+               string simple = "";
+        
+        //remove OTU or phylo tag
+        string newLabel1 = "";
+        for (int i = 0; i < label.length(); i++) {
+            if(label[i]>47 && label[i]<58) { //is a digit
+                newLabel1 += label[i];
+            }
+        }
+        
+        int num1;
+        mothurConvert(newLabel1, num1);
+        
+        simple = toString(num1);
+        
+               return simple;
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "isLabelEquivalent");
+               exit(1);
+       }
+}
+/***********************************************************************/
+string MothurOut::mothurGetpid(int threadID){
+       try {
+        
+        string pid = "";
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)
+        
+               pid += toString(getpid()); if(debug) { mothurOut("[DEBUG]: " + pid + "\n"); }
+        //remove any weird chars
+        string pid1 = "";
+        for (int i = 0; i < pid.length(); i++) {
+            if(pid[i]>47 && pid[i]<58) { //is a digit
+                pid1 += pid[i];
+            }
+        }
+        pid = pid1;
+#else
+               pid += toString(threadID);
+#endif
+               return pid;
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "mothurGetpid");
+               exit(1);
+       }
+}
+
+/***********************************************************************/
+
+bool MothurOut::isLabelEquivalent(string label1,  string label2){
+       try {
+               bool same = false;
+        
+        //remove OTU or phylo tag
+        string newLabel1 = "";
+        for (int i = 0; i < label1.length(); i++) {
+            if(label1[i]>47 && label1[i]<58) { //is a digit
+                newLabel1 += label1[i];
+            }
+        }
+        
+        string newLabel2 = "";
+        for (int i = 0; i < label2.length(); i++) {
+            if(label2[i]>47 && label2[i]<58) { //is a digit
+                newLabel2 += label2[i];
+            }
+        }
+        
+        int num1, num2;
+        mothurConvert(newLabel1, num1);
+        mothurConvert(newLabel2, num2);
+        
+        if (num1 == num2) { same = true; }
+               
+               return same;
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "isLabelEquivalent");
+               exit(1);
+       }
+}
 //**********************************************************************************************************************
 bool MothurOut::isSubset(vector<string> bigset, vector<string> subset) {
        try {
@@ -2509,7 +2823,7 @@ bool MothurOut::isSubset(vector<string> bigset, vector<string> subset) {
         
                if (subset.size() > bigset.size()) { return false;  }
                
-               //check if each guy in suset is also in bigset
+               //check if each guy in subset is also in bigset
                for (int i = 0; i < subset.size(); i++) {
                        bool match = false;
                        for (int j = 0; j < bigset.size(); j++) {
@@ -2767,7 +3081,50 @@ unsigned int MothurOut::fromBase36(string base36){
        }
 }
 /***********************************************************************/
-
+string  MothurOut::findEdianness() {
+    try {
+        // find real endian type
+        unsigned char EndianTest[2] = {1,0};
+        short x = *(short *)EndianTest;
+        
+        string endianType = "unknown";
+        if(x == 1) { endianType = "BIG_ENDIAN"; }
+        else { endianType = "LITTLE_ENDIAN";    }
+    
+        return endianType;
+    }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "findEdianness");
+               exit(1);
+       }
+}
+/***********************************************************************/
+double  MothurOut::median(vector<double> x) {
+    try {
+        double value = 0.0;
+        
+        if (x.size() == 0) { } //error
+        else {
+            //For example, if a < b < c, then the median of the list {a, b, c} is b, and, if a < b < c < d, then the median of the list {a, b, c, d} is the mean of b and c; i.e., it is (b + c)/2.
+            sort(x.begin(), x.end());
+            //is x.size even?
+            if ((x.size()%2) == 0) { //size() is even. median = average of 2 midpoints
+                int midIndex1 = (x.size()/2)-1;
+                int midIndex2 = (x.size()/2);
+                value = (x[midIndex1]+ x[midIndex2]) / 2.0;
+            }else { 
+                int midIndex = (x.size()/2);
+                value = x[midIndex];
+            }
+        }
+        return value;
+    }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "median");
+               exit(1);
+       }
+}
+/***********************************************************************/
 int MothurOut::factorial(int num){
        try {
                int total = 1;
@@ -2814,6 +3171,64 @@ void MothurOut::getNumSeqs(ifstream& file, int& numSeqs){
        }       
 }
 /***********************************************************************/
+bool MothurOut::checkLocations(string& filename, string inputDir){
+       try {
+               filename = getFullPathName(filename);
+        
+        int ableToOpen;
+        ifstream in;
+        ableToOpen = openInputFile(filename, in, "noerror");
+        in.close();
+        
+        //if you can't open it, try input location
+        if (ableToOpen == 1) {
+            if (inputDir != "") { //default path is set
+                string tryPath = inputDir + getSimpleName(filename);
+                mothurOut("Unable to open " + filename + ". Trying input directory " + tryPath); mothurOutEndLine();
+                ifstream in2;
+                ableToOpen = openInputFile(tryPath, in2, "noerror");
+                in2.close();
+                filename = tryPath;
+            }
+        }
+        
+        //if you can't open it, try default location
+        if (ableToOpen == 1) {
+            if (getDefaultPath() != "") { //default path is set
+                string tryPath = getDefaultPath() + getSimpleName(filename);
+                mothurOut("Unable to open " + filename + ". Trying default " + tryPath); mothurOutEndLine();
+                ifstream in2;
+                ableToOpen = openInputFile(tryPath, in2, "noerror");
+                in2.close();
+                filename = tryPath;
+            }
+        }
+        
+        //if you can't open it its not in current working directory or inputDir, try mothur excutable location
+        if (ableToOpen == 1) {
+            string exepath = argv;
+            string tempPath = exepath;
+            for (int i = 0; i < exepath.length(); i++) { tempPath[i] = tolower(exepath[i]); }
+            exepath = exepath.substr(0, (tempPath.find_last_of('m')));
+            
+            string tryPath = getFullPathName(exepath) + getSimpleName(filename);
+            mothurOut("Unable to open " + filename + ". Trying mothur's executable location " + tryPath); mothurOutEndLine();
+            ifstream in2;
+            ableToOpen = openInputFile(tryPath, in2, "noerror");
+            in2.close();
+            filename = tryPath;
+        }
+        
+        if (ableToOpen == 1) { mothurOut("Unable to open " + filename + "."); mothurOutEndLine(); return false;  }
+        
+        return true;
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "checkLocations");
+               exit(1);
+       }
+}
+/***********************************************************************/
 
 //This function parses the estimator options and puts them in a vector
 void MothurOut::splitAtChar(string& estim, vector<string>& container, char symbol) {
@@ -3184,6 +3599,26 @@ bool MothurOut::inUsersGroups(vector<string> groupnames, vector<string> Groups)
                exit(1);
        }       
 }
+/**************************************************************************************************/
+//removes entries that are only white space
+int MothurOut::removeBlanks(vector<string>& tempVector) {
+       try {
+               vector<string> newVector;
+               for (int i = 0; i < tempVector.size(); i++) {
+            bool isBlank = true;
+            for (int j = 0; j < tempVector[i].length(); j++) {
+                if (!isspace(tempVector[i][j])) { isBlank = false; j+= tempVector[i].length(); } //contains non space chars, break out and save
+            }
+            if (!isBlank) { newVector.push_back(tempVector[i]); }
+        }
+        tempVector = newVector;
+               return 0;
+       }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "removeBlanks");
+               exit(1);
+       }
+}
 /***********************************************************************/
 //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.
@@ -3402,7 +3837,7 @@ vector<double> MothurOut::getStandardDeviation(vector< vector<double> >& dists,
         return stdDev;
     }
        catch(exception& e) {
-               errorOut(e, "MothurOut", "getAverages");                
+               errorOut(e, "MothurOut", "getStandardDeviation");               
                exit(1);
        }
 }
@@ -3685,6 +4120,45 @@ double MothurOut::getStandardDeviation(vector<int>& featureVector){
        }
 }
 /**************************************************************************************************/
+// returns largest value in vector
+double MothurOut::max(vector<double>& featureVector){
+    try {
+        if (featureVector.size() == 0) { mothurOut("[ERROR]: vector size = 0!\n"); control_pressed=true; return 0.0; }
+        
+        //finds largest
+        double largest = featureVector[0];
+        for (int i = 1; i < featureVector.size(); i++) {
+            if (featureVector[i] > largest) { largest = featureVector[i]; }
+        }
+                
+        return largest;
+    }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "max");
+               exit(1);
+       }
+}
+/**************************************************************************************************/
+// returns smallest value in vector
+double MothurOut::min(vector<double>& featureVector){
+    try {
+        if (featureVector.size() == 0) { mothurOut("[ERROR]: vector size = 0!\n"); control_pressed=true; return 0.0; }
+        
+        //finds smallest
+        double smallest = featureVector[0];
+        for (int i = 1; i < featureVector.size(); i++) {
+            if (featureVector[i] < smallest) { smallest = featureVector[i]; }
+        }
+        
+        return smallest;
+    }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "min");
+               exit(1);
+       }
+}
+
+/**************************************************************************************************/