From: pschloss Date: Mon, 20 Apr 2009 20:37:11 +0000 (+0000) Subject: pds fixes of heatmap and some other minor stuff X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=commitdiff_plain;h=e2373397d9316500ee0d196e60dcab75d208511a pds fixes of heatmap and some other minor stuff --- diff --git a/ace.h b/ace.h index b81dd64..c3d156c 100644 --- a/ace.h +++ b/ace.h @@ -20,7 +20,7 @@ It is a child of the calculator class. */ class Ace : public Calculator { public: - Ace(int n) : abund(n), Calculator("ACE", 3) {}; + Ace(int n) : abund(n), Calculator("ace", 3) {}; EstOutput getValues(SAbundVector*); EstOutput getValues(SharedRAbundVector*, SharedRAbundVector*) {return data;}; private: diff --git a/binsequencecommand.cpp b/binsequencecommand.cpp index c3c68ab..7c70604 100644 --- a/binsequencecommand.cpp +++ b/binsequencecommand.cpp @@ -105,7 +105,7 @@ int BinSeqCommand::execute(){ //get last name sequence = fasta->getSequence(binnames); if (sequence != "not found") { - name = binnames + "bin" + toString(i+1); + name = binnames + '|' + toString(i+1); out << ">" << name << endl; out << sequence << endl; }else { diff --git a/engine.cpp b/engine.cpp index 68a7500..b9360a4 100644 --- a/engine.cpp +++ b/engine.cpp @@ -45,8 +45,8 @@ bool InteractEngine::getInput(){ bool errorFree; ErrorCheck* errorCheckor = new ErrorCheck(); - cout << "mothur v1.0" << endl; - cout << "Last updated: 1/29/2009" << endl << endl; + cout << "mothur v1.2.0" << endl; + cout << "Last updated: 4/14/2009" << endl << endl; cout << "by" << endl; cout << "Patrick D. Schloss" << endl << endl; cout << "Department of Microbiology" << endl; diff --git a/heatmap.cpp b/heatmap.cpp index 08eb732..187c953 100644 --- a/heatmap.cpp +++ b/heatmap.cpp @@ -27,80 +27,74 @@ HeatMap::HeatMap(){ exit(1); } } + //********************************************************************************************************************** + void HeatMap::getPic(OrderVector* order) { try { - colorScale.clear(); - rabund = order->getRAbundVector(); + RAbundVector rabund = order->getRAbundVector(); //get users scaling method scaler = globaldata->getScale(); - float maxbin = 0.0; - for (int i = 0; i < rabund.size(); i++) { - if (rabund.get(i) != 0) { //don't want log value of 0. - if (scaler == "log10") { - colorScale[(log10((rabund.get(i) / (float)rabund.getNumSeqs()) * 1000))] = ""; - if (maxbin < (log10((rabund.get(i) / (float)rabund.getNumSeqs()) * 1000))) { maxbin = (log10((rabund.get(i) / (float)rabund.getNumSeqs()) * 1000)); } - }else if (scaler == "log2") { - colorScale[(log2((rabund.get(i) / (float)rabund.getNumSeqs()) * 1000))] = ""; - if (maxbin < (log2((rabund.get(i) / (float)rabund.getNumSeqs()) * 1000))) { maxbin = (log2((rabund.get(i) / (float)rabund.getNumSeqs()) * 1000)); } - }else if (scaler == "linear") { - colorScale[rabund.get(i)] = ""; - if (maxbin < rabund.get(i)) { maxbin = rabund.get(i); } - }else { //if user enters invalid scaler option. - cout << scaler << " is not a valid scaler option. I will use log10." << endl; - colorScale[(log10((rabund.get(i) / (float)rabund.getNumSeqs()) * 1000))] = ""; - if (maxbin < (log10((rabund.get(i) / (float)rabund.getNumSeqs()) * 1000))) { maxbin = (log10((rabund.get(i)) / (float)rabund.getNumSeqs()) * 1000); } - } - }else { colorScale[0] = "00"; } + float maxRelAbund = 0.0; + + for(int i=0;i maxRelAbund){ maxRelAbund = relAbund; } } - float scalers = 255 / (float) maxbin; + scaler = globaldata->getScale(); - //go through map and give each score a color value - for (it = colorScale.begin(); it != colorScale.end(); it++) { - it->second = toHex(int(float(it->first) * scalers)); - if(it->second.length() == 1) { it->second = "0" + it->second; } + vector scaleRelAbund(rabund.size(), ""); + + for(int i=0;iinputFileName) + order->getLabel() + ".heatmap.svg"; + + + string filenamesvg = getRootName(globaldata->inputFileName) + rabund.getLabel() + ".heatmap.svg"; openOutputFile(filenamesvg, outsvg); //svg image - outsvg << "\n"; + outsvg << "\n"; outsvg << "\n"; //white backround - outsvg << ""; - outsvg << "Heatmap at distance " + order->getLabel() + "\n"; - + outsvg << ""; + outsvg << "Heatmap at distance " + rabund.getLabel() + "\n"; + //output legend and color labels string color; int x = 0; int y = 103 + (rabund.getNumBins()*5); - printLegend(y, maxbin); + printLegend(y, maxRelAbund); y = 70; - for (int i = 0; i <= rabund.getNumBins(); i++) { - if (rabund.get(i) != 0) { //don't want log value of 0. - if (scaler == "log10") { - color = colorScale[(log10((rabund.get(i) / (float)rabund.getNumSeqs()) * 1000))]; - }else if (scaler == "log2") { - color = colorScale[(log2((rabund.get(i) / (float)rabund.getNumSeqs()) * 1000))]; - }else if (scaler == "linear") { - color = colorScale[rabund.get(i)]; - }else { color = colorScale[(log10((rabund.get(i) / (float)rabund.getNumSeqs()) * 1000))]; } - }else { color = "OO"; } + for (int i = 0; i < scaleRelAbund.size(); i++) { - outsvg << "\n"; + outsvg << "\n"; y += 5; } outsvg << "\n\n"; outsvg.close(); + } catch(exception& e) { cout << "Standard Error: " << e.what() << " has occurred in the HeatMap class Function getPic. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; @@ -111,52 +105,56 @@ void HeatMap::getPic(OrderVector* order) { exit(1); } } + //********************************************************************************************************************** + void HeatMap::getPic(SharedOrderVector* sharedorder) { try { - colorScale.clear(); //fills vector of sharedsabunds - lookup - util->getSharedVectors(globaldata->Groups, lookup, sharedorder); //fills group vectors from order vector. + vector lookup; + util->getSharedVectors(globaldata->Groups, lookup, sharedorder); //fills group vectors from order vector. + //sort lookup so shared bins are on top - if (sorted == "T") { sortSharedVectors(); } - - //get users scaling method + if (sorted == "T") { sortSharedVectors(lookup); } + + vector > scaleRelAbund; + vector maxRelAbund(lookup.size(), 0.0); + float superMaxRelAbund = 0; + + for(int i = 0; i < lookup.size(); i++){ + for(int j=0; jsize(); j++){ + + float relAbund = lookup[i]->getAbundance(j) / (float)lookup[i]->getNumSeqs(); + if(relAbund > maxRelAbund[i]){ maxRelAbund[i] = relAbund; } + } + if(maxRelAbund[i] > superMaxRelAbund){ superMaxRelAbund = maxRelAbund[i]; } + } + scaler = globaldata->getScale(); - float maxbin = 0.0; - for (int i = 0; i < lookup.size(); i++) { - for (int j = 0; j < lookup[i]->size(); j++) { + scaleRelAbund.resize(lookup.size()); + for(int i=0;isize(), ""); + for(int j=0;jsize();j++){ + float relAbund = lookup[i]->getAbundance(j) / (float)lookup[i]->getNumSeqs(); + if (lookup[i]->getAbundance(j) != 0) { //don't want log value of 0. if (scaler == "log10") { - colorScale[(log10((lookup[i]->getAbundance(j) / (float)lookup[i]->getNumSeqs()) * 1000))] = ""; - if (maxbin < (log10((lookup[i]->getAbundance(j) / (float)lookup[i]->getNumSeqs()) * 1000))) { maxbin = (log10((lookup[i]->getAbundance(j) / (float)lookup[i]->getNumSeqs()) * 1000)); } + scaleRelAbund[i][j] = toHex(int(255 * log10(relAbund) / log10(maxRelAbund[i]))) + "0000"; }else if (scaler == "log2") { - colorScale[(log2((lookup[i]->getAbundance(j) / (float)lookup[i]->getNumSeqs()) * 1000))] = ""; - if (maxbin < (log2((lookup[i]->getAbundance(j) / (float)lookup[i]->getNumSeqs()) * 1000))) { maxbin = (log2((lookup[i]->getAbundance(j) / (float)lookup[i]->getNumSeqs()) * 1000)); } + scaleRelAbund[i][j] = toHex(int(255 * log2(relAbund) / log2(maxRelAbund[i]))) + "0000"; }else if (scaler == "linear") { - colorScale[lookup[i]->getAbundance(j)] = ""; - if (maxbin < lookup[i]->getAbundance(j)) { maxbin = lookup[i]->getAbundance(j); } + scaleRelAbund[i][j] = toHex(int(255 * relAbund / maxRelAbund[i])) + "0000"; }else { //if user enters invalid scaler option. - cout << scaler << " is not a valid scaler option. I will use log10." << endl; - colorScale[(log10((lookup[i]->getAbundance(j) / (float)lookup[i]->getNumSeqs()) * 1000))] = ""; - if (maxbin < (log10((lookup[i]->getAbundance(j) / (float)lookup[i]->getNumSeqs()) * 1000))) { maxbin = (log10((lookup[i]->getAbundance(j)) / (float)lookup[i]->getNumSeqs()) * 1000); } + scaleRelAbund[i][j] = toHex(int(255 * log10(relAbund / log10(maxRelAbund[i])))) + "0000"; } - }else { colorScale[0] = "00"; } + }else { scaleRelAbund[i][j] = "FFFFFF"; } + } } - //get scaler - float scalers = 255 / (float) maxbin; - - - //go through map and give each score a color value - for (it = colorScale.begin(); it != colorScale.end(); it++) { - it->second = toHex(int(float(it->first) * scalers)); - if(it->second.length() == 1) { it->second = "0" + it->second; } - } - string filenamesvg = getRootName(globaldata->inputFileName) + sharedorder->getLabel() + ".heatmap.svg"; openOutputFile(filenamesvg, outsvg); @@ -177,31 +175,19 @@ void HeatMap::getPic(SharedOrderVector* sharedorder) { string color; int x = 0; int y = 103 + (lookup[0]->getNumBins()*5); - printLegend(y, maxbin); - + printLegend(y, superMaxRelAbund); + y = 70; - for (int i = 0; i < lookup[0]->size(); i++) { - for (int j = 0; j < lookup.size(); j++) { + for (int i = 0; i < scaleRelAbund[0].size(); i++) { + for (int j = 0; j < scaleRelAbund.size(); j++) { - if (lookup[j]->getAbundance(i) != 0) { //don't want log value of 0. - if (scaler == "log10") { - color = colorScale[(log10((lookup[j]->getAbundance(i) / (float)lookup[j]->getNumSeqs()) * 1000))]; - }else if (scaler == "log2") { - color = colorScale[(log2((lookup[j]->getAbundance(i) / (float)lookup[j]->getNumSeqs()) * 1000))]; - }else if (scaler == "linear") { - color = colorScale[lookup[j]->getAbundance(i)]; - }else { color = colorScale[(log10((lookup[j]->getAbundance(i) / (float)lookup[j]->getNumSeqs()) * 1000))]; } - }else { color = "OO"; } - - - outsvg << "\n"; + outsvg << "\n"; x += 300; } x = 0; y += 5; } - outsvg << "\n\n"; outsvg.close(); @@ -217,7 +203,7 @@ void HeatMap::getPic(SharedOrderVector* sharedorder) { } //********************************************************************************************************************** -void HeatMap::sortSharedVectors(){ +void HeatMap::sortSharedVectors(vector& lookup){ try { //copy lookup and then clear it to refill with sorted. //loop though lookup and determine if they are shared @@ -295,49 +281,44 @@ void HeatMap::sortSharedVectors(){ cout << "An unknown error has occurred in the HeatMap class function sortSharedVectors. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; exit(1); } - + } //********************************************************************************************************************** + void HeatMap::printLegend(int y, float maxbin) { try { - + //output legend and color labels //go through map and give each score a color value string color; - int x = 0; - if (maxbin != 0) { - //convert maxbin to relative abundance again - if (scaler == "log10") { - maxbin = pow(10, maxbin) / 1000; - }else if (scaler == "log2") { - maxbin = pow(2, maxbin) / 1000; - }else { maxbin = pow(10, maxbin) / 1000; } - }else { maxbin = 0.00; } - - //5 is the number of boxes in the legend - float maxbinScaler = maxbin / 10; - float colorScaler = 255 / 10; + int x = 10; //prints legend - for (int i = 0; i < 10; i++) { - color = toHex(int((float)(i+1) * colorScaler)); - outsvg << "\n"; - x += 30; + for (int i = 1; i < 255; i++) { + color = toHex(int((float)(i))); + outsvg << "\n"; + x += 1; } //prints legend labels - x -= 30; - for (int i = 10; i > 0; i = i-2) { - string label = toString((i * maxbinScaler)); - //set precision of relative abundance to 3 - int pos = label.find_first_of('.'); - label = label.substr(0,pos+4); + x = 10; + for (int i = 1; i<=5; i++) { + float label; + if(scaler== "log10") { label = maxbin * log10(51*i) / log10(255); } + else if(scaler== "log2") { label = maxbin * log2(51*i) / log2(255); } + else if(scaler== "linear") { label = maxbin * 51 * i / 255; } + else { label = maxbin * log10(51*i) / log10(255); } - outsvg << "" + label + "\n"; - x -= 60; + label = int(label * 1000 + 0.5); + label /= 1000.0; + string text = toString(label, 3); + + outsvg << "" + text + "\n"; + x += 60; } } + catch(exception& e) { cout << "Standard Error: " << e.what() << " has occurred in the HeatMap class Function printLegend. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; exit(1); @@ -346,7 +327,7 @@ void HeatMap::printLegend(int y, float maxbin) { cout << "An unknown error has occurred in the HeatMap class function printLegend. Please contact Pat Schloss at pschloss@microbio.umass.edu." << "\n"; exit(1); } - + } diff --git a/heatmap.h b/heatmap.h index 54035f0..528c964 100644 --- a/heatmap.h +++ b/heatmap.h @@ -31,20 +31,16 @@ class HeatMap { void getPic(SharedOrderVector*); private: - void sortSharedVectors(); + void sortSharedVectors(vector& ); void printLegend(int, float); - + GlobalData* globaldata; SharedUtil* util; - vector lookup; - RAbundVector rabund; string format, sorted, groupComb, scaler; ofstream outsvg; - map colorScale; - map::iterator it; - }; + /***********************************************************************/ #endif diff --git a/heatmapcommand.cpp b/heatmapcommand.cpp index 82aa12c..bbda2b3 100644 --- a/heatmapcommand.cpp +++ b/heatmapcommand.cpp @@ -63,12 +63,11 @@ int HeatMapCommand::execute(){ //you are using just a list file and have only one group read = new ReadPhilFile(globaldata->inputFileName); read->read(&*globaldata); - + ordersingle = globaldata->gorder; input = globaldata->ginput; } - if (format != "list") { util->setGroups(globaldata->Groups, globaldata->gGroupmap->namesOfGroups, "heat"); diff --git a/libshuffcommand.cpp b/libshuffcommand.cpp index 1e38226..49a8767 100644 --- a/libshuffcommand.cpp +++ b/libshuffcommand.cpp @@ -57,7 +57,7 @@ int LibShuffCommand::execute(){ savedDXYValues = form->evaluateAll(); savedMinValues = form->getSavedMins(); - pValueCounts.assign(numGroups, 0); + pValueCounts.resize(numGroups); for(int i=0;igetNumBins(); diff --git a/tree.h b/tree.h index 58f3a79..cbbad66 100644 --- a/tree.h +++ b/tree.h @@ -49,7 +49,7 @@ private: map::iterator it, it2; map mergeGroups(int); //returns a map with a groupname and the number of times that group was seen in the children - map Tree::mergeGcounts(int); + map mergeGcounts(int); void randomTopology(); void randomBlengths(); void randomLabels(vector); diff --git a/venn.cpp b/venn.cpp index 9b3d760..bcc4751 100644 --- a/venn.cpp +++ b/venn.cpp @@ -87,13 +87,13 @@ void Venn::getPic(SharedOrderVector* sharedorder, vector vCalcs) { openOutputFile(filenamesvg, outsvg); //in essence you want to run it like a single - if (vCalcs[i]->getName() == "SharedSobs") { + if (vCalcs[i]->getName() == "sharedsobs") { delete vCalcs[i]; vCalcs[i] = new Sobs(); - }else if (vCalcs[i]->getName() == "SharedChao") { + }else if (vCalcs[i]->getName() == "sharedchao") { delete vCalcs[i]; vCalcs[i] = new Chao1(); - }else if (vCalcs[i]->getName() == "SharedAce") { + }else if (vCalcs[i]->getName() == "sharedace") { delete vCalcs[i]; vCalcs[i] = new Ace(10); } @@ -126,8 +126,8 @@ void Venn::getPic(SharedOrderVector* sharedorder, vector vCalcs) { //one for each group SAbundVector sA, sB; SAbundVector* sabundA; SAbundVector* sabundB; - sA = lookup[0]->getSAbundVector(); sabundA = &sA; - sB = lookup[1]->getSAbundVector(); sabundB = &sB; + sabundA = new SAbundVector(lookup[0]->getSAbundVector());// sabundA = &sA; + sabundB = new SAbundVector(lookup[1]->getSAbundVector());// sabundB = &sB; //make a file for each calculator for(int i=0;i vCalcs) { vector shared = vCalcs[i]->getValues(lookup[0], lookup[1]); //in essence you want to run it like a single - if (vCalcs[i]->getName() == "SharedSobs") { + if (vCalcs[i]->getName() == "sharedsobs") { delete vCalcs[i]; vCalcs[i] = new Sobs(); - }else if (vCalcs[i]->getName() == "SharedChao") { + }else if (vCalcs[i]->getName() == "sharedchao") { delete vCalcs[i]; vCalcs[i] = new Chao1(); - }else if (vCalcs[i]->getName() == "SharedAce") { + }else if (vCalcs[i]->getName() == "sharedace") { delete vCalcs[i]; vCalcs[i] = new Ace(10); } //get estimates for numA vector numA = vCalcs[i]->getValues(sabundA); - + //get estimates for numB vector numB = vCalcs[i]->getValues(sabundB); - + cout << numA[0] << '\t' << numB[0] << '\t' << shared[0] << endl; //image window outsvg << "\n"; @@ -187,7 +187,8 @@ void Venn::getPic(SharedOrderVector* sharedorder, vector vCalcs) { //close file outsvg << "\n\n"; outsvg.close(); - + delete sabundA; + delete sabundB; } /******************* 3 Groups **************************/ @@ -239,13 +240,13 @@ void Venn::getPic(SharedOrderVector* sharedorder, vector vCalcs) { //in essence you want to run it like a single - if (vCalcs[i]->getName() == "SharedSobs") { + if (vCalcs[i]->getName() == "sharedsobs") { delete vCalcs[i]; vCalcs[i] = new Sobs(); - }else if (vCalcs[i]->getName() == "SharedChao") { + }else if (vCalcs[i]->getName() == "sharedchao") { delete vCalcs[i]; vCalcs[i] = new Chao1(); - }else if (vCalcs[i]->getName() == "SharedAce") { + }else if (vCalcs[i]->getName() == "sharedace") { delete vCalcs[i]; vCalcs[i] = new Ace(10); } @@ -338,7 +339,7 @@ void Venn::getPic(SharedOrderVector* sharedorder, vector vCalcs) { //A = red, B = green, C = blue, D = yellow - if ((vCalcs.size() > 1) || (vCalcs[0]->getName() != "SharedSobs")) { cout << "The only calculator able to be used with 4 groups is sharedsobs. I will run that for you. " << endl; } + if ((vCalcs.size() > 1) || (vCalcs[0]->getName() != "sharedsobs")) { cout << "The only calculator able to be used with 4 groups is sharedsobs. I will run that for you. " << endl; } //for each bin for (int i = 0; i < lookup[0]->size(); i++) { @@ -363,7 +364,7 @@ void Venn::getPic(SharedOrderVector* sharedorder, vector vCalcs) { if ((lookup[0]->getAbundance(i) != 0) && (lookup[1]->getAbundance(i) != 0) && (lookup[2]->getAbundance(i) != 0) && (lookup[3]->getAbundance(i) != 0)) { sharedABCD++; } } - string filenamesvg = getRootName(globaldata->inputFileName) + sharedorder->getLabel() + ".venn.SharedSobs.svg"; + string filenamesvg = getRootName(globaldata->inputFileName) + sharedorder->getLabel() + ".venn.sharedsobs.svg"; openOutputFile(filenamesvg, outsvg); //image window diff --git a/venn.h b/venn.h index 398f20b..ae73dc2 100644 --- a/venn.h +++ b/venn.h @@ -12,7 +12,7 @@ using namespace std; #include "ordervector.hpp" -#include "Sabundvector.hpp" +#include "sabundvector.hpp" #include "sharedrabundvector.h" #include "sharedordervector.h" #include "datavector.hpp"