X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=unifracunweightedcommand.cpp;h=fcff253fc4812bafea60669dcb07c301dfa8de62;hb=b1ac9e686514752c0aa7df045a3b2ab70ceaec89;hp=dd1a3f9c236f9a86b022c99a3e6dd2d2109b1dfa;hpb=9651e8e7172d86707b34af15e95ec60ad4c3c3f9;p=mothur.git diff --git a/unifracunweightedcommand.cpp b/unifracunweightedcommand.cpp index dd1a3f9..fcff253 100644 --- a/unifracunweightedcommand.cpp +++ b/unifracunweightedcommand.cpp @@ -19,7 +19,13 @@ UnifracUnweightedCommand::UnifracUnweightedCommand() { sumFile = globaldata->getTreeFile() + ".uwsummary"; openOutputFile(sumFile, outSum); - setGroups(); //sets users groups to analyze + util = new SharedUtil(); + util->setGroups(globaldata->Groups, tmap->namesOfGroups, allGroups, numGroups, "unweighted"); //sets the groups the user wants to analyze + util->getCombos(groupComb, globaldata->Groups, numComp); + globaldata->setGroups(""); + + if (numGroups == 1) { numComp++; groupComb.push_back(allGroups); } + convert(globaldata->getIters(), iters); //how many random trees to generate unweighted = new Unweighted(tmap); @@ -36,24 +42,20 @@ UnifracUnweightedCommand::UnifracUnweightedCommand() { /***********************************************************/ int UnifracUnweightedCommand::execute() { try { - + userData.resize(numComp,0); //data[0] = unweightedscore randomData.resize(numComp,0); //data[0] = unweightedscore //create new tree with same num nodes and leaves as users - + + outSum << "Tree#" << '\t' << "Groups" << '\t' << "UWScore" <<'\t' << "UWSig" << endl; + cout << "Tree#" << '\t' << "Groups" << '\t' << "UWScore" << '\t' << "UWSig" << endl; + //get pscores for users trees for (int i = 0; i < T.size(); i++) { counter = 0; - unweightedFile = globaldata->getTreeFile() + toString(i+1) + ".unweighted"; - unweightedFileout = globaldata->getTreeFile() + "temp." + toString(i+1) + ".unweighted"; - //column headers -// outSum << "Tree# " << i+1 << endl; - outSum << "Tree#" << '\t' << "Groups" << '\t' << "UWScore" <<'\t' << "UWSig" << endl; -// cout << "Tree# " << i+1 << endl; - cout << "Tree#" << '\t' << "Groups" << '\t' << "UWScore" << '\t' << "UWSig" << endl; - - + output = new ColumnFile(globaldata->getTreeFile() + toString(i+1) + ".unweighted"); + //get unweighted for users tree rscoreFreq.resize(numComp); rCumul.resize(numComp); @@ -66,6 +68,7 @@ int UnifracUnweightedCommand::execute() { for(int k = 0; k < numComp; k++) { //saves users score utreeScores[k].push_back(userData[k]); + } //get unweighted scores for random trees @@ -85,33 +88,38 @@ int UnifracUnweightedCommand::execute() { //add randoms score to validscores validScores[randomData[k]] = randomData[k]; } + } - for(int a = 0; a < numComp; a++) { - float rcumul = 1.0000; - //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++) { - //make rscoreFreq map and rCumul - it2 = rscoreFreq[a].find(it->first); - rCumul[a][it->first] = rcumul; - //get percentage of random trees with that info - if (it2 != rscoreFreq[a].end()) { rscoreFreq[a][it->first] /= iters; rcumul-= it2->second; } - else { rscoreFreq[a][it->first] = 0.0000; } //no random trees with that score + for(int a = 0; a < numComp; a++) { + float rcumul = 1.0000; + //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++) { + //make rscoreFreq map and rCumul + it2 = rscoreFreq[a].find(it->first); + rCumul[a][it->first] = rcumul; + //get percentage of random trees with that info + if (it2 != rscoreFreq[a].end()) { rscoreFreq[a][it->first] /= iters; rcumul-= it2->second; } + else { rscoreFreq[a][it->first] = 0.0000; } //no random trees with that score + } + UWScoreSig[a].push_back(rCumul[a][userData[a]]); } - UWScoreSig[a].push_back(rCumul[a][userData[a]]); - } - printUnweightedFile(); - printUWSummaryFile(); - rscoreFreq.clear(); - rCumul.clear(); - validScores.clear(); - utreeScores.clear(); - UWScoreSig.clear(); - } + + printUnweightedFile(); + printUWSummaryFile(i); + + delete output; + rscoreFreq.clear(); + rCumul.clear(); + validScores.clear(); + utreeScores.clear(); + UWScoreSig.clear(); + } + //reset groups parameter - globaldata->Groups.clear(); globaldata->setGroups(""); + globaldata->Groups.clear(); outSum.close(); return 0; @@ -130,22 +138,19 @@ int UnifracUnweightedCommand::execute() { void UnifracUnweightedCommand::printUnweightedFile() { try { vector data; + vector tags; + tags.push_back("Score"); tags.push_back("RandFreq"); tags.push_back("RandCumul"); for(int a = 0; a < numComp; a++) { - initFile(groupComb[a]); + output->initFile(groupComb[a], tags); //print each line for (it = validScores.begin(); it != validScores.end(); it++) { data.push_back(it->first); data.push_back(rscoreFreq[a][it->first]); data.push_back(rCumul[a][it->first]); - output(data); + output->output(data); data.clear(); } - resetFile(); + output->resetFile(); } - - out.close(); - inFile.close(); - remove(unweightedFileout.c_str()); - } catch(exception& e) { cout << "Standard Error: " << e.what() << " has occurred in the UnifracUnweightedCommand class Function printUnweightedFile. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; @@ -158,7 +163,7 @@ void UnifracUnweightedCommand::printUnweightedFile() { } /***********************************************************/ -void UnifracUnweightedCommand::printUWSummaryFile() { +void UnifracUnweightedCommand::printUWSummaryFile(int i) { try { //format output @@ -167,12 +172,15 @@ void UnifracUnweightedCommand::printUWSummaryFile() { //print each line for(int a = 0; a < numComp; a++) { + outSum << i+1 << '\t'; + cout << i+1 << '\t'; + if (UWScoreSig[a][0] > (1/(float)iters)) { - outSum << setprecision(6) << groupComb[a] << '\t' << '\t' << utreeScores[a][0] << '\t' << setprecision(globaldata->getIters().length()) << UWScoreSig[a][0] << endl; - cout << setprecision(6) << groupComb[a] << '\t' << '\t' << utreeScores[a][0] << '\t' << setprecision(globaldata->getIters().length()) << UWScoreSig[a][0] << endl; + outSum << setprecision(6) << groupComb[a] << '\t' << utreeScores[a][0] << '\t' << setprecision(globaldata->getIters().length()) << UWScoreSig[a][0] << endl; + cout << setprecision(6) << groupComb[a] << '\t' << utreeScores[a][0] << '\t' << setprecision(globaldata->getIters().length()) << UWScoreSig[a][0] << endl; }else { - outSum << setprecision(6) << groupComb[a] << '\t' << '\t' << utreeScores[a][0] << '\t' << setprecision(globaldata->getIters().length()) << "<" << (1/float(iters)) << endl; - cout << setprecision(6) << groupComb[a] << '\t' << '\t' << utreeScores[a][0] << '\t' << setprecision(globaldata->getIters().length()) << "<" << (1/float(iters)) << endl; + outSum << setprecision(6) << groupComb[a] << '\t' << utreeScores[a][0] << '\t' << setprecision(globaldata->getIters().length()) << "<" << (1/float(iters)) << endl; + cout << setprecision(6) << groupComb[a] << '\t' << utreeScores[a][0] << '\t' << setprecision(globaldata->getIters().length()) << "<" << (1/float(iters)) << endl; } } @@ -186,162 +194,7 @@ void UnifracUnweightedCommand::printUWSummaryFile() { exit(1); } } -/***********************************************************/ -void UnifracUnweightedCommand::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; rGroups[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 UnifracUnweightedCommand class Function setGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the UnifracUnweightedCommand class function setGroups. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - -} -/*****************************************************************/ - -void UnifracUnweightedCommand::initFile(string label){ - try { - if(counter != 0){ - openOutputFile(unweightedFileout, out); - openInputFile(unweightedFile, inFile); - - string inputBuffer; - getline(inFile, inputBuffer); - - out << inputBuffer << '\t' << label + "RandFreq" << '\t' << label + "RandCumul" << endl; - }else{ - openOutputFile(unweightedFileout, out); - out << label + "Score" << '\t' << label + "RandFreq" << '\t' << label + "RandCumul" << endl; - } - - out.setf(ios::fixed, ios::floatfield); - out.setf(ios::showpoint); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the UnifracUnweightedCommand class Function initFile. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the UnifracUnweightedCommand class function initFile. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -} - -/***********************************************************************/ - -void UnifracUnweightedCommand::output(vector data){ - try { - if(counter != 0){ - string inputBuffer; - getline(inFile, inputBuffer); -// out << inputBuffer << setprecision(6) << '\t' << data[0] << setprecision(globaldata->getIters().length()) << '\t' << data[1] << '\t' << data[2] << endl; - - out << inputBuffer << '\t' << setprecision(6) << data[0] << setprecision(globaldata->getIters().length()) << '\t' << data[1] << '\t' << data[2] << 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 UnifracUnweightedCommand class Function output. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the UnifracUnweightedCommand class function output. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -}; - -/***********************************************************************/ +/***********************************************************/ -void UnifracUnweightedCommand::resetFile(){ - try { - if(counter != 0){ - out.close(); - inFile.close(); - } - else{ - out.close(); - } - counter = 1; - - remove(unweightedFile.c_str()); - rename(unweightedFileout.c_str(), unweightedFile.c_str()); - } - catch(exception& e) { - cout << "Standard Error: " << e.what() << " has occurred in the UnifracUnweightedCommand class Function resetFile. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } - catch(...) { - cout << "An unknown error has occurred in the UnifracUnweightedCommand class function resetFile. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; - exit(1); - } -}