#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"

// #define _DEBUG_
#include "QFramework/TQLibrary.h"

ClassImp(TSStatisticsPlotter)

#define inf std::numeric_limits<double>::infinity()

namespace {
  /*
  void printGraph(TGraph2D* g){}
  void printGraph(TGraph* g){
    if(!g) return;
    std::cout << g->GetName() << std::endl;
    for(int i = 0; i<g->GetN(); ++i){
      double x, y;
      g->GetPoint(i,x,y);
      std::cout << x << " / " << y << std::endl;
    }
  }
  */


  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){
  // convert a TGraph into its TSStatisticsPlotter TQFolder representation
  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){
  // convert a TSStatisticsPlotter TQFolder representation of a 2D graph into a TGraph2D
  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){
  // find the minimum in a TSStatisticsPlotter TQFolder representation of a graph
  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() {

  /* set the official ATLAS style */
  setStyleAtlas();

  /* initialize templates */
  fTemplates = NULL;
}


//__________________________________________________________________________________|___________

void TSStatisticsPlotter::setTemplates(TQFolder * templates) {

  fTemplates = templates;
}


//This class is to hold interpolation results for the LH curves
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) {} 

      //Probably redundant functions
      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) {

  /* stop if input is invalid */
  if (!input)
    return NULL;

  
  if(input->getTagBoolDefault("printPlot",false)){
    input->print("rdt");
  }
  TString writePlot;
  if(input->getTagString("writePlot",writePlot)){
    input->exportToTextFile(writePlot);
  }      
  
  /* collections of elements to draw */
  TList * graphsToDraw  = new TList();
  TList * backElements  = new TList();
  TList * frontElements  = new TList();
  TList * lineYLabels    = new TList();

  /* log scale on y axis? */
  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");
  }
  
  /* x and y range to plot */
  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);

  /* the legend */
  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));
  }

  //For evaluating POI at 1/2 sigmas from interpolation
  //TODO: add points for multiple occurances of different lines  (class/struct object?) 
  //double poi_at_m1sig = -99999, poi_at_m2sig =  -99999, poi_at_p1sig =  -99999, poi_at_p2sig = -99999, nll_at_mu0 = -99999 ; //set dummy default values
  std::map<TString, FitResults > limit_map; 

  /* loop over overlays */
  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;

    /* use style template? */
    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.")) {

      /* Put all of the available scan points into a TList */
      TList v_folders;
      TQFolderIterator itrFolders(element->getListOfFolders("?"), "p.*", true);
      while (itrFolders.hasNext()) {
        TQFolder * point = itrFolders.readNext();
        v_folders.Add(point);
      }


      /* count the number of points actually available and put them into the right order, some may have failed which in turn would break the interpolation step */
      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){
        /* create the graph using the number of points */
	    graph = new TGraphAsymmErrors(available_p.size()-1);	
        graph->SetName(elementName.ReplaceAll(".","_"));
  
        /* loop over points */
        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 ; //set dummy default values

          TQHistogramUtils::interpolateGraph(graph,interpolate,"");
         
        //The code below calculates the crossing between nll at 1/2 sigmas and the LH curve using the interpolation calculated above
        //TODO: Note, multiple minimas can be found, if so atm, this code does not handle the issue!!
          if (input->getTagBoolDefault("lim.evaluate", false)) {

             //Find minimum so that we can split curve into monotonous functions
             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);
                }
             }

             //what is the x value of minimum
             double nll_sigma  = 1.; //dummy value
             double Q_AT_ONE_SIGMA =  1.;
             double Q_AT_TWO_SIGMA =  3.8;
             double x_ymin = graph->GetPointX(i_min);
             //Get xmin and xmax
             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;};




             //TODO: get more precise q-values for 1/2 sigma
             for( double nll : { Q_AT_ONE_SIGMA, Q_AT_TWO_SIGMA} ){
                //std::cout << "Eval LH at " << nll <<" \n" ;

                nll_sigma = nll; //rewrite nll for different sigma values 
                //Evaluate 1 sigma crossing first
                if( graph->Eval(xmin) > nll_sigma) { 
                   auto root = boost::math::tools::bisect( crossing_with_nllval, xmin, x_ymin, tolerance); 
                   //std::cout << "Eval left side of LH \n" ;
                   //std::cout << "R1: " << root.first  << " R2: "<< root.second << " Average: "<< (root.first+root.second)/2. << "\n";
                   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);
                   //std::cout << "Eval right side of LH \n" ;
                   //std::cout << "R1: " << root.first  << " R2: "<< root.second << " Average: "<< (root.first+root.second)/2. << "\n";

                   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");
          //TODO possibly add limit printing also fot other types of interpolation, see the code above in linear interpolation
        }




      } 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; // this +0.01 is just to avoid drawing problems
	  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);

      /* fill properties */
      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);

      /* line properties */
      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);
      }

      /* marker properties */
      graph->SetMarkerColor(tagsElement.getTagIntegerDefault("style.markerColor", color));
      graph->SetMarkerStyle(tagsElement.getTagIntegerDefault("style.markerStyle"));
      graph->SetMarkerSize(tagsElement.getTagDoubleDefault("style.markerSize", 2.));

      applyStyle(graph->GetHistogram());

      /* add entry to legend */
      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");
      }
    }
  }

  /* apply a margin on x and y range */
  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);


  /* loop over overlays */
  TQFolderIterator all(input->getListOfFolders("?"), "!.*", true);
  while (all.hasNext()) {
    TQFolder * element = all.readNext();
    if(!element) continue;
    TString elementName = element->GetName();
    TQTaggable tagsElement;

    /* use style template? */
    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);

        /* line properties */
        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);

        /* line properties */
        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"));

      /* axis properties */
      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);

  /* prepare additional labels */
  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);
  }

  /* determine y range to avoid collisions */
  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);


  /* create the canvas */
  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){
    /* adapt size of legend according to number of overlays */
    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.));
  }

  /* ===== draw graphs ===== */

  std::vector<TGraph*> graphs;
  
  Bool_t firstGraph = true;
  TObjLink * lnk = graphsToDraw->FirstLink();
  while (lnk) {
    /* get this graph */
    TGraph * graph = dynamic_cast<TGraph*>(lnk->GetObject());
    TGraph2D* graph2D = dynamic_cast<TGraph2D*>(lnk->GetObject());
    if(graph) graphs.push_back(graph);
    /* draw 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());

      /* ===== draw back elements ===== */
      TObjLink * bkglnk = backElements->FirstLink();
      while (bkglnk) {
        bkglnk->GetObject()->Draw(bkglnk->GetOption());
        bkglnk = bkglnk->Next();
      };        
      delete backElements;

      canvas->RedrawAxis();

      /* redraw first graph */
      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

    /* get next graph */
    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;;
	}
      }
    }
  }
  
  //  delete graphsToDraw;


  /* ===== draw legend ===== */

  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();
  }

  /* ===== draw front elements ===== */

  frontElements->Draw();
  delete frontElements;


  /* ===== draw labels ===== */

  /* draw the ATLAS label */
  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");
  }

  /* draw the txt with limits */
  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);

    //Some better way how to print the file in the CAF?
    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;

       //Possible to disable limits being on the plot
       if (input->getTagBoolDefault("lim.onPlot", false)) l->DrawLatex(x_lim, y_lim, txt_for_lh );

       lim_log << (it->first + ":  " + txt_for_lh).Data() << "\n";

    } //end loop over LH scans
       lim_log.close();

       std::cout << TString::Format("writing log to '%s'",fname.Data()) << "\n";
  }


  /* draw the ATLAS label addition */
  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();
  }

  /* draw info label */
  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;


  /* finally force canvas to redraw itself */
  canvas->Update();

  /* return cancas */
  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 * /*h*/) {
  // CURRENTLY NOT IMPLEMENTED

}


//__________________________________________________________________________________|___________

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->SetFillColor(icol); // don't use: white fill color for *all* objects

  // set the paper & margin sizes
  gStyle->SetPaperSize(20,26);

  // set margin sizes
  gStyle->SetPadTopMargin(0.05);
  gStyle->SetPadRightMargin(0.05);
  gStyle->SetPadBottomMargin(0.16);
  gStyle->SetPadLeftMargin(0.16);

  // set title offsets (for axis label)
  gStyle->SetTitleXOffset(1.4);
  gStyle->SetTitleYOffset(1.4);

  // use large fonts
  //Int_t font=72; // Helvetica italics
  Int_t font=42; // Helvetica
  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");

  // use bold lines and markers
  gStyle->SetMarkerStyle(20);
  gStyle->SetMarkerSize(1.2);
  gStyle->SetHistLineWidth((Width_t)2.);
  gStyle->SetLineStyleString(2,"[12 12]"); // postscript dashes

  // get rid of X error bars
  //gStyle->SetErrorX(0.001);
  // get rid of error bar caps
  //gStyle->SetEndErrorSize(0.);

  // do not display any of the standard histogram decorations
  gStyle->SetOptTitle(0);
  //gStyle->SetOptStat(1111);
  gStyle->SetOptStat(0);
  //gStyle->SetOptFit(1111);
  gStyle->SetOptFit(0);

  // put tick marks on top and RHS of plots
  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