]> git.donarmstrong.com Git - mothur.git/blobdiff - catchallcommand.cpp
get.oturep change and trim.seqs fix
[mothur.git] / catchallcommand.cpp
index b185b9f49baf98e96a78fc836c4668a5d0a14972..43fd9538e40cbe7e62adb8468b3408af715a0fb9 100644 (file)
 #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 = 0;
+               allLines = 1;
                
                //allow user to run help
                if(option == "help") { help(); abort = true; }
@@ -36,6 +84,11 @@ CatchAllCommand::CatchAllCommand(string option)  {
                                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 = "";          }
@@ -53,7 +106,7 @@ CatchAllCommand::CatchAllCommand(string option)  {
                        //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 either a sabund file for the catchall command."); m->mothurOutEndLine(); 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);                    
@@ -65,7 +118,7 @@ CatchAllCommand::CatchAllCommand(string option)  {
                
 
                        //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 = "./";       }
+                       outputDir = validParameter.validFile(parameters, "outputdir", false);           if (outputDir == "not found"){  outputDir = m->hasPath(sabundfile);     }
                }
 
        }
@@ -78,9 +131,10 @@ CatchAllCommand::CatchAllCommand(string option)  {
 
 void CatchAllCommand::help(){
        try {
-               m->mothurOut("The catchall command interfaces mothur with the catchall program written by ...citation goes here...\n");
-               m->mothurOut("For more information about clearcut refer to http://catchall.cac.cornell.edu/ \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("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");
@@ -99,22 +153,20 @@ int CatchAllCommand::execute() {
                
                if (abort == true) { return 0; }
                
-               vector<string> outputNames;
-               
                //prepare full output directory
                outputDir = m->getFullPathName(outputDir);
                
                //get location of catchall
                GlobalData* globaldata = GlobalData::getInstance();
-               string path = globaldata->argv;
+               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 ";
+                       catchAllCommandExe += "mono " + path + "CatchAllcmdL.exe ";
                #else
-                       catchAllCommandExe += path + "catchall/CatchAllcmdW.exe ";
+                       catchAllCommandExe += "\"" + path + "CatchAllcmdW.exe\"" + " ";
                #endif
                
                read = new ReadOTUFile(sabundfile);     
@@ -127,6 +179,15 @@ int CatchAllCommand::execute() {
                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))) {
 
@@ -134,26 +195,35 @@ int CatchAllCommand::execute() {
                        if(allLines == 1 || labels.count(sabund->getLabel()) == 1){
                                        m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();
                                        
-                                       //create list of output files catchall will make
-                                       //datasetname_Analysis.csv 
-                                       //datasetname_BestModelsAnalysis.csv
-                                       //datasetname_BestModelsFits.csv 
-                                       //datasetname_BubblePlot.csv 
-                                       //datasetname_Poisson_fits.csv 
-                                       //datasetname_SingleExp_fits.csv
-                                       //datasetname_ThreeMixedExp_fits.csv
-                                       //datasetname_TwoMixedExp_fits.csv
-
                                        //create catchall input file from mothur's inputfile
                                        string filename = process(sabund);
-       sabund->print(cout);                                                    
+                                       string outputPath = m->getPathName(filename);
+                               
                                        //create system command
-                                       string catchAllCommand = catchAllCommandExe + filename + " " + path;
-cout << catchAllCommand << endl;
-                                       //run catchall
+                                       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) { delete read;  delete input; globaldata->ginput = NULL; delete sabund;  return 0; }
+                                       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());
@@ -167,27 +237,36 @@ cout << catchAllCommand << endl;
                                        
                                        m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();
                                        
-                                       //create list of output files catchall will make
-                                       //datasetname_Analysis.csv 
-                                       //datasetname_BestModelsAnalysis.csv
-                                       //datasetname_BestModelsFits.csv 
-                                       //datasetname_BubblePlot.csv 
-                                       //datasetname_Poisson_fits.csv 
-                                       //datasetname_SingleExp_fits.csv
-                                       //datasetname_ThreeMixedExp_fits.csv
-                                       //datasetname_TwoMixedExp_fits.csv
 
-                                       
                                        //create catchall input file from mothur's inputfile
                                        string filename = process(sabund);
-                       
+                                       string outputPath = m->getPathName(filename);
+                                       
                                        //create system command
-                                       string catchAllCommand = catchAllCommandExe + filename + " " + path;
-cout << catchAllCommand << endl;
+                                       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());
-
-                                       if (m->control_pressed) { delete read;  delete input; globaldata->ginput = NULL; delete sabund;  return 0; }
+                               
+                                       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());
@@ -222,32 +301,44 @@ cout << catchAllCommand << endl;
                        sabund = (input->getSAbundVector(lastLabel));
                        
                        m->mothurOut(sabund->getLabel());  m->mothurOutEndLine();
-                       //create list of output files catchall will make
-                       //datasetname_Analysis.csv 
-                       //datasetname_BestModelsAnalysis.csv
-                       //datasetname_BestModelsFits.csv 
-                       //datasetname_BubblePlot.csv 
-                       //datasetname_Poisson_fits.csv 
-                       //datasetname_SingleExp_fits.csv
-                       //datasetname_ThreeMixedExp_fits.csv
-                       //datasetname_TwoMixedExp_fits.csv
-
+                       
                        //create catchall input file from mothur's inputfile
                        string filename = process(sabund);
-
+                       string outputPath = m->getPathName(filename);
+                       
                        //create system command
-                       string catchAllCommand = catchAllCommandExe + filename + " " + path;
-cout << catchAllCommand << endl;
+                       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();    }       
@@ -264,7 +355,7 @@ cout << catchAllCommand << endl;
 //**********************************************************************************************************************
 string CatchAllCommand::process(SAbundVector* sabund) {
        try {
-               string filename = outputDir + m->getRootName(m->getSimpleName(sabundfile)) + sabund->getLabel() + ".catchall";
+               string filename = outputDir + m->getRootName(m->getSimpleName(sabundfile)) + sabund->getLabel() + ".csv";
                filename = m->getFullPathName(filename);
        
                ofstream out;
@@ -287,7 +378,73 @@ string CatchAllCommand::process(SAbundVector* sabund) {
                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);
+       }
+}
 /**************************************************************************************/
-
-
-