-/*
- * 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