]> git.donarmstrong.com Git - mothur.git/commitdiff
get.oturep change and trim.seqs fix
authorwestcott <westcott>
Wed, 8 Dec 2010 16:37:28 +0000 (16:37 +0000)
committerwestcott <westcott>
Wed, 8 Dec 2010 16:37:28 +0000 (16:37 +0000)
catchallcommand.cpp
getoturepcommand.cpp
mothur
trimseqscommand.cpp

index a07928bdf01b249b7925a912d5223e7e8e2eeac0..43fd9538e40cbe7e62adb8468b3408af715a0fb9 100644 (file)
-/*\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);
+       }
+}
+/**************************************************************************************/
index 818775fdd7e24678545750fcfad6596efdd666e6..44c58c31d26e66342e7a1bf73feb21f7f3919bfa 100644 (file)
@@ -437,7 +437,7 @@ int GetOTURepCommand::execute(){
                        delete read; delete input; delete list; globaldata->gListVector = NULL; return 0; 
                }
                
-               if (!weighted) { readNamesFile(weighted); }
+               if ((!weighted) && (namefile != "")) { readNamesFile(weighted); }
                
                while((list != NULL) && ((allLines == 1) || (userLabels.size() != 0))) {
                        
@@ -565,7 +565,7 @@ void GetOTURepCommand::readNamesFile() {
                
                string name, names, sequence;
        
-               while(inNames){
+               while(!inNames.eof()){
                        inNames >> name;                        //read from first column  A
                        inNames >> names;               //read from second column  A,B,C,D
                        
@@ -599,7 +599,7 @@ void GetOTURepCommand::readNamesFile(bool w) {
                
                string name, names, sequence;
                
-               while(inNames){
+               while(!inNames.eof()){
                        inNames >> name;        m->gobble(inNames);             //read from first column  A
                        inNames >> names;                                                       //read from second column  A,B,C,D
                        
diff --git a/mothur b/mothur
index 59871633e8f80d829059529c7457d78ce8fc1821..a3b2f0f971187f4342c63426b9ec87b924c1f70d 100755 (executable)
Binary files a/mothur and b/mothur differ
index 7ee5c99dd86775124a83400a92f3ac1d9e24ad16..5e0541f9cb954575d39d277cdf4a50d6931c21c2 100644 (file)
@@ -364,7 +364,7 @@ int TrimSeqsCommand::execute(){
                for(int i=0;i<fastaFileNames.size();i++){
                        
                        if (m->isBlank(fastaFileNames[i])) {  remove(fastaFileNames[i].c_str());        }
-                       else if (filesToRemove.count(fastaFileNames[i]) > 0) { remove(fastaFileNames[i].c_str()); }
+                       else if (filesToRemove.count(fastaFileNames[i]) > 0) {  remove(fastaFileNames[i].c_str()); }
                        else {
                                ifstream inFASTA;
                                string seqName;
@@ -470,6 +470,19 @@ int TrimSeqsCommand::driverCreateTrim(string filename, string qFileName, string
                ifstream qFile;
                if(qFileName != "")     {       m->openInputFile(qFileName, qFile);     qFile.seekg(qline->start);  }
                
+               
+               for (int i = 0; i < fastaNames.size(); i++) { //clears old file
+                       ofstream temp;
+                       m->openOutputFile(fastaNames[i], temp);
+                       temp.close();
+               }
+               for (int i = 0; i < qualNames.size(); i++) { //clears old file
+                       ofstream temp;
+                       m->openOutputFile(qualNames[i], temp);
+                       temp.close();
+               }
+               
+                       
                bool done = false;
                int count = 0;