]> git.donarmstrong.com Git - mothur.git/blobdiff - errorchecking.cpp
added get.oturep command
[mothur.git] / errorchecking.cpp
index ff94c8f4f765a8e0041604416e3b6807b423c05a..abd2a9ffeca07f4f11e9d69f283f09afc535a056 100644 (file)
@@ -38,135 +38,16 @@ void ErrorCheck::refresh() {
        method = globaldata->getMethod();
        randomtree = globaldata->getRandomTree();
        sharedfile = globaldata->getSharedFile();
-
-
-       
-/*     string p[] = {
-               "phylip",              //0
-               "column",             //1
-               "list",               //2
-               "rabund",             //3
-               "sabund",             //4
-               "name",               //5
-               "order",              //6
-               "group",              //7
-               "fasta",              //8
-               "treefile",           //9
-               "cutoff",             //10
-               "precision",          //11
-               "iters",              //12
-               "jumble",             //13
-               "freq",               //14
-               "method",             //15
-               "fileroot",           //16
-               "line",               //17
-               "label",              //18
-               "single",             //19
-               "rarefaction",        //20
-               "shared",             //21
-               "summary",            //22
-               "sharedrarefaction",  //23
-               "sharedsummary",      //24
-               "groups",                         //25
-               "abund",              //26
-               };
-       
-       string c0[] = {p[0],p[5],p[10],p[11]};
-       string c1[] = {p[2],p[6],p[7]}; 
-       string c2[] = {p[10],p[11],p[15]}; 
-       string c3[] = {p[8]};  
-       string c4[] = {p[14],p[17],p[18],p[19],p[26]};
-       string c5[] = {p[13],p[14],p[17],p[18],p[21],p[25]};
-       string c6[] = {""}; 
-       string c7[] = {""}; 
-       string c8[] = {""}; 
-       string c9[] = {p[12],p[14],p[17],p[18],p[20],p[26]};
-       string c10[] = {p[12],p[13],p[17],p[18],p[23]};
-       string c11[] = {p[17],p[18],p[22],p[26]};   
-       string c12[] =  {p[13],p[17],p[18],p[24]}; 
-       string c13[] = {""};    
-       
-       vector<string> v0 (c0, c0+sizeof(c0)/sizeof(string)); 
-       vector<string> v1 (c1, c1+sizeof(c1)/sizeof(string));
-       vector<string> v2 (c2, c2+sizeof(c2)/sizeof(string));
-       vector<string> v3 (c3, c3+sizeof(c3)/sizeof(string));
-       vector<string> v4 (c4, c4+sizeof(c4)/sizeof(string));
-       vector<string> v5 (c5, c5+sizeof(c5)/sizeof(string));
-       vector<string> v6 (c6, c6+sizeof(c6)/sizeof(string));
-       vector<string> v7 (c7, c7+sizeof(c7)/sizeof(string));
-       vector<string> v8 (c8, c8+sizeof(c8)/sizeof(string));
-       vector<string> v9 (c9, c9+sizeof(c9)/sizeof(string));
-       vector<string> v10 (c10, c10+sizeof(c10)/sizeof(string));
-       vector<string> v11 (c11, c11+sizeof(c11)/sizeof(string));
-       vector<string> v12 (c12, c12+sizeof(c12)/sizeof(string));
-       vector<string> v13 (c13, c13+sizeof(c13)/sizeof(string));
-       
-       vector<vector<string> > allCommands;
-       allCommands.push_back(v0);
-       allCommands.push_back(v1);
-       allCommands.push_back(v2);
-       allCommands.push_back(v3);
-       allCommands.push_back(v4);
-       allCommands.push_back(v5);
-       allCommands.push_back(v6);
-       allCommands.push_back(v7);
-       allCommands.push_back(v8);
-       allCommands.push_back(v9);
-       allCommands.push_back(v10);
-       allCommands.push_back(v11);
-       allCommands.push_back(v12);
-       allCommands.push_back(v13);
-       
-       string commands[] = {
-       "read.dist",          //0
-       "read.otu",           //1
-       "cluster",            //2
-       "deconvolute",        //3
-       "collect.single",     //4
-       "collect.shared",     //5
-       "get.group",          //6
-       "get.label",          //7
-       "get.line",           //8
-       "rarefaction.single", //9
-       "rarefaction.shared", //10
-       "summary.single",     //11
-       "summary.shared",     //12
-       "quit"                //13
-       };
-       
-       for(int i = 0; i < allCommands.size(); i++)
-               commandParameters[commands[i]] = allCommands.at(i);
-       
-        //{Lowerbound(piSent if no lowerbound), Upperbound(piSent if no upperbound), 1 if only the first 2 values, 0 if greater than, 0 if less than};
-       piSent = 3.14159;
-       double ip0[] = {10, piSent, 0, 1, 0};
-       double ip1[] = {10, piSent, 0, 1, 0};
-       double ip2[] = {0, 1, 1, 0, 0};
-       double ip3[] =  {1, piSent, 0, 0, 0};
-       double ip4[] = {1, piSent, 0, 1, 0};
-       double ip5[] = {5, piSent, 0, 1, 0};
-       
-       vector<double> ipv0 (ip0, ip0+sizeof(ip0)/sizeof(double)); 
-       vector<double> ipv1 (ip1, ip1+sizeof(ip1)/sizeof(double)); 
-       vector<double> ipv2 (ip2, ip2+sizeof(ip2)/sizeof(double)); 
-       vector<double> ipv3 (ip3, ip3+sizeof(ip3)/sizeof(double)); 
-       vector<double> ipv4 (ip4, ip4+sizeof(ip4)/sizeof(double)); 
-       vector<double> ipv5 (ip5, ip5+sizeof(ip5)/sizeof(double));
-
-       intParams[p[11]] = ipv0;
-       intParams[p[12]] = ipv1;
-       intParams[p[13]] = ipv2;
-       intParams[p[14]] = ipv3;
-       intParams[p[17]] = ipv4;
-       intParams[p[26]] = ipv5;   */
-       
 }
 
 /*******************************************************/
 
 /******************************************************/
 
-ErrorCheck::~ErrorCheck() {}
+ErrorCheck::~ErrorCheck() {
+       delete validCommand;
+       delete validParameter;
+}
 
 /*******************************************************/
 
@@ -203,49 +84,10 @@ bool ErrorCheck::checkInput(string input) {
                                splitAtEquals(parameter, value);
                                
                                //is it a valid parameter
-                               if (validParameter->isValidParameter(parameter) != true) { return false; }
-                               //if(!validCommandParameter(parameter,commandName)) { 
-                               //      cout << "'" << parameter << "' is not a valid parameter for the " << commandName << " command.\n";
-                               //      return false; 
-                               //}
-                               //if(!validParameterValue(value, parameter)) {
-                               //      if(parameter.compare("precision") == 0)
-                               //              cout << "The precision parameter can only take powers of 10 as a value (e.g. 10,1000,1000, etc.)\n";
-                               //      else {
-                               /*      vector<double> bounds = intParams[parameter];
-                                       double a = bounds.at(0);
-                                       double b = bounds.at(1);
-                                       double c = bounds.at(2);
-                                       double d = bounds.at(3);
-                                       double e = bounds.at(4);
-                                       cout << "The '" << parameter << "' parameter needs to be ";
-                                       if(c == 1)
-                                                       cout << "either '" << a << "' or '" << b << "'.\n";
-                                       else
-                                       {
-                                               if(a != piSent)
-                                               {
-                                                       cout << ">";
-                                                       if(d != 0)
-                                                               cout << "=";
-                                                       cout << " '" << a << "'";
-                                               }
-                                               if(b == piSent)
-                                                       cout << ".\n";
-                                               else if(a != piSent)
-                                                       cout << " and ";
-                                               if(b != piSent)
-                                               {
-                                                       cout << "<";
-                                                       if(e != 0)
-                                                               cout << "=";
-                                                       cout << " '" << b << ".\n";
-                                               }
-                                       }
-                                       }
-                                       return false;
-                               } */
+                               if (validParameter->isValidParameter(parameter, commandName, value) != true) { return false; }
+
 
+                               
                                if (parameter == "phylip" )             { phylipfile = value; }
                                if (parameter == "column" )             { columnfile = value; }
                                if (parameter == "list" )               { listfile = value; }
@@ -268,6 +110,7 @@ bool ErrorCheck::checkInput(string input) {
                                if (parameter == "label" )                      { label = value; }
                                if (parameter == "abund" )          { abund = value; }
                                if (parameter == "random" )                     { randomtree = value;   }
+                               if (parameter == "sorted" )                     { sorted = value;       }
                        }
                        
                        //gets the last parameter and value
@@ -275,48 +118,9 @@ bool ErrorCheck::checkInput(string input) {
                                value = optionText;
                                splitAtEquals(parameter, value);
                                //is it a valid parameter
-                               if (validParameter->isValidParameter(parameter) != true) { return false; }
-                       //      if(!validCommandParameter(parameter,commandName)) { 
-                       //              cout << "'" << parameter << "' is not a valid parameter for the " << commandName << " command.\n";
-                       //              return false; 
-                       //      }
-                       /*      if(!validParameterValue(value, parameter)) {
-                                       if(parameter.compare("precision") == 0)
-                                               cout << "The precision parameter can only take powers of 10 as a value (e.g. 10,1000,1000, etc.)\n";
-                                       else {
-                                       vector<double> bounds = intParams[parameter];
-                                       double a = bounds.at(0);
-                                       double b = bounds.at(1);
-                                       double c = bounds.at(2);
-                                       double d = bounds.at(3);
-                                       double e = bounds.at(4);
-                                       cout << "The '" << parameter << "' parameter needs to be ";
-                                       if(c == 1)
-                                                       cout << "either '" << a << "' or '" << b << "'.\n";
-                                       else
-                                       {
-                                               if(a != piSent)
-                                               {
-                                                       cout << ">";
-                                                       if(d != 0)
-                                                               cout << "=";
-                                                       cout << " '" << a << "'";
-                                               }
-                                               if(b == piSent)
-                                                       cout << ".\n";
-                                               else if(a != piSent)
-                                                       cout << " and ";
-                                               if(b != piSent)
-                                               {
-                                                       cout << "<";
-                                                       if(e != 0)
-                                                               cout << "=";
-                                                       cout << " '" << b << ".\n";
-                                               }
-                                       }
-                                       }
-                                       return false;
-                               }*/
+                               if (validParameter->isValidParameter(parameter, commandName, value) != true) { return false; }
+       
+                               
                                if (parameter == "phylip" )             { phylipfile = value; }
                                if (parameter == "column" )             { columnfile = value; }                         
                                if (parameter == "list" )               { listfile = value; }
@@ -339,12 +143,14 @@ bool ErrorCheck::checkInput(string input) {
                                if (parameter == "label" )                      { label = value; }
                                if (parameter == "random" )                     { randomtree = value;   }
                                if (parameter == "abund" )          { abund = value; }
+                               if (parameter == "sorted" )                     { sorted = value;       }
                        }
                }
                
                //make sure the user does not use both the line and label parameters
                if ((line != "") && (label != "")) { cout << "You may use either the line or label parameters, but not both." << endl; return false; }
                
+               //check for valid files 
                if (commandName == "read.dist") { 
                        validateReadFiles();
                        validateReadDist();
@@ -352,13 +158,17 @@ bool ErrorCheck::checkInput(string input) {
                        //you want to do shared commands
                        if ((listfile != "") && (groupfile != ""))      {
                                validateParseFiles(); //checks the listfile and groupfile parameters
-                       }else { //you want to do single commands
+                       //you want to do single commands
+                       }else if ((listfile != "") || (rabundfile != "") || (sabundfile != "")){ 
                                validateReadFiles();
                                validateReadPhil();
+                       //you have not given a file
+                       }else if ((listfile == "") && (sharedfile == "") && (rabundfile == "") && (sabundfile == "")) {
+                               cout << "You must enter either a listfile, rabundfile, sabundfile or a sharedfile with the read.otu command. " << endl; return false; 
+                       //you want to do shared commands with a shared file
+                       }else if (sharedfile != "") {//you are reading a shared file
+                               validateReadFiles();
                        }
-               }else if (commandName == "read.shared") { 
-                       //you want to do shared commands with just the shared file
-                       validateReadFiles();
                }else if (commandName == "read.tree") { 
                        validateTreeFiles(); //checks the treefile and groupfile parameters
                }else if (commandName == "deconvolute") {
@@ -367,12 +177,16 @@ bool ErrorCheck::checkInput(string input) {
                }
                
                //are you trying to cluster before you have read something                      
-               if ((commandName == "cluster") && (globaldata->getSparseMatrix() == NULL) ||
-                       (commandName == "cluster") && (globaldata->getListVector() == NULL)) {
+               if (((commandName == "cluster") && (globaldata->gSparseMatrix == NULL)) ||
+                       ((commandName == "cluster") && (globaldata->gListVector == NULL))) {
                                cout << "Before you use the cluster command, you first need to read in a distance matrix." << endl; 
                                errorFree = false;
                } 
                
+               if ((commandName == "libshuff") && ((globaldata->gMatrix == NULL) || (globaldata->gGroupmap == NULL))) {
+                        cout << "You must read in a matrix and groupfile using the read.dist command, before you use the libshuff command. " << endl; return false; 
+               }
+               
                if (commandName == "parsimony") {
                        //are you trying to use parsimony without reading a tree or saying you want random distribution
                        if (randomtree == "")  {
@@ -408,6 +222,27 @@ bool ErrorCheck::checkInput(string input) {
                                else if (globaldata->getGroupFile() == "") { cout << "You must read a list and a group, or a shared before you can use the collect.shared, rarefaction.shared or summary.shared commands." << endl; return false; }
                        }
                }
+               
+               if ((commandName == "heatmap") || (commandName == "venn")) { 
+                       if ((globaldata->getListFile() == "") && (globaldata->getSharedFile() == "")) {
+                                cout << "You must read a list, or a list and a group, or a shared before you can use the heatmap or venn commands." << endl; return false; 
+                       }
+               }
+               
+               if ((commandName == "bin.seqs")) { 
+                       if ((globaldata->getListFile() == "")) { cout << "You must read a list file before you can use the bin.seqs command." << endl; return false; }
+                       validateBinFiles();
+               }
+               
+               if ((commandName == "get.oturep")) { 
+                       if ((globaldata->gSparseMatrix == NULL) || (globaldata->gListVector == NULL)) {
+                               cout << "Before you use the get.oturep command, you first need to read in a distance matrix." << endl; 
+                               errorFree = false;
+                       }
+                       if (listfile == "") { cout << "list is a required parameter for the get.oturep command." << endl; errorFree = false; }
+                       validateBinFiles();
+               } 
+
 
                return errorFree;
 }
@@ -430,7 +265,7 @@ void ErrorCheck::validateReadFiles() {
                        //unable to open
                        if (ableToOpen == 1) { errorFree = false; }
                        else { globaldata->inputFileName = phylipfile; }
-               //are we reading a phylipfile
+               //are we reading a columnfile
                }else if (columnfile != "") {
                        ableToOpen = openInputFile(columnfile, filehandle);
                        filehandle.close();
@@ -486,113 +321,6 @@ void ErrorCheck::validateReadFiles() {
 }
 /*******************************************************/
 
-/******************************************************
-//This function checks to see if the given paramter
-//is a valid paramter for the given command.
-bool ErrorCheck::validCommandParameter(string parameter, string commandName) {
-       try {
-               for(int i = 0; i < commandParameters[commandName].size(); i++)
-                       if(parameter.compare(commandParameters[commandName][i]) == 0)
-                               return true;
-               return false;
-       }
-               
-       catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the ErrorCheck class Function validateReadFiles. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the ErrorCheck class function validateReadFiles. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-}
-/*******************************************************/
-
-/******************************************************
-//This function checks to see if the given paramter value
-//is convertable into an int if that parameter requires it.
-bool ErrorCheck::validParameterValue(string value, string parameter) {
-       try {
-               int pVal;
-               if(intParams.count(parameter) == 1)
-               {
-                       vector<double> bounds = intParams[parameter];
-                       bool valid = convertTest(value, pVal);
-                       if(!valid)
-                               return false;
-                       if(parameter.compare("precision") == 0)
-                       {
-                               double logNum = log10((double)pVal);
-                               double diff = (double)((int)logNum - logNum);
-                               if(diff != 0)
-                                       return false;
-                       }
-                       double a = bounds.at(0);
-                       double b = bounds.at(1);
-                       double c = bounds.at(2);
-                       double d = bounds.at(3);
-                       double e = bounds.at(4);
-                       bool a0 = pVal > a;
-                       bool a1 = pVal >= a;
-                       bool b0 = pVal < b;
-                       bool b1 = pVal <= b;
-                       
-                       if(c != 1)
-                       {
-                               if(a == piSent && b == piSent)
-                                       return true;
-                               if(a != piSent && b == piSent)
-                               {
-                                       if(d == 0)
-                                               return a0;
-                                       else
-                                               return a1;
-                               }
-                               else if(a == piSent && b != piSent)
-                               {
-                                       if(e == 0)
-                                               return b0;
-                                       else
-                                               return b1;
-                               }
-                               else
-                               {
-                                       if(d == 0 && e == 0)
-                                               return (a0 && b0);
-                                       else if(d == 0 && e == 1)
-                                               return (a0 && b1);
-                                       else if(d == 1 && e == 0)
-                                               return (a1 && b0);
-                                       else
-                                               return (a1 && b1);
-                               }
-                       }
-                       else
-                       {
-                               if(a == piSent && b == piSent)
-                                       return true;
-                               if(a != piSent && b == piSent)
-                                       return (pVal == a);
-                               else if(a == piSent && b != piSent)
-                                       return (pVal == b);
-                               else
-                                       return (pVal == a || pVal == b);
-                       }
-               }
-               return true;
-       }
-               
-       catch(exception& e) {
-               cout << "Standard Error: " << e.what() << " has occurred in the ErrorCheck class Function validateReadFiles. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-       catch(...) {
-               cout << "An unknown error has occurred in the ErrorCheck class function validateReadFiles. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
-               exit(1);
-       }
-}              
-/*******************************************************/
-
 /******************************************************/
 //This function checks to make sure the user entered appropriate
 // format parameters on a distfile read
@@ -601,6 +329,13 @@ void ErrorCheck::validateReadDist() {
                ifstream filehandle;
                int ableToOpen;
                
+               if (groupfile != "") {
+                       ableToOpen = openInputFile(groupfile, filehandle);
+                       filehandle.close();
+                       //unable to open
+                       if (ableToOpen == 1) {  errorFree = false; }
+               }
+               
                if ((phylipfile == "") && (columnfile == "")) { cout << "When executing a read.dist you must enter a phylip or a column." << endl; errorFree = false; }
                else if ((phylipfile != "") && (columnfile != "")) { cout << "When executing a read.dist you must enter ONLY ONE of the following: phylip or column." << endl; errorFree = false; }
                
@@ -726,7 +461,7 @@ void ErrorCheck::validateReadPhil() {
                }else if (sabundfile != "") { 
                        if ((listfile != "") || (rabundfile != "")) { 
                                cout << "When executing a read.otu you must enter ONLY ONE of the following: list, rabund or sabund." << endl; errorFree = false; }
-               }else if ((listfile == "") && (rabundfile == "") && (sabundfile == "")) {
+               }else if ((listfile == "") && (rabundfile == "") && (sabundfile == "") && (sharedfile == "")) {
                            cout << "When executing a read.otu you must enter one of the following: list, rabund or sabund." << endl; errorFree = false; 
                }
                
@@ -750,6 +485,58 @@ void ErrorCheck::validateReadPhil() {
 }
 /*******************************************************/
 
+/******************************************************/
+//This function checks to make sure the user entered appropriate
+// format parameters on a bin.seq command
+void ErrorCheck::validateBinFiles() {
+       try {
+               ifstream filehandle;
+               int ableToOpen;
+               
+               if (fastafile == "") {
+                               cout << "fasta is a required parameter for bin.seqs and get.oturep commands." << endl; errorFree = false; 
+               }else if (fastafile != "") {
+                       //is it a valid filename'
+                       ableToOpen = openInputFile(fastafile, filehandle);
+                       filehandle.close();
+                       //unable to open
+                       if (ableToOpen == 1) {  errorFree = false; }
+               }else if (listfile != "") {
+                       //is it a valid filename'
+                       ableToOpen = openInputFile(listfile, filehandle);
+                       filehandle.close();
+                       //unable to open
+                       if (ableToOpen == 1) {  errorFree = false; }
+               }else if (globaldata->getNameFile() != "") {
+                       //is it a valid filename'
+                       ifstream filehandle;
+                       int ableToOpen = openInputFile(globaldata->getNameFile(), filehandle);
+                       filehandle.close();
+                       //unable to open
+                       if (ableToOpen == 1) {  errorFree = false; }
+               }else if (namefile != "") {
+                       //is it a valid filename'
+                       ifstream filehandle;
+                       int ableToOpen = openInputFile(namefile, filehandle);
+                       filehandle.close();
+                       //unable to open
+                       if (ableToOpen == 1) {  errorFree = false; }
+               }
+
+
+       }
+       catch(exception& e) {
+               cout << "Standard Error: " << e.what() << " has occurred in the ErrorCheck class Function validateBinFiles. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+       catch(...) {
+               cout << "An unknown error has occurred in the ErrorCheck class function validateBinFiles. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+               exit(1);
+       }
+}
+
+/*******************************************************/
+
 /******************************************************/
 
 void ErrorCheck::clear() {