-/*\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
+/*
+ * 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 the same folder as your mothur executable. \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 + "CatchAllcmdL.exe ";
+ #else
+ catchAllCommandExe += "\"" + path + "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 = "";
+ #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+ catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1";
+ #else
+ if (outputPath.length() > 0) { outputPath = outputPath.substr(0, outputPath.length()-1); }
+ catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \"" + outputPath + "\" 1";
+ //wrap entire string in ""
+ catchAllCommand = "\"" + catchAllCommand + "\"";
+ #endif
+ //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 = "";
+ #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+ catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1";
+ #else
+ if (outputPath.length() > 0) { outputPath = outputPath.substr(0, outputPath.length()-1); }
+ catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \"" + outputPath + "\" 1";
+ catchAllCommand = "\"" + catchAllCommand + "\"";
+ #endif
+
+ //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 = "";
+ #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
+ catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1";
+ #else
+ if (outputPath.length() > 0) { outputPath = outputPath.substr(0, outputPath.length()-1); }
+ catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \"" + outputPath + "\" 1";
+ catchAllCommand = "\"" + catchAllCommand + "\"";
+ #endif
+
+ //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);
+ }
+}
+/**************************************************************************************/