From: Sarah Westcott Date: Mon, 10 Feb 2014 13:22:57 +0000 (-0500) Subject: fixes while testing 1.33.0 X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=commitdiff_plain;h=b206f634aae1b4ce13978d203247fb64757d5482 fixes while testing 1.33.0 --- diff --git a/Mothur.xcodeproj/project.pbxproj b/Mothur.xcodeproj/project.pbxproj index c604120..418596f 100644 --- a/Mothur.xcodeproj/project.pbxproj +++ b/Mothur.xcodeproj/project.pbxproj @@ -2501,9 +2501,9 @@ GCC_ENABLE_SSE42_EXTENSIONS = NO; GCC_OPTIMIZATION_LEVEL = 3; GCC_PREPROCESSOR_DEFINITIONS = ( - "MOTHUR_FILES=\"\\\"../../release\\\"\"", - "VERSION=\"\\\"1.32.0\\\"\"", - "RELEASE_DATE=\"\\\"10/31/2013\\\"\"", + "MOTHUR_FILES=\"\\\"/Users/sarahwestcott/desktop/release\\\"\"", + "VERSION=\"\\\"1.33.0\\\"\"", + "RELEASE_DATE=\"\\\"2/7/2014\\\"\"", ); GCC_VERSION = ""; "GCC_VERSION[arch=*]" = ""; diff --git a/abstractdecisiontree.cpp b/abstractdecisiontree.cpp index 595f483..e7f1c5e 100644 --- a/abstractdecisiontree.cpp +++ b/abstractdecisiontree.cpp @@ -311,3 +311,4 @@ bool AbstractDecisionTree::checkIfAlreadyClassified(RFTreeNode* treeNode, int& o } /**************************************************************************************************/ + diff --git a/abstractdecisiontree.hpp b/abstractdecisiontree.hpp index cc238b4..26b8d39 100755 --- a/abstractdecisiontree.hpp +++ b/abstractdecisiontree.hpp @@ -75,3 +75,5 @@ private: /**************************************************************************************************/ #endif + + diff --git a/getmetacommunitycommand.cpp b/getmetacommunitycommand.cpp index 2b94415..34bcbe8 100644 --- a/getmetacommunitycommand.cpp +++ b/getmetacommunitycommand.cpp @@ -66,12 +66,12 @@ string GetMetaCommunityCommand::getOutputPattern(string type) { try { string pattern = ""; - if (type == "fit") { pattern = "[filename],[distance],mix.fit"; } - else if (type == "relabund") { pattern = "[filename],[distance],[tag],mix.relabund"; } - else if (type == "design") { pattern = "[filename],[distance],mix.design"; } - else if (type == "matrix") { pattern = "[filename],[distance],[tag],mix.posterior"; } - else if (type == "parameters") { pattern = "[filename],[distance],mix.parameters"; } - else if (type == "summary") { pattern = "[filename],[distance],mix.summary"; } + if (type == "fit") { pattern = "[filename],[distance],[method],mix.fit"; } + else if (type == "relabund") { pattern = "[filename],[distance],[method],[tag],mix.relabund"; } + else if (type == "design") { pattern = "[filename],[distance],[method],mix.design"; } + else if (type == "matrix") { pattern = "[filename],[distance],[method],[tag],mix.posterior"; } + else if (type == "parameters") { pattern = "[filename],[distance],[method],mix.parameters"; } + else if (type == "summary") { pattern = "[filename],[distance],[method],mix.summary"; } else { m->mothurOut("[ERROR]: No definition for type " + type + " output pattern.\n"); m->control_pressed = true; } return pattern; @@ -366,6 +366,7 @@ int GetMetaCommunityCommand::createProcesses(vector& thislo map variables; variables["[filename]"] = outputDir + m->getRootName(m->getSimpleName(sharedfile)); variables["[distance]"] = thislookup[0]->getLabel(); + variables["[method]"] = method; string outputFileName = getOutputFileName("fit", variables); outputNames.push_back(outputFileName); outputTypes["fit"].push_back(outputFileName); @@ -755,6 +756,7 @@ int GetMetaCommunityCommand::generateSummaryFile(int numPartitions, map variables; variables["[filename]"] = v["[filename]"]; variables["[distance]"] = v["[distance]"]; + variables["]method]"] = method; variables["[tag]"] = "1"; string reference = getOutputFileName("relabund", variables); m->openInputFile(reference, referenceFile); //((fileRoot + label + ".1mix.relabund").c_str()); diff --git a/getsharedotucommand.cpp b/getsharedotucommand.cpp index 9302d1d..cfa7a64 100644 --- a/getsharedotucommand.cpp +++ b/getsharedotucommand.cpp @@ -233,6 +233,7 @@ GetSharedOTUCommand::GetSharedOTUCommand(string option) { else { userGroups = "unique." + groups; m->splitAtDash(groups, Groups); + if (Groups.size() > 4) { userGroups = "unique.selected_groups"; } //if too many groups then the filename becomes too big. } groups = validParameter.validFile(parameters, "sharedgroups", false); @@ -240,6 +241,7 @@ GetSharedOTUCommand::GetSharedOTUCommand(string option) { else { userGroups = groups; m->splitAtDash(groups, Groups); + if (Groups.size() > 4) { userGroups = "selected_groups"; } //if too many groups then the filename becomes too big. unique = false; } @@ -274,6 +276,7 @@ int GetSharedOTUCommand::execute(){ userGroups = "unique."; for(int i = 0; i < Groups.size(); i++) { userGroups += Groups[i] + "-"; } userGroups = userGroups.substr(0, userGroups.length()-1); + if (Groups.size() > 4) { userGroups = "unique.selected_groups"; } //if too many groups then the filename becomes too big. }else{ //sanity check for group names SharedUtil util; @@ -566,6 +569,7 @@ int GetSharedOTUCommand::runShared() { userGroups = "unique."; for(int i = 0; i < Groups.size(); i++) { userGroups += Groups[i] + "-"; } userGroups = userGroups.substr(0, userGroups.length()-1); + if (Groups.size() > 4) { userGroups = "unique.selected_groups"; } //if too many groups then the filename becomes too big. }else { //sanity check for group names SharedUtil util; diff --git a/inputdata.cpp b/inputdata.cpp index 8b1829a..c9142b7 100644 --- a/inputdata.cpp +++ b/inputdata.cpp @@ -83,6 +83,7 @@ ListVector* InputData::getListVector(string label){ ifstream in; string thisLabel; m->openInputFile(filename, in); + m->saveNextLabel = ""; if(in){ @@ -119,6 +120,7 @@ ListVector* InputData::getListVector(string label, bool resetFP){ string thisLabel; fileHandle.clear(); fileHandle.seekg(0); + m->saveNextLabel = ""; if(fileHandle){ @@ -239,6 +241,7 @@ SharedOrderVector* InputData::getSharedOrderVector(string label){ ifstream in; string thisLabel; m->openInputFile(filename, in); + m->saveNextLabel = ""; if(in){ @@ -321,7 +324,7 @@ OrderVector* InputData::getOrderVector(string label){ if(in){ if((format == "list") || (format == "listorder")) { - + m->saveNextLabel = ""; while (in.eof() != true) { input = new ListVector(in); @@ -335,7 +338,7 @@ OrderVector* InputData::getOrderVector(string label){ } } else if (format == "shared") { - + m->saveNextLabel = ""; while (in.eof() != true) { input = new SharedListVector(in); @@ -650,7 +653,7 @@ SAbundVector* InputData::getSAbundVector(string label){ if(in){ if (format == "list") { - + m->saveNextLabel = ""; while (in.eof() != true) { input = new ListVector(in); @@ -664,7 +667,7 @@ SAbundVector* InputData::getSAbundVector(string label){ } } else if (format == "shared") { - + m->saveNextLabel = ""; while (in.eof() != true) { input = new SharedListVector(in); @@ -789,6 +792,7 @@ RAbundVector* InputData::getRAbundVector(string label){ if(in){ if (format == "list") { + m->saveNextLabel = ""; while (in.eof() != true) { @@ -803,6 +807,7 @@ RAbundVector* InputData::getRAbundVector(string label){ } } else if (format == "shared") { + m->saveNextLabel = ""; while (in.eof() != true) { diff --git a/mergesfffilecommand.cpp b/mergesfffilecommand.cpp index 056d85c..f417dde 100644 --- a/mergesfffilecommand.cpp +++ b/mergesfffilecommand.cpp @@ -14,7 +14,8 @@ vector MergeSfffilesCommand::setParameters(){ try { CommandParameter psff("sff", "InputTypes", "", "", "sffFile", "sffFile", "none","sff",false,false); parameters.push_back(psff); CommandParameter pfile("file", "InputTypes", "", "", "sffFile", "sffFile", "none","sff",false,false); parameters.push_back(pfile); - CommandParameter pinputdir("inputdir", "String", "", "", "", "", "","",false,false); parameters.push_back(pinputdir); + CommandParameter poutput("output", "String", "", "", "", "", "","",false,true,true); parameters.push_back(poutput); + CommandParameter pinputdir("inputdir", "String", "", "", "", "", "","",false,false); parameters.push_back(pinputdir); CommandParameter poutputdir("outputdir", "String", "", "", "", "", "","",false,false); parameters.push_back(poutputdir); vector myArray; @@ -30,10 +31,11 @@ vector MergeSfffilesCommand::setParameters(){ string MergeSfffilesCommand::getHelpString(){ try { string helpString = ""; - helpString += "The merge.sfffiles command reads a sff set of files or a file containing a list of sff files and merges the individual files into a single sff file.\n"; - helpString += "The merge.sfffiles command parameters are sff and file. sff or file is required. \n"; + helpString += "The merge.sfffiles command reads a sff file or a file containing a list of sff files and merges the individual files into a single sff file. \n"; + helpString += "The merge.sfffiles command parameters are sff, file and output. sff or file is required. \n"; helpString += "The sff parameter allows you to enter the sff list of sff files separated by -'s.\n"; helpString += "The file parameter allows you to provide a file containing a list of sff files to merge. \n"; + helpString += "The output parameter allows you to provide an output filename. \n"; helpString += "Example sffinfo(sff=mySffFile.sff-mySecond.sff).\n"; helpString += "Note: No spaces between parameter labels (i.e. sff), '=' and parameters (i.e.yourSffFileName).\n"; return helpString; @@ -49,7 +51,7 @@ string MergeSfffilesCommand::getOutputPattern(string type) { try { string pattern = ""; - if (type == "sff") { pattern = "[filename],merge.sff"; } + if (type == "sff") { pattern = "[filename],"; } else { m->mothurOut("[ERROR]: No definition for type " + type + " output pattern.\n"); m->control_pressed = true; } return pattern; @@ -192,6 +194,10 @@ MergeSfffilesCommand::MergeSfffilesCommand(string option) { m->mothurOut("[ERROR]: cannot use file option and sff option at the same time, choose one."); m->mothurOutEndLine(); abort = true; } + outputFile = validParameter.validFile(parameters, "output", false); + if (outputFile == "not found") { m->mothurOut("you must enter an output file name"); m->mothurOutEndLine(); abort=true; } + if (outputDir != "") { outputFile = outputDir + m->getSimpleName(outputFile); } + } } catch(exception& e) { @@ -204,18 +210,15 @@ int MergeSfffilesCommand::execute(){ try { if (abort == true) { if (calledHelp) { return 0; } return 2; } - map variables; if (file != "") { - string thisOutputDir = outputDir; - if (outputDir == "") { thisOutputDir += m->hasPath(file); } - variables["[filename]"] = thisOutputDir + m->getRootName(m->getSimpleName(file)); readFile(); - }else { - string thisOutputDir = outputDir; - if (outputDir == "") { thisOutputDir += m->hasPath(filenames[0]); } - variables["[filename]"] = thisOutputDir + "mergedSff"; + if (outputDir == "") { outputDir = m->hasPath(file); } } ofstream out; + map variables; + string thisOutputDir = outputDir; + if (outputDir == "") { thisOutputDir += m->hasPath(outputFile); } + variables["[filename]"] = thisOutputDir + m->getSimpleName(outputFile); outputFile = getOutputFileName("sff",variables); m->openOutputFile(outputFile, out); outputNames.push_back(outputFile); outputTypes["sff"].push_back(outputFile); diff --git a/otuhierarchycommand.cpp b/otuhierarchycommand.cpp index 07e3c1d..5d521e7 100644 --- a/otuhierarchycommand.cpp +++ b/otuhierarchycommand.cpp @@ -8,6 +8,7 @@ */ #include "otuhierarchycommand.h" +#include "inputdata.h" //********************************************************************************************************************** vector OtuHierarchyCommand::setParameters(){ @@ -137,8 +138,8 @@ OtuHierarchyCommand::OtuHierarchyCommand(string option) { label = validParameter.validFile(parameters, "label", false); if (label == "not found") { m->mothurOut("label is a required parameter for the otu.hierarchy command."); m->mothurOutEndLine(); abort = true; } else { - m->splitAtDash(label, labels); - if (labels.size() != 2) { m->mothurOut("You must provide 2 labels."); m->mothurOutEndLine(); abort = true; } + m->splitAtDash(label, mylabels); + if (mylabels.size() != 2) { m->mothurOut("You must provide 2 labels."); m->mothurOutEndLine(); abort = true; } } output = validParameter.validFile(parameters, "output", false); if (output == "not found") { output = "name"; } @@ -160,15 +161,23 @@ int OtuHierarchyCommand::execute(){ if (abort == true) { if (calledHelp) { return 0; } return 2; } //get listvectors that correspond to labels requested, (or use smart distancing to get closest listvector) - vector lists = getListVectors(); + vector< vector > lists = getListVectors(); if (m->control_pressed) { outputTypes.clear(); return 0; } //determine which is little and which is big, putting little first - if (lists.size() == 2) { + if (lists.size() == 4) { //if big is first swap them - if (lists[0].getNumBins() < lists[1].getNumBins()) { - reverse(lists.begin(), lists.end()); + if (lists[0].size() < lists[2].size()) { + vector< vector > tempLists; + tempLists.push_back(lists[2]); + tempLists.push_back(lists[3]); + tempLists.push_back(lists[0]); + tempLists.push_back(lists[1]); + lists = tempLists; + string tempLabel = list2Label; + list2Label = list1Label; + list1Label = tempLabel; } }else{ m->mothurOut("error getting listvectors, unable to read 2 different vectors, check your label inputs."); m->mothurOutEndLine(); return 0; @@ -176,11 +185,11 @@ int OtuHierarchyCommand::execute(){ //map sequences to bin number in the "little" otu map littleBins; - vector binLabels0 = lists[0].getLabels(); - for (int i = 0; i < lists[0].getNumBins(); i++) { + vector binLabels0 = lists[0]; + for (int i = 0; i < lists[0].size(); i++) { if (m->control_pressed) { return 0; } - string bin = lists[0].get(i); + string bin = lists[1][i]; vector names; m->splitAtComma(bin, names); for (int j = 0; j < names.size(); j++) { littleBins[names[j]] = i; } } @@ -188,19 +197,19 @@ int OtuHierarchyCommand::execute(){ ofstream out; map variables; variables["[filename]"] = outputDir + m->getRootName(m->getSimpleName(listFile)); - variables["[distance1]"] = lists[0].getLabel(); + variables["[distance1]"] = list1Label; variables["[tag]"] = "-"; - variables["[distance2]"] = lists[1].getLabel(); + variables["[distance2]"] = list2Label; string outputFileName = getOutputFileName("otuheirarchy",variables); m->openOutputFile(outputFileName, out); //go through each bin in "big" otu and output the bins in "little" otu which created it - vector binLabels1 = lists[1].getLabels(); - for (int i = 0; i < lists[1].getNumBins(); i++) { + vector binLabels1 = lists[2]; + for (int i = 0; i < lists[2].size(); i++) { if (m->control_pressed) { outputTypes.clear(); out.close(); m->mothurRemove(outputFileName); return 0; } - string binnames = lists[1].get(i); + string binnames = lists[3][i]; vector names; m->splitAtComma(binnames, names); //output column 1 @@ -215,7 +224,7 @@ int OtuHierarchyCommand::execute(){ string col2 = ""; for (it = bins.begin(); it != bins.end(); it++) { - if (output == "name") { col2 += lists[0].get(it->first) + "\t"; } + if (output == "name") { col2 += lists[1][it->first] + "\t"; } else { col2 += binLabels0[it->first] + "\t"; } } @@ -242,90 +251,84 @@ int OtuHierarchyCommand::execute(){ //********************************************************************************************************************** //returns a vector of listVectors where "little" vector is first -vector OtuHierarchyCommand::getListVectors() { +vector< vector > OtuHierarchyCommand::getListVectors() { //return value [0] -> otulabelsFirstLabel [1] -> binsFirstLabel [2] -> otulabelsSecondLabel [3] -> binsSecondLabel try { - - int pos; //to use in smart distancing, position of last read in file - int lastPos; - vector lists; + vector< vector > lists; + + int count = 0; + for (set::iterator it = mylabels.begin(); it != mylabels.end(); it++) { + string realLabel; + vector< vector > thisList = getListVector(*it, realLabel); + + if (m->control_pressed) { return lists; } + + for (int i = 0; i < thisList.size(); i++) { lists.push_back(thisList[i]); } + + if (count == 0) { list1Label = realLabel; count++; } + else { list2Label = realLabel; } + } + + return lists; + } + catch(exception& e) { + m->errorOut(e, "OtuHierarchyCommand", "getListVectors"); + exit(1); + } +} +//********************************************************************************************************************** +vector< vector > OtuHierarchyCommand::getListVector(string label, string& realLabel){ //return value [0] -> otulabels [1] -> bins + try { + vector< vector > myList; + + InputData input(listFile, "list"); + ListVector* list = input.getListVector(); + string lastLabel = list->getLabel(); //if the users enters label "0.06" and there is no "0.06" in their file use the next lowest label. + set labels; labels.insert(label); set processedLabels; set userLabels = labels; - - //open file - ifstream in; - m->openInputFile(listFile, in); - - //get first list vector in file - ListVector* list = NULL; - string lastLabel = ""; - if (!in.eof()) { - pos = in.tellg(); - lastPos = pos; - list = new ListVector(in); - m->gobble(in); - lastLabel = list->getLabel(); - } - - while ((list != NULL) && (userLabels.size() != 0)) { - if (m->control_pressed) { in.close(); delete list; return lists; } + //as long as you are not at the end of the file or done wih the lines you want + while((list != NULL) && (userLabels.size() != 0)) { + if (m->control_pressed) { return myList; } - //is this a listvector that we want? if(labels.count(list->getLabel()) == 1){ - - //make copy of listvector - ListVector temp(*list); - lists.push_back(temp); - processedLabels.insert(list->getLabel()); userLabels.erase(list->getLabel()); + break; } - - //you have a label the user want that is smaller than this label and the last label has not already been processed + if ((m->anyLabelsToProcess(list->getLabel(), userLabels, "") == true) && (processedLabels.count(lastLabel) != 1)) { string saveLabel = list->getLabel(); - int savePos = in.tellg(); - //get smart distance line delete list; - in.seekg(lastPos); - if (!in.eof()) { - list = new ListVector(in); - }else { list = NULL; } + list = input.getListVector(lastLabel); - //make copy of listvector - ListVector temp(*list); - lists.push_back(temp); - processedLabels.insert(list->getLabel()); - userLabels.erase(list->getLabel()); - + userLabels.erase(list->getLabel()); + //restore real lastlabel to save below - list->setLabel(saveLabel); - in.seekg(savePos); + //list->setLabel(saveLabel); + break; } lastLabel = list->getLabel(); - lastPos = pos; - //get next line + //get next line to process + //prevent memory leak delete list; - if (!in.eof()) { - pos = in.tellg(); - list = new ListVector(in); - m->gobble(in); - }else { list = NULL; } + list = input.getListVector(); } - if (m->control_pressed) { in.close(); return lists; } + + if (m->control_pressed) { return myList; } //output error messages about any remaining user labels set::iterator it; bool needToRun = false; - for (it = userLabels.begin(); it != userLabels.end(); it++) { - m->mothurOut("Your file does not include the label " + *it); + 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; @@ -334,29 +337,28 @@ vector OtuHierarchyCommand::getListVectors() { } } - if (m->control_pressed) { in.close(); return lists; } - //run last label if you need to if (needToRun == true) { - if (list != NULL) { delete list; } - - in.seekg(lastPos); - if (!in.eof()) { - list = new ListVector(in); - - //make copy of listvector - ListVector temp(*list); - lists.push_back(temp); - - delete list; - } + delete list; + list = input.getListVector(lastLabel); } - in.close(); - return lists; + //at this point the list vector has the right distance + myList.push_back(list->getLabels()); + vector bins; + for (int i = 0; i < list->getNumBins(); i++) { + if (m->control_pressed) { return myList; } + bins.push_back(list->get(i)); + } + myList.push_back(bins); + realLabel = list->getLabel(); + + delete list; + + return myList; } catch(exception& e) { - m->errorOut(e, "OtuHierarchyCommand", "getListVectors"); + m->errorOut(e, "OtuHierarchyCommand", "getListVector"); exit(1); } } diff --git a/otuhierarchycommand.h b/otuhierarchycommand.h index cd106ec..2b9e8e7 100644 --- a/otuhierarchycommand.h +++ b/otuhierarchycommand.h @@ -37,11 +37,12 @@ public: private: bool abort; - set labels; //holds labels to be used - string label, listFile, outputDir, output; + set mylabels; //holds labels to be used + string label, listFile, outputDir, output, list1Label, list2Label; vector outputNames; - vector getListVectors(); + vector< vector > getListVectors(); + vector< vector > getListVector(string, string&); }; diff --git a/venncommand.cpp b/venncommand.cpp index 3767687..0327d53 100644 --- a/venncommand.cpp +++ b/venncommand.cpp @@ -214,10 +214,19 @@ VennCommand::VennCommand(string option) { temp = validParameter.validFile(parameters, "nseqs", false); if (temp == "not found"){ temp = "f"; } nseqs = m->isTrue(temp); - temp = validParameter.validFile(parameters, "permute", false); if (temp == "not found"){ temp = "4"; } + temp = validParameter.validFile(parameters, "permute", false); + if (temp == "not found"){ temp = "4"; } + else { + if ((temp == "1") || (temp == "2") || (temp == "3") || (temp == "4")) {} + else { + bool permTrue = m->isTrue(temp); + if (permTrue) { temp = "4"; } + else { } + } + } m->mothurConvert(temp, perm); if ((perm == 1) || (perm == 2) || (perm == 3) || (perm == 4)) { } - else { m->mothurOut("[ERROR]: Not a valid permute value. Valid values are 1, 2, 3, and 4."); m->mothurOutEndLine(); abort = true; } + else { m->mothurOut("[ERROR]: Not a valid permute value. Valid values are 1, 2, 3, 4 and true."); m->mothurOutEndLine(); abort = true; } temp = validParameter.validFile(parameters, "sharedotus", false); if (temp == "not found"){ temp = "t"; } sharedOtus = m->isTrue(temp);