X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=amovacommand.cpp;h=492a096f76cc1de12514731f66514e8d632c0c5f;hp=c4260fb096dd8b0b253f5239f7ce265376d24ed5;hb=a8e2df1b96a57f5f29576b08361b86a96a8eff4f;hpb=49d2b7459c5027557564b21e9487dadafbbbdc96 diff --git a/amovacommand.cpp b/amovacommand.cpp index c4260fb..492a096 100644 --- a/amovacommand.cpp +++ b/amovacommand.cpp @@ -10,17 +10,19 @@ #include "amovacommand.h" #include "readphylipvector.h" #include "groupmap.h" +#include "sharedutilities.h" //********************************************************************************************************************** vector AmovaCommand::setParameters(){ try { - CommandParameter pdesign("design", "InputTypes", "", "", "none", "none", "none",false,true); parameters.push_back(pdesign); - CommandParameter pphylip("phylip", "InputTypes", "", "", "none", "none", "none",false,true); parameters.push_back(pphylip); - CommandParameter piters("iters", "Number", "", "1000", "", "", "",false,false); parameters.push_back(piters); - CommandParameter palpha("alpha", "Number", "", "0.05", "", "", "",false,false); parameters.push_back(palpha); - CommandParameter pinputdir("inputdir", "String", "", "", "", "", "",false,false); parameters.push_back(pinputdir); - CommandParameter poutputdir("outputdir", "String", "", "", "", "", "",false,false); parameters.push_back(poutputdir); + CommandParameter pdesign("design", "InputTypes", "", "", "none", "none", "none","amova",false,true,true); parameters.push_back(pdesign); + CommandParameter psets("sets", "String", "", "", "", "", "","",false,false); parameters.push_back(psets); + CommandParameter pphylip("phylip", "InputTypes", "", "", "none", "none", "none","amova",false,true,true); parameters.push_back(pphylip); + CommandParameter piters("iters", "Number", "", "1000", "", "", "","",false,false); parameters.push_back(piters); + CommandParameter palpha("alpha", "Number", "", "0.05", "", "", "","",false,false); parameters.push_back(palpha); + 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); } @@ -37,9 +39,10 @@ string AmovaCommand::getHelpString(){ string helpString = ""; helpString += "Referenced: Anderson MJ (2001). A new method for non-parametric multivariate analysis of variance. Austral Ecol 26: 32-46."; helpString += "The amova command outputs a .amova file."; - helpString += "The amova command parameters are phylip, iters, and alpha. The phylip and design parameters are required, unless you have valid current files."; + helpString += "The amova command parameters are phylip, iters, sets and alpha. The phylip and design parameters are required, unless you have valid current files."; helpString += "The design parameter allows you to assign your samples to groups when you are running amova. It is required."; helpString += "The design file looks like the group file. It is a 2 column tab delimited file, where the first column is the sample name and the second column is the group the sample belongs to."; + helpString += "The sets parameter allows you to specify which of the sets in your designfile you would like to analyze. The set names are separated by dashes. THe default is all sets in the designfile.\n"; helpString += "The iters parameter allows you to set number of randomization for the P value. The default is 1000."; helpString += "The amova command should be in the following format: amova(phylip=file.dist, design=file.design)."; helpString += "Note: No spaces between parameter labels (i.e. iters), '=' and parameters (i.e. 1000)."; @@ -51,24 +54,19 @@ string AmovaCommand::getHelpString(){ } } //********************************************************************************************************************** -string AmovaCommand::getOutputFileNameTag(string type, string inputName=""){ - try { - string tag = ""; - map >::iterator it; +string AmovaCommand::getOutputPattern(string type) { + try { + string pattern = ""; - //is this a type this command creates - it = outputTypes.find(type); - if (it == outputTypes.end()) { m->mothurOut("[ERROR]: this command doesn't create a " + type + " output file.\n"); } - else { - if (type == "amova") { tag = "amova"; } - else { m->mothurOut("[ERROR]: No definition for type " + type + " output file.\n"); } - } - return tag; - } - catch(exception& e) { - m->errorOut(e, "AmovaCommand", "getOutputFileNameTag"); - exit(1); - } + if (type == "amova") { pattern = "[filename],amova"; } //makes file like: amazon.align + else { m->mothurOut("[ERROR]: No definition for type " + type + " output pattern.\n"); m->control_pressed = true; } + + return pattern; + } + catch(exception& e) { + m->errorOut(e, "AmovaCommand", "getOutputPattern"); + exit(1); + } } //********************************************************************************************************************** AmovaCommand::AmovaCommand(){ @@ -161,6 +159,12 @@ AmovaCommand::AmovaCommand(string option) { temp = validParameter.validFile(parameters, "alpha", false); if (temp == "not found") { temp = "0.05"; } m->mothurConvert(temp, experimentwiseAlpha); + + string sets = validParameter.validFile(parameters, "sets", false); + if (sets == "not found") { sets = ""; } + else { + m->splitAtDash(sets, Sets); + } } } catch(exception& e) { @@ -184,7 +188,32 @@ int AmovaCommand::execute(){ //read in distance matrix and square it ReadPhylipVector readMatrix(phylipFileName); vector sampleNames = readMatrix.read(distanceMatrix); - + + if (Sets.size() != 0) { //user selected sets, so we want to remove the samples not in those sets + SharedUtil util; + vector dGroups = designMap->getNamesOfGroups(); + util.setGroups(Sets, dGroups); + + for(int i=0;icontrol_pressed) { delete designMap; return 0; } + + string group = designMap->getGroup(sampleNames[i]); + + if (group == "not found") { + m->mothurOut("[ERROR]: " + sampleNames[i] + " is not in your design file, please correct."); m->mothurOutEndLine(); m->control_pressed = true; + }else if (!m->inUsersGroups(group, Sets)){ //not in set we want remove it + //remove from all other rows + for(int j=0;jgetRootName(m->getSimpleName(phylipFileName)) + getOutputFileNameTag("amova"); + map variables; variables["[filename]"] = outputDir + m->getRootName(m->getSimpleName(phylipFileName)); + string AMOVAFileName = getOutputFileName("amova", variables); + m->openOutputFile(AMOVAFileName, AMOVAFile); outputNames.push_back(AMOVAFileName); outputTypes["amova"].push_back(AMOVAFileName); @@ -276,7 +307,7 @@ double AmovaCommand::runAMOVA(ofstream& AMOVAFile, map > gro for(int i=0;i > randomizedGroup = getRandomizedGroups(groupSampleMap); double ssWithinRand = calcSSWithin(randomizedGroup); - if(ssWithinRand < ssWithinOrig){ counter++; } + if(ssWithinRand <= ssWithinOrig){ counter++; } } double pValue = (double)counter / (double) iters;