]> git.donarmstrong.com Git - mothur.git/blobdiff - removerarecommand.cpp
fixes while testing 1.33.0
[mothur.git] / removerarecommand.cpp
index c0694480bcebf7a3738c17ef812720577dc99c7d..24d5bef750e32e06493f7e91351bbf8af0b3099b 100644 (file)
@@ -68,7 +68,7 @@ string RemoveRareCommand::getOutputPattern(string type) {
         else if (type == "sabund")    {   pattern = "[filename],pick,[extension]";    }
         else if (type == "group")       {   pattern = "[filename],pick,[extension]";    }
         else if (type == "count")       {   pattern = "[filename],pick,[extension]";    }
-        else if (type == "list")        {   pattern = "[filename],pick,[extension]";    }
+        else if (type == "list")        {   pattern = "[filename],[tag],pick,[extension]";    }
         else if (type == "shared")      {   pattern = "[filename],[tag],pick,[extension]";    }
         else { m->mothurOut("[ERROR]: No definition for type " + type + " output pattern.\n"); m->control_pressed = true;  }
         
@@ -344,24 +344,7 @@ int RemoveRareCommand::execute(){
 //**********************************************************************************************************************
 int RemoveRareCommand::processList(){
        try {
-               string thisOutputDir = outputDir;
-               if (outputDir == "") {  thisOutputDir += m->hasPath(listfile);  }
-        map<string, string> variables; 
-        variables["[filename]"] = thisOutputDir + m->getRootName(m->getSimpleName(listfile));
-        variables["[extension]"] = m->getExtension(listfile);
-               string outputFileName = getOutputFileName("list", variables);
-        variables["[filename]"] = thisOutputDir + m->getRootName(m->getSimpleName(groupfile));
-        variables["[extension]"] = m->getExtension(groupfile);
-               string outputGroupFileName = getOutputFileName("group", variables);
-        variables["[filename]"] = thisOutputDir + m->getRootName(m->getSimpleName(countfile));
-        variables["[extension]"] = m->getExtension(countfile);
-        string outputCountFileName = getOutputFileName("count", variables);
-        
-               ofstream out, outGroup;
-               m->openOutputFile(outputFileName, out);
-               
-               bool wroteSomething = false;
-               
+                               
                //you must provide a label because the names in the listfile need to be consistent
                string thisLabel = "";
                if (allLines) { m->mothurOut("For the listfile you must select one label, using first label in your listfile."); m->mothurOutEndLine(); }
@@ -400,6 +383,26 @@ int RemoveRareCommand::processList(){
                                list = input.getListVector(lastLabel); 
                        }
                }
+        
+        string thisOutputDir = outputDir;
+               if (outputDir == "") {  thisOutputDir += m->hasPath(listfile);  }
+        map<string, string> variables;
+        variables["[filename]"] = thisOutputDir + m->getRootName(m->getSimpleName(listfile));
+        variables["[extension]"] = m->getExtension(listfile);
+        variables["[tag]"] = list->getLabel();
+               string outputFileName = getOutputFileName("list", variables);
+        variables["[filename]"] = thisOutputDir + m->getRootName(m->getSimpleName(groupfile));
+        variables["[extension]"] = m->getExtension(groupfile);
+               string outputGroupFileName = getOutputFileName("group", variables);
+        variables["[filename]"] = thisOutputDir + m->getRootName(m->getSimpleName(countfile));
+        variables["[extension]"] = m->getExtension(countfile);
+        string outputCountFileName = getOutputFileName("count", variables);
+        
+               ofstream out, outGroup;
+               m->openOutputFile(outputFileName, out);
+               
+               bool wroteSomething = false;
+
                
                //if groupfile is given then use it
                GroupMap* groupMap;
@@ -411,7 +414,7 @@ int RemoveRareCommand::processList(){
                        util.setGroups(Groups, namesGroups);
                        m->openOutputFile(outputGroupFileName, outGroup);
                }else if (countfile != "") {
-            ct.readTable(countfile);
+            ct.readTable(countfile, true, false);
             if (ct.hasGroupInfo()) {
                 vector<string> namesGroups = ct.getNamesOfGroups();
                 SharedUtil util;
@@ -420,7 +423,11 @@ int RemoveRareCommand::processList(){
         }
                
                
-               if (list != NULL) {     
+               if (list != NULL) {
+            
+            vector<string> binLabels = list->getLabels();
+            vector<string> newLabels;
+            
                        //make a new list vector
                        ListVector newList;
                        newList.setLabel(list->getLabel());
@@ -479,6 +486,7 @@ int RemoveRareCommand::processList(){
 
                                if (binsize > nseqs) { //keep bin
                                        newList.push_back(saveBinNames);
+                    newLabels.push_back(binLabels[i]);
                                        if (groupfile != "") {  for(int k = 0; k < newGroupFile.size(); k++) { outGroup << newGroupFile[k] << endl; }  }
                     else if (countfile != "") { for(int k = 0; k < newGroupFile.size(); k++) {  ct.remove(newGroupFile[k]); } }  
                                }else {  if (countfile != "") {  for(int k = 0; k < names.size(); k++) {  ct.remove(names[k]); } }  }
@@ -487,7 +495,9 @@ int RemoveRareCommand::processList(){
                        //print new listvector
                        if (newList.getNumBins() != 0) {
                                wroteSomething = true;
-                               newList.print(out);
+                               newList.setLabels(newLabels);
+                newList.printHeaders(out);
+                newList.print(out);
                        }
                }       
                
@@ -730,17 +740,6 @@ int RemoveRareCommand::processShared(){
        try {
                m->setGroups(Groups);
                
-               string thisOutputDir = outputDir;
-               if (outputDir == "") {  thisOutputDir += m->hasPath(sharedfile);  }
-        map<string, string> variables; 
-        variables["[filename]"] = thisOutputDir + m->getRootName(m->getSimpleName(sharedfile));
-        variables["[extension]"] = m->getExtension(sharedfile);
-               string outputFileName = getOutputFileName("shared", variables);
-               outputTypes["shared"].push_back(outputFileName); outputNames.push_back(outputFileName);
-               
-               ofstream out;
-               m->openOutputFile(outputFileName, out);
-               
                //if the users enters label "0.06" and there is no "0.06" in their file use the next lowest label.
                InputData input(sharedfile, "sharedfile");
                vector<SharedRAbundVector*> lookup = input.getSharedRAbundVectors();
@@ -750,7 +749,7 @@ int RemoveRareCommand::processShared(){
                
                while((lookup[0] != NULL) && ((allLines == 1) || (userLabels.size() != 0))) {
                        
-                       if (m->control_pressed) { for (int i = 0; i < lookup.size(); i++) {  delete lookup[i];  }  out.close(); return 0; }
+                       if (m->control_pressed) { for (int i = 0; i < lookup.size(); i++) {  delete lookup[i];  }   return 0; }
                        
                        if(allLines == 1 || labels.count(lookup[0]->getLabel()) == 1){                  
                                
@@ -758,8 +757,7 @@ int RemoveRareCommand::processShared(){
                                processedLabels.insert(lookup[0]->getLabel());
                                userLabels.erase(lookup[0]->getLabel());
                                
-                               if (!m->printedHeaders) { lookup[0]->printHeaders(out); }
-                               processLookup(lookup, out);
+                               processLookup(lookup);
                        }
                        
                        if ((m->anyLabelsToProcess(lookup[0]->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) {
@@ -772,8 +770,7 @@ int RemoveRareCommand::processShared(){
                                processedLabels.insert(lookup[0]->getLabel());
                                userLabels.erase(lookup[0]->getLabel());
                                
-                               if (!m->printedHeaders) { lookup[0]->printHeaders(out); }
-                               processLookup(lookup, out);                     
+                               processLookup(lookup);                  
                                
                                //restore real lastlabel to save below
                                lookup[0]->setLabel(saveLabel);
@@ -785,7 +782,7 @@ int RemoveRareCommand::processShared(){
                        lookup = input.getSharedRAbundVectors();
                }
                
-               if (m->control_pressed) {  out.close(); return 0; }     
+               if (m->control_pressed) {  return 0; }  
                
                //output error messages about any remaining user labels
                set<string>::iterator it;
@@ -806,9 +803,7 @@ int RemoveRareCommand::processShared(){
                        lookup = input.getSharedRAbundVectors(lastLabel);
                        
                        m->mothurOut(lookup[0]->getLabel()); m->mothurOutEndLine();
-                       
-                       if (!m->printedHeaders) { lookup[0]->printHeaders(out); }
-                       processLookup(lookup, out);     
+                       processLookup(lookup);  
                        
                        for (int i = 0; i < lookup.size(); i++) {  delete lookup[i];  } 
                }
@@ -821,10 +816,23 @@ int RemoveRareCommand::processShared(){
        }
 }
 //**********************************************************************************************************************
-int RemoveRareCommand::processLookup(vector<SharedRAbundVector*>& lookup, ofstream& out){
+int RemoveRareCommand::processLookup(vector<SharedRAbundVector*>& lookup){
        try {
                
+        string thisOutputDir = outputDir;
+               if (outputDir == "") {  thisOutputDir += m->hasPath(sharedfile);  }
+        map<string, string> variables;
+        variables["[filename]"] = thisOutputDir + m->getRootName(m->getSimpleName(sharedfile));
+        variables["[extension]"] = m->getExtension(sharedfile);
+        variables["[tag]"] = lookup[0]->getLabel();
+               string outputFileName = getOutputFileName("shared", variables);
+               outputTypes["shared"].push_back(outputFileName); outputNames.push_back(outputFileName);
+               
+               ofstream out;
+               m->openOutputFile(outputFileName, out);
+        
                vector<SharedRAbundVector> newRabunds;  newRabunds.resize(lookup.size());
+        vector<string> headers;
                for (int i = 0; i < lookup.size(); i++) {  
                        newRabunds[i].setGroup(lookup[i]->getGroup());
                        newRabunds[i].setLabel(lookup[i]->getLabel());
@@ -836,7 +844,7 @@ int RemoveRareCommand::processLookup(vector<SharedRAbundVector*>& lookup, ofstre
                        for (int i = 0; i < lookup[0]->getNumBins(); i++) {
                                bool allZero = true;
                                
-                               if (m->control_pressed) { return 0; }
+                               if (m->control_pressed) { out.close(); return 0; }
                                
                                //for each group
                                for (int j = 0; j < lookup.size(); j++) {
@@ -852,12 +860,13 @@ int RemoveRareCommand::processLookup(vector<SharedRAbundVector*>& lookup, ofstre
                                
                                //eliminates zero otus
                                if (allZero) { for (int j = 0; j < newRabunds.size(); j++) {  newRabunds[j].pop_back(); } }
+                else { headers.push_back(m->currentSharedBinLabels[i]); }
                        }
                }else {
                        //for each otu
                        for (int i = 0; i < lookup[0]->getNumBins(); i++) {
                                
-                               if (m->control_pressed) { return 0; }
+                               if (m->control_pressed) { out.close(); return 0; }
                                
                                int totalAbund = 0;
                                //get total otu abundance
@@ -868,17 +877,23 @@ int RemoveRareCommand::processLookup(vector<SharedRAbundVector*>& lookup, ofstre
                                
                                //eliminates otus below rare cutoff
                                if (totalAbund <= nseqs) { for (int j = 0; j < newRabunds.size(); j++) {  newRabunds[j].pop_back(); } }
+                else { headers.push_back(m->currentSharedBinLabels[i]); }
                        }
                }
                
                //do we have any otus above the rare cutoff
-               if (newRabunds[0].getNumBins() != 0) { 
+               if (newRabunds[0].getNumBins() != 0) {
+            out << "label\tGroup\tnumOtus\t";
+            for (int j = 0; j < headers.size(); j++) { out << headers[j] << '\t'; }
+            out << endl;
                        for (int j = 0; j < newRabunds.size(); j++) { 
                                out << newRabunds[j].getLabel() << '\t' << newRabunds[j].getGroup() << '\t';
                                newRabunds[j].print(out); 
                        }
                }
                
+        out.close();
+        
                return 0;
        }
        catch(exception& e) {