]> git.donarmstrong.com Git - mothur.git/blobdiff - parsimonycommand.cpp
added checks for ^C to quit command instead of program
[mothur.git] / parsimonycommand.cpp
index da997c13b0c150369e15d94ccabb95f8dc3b8d26..b87e9c0b1ea0f5e84cbdf87a341c2fc6d393699d 100644 (file)
 #include "parsimonycommand.h"
 
 /***********************************************************/
-ParsimonyCommand::ParsimonyCommand(string option) {
+ParsimonyCommand::ParsimonyCommand(string option)  {
        try {
                globaldata = GlobalData::getInstance();
                abort = false;
                Groups.clear();
-               
+                       
                //allow user to run help
                if(option == "help") { help(); abort = true; }
                
@@ -39,7 +39,7 @@ ParsimonyCommand::ParsimonyCommand(string option) {
                        //are you trying to use parsimony without reading a tree or saying you want random distribution
                        if (randomtree == "")  {
                                if (globaldata->gTree.size() == 0) {
-                                       mothurOut("You must read a treefile and a groupfile or set the randomtree parameter to the output filename you wish, before you may execute the parsimony command."); mothurOutEndLine(); abort = true;  }
+                                       m->mothurOut("You must read a treefile and a groupfile or set the randomtree parameter to the output filename you wish, before you may execute the parsimony command."); m->mothurOutEndLine(); abort = true;  }
                        }
                        
                        //if the user changes the output directory command factory will send this info to us in the output parameter 
@@ -66,15 +66,18 @@ ParsimonyCommand::ParsimonyCommand(string option) {
                                        
                                        if(outputDir == "") { outputDir += hasPath(globaldata->getTreeFile()); }
                                        output = new ColumnFile(outputDir + getSimpleName(globaldata->getTreeFile())  +  ".parsimony", itersString);
+                                       outputNames.push_back(outputDir + getSimpleName(globaldata->getTreeFile())  +  ".parsimony");
                                        
                                        sumFile = outputDir + getSimpleName(globaldata->getTreeFile()) + ".psummary";
                                        openOutputFile(sumFile, outSum);
+                                       outputNames.push_back(sumFile);
                                }else { //user wants random distribution
                                        savetmap = globaldata->gTreemap;
                                        getUserInput();
                                        
                                        if(outputDir == "") { outputDir += hasPath(randomtree); }
                                        output = new ColumnFile(outputDir+ getSimpleName(randomtree), itersString);
+                                       outputNames.push_back(outputDir+ getSimpleName(randomtree));
                                }
                                
                                //set users groups to analyze
@@ -93,7 +96,7 @@ ParsimonyCommand::ParsimonyCommand(string option) {
 
        }
        catch(exception& e) {
-               errorOut(e, "ParsimonyCommand", "ParsimonyCommand");
+               m->errorOut(e, "ParsimonyCommand", "ParsimonyCommand");
                exit(1);
        }
 }
@@ -102,18 +105,18 @@ ParsimonyCommand::ParsimonyCommand(string option) {
 
 void ParsimonyCommand::help(){
        try {
-               mothurOut("The parsimony command can only be executed after a successful read.tree command, unless you use the random parameter.\n");
-               mothurOut("The parsimony command parameters are random, groups and iters.  No parameters are required.\n");
-               mothurOut("The groups parameter allows you to specify which of the groups in your groupfile you would like analyzed.  You must enter at least 1 valid group.\n");
-               mothurOut("The group names are separated by dashes.  The iters parameter allows you to specify how many random trees you would like compared to your tree.\n");
-               mothurOut("The parsimony command should be in the following format: parsimony(random=yourOutputFilename, groups=yourGroups, iters=yourIters).\n");
-               mothurOut("Example parsimony(random=out, iters=500).\n");
-               mothurOut("The default value for random is "" (meaning you want to use the trees in your inputfile, randomtree=out means you just want the random distribution of trees outputted to out.rd_parsimony),\n");
-               mothurOut("and iters is 1000.  The parsimony command output two files: .parsimony and .psummary their descriptions are in the manual.\n");
-               mothurOut("Note: No spaces between parameter labels (i.e. random), '=' and parameters (i.e.yourOutputFilename).\n\n");
+               m->mothurOut("The parsimony command can only be executed after a successful read.tree command, unless you use the random parameter.\n");
+               m->mothurOut("The parsimony command parameters are random, groups and iters.  No parameters are required.\n");
+               m->mothurOut("The groups parameter allows you to specify which of the groups in your groupfile you would like analyzed.  You must enter at least 1 valid group.\n");
+               m->mothurOut("The group names are separated by dashes.  The iters parameter allows you to specify how many random trees you would like compared to your tree.\n");
+               m->mothurOut("The parsimony command should be in the following format: parsimony(random=yourOutputFilename, groups=yourGroups, iters=yourIters).\n");
+               m->mothurOut("Example parsimony(random=out, iters=500).\n");
+               m->mothurOut("The default value for random is "" (meaning you want to use the trees in your inputfile, randomtree=out means you just want the random distribution of trees outputted to out.rd_parsimony),\n");
+               m->mothurOut("and iters is 1000.  The parsimony command output two files: .parsimony and .psummary their descriptions are in the manual.\n");
+               m->mothurOut("Note: No spaces between parameter labels (i.e. random), '=' and parameters (i.e.yourOutputFilename).\n\n");
        }
        catch(exception& e) {
-               errorOut(e, "ParsimonyCommand", "help");
+               m->errorOut(e, "ParsimonyCommand", "help");
                exit(1);
        }
 }
@@ -128,6 +131,15 @@ int ParsimonyCommand::execute() {
                Progress* reading;
                reading = new Progress("Comparing to random:", iters);
                
+               if (m->control_pressed) { 
+                       delete reading; delete pars; delete util; delete output;
+                       if (randomtree == "") {  outSum.close();  }
+                       for (int i = 0; i < outputNames.size(); i++) {  remove(outputNames[i].c_str()); }
+                       globaldata->Groups.clear();
+                       return 0;
+               }
+                       
+               
                //get pscore for users tree
                userData.resize(numComp,0);  //data = AB, AC, BC, ABC.
                randomData.resize(numComp,0);  //data = AB, AC, BC, ABC.
@@ -142,6 +154,15 @@ int ParsimonyCommand::execute() {
                        //get pscores for users trees
                        for (int i = 0; i < T.size(); i++) {
                                userData = pars->getValues(T[i]);  //data = AB, AC, BC, ABC.
+                               
+                               if (m->control_pressed) { 
+                                       delete reading; delete pars; delete util; delete output;
+                                       if (randomtree == "") {  outSum.close();  }
+                                       for (int i = 0; i < outputNames.size(); i++) {  remove(outputNames[i].c_str()); }
+                                       globaldata->Groups.clear();
+                                       return 0;
+                               }
+
 
                                //output scores for each combination
                                for(int k = 0; k < numComp; k++) {
@@ -162,6 +183,7 @@ int ParsimonyCommand::execute() {
                        
                        //get pscores for random trees
                        for (int j = 0; j < iters; j++) {
+                                                               
                                //create new tree with same num nodes and leaves as users
                                randT = new Tree();
 
@@ -170,6 +192,14 @@ int ParsimonyCommand::execute() {
 
                                //get pscore of random tree
                                randomData = pars->getValues(randT);
+                               
+                               if (m->control_pressed) { 
+                                       delete reading; delete pars; delete util; delete output; delete randT;
+                                       if (randomtree == "") {  outSum.close();  }
+                                       for (int i = 0; i < outputNames.size(); i++) {  remove(outputNames[i].c_str()); }
+                                       globaldata->Groups.clear();
+                                       return 0;
+                               }
                                        
                                for(int r = 0; r < numComp; r++) {
                                        //add trees pscore to map of scores
@@ -193,14 +223,32 @@ int ParsimonyCommand::execute() {
                }else {
                        //get pscores for random trees
                        for (int j = 0; j < iters; j++) {
+                                                               
                                //create new tree with same num nodes and leaves as users
                                randT = new Tree();
                                //create random relationships between nodes
 
                                randT->assembleRandomTree();
+                               
+                               if (m->control_pressed) { 
+                                       delete reading; delete pars; delete util; delete output; delete randT;
+                                       globaldata->gTreemap = savetmap; 
+                                       for (int i = 0; i < outputNames.size(); i++) {  remove(outputNames[i].c_str()); }
+                                       globaldata->Groups.clear();
+                                       return 0;
+                               }
+
 
                                //get pscore of random tree
                                randomData = pars->getValues(randT);
+                               
+                               if (m->control_pressed) { 
+                                       delete reading; delete pars; delete util; delete output; delete randT;
+                                       globaldata->gTreemap = savetmap; 
+                                       for (int i = 0; i < outputNames.size(); i++) {  remove(outputNames[i].c_str()); }
+                                       globaldata->Groups.clear();
+                                       return 0;
+                               }
                        
                                for(int r = 0; r < numComp; r++) {
                                        //add trees pscore to map of scores
@@ -250,6 +298,15 @@ int ParsimonyCommand::execute() {
                        }
                }
                
+               if (m->control_pressed) { 
+                               delete reading; delete pars; delete util; delete output;
+                               if (randomtree == "") {  outSum.close();  }
+                               else { globaldata->gTreemap = savetmap; }
+                               for (int i = 0; i < outputNames.size(); i++) {  remove(outputNames[i].c_str()); }
+                               globaldata->Groups.clear();
+                               return 0;
+               }
+               
                //finish progress bar
                reading->finish();
                delete reading;
@@ -268,11 +325,23 @@ int ParsimonyCommand::execute() {
                //reset groups parameter
                globaldata->Groups.clear(); 
                
+               if (m->control_pressed) { 
+                       delete pars; delete util; delete output;
+                       for (int i = 0; i < outputNames.size(); i++) {  remove(outputNames[i].c_str()); }
+                       return 0;
+               }
+               
+               m->mothurOutEndLine();
+               m->mothurOut("Output File Names: "); m->mothurOutEndLine();
+               for (int i = 0; i < outputNames.size(); i++) {  m->mothurOut(outputNames[i]); m->mothurOutEndLine();    }
+               m->mothurOutEndLine();
+
+               
                return 0;
                
        }
        catch(exception& e) {
-               errorOut(e, "ParsimonyCommand", "execute");
+               m->errorOut(e, "ParsimonyCommand", "execute");
                exit(1);
        }
 }
@@ -305,16 +374,16 @@ void ParsimonyCommand::printParsimonyFile() {
                }
        }
        catch(exception& e) {
-               errorOut(e, "ParsimonyCommand", "printParsimonyFile");
+               m->errorOut(e, "ParsimonyCommand", "printParsimonyFile");
                exit(1);
        }
 }
 /***********************************************************/
-void ParsimonyCommand::printUSummaryFile() {
+int ParsimonyCommand::printUSummaryFile() {
        try {
                //column headers
                outSum << "Tree#" << '\t' << "Groups" << '\t'  <<  "ParsScore" << '\t' << "ParsSig" <<  endl;
-               mothurOut("Tree#\tGroups\tParsScore\tParsSig"); mothurOutEndLine();
+               m->mothurOut("Tree#\tGroups\tParsScore\tParsSig"); m->mothurOutEndLine();
                
                //format output
                outSum.setf(ios::fixed, ios::floatfield); outSum.setf(ios::showpoint);
@@ -323,22 +392,24 @@ void ParsimonyCommand::printUSummaryFile() {
                //print each line
                for (int i = 0; i< T.size(); i++) {
                        for(int a = 0; a < numComp; a++) {
+                               if (m->control_pressed) {  outSum.close(); return 0; }
                                if (UScoreSig[a][i] > (1/(float)iters)) {
                                        outSum << setprecision(6) << i+1 << '\t' << groupComb[a]  << '\t' << userTreeScores[a][i] << setprecision(itersString.length()) << '\t' << UScoreSig[a][i] << endl;
                                        cout << setprecision(6) << i+1 << '\t' << groupComb[a]  << '\t' << userTreeScores[a][i] << setprecision(itersString.length()) << '\t' << UScoreSig[a][i] << endl;
-                                       mothurOutJustToLog(toString(i+1) + "\t" + groupComb[a] + "\t" + toString(userTreeScores[a][i]) + "\t" + toString(UScoreSig[a][i])); mothurOutEndLine();
+                                       m->mothurOutJustToLog(toString(i+1) + "\t" + groupComb[a] + "\t" + toString(userTreeScores[a][i]) + "\t" + toString(UScoreSig[a][i])); m->mothurOutEndLine();
                                }else {
                                        outSum << setprecision(6) << i+1 << '\t' << groupComb[a] << '\t' << userTreeScores[a][i] << setprecision(itersString.length())  << '\t' << "<" << (1/float(iters)) << endl;
                                        cout << setprecision(6) << i+1 << '\t' << groupComb[a] << '\t' << userTreeScores[a][i] << setprecision(itersString.length()) << '\t' << "<" << (1/float(iters)) << endl;
-                                       mothurOutJustToLog(toString(i+1) + "\t" + groupComb[a] + "\t" + toString(userTreeScores[a][i]) + "\t" + toString((1/float(iters)))); mothurOutEndLine();
+                                       m->mothurOutJustToLog(toString(i+1) + "\t" + groupComb[a] + "\t" + toString(userTreeScores[a][i]) + "\t" + toString((1/float(iters)))); m->mothurOutEndLine();
                                }
                        }
                }
                
                outSum.close();
+               return 0;
        }
        catch(exception& e) {
-               errorOut(e, "ParsimonyCommand", "printUSummaryFile");
+               m->errorOut(e, "ParsimonyCommand", "printUSummaryFile");
                exit(1);
        }
 }
@@ -350,18 +421,18 @@ void ParsimonyCommand::getUserInput() {
                //create treemap
                tmap = new TreeMap();
 
-               mothurOut("Please enter the number of groups you would like to analyze: ");
+               m->mothurOut("Please enter the number of groups you would like to analyze: ");
                cin >> numGroups;
-               mothurOutJustToLog(toString(numGroups)); mothurOutEndLine();
+               m->mothurOutJustToLog(toString(numGroups)); m->mothurOutEndLine();
                                
                int num, count;
                count = 1;
                numEachGroup.resize(numGroups, 0);  
                
                for (int i = 1; i <= numGroups; i++) {
-                       mothurOut("Please enter the number of sequences in group " + toString(i) +  ": ");
+                       m->mothurOut("Please enter the number of sequences in group " + toString(i) +  ": ");
                        cin >> num;
-                       mothurOutJustToLog(toString(num)); mothurOutEndLine();
+                       m->mothurOutJustToLog(toString(num)); m->mothurOutEndLine();
                                
                        //set tmaps seqsPerGroup
                        tmap->seqsPerGroup[toString(i)] = num;
@@ -387,7 +458,7 @@ void ParsimonyCommand::getUserInput() {
                
        }
        catch(exception& e) {
-               errorOut(e, "ParsimonyCommand", "getUserInput");
+               m->errorOut(e, "ParsimonyCommand", "getUserInput");
                exit(1);
        }
 }