]> git.donarmstrong.com Git - mothur.git/blobdiff - parsimonycommand.cpp
parsimony command now uses groups, fixed bug with unweighted groups
[mothur.git] / parsimonycommand.cpp
index 4632019151fa0a93d7dba5c14017940d04aa1653..534ff0b1ab940a4b9398cc457a3f03a5d1381384 100644 (file)
@@ -15,10 +15,10 @@ ParsimonyCommand::ParsimonyCommand() {
                globaldata = GlobalData::getInstance();
                
                //randomtree will tell us if user had their own treefile or if they just want the random distribution
-               convert(globaldata->getRandomTree(), randomtree);
+               randomtree = globaldata->getRandomTree();
                
                //user has entered their own tree
-               if (randomtree == 0) { 
+               if (randomtree == "") { 
                        T = globaldata->gTree;
                        tmap = globaldata->gTreemap;
                        parsFile = globaldata->getTreeFile() + ".parsimony";
@@ -27,10 +27,35 @@ ParsimonyCommand::ParsimonyCommand() {
                        openOutputFile(sumFile, outSum);
                        distFile = globaldata->getTreeFile() + ".pdistrib";
                        openOutputFile(distFile, outDist);
+                       
+                       //if the user has not entered specific groups to analyze then do them all
+                       if (globaldata->Groups.size() != 0) {
+                               //check that groups are valid
+                               for (int i = 0; i < globaldata->Groups.size(); i++) {
+                                       if (tmap->isValidGroup(globaldata->Groups[i]) != true) {
+                                               cout << globaldata->Groups[i] << " is not a valid group, and will be disregarded." << endl;
+                                               // erase the invalid group from globaldata->Groups
+                                               globaldata->Groups.erase (globaldata->Groups.begin()+i);
+                                       }
+                               }
+                       
+                               //if the user only entered invalid groups
+                               if (globaldata->Groups.size() == 0) { 
+                                       cout << "When using the groups parameter you must have at least 1 valid group. I will run the command using all the groups in your groupfile." << endl; 
+                                       for (int i = 0; i < tmap->namesOfGroups.size(); i++) {
+                                               globaldata->Groups.push_back(tmap->namesOfGroups[i]);
+                                       }
+                               }               
+                       }else {
+                               for (int i = 0; i < tmap->namesOfGroups.size(); i++) {
+                                       globaldata->Groups.push_back(tmap->namesOfGroups[i]);
+                               }
+                       }
 
                }else { //user wants random distribution
+                       savetmap = globaldata->gTreemap;
                        getUserInput();
-                       parsFile = "rd_parsimony";
+                       parsFile = randomtree + ".rd_parsimony";
                        openOutputFile(parsFile, out);
                }
                
@@ -59,7 +84,7 @@ int ParsimonyCommand::execute() {
                outDist.setf(ios::fixed, ios::floatfield); outDist.setf(ios::showpoint);
                outDist << "RandomTree#" << '\t' << "ParsScore" << endl;
                
-               if (randomtree == 0) {
+               if (randomtree == "") {
                        //get pscores for users trees
                        for (int i = 0; i < T.size(); i++) {
                                cout << "Processing tree " << i+1 << endl;
@@ -133,7 +158,7 @@ int ParsimonyCommand::execute() {
                
                //this loop fills the cumulative maps and put 0.0000 in the score freq map to make it easier to print.
                for (it = validScores.begin(); it != validScores.end(); it++) { 
-                       if (randomtree == 0) {
+                       if (randomtree == "") {
                                it2 = uscoreFreq.find(it->first);
                                //user data has that score 
                                if (it2 != uscoreFreq.end()) { uscoreFreq[it->first] /= T.size(); ucumul+= it2->second;  }
@@ -158,8 +183,13 @@ int ParsimonyCommand::execute() {
                printParsimonyFile();
                printUSummaryFile();
                
-               //reset randomTree parameter to 0
-               globaldata->setRandomTree("0");
+               //reset globaldata's treemap if you just did random distrib
+               if (randomtree != "") { globaldata->gTreemap = savetmap; }
+               
+               //reset randomTree parameter to ""
+               globaldata->setRandomTree("");
+               //reset groups parameter
+               globaldata->Groups.clear();
                
                return 0;
                
@@ -178,7 +208,7 @@ int ParsimonyCommand::execute() {
 void ParsimonyCommand::printParsimonyFile() {
        try {
                //column headers
-               if (randomtree == 0) {
+               if (randomtree == "") {
                        out << "Score" << '\t' << "UserFreq" << '\t' << "UserCumul" << '\t' << "RandFreq" << '\t' << "RandCumul" << endl;
                }else {
                        out << "Score" << '\t' << "RandFreq" << '\t' << "RandCumul" << endl;
@@ -189,7 +219,7 @@ void ParsimonyCommand::printParsimonyFile() {
                
                //print each line
                for (it = validScores.begin(); it != validScores.end(); it++) { 
-                       if (randomtree == 0) {
+                       if (randomtree == "") {
                                out << setprecision(6) << it->first << '\t' << '\t' << uscoreFreq[it->first] << '\t' << uCumul[it->first] << '\t' << rscoreFreq[it->first] << '\t' << rCumul[it->first] << endl; 
                        }else{
                                out << setprecision(6) << it->first << '\t' << '\t' << rscoreFreq[it->first] << '\t' << rCumul[it->first] << endl;