#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <vector>
#include <iterator>
#include "SFramework/TSStatisticsPlotter.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQTaggable.h"
#include "QFramework/TQUtils.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQHistogramUtils.h"
#include "QFramework/TQPathManager.h"
#include "TLatex.h"
#include "TSystem.h"
#include "TGraph.h"
#include "TGraph2D.h"
#include "TGraphAsymmErrors.h"
#include "TGaxis.h"
#include "TStyle.h"
#include "TLine.h"
#include "TBox.h"
#include "TROOT.h"
#include "TMath.h"
#include "TLegend.h"
#include "boost/math/tools/roots.hpp"
#include "QFramework/TQLibrary.h"
ClassImp(TSStatisticsPlotter)
#define inf std::numeric_limits<double>::infinity()
namespace {
template<class GraphT> void configureFirstGraph(GraphT* graph, TQTaggable* input, double xMin, double xMax, double yMin, double yMax, double width, double height, const TString& opt){
graph->GetXaxis()->SetTitle(input->getTagStringDefault("style.title.xAxis"));
graph->GetYaxis()->SetTitle(input->getTagStringDefault("style.title.yAxis"));
double xMinBreakdown = input->getTagDoubleDefault("style.breakdown.xMin", xMin);
double xMaxBreakdown = input->getTagDoubleDefault("style.breakdown.xMax", xMax);
graph->GetHistogram()->SetMinimum(yMin);
graph->GetHistogram()->SetMaximum(yMax);
graph->GetXaxis()->SetLimits(xMinBreakdown, xMaxBreakdown);
double titleOffset = input->getTagDoubleDefault("style.titleOffset",1);
double labelOffset = input->getTagDoubleDefault("style.labelOffset",1);
double scaling = min(width,height);
double yLabelSize = input->getTagDoubleDefault("style.yLabelSize", 0.025);
double xLabelSize = input->getTagDoubleDefault("style.xLabelSize", 0.025);
double yTitleSize = input->getTagDoubleDefault("style.yTitleSize", 0.05);
double xTitleSize = input->getTagDoubleDefault("style.xTitleSize", 0.05);
double yTitleOffset = input->getTagDoubleDefault("style.yTitleOffset", titleOffset);
double xTitleOffset = input->getTagDoubleDefault("style.xTitleOffset", titleOffset);
double yTickLength = input->getTagDoubleDefault("style.yTickLength", 0.025);
double xTickLength = input->getTagDoubleDefault("style.xTickLength", 0.025);
graph->GetXaxis()->SetTitleOffset((width/scaling)*xTitleOffset);
graph->GetYaxis()->SetTitleOffset((height/scaling)*yTitleOffset);
graph->GetXaxis()->SetLabelOffset(0.005*800/width*labelOffset);
graph->GetYaxis()->SetLabelOffset(0.005*800/height*labelOffset);
graph->GetXaxis()->SetLabelSize(xLabelSize);
graph->GetYaxis()->SetLabelSize(yLabelSize);
graph->GetXaxis()->SetTitleSize(xTitleSize);
graph->GetYaxis()->SetTitleSize(yTitleSize);
graph->GetXaxis()->SetTickLength(xTickLength);
graph->GetYaxis()->SetTickLength(yTickLength);
TString drawopt = "A" + opt;
DEBUG("drawing graph '%s' with option '%s'",graph->GetName(),drawopt.Data());
graph->Draw(drawopt.Data());
#ifdef _DEBUG_
::printGraph(graph);
#endif
if(input->getTagBoolDefault("style.axis.x.blank",false)){
TAxis* xax = graph->GetXaxis();
xax->SetDrawOption("B");
}
if(input->getTagBoolDefault("style.axis.y.blank",false)){
TAxis* yax = graph->GetYaxis();
yax->SetDrawOption("B");
}
}
}
TQFolder* TSStatisticsPlotter::convertGraph(TGraph* g){
if(!g || g->GetN() < 1) return NULL;
TQFolder* result = new TQFolder(g->GetName());
const int n(g->GetN());
for(int i=0; i<n; ++i){
double x,y;
if(i != g->GetPoint(i,x,y)){
throw std::runtime_error("graph length inconsistency detected!");
}
TQFolder* point = result->getFolder(TString::Format("p.%d+",i));
point->setTagDouble("x",x);
point->setTagDouble("y",y);
}
return result;
}
TGraph2D* TSStatisticsPlotter::createGraph2D(TQFolder* source,TQFolder* config){
TQFolderIterator points(source->getListOfFolders("?"),true);
TGraph2D* helperGraph = new TGraph2D(points.flush());
TString xTag = config ? config->getTagStringDefault("xTag","x") : "x";
TString yTag = config ? config->getTagStringDefault("yTag","y") : "y";
TString zTag = config ? config->getTagStringDefault("zTag","z") : "z";
double xScale = config ? config->getTagDoubleDefault("xScale",1.) : 1.;
double yScale = config ? config->getTagDoubleDefault("yScale",1.) : 1.;
double zScale = config ? config->getTagDoubleDefault("zScale",1.) : 1.;
helperGraph->SetDirectory(NULL);
points.reset();
int i = 0;
while(points.hasNext()){
TQFolder* point = points.readNext();
if(!point) continue;
double x,y,z;
if(point->getTagDouble(xTag,x) && point->getTagDouble(yTag,y) && point->getTagDouble(zTag,z)){
helperGraph->SetPoint(i,xScale*x,yScale*y,zScale*z);
}
++i;
}
helperGraph->SetName(source->getTagStringDefault("name",source->GetName()));
helperGraph->SetTitle(source->getTagStringDefault("title",source->GetName()));
return helperGraph;
}
TQFolder* TSStatisticsPlotter::findGraphMinimum(TQFolder* source){
TQFolderIterator points(source->getListOfFolders("?"),true);
TQFolder* min = NULL;
while(points.hasNext()){
TQFolder* point = points.readNext();
if(!point) continue;
if(!min || point->getTagDoubleDefault("y",inf) < min->getTagDoubleDefault("y")) min = point;
}
return min;
}
TSStatisticsPlotter::TSStatisticsPlotter() {
setStyleAtlas();
fTemplates = NULL;
}
void TSStatisticsPlotter::setTemplates(TQFolder * templates) {
fTemplates = templates;
}
class FitResults{
public:
FitResults(){}
FitResults( double m1sig, double p1sig, double m2sig, double p2sig, double nll_mu0) : poi_at_m1sig(m1sig), poi_at_m2sig(m2sig), poi_at_p1sig(p1sig), poi_at_p2sig(p2sig), nll_at_mu0(nll_mu0) {}
void set_poi_at_m1sig(double value){ poi_at_m1sig = value; }
void set_poi_at_m2sig(double value){ poi_at_m2sig = value; }
void set_poi_at_p1sig(double value){ poi_at_p1sig = value; }
void set_poi_at_p2sig(double value){ poi_at_p2sig = value; }
void set_nll_at_mu0(double value){ nll_at_mu0 = value; }
void set_colour(int col){ colour = col; }
double& get_poi_at_m1sig() { return poi_at_m1sig; }
double& get_poi_at_m2sig() { return poi_at_m2sig; }
double& get_poi_at_p1sig() { return poi_at_p1sig; }
double& get_poi_at_p2sig() { return poi_at_p2sig; }
double& get_nll_at_mu0() { return nll_at_mu0; }
int& get_colour() { return colour; }
const double& get_poi_at_m1sig() const { return poi_at_m1sig; }
const double& get_poi_at_m2sig() const { return poi_at_m2sig; }
const double& get_poi_at_p1sig() const { return poi_at_p1sig; }
const double& get_poi_at_p2sig() const { return poi_at_p2sig; }
const double& get_nll_at_mu0() const { return nll_at_mu0; }
const int& get_colour() const { return colour; }
TString get_one_sigma_txt() {
TString txt_left;
if(isValidFOM( poi_at_m1sig )) txt_left.Form("%.3f ", poi_at_m1sig );
else txt_left = "-";
TString txt_right;
if(isValidFOM( poi_at_p1sig )) txt_right.Form("%.3f ", poi_at_p1sig );
else txt_right = "-";
return "(" + txt_left + "," + txt_right +") at 68 CL";
}
TString get_two_sigma_txt() {
TString txt_left;
if(isValidFOM( poi_at_m2sig )) txt_left.Form("%.3f ", poi_at_m2sig );
else txt_left = "-";
TString txt_right;
if(isValidFOM( poi_at_p2sig )) txt_right.Form("%.3f ", poi_at_p2sig );
else txt_right = "-";
return "(" + txt_left + "," + txt_right +") at 95 CL";
}
TString get_nll_at_mu0_txt() {
TString nll; nll.Form("NLL=%.3f ", nll_at_mu0);
return nll + " at (POI=0)";
}
TString get_txt_for_lh_plot() {
TString s1 = get_one_sigma_txt();
TString s2 = get_two_sigma_txt();
TString nll = get_nll_at_mu0_txt();
return nll + ", " + s1 + ", " + s2;
}
bool isValidFOM(double fom){ return ( fom != -99999); }
private:
double poi_at_m1sig{-99999};
double poi_at_m2sig{-99999};
double poi_at_p1sig{-99999};
double poi_at_p2sig{-99999};
double nll_at_mu0{-99999};
int colour;
};
TCanvas * TSStatisticsPlotter::plot(TQFolder * input) {
if (!input)
return NULL;
if(input->getTagBoolDefault("printPlot",false)){
input->print("rdt");
}
TString writePlot;
if(input->getTagString("writePlot",writePlot)){
input->exportToTextFile(writePlot);
}
TList * graphsToDraw = new TList();
TList * backElements = new TList();
TList * frontElements = new TList();
TList * lineYLabels = new TList();
Bool_t logScale = input->getTagBoolDefault("style.logScale", false);
TQIterator colormaps(input->getListOfObjects("Colormaps/*"),true);
while(colormaps.hasNext()){
TH2* colormap = dynamic_cast<TH2*>(colormaps.readNext());
if(!colormap) continue;
TColor* thecolor = gROOT->GetColor(colormap->GetFillColor());
const Int_t Number = 4;
Double_t Red [Number] = { 1.00*thecolor->GetRed() , 1.00*thecolor->GetRed() , 1.00, 1.00};
Double_t Green [Number] = { 1.00*thecolor->GetGreen(), 1.00*thecolor->GetGreen(), 1.00, 1.00};
Double_t Blue [Number] = { 1.00*thecolor->GetBlue() , 1.00*thecolor->GetBlue() , 1.00, 1.00};
Double_t Length[Number] = { 0.00, 0.1, 1.0-1e-9, 1.00};
const int nb=40;
TColor::CreateGradientColorTable(Number,Length,Red,Green,Blue,nb,0.5);
TQHistogramUtils::ensureMinimumBinContent(colormap,1e-6);
backElements->Add(colormap,"COLSAME");
}
Double_t yMin = input->getTagDoubleDefault("style.yMinMax", inf);
Double_t yMax = input->getTagDoubleDefault("style.yMaxMin", -inf);
Double_t xMin = input->getTagDoubleDefault("style.xMinMax", inf);
Double_t xMax = input->getTagDoubleDefault("style.xMaxMin", -inf);
double xMinMin = input->getTagDoubleDefault("style.xMinMin", -inf);
double xMaxMax = input->getTagDoubleDefault("style.xMaxMax", inf);
double yMinMin = input->getTagDoubleDefault("style.yMinMin", -inf);
double yMaxMax = input->getTagDoubleDefault("style.yMaxMax", inf);
TLegend * legend =NULL;
if(input->getTagBoolDefault("style.showLegend",true)){
legend= new TLegend(input->getTagDoubleDefault("style.legend.x1",0.65),
input->getTagDoubleDefault("style.legend.y1",0.62),
input->getTagDoubleDefault("style.legend.x2",0.90),
input->getTagDoubleDefault("style.legend.y2",0.90));
}
std::map<TString, FitResults > limit_map;
TQFolderIterator overlays( input->getListOfFolders("Overlay.*"), "!.*", true);
while (overlays.hasNext()) {
TQFolder * element = overlays.readNext();
if(!element) continue;
TString elementName = element->GetName();
DEBUGclass("creating graph for "+elementName);
TQTaggable tagsElement;
TString templateName;
if (tagsElement.getTagString("template",templateName) && fTemplates) {
TQFolder * styleTemplate = fTemplates->getFolder(templateName);
tagsElement.importTags(styleTemplate, false);
}
tagsElement.importTags(element,true,true);
TString xkey = element->getTagStringDefault("x","x");
TString ykey = element->getTagStringDefault("y","y");
if (TQStringUtils::removeLeadingText(elementName, "Overlay.")) {
TList v_folders;
TQFolderIterator itrFolders(element->getListOfFolders("?"), "p.*", true);
while (itrFolders.hasNext()) {
TQFolder * point = itrFolders.readNext();
v_folders.Add(point);
}
TQFolderIterator itrTmp = TQFolderIterator(element->getListOfFolders("?"), "p.*", true);
Int_t n_tmp = itrTmp.flush();
std::vector< int > available_p;
TString p = "p.";
for (int ip = 0; ip < n_tmp; ip++) {
TString name = p+std::to_string(ip);
if (v_folders.FindObject(name.Data())){available_p.push_back(ip);}
}
TGraphAsymmErrors * graph = 0;
double yMinLocal = +inf;
double yMaxLocal = -inf;
TString shape;
bool isShape = element->getTagString("shape",shape);
if(!isShape){
graph = new TGraphAsymmErrors(available_p.size()-1);
graph->SetName(elementName.ReplaceAll(".","_"));
Int_t i = 0;
TQFolderIterator itrPoints(element->getListOfFolders("?"), "p.*", true);
for (std::size_t k = 1; k < available_p.size(); k++) {
TString name = p+std::to_string(available_p[k]);
TQFolder * point = (TQFolder*)v_folders.FindObject(name.Data());
Double_t xd = point->getTagDoubleDefault(xkey);
Double_t xp = point->getTagDoubleDefault(xkey+"p", xd);
Double_t xn = point->getTagDoubleDefault(xkey+"n", xd);
Double_t x = point->getTagDoubleDefault(xkey, (xp + xn) / 2.);
Double_t yd = point->getTagDoubleDefault(ykey);
Double_t yp = point->getTagDoubleDefault(ykey+"p", yd);
Double_t yn = point->getTagDoubleDefault(ykey+"n", yd);
Double_t y = point->getTagDoubleDefault(ykey, (yp + yn) / 2.);
if(!TQUtils::isNum(x) || !TQUtils::isNum(y)) continue;
graph->SetPoint(i, x, y);
graph->SetPointError(i, x - xn, xp - x, y - yn, yp - y);
xMin = TMath::Min(xMin, TMath::Min(x, TMath::Min(xp, xn)));
xMax = TMath::Max(xMax, TMath::Max(x, TMath::Max(xp, xn)));
if(x > xMinMin && x < xMaxMax){
yMinLocal = TMath::Min(yMinLocal, TMath::Min(y, TMath::Min(yp, yn)));
yMaxLocal = TMath::Max(yMaxLocal, TMath::Max(y, TMath::Max(yp, yn)));
}
i++;
}
int interpolate;
if(tagsElement.getTagInteger("style.lininterpolate",interpolate)){
double poi_at_m1sig = -99999, poi_at_m2sig = -99999, poi_at_p1sig = -99999, poi_at_p2sig = -99999, nll_at_mu0 = -99999 ;
TQHistogramUtils::interpolateGraph(graph,interpolate,"");
if (input->getTagBoolDefault("lim.evaluate", false)) {
double ymin = inf;
int i_min = 0;
for( int i=0; i < graph->GetN(); ++i){
if( graph->GetPointY(i) < ymin ){
ymin = graph->GetPointY(i);
i_min = i;
}
if( graph->GetPointX(i) == 0. ){
nll_at_mu0 = graph->GetPointY(i);
}
}
double nll_sigma = 1.;
double Q_AT_ONE_SIGMA = 1.;
double Q_AT_TWO_SIGMA = 3.8;
double x_ymin = graph->GetPointX(i_min);
double xmin = 0;
double xmax = graph->GetN() -1;
std::cout << "Found minima at: " << x_ymin << " on the range between " << xmin << "-"<< xmax << "\n";
auto crossing_with_nllval = [&nll_sigma, graph](double x) { return graph->Eval(x) - nll_sigma; };
auto tolerance = [](double l, double r){return abs(l-r) < 1e-8;};
for( double nll : { Q_AT_ONE_SIGMA, Q_AT_TWO_SIGMA} ){
nll_sigma = nll;
if( graph->Eval(xmin) > nll_sigma) {
auto root = boost::math::tools::bisect( crossing_with_nllval, xmin, x_ymin, tolerance);
if( nll == Q_AT_ONE_SIGMA) poi_at_m1sig = (root.first+root.second)/2.;
else if( nll == Q_AT_TWO_SIGMA) poi_at_m2sig = (root.first+root.second)/2.;
}
if( graph->Eval(xmax) > nll_sigma) {
auto root = boost::math::tools::bisect( crossing_with_nllval, x_ymin, xmax, tolerance);
if( nll == Q_AT_ONE_SIGMA) poi_at_p1sig = (root.first+root.second)/2.;
else if( nll == Q_AT_TWO_SIGMA) poi_at_p2sig = (root.first+root.second)/2.;
}
}
}
FitResults limits(poi_at_m1sig, poi_at_p1sig, poi_at_m2sig, poi_at_p2sig, nll_at_mu0);
int colour = tagsElement.getTagIntegerDefault("style.lineColor", 1);
limits.set_colour( colour );
limit_map[elementName.Data()] = limits;
}
if(tagsElement.getTagInteger("style.interpolate",interpolate)){
TQHistogramUtils::interpolateGraph(graph,interpolate,"S");
}
} else if(isShape){
shape.ToLower();
if(shape=="ellipse"){
double cx = element->getTagDoubleDefault("center.x",1.);
double cy = element->getTagDoubleDefault("center.y",1.);
double rx = element->getTagDoubleDefault("radius.x",1.);
double ry = element->getTagDoubleDefault("radius.y",1.);
double rxu = element->getTagDoubleDefault("radius.xu",rx);
double ryu = element->getTagDoubleDefault("radius.yu",ry);
double rxd = element->getTagDoubleDefault("radius.xd",rx);
double ryd = element->getTagDoubleDefault("radius.yd",ry);
double angle = element->getTagDoubleDefault("angle",0.);
int points = element->getTagDoubleDefault("n",100);
graph = new TGraphAsymmErrors(points);
graph->SetName(elementName.ReplaceAll(".","_"));
double da = 2*TMath::Pi() / points;
for(int i=0; i<=points; ++i){
double a = da * i;
double x = cos(a) * (a < 0.5*TMath::Pi() || a > 1.5*TMath::Pi() ? rxu : rxd);
double y = sin(a) * (a < TMath::Pi() ? ryu : ryd);
graph->SetPoint(i,cx + x*cos(angle) - y*sin(angle),cy + x*sin(angle)+y*cos(angle));
}
} else {
throw std::runtime_error(TString::Format("unknown shape: %s",shape.Data()));
}
}
if(tagsElement.getTagBoolDefault("style.shift0",false)){
double x,y;
int j=0;
while(graph->GetPoint(j,x,y) ==j){
double ynew = y-yMinLocal+0.01;
graph->SetPoint(j,x,ynew);
j++;
}
yMax = std::max(yMax,yMaxLocal-yMinLocal);
yMin = std::min(0.,yMin);
} else {
yMax = std::max(yMax,yMaxLocal);
yMin = std::min(yMin,yMinLocal);
}
Int_t color = tagsElement.getTagIntegerDefault("style.color", 1);
int fillcolor = tagsElement.getTagIntegerDefault("style.fillColor", color);
double fillalpha = tagsElement.getTagIntegerDefault("style.fillAlpha", 0.);
graph->SetFillStyle(tagsElement.getTagIntegerDefault("style.fillStyle", 1001));
if(fillalpha < 1){
graph->SetLineColorAlpha(fillcolor,fillalpha);
} else {
graph->SetLineColor(fillcolor);
}
graph->SetFillColor(fillcolor);
int linecolor = tagsElement.getTagIntegerDefault("style.lineColor", color);
double linealpha = tagsElement.getTagDoubleDefault("style.lineAlpha",1.);
double linewidth = tagsElement.getTagDoubleDefault("style.lineWidth", 2.);
int linestyle = tagsElement.getTagIntegerDefault("style.lineStyle",1);
graph->SetLineWidth(linewidth);
graph->SetLineStyle(linestyle);
if(linealpha < 1){
graph->SetLineColorAlpha(linecolor,linealpha);
} else {
graph->SetLineColor(linecolor);
}
graph->SetMarkerColor(tagsElement.getTagIntegerDefault("style.markerColor", color));
graph->SetMarkerStyle(tagsElement.getTagIntegerDefault("style.markerStyle"));
graph->SetMarkerSize(tagsElement.getTagDoubleDefault("style.markerSize", 2.));
applyStyle(graph->GetHistogram());
if (legend && tagsElement.getTagBoolDefault("style.addToLegend", true)) {
legend->AddEntry(graph,
tagsElement.getTagStringDefault("style.title", elementName).Prepend(" "),
tagsElement.getTagStringDefault("style.legendDrawOptions"));
}
TString drawopt = tagsElement.getTagStringDefault("style.drawOption");
DEBUGclass("drawing '%s' (%d points) with option '%s': %s",graph->GetName(),graph->GetN(),drawopt.Data(),TQHistogramUtils::getDetailsAsString(graph).Data());
graphsToDraw->Add(graph, drawopt);
if(drawopt == "E5" && graph->GetFillStyle() > 3000){
TGraph* other = (TGraph*)(graph->Clone());
other->SetFillStyle(0);
graphsToDraw->Add(other,"E5");
}
for(auto x:tagsElement.getTagVDouble("action.markX")){
double y = graph->Eval(x);
TQFolder* line = input->getFolder(TString::Format("Line.%s.%g+",graph->GetName(),x));
line->setTagDouble("style.lineWidth",linewidth);
line->setTagInteger("style.lineStyle",linestyle);
line->setTagInteger("style.lineColor",linecolor);
line->setTagDouble("x1",x);
line->setTagDouble("x2",x);
line->setTagDouble("y2",y);
line->setTagString("level","back");
}
}
}
Double_t xMargin = (xMax - xMin) * 0.1;
xMin -= xMargin;
xMax += xMargin;
if (logScale) {
yMin /= TMath::Power(yMax / yMin, 0.1);
} else {
double d = (yMax - yMin) * 0.1;
yMin -= d;
yMax += d;
}
xMin = std::max(xMinMin,xMin);
xMax = std::min(xMaxMax,xMax);
yMin = std::max(yMinMin,yMin);
yMax = std::min(yMaxMax,yMax);
input->getTagDouble("style.xMin",xMin);
input->getTagDouble("style.xMax",xMax);
input->getTagDouble("style.yMin",yMin);
input->getTagDouble("style.yMax",yMax);
TQFolderIterator all(input->getListOfFolders("?"), "!.*", true);
while (all.hasNext()) {
TQFolder * element = all.readNext();
if(!element) continue;
TString elementName = element->GetName();
TQTaggable tagsElement;
TString templateName;
if (tagsElement.getTagString("template",templateName) && fTemplates) {
TQFolder * styleTemplate = fTemplates->getFolder(templateName);
tagsElement.importTags(styleTemplate, false);
}
tagsElement.importTags(element);
if (TQStringUtils::removeLeadingText(elementName, "Line.")) {
Double_t x1 = tagsElement.getTagDoubleDefault("x1",xMin);
Double_t y1 = tagsElement.getTagDoubleDefault("y1",yMin);
Double_t x2 = tagsElement.getTagDoubleDefault("x2",xMax);
Double_t y2 = tagsElement.getTagDoubleDefault("y2",yMax);
if (tagsElement.getTagDouble("x", x1)) {
x2 = x1;
y1 = yMin;
y2 = yMax;
} else if (tagsElement.getTagDouble("y", y1)) {
y2 = y1;
x1 = xMin;
x2 = xMax;
}
if ((x1 <= xMax && x1 >= xMin && y1 <= yMax && y1 >= yMin)
|| (x2 <= xMax && x2 >= xMin && y2 <= yMax && y2 >= yMin)) {
y2 = y2 - input->getTagDoubleDefault("style.breakdown.vertLinesReduceYmax",0);
TLine * line = new TLine(x1, y1, x2, y2);
Int_t color = tagsElement.getTagIntegerDefault("style.color", 1);
line->SetLineColor(tagsElement.getTagIntegerDefault("style.lineColor", color));
line->SetLineWidth(tagsElement.getTagDoubleDefault("style.lineWidth", 2.));
line->SetLineStyle(tagsElement.getTagIntegerDefault("style.lineStyle"));
TLatex * lineYLabel = NULL;
TString lineYLabelStr;
if (tagsElement.getTagString("yLabel", lineYLabelStr)) {
lineYLabel = new TLatex(0., y2, lineYLabelStr.Data());
lineYLabel->SetTextFont(42);
lineYLabel->SetTextSize(gStyle->GetTextSize() * 0.8);
lineYLabel->SetTextColor(1);
lineYLabels->Add(lineYLabel);
}
TString level = tagsElement.getTagStringDefault("level", "front");
if (level.CompareTo("front", TString::kIgnoreCase) == 0) {
frontElements->Add(line);
} else if (level.CompareTo("back", TString::kIgnoreCase) == 0) {
backElements->Add(line);
}
}
} else if (TQStringUtils::removeLeadingText(elementName, "Box.")) {
Double_t x1 = tagsElement.getTagDoubleDefault("x1",xMin);
Double_t y1 = tagsElement.getTagDoubleDefault("y1",yMin);
Double_t x2 = tagsElement.getTagDoubleDefault("x2",xMax);
Double_t y2 = tagsElement.getTagDoubleDefault("y2",yMax);
if (tagsElement.getTagDouble("x", x1)) {
x2 = x1;
y1 = yMin;
y2 = yMax;
} else if (tagsElement.getTagDouble("y", y1)) {
y2 = y1;
x1 = xMin;
x2 = xMax;
}
if ((x1 <= xMax && x1 >= xMin && y1 <= yMax && y1 >= yMin)
|| (x2 <= xMax && x2 >= xMin && y2 <= yMax && y2 >= yMin)) {
double xMinBreakdown = input->getTagDoubleDefault("style.breakdown.xMin", xMin);
double xMaxBreakdown = input->getTagDoubleDefault("style.breakdown.xMax", xMax);
x1 = xMinBreakdown;
x2 = xMaxBreakdown;
TBox * box = new TBox(x1, y1, x2, y2);
Int_t color = tagsElement.getTagIntegerDefault("style.color", 1);
box->SetFillColor(color);
box->SetLineColor(tagsElement.getTagIntegerDefault("style.lineColor", color));
box->SetLineWidth(tagsElement.getTagDoubleDefault("style.lineWidth", 2.));
box->SetLineStyle(tagsElement.getTagIntegerDefault("style.lineStyle"));
TString level = tagsElement.getTagStringDefault("level", "front");
if (level.CompareTo("front", TString::kIgnoreCase) == 0) {
frontElements->Add(box);
} else if (level.CompareTo("back", TString::kIgnoreCase) == 0) {
backElements->Add(box);
}
}
} else if (TQStringUtils::removeLeadingText(elementName, "Axis.")) {
Double_t x1 = tagsElement.getTagDoubleDefault("x1");
Double_t y1 = tagsElement.getTagDoubleDefault("y1");
Double_t x2 = tagsElement.getTagDoubleDefault("x2");
Double_t y2 = tagsElement.getTagDoubleDefault("y2");
Double_t wmin = tagsElement.getTagDoubleDefault("wmin",-1);
Double_t wmax = tagsElement.getTagDoubleDefault("wmax",1);
Int_t ndiv = tagsElement.getTagIntegerDefault("ndiv",510);
if (tagsElement.getTagDouble("x", x1)) {
x2 = x1;
} else if (tagsElement.getTagDouble("y", y1)) {
y2 = y1;
}
TString drawOption = tagsElement.getTagStringDefault("style.drawOption","");
TGaxis * axis = new TGaxis(x1, y1, x2, y2,wmin,wmax,ndiv,drawOption);
axis->SetNDC(false);
axis->SetTitle(tagsElement.getTagStringDefault("style.title"));
Int_t color = tagsElement.getTagIntegerDefault("style.color", 1);
axis->SetLineColor(tagsElement.getTagIntegerDefault("style.lineColor", color));
axis->SetLineWidth(tagsElement.getTagDoubleDefault("style.lineWidth", 2.));
axis->SetLabelSize(tagsElement.getTagDoubleDefault("style.labelSize",0.025));
axis->SetTitleSize(tagsElement.getTagDoubleDefault("style.textSize",0.025));
axis->SetTitleOffset(tagsElement.getTagDoubleDefault("style.titleOffset",1));
TString level = tagsElement.getTagStringDefault("level", "front");
if (level.CompareTo("front", TString::kIgnoreCase) == 0) {
frontElements->Add(axis);
} else if (level.CompareTo("back", TString::kIgnoreCase) == 0) {
backElements->Add(axis);
}
} else if (TQStringUtils::removeLeadingText(elementName, "Text.")) {
Double_t x,y;
if(!tagsElement.getTagDouble("x",x)) x = xMax;
if(!tagsElement.getTagDouble("y",y)) y = yMax;
if(tagsElement.getTagBoolDefault("restrictX",false)){
if(x < xMin || x>xMax) continue;
}
if(tagsElement.getTagBoolDefault("restrictY",false)){
if(y < yMin || y>yMax) continue;
}
y += tagsElement.getTagDoubleDefault("yShift",0.);
x += tagsElement.getTagDoubleDefault("xShift",0.);
TString s = tagsElement.getTagStringDefault("text");
TLatex * text = new TLatex(x, y, s.Data());
text->SetTextSize(tagsElement.getTagDoubleDefault("style.textSize", gStyle->GetTextSize()));
text->SetTextAngle(tagsElement.getTagIntegerDefault("style.textAngle", 0));
text->SetTextColor(tagsElement.getTagIntegerDefault("style.textColor", kBlack));
TString level = tagsElement.getTagStringDefault("level", "front");
if (level.CompareTo("front", TString::kIgnoreCase) == 0) {
frontElements->Add(text);
} else if (level.CompareTo("back", TString::kIgnoreCase) == 0) {
backElements->Add(text);
}
}
}
Double_t x = input->getTagDoubleDefault("labels.x",0.2);
Double_t y = input->getTagDoubleDefault("labels.y",0.86);
TString strLabel;
Int_t iLabel = 0;
while (input->getTagString(TString::Format("labels.%d", iLabel++), strLabel)) {
TLatex * label = new TLatex(x, y - 0.07 * (Double_t)(iLabel), strLabel.Data());
label->SetNDC();
label->SetTextFont(42);
label->SetTextSize(gStyle->GetTextSize() * 0.85);
label->SetTextColor(1);
frontElements->Add(label);
}
double yOffset = input->getTagDoubleDefault("style.breakdown.yUpperOffset", 0.07);
Double_t vetoFrac = input->getTagDoubleDefault("style.allowVetoFrac",true) ? y - yOffset * (Double_t)(iLabel) : 1.0;
yMax = getMaxRange(yMin, yMax, vetoFrac, logScale);
double height = input->getTagIntegerDefault("style.height",768);
double width = input->getTagIntegerDefault("style.width",1024);
TCanvas * canvas = new TCanvas("canvas", "canvas", width, height);
canvas->SetMargin(input->getTagDoubleDefault("style.margin.left",0.1),
input->getTagDoubleDefault("style.margin.right",0.1),
input->getTagDoubleDefault("style.margin.bottom",0.1),
input->getTagDoubleDefault("style.margin.top",0.1));
if(legend){
if (legend->GetListOfPrimitives()) {
legend->GetListOfPrimitives()->GetEntries();
}
legend->SetFillStyle(0);
legend->SetX1NDC(input->getTagDoubleDefault("style.legend.x1",0.65));
legend->SetY1NDC(input->getTagDoubleDefault("style.legend.y1",0.62));
legend->SetX2NDC(input->getTagDoubleDefault("style.legend.x2",0.9));
legend->SetY2NDC(input->getTagDoubleDefault("style.legend.y2",0.9));
legend->SetEntrySeparation(legend->GetEntrySeparation()*input->getTagDoubleDefault("style.legend.scaleSeparation",1.));
}
std::vector<TGraph*> graphs;
Bool_t firstGraph = true;
TObjLink * lnk = graphsToDraw->FirstLink();
while (lnk) {
TGraph * graph = dynamic_cast<TGraph*>(lnk->GetObject());
TGraph2D* graph2D = dynamic_cast<TGraph2D*>(lnk->GetObject());
if(graph) graphs.push_back(graph);
if (firstGraph) {
if(graph) configureFirstGraph(graph, input,xMin,xMax,yMin,yMax,width,height,lnk->GetOption());
else if(graph2D) configureFirstGraph(graph2D,input,xMin,xMax,yMin,yMax,width,height,lnk->GetOption());
TObjLink * bkglnk = backElements->FirstLink();
while (bkglnk) {
bkglnk->GetObject()->Draw(bkglnk->GetOption());
bkglnk = bkglnk->Next();
};
delete backElements;
canvas->RedrawAxis();
TString drawoption = lnk->GetOption();
DEBUG("redrawing graph '%s' with option '%s'",graph->GetName(),drawoption.Data());
if(graph) graph->Draw(drawoption.Data());
else if(graph2D) graph2D->Draw(drawoption.Data());
} else {
TString drawoption = lnk->GetOption();
DEBUG("drawing graph '%s' with option '%s'",graph->GetName(),drawoption.Data());
if(graph) graph->Draw(drawoption.Data());
else if(graph2D) graph2D->Draw(drawoption.Data());
}
#ifdef _DEBUG_
if(graph) ::printGraph(graph);
#endif
lnk = lnk->Next();
firstGraph = false;
}
if(input->getTagBoolDefault("printIntersections",false)){
for(size_t i=0; i<graphs.size(); ++i){
for(size_t j=0; j<i; ++j){
double intersection = TQHistogramUtils::findIntersection(graphs[i],graphs[j],logScale);
if(TQUtils::isNum(intersection)){
std::cout << graphs[i]->GetName() << " and " << graphs[j]->GetName() << " intersect at " << intersection << std::endl;;
}
}
}
}
if(legend){
legend->SetBorderSize(0);
legend->SetTextSize(input->getTagDoubleDefault("style.legend.textSize",gStyle->GetTextSize() * 0.8));
legend->SetFillColor(0);
legend->Draw("same");
}
if (logScale) {
canvas->SetLogy();
canvas->RedrawAxis();
canvas->Update();
}
frontElements->Draw();
delete frontElements;
if (input->getTagBoolDefault("labels.drawAtlas", true)) {
TLatex * l = new TLatex();
l->SetNDC();
l->SetTextFont(72);
l->SetTextSize(gStyle->GetTextSize() * 1.25);
l->SetTextColor(1);
l->DrawLatex(x, y, "ATLAS");
}
if (input->getTagBoolDefault("lim.evaluate", true)) {
Double_t x_lim = input->getTagDoubleDefault("lim.x",0.35);
Double_t y_lim = input->getTagDoubleDefault("lim.y",0.8);
Double_t y_offset = 0.05;
TString outfile;
TString fname = input->replaceInText(outfile);
fname = TQPathManager::getPathManager()->getTargetPath(fname);
TQUtils::ensureDirectoryForFile(fname);
ofstream lim_log;
lim_log.open( fname.Data() );
for( auto it = limit_map.begin(); it != limit_map.end(); ++it ){
TString txt_for_lh = it->second.get_txt_for_lh_plot();
TLatex * l = new TLatex();
l->SetNDC();
l->SetTextFont(42);
l->SetTextSize(gStyle->GetTextSize() * 0.4);
l->SetTextColor( it->second.get_colour() );
y_lim -= y_offset;
if (input->getTagBoolDefault("lim.onPlot", false)) l->DrawLatex(x_lim, y_lim, txt_for_lh );
lim_log << (it->first + ": " + txt_for_lh).Data() << "\n";
}
lim_log.close();
std::cout << TString::Format("writing log to '%s'",fname.Data()) << "\n";
}
TString atlasLabel = "Private";
input->getTagString("labels.atlas", atlasLabel);
if (atlasLabel.Length() > 0) {
DEBUGclass("drawing label '%s'",atlasLabel.Data());
TLatex * p = new TLatex(x + input->getTagDoubleDefault("labels.atlas.xOffset",0.23), y, atlasLabel.Data());
p->SetNDC();
p->SetTextFont(42);
p->SetTextSize(gStyle->GetTextSize() * 1.25);
p->SetTextColor(1);
p->Draw();
}
TString infoLabel;
if (input->getTagString("labels.info", infoLabel)) {
TLatex * l0 = new TLatex(0., 1. - 0.04, infoLabel.Data());
DEBUGclass("drawing label '%s'",infoLabel.Data());
l0->SetNDC();
l0->SetTextFont(42);
l0->SetTextSize(gStyle->GetTextSize() * 0.6);
l0->SetTextColor(1);
l0->SetX(1. - canvas->GetRightMargin() - l0->GetXsize());
l0->Draw();
}
TQIterator itrLabels(lineYLabels);
while (itrLabels.hasNext()) {
TLatex * label = (TLatex*)itrLabels.readNext();
DEBUGclass("drawing label '%s'",label->GetTitle());
label->SetX(xMax + (xMax - xMin) * 0.01);
label->Draw();
}
delete lineYLabels;
canvas->Update();
return canvas;
}
Double_t TSStatisticsPlotter::getMaxRange(Double_t min,
Double_t max, Double_t vetoFrac, Bool_t logScale) {
if (logScale)
return TMath::Power(max * TMath::Power(min, vetoFrac - 1), (1. / vetoFrac));
else
return max / vetoFrac + min * (1 - 1 / vetoFrac);
}
void TSStatisticsPlotter::applyStyle(TH1 * ) {
}
void TSStatisticsPlotter::setStyleAtlas() {
Int_t icol = 0;
gStyle->SetFrameBorderMode(icol);
gStyle->SetFrameFillColor(icol);
gStyle->SetCanvasBorderMode(icol);
gStyle->SetCanvasColor(icol);
gStyle->SetPadBorderMode(icol);
gStyle->SetPadColor(icol);
gStyle->SetStatColor(icol);
gStyle->SetPaperSize(20,26);
gStyle->SetPadTopMargin(0.05);
gStyle->SetPadRightMargin(0.05);
gStyle->SetPadBottomMargin(0.16);
gStyle->SetPadLeftMargin(0.16);
gStyle->SetTitleXOffset(1.4);
gStyle->SetTitleYOffset(1.4);
Int_t font=42;
Double_t tsize=0.05;
gStyle->SetTextFont(font);
gStyle->SetTextSize(tsize);
gStyle->SetLabelFont(font,"x");
gStyle->SetTitleFont(font,"x");
gStyle->SetLabelFont(font,"y");
gStyle->SetTitleFont(font,"y");
gStyle->SetLabelFont(font,"z");
gStyle->SetTitleFont(font,"z");
gStyle->SetLabelSize(tsize,"x");
gStyle->SetTitleSize(tsize,"x");
gStyle->SetLabelSize(tsize,"y");
gStyle->SetTitleSize(tsize,"y");
gStyle->SetLabelSize(tsize,"z");
gStyle->SetTitleSize(tsize,"z");
gStyle->SetMarkerStyle(20);
gStyle->SetMarkerSize(1.2);
gStyle->SetHistLineWidth((Width_t)2.);
gStyle->SetLineStyleString(2,"[12 12]");
gStyle->SetOptTitle(0);
gStyle->SetOptStat(0);
gStyle->SetOptFit(0);
gStyle->SetPadTickX(1);
gStyle->SetPadTickY(1);
}
TSStatisticsPlotter::~TSStatisticsPlotter() {
}
TSStatisticsPlotter.cxx:1 TSStatisticsPlotter.cxx:2 TSStatisticsPlotter.cxx:3 TSStatisticsPlotter.cxx:4 TSStatisticsPlotter.cxx:5 TSStatisticsPlotter.cxx:6 TSStatisticsPlotter.cxx:7 TSStatisticsPlotter.cxx:8 TSStatisticsPlotter.cxx:9 TSStatisticsPlotter.cxx:10 TSStatisticsPlotter.cxx:11 TSStatisticsPlotter.cxx:12 TSStatisticsPlotter.cxx:13 TSStatisticsPlotter.cxx:14 TSStatisticsPlotter.cxx:15 TSStatisticsPlotter.cxx:16 TSStatisticsPlotter.cxx:17 TSStatisticsPlotter.cxx:18 TSStatisticsPlotter.cxx:19 TSStatisticsPlotter.cxx:20 TSStatisticsPlotter.cxx:21 TSStatisticsPlotter.cxx:22 TSStatisticsPlotter.cxx:23 TSStatisticsPlotter.cxx:24 TSStatisticsPlotter.cxx:25 TSStatisticsPlotter.cxx:26 TSStatisticsPlotter.cxx:27 TSStatisticsPlotter.cxx:28 TSStatisticsPlotter.cxx:29 TSStatisticsPlotter.cxx:30 TSStatisticsPlotter.cxx:31 TSStatisticsPlotter.cxx:32 TSStatisticsPlotter.cxx:33 TSStatisticsPlotter.cxx:34 TSStatisticsPlotter.cxx:35 TSStatisticsPlotter.cxx:36 TSStatisticsPlotter.cxx:37 TSStatisticsPlotter.cxx:38 TSStatisticsPlotter.cxx:39 TSStatisticsPlotter.cxx:40 TSStatisticsPlotter.cxx:41 TSStatisticsPlotter.cxx:42 TSStatisticsPlotter.cxx:43 TSStatisticsPlotter.cxx:44 TSStatisticsPlotter.cxx:45 TSStatisticsPlotter.cxx:46 TSStatisticsPlotter.cxx:47 TSStatisticsPlotter.cxx:48 TSStatisticsPlotter.cxx:49 TSStatisticsPlotter.cxx:50 TSStatisticsPlotter.cxx:51 TSStatisticsPlotter.cxx:52 TSStatisticsPlotter.cxx:53 TSStatisticsPlotter.cxx:54 TSStatisticsPlotter.cxx:55 TSStatisticsPlotter.cxx:56 TSStatisticsPlotter.cxx:57 TSStatisticsPlotter.cxx:58 TSStatisticsPlotter.cxx:59 TSStatisticsPlotter.cxx:60 TSStatisticsPlotter.cxx:61 TSStatisticsPlotter.cxx:62 TSStatisticsPlotter.cxx:63 TSStatisticsPlotter.cxx:64 TSStatisticsPlotter.cxx:65 TSStatisticsPlotter.cxx:66 TSStatisticsPlotter.cxx:67 TSStatisticsPlotter.cxx:68 TSStatisticsPlotter.cxx:69 TSStatisticsPlotter.cxx:70 TSStatisticsPlotter.cxx:71 TSStatisticsPlotter.cxx:72 TSStatisticsPlotter.cxx:73 TSStatisticsPlotter.cxx:74 TSStatisticsPlotter.cxx:75 TSStatisticsPlotter.cxx:76 TSStatisticsPlotter.cxx:77 TSStatisticsPlotter.cxx:78 TSStatisticsPlotter.cxx:79 TSStatisticsPlotter.cxx:80 TSStatisticsPlotter.cxx:81 TSStatisticsPlotter.cxx:82 TSStatisticsPlotter.cxx:83 TSStatisticsPlotter.cxx:84 TSStatisticsPlotter.cxx:85 TSStatisticsPlotter.cxx:86 TSStatisticsPlotter.cxx:87 TSStatisticsPlotter.cxx:88 TSStatisticsPlotter.cxx:89 TSStatisticsPlotter.cxx:90 TSStatisticsPlotter.cxx:91 TSStatisticsPlotter.cxx:92 TSStatisticsPlotter.cxx:93 TSStatisticsPlotter.cxx:94 TSStatisticsPlotter.cxx:95 TSStatisticsPlotter.cxx:96 TSStatisticsPlotter.cxx:97 TSStatisticsPlotter.cxx:98 TSStatisticsPlotter.cxx:99 TSStatisticsPlotter.cxx:100 TSStatisticsPlotter.cxx:101 TSStatisticsPlotter.cxx:102 TSStatisticsPlotter.cxx:103 TSStatisticsPlotter.cxx:104 TSStatisticsPlotter.cxx:105 TSStatisticsPlotter.cxx:106 TSStatisticsPlotter.cxx:107 TSStatisticsPlotter.cxx:108 TSStatisticsPlotter.cxx:109 TSStatisticsPlotter.cxx:110 TSStatisticsPlotter.cxx:111 TSStatisticsPlotter.cxx:112 TSStatisticsPlotter.cxx:113 TSStatisticsPlotter.cxx:114 TSStatisticsPlotter.cxx:115 TSStatisticsPlotter.cxx:116 TSStatisticsPlotter.cxx:117 TSStatisticsPlotter.cxx:118 TSStatisticsPlotter.cxx:119 TSStatisticsPlotter.cxx:120 TSStatisticsPlotter.cxx:121 TSStatisticsPlotter.cxx:122 TSStatisticsPlotter.cxx:123 TSStatisticsPlotter.cxx:124 TSStatisticsPlotter.cxx:125 TSStatisticsPlotter.cxx:126 TSStatisticsPlotter.cxx:127 TSStatisticsPlotter.cxx:128 TSStatisticsPlotter.cxx:129 TSStatisticsPlotter.cxx:130 TSStatisticsPlotter.cxx:131 TSStatisticsPlotter.cxx:132 TSStatisticsPlotter.cxx:133 TSStatisticsPlotter.cxx:134 TSStatisticsPlotter.cxx:135 TSStatisticsPlotter.cxx:136 TSStatisticsPlotter.cxx:137 TSStatisticsPlotter.cxx:138 TSStatisticsPlotter.cxx:139 TSStatisticsPlotter.cxx:140 TSStatisticsPlotter.cxx:141 TSStatisticsPlotter.cxx:142 TSStatisticsPlotter.cxx:143 TSStatisticsPlotter.cxx:144 TSStatisticsPlotter.cxx:145 TSStatisticsPlotter.cxx:146 TSStatisticsPlotter.cxx:147 TSStatisticsPlotter.cxx:148 TSStatisticsPlotter.cxx:149 TSStatisticsPlotter.cxx:150 TSStatisticsPlotter.cxx:151 TSStatisticsPlotter.cxx:152 TSStatisticsPlotter.cxx:153 TSStatisticsPlotter.cxx:154 TSStatisticsPlotter.cxx:155 TSStatisticsPlotter.cxx:156 TSStatisticsPlotter.cxx:157 TSStatisticsPlotter.cxx:158 TSStatisticsPlotter.cxx:159 TSStatisticsPlotter.cxx:160 TSStatisticsPlotter.cxx:161 TSStatisticsPlotter.cxx:162 TSStatisticsPlotter.cxx:163 TSStatisticsPlotter.cxx:164 TSStatisticsPlotter.cxx:165 TSStatisticsPlotter.cxx:166 TSStatisticsPlotter.cxx:167 TSStatisticsPlotter.cxx:168 TSStatisticsPlotter.cxx:169 TSStatisticsPlotter.cxx:170 TSStatisticsPlotter.cxx:171 TSStatisticsPlotter.cxx:172 TSStatisticsPlotter.cxx:173 TSStatisticsPlotter.cxx:174 TSStatisticsPlotter.cxx:175 TSStatisticsPlotter.cxx:176 TSStatisticsPlotter.cxx:177 TSStatisticsPlotter.cxx:178 TSStatisticsPlotter.cxx:179 TSStatisticsPlotter.cxx:180 TSStatisticsPlotter.cxx:181 TSStatisticsPlotter.cxx:182 TSStatisticsPlotter.cxx:183 TSStatisticsPlotter.cxx:184 TSStatisticsPlotter.cxx:185 TSStatisticsPlotter.cxx:186 TSStatisticsPlotter.cxx:187 TSStatisticsPlotter.cxx:188 TSStatisticsPlotter.cxx:189 TSStatisticsPlotter.cxx:190 TSStatisticsPlotter.cxx:191 TSStatisticsPlotter.cxx:192 TSStatisticsPlotter.cxx:193 TSStatisticsPlotter.cxx:194 TSStatisticsPlotter.cxx:195 TSStatisticsPlotter.cxx:196 TSStatisticsPlotter.cxx:197 TSStatisticsPlotter.cxx:198 TSStatisticsPlotter.cxx:199 TSStatisticsPlotter.cxx:200 TSStatisticsPlotter.cxx:201 TSStatisticsPlotter.cxx:202 TSStatisticsPlotter.cxx:203 TSStatisticsPlotter.cxx:204 TSStatisticsPlotter.cxx:205 TSStatisticsPlotter.cxx:206 TSStatisticsPlotter.cxx:207 TSStatisticsPlotter.cxx:208 TSStatisticsPlotter.cxx:209 TSStatisticsPlotter.cxx:210 TSStatisticsPlotter.cxx:211 TSStatisticsPlotter.cxx:212 TSStatisticsPlotter.cxx:213 TSStatisticsPlotter.cxx:214 TSStatisticsPlotter.cxx:215 TSStatisticsPlotter.cxx:216 TSStatisticsPlotter.cxx:217 TSStatisticsPlotter.cxx:218 TSStatisticsPlotter.cxx:219 TSStatisticsPlotter.cxx:220 TSStatisticsPlotter.cxx:221 TSStatisticsPlotter.cxx:222 TSStatisticsPlotter.cxx:223 TSStatisticsPlotter.cxx:224 TSStatisticsPlotter.cxx:225 TSStatisticsPlotter.cxx:226 TSStatisticsPlotter.cxx:227 TSStatisticsPlotter.cxx:228 TSStatisticsPlotter.cxx:229 TSStatisticsPlotter.cxx:230 TSStatisticsPlotter.cxx:231 TSStatisticsPlotter.cxx:232 TSStatisticsPlotter.cxx:233 TSStatisticsPlotter.cxx:234 TSStatisticsPlotter.cxx:235 TSStatisticsPlotter.cxx:236 TSStatisticsPlotter.cxx:237 TSStatisticsPlotter.cxx:238 TSStatisticsPlotter.cxx:239 TSStatisticsPlotter.cxx:240 TSStatisticsPlotter.cxx:241 TSStatisticsPlotter.cxx:242 TSStatisticsPlotter.cxx:243 TSStatisticsPlotter.cxx:244 TSStatisticsPlotter.cxx:245 TSStatisticsPlotter.cxx:246 TSStatisticsPlotter.cxx:247 TSStatisticsPlotter.cxx:248 TSStatisticsPlotter.cxx:249 TSStatisticsPlotter.cxx:250 TSStatisticsPlotter.cxx:251 TSStatisticsPlotter.cxx:252 TSStatisticsPlotter.cxx:253 TSStatisticsPlotter.cxx:254 TSStatisticsPlotter.cxx:255 TSStatisticsPlotter.cxx:256 TSStatisticsPlotter.cxx:257 TSStatisticsPlotter.cxx:258 TSStatisticsPlotter.cxx:259 TSStatisticsPlotter.cxx:260 TSStatisticsPlotter.cxx:261 TSStatisticsPlotter.cxx:262 TSStatisticsPlotter.cxx:263 TSStatisticsPlotter.cxx:264 TSStatisticsPlotter.cxx:265 TSStatisticsPlotter.cxx:266 TSStatisticsPlotter.cxx:267 TSStatisticsPlotter.cxx:268 TSStatisticsPlotter.cxx:269 TSStatisticsPlotter.cxx:270 TSStatisticsPlotter.cxx:271 TSStatisticsPlotter.cxx:272 TSStatisticsPlotter.cxx:273 TSStatisticsPlotter.cxx:274 TSStatisticsPlotter.cxx:275 TSStatisticsPlotter.cxx:276 TSStatisticsPlotter.cxx:277 TSStatisticsPlotter.cxx:278 TSStatisticsPlotter.cxx:279 TSStatisticsPlotter.cxx:280 TSStatisticsPlotter.cxx:281 TSStatisticsPlotter.cxx:282 TSStatisticsPlotter.cxx:283 TSStatisticsPlotter.cxx:284 TSStatisticsPlotter.cxx:285 TSStatisticsPlotter.cxx:286 TSStatisticsPlotter.cxx:287 TSStatisticsPlotter.cxx:288 TSStatisticsPlotter.cxx:289 TSStatisticsPlotter.cxx:290 TSStatisticsPlotter.cxx:291 TSStatisticsPlotter.cxx:292 TSStatisticsPlotter.cxx:293 TSStatisticsPlotter.cxx:294 TSStatisticsPlotter.cxx:295 TSStatisticsPlotter.cxx:296 TSStatisticsPlotter.cxx:297 TSStatisticsPlotter.cxx:298 TSStatisticsPlotter.cxx:299 TSStatisticsPlotter.cxx:300 TSStatisticsPlotter.cxx:301 TSStatisticsPlotter.cxx:302 TSStatisticsPlotter.cxx:303 TSStatisticsPlotter.cxx:304 TSStatisticsPlotter.cxx:305 TSStatisticsPlotter.cxx:306 TSStatisticsPlotter.cxx:307 TSStatisticsPlotter.cxx:308 TSStatisticsPlotter.cxx:309 TSStatisticsPlotter.cxx:310 TSStatisticsPlotter.cxx:311 TSStatisticsPlotter.cxx:312 TSStatisticsPlotter.cxx:313 TSStatisticsPlotter.cxx:314 TSStatisticsPlotter.cxx:315 TSStatisticsPlotter.cxx:316 TSStatisticsPlotter.cxx:317 TSStatisticsPlotter.cxx:318 TSStatisticsPlotter.cxx:319 TSStatisticsPlotter.cxx:320 TSStatisticsPlotter.cxx:321 TSStatisticsPlotter.cxx:322 TSStatisticsPlotter.cxx:323 TSStatisticsPlotter.cxx:324 TSStatisticsPlotter.cxx:325 TSStatisticsPlotter.cxx:326 TSStatisticsPlotter.cxx:327 TSStatisticsPlotter.cxx:328 TSStatisticsPlotter.cxx:329 TSStatisticsPlotter.cxx:330 TSStatisticsPlotter.cxx:331 TSStatisticsPlotter.cxx:332 TSStatisticsPlotter.cxx:333 TSStatisticsPlotter.cxx:334 TSStatisticsPlotter.cxx:335 TSStatisticsPlotter.cxx:336 TSStatisticsPlotter.cxx:337 TSStatisticsPlotter.cxx:338 TSStatisticsPlotter.cxx:339 TSStatisticsPlotter.cxx:340 TSStatisticsPlotter.cxx:341 TSStatisticsPlotter.cxx:342 TSStatisticsPlotter.cxx:343 TSStatisticsPlotter.cxx:344 TSStatisticsPlotter.cxx:345 TSStatisticsPlotter.cxx:346 TSStatisticsPlotter.cxx:347 TSStatisticsPlotter.cxx:348 TSStatisticsPlotter.cxx:349 TSStatisticsPlotter.cxx:350 TSStatisticsPlotter.cxx:351 TSStatisticsPlotter.cxx:352 TSStatisticsPlotter.cxx:353 TSStatisticsPlotter.cxx:354 TSStatisticsPlotter.cxx:355 TSStatisticsPlotter.cxx:356 TSStatisticsPlotter.cxx:357 TSStatisticsPlotter.cxx:358 TSStatisticsPlotter.cxx:359 TSStatisticsPlotter.cxx:360 TSStatisticsPlotter.cxx:361 TSStatisticsPlotter.cxx:362 TSStatisticsPlotter.cxx:363 TSStatisticsPlotter.cxx:364 TSStatisticsPlotter.cxx:365 TSStatisticsPlotter.cxx:366 TSStatisticsPlotter.cxx:367 TSStatisticsPlotter.cxx:368 TSStatisticsPlotter.cxx:369 TSStatisticsPlotter.cxx:370 TSStatisticsPlotter.cxx:371 TSStatisticsPlotter.cxx:372 TSStatisticsPlotter.cxx:373 TSStatisticsPlotter.cxx:374 TSStatisticsPlotter.cxx:375 TSStatisticsPlotter.cxx:376 TSStatisticsPlotter.cxx:377 TSStatisticsPlotter.cxx:378 TSStatisticsPlotter.cxx:379 TSStatisticsPlotter.cxx:380 TSStatisticsPlotter.cxx:381 TSStatisticsPlotter.cxx:382 TSStatisticsPlotter.cxx:383 TSStatisticsPlotter.cxx:384 TSStatisticsPlotter.cxx:385 TSStatisticsPlotter.cxx:386 TSStatisticsPlotter.cxx:387 TSStatisticsPlotter.cxx:388 TSStatisticsPlotter.cxx:389 TSStatisticsPlotter.cxx:390 TSStatisticsPlotter.cxx:391 TSStatisticsPlotter.cxx:392 TSStatisticsPlotter.cxx:393 TSStatisticsPlotter.cxx:394 TSStatisticsPlotter.cxx:395 TSStatisticsPlotter.cxx:396 TSStatisticsPlotter.cxx:397 TSStatisticsPlotter.cxx:398 TSStatisticsPlotter.cxx:399 TSStatisticsPlotter.cxx:400 TSStatisticsPlotter.cxx:401 TSStatisticsPlotter.cxx:402 TSStatisticsPlotter.cxx:403 TSStatisticsPlotter.cxx:404 TSStatisticsPlotter.cxx:405 TSStatisticsPlotter.cxx:406 TSStatisticsPlotter.cxx:407 TSStatisticsPlotter.cxx:408 TSStatisticsPlotter.cxx:409 TSStatisticsPlotter.cxx:410 TSStatisticsPlotter.cxx:411 TSStatisticsPlotter.cxx:412 TSStatisticsPlotter.cxx:413 TSStatisticsPlotter.cxx:414 TSStatisticsPlotter.cxx:415 TSStatisticsPlotter.cxx:416 TSStatisticsPlotter.cxx:417 TSStatisticsPlotter.cxx:418 TSStatisticsPlotter.cxx:419 TSStatisticsPlotter.cxx:420 TSStatisticsPlotter.cxx:421 TSStatisticsPlotter.cxx:422 TSStatisticsPlotter.cxx:423 TSStatisticsPlotter.cxx:424 TSStatisticsPlotter.cxx:425 TSStatisticsPlotter.cxx:426 TSStatisticsPlotter.cxx:427 TSStatisticsPlotter.cxx:428 TSStatisticsPlotter.cxx:429 TSStatisticsPlotter.cxx:430 TSStatisticsPlotter.cxx:431 TSStatisticsPlotter.cxx:432 TSStatisticsPlotter.cxx:433 TSStatisticsPlotter.cxx:434 TSStatisticsPlotter.cxx:435 TSStatisticsPlotter.cxx:436 TSStatisticsPlotter.cxx:437 TSStatisticsPlotter.cxx:438 TSStatisticsPlotter.cxx:439 TSStatisticsPlotter.cxx:440 TSStatisticsPlotter.cxx:441 TSStatisticsPlotter.cxx:442 TSStatisticsPlotter.cxx:443 TSStatisticsPlotter.cxx:444 TSStatisticsPlotter.cxx:445 TSStatisticsPlotter.cxx:446 TSStatisticsPlotter.cxx:447 TSStatisticsPlotter.cxx:448 TSStatisticsPlotter.cxx:449 TSStatisticsPlotter.cxx:450 TSStatisticsPlotter.cxx:451 TSStatisticsPlotter.cxx:452 TSStatisticsPlotter.cxx:453 TSStatisticsPlotter.cxx:454 TSStatisticsPlotter.cxx:455 TSStatisticsPlotter.cxx:456 TSStatisticsPlotter.cxx:457 TSStatisticsPlotter.cxx:458 TSStatisticsPlotter.cxx:459 TSStatisticsPlotter.cxx:460 TSStatisticsPlotter.cxx:461 TSStatisticsPlotter.cxx:462 TSStatisticsPlotter.cxx:463 TSStatisticsPlotter.cxx:464 TSStatisticsPlotter.cxx:465 TSStatisticsPlotter.cxx:466 TSStatisticsPlotter.cxx:467 TSStatisticsPlotter.cxx:468 TSStatisticsPlotter.cxx:469 TSStatisticsPlotter.cxx:470 TSStatisticsPlotter.cxx:471 TSStatisticsPlotter.cxx:472 TSStatisticsPlotter.cxx:473 TSStatisticsPlotter.cxx:474 TSStatisticsPlotter.cxx:475 TSStatisticsPlotter.cxx:476 TSStatisticsPlotter.cxx:477 TSStatisticsPlotter.cxx:478 TSStatisticsPlotter.cxx:479 TSStatisticsPlotter.cxx:480 TSStatisticsPlotter.cxx:481 TSStatisticsPlotter.cxx:482 TSStatisticsPlotter.cxx:483 TSStatisticsPlotter.cxx:484 TSStatisticsPlotter.cxx:485 TSStatisticsPlotter.cxx:486 TSStatisticsPlotter.cxx:487 TSStatisticsPlotter.cxx:488 TSStatisticsPlotter.cxx:489 TSStatisticsPlotter.cxx:490 TSStatisticsPlotter.cxx:491 TSStatisticsPlotter.cxx:492 TSStatisticsPlotter.cxx:493 TSStatisticsPlotter.cxx:494 TSStatisticsPlotter.cxx:495 TSStatisticsPlotter.cxx:496 TSStatisticsPlotter.cxx:497 TSStatisticsPlotter.cxx:498 TSStatisticsPlotter.cxx:499 TSStatisticsPlotter.cxx:500 TSStatisticsPlotter.cxx:501 TSStatisticsPlotter.cxx:502 TSStatisticsPlotter.cxx:503 TSStatisticsPlotter.cxx:504 TSStatisticsPlotter.cxx:505 TSStatisticsPlotter.cxx:506 TSStatisticsPlotter.cxx:507 TSStatisticsPlotter.cxx:508 TSStatisticsPlotter.cxx:509 TSStatisticsPlotter.cxx:510 TSStatisticsPlotter.cxx:511 TSStatisticsPlotter.cxx:512 TSStatisticsPlotter.cxx:513 TSStatisticsPlotter.cxx:514 TSStatisticsPlotter.cxx:515 TSStatisticsPlotter.cxx:516 TSStatisticsPlotter.cxx:517 TSStatisticsPlotter.cxx:518 TSStatisticsPlotter.cxx:519 TSStatisticsPlotter.cxx:520 TSStatisticsPlotter.cxx:521 TSStatisticsPlotter.cxx:522 TSStatisticsPlotter.cxx:523 TSStatisticsPlotter.cxx:524 TSStatisticsPlotter.cxx:525 TSStatisticsPlotter.cxx:526 TSStatisticsPlotter.cxx:527 TSStatisticsPlotter.cxx:528 TSStatisticsPlotter.cxx:529 TSStatisticsPlotter.cxx:530 TSStatisticsPlotter.cxx:531 TSStatisticsPlotter.cxx:532 TSStatisticsPlotter.cxx:533 TSStatisticsPlotter.cxx:534 TSStatisticsPlotter.cxx:535 TSStatisticsPlotter.cxx:536 TSStatisticsPlotter.cxx:537 TSStatisticsPlotter.cxx:538 TSStatisticsPlotter.cxx:539 TSStatisticsPlotter.cxx:540 TSStatisticsPlotter.cxx:541 TSStatisticsPlotter.cxx:542 TSStatisticsPlotter.cxx:543 TSStatisticsPlotter.cxx:544 TSStatisticsPlotter.cxx:545 TSStatisticsPlotter.cxx:546 TSStatisticsPlotter.cxx:547 TSStatisticsPlotter.cxx:548 TSStatisticsPlotter.cxx:549 TSStatisticsPlotter.cxx:550 TSStatisticsPlotter.cxx:551 TSStatisticsPlotter.cxx:552 TSStatisticsPlotter.cxx:553 TSStatisticsPlotter.cxx:554 TSStatisticsPlotter.cxx:555 TSStatisticsPlotter.cxx:556 TSStatisticsPlotter.cxx:557 TSStatisticsPlotter.cxx:558 TSStatisticsPlotter.cxx:559 TSStatisticsPlotter.cxx:560 TSStatisticsPlotter.cxx:561 TSStatisticsPlotter.cxx:562 TSStatisticsPlotter.cxx:563 TSStatisticsPlotter.cxx:564 TSStatisticsPlotter.cxx:565 TSStatisticsPlotter.cxx:566 TSStatisticsPlotter.cxx:567 TSStatisticsPlotter.cxx:568 TSStatisticsPlotter.cxx:569 TSStatisticsPlotter.cxx:570 TSStatisticsPlotter.cxx:571 TSStatisticsPlotter.cxx:572 TSStatisticsPlotter.cxx:573 TSStatisticsPlotter.cxx:574 TSStatisticsPlotter.cxx:575 TSStatisticsPlotter.cxx:576 TSStatisticsPlotter.cxx:577 TSStatisticsPlotter.cxx:578 TSStatisticsPlotter.cxx:579 TSStatisticsPlotter.cxx:580 TSStatisticsPlotter.cxx:581 TSStatisticsPlotter.cxx:582 TSStatisticsPlotter.cxx:583 TSStatisticsPlotter.cxx:584 TSStatisticsPlotter.cxx:585 TSStatisticsPlotter.cxx:586 TSStatisticsPlotter.cxx:587 TSStatisticsPlotter.cxx:588 TSStatisticsPlotter.cxx:589 TSStatisticsPlotter.cxx:590 TSStatisticsPlotter.cxx:591 TSStatisticsPlotter.cxx:592 TSStatisticsPlotter.cxx:593 TSStatisticsPlotter.cxx:594 TSStatisticsPlotter.cxx:595 TSStatisticsPlotter.cxx:596 TSStatisticsPlotter.cxx:597 TSStatisticsPlotter.cxx:598 TSStatisticsPlotter.cxx:599 TSStatisticsPlotter.cxx:600 TSStatisticsPlotter.cxx:601 TSStatisticsPlotter.cxx:602 TSStatisticsPlotter.cxx:603 TSStatisticsPlotter.cxx:604 TSStatisticsPlotter.cxx:605 TSStatisticsPlotter.cxx:606 TSStatisticsPlotter.cxx:607 TSStatisticsPlotter.cxx:608 TSStatisticsPlotter.cxx:609 TSStatisticsPlotter.cxx:610 TSStatisticsPlotter.cxx:611 TSStatisticsPlotter.cxx:612 TSStatisticsPlotter.cxx:613 TSStatisticsPlotter.cxx:614 TSStatisticsPlotter.cxx:615 TSStatisticsPlotter.cxx:616 TSStatisticsPlotter.cxx:617 TSStatisticsPlotter.cxx:618 TSStatisticsPlotter.cxx:619 TSStatisticsPlotter.cxx:620 TSStatisticsPlotter.cxx:621 TSStatisticsPlotter.cxx:622 TSStatisticsPlotter.cxx:623 TSStatisticsPlotter.cxx:624 TSStatisticsPlotter.cxx:625 TSStatisticsPlotter.cxx:626 TSStatisticsPlotter.cxx:627 TSStatisticsPlotter.cxx:628 TSStatisticsPlotter.cxx:629 TSStatisticsPlotter.cxx:630 TSStatisticsPlotter.cxx:631 TSStatisticsPlotter.cxx:632 TSStatisticsPlotter.cxx:633 TSStatisticsPlotter.cxx:634 TSStatisticsPlotter.cxx:635 TSStatisticsPlotter.cxx:636 TSStatisticsPlotter.cxx:637 TSStatisticsPlotter.cxx:638 TSStatisticsPlotter.cxx:639 TSStatisticsPlotter.cxx:640 TSStatisticsPlotter.cxx:641 TSStatisticsPlotter.cxx:642 TSStatisticsPlotter.cxx:643 TSStatisticsPlotter.cxx:644 TSStatisticsPlotter.cxx:645 TSStatisticsPlotter.cxx:646 TSStatisticsPlotter.cxx:647 TSStatisticsPlotter.cxx:648 TSStatisticsPlotter.cxx:649 TSStatisticsPlotter.cxx:650 TSStatisticsPlotter.cxx:651 TSStatisticsPlotter.cxx:652 TSStatisticsPlotter.cxx:653 TSStatisticsPlotter.cxx:654 TSStatisticsPlotter.cxx:655 TSStatisticsPlotter.cxx:656 TSStatisticsPlotter.cxx:657 TSStatisticsPlotter.cxx:658 TSStatisticsPlotter.cxx:659 TSStatisticsPlotter.cxx:660 TSStatisticsPlotter.cxx:661 TSStatisticsPlotter.cxx:662 TSStatisticsPlotter.cxx:663 TSStatisticsPlotter.cxx:664 TSStatisticsPlotter.cxx:665 TSStatisticsPlotter.cxx:666 TSStatisticsPlotter.cxx:667 TSStatisticsPlotter.cxx:668 TSStatisticsPlotter.cxx:669 TSStatisticsPlotter.cxx:670 TSStatisticsPlotter.cxx:671 TSStatisticsPlotter.cxx:672 TSStatisticsPlotter.cxx:673 TSStatisticsPlotter.cxx:674 TSStatisticsPlotter.cxx:675 TSStatisticsPlotter.cxx:676 TSStatisticsPlotter.cxx:677 TSStatisticsPlotter.cxx:678 TSStatisticsPlotter.cxx:679 TSStatisticsPlotter.cxx:680 TSStatisticsPlotter.cxx:681 TSStatisticsPlotter.cxx:682 TSStatisticsPlotter.cxx:683 TSStatisticsPlotter.cxx:684 TSStatisticsPlotter.cxx:685 TSStatisticsPlotter.cxx:686 TSStatisticsPlotter.cxx:687 TSStatisticsPlotter.cxx:688 TSStatisticsPlotter.cxx:689 TSStatisticsPlotter.cxx:690 TSStatisticsPlotter.cxx:691 TSStatisticsPlotter.cxx:692 TSStatisticsPlotter.cxx:693 TSStatisticsPlotter.cxx:694 TSStatisticsPlotter.cxx:695 TSStatisticsPlotter.cxx:696 TSStatisticsPlotter.cxx:697 TSStatisticsPlotter.cxx:698 TSStatisticsPlotter.cxx:699 TSStatisticsPlotter.cxx:700 TSStatisticsPlotter.cxx:701 TSStatisticsPlotter.cxx:702 TSStatisticsPlotter.cxx:703 TSStatisticsPlotter.cxx:704 TSStatisticsPlotter.cxx:705 TSStatisticsPlotter.cxx:706 TSStatisticsPlotter.cxx:707 TSStatisticsPlotter.cxx:708 TSStatisticsPlotter.cxx:709 TSStatisticsPlotter.cxx:710 TSStatisticsPlotter.cxx:711 TSStatisticsPlotter.cxx:712 TSStatisticsPlotter.cxx:713 TSStatisticsPlotter.cxx:714 TSStatisticsPlotter.cxx:715 TSStatisticsPlotter.cxx:716 TSStatisticsPlotter.cxx:717 TSStatisticsPlotter.cxx:718 TSStatisticsPlotter.cxx:719 TSStatisticsPlotter.cxx:720 TSStatisticsPlotter.cxx:721 TSStatisticsPlotter.cxx:722 TSStatisticsPlotter.cxx:723 TSStatisticsPlotter.cxx:724 TSStatisticsPlotter.cxx:725 TSStatisticsPlotter.cxx:726 TSStatisticsPlotter.cxx:727 TSStatisticsPlotter.cxx:728 TSStatisticsPlotter.cxx:729 TSStatisticsPlotter.cxx:730 TSStatisticsPlotter.cxx:731 TSStatisticsPlotter.cxx:732 TSStatisticsPlotter.cxx:733 TSStatisticsPlotter.cxx:734 TSStatisticsPlotter.cxx:735 TSStatisticsPlotter.cxx:736 TSStatisticsPlotter.cxx:737 TSStatisticsPlotter.cxx:738 TSStatisticsPlotter.cxx:739 TSStatisticsPlotter.cxx:740 TSStatisticsPlotter.cxx:741 TSStatisticsPlotter.cxx:742 TSStatisticsPlotter.cxx:743 TSStatisticsPlotter.cxx:744 TSStatisticsPlotter.cxx:745 TSStatisticsPlotter.cxx:746 TSStatisticsPlotter.cxx:747 TSStatisticsPlotter.cxx:748 TSStatisticsPlotter.cxx:749 TSStatisticsPlotter.cxx:750 TSStatisticsPlotter.cxx:751 TSStatisticsPlotter.cxx:752 TSStatisticsPlotter.cxx:753 TSStatisticsPlotter.cxx:754 TSStatisticsPlotter.cxx:755 TSStatisticsPlotter.cxx:756 TSStatisticsPlotter.cxx:757 TSStatisticsPlotter.cxx:758 TSStatisticsPlotter.cxx:759 TSStatisticsPlotter.cxx:760 TSStatisticsPlotter.cxx:761 TSStatisticsPlotter.cxx:762 TSStatisticsPlotter.cxx:763 TSStatisticsPlotter.cxx:764 TSStatisticsPlotter.cxx:765 TSStatisticsPlotter.cxx:766 TSStatisticsPlotter.cxx:767 TSStatisticsPlotter.cxx:768 TSStatisticsPlotter.cxx:769 TSStatisticsPlotter.cxx:770 TSStatisticsPlotter.cxx:771 TSStatisticsPlotter.cxx:772 TSStatisticsPlotter.cxx:773 TSStatisticsPlotter.cxx:774 TSStatisticsPlotter.cxx:775 TSStatisticsPlotter.cxx:776 TSStatisticsPlotter.cxx:777 TSStatisticsPlotter.cxx:778 TSStatisticsPlotter.cxx:779 TSStatisticsPlotter.cxx:780 TSStatisticsPlotter.cxx:781 TSStatisticsPlotter.cxx:782 TSStatisticsPlotter.cxx:783 TSStatisticsPlotter.cxx:784 TSStatisticsPlotter.cxx:785 TSStatisticsPlotter.cxx:786 TSStatisticsPlotter.cxx:787 TSStatisticsPlotter.cxx:788 TSStatisticsPlotter.cxx:789 TSStatisticsPlotter.cxx:790 TSStatisticsPlotter.cxx:791 TSStatisticsPlotter.cxx:792 TSStatisticsPlotter.cxx:793 TSStatisticsPlotter.cxx:794 TSStatisticsPlotter.cxx:795 TSStatisticsPlotter.cxx:796 TSStatisticsPlotter.cxx:797 TSStatisticsPlotter.cxx:798 TSStatisticsPlotter.cxx:799 TSStatisticsPlotter.cxx:800 TSStatisticsPlotter.cxx:801 TSStatisticsPlotter.cxx:802 TSStatisticsPlotter.cxx:803 TSStatisticsPlotter.cxx:804 TSStatisticsPlotter.cxx:805 TSStatisticsPlotter.cxx:806 TSStatisticsPlotter.cxx:807 TSStatisticsPlotter.cxx:808 TSStatisticsPlotter.cxx:809 TSStatisticsPlotter.cxx:810 TSStatisticsPlotter.cxx:811 TSStatisticsPlotter.cxx:812 TSStatisticsPlotter.cxx:813 TSStatisticsPlotter.cxx:814 TSStatisticsPlotter.cxx:815 TSStatisticsPlotter.cxx:816 TSStatisticsPlotter.cxx:817 TSStatisticsPlotter.cxx:818 TSStatisticsPlotter.cxx:819 TSStatisticsPlotter.cxx:820 TSStatisticsPlotter.cxx:821 TSStatisticsPlotter.cxx:822 TSStatisticsPlotter.cxx:823 TSStatisticsPlotter.cxx:824 TSStatisticsPlotter.cxx:825 TSStatisticsPlotter.cxx:826 TSStatisticsPlotter.cxx:827 TSStatisticsPlotter.cxx:828 TSStatisticsPlotter.cxx:829 TSStatisticsPlotter.cxx:830 TSStatisticsPlotter.cxx:831 TSStatisticsPlotter.cxx:832 TSStatisticsPlotter.cxx:833 TSStatisticsPlotter.cxx:834 TSStatisticsPlotter.cxx:835 TSStatisticsPlotter.cxx:836 TSStatisticsPlotter.cxx:837 TSStatisticsPlotter.cxx:838 TSStatisticsPlotter.cxx:839 TSStatisticsPlotter.cxx:840 TSStatisticsPlotter.cxx:841 TSStatisticsPlotter.cxx:842 TSStatisticsPlotter.cxx:843 TSStatisticsPlotter.cxx:844 TSStatisticsPlotter.cxx:845 TSStatisticsPlotter.cxx:846 TSStatisticsPlotter.cxx:847 TSStatisticsPlotter.cxx:848 TSStatisticsPlotter.cxx:849 TSStatisticsPlotter.cxx:850 TSStatisticsPlotter.cxx:851 TSStatisticsPlotter.cxx:852 TSStatisticsPlotter.cxx:853 TSStatisticsPlotter.cxx:854 TSStatisticsPlotter.cxx:855 TSStatisticsPlotter.cxx:856 TSStatisticsPlotter.cxx:857 TSStatisticsPlotter.cxx:858 TSStatisticsPlotter.cxx:859 TSStatisticsPlotter.cxx:860 TSStatisticsPlotter.cxx:861 TSStatisticsPlotter.cxx:862 TSStatisticsPlotter.cxx:863 TSStatisticsPlotter.cxx:864 TSStatisticsPlotter.cxx:865 TSStatisticsPlotter.cxx:866 TSStatisticsPlotter.cxx:867 TSStatisticsPlotter.cxx:868 TSStatisticsPlotter.cxx:869 TSStatisticsPlotter.cxx:870 TSStatisticsPlotter.cxx:871 TSStatisticsPlotter.cxx:872 TSStatisticsPlotter.cxx:873 TSStatisticsPlotter.cxx:874 TSStatisticsPlotter.cxx:875 TSStatisticsPlotter.cxx:876 TSStatisticsPlotter.cxx:877 TSStatisticsPlotter.cxx:878 TSStatisticsPlotter.cxx:879 TSStatisticsPlotter.cxx:880 TSStatisticsPlotter.cxx:881 TSStatisticsPlotter.cxx:882 TSStatisticsPlotter.cxx:883 TSStatisticsPlotter.cxx:884 TSStatisticsPlotter.cxx:885 TSStatisticsPlotter.cxx:886 TSStatisticsPlotter.cxx:887 TSStatisticsPlotter.cxx:888 TSStatisticsPlotter.cxx:889 TSStatisticsPlotter.cxx:890 TSStatisticsPlotter.cxx:891 TSStatisticsPlotter.cxx:892 TSStatisticsPlotter.cxx:893 TSStatisticsPlotter.cxx:894 TSStatisticsPlotter.cxx:895 TSStatisticsPlotter.cxx:896 TSStatisticsPlotter.cxx:897 TSStatisticsPlotter.cxx:898 TSStatisticsPlotter.cxx:899 TSStatisticsPlotter.cxx:900 TSStatisticsPlotter.cxx:901 TSStatisticsPlotter.cxx:902 TSStatisticsPlotter.cxx:903 TSStatisticsPlotter.cxx:904 TSStatisticsPlotter.cxx:905 TSStatisticsPlotter.cxx:906 TSStatisticsPlotter.cxx:907 TSStatisticsPlotter.cxx:908 TSStatisticsPlotter.cxx:909 TSStatisticsPlotter.cxx:910 TSStatisticsPlotter.cxx:911 TSStatisticsPlotter.cxx:912 TSStatisticsPlotter.cxx:913 TSStatisticsPlotter.cxx:914 TSStatisticsPlotter.cxx:915 TSStatisticsPlotter.cxx:916 TSStatisticsPlotter.cxx:917 TSStatisticsPlotter.cxx:918 TSStatisticsPlotter.cxx:919 TSStatisticsPlotter.cxx:920 TSStatisticsPlotter.cxx:921 TSStatisticsPlotter.cxx:922 TSStatisticsPlotter.cxx:923 TSStatisticsPlotter.cxx:924 TSStatisticsPlotter.cxx:925 TSStatisticsPlotter.cxx:926 TSStatisticsPlotter.cxx:927 TSStatisticsPlotter.cxx:928 TSStatisticsPlotter.cxx:929 TSStatisticsPlotter.cxx:930 TSStatisticsPlotter.cxx:931 TSStatisticsPlotter.cxx:932 TSStatisticsPlotter.cxx:933 TSStatisticsPlotter.cxx:934 TSStatisticsPlotter.cxx:935 TSStatisticsPlotter.cxx:936 TSStatisticsPlotter.cxx:937 TSStatisticsPlotter.cxx:938 TSStatisticsPlotter.cxx:939 TSStatisticsPlotter.cxx:940 TSStatisticsPlotter.cxx:941 TSStatisticsPlotter.cxx:942 TSStatisticsPlotter.cxx:943 TSStatisticsPlotter.cxx:944 TSStatisticsPlotter.cxx:945 TSStatisticsPlotter.cxx:946 TSStatisticsPlotter.cxx:947 TSStatisticsPlotter.cxx:948 TSStatisticsPlotter.cxx:949 TSStatisticsPlotter.cxx:950 TSStatisticsPlotter.cxx:951 TSStatisticsPlotter.cxx:952 TSStatisticsPlotter.cxx:953 TSStatisticsPlotter.cxx:954 TSStatisticsPlotter.cxx:955 TSStatisticsPlotter.cxx:956 TSStatisticsPlotter.cxx:957 TSStatisticsPlotter.cxx:958 TSStatisticsPlotter.cxx:959 TSStatisticsPlotter.cxx:960 TSStatisticsPlotter.cxx:961 TSStatisticsPlotter.cxx:962 TSStatisticsPlotter.cxx:963 TSStatisticsPlotter.cxx:964 TSStatisticsPlotter.cxx:965 TSStatisticsPlotter.cxx:966 TSStatisticsPlotter.cxx:967 TSStatisticsPlotter.cxx:968 TSStatisticsPlotter.cxx:969 TSStatisticsPlotter.cxx:970 TSStatisticsPlotter.cxx:971 TSStatisticsPlotter.cxx:972 TSStatisticsPlotter.cxx:973 TSStatisticsPlotter.cxx:974 TSStatisticsPlotter.cxx:975 TSStatisticsPlotter.cxx:976 TSStatisticsPlotter.cxx:977 TSStatisticsPlotter.cxx:978 TSStatisticsPlotter.cxx:979 TSStatisticsPlotter.cxx:980 TSStatisticsPlotter.cxx:981 TSStatisticsPlotter.cxx:982 TSStatisticsPlotter.cxx:983 TSStatisticsPlotter.cxx:984 TSStatisticsPlotter.cxx:985 TSStatisticsPlotter.cxx:986 TSStatisticsPlotter.cxx:987 TSStatisticsPlotter.cxx:988 TSStatisticsPlotter.cxx:989 TSStatisticsPlotter.cxx:990 TSStatisticsPlotter.cxx:991 TSStatisticsPlotter.cxx:992 TSStatisticsPlotter.cxx:993 TSStatisticsPlotter.cxx:994 TSStatisticsPlotter.cxx:995 TSStatisticsPlotter.cxx:996 TSStatisticsPlotter.cxx:997 TSStatisticsPlotter.cxx:998 TSStatisticsPlotter.cxx:999 TSStatisticsPlotter.cxx:1000 TSStatisticsPlotter.cxx:1001 TSStatisticsPlotter.cxx:1002 TSStatisticsPlotter.cxx:1003 TSStatisticsPlotter.cxx:1004 TSStatisticsPlotter.cxx:1005 TSStatisticsPlotter.cxx:1006 TSStatisticsPlotter.cxx:1007 TSStatisticsPlotter.cxx:1008 TSStatisticsPlotter.cxx:1009 TSStatisticsPlotter.cxx:1010 TSStatisticsPlotter.cxx:1011 TSStatisticsPlotter.cxx:1012 TSStatisticsPlotter.cxx:1013 TSStatisticsPlotter.cxx:1014 TSStatisticsPlotter.cxx:1015 TSStatisticsPlotter.cxx:1016 TSStatisticsPlotter.cxx:1017 TSStatisticsPlotter.cxx:1018 TSStatisticsPlotter.cxx:1019 TSStatisticsPlotter.cxx:1020 TSStatisticsPlotter.cxx:1021 TSStatisticsPlotter.cxx:1022 TSStatisticsPlotter.cxx:1023 TSStatisticsPlotter.cxx:1024 TSStatisticsPlotter.cxx:1025 TSStatisticsPlotter.cxx:1026 TSStatisticsPlotter.cxx:1027 TSStatisticsPlotter.cxx:1028 TSStatisticsPlotter.cxx:1029 TSStatisticsPlotter.cxx:1030 TSStatisticsPlotter.cxx:1031 TSStatisticsPlotter.cxx:1032 TSStatisticsPlotter.cxx:1033 TSStatisticsPlotter.cxx:1034 TSStatisticsPlotter.cxx:1035 TSStatisticsPlotter.cxx:1036 TSStatisticsPlotter.cxx:1037 TSStatisticsPlotter.cxx:1038 TSStatisticsPlotter.cxx:1039 TSStatisticsPlotter.cxx:1040 TSStatisticsPlotter.cxx:1041 TSStatisticsPlotter.cxx:1042 TSStatisticsPlotter.cxx:1043 TSStatisticsPlotter.cxx:1044 TSStatisticsPlotter.cxx:1045 TSStatisticsPlotter.cxx:1046 TSStatisticsPlotter.cxx:1047 TSStatisticsPlotter.cxx:1048 TSStatisticsPlotter.cxx:1049 TSStatisticsPlotter.cxx:1050 TSStatisticsPlotter.cxx:1051 TSStatisticsPlotter.cxx:1052 TSStatisticsPlotter.cxx:1053 TSStatisticsPlotter.cxx:1054 TSStatisticsPlotter.cxx:1055 TSStatisticsPlotter.cxx:1056 TSStatisticsPlotter.cxx:1057 TSStatisticsPlotter.cxx:1058 TSStatisticsPlotter.cxx:1059 TSStatisticsPlotter.cxx:1060 TSStatisticsPlotter.cxx:1061 TSStatisticsPlotter.cxx:1062 TSStatisticsPlotter.cxx:1063 TSStatisticsPlotter.cxx:1064 TSStatisticsPlotter.cxx:1065 TSStatisticsPlotter.cxx:1066 TSStatisticsPlotter.cxx:1067 TSStatisticsPlotter.cxx:1068 TSStatisticsPlotter.cxx:1069 TSStatisticsPlotter.cxx:1070 TSStatisticsPlotter.cxx:1071 TSStatisticsPlotter.cxx:1072 TSStatisticsPlotter.cxx:1073 TSStatisticsPlotter.cxx:1074 TSStatisticsPlotter.cxx:1075 TSStatisticsPlotter.cxx:1076 TSStatisticsPlotter.cxx:1077 TSStatisticsPlotter.cxx:1078 TSStatisticsPlotter.cxx:1079 TSStatisticsPlotter.cxx:1080 TSStatisticsPlotter.cxx:1081 TSStatisticsPlotter.cxx:1082 TSStatisticsPlotter.cxx:1083 TSStatisticsPlotter.cxx:1084 TSStatisticsPlotter.cxx:1085 TSStatisticsPlotter.cxx:1086 TSStatisticsPlotter.cxx:1087 TSStatisticsPlotter.cxx:1088 TSStatisticsPlotter.cxx:1089 TSStatisticsPlotter.cxx:1090 TSStatisticsPlotter.cxx:1091 TSStatisticsPlotter.cxx:1092 TSStatisticsPlotter.cxx:1093 TSStatisticsPlotter.cxx:1094 TSStatisticsPlotter.cxx:1095 TSStatisticsPlotter.cxx:1096 TSStatisticsPlotter.cxx:1097 TSStatisticsPlotter.cxx:1098 TSStatisticsPlotter.cxx:1099 TSStatisticsPlotter.cxx:1100 TSStatisticsPlotter.cxx:1101 TSStatisticsPlotter.cxx:1102 TSStatisticsPlotter.cxx:1103 TSStatisticsPlotter.cxx:1104 TSStatisticsPlotter.cxx:1105 TSStatisticsPlotter.cxx:1106 TSStatisticsPlotter.cxx:1107 TSStatisticsPlotter.cxx:1108 TSStatisticsPlotter.cxx:1109 TSStatisticsPlotter.cxx:1110 TSStatisticsPlotter.cxx:1111 TSStatisticsPlotter.cxx:1112 TSStatisticsPlotter.cxx:1113 TSStatisticsPlotter.cxx:1114 TSStatisticsPlotter.cxx:1115 TSStatisticsPlotter.cxx:1116 TSStatisticsPlotter.cxx:1117 TSStatisticsPlotter.cxx:1118 TSStatisticsPlotter.cxx:1119 TSStatisticsPlotter.cxx:1120