+void ParsimonyCommand::setGroups() {
+ try {
+ string allGroups = "";
+ numGroups = 0;
+ //if the user has not entered specific groups to analyze then do them all
+ if (globaldata->Groups.size() != 0) {
+ if (globaldata->Groups[0] != "all") {
+ //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]);
+ numGroups++;
+ allGroups += tmap->namesOfGroups[i] + "-";
+ }
+ allGroups = allGroups.substr(0, allGroups.length()-1);
+ }else {
+ for (int i = 0; i < globaldata->Groups.size(); i++) {
+ allGroups += globaldata->Groups[i] + "-";
+ numGroups++;
+ }
+ allGroups = allGroups.substr(0, allGroups.length()-1);
+ }
+ }else{//user has enter "all" and wants the default groups
+ globaldata->Groups.clear();
+ for (int i = 0; i < tmap->namesOfGroups.size(); i++) {
+ globaldata->Groups.push_back(tmap->namesOfGroups[i]);
+ numGroups++;
+ allGroups += tmap->namesOfGroups[i] + "-";
+ }
+ allGroups = allGroups.substr(0, allGroups.length()-1);
+ globaldata->setGroups("");
+ }
+ }else {
+ for (int i = 0; i < tmap->namesOfGroups.size(); i++) {
+ allGroups += tmap->namesOfGroups[i] + "-";
+ }
+ allGroups = allGroups.substr(0, allGroups.length()-1);
+ numGroups = 1;
+ }
+
+ //calculate number of comparsions
+ numComp = 0;
+ for (int r=0; r<numGroups; r++) {
+ for (int l = r+1; l < numGroups; l++) {
+ groupComb.push_back(globaldata->Groups[r]+ "-" +globaldata->Groups[l]);
+ numComp++;
+ }
+ }
+
+ //ABC
+ if (numComp != 1) {
+ groupComb.push_back(allGroups);
+ numComp++;
+ }
+
+ }
+ catch(exception& e) {
+ cout << "Standard Error: " << e.what() << " has occurred in the ParsimonyCommand class Function setGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+ catch(...) {
+ cout << "An unknown error has occurred in the ParsimonyCommand class function setGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+
+}
+/*****************************************************************/
+
+void ParsimonyCommand::initFile(string label){
+ try {
+ if(counter != 0){
+ openOutputFile(parsFileout, out);
+ openInputFile(parsFile, inFile);
+
+ string inputBuffer;
+ getline(inFile, inputBuffer);
+
+ if (randomtree == "") {
+ out << inputBuffer << '\t' << label + "Score" << '\t' << label + "UserFreq" << '\t' << label + "UserCumul" << '\t' << label + "RandFreq" << '\t' << label + "RandCumul" << endl;
+ }else {
+ out << inputBuffer << '\t' << "Score" << '\t' << "RandFreq" << '\t' << "RandCumul" << endl;
+ }
+ }else{
+ openOutputFile(parsFileout, out);
+ //column headers
+ if (randomtree == "") {
+ out << label + "Score" << '\t' << label + "UserFreq" << '\t' << label + "UserCumul" << '\t' << label + "RandFreq" << '\t' << label + "RandCumul" << endl;
+ }else {
+ out << "Score" << '\t' << "RandFreq" << '\t' << "RandCumul" << endl;
+ }
+ }
+
+ out.setf(ios::fixed, ios::floatfield);
+ out.setf(ios::showpoint);
+ }
+ catch(exception& e) {
+ cout << "Standard Error: " << e.what() << " has occurred in the ParsimonyCommand class Function initFile. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+ catch(...) {
+ cout << "An unknown error has occurred in the ParsimonyCommand class function initFile. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+}
+
+/***********************************************************************/
+
+void ParsimonyCommand::output(vector<double> data){
+ try {
+ if(counter != 0){
+ string inputBuffer;
+ getline(inFile, inputBuffer);
+
+ if (randomtree == "") {
+ out << inputBuffer << '\t' << setprecision(6) << data[0] << setprecision(globaldata->getIters().length()) << '\t' << data[1] << '\t' << data[2] << '\t' << data[3] << '\t' << data[4] << endl;
+ }else{
+ out << inputBuffer << '\t' << setprecision(6) << data[0] << setprecision(globaldata->getIters().length()) << '\t' << data[1] << '\t' << data[2] << endl;
+ }
+ }
+ else{
+ if (randomtree == "") {
+ out << setprecision(6) << data[0] << setprecision(globaldata->getIters().length()) << '\t' << data[1] << '\t' << data[2] << '\t' << data[3] << '\t' << data[4] << endl;
+ }else{
+ out << setprecision(6) << data[0] << setprecision(globaldata->getIters().length()) << '\t' << data[1] << '\t' << data[2] << endl;
+ }
+ }
+
+ }
+ catch(exception& e) {
+ cout << "Standard Error: " << e.what() << " has occurred in the ParsimonyCommand class Function output. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+ catch(...) {
+ cout << "An unknown error has occurred in the ParsimonyCommand class function output. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+}
+
+/***********************************************************************/
+
+void ParsimonyCommand::resetFile(){
+ try {
+ if(counter != 0){
+ out.close();
+ inFile.close();
+ }
+ else{
+ out.close();
+ }
+ counter = 1;
+
+ remove(parsFile.c_str());
+ rename(parsFileout.c_str(), parsFile.c_str());
+ }
+ catch(exception& e) {
+ cout << "Standard Error: " << e.what() << " has occurred in the ParsimonyCommand class Function resetFile. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+ catch(...) {
+ cout << "An unknown error has occurred in the ParsimonyCommand class function resetFile. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n";
+ exit(1);
+ }
+}
+
+