]> git.donarmstrong.com Git - mothur.git/blobdiff - mothurout.cpp
changes while testing
[mothur.git] / mothurout.cpp
index 8a3b6313072a158f611e1a69a84d0a9713add18c..713bafd0c2a79ec637abdf9d481a0c96c183ee77 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 {
@@ -796,6 +816,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){
@@ -1161,7 +1214,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{
@@ -1360,6 +1454,67 @@ vector<unsigned long long> MothurOut::setFilePosFasta(string filename, int& num)
                exit(1);
        }
 }
+//**********************************************************************************************************************
+vector<consTax> MothurOut::readConsTax(string inputfile){
+       try {
+               
+        vector<consTax> taxes;
+        
+        ifstream in;
+        openInputFile(inputfile, in);
+        
+        //read headers
+        getline(in);
+        
+        while (!in.eof()) {
+            
+            if (control_pressed) { break; }
+            
+            string otu = ""; string tax = "unknown";
+            int size = 0;
+            
+            in >> otu >> size >> tax; gobble(in);
+            consTax temp(otu, tax, size);
+            taxes.push_back(temp);
+        }
+        in.close();
+        
+        return taxes;
+    }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "readConsTax");
+               exit(1);
+       }
+}
+//**********************************************************************************************************************
+int MothurOut::readConsTax(string inputfile, map<string, consTax2>& taxes){
+       try {
+        ifstream in;
+        openInputFile(inputfile, in);
+        
+        //read headers
+        getline(in);
+        
+        while (!in.eof()) {
+            
+            if (control_pressed) { break; }
+            
+            string otu = ""; string tax = "unknown";
+            int size = 0;
+            
+            in >> otu >> size >> tax; gobble(in);
+            consTax2 temp(tax, size);
+            taxes[otu] = temp;
+        }
+        in.close();
+        
+        return 0;
+    }
+       catch(exception& e) {
+               errorOut(e, "MothurOut", "readConsTax");
+               exit(1);
+       }
+}
 /**************************************************************************************************/
 vector<unsigned long long> MothurOut::setFilePosEachLine(string filename, int& num) {
        try {
@@ -1747,6 +1902,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; }
@@ -1771,7 +1927,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; 
                 }
@@ -1799,7 +1955,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; 
@@ -1807,6 +1963,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();
 
        }
@@ -2348,7 +2506,9 @@ set<string> MothurOut::readAccnos(string accnosfile){
             in.read(buffer, 4096);
             vector<string> pieces = splitWhiteSpace(rest, buffer, in.gcount());
             
-            for (int i = 0; i < pieces.size(); i++) {  checkName(pieces[i]); names.insert(pieces[i]);  }
+            for (int i = 0; i < pieces.size(); i++) {  checkName(pieces[i]);
+                names.insert(pieces[i]);
+            }
         }
                in.close();     
                
@@ -2704,7 +2864,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;
@@ -3339,7 +3542,7 @@ vector<double> MothurOut::getStandardDeviation(vector< vector<double> >& dists,
         return stdDev;
     }
        catch(exception& e) {
-               errorOut(e, "MothurOut", "getAverages");                
+               errorOut(e, "MothurOut", "getStandardDeviation");               
                exit(1);
        }
 }
@@ -3622,6 +3825,44 @@ 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);
+       }
+}
+/**************************************************************************************************/