5 * Created by westcott on 5/11/10.
6 * Copyright 2010 Schloss Lab. All rights reserved.
10 #include "catchallcommand.h"
11 #include "globaldata.hpp"
13 //**********************************************************************************************************************
14 vector<string> CatchAllCommand::getValidParameters(){
16 string AlignArray[] = {"sabund","label","inputdir","outputdir"};
17 vector<string> myArray (AlignArray, AlignArray+(sizeof(AlignArray)/sizeof(string)));
21 m->errorOut(e, "CatchAllCommand", "getValidParameters");
25 //**********************************************************************************************************************
26 CatchAllCommand::CatchAllCommand(){
28 //initialize outputTypes
29 vector<string> tempOutNames;
30 outputTypes["csv"] = tempOutNames;
31 outputTypes["summary"] = tempOutNames;
34 m->errorOut(e, "CatchAllCommand", "CatchAllCommand");
38 //**********************************************************************************************************************
39 vector<string> CatchAllCommand::getRequiredParameters(){
41 string AlignArray[] = {"sabund"};
42 vector<string> myArray (AlignArray, AlignArray+(sizeof(AlignArray)/sizeof(string)));
46 m->errorOut(e, "CatchAllCommand", "getRequiredParameters");
50 //**********************************************************************************************************************
51 vector<string> CatchAllCommand::getRequiredFiles(){
53 vector<string> myArray;
57 m->errorOut(e, "CatchAllCommand", "getRequiredFiles");
61 /**************************************************************************************/
62 CatchAllCommand::CatchAllCommand(string option) {
64 globaldata = GlobalData::getInstance();
68 //allow user to run help
69 if(option == "help") { help(); abort = true; }
72 //valid paramters for this command
73 string Array[] = {"sabund","label","inputdir","outputdir"};
74 vector<string> myArray (Array, Array+(sizeof(Array)/sizeof(string)));
76 OptionParser parser(option);
77 map<string,string> parameters = parser.getParameters();
79 ValidParameters validParameter;
80 map<string, string>::iterator it;
82 //check to make sure all parameters are valid for command
83 for (it = parameters.begin(); it != parameters.end(); it++) {
84 if (validParameter.isValidParameter(it->first, myArray, it->second) != true) { abort = true; }
87 //initialize outputTypes
88 vector<string> tempOutNames;
89 outputTypes["csv"] = tempOutNames;
90 outputTypes["summary"] = tempOutNames;
92 //if the user changes the input directory command factory will send this info to us in the output parameter
93 string inputDir = validParameter.validFile(parameters, "inputdir", false);
94 if (inputDir == "not found"){ inputDir = ""; }
97 it = parameters.find("sabund");
98 //user has given a template file
99 if(it != parameters.end()){
100 path = m->hasPath(it->second);
101 //if the user has not given a path then, add inputdir. else leave path alone.
102 if (path == "") { parameters["sabund"] = inputDir + it->second; }
106 //check for required parameters
107 sabundfile = validParameter.validFile(parameters, "sabund", true);
108 if (sabundfile == "not open") { sabundfile = ""; abort = true; }
109 else if (sabundfile == "not found") { sabundfile = ""; m->mothurOut("You must provide a sabund file for the catchall command."); m->mothurOutEndLine(); abort=true; }
110 else { globaldata->setSabundFile(sabundfile); globaldata->setFormat("sabund"); }
112 string label = validParameter.validFile(parameters, "label", false);
113 if (label == "not found") { label = ""; }
115 if(label != "all") { m->splitAtDash(label, labels); allLines = 0; }
116 else { allLines = 1; }
120 //if the user changes the output directory command factory will send this info to us in the output parameter
121 outputDir = validParameter.validFile(parameters, "outputdir", false); if (outputDir == "not found"){ outputDir = m->hasPath(sabundfile); }
125 catch(exception& e) {
126 m->errorOut(e, "CatchAllCommand", "CatchAllCommand");
130 //**********************************************************************************************************************
132 void CatchAllCommand::help(){
134 m->mothurOut("The catchall command interfaces mothur with the catchall program written by Linda Woodard, Sean Connolly and John Bunge.\n");
135 m->mothurOut("For more information about catchall refer to http://www.northeastern.edu/catchall/index.html \n");
136 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");
137 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");
138 m->mothurOut("The catchall command parameters are sabund and label, sabund is required. \n");
139 m->mothurOut("The label parameter is used to analyze specific labels in your input.\n");
140 m->mothurOut("The catchall command should be in the following format: \n");
141 m->mothurOut("catchall(sabund=yourSabundFile) \n");
142 m->mothurOut("Example: catchall(sabund=abrecovery.fn.sabund) \n");
144 catch(exception& e) {
145 m->errorOut(e, "CatchAllCommand", "help");
150 /**************************************************************************************/
151 int CatchAllCommand::execute() {
154 if (abort == true) { return 0; }
156 //prepare full output directory
157 outputDir = m->getFullPathName(outputDir);
159 //get location of catchall
160 GlobalData* globaldata = GlobalData::getInstance();
161 path = globaldata->argv;
162 path = path.substr(0, (path.find_last_of('m')));
163 path = m->getFullPathName(path);
165 string catchAllCommandExe = "";
166 #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)
167 catchAllCommandExe += "mono " + path + "catchall/CatchAllcmdL.exe ";
169 catchAllCommandExe += path + "catchall/CatchAllcmdW.exe ";
172 read = new ReadOTUFile(sabundfile);
173 read->read(&*globaldata);
175 SAbundVector* sabund = globaldata->sabund;
176 string lastLabel = sabund->getLabel();
177 input = globaldata->ginput;
179 set<string> processedLabels;
180 set<string> userLabels = labels;
182 //for each label the user selected
183 while((sabund != NULL) && ((allLines == 1) || (userLabels.size() != 0))) {
186 if(allLines == 1 || labels.count(sabund->getLabel()) == 1){
187 m->mothurOut(sabund->getLabel()); m->mothurOutEndLine();
189 //create catchall input file from mothur's inputfile
190 string filename = process(sabund);
191 string outputPath = m->getPathName(filename);
193 //create system command
194 string catchAllCommand = catchAllCommandExe + filename + " " + outputPath + " 1";
197 system(catchAllCommand.c_str());
199 remove(filename.c_str());
201 filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .
203 outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");
204 outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");
205 outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");
206 outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");
208 createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel());
210 if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str()); } delete read; delete input; globaldata->ginput = NULL; delete sabund; return 0; }
212 processedLabels.insert(sabund->getLabel());
213 userLabels.erase(sabund->getLabel());
216 if ((m->anyLabelsToProcess(sabund->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) {
217 string saveLabel = sabund->getLabel();
220 sabund = (input->getSAbundVector(lastLabel));
222 m->mothurOut(sabund->getLabel()); m->mothurOutEndLine();
225 //create catchall input file from mothur's inputfile
226 string filename = process(sabund);
227 string outputPath = m->getPathName(filename);
229 //create system command
230 string catchAllCommand = catchAllCommandExe + filename + " " + outputPath + " 1";
233 system(catchAllCommand.c_str());
235 remove(filename.c_str());
237 filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .
239 outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");
240 outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");
241 outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");
242 outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");
244 createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel());
246 if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str()); } delete read; delete input; globaldata->ginput = NULL; delete sabund; return 0; }
248 processedLabels.insert(sabund->getLabel());
249 userLabels.erase(sabund->getLabel());
251 //restore real lastlabel to save below
252 sabund->setLabel(saveLabel);
256 lastLabel = sabund->getLabel();
259 sabund = (input->getSAbundVector());
262 //output error messages about any remaining user labels
263 set<string>::iterator it;
264 bool needToRun = false;
265 for (it = userLabels.begin(); it != userLabels.end(); it++) {
266 m->mothurOut("Your file does not include the label " + *it);
267 if (processedLabels.count(lastLabel) != 1) {
268 m->mothurOut(". I will use " + lastLabel + "."); m->mothurOutEndLine();
271 m->mothurOut(". Please refer to " + lastLabel + "."); m->mothurOutEndLine();
275 //run last label if you need to
276 if (needToRun == true) {
277 if (sabund != NULL) { delete sabund; }
278 sabund = (input->getSAbundVector(lastLabel));
280 m->mothurOut(sabund->getLabel()); m->mothurOutEndLine();
282 //create catchall input file from mothur's inputfile
283 string filename = process(sabund);
284 string outputPath = m->getPathName(filename);
286 //create system command
287 string catchAllCommand = catchAllCommandExe + filename + " " + outputPath + " 1";
290 system(catchAllCommand.c_str());
292 remove(filename.c_str());
294 filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra .
296 outputNames.push_back(filename + "_Analysis.csv"); outputTypes["csv"].push_back(filename + "_Analysis.csv");
297 outputNames.push_back(filename + "_BestModelsAnalysis.csv"); outputTypes["csv"].push_back(filename + "_BestModelsAnalysis.csv");
298 outputNames.push_back(filename + "_BestModelsFits.csv"); outputTypes["csv"].push_back(filename + "_BestModelsFits.csv");
299 outputNames.push_back(filename + "_BubblePlot.csv"); outputTypes["csv"].push_back(filename + "_BubblePlot.csv");
301 createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel());
307 delete input; globaldata->ginput = NULL;
309 if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) {remove(outputNames[i].c_str()); } return 0; }
311 m->mothurOutEndLine();
312 m->mothurOut("Output File Names: "); m->mothurOutEndLine();
313 for (int i = 0; i < outputNames.size(); i++) { m->mothurOut(outputNames[i]); m->mothurOutEndLine(); }
314 m->mothurOutEndLine();
319 catch(exception& e) {
320 m->errorOut(e, "CatchAllCommand", "execute");
324 //**********************************************************************************************************************
325 string CatchAllCommand::process(SAbundVector* sabund) {
327 string filename = outputDir + m->getRootName(m->getSimpleName(sabundfile)) + sabund->getLabel() + ".csv";
328 filename = m->getFullPathName(filename);
331 m->openOutputFile(filename, out);
333 for (int i = 1; i <= sabund->getMaxRank(); i++) {
334 int temp = sabund->get(i);
337 out << i << "," << temp << endl;
345 catch(exception& e) {
346 m->errorOut(e, "CatchAllCommand", "process");
350 //**********************************************************************************************************************
351 string CatchAllCommand::createSummaryFile(string file1, string label) {
353 string filename = outputDir + m->getRootName(m->getSimpleName(sabundfile)) + label + ".catchall.summary";
354 filename = m->getFullPathName(filename);
355 outputNames.push_back(filename); outputTypes["summary"].push_back(filename);
358 m->openOutputFile(filename, out);
360 out << "group\tmodel\testimate\tlci\tuci" << endl;
363 m->openInputFile(file1, in);
367 string header = m->getline(in); m->gobble(in);
369 int pos = header.find("Total Number of Observed Species =");
370 cout << pos << '\t' << header.length() << endl; exit(1);
371 if (pos == string::npos) { m->mothurOut("[ERROR]: cannot parse " + file1); m->mothurOutEndLine(); }
373 //pos will be the position of the T in total, so we want to count to the position of =
376 string numString = "";
383 int numOtus; convert(numString, numOtus);
384 cout << numOtus << endl;
394 catch(exception& e) {
395 m->errorOut(e, "CatchAllCommand", "createSummaryFile");
399 /**************************************************************************************/