]> git.donarmstrong.com Git - mothur.git/blobdiff - homovacommand.cpp
working on pam
[mothur.git] / homovacommand.cpp
index 9f7483057220568d27752d5c6d2b68238d274629..488b68e0b6b69a8eb8e351d39be9ff09193fb36f 100644 (file)
 #include "homovacommand.h"
 #include "groupmap.h"
 #include "readphylipvector.h"
+#include "sharedutilities.h"
 
 //**********************************************************************************************************************
 vector<string> HomovaCommand::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","homova",false,true,true); parameters.push_back(pdesign);
+               CommandParameter pphylip("phylip", "InputTypes", "", "", "none", "none", "none","homova",false,true,true); parameters.push_back(pphylip);
+        CommandParameter psets("sets", "String", "", "", "", "", "","",false,false); parameters.push_back(psets);
+               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<string> myArray;
                for (int i = 0; i < parameters.size(); i++) {   myArray.push_back(parameters[i].name);          }
@@ -36,12 +38,13 @@ string HomovaCommand::getHelpString(){
                string helpString = "";
                helpString += "Referenced: Stewart CN, Excoffier L (1996). Assessing population genetic structure and variability with RAPD data: Application to Vaccinium macrocarpon (American Cranberry). J Evol Biol 9: 153-71.\n";
                helpString += "The homova command outputs a .homova file. \n";
-               helpString += "The homova command parameters are phylip, iters, and alpha.  The phylip and design parameters are required, unless valid current files exist.\n";
+               helpString += "The homova command parameters are phylip, iters, sets and alpha.  The phylip and design parameters are required, unless valid current files exist.\n";
                helpString += "The design parameter allows you to assign your samples to groups when you are running homova. It is required. \n";
                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.\n";
+        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. \n";
                helpString += "The homova command should be in the following format: homova(phylip=file.dist, design=file.design).\n";
-               helpString += "Note: No spaces between parameter labels (i.e. iters), '=' and parameters (i.e. 1000).\n\n";
+               helpString += "Note: No spaces between parameter labels (i.e. iters), '=' and parameters (i.e. 1000).\n";
                return helpString;
        }
        catch(exception& e) {
@@ -49,9 +52,22 @@ string HomovaCommand::getHelpString(){
                exit(1);
        }
 }
-
 //**********************************************************************************************************************
-
+string HomovaCommand::getOutputPattern(string type) {
+    try {
+        string pattern = "";
+        
+        if (type == "homova") {  pattern = "[filename],homova"; } 
+        else { m->mothurOut("[ERROR]: No definition for type " + type + " output pattern.\n"); m->control_pressed = true;  }
+        
+        return pattern;
+    }
+    catch(exception& e) {
+        m->errorOut(e, "HomovaCommand", "getOutputPattern");
+        exit(1);
+    }
+}
+//**********************************************************************************************************************
 HomovaCommand::HomovaCommand(){        
        try {
                abort = true; calledHelp = true; 
@@ -72,6 +88,7 @@ HomovaCommand::HomovaCommand(string option) {
                
                //allow user to run help
                if(option == "help") { help(); abort = true; calledHelp = true; }
+               else if(option == "citation") { citation(); abort = true; calledHelp = true;}
                
                else {
                        vector<string> myArray = setParameters();
@@ -124,7 +141,7 @@ HomovaCommand::HomovaCommand(string option) {
                                if (phylipFileName != "") { m->mothurOut("Using " + phylipFileName + " as input file for the phylip parameter."); m->mothurOutEndLine(); }
                                else {  m->mothurOut("You have no current phylip file and the phylip parameter is required."); m->mothurOutEndLine(); abort = true; }
                                
-                       }       
+                       }else { m->setPhylipFile(phylipFileName); }     
                        
                        //check for required parameters
                        designFileName = validParameter.validFile(parameters, "design", true);
@@ -134,15 +151,21 @@ HomovaCommand::HomovaCommand(string option) {
                                designFileName = m->getDesignFile(); 
                                if (designFileName != "") { m->mothurOut("Using " + designFileName + " as input file for the design parameter."); m->mothurOutEndLine(); }
                                else {  m->mothurOut("You have no current design file and the design parameter is required."); m->mothurOutEndLine(); abort = true; }                                                           
-                       }       
+                       }else { m->setDesignFile(designFileName); }     
                        
                        string temp = validParameter.validFile(parameters, "iters", false);
                        if (temp == "not found") { temp = "1000"; }
-                       convert(temp, iters); 
+                       m->mothurConvert(temp, iters); 
                        
                        temp = validParameter.validFile(parameters, "alpha", false);
                        if (temp == "not found") { temp = "0.05"; }
-                       convert(temp, experimentwiseAlpha); 
+                       m->mothurConvert(temp, experimentwiseAlpha); 
+            
+            string sets = validParameter.validFile(parameters, "sets", false);                 
+                       if (sets == "not found") { sets = ""; }
+                       else { 
+                               m->splitAtDash(sets, Sets);
+                       }
                }
                
        }
@@ -168,6 +191,31 @@ int HomovaCommand::execute(){
                ReadPhylipVector readMatrix(phylipFileName);
                vector<string> 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<string> dGroups = designMap->getNamesOfGroups();
+            util.setGroups(Sets, dGroups);  
+            
+            for(int i=0;i<distanceMatrix.size();i++){
+                
+                if (m->control_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;j<distanceMatrix.size();j++){
+                        distanceMatrix[j].erase(distanceMatrix[j].begin()+i);
+                    }
+                    distanceMatrix.erase(distanceMatrix.begin()+i);
+                    sampleNames.erase(sampleNames.begin()+i);
+                    i--;
+                }
+            }
+        }
+
                for(int i=0;i<distanceMatrix.size();i++){
                        for(int j=0;j<i;j++){
                                distanceMatrix[i][j] *= distanceMatrix[i][j];   
@@ -177,13 +225,21 @@ int HomovaCommand::execute(){
                //link designMap to rows/columns in distance matrix
                map<string, vector<int> > origGroupSampleMap;
                for(int i=0;i<sampleNames.size();i++){
-                       origGroupSampleMap[designMap->getGroup(sampleNames[i])].push_back(i);
+                       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 { origGroupSampleMap[group].push_back(i); }
                }
                int numGroups = origGroupSampleMap.size();
                
+               if (m->control_pressed) { delete designMap; return 0; }
+               
                //create a new filename
                ofstream HOMOVAFile;
-               string HOMOVAFileName = outputDir + m->getRootName(m->getSimpleName(phylipFileName))  + "homova";                               
+        map<string, string> variables; 
+               variables["[filename]"] = outputDir + m->getRootName(m->getSimpleName(phylipFileName));
+               string HOMOVAFileName = getOutputFileName("homova", variables);                         
                m->openOutputFile(HOMOVAFileName, HOMOVAFile);
                outputNames.push_back(HOMOVAFileName); outputTypes["homova"].push_back(HOMOVAFileName);
                
@@ -252,7 +308,7 @@ double HomovaCommand::runHOMOVA(ofstream& HOMOVAFile, map<string, vector<int> >
                        vector<double> ssWithinRandVector;
                        map<string, vector<int> > randomizedGroup = getRandomizedGroups(groupSampleMap);
                        double bValueRand = calcBValue(randomizedGroup, ssWithinRandVector);
-                       if(bValueRand > bValueOrig){    counter++;      }
+                       if(bValueRand >= bValueOrig){   counter++;      }
                }
                
                double pValue = (double) counter / (double) iters;