X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=catchallcommand.cpp;h=a914f733caef6f3535bfe88a4ff532a2989f7971;hp=39cc44f86e2cbe70efba4cb2700ad3154eb91945;hb=050a3ff02473a3d4c0980964e1a9ebe52e55d6b8;hpb=19fcbbdba99658f5eca244803280f9ee7f9f6607 diff --git a/catchallcommand.cpp b/catchallcommand.cpp index 39cc44f..a914f73 100644 --- a/catchallcommand.cpp +++ b/catchallcommand.cpp @@ -12,12 +12,12 @@ //********************************************************************************************************************** vector CatchAllCommand::setParameters(){ try { - CommandParameter plabel("label", "String", "", "", "", "", "",false,false); parameters.push_back(plabel); + CommandParameter plabel("label", "String", "", "", "", "", "","",false,false); parameters.push_back(plabel); //can choose shared or sabund not both, so put them in the same chooseOnlyOneGroup - CommandParameter pshared("shared", "InputTypes", "", "", "catchallInputs", "catchallInputs", "none",false,false); parameters.push_back(pshared); - CommandParameter psabund("sabund", "InputTypes", "", "", "catchallInputs", "catchallInputs", "none",false,false); parameters.push_back(psabund); - CommandParameter pinputdir("inputdir", "String", "", "", "", "", "",false,false); parameters.push_back(pinputdir); - CommandParameter poutputdir("outputdir", "String", "", "", "", "", "",false,false); parameters.push_back(poutputdir); + CommandParameter pshared("shared", "InputTypes", "", "", "catchallInputs", "catchallInputs", "none","analysis-bestanalysis-models-bubble-summary",false,false,true); parameters.push_back(pshared); + CommandParameter psabund("sabund", "InputTypes", "", "", "catchallInputs", "catchallInputs", "none","analysis-bestanalysis-models-bubble-summary",false,false,true); parameters.push_back(psabund); + CommandParameter pinputdir("inputdir", "String", "", "", "", "", "","",false,false); parameters.push_back(pinputdir); + CommandParameter poutputdir("outputdir", "String", "", "", "", "", "","",false,false); parameters.push_back(poutputdir); vector myArray; for (int i = 0; i < parameters.size(); i++) { myArray.push_back(parameters[i].name); } @@ -49,14 +49,38 @@ string CatchAllCommand::getHelpString(){ } } //********************************************************************************************************************** +string CatchAllCommand::getOutputPattern(string type) { + try { + string pattern = ""; + + if (type == "analysis") { pattern = "[filename],_Analysis.csv"; } + else if (type == "bestanalysis") { pattern = "[filename],_BestModelsAnalysis.csv"; } + else if (type == "models") { pattern = "[filename],_BestModelsAnalysis.csv"; } + else if (type == "bubble") { pattern = "[filename],_BubblePlot.csv"; } + else if (type == "summary") { pattern = "[filename],catchall.summary"; } + else if (type == "sabund") { pattern = "[filename],[distance],csv"; } + else { m->mothurOut("[ERROR]: No definition for type " + type + " output pattern.\n"); m->control_pressed = true; } + + return pattern; + } + catch(exception& e) { + m->errorOut(e, "CatchAllCommand", "getOutputPattern"); + exit(1); + } +} +//********************************************************************************************************************** CatchAllCommand::CatchAllCommand(){ try { abort = true; calledHelp = true; setParameters(); //initialize outputTypes vector tempOutNames; - outputTypes["csv"] = tempOutNames; + outputTypes["analysis"] = tempOutNames; + outputTypes["bestanalysis"] = tempOutNames; + outputTypes["models"] = tempOutNames; + outputTypes["bubble"] = tempOutNames; outputTypes["summary"] = tempOutNames; + outputTypes["sabund"] = tempOutNames; } catch(exception& e) { m->errorOut(e, "CatchAllCommand", "CatchAllCommand"); @@ -90,8 +114,13 @@ CatchAllCommand::CatchAllCommand(string option) { //initialize outputTypes vector tempOutNames; - outputTypes["csv"] = tempOutNames; - outputTypes["summary"] = tempOutNames; + outputTypes["analysis"] = tempOutNames; + outputTypes["bestanalysis"] = tempOutNames; + outputTypes["models"] = tempOutNames; + outputTypes["bubble"] = tempOutNames; + outputTypes["summary"] = tempOutNames; + outputTypes["sabund"] = 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); @@ -174,19 +203,52 @@ int CatchAllCommand::execute() { path = path.substr(0, (path.find_last_of("othur")-5)); path = m->getFullPathName(path); + if (m->debug) { m->mothurOut("[DEBUG]: mothur's path = " + path + "\n"); } + savedOutputDir = outputDir; - string catchAllCommandExe = ""; - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - catchAllCommandExe += "mono " + path + "CatchAllcmdL.exe "; + string catchAllCommandExe = ""; + string catchAllTest = ""; + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) if (outputDir == "") { outputDir = "./"; } //force full pathname to be created for catchall, this is necessary because if catchall is in the path it will look for input file whereever the exe is and not the cwd. + catchAllTest = path + "CatchAllcmdL.exe"; #else - catchAllCommandExe += "\"" + path + "CatchAllcmdW.exe\"" + " "; if (outputDir == "") { outputDir = ".\\"; } //force full pathname to be created for catchall, this is necessary because if catchall is in the path it will look for input file whereever the exe is and not the cwd. + catchAllTest = path + "CatchAllcmdW.exe"; #endif + //test to make sure formatdb exists + ifstream in; + catchAllTest = m->getFullPathName(catchAllTest); + int ableToOpen = m->openInputFile(catchAllTest, in, "no error"); in.close(); + if(ableToOpen == 1) { + m->mothurOut(catchAllTest + " file does not exist. Checking path... \n"); + //check to see if uchime is in the path?? + + string programName = "CatchAllcmdW.exe"; +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + programName = "CatchAllcmdL.exe"; +#endif + string cLocation = m->findProgramPath(programName); + + ifstream in2; + ableToOpen = m->openInputFile(cLocation, in2, "no error"); in2.close(); + + if(ableToOpen == 1) { m->mothurOut("[ERROR]: " + cLocation + " file does not exist. mothur requires the catchall executable."); m->mothurOutEndLine(); return 0; } + else { m->mothurOut("Found catchall in your path, using " + cLocation + "\n"); catchAllTest = cLocation; } + } + catchAllTest = m->getFullPathName(catchAllTest); + +#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + catchAllCommandExe += "mono \"" + catchAllTest + "\" "; +#else + catchAllCommandExe += "\"" + catchAllTest + "\" "; +#endif + //prepare full output directory outputDir = m->getFullPathName(outputDir); + if (m->debug) { m->mothurOut("[DEBUG]: catchall location = " + catchAllCommandExe + "\n[DEBUG]: outputDir = " + outputDir + "\n"); } + vector inputFileNames; if (sharedfile != "") { inputFileNames = parseSharedFile(sharedfile); } else { inputFileNames.push_back(sabundfile); } @@ -196,24 +258,30 @@ int CatchAllCommand::execute() { m->mothurOutEndLine(); m->mothurOut("Processing group " + groups[p]); m->mothurOutEndLine(); m->mothurOutEndLine(); } - InputData* input = new InputData(inputFileNames[p], "sabund"); - SAbundVector* sabund = input->getSAbundVector(); + InputData input(inputFileNames[p], "sabund"); + SAbundVector* sabund = input.getSAbundVector(); string lastLabel = sabund->getLabel(); set processedLabels; set userLabels = labels; - string summaryfilename = outputDir + m->getRootName(m->getSimpleName(inputFileNames[p])) + "catchall.summary"; + map variables; + variables["[filename]"] = outputDir + m->getRootName(m->getSimpleName(inputFileNames[p])); + string summaryfilename = getOutputFileName("summary", variables); summaryfilename = m->getFullPathName(summaryfilename); + if (m->debug) { m->mothurOut("[DEBUG]: Input File = " + inputFileNames[p] + ".\n[DEBUG]: inputdata address = " + toString(&input) + ".\n[DEBUG]: sabund address = " + toString(&sabund) + ".\n"); } + ofstream out; m->openOutputFile(summaryfilename, out); out << "label\tmodel\testimate\tlci\tuci" << endl; + + if (m->debug) { string open = "no"; if (out.is_open()) { open = "yes"; } m->mothurOut("[DEBUG]: output stream is open = " + open + ".\n"); } //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(); @@ -221,34 +289,52 @@ int CatchAllCommand::execute() { //create catchall input file from mothur's inputfile string filename = process(sabund, inputFileNames[p]); string outputPath = m->getPathName(filename); - + //create system command string catchAllCommand = ""; - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1"; + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + 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 + "\""; + //removes extra '\\' catchall doesnt like that + vector tempNames; + string tempFilename = filename; + m->splitAtDash(tempFilename, tempNames); + tempFilename = tempNames[0]; + tempNames.clear(); + string tempOutputPath = outputPath; + m->splitAtDash(tempOutputPath, tempNames); + tempOutputPath = tempNames[0]; + if (tempOutputPath.length() > 0) { tempOutputPath = tempOutputPath.substr(0, tempOutputPath.length()-1); } + catchAllCommand += catchAllCommandExe + "\"" + tempFilename + "\" \"" + tempOutputPath + "\" 1"; + catchAllCommand = "\"" + catchAllCommand + "\""; #endif - + + if (m->debug) { m->mothurOut("[DEBUG]: catchall command = " + catchAllCommand + ". About to call system.\n"); } + //run catchall system(catchAllCommand.c_str()); - - m->mothurRemove(filename); + + if (m->debug) { m->mothurOut("[DEBUG]: back from system call. Keeping file: " + filename + ".\n"); } + + if (!m->debug) { m->mothurRemove(filename); } + filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra . if (savedOutputDir == "") { filename = m->getSimpleName(filename); } - 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"); - + variables["[filename]"] = filename; + outputNames.push_back(getOutputFileName("analysis", variables)); outputTypes["analysis"].push_back(getOutputFileName("analysis", variables)); + outputNames.push_back(getOutputFileName("bestanalysis", variables)); outputTypes["bestanalysis"].push_back(getOutputFileName("bestanalysis", variables)); + outputNames.push_back(getOutputFileName("models", variables)); outputTypes["models"].push_back(getOutputFileName("models", variables)); + outputNames.push_back(getOutputFileName("bubble", variables)); outputTypes["bubble"].push_back(getOutputFileName("bubble", variables)); + + if (m->debug) { m->mothurOut("[DEBUG]: About to create summary file for: " + filename + ".\n[DEBUG]: sabund label = " + sabund->getLabel() + ".\n"); } + createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out); + + if (m->debug) { m->mothurOut("[DEBUG]: Done creating summary file.\n"); } - if (m->control_pressed) { out.close(); for (int i = 0; i < outputNames.size(); i++) {m->mothurRemove(outputNames[i]); } delete input; delete sabund; return 0; } + if (m->control_pressed) { out.close(); for (int i = 0; i < outputNames.size(); i++) {m->mothurRemove(outputNames[i]); } delete sabund; return 0; } processedLabels.insert(sabund->getLabel()); userLabels.erase(sabund->getLabel()); @@ -258,7 +344,7 @@ int CatchAllCommand::execute() { string saveLabel = sabund->getLabel(); delete sabund; - sabund = (input->getSAbundVector(lastLabel)); + sabund = (input.getSAbundVector(lastLabel)); m->mothurOut(sabund->getLabel()); m->mothurOutEndLine(); @@ -266,33 +352,53 @@ int CatchAllCommand::execute() { //create catchall input file from mothur's inputfile string filename = process(sabund, inputFileNames[p]); string outputPath = m->getPathName(filename); - + //create system command string catchAllCommand = ""; - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1"; + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \"" + outputPath + + "\" 1"; #else - if (outputPath.length() > 0) { outputPath = outputPath.substr(0, outputPath.length()-1); } - catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \"" + outputPath + "\" 1"; + //removes extra '\\' catchall doesnt like that + vector tempNames; + string tempFilename = filename; + m->splitAtDash(tempFilename, tempNames); + tempFilename = tempNames[0]; + tempNames.clear(); + string tempOutputPath = outputPath; + m->splitAtDash(tempOutputPath, tempNames); + tempOutputPath = tempNames[0]; + if (tempOutputPath.length() > 0) { tempOutputPath = tempOutputPath.substr(0, tempOutputPath.length()-1); } + catchAllCommand += catchAllCommandExe + "\"" + tempFilename + "\" \"" + tempOutputPath + "\" 1"; catchAllCommand = "\"" + catchAllCommand + "\""; #endif - + + if (m->debug) { m->mothurOut("[DEBUG]: catchall command = " + catchAllCommand + ". About to call system.\n"); } + //run catchall system(catchAllCommand.c_str()); - - m->mothurRemove(filename); + + if (m->debug) { m->mothurOut("[DEBUG]: back from system call. Keeping file: " + filename + ".\n"); } + + if (!m->debug) { m->mothurRemove(filename); } + filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra . if (savedOutputDir == "") { filename = m->getSimpleName(filename); } - 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"); - + variables["[filename]"] = filename; + outputNames.push_back(getOutputFileName("analysis", variables)); outputTypes["analysis"].push_back(getOutputFileName("analysis", variables)); + outputNames.push_back(getOutputFileName("bestanalysis", variables)); outputTypes["bestanalysis"].push_back(getOutputFileName("bestanalysis", variables)); + outputNames.push_back(getOutputFileName("models", variables)); outputTypes["models"].push_back(getOutputFileName("models", variables)); + outputNames.push_back(getOutputFileName("bubble", variables)); outputTypes["bubble"].push_back(getOutputFileName("bubble", variables)); + + + if (m->debug) { m->mothurOut("[DEBUG]: About to create summary file for: " + filename + ".\n[DEBUG]: sabund label = " + sabund->getLabel() + ".\n"); } + createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out); + + if (m->debug) { m->mothurOut("[DEBUG]: Done creating summary file.\n"); } - if (m->control_pressed) { out.close(); for (int i = 0; i < outputNames.size(); i++) {m->mothurRemove(outputNames[i]); } delete input; delete sabund; return 0; } + if (m->control_pressed) { out.close(); for (int i = 0; i < outputNames.size(); i++) {m->mothurRemove(outputNames[i]); } delete sabund; return 0; } processedLabels.insert(sabund->getLabel()); userLabels.erase(sabund->getLabel()); @@ -305,7 +411,7 @@ int CatchAllCommand::execute() { lastLabel = sabund->getLabel(); delete sabund; - sabund = (input->getSAbundVector()); + sabund = (input.getSAbundVector()); } //output error messages about any remaining user labels @@ -324,7 +430,7 @@ int CatchAllCommand::execute() { //run last label if you need to if (needToRun == true) { if (sabund != NULL) { delete sabund; } - sabund = (input->getSAbundVector(lastLabel)); + sabund = (input.getSAbundVector(lastLabel)); m->mothurOut(sabund->getLabel()); m->mothurOutEndLine(); @@ -334,34 +440,50 @@ int CatchAllCommand::execute() { //create system command string catchAllCommand = ""; - #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) - catchAllCommand += catchAllCommandExe + filename + " " + outputPath + " 1"; + #if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix) + catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \"" + outputPath + + "\" 1"; #else - if (outputPath.length() > 0) { outputPath = outputPath.substr(0, outputPath.length()-1); } - catchAllCommand += catchAllCommandExe + "\"" + filename + "\" \"" + outputPath + "\" 1"; - catchAllCommand = "\"" + catchAllCommand + "\""; + //removes extra '\\' catchall doesnt like that + vector tempNames; + string tempFilename = filename; + m->splitAtDash(tempFilename, tempNames); + tempFilename = tempNames[0]; + tempNames.clear(); + string tempOutputPath = outputPath; + m->splitAtDash(tempOutputPath, tempNames); + tempOutputPath = tempNames[0]; + if (tempOutputPath.length() > 0) { tempOutputPath = tempOutputPath.substr(0, tempOutputPath.length()-1); } + catchAllCommand += catchAllCommandExe + "\"" + tempFilename + "\" \"" + tempOutputPath + "\" 1"; + catchAllCommand = "\"" + catchAllCommand + "\""; #endif + + if (m->debug) { m->mothurOut("[DEBUG]: catchall command = " + catchAllCommand + ". About to call system.\n"); } //run catchall system(catchAllCommand.c_str()); + + if (m->debug) { m->mothurOut("[DEBUG]: back from system call. Keeping file: " + filename + ".\n"); } - m->mothurRemove(filename); + if (!m->debug) { m->mothurRemove(filename); } filename = m->getRootName(filename); filename = filename.substr(0, filename.length()-1); //rip off extra . if (savedOutputDir == "") { filename = m->getSimpleName(filename); } - 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"); - + variables["[filename]"] = filename; + outputNames.push_back(getOutputFileName("analysis", variables)); outputTypes["analysis"].push_back(getOutputFileName("analysis", variables)); + outputNames.push_back(getOutputFileName("bestanalysis", variables)); outputTypes["bestanalysis"].push_back(getOutputFileName("bestanalysis", variables)); + outputNames.push_back(getOutputFileName("models", variables)); outputTypes["models"].push_back(getOutputFileName("models", variables)); + outputNames.push_back(getOutputFileName("bubble", variables)); outputTypes["bubble"].push_back(getOutputFileName("bubble", variables)); + if (m->debug) { m->mothurOut("[DEBUG]: About to create summary file for: " + filename + ".\n[DEBUG]: sabund label = " + sabund->getLabel() + ".\n"); } + createSummaryFile(filename + "_BestModelsAnalysis.csv", sabund->getLabel(), out); + + if (m->debug) { m->mothurOut("[DEBUG]: Done creating summary file.\n"); } delete sabund; } out.close(); - delete input; if (m->control_pressed) { for (int i = 0; i < outputNames.size(); i++) {m->mothurRemove(outputNames[i]); } return 0; } @@ -396,20 +518,28 @@ int CatchAllCommand::execute() { //********************************************************************************************************************** string CatchAllCommand::process(SAbundVector* sabund, string file1) { try { - string filename = outputDir + m->getRootName(m->getSimpleName(file1)) + sabund->getLabel() + ".csv"; + map variables; + variables["[filename]"] = outputDir + m->getRootName(m->getSimpleName(file1)); + variables["[distance]"] = sabund->getLabel(); + string filename = getOutputFileName("sabund", variables); filename = m->getFullPathName(filename); ofstream out; m->openOutputFile(filename, out); + if (m->debug) { m->mothurOut("[DEBUG]: Creating " + filename + " file for catchall, shown below.\n\n"); } + for (int i = 1; i <= sabund->getMaxRank(); i++) { int temp = sabund->get(i); if (temp != 0) { out << i << "," << temp << endl; + if (m->debug) { m->mothurOut(toString(i) + "," + toString(temp) + "\n"); } } } out.close(); + + if (m->debug) { m->mothurOut("[DEBUG]: Done creating " + filename + " file for catchall, shown above.\n\n"); } return filename; @@ -424,7 +554,9 @@ string CatchAllCommand::combineSummmary(vector& outputNames) { try { ofstream out; - string combineFileName = savedOutputDir + m->getRootName(m->getSimpleName(sharedfile)) + "catchall.summary"; + map variables; + variables["[filename]"] = savedOutputDir + m->getRootName(m->getSimpleName(sharedfile)); + string combineFileName = getOutputFileName("summary", variables); //open combined file m->openOutputFile(combineFileName, out); @@ -572,8 +704,8 @@ vector CatchAllCommand::parseSharedFile(string filename) { vector filenames; //read first line - InputData* input = new InputData(filename, "sharedfile"); - vector lookup = input->getSharedRAbundVectors(); + InputData input(filename, "sharedfile"); + vector lookup = input.getSharedRAbundVectors(); string sharedFileRoot = outputDir + m->getRootName(m->getSimpleName(filename)); @@ -595,11 +727,9 @@ vector CatchAllCommand::parseSharedFile(string filename) { } for (int i = 0; i < lookup.size(); i++) { delete lookup[i]; } - lookup = input->getSharedRAbundVectors(); + lookup = input.getSharedRAbundVectors(); } - delete input; - return filenames; } catch(exception& e) {