#include "sharedbraycurtis.h"
//**********************************************************************************************************************
-HeatMapSim::HeatMapSim(){
+HeatMapSim::HeatMapSim(string dir) : outputDir(dir) {
globaldata = GlobalData::getInstance();
+ m = MothurOut::getInstance();
}
//**********************************************************************************************************************
-
-void HeatMapSim::getPic(vector<SharedRAbundVector*> lookup, vector<Calculator*> calcs) {
+vector<string> HeatMapSim::getPic(vector<SharedRAbundVector*> lookup, vector<Calculator*> calcs) {
try {
EstOutput data;
vector<double> sims;
+ vector<string> outputNames;
//make file for each calculator selected
- for (int m = 0; m < calcs.size(); m++) {
-
- string filenamesvg = getRootName(globaldata->inputFileName) + lookup[0]->getLabel() + calcs[m]->getName() + ".heatmap.sim.svg";
+ for (int k = 0; k < calcs.size(); k++) {
+
+ if (m->control_pressed) { return outputNames; }
+
+ string filenamesvg = outputDir + getRootName(getSimpleName(globaldata->inputFileName)) + lookup[0]->getLabel() + calcs[k]->getName() + ".heatmap.sim.svg";
openOutputFile(filenamesvg, outsvg);
+ outputNames.push_back(filenamesvg);
//svg image
- outsvg << "<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 " + toString((lookup.size() * 150) + 160) + " " + toString((lookup.size() * 150) + 160) + "\">\n";
+ outsvg << "<svg xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 " + toString((lookup.size() * 150) + 160) + " " + toString((lookup.size() * 150) + 160) + "\">\n";
outsvg << "<g>\n";
//white backround
}
sims.clear();
- double biggest = -1;
+// double biggest = -1;
+ double biggest = 1;
float scaler;
//get sim for each comparison and save them so you can find the relative similairity
for(int i = 0; i < (lookup.size()-1); i++){
for(int j = (i+1); j < lookup.size(); j++){
-
+
+ if (m->control_pressed) { outsvg.close(); return outputNames; }
+
vector<SharedRAbundVector*> subset;
subset.push_back(lookup[i]); subset.push_back(lookup[j]);
//get similairity between groups
- data = calcs[m]->getValues(subset);
+ data = calcs[k]->getValues(subset);
sims.push_back(data[0]);
//save biggest similairity to set relative sim
- if (data[0] > biggest) { biggest = data[0]; }
+// if (data[0] > biggest) { biggest = data[0]; }
}
}
}
+ return outputNames;
+ }
+ catch(exception& e) {
+ m->errorOut(e, "HeatMapSim", "getPic");
+ exit(1);
+ }
+}
+//**********************************************************************************************************************
+string HeatMapSim::getPic(vector< vector<double> > dists, vector<string> groups) {
+ try {
+
+ vector<double> sims;
+
+ string filenamesvg = outputDir + getRootName(getSimpleName(globaldata->inputFileName)) + "heatmap.sim.svg";
+ openOutputFile(filenamesvg, outsvg);
+
+ //svg image
+ outsvg << "<svg xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 " + toString((dists.size() * 150) + 160) + " " + toString((dists.size() * 150) + 160) + "\">\n";
+ outsvg << "<g>\n";
+
+ //white backround
+ outsvg << "<rect fill=\"white\" stroke=\"white\" x=\"0\" y=\"0\" width=\"" + toString((dists.size() * 150) + 160) + "\" height=\"" + toString((dists.size() * 150) + 160) + "\"/>";
+ outsvg << "<text fill=\"black\" class=\"seri\" x=\"" + toString((dists.size() * 75) - 40) + "\" y=\"25\">Heatmap for " + globaldata->inputFileName + "</text>\n";
+
+ //column labels
+ for (int h = 0; h < groups.size(); h++) {
+ outsvg << "<text fill=\"black\" class=\"seri\" x=\"" + toString(((150 * (h+1)) ) - ((int)groups[h].length() / 2)) + "\" y=\"50\">" + groups[h] + "</text>\n";
+ outsvg << "<text fill=\"black\" class=\"seri\" y=\"" + toString(((150 * (h+1)) ) - ((int)groups[h].length() / 2)) + "\" x=\"50\">" + groups[h] + "</text>\n";
+ }
+
+ double biggest = -1;
+ float scaler;
+
+ //get sim for each comparison and save them so you can find the relative similairity
+ for(int i = 0; i < (dists.size()-1); i++){
+ for(int j = (i+1); j < dists.size(); j++){
+
+ if (m->control_pressed) { outsvg.close(); return filenamesvg; }
+
+ float sim = 1.0 - dists[i][j];
+ sims.push_back(sim);
+
+ //save biggest similairity to set relative sim
+ if (sim > biggest) { biggest = sim; }
+ }
+ }
+
+ //map biggest similairity found to red
+ scaler = 255.0 / biggest;
+
+ int count = 0;
+ //output similairites to file
+ for(int i = 0; i < (dists.size()-1); i++){
+ for(int j = (i+1); j < dists.size(); j++){
+
+ //find relative color
+ int color = scaler * sims[count];
+ //draw box
+ outsvg << "<rect fill=\"rgb(" + toString(color) + ",0,0)\" stroke=\"rgb(" + toString(color) + ",0,0)\" x=\"" + toString((i*150)+80) + "\" y=\"" + toString((j*150)+75) + "\" width=\"150\" height=\"150\"/>\n";
+ count++;
+ }
+ }
+
+ int y = ((dists.size() * 150) + 120);
+ printLegend(y, biggest);
+
+ outsvg << "</g>\n</svg>\n";
+ outsvg.close();
+
+ return filenamesvg;
}
catch(exception& e) {
- errorOut(e, "HeatMapSim", "getPic");
+ m->errorOut(e, "HeatMapSim", "getPic");
exit(1);
}
}
+
//**********************************************************************************************************************
void HeatMapSim::printLegend(int y, float maxSim) {
try {
+ maxSim = 1;
//output legend and color labels
//go through map and give each score a color value
//prints legend
for (int i = 1; i < 255; i++) {
color = toHex(int((float)(i)));
- outsvg << "<rect fill=\"#" + color + "0000\" stroke=\"#" + color + "0000\" x=\"" + toString(x) + "\" y=\"" + toString(y) + "\" width=\"1\" height=\"10\"/>\n";
- x += 1;
+ outsvg << "<rect fill=\"#" + color + "0000\" stroke=\"#" + color + "0000\" x=\"" + toString(x) + "\" y=\"" + toString(y) + "\" width=\"3\" height=\"30\"/>\n";
+ x += 3;
}
float scaler = maxSim / 5.0;
//prints legend labels
- x = 10;
- for (int i = 1; i<=5; i++) {
+ x = 0;
+ for (int i = 0; i<=5; i++) {
float label = scaler*i;
label = int(label * 1000 + 0.5);
label /= 1000.0;
- string text = toString(label, 3);
+ string text = toString(label, 1);
outsvg << "<text fill=\"black\" class=\"seri\" x=\"" + toString(x) + "\" y=\"" + toString(y-3) + "\">" + text + "</text>\n";
- x += 60;
+ x += 153;
}
}
catch(exception& e) {
- errorOut(e, "HeatMapSim", "printLegend");
+ m->errorOut(e, "HeatMapSim", "printLegend");
exit(1);
}
}