]> git.donarmstrong.com Git - mothur.git/commitdiff
catchall windows fix
authorwestcott <westcott>
Wed, 8 Dec 2010 15:51:45 +0000 (15:51 +0000)
committerwestcott <westcott>
Wed, 8 Dec 2010 15:51:45 +0000 (15:51 +0000)
catchallcommand.cpp
mothur

index 7b298ef87345ea7b9ce497ac6d0b2e6d2d94759d..a07928bdf01b249b7925a912d5223e7e8e2eeac0 100644 (file)
-/*
- *  catchallcommand.cpp
- *  Mothur
- *
- *  Created by westcott on 5/11/10.
- *  Copyright 2010 Schloss Lab. All rights reserved.
- *
- */
-
-#include "catchallcommand.h"
-#include "globaldata.hpp"
-
-//**********************************************************************************************************************
-vector<string> CatchAllCommand::getValidParameters(){  
-       try {
-               string AlignArray[] =  {"sabund","label","inputdir","outputdir"};
-               vector<string> myArray (AlignArray, AlignArray+(sizeof(AlignArray)/sizeof(string)));
-               return myArray;
-       }
-       catch(exception& e) {
-               m->errorOut(e, "CatchAllCommand", "getValidParameters");
-               exit(1);
-       }
-}
-//**********************************************************************************************************************
-CatchAllCommand::CatchAllCommand(){    
-       try {
-               //initialize outputTypes
-               vector<string> tempOutNames;
-               outputTypes["csv"] = tempOutNames;
-               outputTypes["summary"] = tempOutNames;
-       }
-       catch(exception& e) {
-               m->errorOut(e, "CatchAllCommand", "CatchAllCommand");
-               exit(1);
-       }
-}
-//**********************************************************************************************************************
-vector<string> CatchAllCommand::getRequiredParameters(){       
-       try {
-               string AlignArray[] =  {"sabund"};
-               vector<string> myArray (AlignArray, AlignArray+(sizeof(AlignArray)/sizeof(string)));
-               return myArray;
-       }
-       catch(exception& e) {
-               m->errorOut(e, "CatchAllCommand", "getRequiredParameters");
-               exit(1);
-       }
-}
-//**********************************************************************************************************************
-vector<string> CatchAllCommand::getRequiredFiles(){    
-       try {
-               vector<string> myArray;
-               return myArray;
-       }
-       catch(exception& e) {
-               m->errorOut(e, "CatchAllCommand", "getRequiredFiles");
-               exit(1);
-       }
-}
-/**************************************************************************************/
-CatchAllCommand::CatchAllCommand(string option)  {     
-       try {
-               globaldata = GlobalData::getInstance();
-               abort = false;
-               allLines = 1;
-               
-               //allow user to run help
-               if(option == "help") { help(); abort = true; }
-               
-               else {
-                       //valid paramters for this command
-                       string Array[] =  {"sabund","label","inputdir","outputdir"};
-                       vector<string> myArray (Array, Array+(sizeof(Array)/sizeof(string)));
-                       
-                       OptionParser parser(option);
-                       map<string,string> parameters = parser.getParameters();
-                       
-                       ValidParameters validParameter;
-                       map<string, string>::iterator it;
-               
-                       //check to make sure all parameters are valid for command
-                       for (it = parameters.begin(); it != parameters.end(); it++) { 
-                               if (validParameter.isValidParameter(it->first, myArray, it->second) != true) {  abort = true;  }
-                       }
-                       
-                       //initialize outputTypes
-                       vector<string> tempOutNames;
-                       outputTypes["csv"] = tempOutNames;
-                       outputTypes["summary"] = tempOutNames;
-                       
-                       //if the user changes the input directory command factory will send this info to us in the output parameter 
-                       string inputDir = validParameter.validFile(parameters, "inputdir", false);              
-                       if (inputDir == "not found"){   inputDir = "";          }
-                       else {
-                               string path;
-                               it = parameters.find("sabund");
-                               //user has given a template file
-                               if(it != parameters.end()){ 
-                                       path = m->hasPath(it->second);
-                                       //if the user has not given a path then, add inputdir. else leave path alone.
-                                       if (path == "") {       parameters["sabund"] = inputDir + it->second;           }
-                               }
-                       }
-
-                       //check for required parameters
-                       sabundfile = validParameter.validFile(parameters, "sabund", true);
-                       if (sabundfile == "not open") { sabundfile = ""; abort = true; }
-                       else if (sabundfile == "not found") { sabundfile = "";  m->mothurOut("You must provide a sabund file for the catchall command."); m->mothurOutEndLine(); abort=true; }
-                       else { globaldata->setSabundFile(sabundfile); globaldata->setFormat("sabund"); }
-                       
-                       string label = validParameter.validFile(parameters, "label", false);                    
-                       if (label == "not found") { label = ""; }
-                       else { 
-                               if(label != "all") {  m->splitAtDash(label, labels);  allLines = 0;  }
-                               else { allLines = 1;  }
-                       }
-               
-
-                       //if the user changes the output directory command factory will send this info to us in the output parameter 
-                       outputDir = validParameter.validFile(parameters, "outputdir", false);           if (outputDir == "not found"){  outputDir = m->hasPath(sabundfile);     }
-               }
-
-       }
-       catch(exception& e) {
-               m->errorOut(e, "CatchAllCommand", "CatchAllCommand");
-               exit(1);
-       }
-}
-//**********************************************************************************************************************
-
-void CatchAllCommand::help(){
-       try {
-               m->mothurOut("The catchall command interfaces mothur with the catchall program written by Linda Woodard, Sean Connolly and John Bunge.\n");
-               m->mothurOut("For more information about catchall refer to http://www.northeastern.edu/catchall/index.html \n");
-               m->mothurOut("The catchall executable must be in a folder called catchall in the same folder as your mothur executable, similar to mothur's requirements for using blast. \n");
-               m->mothurOut("If you are a MAC or Linux user you must also have installed mono, a link to mono is on the webpage. \n");
-               m->mothurOut("The catchall command parameters are sabund and label, sabund is required. \n");
-               m->mothurOut("The label parameter is used to analyze specific labels in your input.\n");
-               m->mothurOut("The catchall command should be in the following format: \n");
-               m->mothurOut("catchall(sabund=yourSabundFile) \n");
-               m->mothurOut("Example: catchall(sabund=abrecovery.fn.sabund) \n");      
-       }
-       catch(exception& e) {
-               m->errorOut(e, "CatchAllCommand", "help");
-               exit(1);
-       }
-}
-
-/**************************************************************************************/
-int CatchAllCommand::execute() {       
-       try {
-               
-               if (abort == true) { return 0; }
-               
-               //prepare full output directory
-               outputDir = m->getFullPathName(outputDir);
-               
-               //get location of catchall
-               GlobalData* globaldata = GlobalData::getInstance();
-               path = globaldata->argv;
-               path = path.substr(0, (path.find_last_of('m')));
-               path = m->getFullPathName(path);
-
-               string catchAllCommandExe = ""; 
-               #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
-                       catchAllCommandExe += "mono " + path + "catchall/CatchAllcmdL.exe ";
-               #else
-                       catchAllCommandExe += path + "catchall/CatchAllcmdW.exe ";
-               #endif
-               
-               read = new ReadOTUFile(sabundfile);     
-               read->read(&*globaldata); 
-               
-               SAbundVector* sabund = globaldata->sabund;
-               string lastLabel = sabund->getLabel();
-               input = globaldata->ginput;
-                                               
-               set<string> processedLabels;
-               set<string> userLabels = labels;
-               
-               string summaryfilename = outputDir + m->getRootName(m->getSimpleName(sabundfile)) + "catchall.summary";
-               summaryfilename = m->getFullPathName(summaryfilename);
-               outputNames.push_back(summaryfilename); outputTypes["summary"].push_back(summaryfilename);
-               
-               ofstream out;
-               m->openOutputFile(summaryfilename, out);        
-               
-               out << "label\tmodel\testimate\tlci\tuci" << endl;
-               
-               //for each label the user selected
-               while((sabund != NULL) && ((allLines == 1) || (userLabels.size() != 0))) {
-
-                                       
-                       if(allLines == 1 || labels.count(sabund->getLabel()) == 1){
-                                       m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();
-                                       
-                                       //create catchall input file from mothur's inputfile
-                                       string filename = process(sabund);
-                                       string outputPath = m->getPathName(filename);
-                               
-                                       //create system command
-                                       string catchAllCommand = catchAllCommandExe + filename + " " + outputPath + " 1";
-                               
-                                       //run catchall
-                                       system(catchAllCommand.c_str());
-                               
-                                       remove(filename.c_str());
-                               
-                                       filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .
-                               
-                                       outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");
-                                       outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");
-                                       outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");
-                                       outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");
-                               
-                                       createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out);
-                                                                               
-                                       if (m->control_pressed) { out.close(); for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str());    } delete read;  delete input; globaldata->ginput = NULL; delete sabund;  return 0; }
-
-                                       processedLabels.insert(sabund->getLabel());
-                                       userLabels.erase(sabund->getLabel());
-                       }
-                       
-                       if ((m->anyLabelsToProcess(sabund->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) {
-                                       string saveLabel = sabund->getLabel();
-                                       
-                                       delete sabund;          
-                                       sabund = (input->getSAbundVector(lastLabel));
-                                       
-                                       m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();
-                                       
-
-                                       //create catchall input file from mothur's inputfile
-                                       string filename = process(sabund);
-                                       string outputPath = m->getPathName(filename);
-                                       
-                                       //create system command
-                                       string catchAllCommand = catchAllCommandExe + filename + " " + outputPath + " 1";
-
-                                       //run catchall
-                                       system(catchAllCommand.c_str());
-                               
-                                       remove(filename.c_str());
-                               
-                                       filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .
-                               
-                                       outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");
-                                       outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");
-                                       outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");
-                                       outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");
-                               
-                                       createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out);
-                               
-                                       if (m->control_pressed) { out.close(); for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str());    } delete read;  delete input; globaldata->ginput = NULL; delete sabund;  return 0; }
-
-                                       processedLabels.insert(sabund->getLabel());
-                                       userLabels.erase(sabund->getLabel());
-                                       
-                                       //restore real lastlabel to save below
-                                       sabund->setLabel(saveLabel);
-                       }
-                       
-                       
-                       lastLabel = sabund->getLabel(); 
-                       
-                       delete sabund;          
-                       sabund = (input->getSAbundVector());
-               }
-               
-               //output error messages about any remaining user labels
-               set<string>::iterator it;
-               bool needToRun = false;
-               for (it = userLabels.begin(); it != userLabels.end(); it++) {  
-                       m->mothurOut("Your file does not include the label " + *it); 
-                       if (processedLabels.count(lastLabel) != 1) {
-                               m->mothurOut(". I will use " + lastLabel + ".");  m->mothurOutEndLine();
-                               needToRun = true;
-                       }else {
-                               m->mothurOut(". Please refer to " + lastLabel + ".");  m->mothurOutEndLine();
-                       }
-               }
-               
-               //run last label if you need to
-               if (needToRun == true)  {
-                       if (sabund != NULL) {   delete sabund;  }
-                       sabund = (input->getSAbundVector(lastLabel));
-                       
-                       m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();
-                       
-                       //create catchall input file from mothur's inputfile
-                       string filename = process(sabund);
-                       string outputPath = m->getPathName(filename);
-                       
-                       //create system command
-                       string catchAllCommand = catchAllCommandExe + filename + " " + outputPath + " 1";
-                       
-                       //run catchall
-                       system(catchAllCommand.c_str());
-                       
-                       remove(filename.c_str());
-                       
-                       filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .
-                       
-                       outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");
-                       outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");
-                       outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");
-                       outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");        
-                       
-                       createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out);
-                       
-                       delete sabund;
-               }
-               
-               out.close();
-               delete read;
-               delete input; globaldata->ginput = NULL;
-               
-               if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str()); } return 0; }
-               
-               m->mothurOutEndLine();
-               m->mothurOut("Output File Names: "); m->mothurOutEndLine();
-               for (int i = 0; i < outputNames.size(); i++) {  m->mothurOut(outputNames[i]); m->mothurOutEndLine();    }       
-               m->mothurOutEndLine();
-               
-
-               return 0;
-       }
-       catch(exception& e) {
-               m->errorOut(e, "CatchAllCommand", "execute");
-               exit(1);
-       }
-}
-//**********************************************************************************************************************
-string CatchAllCommand::process(SAbundVector* sabund) {
-       try {
-               string filename = outputDir + m->getRootName(m->getSimpleName(sabundfile)) + sabund->getLabel() + ".csv";
-               filename = m->getFullPathName(filename);
-       
-               ofstream out;
-               m->openOutputFile(filename, out);
-               
-               for (int i = 1; i <= sabund->getMaxRank(); i++) {
-                       int temp = sabund->get(i);
-                       
-                       if (temp != 0) {
-                               out << i << "," << temp << endl;
-                       }
-               }
-               out.close();
-               
-               return filename;
-       
-       }
-       catch(exception& e) {
-               m->errorOut(e, "CatchAllCommand", "process");
-               exit(1);
-       }
-}
-//**********************************************************************************************************************
-int CatchAllCommand::createSummaryFile(string file1, string label, ofstream& out) {
-       try {
-               
-               ifstream in;
-               m->openInputFile(file1, in);
-               
-               if (!in.eof()) {
-                       
-                       string header = m->getline(in); m->gobble(in);
-                       
-                       int pos = header.find("Total Number of Observed Species =");
-                       string numString = "";
-                       
-                       
-                       if (pos == string::npos) { m->mothurOut("[ERROR]: cannot parse " + file1); m->mothurOutEndLine(); }
-                       else {
-                               //pos will be the position of the T in total, so we want to count to the position of =
-                               pos += 34;
-                               char c=header[pos];
-                               while (c != ','){
-                                       if (c != ' ') {
-                                               numString += c;
-                                       }
-                                       pos++;
-                                       c=header[pos];
-                                       
-                                       //sanity check
-                                       if (pos > header.length()) { m->mothurOut("Cannot find number of OTUs in " + file1); m->mothurOutEndLine(); in.close(); return 0; }
-                               }
-                       }
-                                                                                                                         
-                       string firstline = m->getline(in); m->gobble(in);
-                       vector<string> values;
-                       m->splitAtComma(firstline, values);
-                       
-                       values.pop_back(); //last value is always a blank string since the last character in the line is always a ','
-                       
-                       if (values.size() == 1) { //grab next line if firstline didn't have what you wanted
-                               string secondline = m->getline(in); m->gobble(in);
-                               values.clear();
-                               m->splitAtComma(secondline, values);
-                               
-                               values.pop_back(); //last value is always a blank string since the last character in the line is always a ','
-                       }
-                       
-                       if (values.size() == 1) { //still not what we wanted fill values with numOTUs
-                               values.resize(8, "");
-                               values[1] = "Sobs";
-                               values[4] = numString;
-                               values[6] = numString;
-                               values[7] = numString;
-                       }
-                       
-                       if (values.size() < 8) { values.resize(8, ""); }
-                       
-                       out << label << '\t' << values[1] << '\t' << values[4] << '\t' << values[6] << '\t' << values[7] << endl;
-               }
-               
-               in.close();
-               
-               return 0;
-               
-       }
-       catch(exception& e) {
-               m->errorOut(e, "CatchAllCommand", "createSummaryFile");
-               exit(1);
-       }
-}
-/**************************************************************************************/
-
-
-
+/*\r
+ *  catchallcommand.cpp\r
+ *  Mothur\r
+ *\r
+ *  Created by westcott on 5/11/10.\r
+ *  Copyright 2010 Schloss Lab. All rights reserved.\r
+ *\r
+ */\r
+\r
+#include "catchallcommand.h"\r
+#include "globaldata.hpp"\r
+\r
+//**********************************************************************************************************************\r
+vector<string> CatchAllCommand::getValidParameters(){  \r
+       try {\r
+               string AlignArray[] =  {"sabund","label","inputdir","outputdir"};\r
+               vector<string> myArray (AlignArray, AlignArray+(sizeof(AlignArray)/sizeof(string)));\r
+               return myArray;\r
+       }\r
+       catch(exception& e) {\r
+               m->errorOut(e, "CatchAllCommand", "getValidParameters");\r
+               exit(1);\r
+       }\r
+}\r
+//**********************************************************************************************************************\r
+CatchAllCommand::CatchAllCommand(){    \r
+       try {\r
+               //initialize outputTypes\r
+               vector<string> tempOutNames;\r
+               outputTypes["csv"] = tempOutNames;\r
+               outputTypes["summary"] = tempOutNames;\r
+       }\r
+       catch(exception& e) {\r
+               m->errorOut(e, "CatchAllCommand", "CatchAllCommand");\r
+               exit(1);\r
+       }\r
+}\r
+//**********************************************************************************************************************\r
+vector<string> CatchAllCommand::getRequiredParameters(){       \r
+       try {\r
+               string AlignArray[] =  {"sabund"};\r
+               vector<string> myArray (AlignArray, AlignArray+(sizeof(AlignArray)/sizeof(string)));\r
+               return myArray;\r
+       }\r
+       catch(exception& e) {\r
+               m->errorOut(e, "CatchAllCommand", "getRequiredParameters");\r
+               exit(1);\r
+       }\r
+}\r
+//**********************************************************************************************************************\r
+vector<string> CatchAllCommand::getRequiredFiles(){    \r
+       try {\r
+               vector<string> myArray;\r
+               return myArray;\r
+       }\r
+       catch(exception& e) {\r
+               m->errorOut(e, "CatchAllCommand", "getRequiredFiles");\r
+               exit(1);\r
+       }\r
+}\r
+/**************************************************************************************/\r
+CatchAllCommand::CatchAllCommand(string option)  {     \r
+       try {\r
+               globaldata = GlobalData::getInstance();\r
+               abort = false;\r
+               allLines = 1;\r
+               \r
+               //allow user to run help\r
+               if(option == "help") { help(); abort = true; }\r
+               \r
+               else {\r
+                       //valid paramters for this command\r
+                       string Array[] =  {"sabund","label","inputdir","outputdir"};\r
+                       vector<string> myArray (Array, Array+(sizeof(Array)/sizeof(string)));\r
+                       \r
+                       OptionParser parser(option);\r
+                       map<string,string> parameters = parser.getParameters();\r
+                       \r
+                       ValidParameters validParameter;\r
+                       map<string, string>::iterator it;\r
+               \r
+                       //check to make sure all parameters are valid for command\r
+                       for (it = parameters.begin(); it != parameters.end(); it++) { \r
+                               if (validParameter.isValidParameter(it->first, myArray, it->second) != true) {  abort = true;  }\r
+                       }\r
+                       \r
+                       //initialize outputTypes\r
+                       vector<string> tempOutNames;\r
+                       outputTypes["csv"] = tempOutNames;\r
+                       outputTypes["summary"] = tempOutNames;\r
+                       \r
+                       //if the user changes the input directory command factory will send this info to us in the output parameter \r
+                       string inputDir = validParameter.validFile(parameters, "inputdir", false);              \r
+                       if (inputDir == "not found"){   inputDir = "";          }\r
+                       else {\r
+                               string path;\r
+                               it = parameters.find("sabund");\r
+                               //user has given a template file\r
+                               if(it != parameters.end()){ \r
+                                       path = m->hasPath(it->second);\r
+                                       //if the user has not given a path then, add inputdir. else leave path alone.\r
+                                       if (path == "") {       parameters["sabund"] = inputDir + it->second;           }\r
+                               }\r
+                       }\r
+\r
+                       //check for required parameters\r
+                       sabundfile = validParameter.validFile(parameters, "sabund", true);\r
+                       if (sabundfile == "not open") { sabundfile = ""; abort = true; }\r
+                       else if (sabundfile == "not found") { sabundfile = "";  m->mothurOut("You must provide a sabund file for the catchall command."); m->mothurOutEndLine(); abort=true; }\r
+                       else { globaldata->setSabundFile(sabundfile); globaldata->setFormat("sabund"); }\r
+                       \r
+                       string label = validParameter.validFile(parameters, "label", false);                    \r
+                       if (label == "not found") { label = ""; }\r
+                       else { \r
+                               if(label != "all") {  m->splitAtDash(label, labels);  allLines = 0;  }\r
+                               else { allLines = 1;  }\r
+                       }\r
+               \r
+\r
+                       //if the user changes the output directory command factory will send this info to us in the output parameter \r
+                       outputDir = validParameter.validFile(parameters, "outputdir", false);           if (outputDir == "not found"){  outputDir = m->hasPath(sabundfile);     }\r
+               }\r
+\r
+       }\r
+       catch(exception& e) {\r
+               m->errorOut(e, "CatchAllCommand", "CatchAllCommand");\r
+               exit(1);\r
+       }\r
+}\r
+//**********************************************************************************************************************\r
+\r
+void CatchAllCommand::help(){\r
+       try {\r
+               m->mothurOut("The catchall command interfaces mothur with the catchall program written by Linda Woodard, Sean Connolly and John Bunge.\n");\r
+               m->mothurOut("For more information about catchall refer to http://www.northeastern.edu/catchall/index.html \n");\r
+               m->mothurOut("The catchall executable must be in the same folder as your mothur executable. \n");\r
+               m->mothurOut("If you are a MAC or Linux user you must also have installed mono, a link to mono is on the webpage. \n");\r
+               m->mothurOut("The catchall command parameters are sabund and label, sabund is required. \n");\r
+               m->mothurOut("The label parameter is used to analyze specific labels in your input.\n");\r
+               m->mothurOut("The catchall command should be in the following format: \n");\r
+               m->mothurOut("catchall(sabund=yourSabundFile) \n");\r
+               m->mothurOut("Example: catchall(sabund=abrecovery.fn.sabund) \n");      \r
+       }\r
+       catch(exception& e) {\r
+               m->errorOut(e, "CatchAllCommand", "help");\r
+               exit(1);\r
+       }\r
+}\r
+\r
+/**************************************************************************************/\r
+int CatchAllCommand::execute() {       \r
+       try {\r
+               \r
+               if (abort == true) { return 0; }\r
+               \r
+               //prepare full output directory\r
+               outputDir = m->getFullPathName(outputDir);\r
+               \r
+               //get location of catchall\r
+               GlobalData* globaldata = GlobalData::getInstance();\r
+               path = globaldata->argv;\r
+               path = path.substr(0, (path.find_last_of('m')));\r
+               path = m->getFullPathName(path);\r
+\r
+               string catchAllCommandExe = ""; \r
+               #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)\r
+                       catchAllCommandExe += "mono " + path + "CatchAllcmdL.exe ";\r
+               #else\r
+                       catchAllCommandExe += "\"" + path + "CatchAllcmdW.exe\"" + " ";\r
+               #endif\r
+               \r
+               read = new ReadOTUFile(sabundfile);     \r
+               read->read(&*globaldata); \r
+               \r
+               SAbundVector* sabund = globaldata->sabund;\r
+               string lastLabel = sabund->getLabel();\r
+               input = globaldata->ginput;\r
+                                               \r
+               set<string> processedLabels;\r
+               set<string> userLabels = labels;\r
+               \r
+               string summaryfilename = outputDir + m->getRootName(m->getSimpleName(sabundfile)) + "catchall.summary";\r
+               summaryfilename = m->getFullPathName(summaryfilename);\r
+               outputNames.push_back(summaryfilename); outputTypes["summary"].push_back(summaryfilename);\r
+               \r
+               ofstream out;\r
+               m->openOutputFile(summaryfilename, out);        \r
+               \r
+               out << "label\tmodel\testimate\tlci\tuci" << endl;\r
+               \r
+               //for each label the user selected\r
+               while((sabund != NULL) && ((allLines == 1) || (userLabels.size() != 0))) {\r
+\r
+                                       \r
+                       if(allLines == 1 || labels.count(sabund->getLabel()) == 1){\r
+                                       m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();\r
+                                       \r
+                                       //create catchall input file from mothur's inputfile\r
+                                       string filename = process(sabund);\r
+                                       string outputPath = m->getPathName(filename);\r
+                               \r
+                                       //create system command\r
+                                       string catchAllCommand = "";\r
+                                       #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)\r
+                                               catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1";\r
+                                       #else\r
+                                               if (outputPath.length() > 0) { outputPath = outputPath.substr(0, outputPath.length()-1); }\r
+                                               catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \""  + outputPath + "\" 1";\r
+                                               //wrap entire string in ""\r
+                                               catchAllCommand = "\"" + catchAllCommand + "\"";\r
+                                       #endif\r
+                                                                       //run catchall\r
+                                       system(catchAllCommand.c_str());\r
+                               \r
+                                       remove(filename.c_str());\r
+                               \r
+                                       filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .\r
+                               \r
+                                       outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");\r
+                                       outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");\r
+                                       outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");\r
+                                       outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");\r
+                               \r
+                                       createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out);\r
+                                                                               \r
+                                       if (m->control_pressed) { out.close(); for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str());    } delete read;  delete input; globaldata->ginput = NULL; delete sabund;  return 0; }\r
+\r
+                                       processedLabels.insert(sabund->getLabel());\r
+                                       userLabels.erase(sabund->getLabel());\r
+                       }\r
+                       \r
+                       if ((m->anyLabelsToProcess(sabund->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) {\r
+                                       string saveLabel = sabund->getLabel();\r
+                                       \r
+                                       delete sabund;          \r
+                                       sabund = (input->getSAbundVector(lastLabel));\r
+                                       \r
+                                       m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();\r
+                                       \r
+\r
+                                       //create catchall input file from mothur's inputfile\r
+                                       string filename = process(sabund);\r
+                                       string outputPath = m->getPathName(filename);\r
+                                       \r
+                                       //create system command\r
+                                       string catchAllCommand = "";\r
+                                       #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)\r
+                                               catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1";\r
+                                       #else\r
+                                               if (outputPath.length() > 0) { outputPath = outputPath.substr(0, outputPath.length()-1); }\r
+                                               catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \""  + outputPath + "\" 1";\r
+                                               catchAllCommand = "\"" + catchAllCommand + "\"";\r
+                                       #endif\r
+\r
+                                       //run catchall\r
+                                       system(catchAllCommand.c_str());\r
+                               \r
+                                       remove(filename.c_str());\r
+                               \r
+                                       filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .\r
+                               \r
+                                       outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");\r
+                                       outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");\r
+                                       outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");\r
+                                       outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");\r
+                               \r
+                                       createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out);\r
+                               \r
+                                       if (m->control_pressed) { out.close(); for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str());    } delete read;  delete input; globaldata->ginput = NULL; delete sabund;  return 0; }\r
+\r
+                                       processedLabels.insert(sabund->getLabel());\r
+                                       userLabels.erase(sabund->getLabel());\r
+                                       \r
+                                       //restore real lastlabel to save below\r
+                                       sabund->setLabel(saveLabel);\r
+                       }\r
+                       \r
+                       \r
+                       lastLabel = sabund->getLabel(); \r
+                       \r
+                       delete sabund;          \r
+                       sabund = (input->getSAbundVector());\r
+               }\r
+               \r
+               //output error messages about any remaining user labels\r
+               set<string>::iterator it;\r
+               bool needToRun = false;\r
+               for (it = userLabels.begin(); it != userLabels.end(); it++) {  \r
+                       m->mothurOut("Your file does not include the label " + *it); \r
+                       if (processedLabels.count(lastLabel) != 1) {\r
+                               m->mothurOut(". I will use " + lastLabel + ".");  m->mothurOutEndLine();\r
+                               needToRun = true;\r
+                       }else {\r
+                               m->mothurOut(". Please refer to " + lastLabel + ".");  m->mothurOutEndLine();\r
+                       }\r
+               }\r
+               \r
+               //run last label if you need to\r
+               if (needToRun == true)  {\r
+                       if (sabund != NULL) {   delete sabund;  }\r
+                       sabund = (input->getSAbundVector(lastLabel));\r
+                       \r
+                       m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();\r
+                       \r
+                       //create catchall input file from mothur's inputfile\r
+                       string filename = process(sabund);\r
+                       string outputPath = m->getPathName(filename);\r
+                       \r
+                       //create system command\r
+                       string catchAllCommand = "";\r
+                       #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)\r
+                               catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1";\r
+                       #else\r
+                               if (outputPath.length() > 0) { outputPath = outputPath.substr(0, outputPath.length()-1); }\r
+                               catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \""  + outputPath + "\" 1";\r
+                               catchAllCommand = "\"" + catchAllCommand + "\"";\r
+                       #endif\r
+                       \r
+                       //run catchall\r
+                       system(catchAllCommand.c_str());\r
+                       \r
+                       remove(filename.c_str());\r
+                       \r
+                       filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .\r
+                       \r
+                       outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");\r
+                       outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");\r
+                       outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");\r
+                       outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");        \r
+                       \r
+                       createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out);\r
+                       \r
+                       delete sabund;\r
+               }\r
+               \r
+               out.close();\r
+               delete read;\r
+               delete input; globaldata->ginput = NULL;\r
+               \r
+               if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str()); } return 0; }\r
+               \r
+               m->mothurOutEndLine();\r
+               m->mothurOut("Output File Names: "); m->mothurOutEndLine();\r
+               for (int i = 0; i < outputNames.size(); i++) {  m->mothurOut(outputNames[i]); m->mothurOutEndLine();    }       \r
+               m->mothurOutEndLine();\r
+               \r
+\r
+               return 0;\r
+       }\r
+       catch(exception& e) {\r
+               m->errorOut(e, "CatchAllCommand", "execute");\r
+               exit(1);\r
+       }\r
+}\r
+//**********************************************************************************************************************\r
+string CatchAllCommand::process(SAbundVector* sabund) {\r
+       try {\r
+               string filename = outputDir + m->getRootName(m->getSimpleName(sabundfile)) + sabund->getLabel() + ".csv";\r
+               filename = m->getFullPathName(filename);\r
+       \r
+               ofstream out;\r
+               m->openOutputFile(filename, out);\r
+               \r
+               for (int i = 1; i <= sabund->getMaxRank(); i++) {\r
+                       int temp = sabund->get(i);\r
+                       \r
+                       if (temp != 0) {\r
+                               out << i << "," << temp << endl;\r
+                       }\r
+               }\r
+               out.close();\r
+               \r
+               return filename;\r
+       \r
+       }\r
+       catch(exception& e) {\r
+               m->errorOut(e, "CatchAllCommand", "process");\r
+               exit(1);\r
+       }\r
+}\r
+//**********************************************************************************************************************\r
+int CatchAllCommand::createSummaryFile(string file1, string label, ofstream& out) {\r
+       try {\r
+               \r
+               ifstream in;\r
+               m->openInputFile(file1, in);\r
+               \r
+               if (!in.eof()) {\r
+                       \r
+                       string header = m->getline(in); m->gobble(in);\r
+                       \r
+                       int pos = header.find("Total Number of Observed Species =");\r
+                       string numString = "";\r
+                       \r
+                       \r
+                       if (pos == string::npos) { m->mothurOut("[ERROR]: cannot parse " + file1); m->mothurOutEndLine(); }\r
+                       else {\r
+                               //pos will be the position of the T in total, so we want to count to the position of =\r
+                               pos += 34;\r
+                               char c=header[pos];\r
+                               while (c != ','){\r
+                                       if (c != ' ') {\r
+                                               numString += c;\r
+                                       }\r
+                                       pos++;\r
+                                       c=header[pos];\r
+                                       \r
+                                       //sanity check\r
+                                       if (pos > header.length()) { m->mothurOut("Cannot find number of OTUs in " + file1); m->mothurOutEndLine(); in.close(); return 0; }\r
+                               }\r
+                       }\r
+                                                                                                                         \r
+                       string firstline = m->getline(in); m->gobble(in);\r
+                       vector<string> values;\r
+                       m->splitAtComma(firstline, values);\r
+                       \r
+                       values.pop_back(); //last value is always a blank string since the last character in the line is always a ','\r
+                       \r
+                       if (values.size() == 1) { //grab next line if firstline didn't have what you wanted\r
+                               string secondline = m->getline(in); m->gobble(in);\r
+                               values.clear();\r
+                               m->splitAtComma(secondline, values);\r
+                               \r
+                               values.pop_back(); //last value is always a blank string since the last character in the line is always a ','\r
+                       }\r
+                       \r
+                       if (values.size() == 1) { //still not what we wanted fill values with numOTUs\r
+                               values.resize(8, "");\r
+                               values[1] = "Sobs";\r
+                               values[4] = numString;\r
+                               values[6] = numString;\r
+                               values[7] = numString;\r
+                       }\r
+                       \r
+                       if (values.size() < 8) { values.resize(8, ""); }\r
+                       \r
+                       out << label << '\t' << values[1] << '\t' << values[4] << '\t' << values[6] << '\t' << values[7] << endl;\r
+               }\r
+               \r
+               in.close();\r
+               \r
+               return 0;\r
+               \r
+       }\r
+       catch(exception& e) {\r
+               m->errorOut(e, "CatchAllCommand", "createSummaryFile");\r
+               exit(1);\r
+       }\r
+}\r
+/**************************************************************************************/\r
+\r
+\r
+\r
diff --git a/mothur b/mothur
index f98378a61f3a546a8f38d45533fd788f52ae286b..59871633e8f80d829059529c7457d78ce8fc1821 100755 (executable)
Binary files a/mothur and b/mothur differ