#include "TCanvas.h"
#include "TStyle.h"
#include "TH1.h"
#include "TH2.h"
#include "TProfile.h"
#include "TLegend.h"
#include "TLatex.h"
#include "TLine.h"

#include "QFramework/TQIterator.h"
#include "QFramework/TQDefaultPlotter.h"

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

#define DEFAULTTEXTSIZE 0.04
////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQDefaultPlotter:
//
// The TQDefaultPlotter is an example implementation, inheriting basic
// plotting functionality from the abstract TQPlotter base class.
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TQDefaultPlotter)

namespace {
  enum PlotType {
    Stack,Profile,Contours,Heatmap,Migration,Scatter
  };

  enum SubPlotType {
    None,Ratio,DataMinusBackground,CutOptimization,CutOptimizationHighpass,CutOptimizationLowpass
  };
}

TCanvas * TQDefaultPlotter::makePlot(TQTaggable& tags){
  // master-function controlling the plotting
  bool verbose = tags.getTagBoolDefault("verbose",false);
  
  // set some basic options
  gStyle->SetOptStat(false);
  gStyle->SetOptFit(false);
  gStyle->SetOptTitle(false);

  if (!tags.hasTag("style.textSize"))
    tags.setTagDouble("style.textSize", DEFAULTTEXTSIZE);
  if (!tags.hasTag("style.legend.textSize"))
    tags.setTagDouble("style.legend.textSize", 0.85*tags.getTagDoubleDefault("style.textSize",DEFAULTTEXTSIZE));
  if (!tags.hasTag("geometry.legend.nRows"))
    tags.setTagDouble("geometry.legend.nRows",4.);
  if(verbose) VERBOSEclass("collecting histograms");
  TObjArray* histos = this->collectHistograms(tags);
  if(!histos) return NULL;

  // determine the plot type
  TQTH1Iterator histitr(histos);
  int nEntries = 0;
  PlotType plottype = Stack;
  while(histitr.hasNext()){
    TH1* hist = histitr.readNext();
    nEntries += hist->GetEntries();
    if(dynamic_cast<TH2*>(hist)){
      if(tags.hasTagString("style.heatmap")){
        plottype=Heatmap;
      } else if(tags.hasTagString("style.migration")){
        plottype=Migration;
      } else if(tags.hasTagString("style.scatter")) {
        plottype=Scatter;
      } else {
        plottype=Contours;
      }
    }
    if(dynamic_cast<TProfile*>(hist)) plottype=Profile;
  }
  if(nEntries < 1){
    WARNclass("refusing to plot histogram - no entries!");
    return NULL;
  }

  //@tags:[style.subPlot] Activate a sub plot. Available options are "ratio", "cutopt", "cutopt-highpass", "cutopt-lowpass", "dmb" (data minus background), none (equivalent to not setting the tag). If the main histogram is 2D, subplots will be deactivated.
  TString subplotTypeString;
  std::vector<TString> subplot_strings;
  std::vector<SubPlotType> subplots;    

  for(auto subplot:tags.getTagVString("style.subPlot")){
    subplot.ToLower();
    subplot_strings.push_back(subplot);
  }
  for(const auto& subplotString:subplot_strings){
    SubPlotType subplot = None;
    if(subplotString == "ratio") subplot = Ratio;
    else if(subplotString == "cutopt") subplot = CutOptimization;
    else if(subplotString == "cutopt-lowpass") subplot = CutOptimizationLowpass;
    else if(subplotString == "cutopt-highpass") subplot = CutOptimizationHighpass;
    else if(subplotString == "dmb") subplot = DataMinusBackground;
    else if(subplotString == "none") subplot = None;
    else {
      WARNclass("unknown subplot type '%s'",subplotTypeString.Data());
    }
    if (plottype != Stack)
      continue;
    if(subplot != None)
      subplots.push_back(subplot);
  }

  double subpadSize = .35;
  //@tags:[geometry.sub.height] Set the height of the sub pad as a fraction of the full height (default 0.35)
  if(!tags.getTagDouble("geometry.sub.height",subpadSize)){
    tags.setTagDouble("geometry.sub.height",subpadSize);
  }
  double midpadSize = .20;  
  if(!tags.getTagDouble("geometry.mid.height",midpadSize)){
    tags.setTagDouble("geometry.mid.height",midpadSize);
  }  
  double mainPadScaling = 1.;
  double scaleCorrection = (subpadSize + ((subplots.size()-1) * midpadSize));
  tags.setTagDouble("geometry.sub.scaleCorrection",scaleCorrection);
  tags.setTagDouble("geometry.mid.scaleCorrection",scaleCorrection);    
  tags.setTagDouble("geometry.sub.yscaling",1./subpadSize);
  tags.setTagDouble("geometry.sub.xscaling",1.);  
  tags.setTagDouble("geometry.mid.yscaling",1./midpadSize);
  tags.setTagDouble("geometry.mid.xscaling",1.);    
  tags.setTagDouble("geometry.sub.margins.top", tags.getTagDoubleDefault("geometry.sub.margins.top", 0.0));
  tags.setTagDouble("geometry.mid.margins.top", tags.getTagDoubleDefault("geometry.mid.margins.top", 0.0));  
  tags.setTagDouble("geometry.mid.margins.bottom", tags.getTagDoubleDefault("geometry.mid.margins.bottom", 0.0));
  tags.setTagDouble("geometry.sub.margins.bottom", tags.getTagDoubleDefault("geometry.sub.margins.bottom", 0.1/scaleCorrection));  
  tags.setTagBool("style.mid.xAxis.showLabels",false);
  tags.setTagBool("style.mid.xAxis.showTitle",false);  
  
  if(subplots.size() > 0){
    tags.setTagDouble("geometry.main.scaling",mainPadScaling);
    tags.setTagDouble("geometry.main.margins.bottom", scaleCorrection / mainPadScaling);
    tags.setTagBool("style.main.xAxis.showLabels",false);
    tags.setTagBool("style.main.xAxis.showTitle",false);
  }


  TH1* hMaster = this->getObject<TH1>("Graph_master");
  if (!hMaster){
    if(verbose) VERBOSEclass("no master histogram found, quitting");
    return NULL;
  }
  this->setAxisLabels(tags);

  //////////////////////////////////////////////////////
  // apply the style
  //////////////////////////////////////////////////////

  //@tags:[geometry.main.*] control geometry parameters of the main pad
  this->applyGeometry(tags,hMaster, "main");
  this->applyStyle (tags,hMaster, "main");

  TH1* hTotalBkg = this->getObject<TH1>("totalBkg");
  if(hTotalBkg){
    this->applyStyle (tags,hTotalBkg,"main.totalBkg");
  }
  TH1* hTotalSig = this->getObject<TH1>("totalSig");
  if(hTotalSig){
    this->applyStyle (tags,hTotalSig,"main.totalSig");
  }

  //////////////////////////////////////////////////////
  // canvas and pads
  //////////////////////////////////////////////////////

  if(verbose) VERBOSEclass("creating canvas");
  TCanvas * canvas = this->createCanvas(tags);
  if(!canvas) return NULL;
  canvas->Draw();
  TPad* pad = this->getPad("main");
  if(!pad){
    delete canvas;
    return NULL;
  }
  canvas->cd();

  //////////////////////////////////////////////////////
  // create the stack
  //////////////////////////////////////////////////////

  if(plottype == Stack){
    this->stackHistograms(tags,"stack");
  }

  //////////////////////////////////////////////////////
  // legend
  //////////////////////////////////////////////////////

  if(verbose) VERBOSEclass("creating legend");
  if(tags.getTagBoolDefault("style.useLegendPad",false)){
    canvas->cd();
    TPad * legendPad = this->createPad(tags,"legend");
    legendPad->Draw();
    this->getPad("legend");
    if(!legendPad) return NULL;
    this->makeLegend(tags,histos);
  } else {
    this->makeLegend(tags,histos);
  }
  //create the legend before the stack! (stack creation also involves normalization, i.e., after the stack is created we don't have the original event yields at hand anymore!)

  //////////////////////////////////////////////////////
  // basic label setup
  //////////////////////////////////////////////////////

  if(verbose) VERBOSEclass("setting labels");
  TString label;
  tags.setGlobalOverwrite(true);

  int labelidx = 0;
  if (tags.getTagString("labels.lumi", label)){
    labelidx++;
    tags.setTagString(TString::Format("labels.%d",labelidx), label);
  }
  if (tags.getTagString("labels.process", label)){
    labelidx++;
    tags.setTagString(TString::Format("labels.%d",labelidx), label);
  }

  //////////////////////////////////////////////////////
  // manage the total background error bars
  //////////////////////////////////////////////////////

  // set the errors
  if(tags.hasTag("errors.showSys")){
    if(verbose) VERBOSEclass("including systematics");
    this->includeSystematics(tags);
  }
  this->setErrors(tags,tags.getTagStringDefault("errors.source","totalBkg"));

  tags.setGlobalOverwrite(false);

  //////////////////////////////////////////////////////
  // draw main pad
  //////////////////////////////////////////////////////

  if(verbose) VERBOSEclass("drawing main pad");
  pad->cd();
  bool ok = false;
  switch(plottype){
  case Profile:
    ok = this->drawProfiles(tags);
    this->drawLegend(tags);
    break;
  case Stack:
    ok = this->drawStack(tags);
    this->drawLegend(tags);
    if(verbose) VERBOSEclass("drawing cut lines");
    this->drawCutLines1D(tags);
    break;
  case Heatmap:
    ok = this->drawHeatmap(tags);
    this->drawAdditionalAxes(tags);
    this->drawLegend(tags);
    break;
  case Scatter:
    ok = this->drawScatter(tags);
    this->drawLegend(tags);
    break;
  case Migration:
    ok = this->drawMigration(tags);
    if(tags.getTagBoolDefault("style.useLegendPad",false)){
      TPad * legendPad = this->getPad("legend");
      legendPad->cd();
    }
    this->drawLegend(tags);
    pad->cd();
    break;
  case Contours:
    ok = this->drawContours(tags);
    if(tags.getTagBoolDefault("style.useLegendPad",false)){
      TPad * legendPad = this->getPad("legend");
      legendPad->cd();
    }
    this->drawLegend(tags);
    pad->cd();
    this->drawHeightLines(tags);
    this->drawAdditionalAxes(tags);
  }
  if (not ok) VERBOSEclass("Did not attempt to draw main pad or drawing was unsuccessful");

  //////////////////////////////////////////////////////
  // draw the labels
  //////////////////////////////////////////////////////

  if(verbose) VERBOSEclass("drawing labels");
  this->drawLabels(tags);

  //////////////////////////////////////////////////////
  // redraw main pad
  //////////////////////////////////////////////////////

  if(verbose) VERBOSEclass("refreshing drawing area");
  pad->RedrawAxis();
  pad->Update();
  pad->cd();

  //////////////////////////////////////////////////////
  // draw sub pad
  //////////////////////////////////////////////////////

  int isub = subplots.size();
  for(const auto& subplot:subplots){
    --isub;
    canvas->cd();
    TPad * subPad = NULL;
    tags.setTagDouble("geometry.mid.yMin",(isub == 0 ? 0. : (subpadSize + (isub-1) * midpadSize)));
    TString key = isub == 0 ? "sub" : "mid";
    subPad = this->createPad(tags,key);      
    // @tags:style.logScaleX: control whether the subplot will be shown in logX scale (default:false)
    if (tags.getTagBoolDefault ("style.logScaleX",false )){
      subPad->SetLogx();
    }
    subPad->Draw();
    subPad->cd();
    if(tags.getTagBoolDefault("style.sub.yAxis.grid",false)) subPad->SetGridy(true);
    switch(subplot){
    case Ratio:
      if(verbose) VERBOSEclass("drawing ratio");
      this->drawSub_Ratio(tags);
      break;
    case CutOptimization:
      if(verbose) VERBOSEclass("drawing cut optimization scan");
      this->drawSub_CutOptimization(tags);
      break;
    case CutOptimizationLowpass:
      if(verbose) VERBOSEclass("drawing low-pass cut optimization scan");
      this->drawSub_CutOptimizationOneDirection(tags, false);
      break;
    case CutOptimizationHighpass:
      if(verbose) VERBOSEclass("drawing high-pass cut optimization scan");
      this->drawSub_CutOptimizationOneDirection(tags, true);
      break;
    case DataMinusBackground:
      if(verbose) VERBOSEclass("drawing data-minus-background");
      this->drawSub_DataMinusBackground(tags);
      break;
    default:
      if(verbose) VERBOSEclass("Do not draw subplot");
    }
  }

  if(verbose) VERBOSEclass("all done!");
  // return the canvas
  return canvas;
}


//__________________________________________________________________________________|___________

void TQDefaultPlotter::drawLabels(TQTaggable& tags){
  bool verbose = tags.getTagBoolDefault("verbose",false);
  // draw the labels given by the tags
  this->getPad("main");

  double scaling = tags.getTagDoubleDefault("geometry.main.scaling",1.);
  double textsize = tags.getTagDoubleDefault("style.textSize",DEFAULTTEXTSIZE);
  int font = tags.getTagDoubleDefault("style.text.font",42);
  int color = tags.getTagDoubleDefault("style.text.color",1);
  //@tag:geometry.labels.xPos: Set the position of the default labels (ATLAS, xsec, lumi, ...). The value specifies the left edge. (Default: 0.2)
  //@tag:geometry.labels.yPos: Set the position of the default labels (ATLAS, xsec, lumi, ...). The value specifies the top edge. (Default: 0.86)
  double x = tags.getTagDoubleDefault("geometry.labels.xPos",0.2);
  double y = tags.getTagDoubleDefault("geometry.labels.yPos",0.86);

  //@tag:labels.atlas: draw ATLAS label. If "true" or "false", label is drawn/not drawn. If set to any other string, this string will be displayed after the ATLAS label (eg. "Internal")
  TString atlasLabel;
  if(tags.getTagString("labels.atlas",atlasLabel) && atlasLabel != "false"){
    //@tag:labels.atlas.scale: scale of the addition to the ATLAS label (Internal, Private,...). Defaults to 1.25 if neither of the two tags are present
    double atlasScale = tags.getTagDoubleDefault("labels.atlas.scale",1.25) * scaling;
    // draw the ATLAS label
    TLatex atlas;
    atlas.SetNDC();
    atlas.SetTextFont(72);
    //@tag:scale of the ATLAS label wrt other text size (1.25 by default)
    atlas.SetTextSize(textsize * atlasScale);
    atlas.SetTextColor(1);
    //@tag:labels.atlas.yPos : Set a different y position for the ATLAS label than for the other labels
    double atlas_y = tags.getTagDoubleDefault("labels.atlas.yPos", y);
    atlas.DrawLatex(x, atlas_y, "ATLAS");
    if(!atlasLabel.IsNull() && atlasLabel != "true"){
      TLatex label;
      label.SetNDC();
      label.SetTextFont(font);
      label.SetTextColor(color);
      label.SetTextSize(textsize * atlasScale);
      //@tag:labels.atlas.xPos : horizontal offset between ATLAS label and its addition. (default: 0.16)
      label.DrawLatex(x + tags.getTagDoubleDefault("labels.atlas.xPos",0.16), atlas_y, atlasLabel.Data());
    }
  }

  TString nfLabel;
  //@tag:labels.info: decide whether to draw the technical info tag on the top right of the plot
  //@tag:labels.drawNFInfo: decide whether to draw information on which NFs were applied. This is only shown if labels.info is enabled.
  if(tags.getTagBoolDefault ("labels.drawNFInfo",false)){
    TString tmpLabel = tags.getTagStringDefault("labels.nfInfo","#color[2]{(NF applied for %s)}");
    if(TQStringUtils::countText(tmpLabel,"%s") == 1){
      TString nflist = this->getScaleFactorList(tags.getTagStringDefault("input.histogram",""));
      if(!nflist.IsNull()){
        nfLabel = TString::Format(tmpLabel.Data(),TQStringUtils::convertLaTeX2ROOTTeX(nflist).Data());
      }
    }
  }
  TString infoLabel;
  bool drawInfo = tags.getTagString ("labels.info",infoLabel);
  if (verbose and not drawInfo) VERBOSEclass("Did not get infoLabel tag");
  if(infoLabel.IsNull() || infoLabel == "true"){
    infoLabel = TString::Format("Plot: \"%s\"", tags.getTagStringDefault("input.histogram","histogram").Data() );
    if(!nfLabel.IsNull()){
      infoLabel.Prepend(" ");
      infoLabel.Prepend(nfLabel);
    }
  }
  if (!infoLabel.IsNull() && infoLabel != "false") {
    // draw the info label
    TLatex l0;
    l0.SetNDC();
    l0.SetTextFont(font);
    l0.SetTextSize(textsize * tags.getTagDoubleDefault("labels.info.size",0.6) * scaling);
    l0.SetTextColor(color);
    double xpos = tags.getTagDoubleDefault("geometry.main.margins.left",0.16) + tags.getTagDoubleDefault("labels.info.xPos",1.)*(1. - tags.getTagDoubleDefault("geometry.main.margins.right",0.05) - tags.getTagDoubleDefault("geometry.main.margins.left",0.16));
    double ypos = 1. - scaling*(1.-tags.getTagDoubleDefault("labels.info.yPos",0.2))*tags.getTagDoubleDefault("geometry.main.margins.top",0.05);
    l0.SetTextAlign(tags.getTagIntegerDefault("labels.info.align",31));
    l0.DrawLatex(xpos, ypos, infoLabel.Data());
  }

  // draw  labels
  double marginStep = tags.getTagDoubleDefault("geometry.labels.marginStep",0.045);
  double labelTextScale = tags.getTagDoubleDefault("geometry.labels.scale",0.85);
  TQIterator itr(tags.getTagList("labels"),true);
  size_t index = 1;
  while(itr.hasNext()){
    TObject* obj = itr.readNext();
    if(!obj) break;
    TLatex latex;
    latex.SetNDC();
    latex.SetTextFont(font);
    latex.SetTextSize(textsize * labelTextScale * scaling);
    latex.SetTextColor(color);
    latex.DrawLatex(x, y - marginStep * index * scaling,obj->GetName());
    index++;
  }
}



void TQDefaultPlotter::drawSub_Ratio(TQTaggable& tags){
  // draw a ratio-plot in the sub-pad
  // Line colors of ratio histograms are taken from fill colors of the numerator of the corresponding main histogram
  bool verbose = tags.getTagBoolDefault("verbose",false);
  if (verbose) VERBOSEclass("'verbose' tag enabled");

  // @tags: [style.ratio.numeratorFilter]: Tag on processes that indicates that a process is considered as numerator. Default: ".isData".
  // @tags: [style.ratio.denominator]: Name of the histogram that is used for the denominator. Histogram names are formatted like "hist_ttbar" with process name "ttbar". Default: "totalStack".
  TString numeratorFilter = tags.getTagStringDefault("style.ratio.numeratorFilter",".isData");
  TString denominatorName = tags.getTagStringDefault("style.ratio.denominator","totalStack");

  // get the denominator and make the denominator error band
  TH1* denominatorOrig = this->getObject<TH1>(denominatorName);
  if(!denominatorOrig){
    ERRORclass("unable to find denominator '%s'",denominatorName.Data());
    return;
  }
  double xmin = denominatorOrig->GetXaxis()->GetXmin();
  double xmax = denominatorOrig->GetXaxis()->GetXmax();

  // loop over all the numerators to prepare the ratio
  TString dataLabel("");
  std::vector<TH1*> ratios;
  std::vector<TString> drawOptions;
  TQTaggableIterator numerator_processes(fProcesses);
  bool copied_xaxis_style = false;
  double yLowerLimit    = tags.getTagDoubleDefault("style.sub.linMin",-std::numeric_limits<double>::infinity());
  double yLowerLimitLog = std::max(tags.getTagDoubleDefault("style.sub.logMin"), tags.getTagDoubleDefault("style.sub.logMinMin", 1e-9));

  TH1* errorsHist = TQHistogramUtils::copyHistogram(denominatorOrig,TString::Format("ratioDenominatorErrors_%s",denominatorOrig->GetName()));
  TQHistogramUtils::divideHistogramWithoutError(errorsHist,denominatorOrig); 
  double ymax = TQHistogramUtils::getMaximumBinValue(errorsHist,xmin,xmax,true);
  double ymin = TQHistogramUtils::getMinimumBinValue(errorsHist,xmin,xmax,true,yLowerLimit);
  double yminLog = TQHistogramUtils::getMinimumBinValue(errorsHist,xmin,xmax,true,yLowerLimitLog);
  TGraph * errors = TQHistogramUtils::getGraph(errorsHist);
  delete errorsHist;
  
  // @tag: [style.sub.showUnity]: The automatic y range of the ratio plot includes 1. Default: true.
  // @tag: [style.sub.logMin,style.sub.linMin,(style.sub.logMinMin)]: Restricts the automatic y-axis ranges of the sub plot for linear and log plots. They are not set by default. "style.logMinMin" defaults to 1e-9 and acts as an additional lower bound for log plots; use with great care!

  bool showUnity = tags.getTagBoolDefault("style.ratio.showUnity", true);
  if (!showUnity){
    ymax = -std::numeric_limits<double>::infinity();
    ymin    = std::numeric_limits<double>::infinity();
    yminLog = std::numeric_limits<double>::infinity();
  }

  while(numerator_processes.hasNext()){
    TQNamedTaggable* numeratorProcess = numerator_processes.readNext();
    if(!numeratorProcess || !numeratorProcess->getTagBoolDefault(numeratorFilter,false)) continue;
    TH1 * numeratorOrig = this->getObject<TH1>(this->makeHistogramIdentifier(numeratorProcess));
    if(!numeratorOrig) continue;
    if (!copied_xaxis_style) {
        TQHistogramUtils::copyAxisStyle(numeratorOrig, errors->GetHistogram());
        copied_xaxis_style = true;
    }
    TH1* ratio = TQHistogramUtils::copyHistogram(numeratorOrig,TString::Format("ratio_%s_%s",numeratorOrig->GetName(),denominatorOrig->GetName()));

    // Color the ratio line with the fill color of the main histogram.
    // Don't do it if the fill color is white. Then it's probably data
    // and you don't want white error bars.
    if (ratio->GetFillColor() != kWhite){
      ratio->SetLineColor(ratio->GetFillColor());
    }
    ratio->SetLineWidth(2);

    TQHistogramUtils::divideHistogramWithoutError(ratio,denominatorOrig);
    ymax = std::max(ymax,TQHistogramUtils::getMaximumBinValue(ratio,xmin,xmax,true));
    ymin = std::min(ymin,TQHistogramUtils::getMinimumBinValue(ratio,xmin,xmax,true,yLowerLimit));
    yminLog = std::min(yminLog,TQHistogramUtils::getMinimumBinValue(ratio,xmin,xmax,true,yLowerLimitLog));
    ratios.push_back(ratio);
    drawOptions.push_back(numeratorProcess->getTagStringDefault("sub.drawOption", "P E"));
  }
  if (tags.getTagBoolDefault("style.sub.logScaleY", false)){
    ymin = yminLog;
  }

  double dy = ymax - ymin;
  ymin -= 0.1*dy;
  ymax += 0.1*dy;

  // do some final corrections

  // @tags: [style.ratio.numerator.title, style.ratio.denominator.title]: Name of numerator and denominator. If both are set, the y-axis caption of the ratio plot is "num / den". If the denominator string is empty, only the numerator is printed. Default: "Data" and the title of the denominator histogram.
  TString denominatorTitle = tags.getTagStringDefault("style.ratio.denominator.title",denominatorOrig->GetTitle());
  TString numeratorTitle =  tags.getTagStringDefault("style.ratio.numerator.title","Data");
  TString title = "";
  if (!TQStringUtils::isEmpty(denominatorTitle, true))
    title = tags.getTagStringDefault("style.ratio.title",TString::Format("%s / %s",numeratorTitle.Data(),denominatorTitle.Data()));
  else
    title = tags.getTagStringDefault("style.ratio.title",TString::Format("%s",numeratorTitle.Data()));
  tags.getTagString("style.sub.title",title);
  errors->GetYaxis()->SetTitle(title);

  // @tags: [style.ratio.firstLabel, style.ratio.lastLabel]: show first/last ratio axis labels.
  // delete last label so it doesn't overlap with main axis "0"
  bool lastLabel = tags.getTagBoolDefault("style.sub.lastLabel",false);
  if (!lastLabel) errors->GetYaxis()->ChangeLabel(-1,-1,0.0);
  // delete first label to make things symmetric
  bool firstLabel = tags.getTagBoolDefault("style.sub.firstLabel",false);
  if (!firstLabel) errors->GetYaxis()->ChangeLabel(1,-1,0.0);

  // @tags:style.ratio.ndivisions: Control the number of divisions for the y-axis in the ratio plot. See TAttAxis::SetNdivisions().
  tags.getTagDouble("style.ratio.min",ymin);
  tags.getTagDouble("style.ratio.max",ymax);
  errors->SetMaximum(ymax);
  errors->SetMinimum(ymin);
  std::string padkey = gPad->GetName();

  this->applyGeometry(tags,errors, padkey);
  this->applyStyle (tags,errors, padkey);
  this->applyStyle (tags,errors, "ratio");  
  this->applyStyle (tags,errors, "ratio.errors");  

  // draw everything
  // unity line
  if (showUnity){
    errors->Draw("AE2");
    TLine line;
    line.SetLineStyle(errors->GetLineStyle());
    line.SetLineWidth(errors->GetLineWidth());
    line.DrawLine(errors->GetXaxis()->GetXmin(),1,errors->GetXaxis()->GetXmax(),1);
  } else{
    errors->SetLineWidth(0);
    errors->SetMarkerSize(0);
    errors->Draw("A");
  }
  // ratios
  for(size_t i = 0; i < ratios.size(); i++) {

    ratios[i]->Draw(drawOptions[i] + "SAME");

    // Plotting with the E0 option draws errorbars also if the datapoint
    // is outside of the pad (that's what we want), but it draws datapoints
    // when they are at 0 (we don't want that).
    // Workaround: set the marker size to 0 and draw with E0 option. For
    // some reason, plotting the original histogram messes things up. So
    // use a clone instead.
    // The clone is not deleted (memory leak!), because otherwise the errorbars
    // disappear again on the plot.
    if (drawOptions[i].Contains("E")) {
      TH1* ratioClone = (TH1*) ratios[i]->Clone();
      ratioClone->SetMarkerSize(0);
      ratioClone->Draw("SAME " + drawOptions[i] + "0");
    }

    this->drawArrows(tags,ratios[i],ymin,ymax);
  }
}

void TQDefaultPlotter::drawSub_DataMinusBackground(TQTaggable& tags){
  // draw a data-minus-background plot in the sub-pad

  TString subtractionName = tags.getTagStringDefault("style.dmb.subtraction","totalBkg");
  TH1* subtraction = this->getObject<TH1>(subtractionName);
  if(!subtraction) return;

  TString errorSourceName = tags.getTagStringDefault("style.dmb.errors","totalBkg");
  TString shiftToName = tags.getTagStringDefault("style.dmb.shiftTo",errorSourceName);
  TH1* errorSource = this->getObject<TH1>(errorSourceName);
  TH1* shiftTo = this->getObject<TH1>(shiftToName);  
  if(!errorSource) return;

  // set the x range of the dmb graph to match the one of the main histogram
  std::string padkey = gPad->GetName();

  TString dataLabel("");

  double max = 0;
  double min = 0;

  std::vector<TH1*> v_signal;
  std::vector<TH1*> v_data;

  std::vector<TString> drawOptions;

  TQTaggableIterator itrSig(fProcesses);
  while(itrSig.hasNext()){
    TQNamedTaggable* process = itrSig.readNext();
    if(!process) continue;
    if(!process->getTagBoolDefault(".isSignal",false)) continue;
    TH1* h_sig = this->getObject<TH1>(this->makeHistogramIdentifier(process));
    h_sig = TQHistogramUtils::copyHistogram(h_sig,TString::Format("%s_dminusb",h_sig->GetName()));
    this->applyStyle(tags,h_sig,"sub.sig");
    max = std::max(max,TQHistogramUtils::getMax(h_sig,false));
    min = std::min(min,TQHistogramUtils::getMin(h_sig,false));
    if(!h_sig) continue;
    v_signal.push_back(h_sig);
  }

  // loop over data histograms
  TQTaggableIterator itr(fProcesses);
  while(itr.hasNext()){
    // get the data histogram
    TQNamedTaggable* process = itr.readNext();
    if(!process) continue;
    if(!process->getTagBoolDefault(".isData",false)) continue;
    TH1 * h_data = this->getObject<TH1>(this->makeHistogramIdentifier(process));
    if(!h_data) continue;
    h_data = TQHistogramUtils::copyHistogram(h_data,TString::Format("%s_minus_bkg",h_data->GetName()));
    this->applyStyle(tags,h_data,"sub.data");
    TQHistogramUtils::addHistogramWithoutError(h_data,subtraction,-1.);
    max = std::max(max,TQHistogramUtils::getMax(h_data,true));
    min = std::min(min,TQHistogramUtils::getMin(h_data,true));
    v_data.push_back(h_data);
    drawOptions.push_back(process->getTagStringDefault("sub.drawOption", "P E"));    
  }

  gStyle->SetEndErrorSize(0);

  TGraphErrors* errorGraph = new TGraphErrors(errorSource->GetNbinsX());
  TQHistogramUtils::copyStyle(errorGraph,errorSource);
  for(int i=1; i<errorSource->GetNbinsX(); ++i){
    double val = errorSource->GetBinError(i);
    max = std::max(max,1.1*val);
    min = std::min(min,-1.1*val);
    errorGraph->SetPoint(i,shiftTo->GetBinCenter(i),shiftTo->GetBinContent(i)-subtraction->GetBinContent(i));
    errorGraph->SetPointError(i,errorSource->GetBinCenter(i)-errorSource->GetBinLowEdge(i),val);
  }

  double margin = tags.getTagDoubleDefault("style.sub.margin",1.1);

  TH1* frame = TQHistogramUtils::copyHistogram(subtraction,"Graph_subFrame");
  frame->Reset();
  frame->SetMaximum(margin*max);
  frame->SetMinimum(margin*min);

  this->applyGeometry(tags,frame,padkey);
  this->applyStyle (tags,frame, "sub");
  this->applyStyle (tags,frame, "dmb");  

  frame->GetYaxis()->SetTitle(tags.getTagStringDefault("style.sub.title",tags.getTagStringDefault("style.dmb.title","Data-Bkg.")));
  frame->Draw("HIST");

  // sort by integral to have smallest contribution in front
  std::sort(v_signal.begin(),v_signal.end(),[&](TH1* a, TH1* b){ return a->GetSumOfWeights() >= b->GetSumOfWeights();});

  for(auto h:v_signal){
    h->Draw("HISTSAME");
  }

  errorGraph->SetTitle("mc error band");
  this->applyStyle(tags,errorGraph,"main.totalStackError");
  errorGraph->Draw("E2SAME");

  for(size_t i = 0; i < v_data.size(); i++) {
    v_data[i]->Draw(drawOptions[i] + "SAME");

    // See explanation in drawSub_Ratio above.
    TH1* hClone = (TH1*) v_data[i]->Clone();
    hClone->SetMarkerSize(0);
    hClone->Draw("SAME " + drawOptions[i] + "0");
  }
}

void TQDefaultPlotter::drawSub_CutOptimization(TQTaggable& tags){
  // draw a cut optimization scan in the sub-pad
  std::string padkey = gPad->GetName();
  bool verbose = tags.getTagBoolDefault("verbose",false);

  TH1* hTotalStack = this->getObject<TH1>("totalStack");
  if(!hTotalStack) return;

  TQTaggableIterator itr(this->fProcesses);
  TH1* hSig = NULL;
  while(itr.hasNext() && !hSig){
    TQNamedTaggable* process = itr.readNext();
    if(!process) continue;
    if(process->getTagBoolDefault(".isSignal",false)){
      hSig = this->getObject<TH1>(this->makeHistogramIdentifier(process));
    }
  }
  if(!hSig) return;

  //@tag:optScan.FOMmode: figure of merit to be used. currently available are: s/sqrt(s+b),s/b,poisson,poissonwerr,s/sqrt(b),s/sqrt(b+db2)
  //@tag:optScan.FOMbbb: evaluate the figure-of-merit bin-by-bin instead of integrated left and right (default:false)
  //@tag:style.FOMmode: deprecated, use optScan.FOMmode
  //@tag:style.FOMbbb: deprecated, use optScan.FOMbbb
  TString fommodestr = tags.getTagStringDefault("optScan.FOMmode",tags.getTagStringDefault ("style.FOMmode","s/sqrt(b)"));
  TQHistogramUtils::FOM FOMmode = TQHistogramUtils::readFOM(fommodestr);
  if(FOMmode == TQHistogramUtils::kUndefined){
    WARNclass("unknown figure of merit '%s'!",fommodestr.Data());
    return;
  }
  bool binByBin = tags.getTagBoolDefault("optScan.FOMbbb",tags.getTagBoolDefault ("style.FOMbbb",false));
  bool drawLegend = !binByBin;

  std::vector<TH1*> bkgSystHistos;
  collectOptScanSimplifiedSystHistograms(bkgSystHistos, tags); //TODO? if this returns false something was wrong and no syst histograms are provided -> should abort?

  std::map<std::string,TH1*> hists;
  double actualmax = 0;
  if(binByBin){
    if(verbose){
      VERBOSEclass("drawing bin-by-bin significances with FOM=%s for S=%s and B=%s",TQHistogramUtils::getFOMTitleROOT(FOMmode).Data(),hSig->GetTitle(),hTotalStack->GetTitle());
    }
    TH1* hFOM = TQHistogramUtils::getFOMHistogram(FOMmode,hSig, hTotalStack, 0, bkgSystHistos);
    actualmax = hFOM->GetMaximum() * tags.getTagDoubleDefault("optScan.enlargeY",1.3);
    this->addObject(hFOM,"hist_FOM_bbb");
    hists["default"] = hFOM;
  } else {
    if(verbose){
      VERBOSEclass("drawing optimization scan with FOM=%s for S=%s and B=%s",TQHistogramUtils::getFOMTitleROOT(FOMmode).Data(),hSig->GetTitle(),hTotalStack->GetTitle());
    }
    TH1* hFOMl = TQHistogramUtils::getFOMScan(FOMmode,hSig, hTotalStack, true, 0.05,verbose, bkgSystHistos);
    TH1* hFOMr = TQHistogramUtils::getFOMScan(FOMmode,hSig, hTotalStack, false,0.05,verbose, bkgSystHistos);
    if (FOMmode == TQHistogramUtils::kSoSqB){
      double rmax = hFOMr->GetBinContent(hFOMr->GetMaximumBin());
      double rmaxxval = hFOMr->GetBinLowEdge(hFOMr->GetMaximumBin()) + hFOMr->GetBinWidth(hFOMr->GetMaximumBin());
      double lmax = hFOMl->GetBinContent(hFOMl->GetMaximumBin());
      double lmaxxval = hFOMl->GetBinLowEdge(hFOMl->GetMaximumBin());
      hFOMl->SetTitle(TString::Format("#rightarrow cut Max=%.2f (%.2f)",lmax,lmaxxval));
      hFOMr->SetTitle(TString::Format("#leftarrow cut Max=%.2f (%.2f)",rmax,rmaxxval));
    } else {
      hFOMl->SetTitle("#rightarrow cut");
      hFOMr->SetTitle("#leftarrow cut" );
    }
    //@tag:optScan.autoselect: select the optimization scan (left,right) that is better suited for every histogram and only show that one (default:false)
    if(tags.getTagBoolDefault("optScan.autoselect",false)){
      if(verbose) VERBOSEclass("autoselecting opt scan");
      if(TQHistogramUtils::hasGreaterMaximumThan(hFOMr,hFOMl)){
        if(verbose) VERBOSEclass("removing left-hand FOM histogram");
        this->addObject(hFOMr,"hist_FOM");
        hists["right"] = hFOMr;
        delete hFOMl;
        actualmax = hFOMr->GetMaximum() * tags.getTagDoubleDefault("optScan.enlargeY",1.3);
      } else {
        if(verbose) VERBOSEclass("removing right-hand FOM histogram");
        this->addObject(hFOMl,"hist_FOM");
        hists["left"] = hFOMl;
        delete hFOMr;
        actualmax = hFOMl->GetMaximum() * tags.getTagDoubleDefault("optScan.enlargeY",1.3);
      }
    } else {
      if(verbose) VERBOSEclass("using all opt scans");
      hists["right"] = hFOMr;
      hists["left"] = hFOMl;
      this->addObject(hFOMl,"hist_FOM_left");
      this->addObject(hFOMr,"hist_FOM_right");
      actualmax = std::max(hFOMl->GetMaximum(),hFOMr->GetMaximum()) * tags.getTagDoubleDefault("optScan.enlargeY",1.3);
    }
  }

  //cleanup
  for (TH1* toDel : bkgSystHistos) {
    delete toDel;
  }
  bkgSystHistos.clear(); //just to make sure the otherwise dangling pointers can not accessed anymore afterwards...



  TLegend* leg = NULL;
  if(drawLegend){
    leg = new TLegend(0.21,0.85,0.93,0.95);
    leg->SetNColumns(2);
    leg->SetFillColor(0);
    leg->SetFillStyle(0);
    leg->SetLineColor(0);
    leg->SetLineWidth(0);
  }

  bool first = true;
  for(auto h:hists){
    //@tag:style.optScan.default.*: control styling of the auto-selected FOM graph
    if(verbose) VERBOSEclass("drawing FOM histogram");
    this->applyStyle (tags,h.second,"optScan."+h.first);
    this->applyGeometry(tags,h.second,"optScan");
    this->applyGeometry(tags,h.second,padkey);
    h.second->SetMaximum(actualmax);
    h.second->SetFillStyle(0);
    h.second->SetMinimum(0);
    h.second->SetNdivisions(50008);
    h.second->SetLineWidth(3);
    h.second->GetYaxis()->SetNdivisions(50004);
    h.second->Draw(first ? "HIST" : "HIST SAME");
    if(drawLegend){
      leg->AddEntry(h.second,h.second->GetTitle(),"l");
    }
    first = false;
  }

  if(drawLegend){
    leg->Draw("SAME");
  }
}

void TQDefaultPlotter::drawSub_CutOptimizationOneDirection(TQTaggable& tags, bool highpass){
  // draw a cut optimization scan in the sub-pad for a single direction (high- or lowpass) for all signals
  std::string padkey = gPad->GetName();
  bool verbose = tags.getTagBoolDefault("verbose",false);

  TH1* hTotalStack = this->getObject<TH1>("totalStack");
  if(!hTotalStack) return;

  TQTaggableIterator itr(this->fProcesses);
  std::vector<std::pair<TH1*, TQNamedTaggable*>> signals;
  while(itr.hasNext()){
    TQNamedTaggable* process = itr.readNext();
    if(!process) continue;
    if(process->getTagBoolDefault(".isSignal",false)){
      TH1* hSig = this->getObject<TH1>(this->makeHistogramIdentifier(process));
      signals.push_back({hSig, process});
    }
  }
  if(signals.size() == 0) {
    return;
  }

  TString legendarrow = "#leftarrow";
  if (highpass) {
    legendarrow = "#rightarrow";
  }

  
  //@tag:optScan.FOMmode: figure of merit to be used. currently available are: s/sqrt(s+b),s/b,poisson,poissonwerr,s/sqrt(b),s/sqrt(b+db2)
  //@tag:optScan.FOMbbb: evaluate the figure-of-merit bin-by-bin instead of integrated left and right (default:false)
  //@tag:style.FOMmode: deprecated, use optScan.FOMmode
  //@tag:style.FOMbbb: deprecated, use optScan.FOMbbb
  TString fommodestr = tags.getTagStringDefault("optScan.FOMmode",tags.getTagStringDefault ("style.FOMmode","s/sqrt(b)"));
  TQHistogramUtils::FOM FOMmode = TQHistogramUtils::readFOM(fommodestr);
  if(FOMmode == TQHistogramUtils::kUndefined){
    WARNclass("unknown figure of merit '%s'!",fommodestr.Data());
    return;
  }

  std::vector<TH1*> bkgSystHistos;
  collectOptScanSimplifiedSystHistograms(bkgSystHistos, tags); //TODO? if this returns false something was wrong and no syst histograms are provided -> should abort?

  std::map<std::string,TH1*> hists;
  double actualmax = 0;

  for (auto histprocpair : signals) {

    TH1* hSig = histprocpair.first;
    TQNamedTaggable* process = histprocpair.second;
    if (verbose) {
      VERBOSEclass("drawing multi-signal optimization scan with FOM=%s for S=%s and B=%s",TQHistogramUtils::getFOMTitleROOT(FOMmode).Data(),hSig->GetTitle(),hTotalStack->GetTitle());
    }

    TH1* hFOM = TQHistogramUtils::getFOMScan(FOMmode, hSig, hTotalStack, highpass, 0.05, verbose, bkgSystHistos);
    TQHistogramUtils::applyStyle(hFOM, process);
    hists[process->getTagStringDefault(".name", "moep").Data()] = hFOM;

    actualmax = std::max(hFOM->GetMaximum() * tags.getTagDoubleDefault("optScan.enlargeY", 1.3), actualmax);
  }

  for (TH1* toDel : bkgSystHistos) {
    delete toDel;
  }
  bkgSystHistos.clear(); //just to make sure the otherwise dangling pointers can not accessed anymore afterwards...

  bool binByBin = tags.getTagBoolDefault("optScan.FOMbbb",tags.getTagBoolDefault ("style.FOMbbb",false));
  bool drawLegend = !binByBin;
  TLegend* leg = NULL;
  if(drawLegend){
    if (highpass) {
    leg = new TLegend(0.21,0.85,0.93,0.95);
    } else {
      leg = new TLegend(0.73,0.85,0.93,0.95);
    }
    leg->SetNColumns(2);
    leg->SetFillColor(0);
    leg->SetFillStyle(0);
    leg->SetLineColor(0);
    leg->SetLineWidth(0);
    leg->SetTextSize(.15);
  }

  bool first = true;
  for(auto h:hists){
    //@tag:style.optScan.default.*: control styling of the auto-selected FOM graph
    if(verbose) VERBOSEclass("drawing FOM histogram");
    this->applyStyle (tags,h.second,"optScan."+h.first);
    this->applyGeometry(tags,h.second,padkey);
    h.second->SetMaximum(actualmax);
    h.second->SetFillStyle(0);
    h.second->SetMinimum(0);
    h.second->SetNdivisions(50008);
    h.second->GetYaxis()->SetNdivisions(50004);
    h.second->Draw(first ? "HIST" : "HIST SAME");
    if (first && drawLegend) {
      leg->AddEntry(h.second, highpass ? "#rightarrow" : "#leftarrow" ,"l");
    }

    first = false;
  }

  if (drawLegend) {
    leg->Draw("SAME");
  }


}

    
 TQDefaultPlotter.cxx:1
 TQDefaultPlotter.cxx:2
 TQDefaultPlotter.cxx:3
 TQDefaultPlotter.cxx:4
 TQDefaultPlotter.cxx:5
 TQDefaultPlotter.cxx:6
 TQDefaultPlotter.cxx:7
 TQDefaultPlotter.cxx:8
 TQDefaultPlotter.cxx:9
 TQDefaultPlotter.cxx:10
 TQDefaultPlotter.cxx:11
 TQDefaultPlotter.cxx:12
 TQDefaultPlotter.cxx:13
 TQDefaultPlotter.cxx:14
 TQDefaultPlotter.cxx:15
 TQDefaultPlotter.cxx:16
 TQDefaultPlotter.cxx:17
 TQDefaultPlotter.cxx:18
 TQDefaultPlotter.cxx:19
 TQDefaultPlotter.cxx:20
 TQDefaultPlotter.cxx:21
 TQDefaultPlotter.cxx:22
 TQDefaultPlotter.cxx:23
 TQDefaultPlotter.cxx:24
 TQDefaultPlotter.cxx:25
 TQDefaultPlotter.cxx:26
 TQDefaultPlotter.cxx:27
 TQDefaultPlotter.cxx:28
 TQDefaultPlotter.cxx:29
 TQDefaultPlotter.cxx:30
 TQDefaultPlotter.cxx:31
 TQDefaultPlotter.cxx:32
 TQDefaultPlotter.cxx:33
 TQDefaultPlotter.cxx:34
 TQDefaultPlotter.cxx:35
 TQDefaultPlotter.cxx:36
 TQDefaultPlotter.cxx:37
 TQDefaultPlotter.cxx:38
 TQDefaultPlotter.cxx:39
 TQDefaultPlotter.cxx:40
 TQDefaultPlotter.cxx:41
 TQDefaultPlotter.cxx:42
 TQDefaultPlotter.cxx:43
 TQDefaultPlotter.cxx:44
 TQDefaultPlotter.cxx:45
 TQDefaultPlotter.cxx:46
 TQDefaultPlotter.cxx:47
 TQDefaultPlotter.cxx:48
 TQDefaultPlotter.cxx:49
 TQDefaultPlotter.cxx:50
 TQDefaultPlotter.cxx:51
 TQDefaultPlotter.cxx:52
 TQDefaultPlotter.cxx:53
 TQDefaultPlotter.cxx:54
 TQDefaultPlotter.cxx:55
 TQDefaultPlotter.cxx:56
 TQDefaultPlotter.cxx:57
 TQDefaultPlotter.cxx:58
 TQDefaultPlotter.cxx:59
 TQDefaultPlotter.cxx:60
 TQDefaultPlotter.cxx:61
 TQDefaultPlotter.cxx:62
 TQDefaultPlotter.cxx:63
 TQDefaultPlotter.cxx:64
 TQDefaultPlotter.cxx:65
 TQDefaultPlotter.cxx:66
 TQDefaultPlotter.cxx:67
 TQDefaultPlotter.cxx:68
 TQDefaultPlotter.cxx:69
 TQDefaultPlotter.cxx:70
 TQDefaultPlotter.cxx:71
 TQDefaultPlotter.cxx:72
 TQDefaultPlotter.cxx:73
 TQDefaultPlotter.cxx:74
 TQDefaultPlotter.cxx:75
 TQDefaultPlotter.cxx:76
 TQDefaultPlotter.cxx:77
 TQDefaultPlotter.cxx:78
 TQDefaultPlotter.cxx:79
 TQDefaultPlotter.cxx:80
 TQDefaultPlotter.cxx:81
 TQDefaultPlotter.cxx:82
 TQDefaultPlotter.cxx:83
 TQDefaultPlotter.cxx:84
 TQDefaultPlotter.cxx:85
 TQDefaultPlotter.cxx:86
 TQDefaultPlotter.cxx:87
 TQDefaultPlotter.cxx:88
 TQDefaultPlotter.cxx:89
 TQDefaultPlotter.cxx:90
 TQDefaultPlotter.cxx:91
 TQDefaultPlotter.cxx:92
 TQDefaultPlotter.cxx:93
 TQDefaultPlotter.cxx:94
 TQDefaultPlotter.cxx:95
 TQDefaultPlotter.cxx:96
 TQDefaultPlotter.cxx:97
 TQDefaultPlotter.cxx:98
 TQDefaultPlotter.cxx:99
 TQDefaultPlotter.cxx:100
 TQDefaultPlotter.cxx:101
 TQDefaultPlotter.cxx:102
 TQDefaultPlotter.cxx:103
 TQDefaultPlotter.cxx:104
 TQDefaultPlotter.cxx:105
 TQDefaultPlotter.cxx:106
 TQDefaultPlotter.cxx:107
 TQDefaultPlotter.cxx:108
 TQDefaultPlotter.cxx:109
 TQDefaultPlotter.cxx:110
 TQDefaultPlotter.cxx:111
 TQDefaultPlotter.cxx:112
 TQDefaultPlotter.cxx:113
 TQDefaultPlotter.cxx:114
 TQDefaultPlotter.cxx:115
 TQDefaultPlotter.cxx:116
 TQDefaultPlotter.cxx:117
 TQDefaultPlotter.cxx:118
 TQDefaultPlotter.cxx:119
 TQDefaultPlotter.cxx:120
 TQDefaultPlotter.cxx:121
 TQDefaultPlotter.cxx:122
 TQDefaultPlotter.cxx:123
 TQDefaultPlotter.cxx:124
 TQDefaultPlotter.cxx:125
 TQDefaultPlotter.cxx:126
 TQDefaultPlotter.cxx:127
 TQDefaultPlotter.cxx:128
 TQDefaultPlotter.cxx:129
 TQDefaultPlotter.cxx:130
 TQDefaultPlotter.cxx:131
 TQDefaultPlotter.cxx:132
 TQDefaultPlotter.cxx:133
 TQDefaultPlotter.cxx:134
 TQDefaultPlotter.cxx:135
 TQDefaultPlotter.cxx:136
 TQDefaultPlotter.cxx:137
 TQDefaultPlotter.cxx:138
 TQDefaultPlotter.cxx:139
 TQDefaultPlotter.cxx:140
 TQDefaultPlotter.cxx:141
 TQDefaultPlotter.cxx:142
 TQDefaultPlotter.cxx:143
 TQDefaultPlotter.cxx:144
 TQDefaultPlotter.cxx:145
 TQDefaultPlotter.cxx:146
 TQDefaultPlotter.cxx:147
 TQDefaultPlotter.cxx:148
 TQDefaultPlotter.cxx:149
 TQDefaultPlotter.cxx:150
 TQDefaultPlotter.cxx:151
 TQDefaultPlotter.cxx:152
 TQDefaultPlotter.cxx:153
 TQDefaultPlotter.cxx:154
 TQDefaultPlotter.cxx:155
 TQDefaultPlotter.cxx:156
 TQDefaultPlotter.cxx:157
 TQDefaultPlotter.cxx:158
 TQDefaultPlotter.cxx:159
 TQDefaultPlotter.cxx:160
 TQDefaultPlotter.cxx:161
 TQDefaultPlotter.cxx:162
 TQDefaultPlotter.cxx:163
 TQDefaultPlotter.cxx:164
 TQDefaultPlotter.cxx:165
 TQDefaultPlotter.cxx:166
 TQDefaultPlotter.cxx:167
 TQDefaultPlotter.cxx:168
 TQDefaultPlotter.cxx:169
 TQDefaultPlotter.cxx:170
 TQDefaultPlotter.cxx:171
 TQDefaultPlotter.cxx:172
 TQDefaultPlotter.cxx:173
 TQDefaultPlotter.cxx:174
 TQDefaultPlotter.cxx:175
 TQDefaultPlotter.cxx:176
 TQDefaultPlotter.cxx:177
 TQDefaultPlotter.cxx:178
 TQDefaultPlotter.cxx:179
 TQDefaultPlotter.cxx:180
 TQDefaultPlotter.cxx:181
 TQDefaultPlotter.cxx:182
 TQDefaultPlotter.cxx:183
 TQDefaultPlotter.cxx:184
 TQDefaultPlotter.cxx:185
 TQDefaultPlotter.cxx:186
 TQDefaultPlotter.cxx:187
 TQDefaultPlotter.cxx:188
 TQDefaultPlotter.cxx:189
 TQDefaultPlotter.cxx:190
 TQDefaultPlotter.cxx:191
 TQDefaultPlotter.cxx:192
 TQDefaultPlotter.cxx:193
 TQDefaultPlotter.cxx:194
 TQDefaultPlotter.cxx:195
 TQDefaultPlotter.cxx:196
 TQDefaultPlotter.cxx:197
 TQDefaultPlotter.cxx:198
 TQDefaultPlotter.cxx:199
 TQDefaultPlotter.cxx:200
 TQDefaultPlotter.cxx:201
 TQDefaultPlotter.cxx:202
 TQDefaultPlotter.cxx:203
 TQDefaultPlotter.cxx:204
 TQDefaultPlotter.cxx:205
 TQDefaultPlotter.cxx:206
 TQDefaultPlotter.cxx:207
 TQDefaultPlotter.cxx:208
 TQDefaultPlotter.cxx:209
 TQDefaultPlotter.cxx:210
 TQDefaultPlotter.cxx:211
 TQDefaultPlotter.cxx:212
 TQDefaultPlotter.cxx:213
 TQDefaultPlotter.cxx:214
 TQDefaultPlotter.cxx:215
 TQDefaultPlotter.cxx:216
 TQDefaultPlotter.cxx:217
 TQDefaultPlotter.cxx:218
 TQDefaultPlotter.cxx:219
 TQDefaultPlotter.cxx:220
 TQDefaultPlotter.cxx:221
 TQDefaultPlotter.cxx:222
 TQDefaultPlotter.cxx:223
 TQDefaultPlotter.cxx:224
 TQDefaultPlotter.cxx:225
 TQDefaultPlotter.cxx:226
 TQDefaultPlotter.cxx:227
 TQDefaultPlotter.cxx:228
 TQDefaultPlotter.cxx:229
 TQDefaultPlotter.cxx:230
 TQDefaultPlotter.cxx:231
 TQDefaultPlotter.cxx:232
 TQDefaultPlotter.cxx:233
 TQDefaultPlotter.cxx:234
 TQDefaultPlotter.cxx:235
 TQDefaultPlotter.cxx:236
 TQDefaultPlotter.cxx:237
 TQDefaultPlotter.cxx:238
 TQDefaultPlotter.cxx:239
 TQDefaultPlotter.cxx:240
 TQDefaultPlotter.cxx:241
 TQDefaultPlotter.cxx:242
 TQDefaultPlotter.cxx:243
 TQDefaultPlotter.cxx:244
 TQDefaultPlotter.cxx:245
 TQDefaultPlotter.cxx:246
 TQDefaultPlotter.cxx:247
 TQDefaultPlotter.cxx:248
 TQDefaultPlotter.cxx:249
 TQDefaultPlotter.cxx:250
 TQDefaultPlotter.cxx:251
 TQDefaultPlotter.cxx:252
 TQDefaultPlotter.cxx:253
 TQDefaultPlotter.cxx:254
 TQDefaultPlotter.cxx:255
 TQDefaultPlotter.cxx:256
 TQDefaultPlotter.cxx:257
 TQDefaultPlotter.cxx:258
 TQDefaultPlotter.cxx:259
 TQDefaultPlotter.cxx:260
 TQDefaultPlotter.cxx:261
 TQDefaultPlotter.cxx:262
 TQDefaultPlotter.cxx:263
 TQDefaultPlotter.cxx:264
 TQDefaultPlotter.cxx:265
 TQDefaultPlotter.cxx:266
 TQDefaultPlotter.cxx:267
 TQDefaultPlotter.cxx:268
 TQDefaultPlotter.cxx:269
 TQDefaultPlotter.cxx:270
 TQDefaultPlotter.cxx:271
 TQDefaultPlotter.cxx:272
 TQDefaultPlotter.cxx:273
 TQDefaultPlotter.cxx:274
 TQDefaultPlotter.cxx:275
 TQDefaultPlotter.cxx:276
 TQDefaultPlotter.cxx:277
 TQDefaultPlotter.cxx:278
 TQDefaultPlotter.cxx:279
 TQDefaultPlotter.cxx:280
 TQDefaultPlotter.cxx:281
 TQDefaultPlotter.cxx:282
 TQDefaultPlotter.cxx:283
 TQDefaultPlotter.cxx:284
 TQDefaultPlotter.cxx:285
 TQDefaultPlotter.cxx:286
 TQDefaultPlotter.cxx:287
 TQDefaultPlotter.cxx:288
 TQDefaultPlotter.cxx:289
 TQDefaultPlotter.cxx:290
 TQDefaultPlotter.cxx:291
 TQDefaultPlotter.cxx:292
 TQDefaultPlotter.cxx:293
 TQDefaultPlotter.cxx:294
 TQDefaultPlotter.cxx:295
 TQDefaultPlotter.cxx:296
 TQDefaultPlotter.cxx:297
 TQDefaultPlotter.cxx:298
 TQDefaultPlotter.cxx:299
 TQDefaultPlotter.cxx:300
 TQDefaultPlotter.cxx:301
 TQDefaultPlotter.cxx:302
 TQDefaultPlotter.cxx:303
 TQDefaultPlotter.cxx:304
 TQDefaultPlotter.cxx:305
 TQDefaultPlotter.cxx:306
 TQDefaultPlotter.cxx:307
 TQDefaultPlotter.cxx:308
 TQDefaultPlotter.cxx:309
 TQDefaultPlotter.cxx:310
 TQDefaultPlotter.cxx:311
 TQDefaultPlotter.cxx:312
 TQDefaultPlotter.cxx:313
 TQDefaultPlotter.cxx:314
 TQDefaultPlotter.cxx:315
 TQDefaultPlotter.cxx:316
 TQDefaultPlotter.cxx:317
 TQDefaultPlotter.cxx:318
 TQDefaultPlotter.cxx:319
 TQDefaultPlotter.cxx:320
 TQDefaultPlotter.cxx:321
 TQDefaultPlotter.cxx:322
 TQDefaultPlotter.cxx:323
 TQDefaultPlotter.cxx:324
 TQDefaultPlotter.cxx:325
 TQDefaultPlotter.cxx:326
 TQDefaultPlotter.cxx:327
 TQDefaultPlotter.cxx:328
 TQDefaultPlotter.cxx:329
 TQDefaultPlotter.cxx:330
 TQDefaultPlotter.cxx:331
 TQDefaultPlotter.cxx:332
 TQDefaultPlotter.cxx:333
 TQDefaultPlotter.cxx:334
 TQDefaultPlotter.cxx:335
 TQDefaultPlotter.cxx:336
 TQDefaultPlotter.cxx:337
 TQDefaultPlotter.cxx:338
 TQDefaultPlotter.cxx:339
 TQDefaultPlotter.cxx:340
 TQDefaultPlotter.cxx:341
 TQDefaultPlotter.cxx:342
 TQDefaultPlotter.cxx:343
 TQDefaultPlotter.cxx:344
 TQDefaultPlotter.cxx:345
 TQDefaultPlotter.cxx:346
 TQDefaultPlotter.cxx:347
 TQDefaultPlotter.cxx:348
 TQDefaultPlotter.cxx:349
 TQDefaultPlotter.cxx:350
 TQDefaultPlotter.cxx:351
 TQDefaultPlotter.cxx:352
 TQDefaultPlotter.cxx:353
 TQDefaultPlotter.cxx:354
 TQDefaultPlotter.cxx:355
 TQDefaultPlotter.cxx:356
 TQDefaultPlotter.cxx:357
 TQDefaultPlotter.cxx:358
 TQDefaultPlotter.cxx:359
 TQDefaultPlotter.cxx:360
 TQDefaultPlotter.cxx:361
 TQDefaultPlotter.cxx:362
 TQDefaultPlotter.cxx:363
 TQDefaultPlotter.cxx:364
 TQDefaultPlotter.cxx:365
 TQDefaultPlotter.cxx:366
 TQDefaultPlotter.cxx:367
 TQDefaultPlotter.cxx:368
 TQDefaultPlotter.cxx:369
 TQDefaultPlotter.cxx:370
 TQDefaultPlotter.cxx:371
 TQDefaultPlotter.cxx:372
 TQDefaultPlotter.cxx:373
 TQDefaultPlotter.cxx:374
 TQDefaultPlotter.cxx:375
 TQDefaultPlotter.cxx:376
 TQDefaultPlotter.cxx:377
 TQDefaultPlotter.cxx:378
 TQDefaultPlotter.cxx:379
 TQDefaultPlotter.cxx:380
 TQDefaultPlotter.cxx:381
 TQDefaultPlotter.cxx:382
 TQDefaultPlotter.cxx:383
 TQDefaultPlotter.cxx:384
 TQDefaultPlotter.cxx:385
 TQDefaultPlotter.cxx:386
 TQDefaultPlotter.cxx:387
 TQDefaultPlotter.cxx:388
 TQDefaultPlotter.cxx:389
 TQDefaultPlotter.cxx:390
 TQDefaultPlotter.cxx:391
 TQDefaultPlotter.cxx:392
 TQDefaultPlotter.cxx:393
 TQDefaultPlotter.cxx:394
 TQDefaultPlotter.cxx:395
 TQDefaultPlotter.cxx:396
 TQDefaultPlotter.cxx:397
 TQDefaultPlotter.cxx:398
 TQDefaultPlotter.cxx:399
 TQDefaultPlotter.cxx:400
 TQDefaultPlotter.cxx:401
 TQDefaultPlotter.cxx:402
 TQDefaultPlotter.cxx:403
 TQDefaultPlotter.cxx:404
 TQDefaultPlotter.cxx:405
 TQDefaultPlotter.cxx:406
 TQDefaultPlotter.cxx:407
 TQDefaultPlotter.cxx:408
 TQDefaultPlotter.cxx:409
 TQDefaultPlotter.cxx:410
 TQDefaultPlotter.cxx:411
 TQDefaultPlotter.cxx:412
 TQDefaultPlotter.cxx:413
 TQDefaultPlotter.cxx:414
 TQDefaultPlotter.cxx:415
 TQDefaultPlotter.cxx:416
 TQDefaultPlotter.cxx:417
 TQDefaultPlotter.cxx:418
 TQDefaultPlotter.cxx:419
 TQDefaultPlotter.cxx:420
 TQDefaultPlotter.cxx:421
 TQDefaultPlotter.cxx:422
 TQDefaultPlotter.cxx:423
 TQDefaultPlotter.cxx:424
 TQDefaultPlotter.cxx:425
 TQDefaultPlotter.cxx:426
 TQDefaultPlotter.cxx:427
 TQDefaultPlotter.cxx:428
 TQDefaultPlotter.cxx:429
 TQDefaultPlotter.cxx:430
 TQDefaultPlotter.cxx:431
 TQDefaultPlotter.cxx:432
 TQDefaultPlotter.cxx:433
 TQDefaultPlotter.cxx:434
 TQDefaultPlotter.cxx:435
 TQDefaultPlotter.cxx:436
 TQDefaultPlotter.cxx:437
 TQDefaultPlotter.cxx:438
 TQDefaultPlotter.cxx:439
 TQDefaultPlotter.cxx:440
 TQDefaultPlotter.cxx:441
 TQDefaultPlotter.cxx:442
 TQDefaultPlotter.cxx:443
 TQDefaultPlotter.cxx:444
 TQDefaultPlotter.cxx:445
 TQDefaultPlotter.cxx:446
 TQDefaultPlotter.cxx:447
 TQDefaultPlotter.cxx:448
 TQDefaultPlotter.cxx:449
 TQDefaultPlotter.cxx:450
 TQDefaultPlotter.cxx:451
 TQDefaultPlotter.cxx:452
 TQDefaultPlotter.cxx:453
 TQDefaultPlotter.cxx:454
 TQDefaultPlotter.cxx:455
 TQDefaultPlotter.cxx:456
 TQDefaultPlotter.cxx:457
 TQDefaultPlotter.cxx:458
 TQDefaultPlotter.cxx:459
 TQDefaultPlotter.cxx:460
 TQDefaultPlotter.cxx:461
 TQDefaultPlotter.cxx:462
 TQDefaultPlotter.cxx:463
 TQDefaultPlotter.cxx:464
 TQDefaultPlotter.cxx:465
 TQDefaultPlotter.cxx:466
 TQDefaultPlotter.cxx:467
 TQDefaultPlotter.cxx:468
 TQDefaultPlotter.cxx:469
 TQDefaultPlotter.cxx:470
 TQDefaultPlotter.cxx:471
 TQDefaultPlotter.cxx:472
 TQDefaultPlotter.cxx:473
 TQDefaultPlotter.cxx:474
 TQDefaultPlotter.cxx:475
 TQDefaultPlotter.cxx:476
 TQDefaultPlotter.cxx:477
 TQDefaultPlotter.cxx:478
 TQDefaultPlotter.cxx:479
 TQDefaultPlotter.cxx:480
 TQDefaultPlotter.cxx:481
 TQDefaultPlotter.cxx:482
 TQDefaultPlotter.cxx:483
 TQDefaultPlotter.cxx:484
 TQDefaultPlotter.cxx:485
 TQDefaultPlotter.cxx:486
 TQDefaultPlotter.cxx:487
 TQDefaultPlotter.cxx:488
 TQDefaultPlotter.cxx:489
 TQDefaultPlotter.cxx:490
 TQDefaultPlotter.cxx:491
 TQDefaultPlotter.cxx:492
 TQDefaultPlotter.cxx:493
 TQDefaultPlotter.cxx:494
 TQDefaultPlotter.cxx:495
 TQDefaultPlotter.cxx:496
 TQDefaultPlotter.cxx:497
 TQDefaultPlotter.cxx:498
 TQDefaultPlotter.cxx:499
 TQDefaultPlotter.cxx:500
 TQDefaultPlotter.cxx:501
 TQDefaultPlotter.cxx:502
 TQDefaultPlotter.cxx:503
 TQDefaultPlotter.cxx:504
 TQDefaultPlotter.cxx:505
 TQDefaultPlotter.cxx:506
 TQDefaultPlotter.cxx:507
 TQDefaultPlotter.cxx:508
 TQDefaultPlotter.cxx:509
 TQDefaultPlotter.cxx:510
 TQDefaultPlotter.cxx:511
 TQDefaultPlotter.cxx:512
 TQDefaultPlotter.cxx:513
 TQDefaultPlotter.cxx:514
 TQDefaultPlotter.cxx:515
 TQDefaultPlotter.cxx:516
 TQDefaultPlotter.cxx:517
 TQDefaultPlotter.cxx:518
 TQDefaultPlotter.cxx:519
 TQDefaultPlotter.cxx:520
 TQDefaultPlotter.cxx:521
 TQDefaultPlotter.cxx:522
 TQDefaultPlotter.cxx:523
 TQDefaultPlotter.cxx:524
 TQDefaultPlotter.cxx:525
 TQDefaultPlotter.cxx:526
 TQDefaultPlotter.cxx:527
 TQDefaultPlotter.cxx:528
 TQDefaultPlotter.cxx:529
 TQDefaultPlotter.cxx:530
 TQDefaultPlotter.cxx:531
 TQDefaultPlotter.cxx:532
 TQDefaultPlotter.cxx:533
 TQDefaultPlotter.cxx:534
 TQDefaultPlotter.cxx:535
 TQDefaultPlotter.cxx:536
 TQDefaultPlotter.cxx:537
 TQDefaultPlotter.cxx:538
 TQDefaultPlotter.cxx:539
 TQDefaultPlotter.cxx:540
 TQDefaultPlotter.cxx:541
 TQDefaultPlotter.cxx:542
 TQDefaultPlotter.cxx:543
 TQDefaultPlotter.cxx:544
 TQDefaultPlotter.cxx:545
 TQDefaultPlotter.cxx:546
 TQDefaultPlotter.cxx:547
 TQDefaultPlotter.cxx:548
 TQDefaultPlotter.cxx:549
 TQDefaultPlotter.cxx:550
 TQDefaultPlotter.cxx:551
 TQDefaultPlotter.cxx:552
 TQDefaultPlotter.cxx:553
 TQDefaultPlotter.cxx:554
 TQDefaultPlotter.cxx:555
 TQDefaultPlotter.cxx:556
 TQDefaultPlotter.cxx:557
 TQDefaultPlotter.cxx:558
 TQDefaultPlotter.cxx:559
 TQDefaultPlotter.cxx:560
 TQDefaultPlotter.cxx:561
 TQDefaultPlotter.cxx:562
 TQDefaultPlotter.cxx:563
 TQDefaultPlotter.cxx:564
 TQDefaultPlotter.cxx:565
 TQDefaultPlotter.cxx:566
 TQDefaultPlotter.cxx:567
 TQDefaultPlotter.cxx:568
 TQDefaultPlotter.cxx:569
 TQDefaultPlotter.cxx:570
 TQDefaultPlotter.cxx:571
 TQDefaultPlotter.cxx:572
 TQDefaultPlotter.cxx:573
 TQDefaultPlotter.cxx:574
 TQDefaultPlotter.cxx:575
 TQDefaultPlotter.cxx:576
 TQDefaultPlotter.cxx:577
 TQDefaultPlotter.cxx:578
 TQDefaultPlotter.cxx:579
 TQDefaultPlotter.cxx:580
 TQDefaultPlotter.cxx:581
 TQDefaultPlotter.cxx:582
 TQDefaultPlotter.cxx:583
 TQDefaultPlotter.cxx:584
 TQDefaultPlotter.cxx:585
 TQDefaultPlotter.cxx:586
 TQDefaultPlotter.cxx:587
 TQDefaultPlotter.cxx:588
 TQDefaultPlotter.cxx:589
 TQDefaultPlotter.cxx:590
 TQDefaultPlotter.cxx:591
 TQDefaultPlotter.cxx:592
 TQDefaultPlotter.cxx:593
 TQDefaultPlotter.cxx:594
 TQDefaultPlotter.cxx:595
 TQDefaultPlotter.cxx:596
 TQDefaultPlotter.cxx:597
 TQDefaultPlotter.cxx:598
 TQDefaultPlotter.cxx:599
 TQDefaultPlotter.cxx:600
 TQDefaultPlotter.cxx:601
 TQDefaultPlotter.cxx:602
 TQDefaultPlotter.cxx:603
 TQDefaultPlotter.cxx:604
 TQDefaultPlotter.cxx:605
 TQDefaultPlotter.cxx:606
 TQDefaultPlotter.cxx:607
 TQDefaultPlotter.cxx:608
 TQDefaultPlotter.cxx:609
 TQDefaultPlotter.cxx:610
 TQDefaultPlotter.cxx:611
 TQDefaultPlotter.cxx:612
 TQDefaultPlotter.cxx:613
 TQDefaultPlotter.cxx:614
 TQDefaultPlotter.cxx:615
 TQDefaultPlotter.cxx:616
 TQDefaultPlotter.cxx:617
 TQDefaultPlotter.cxx:618
 TQDefaultPlotter.cxx:619
 TQDefaultPlotter.cxx:620
 TQDefaultPlotter.cxx:621
 TQDefaultPlotter.cxx:622
 TQDefaultPlotter.cxx:623
 TQDefaultPlotter.cxx:624
 TQDefaultPlotter.cxx:625
 TQDefaultPlotter.cxx:626
 TQDefaultPlotter.cxx:627
 TQDefaultPlotter.cxx:628
 TQDefaultPlotter.cxx:629
 TQDefaultPlotter.cxx:630
 TQDefaultPlotter.cxx:631
 TQDefaultPlotter.cxx:632
 TQDefaultPlotter.cxx:633
 TQDefaultPlotter.cxx:634
 TQDefaultPlotter.cxx:635
 TQDefaultPlotter.cxx:636
 TQDefaultPlotter.cxx:637
 TQDefaultPlotter.cxx:638
 TQDefaultPlotter.cxx:639
 TQDefaultPlotter.cxx:640
 TQDefaultPlotter.cxx:641
 TQDefaultPlotter.cxx:642
 TQDefaultPlotter.cxx:643
 TQDefaultPlotter.cxx:644
 TQDefaultPlotter.cxx:645
 TQDefaultPlotter.cxx:646
 TQDefaultPlotter.cxx:647
 TQDefaultPlotter.cxx:648
 TQDefaultPlotter.cxx:649
 TQDefaultPlotter.cxx:650
 TQDefaultPlotter.cxx:651
 TQDefaultPlotter.cxx:652
 TQDefaultPlotter.cxx:653
 TQDefaultPlotter.cxx:654
 TQDefaultPlotter.cxx:655
 TQDefaultPlotter.cxx:656
 TQDefaultPlotter.cxx:657
 TQDefaultPlotter.cxx:658
 TQDefaultPlotter.cxx:659
 TQDefaultPlotter.cxx:660
 TQDefaultPlotter.cxx:661
 TQDefaultPlotter.cxx:662
 TQDefaultPlotter.cxx:663
 TQDefaultPlotter.cxx:664
 TQDefaultPlotter.cxx:665
 TQDefaultPlotter.cxx:666
 TQDefaultPlotter.cxx:667
 TQDefaultPlotter.cxx:668
 TQDefaultPlotter.cxx:669
 TQDefaultPlotter.cxx:670
 TQDefaultPlotter.cxx:671
 TQDefaultPlotter.cxx:672
 TQDefaultPlotter.cxx:673
 TQDefaultPlotter.cxx:674
 TQDefaultPlotter.cxx:675
 TQDefaultPlotter.cxx:676
 TQDefaultPlotter.cxx:677
 TQDefaultPlotter.cxx:678
 TQDefaultPlotter.cxx:679
 TQDefaultPlotter.cxx:680
 TQDefaultPlotter.cxx:681
 TQDefaultPlotter.cxx:682
 TQDefaultPlotter.cxx:683
 TQDefaultPlotter.cxx:684
 TQDefaultPlotter.cxx:685
 TQDefaultPlotter.cxx:686
 TQDefaultPlotter.cxx:687
 TQDefaultPlotter.cxx:688
 TQDefaultPlotter.cxx:689
 TQDefaultPlotter.cxx:690
 TQDefaultPlotter.cxx:691
 TQDefaultPlotter.cxx:692
 TQDefaultPlotter.cxx:693
 TQDefaultPlotter.cxx:694
 TQDefaultPlotter.cxx:695
 TQDefaultPlotter.cxx:696
 TQDefaultPlotter.cxx:697
 TQDefaultPlotter.cxx:698
 TQDefaultPlotter.cxx:699
 TQDefaultPlotter.cxx:700
 TQDefaultPlotter.cxx:701
 TQDefaultPlotter.cxx:702
 TQDefaultPlotter.cxx:703
 TQDefaultPlotter.cxx:704
 TQDefaultPlotter.cxx:705
 TQDefaultPlotter.cxx:706
 TQDefaultPlotter.cxx:707
 TQDefaultPlotter.cxx:708
 TQDefaultPlotter.cxx:709
 TQDefaultPlotter.cxx:710
 TQDefaultPlotter.cxx:711
 TQDefaultPlotter.cxx:712
 TQDefaultPlotter.cxx:713
 TQDefaultPlotter.cxx:714
 TQDefaultPlotter.cxx:715
 TQDefaultPlotter.cxx:716
 TQDefaultPlotter.cxx:717
 TQDefaultPlotter.cxx:718
 TQDefaultPlotter.cxx:719
 TQDefaultPlotter.cxx:720
 TQDefaultPlotter.cxx:721
 TQDefaultPlotter.cxx:722
 TQDefaultPlotter.cxx:723
 TQDefaultPlotter.cxx:724
 TQDefaultPlotter.cxx:725
 TQDefaultPlotter.cxx:726
 TQDefaultPlotter.cxx:727
 TQDefaultPlotter.cxx:728
 TQDefaultPlotter.cxx:729
 TQDefaultPlotter.cxx:730
 TQDefaultPlotter.cxx:731
 TQDefaultPlotter.cxx:732
 TQDefaultPlotter.cxx:733
 TQDefaultPlotter.cxx:734
 TQDefaultPlotter.cxx:735
 TQDefaultPlotter.cxx:736
 TQDefaultPlotter.cxx:737
 TQDefaultPlotter.cxx:738
 TQDefaultPlotter.cxx:739
 TQDefaultPlotter.cxx:740
 TQDefaultPlotter.cxx:741
 TQDefaultPlotter.cxx:742
 TQDefaultPlotter.cxx:743
 TQDefaultPlotter.cxx:744
 TQDefaultPlotter.cxx:745
 TQDefaultPlotter.cxx:746
 TQDefaultPlotter.cxx:747
 TQDefaultPlotter.cxx:748
 TQDefaultPlotter.cxx:749
 TQDefaultPlotter.cxx:750
 TQDefaultPlotter.cxx:751
 TQDefaultPlotter.cxx:752
 TQDefaultPlotter.cxx:753
 TQDefaultPlotter.cxx:754
 TQDefaultPlotter.cxx:755
 TQDefaultPlotter.cxx:756
 TQDefaultPlotter.cxx:757
 TQDefaultPlotter.cxx:758
 TQDefaultPlotter.cxx:759
 TQDefaultPlotter.cxx:760
 TQDefaultPlotter.cxx:761
 TQDefaultPlotter.cxx:762
 TQDefaultPlotter.cxx:763
 TQDefaultPlotter.cxx:764
 TQDefaultPlotter.cxx:765
 TQDefaultPlotter.cxx:766
 TQDefaultPlotter.cxx:767
 TQDefaultPlotter.cxx:768
 TQDefaultPlotter.cxx:769
 TQDefaultPlotter.cxx:770
 TQDefaultPlotter.cxx:771
 TQDefaultPlotter.cxx:772
 TQDefaultPlotter.cxx:773
 TQDefaultPlotter.cxx:774
 TQDefaultPlotter.cxx:775
 TQDefaultPlotter.cxx:776
 TQDefaultPlotter.cxx:777
 TQDefaultPlotter.cxx:778
 TQDefaultPlotter.cxx:779
 TQDefaultPlotter.cxx:780
 TQDefaultPlotter.cxx:781
 TQDefaultPlotter.cxx:782
 TQDefaultPlotter.cxx:783
 TQDefaultPlotter.cxx:784
 TQDefaultPlotter.cxx:785
 TQDefaultPlotter.cxx:786
 TQDefaultPlotter.cxx:787
 TQDefaultPlotter.cxx:788
 TQDefaultPlotter.cxx:789
 TQDefaultPlotter.cxx:790
 TQDefaultPlotter.cxx:791
 TQDefaultPlotter.cxx:792
 TQDefaultPlotter.cxx:793
 TQDefaultPlotter.cxx:794
 TQDefaultPlotter.cxx:795
 TQDefaultPlotter.cxx:796
 TQDefaultPlotter.cxx:797
 TQDefaultPlotter.cxx:798
 TQDefaultPlotter.cxx:799
 TQDefaultPlotter.cxx:800
 TQDefaultPlotter.cxx:801
 TQDefaultPlotter.cxx:802
 TQDefaultPlotter.cxx:803
 TQDefaultPlotter.cxx:804
 TQDefaultPlotter.cxx:805
 TQDefaultPlotter.cxx:806
 TQDefaultPlotter.cxx:807
 TQDefaultPlotter.cxx:808
 TQDefaultPlotter.cxx:809
 TQDefaultPlotter.cxx:810
 TQDefaultPlotter.cxx:811
 TQDefaultPlotter.cxx:812
 TQDefaultPlotter.cxx:813
 TQDefaultPlotter.cxx:814
 TQDefaultPlotter.cxx:815
 TQDefaultPlotter.cxx:816
 TQDefaultPlotter.cxx:817
 TQDefaultPlotter.cxx:818
 TQDefaultPlotter.cxx:819
 TQDefaultPlotter.cxx:820
 TQDefaultPlotter.cxx:821
 TQDefaultPlotter.cxx:822
 TQDefaultPlotter.cxx:823
 TQDefaultPlotter.cxx:824
 TQDefaultPlotter.cxx:825
 TQDefaultPlotter.cxx:826
 TQDefaultPlotter.cxx:827
 TQDefaultPlotter.cxx:828
 TQDefaultPlotter.cxx:829
 TQDefaultPlotter.cxx:830
 TQDefaultPlotter.cxx:831
 TQDefaultPlotter.cxx:832
 TQDefaultPlotter.cxx:833
 TQDefaultPlotter.cxx:834
 TQDefaultPlotter.cxx:835
 TQDefaultPlotter.cxx:836
 TQDefaultPlotter.cxx:837
 TQDefaultPlotter.cxx:838
 TQDefaultPlotter.cxx:839
 TQDefaultPlotter.cxx:840
 TQDefaultPlotter.cxx:841
 TQDefaultPlotter.cxx:842
 TQDefaultPlotter.cxx:843
 TQDefaultPlotter.cxx:844
 TQDefaultPlotter.cxx:845
 TQDefaultPlotter.cxx:846
 TQDefaultPlotter.cxx:847
 TQDefaultPlotter.cxx:848
 TQDefaultPlotter.cxx:849
 TQDefaultPlotter.cxx:850
 TQDefaultPlotter.cxx:851
 TQDefaultPlotter.cxx:852
 TQDefaultPlotter.cxx:853
 TQDefaultPlotter.cxx:854
 TQDefaultPlotter.cxx:855
 TQDefaultPlotter.cxx:856
 TQDefaultPlotter.cxx:857
 TQDefaultPlotter.cxx:858
 TQDefaultPlotter.cxx:859
 TQDefaultPlotter.cxx:860
 TQDefaultPlotter.cxx:861
 TQDefaultPlotter.cxx:862
 TQDefaultPlotter.cxx:863
 TQDefaultPlotter.cxx:864
 TQDefaultPlotter.cxx:865
 TQDefaultPlotter.cxx:866
 TQDefaultPlotter.cxx:867
 TQDefaultPlotter.cxx:868
 TQDefaultPlotter.cxx:869
 TQDefaultPlotter.cxx:870
 TQDefaultPlotter.cxx:871
 TQDefaultPlotter.cxx:872
 TQDefaultPlotter.cxx:873
 TQDefaultPlotter.cxx:874
 TQDefaultPlotter.cxx:875
 TQDefaultPlotter.cxx:876
 TQDefaultPlotter.cxx:877
 TQDefaultPlotter.cxx:878
 TQDefaultPlotter.cxx:879
 TQDefaultPlotter.cxx:880
 TQDefaultPlotter.cxx:881
 TQDefaultPlotter.cxx:882
 TQDefaultPlotter.cxx:883
 TQDefaultPlotter.cxx:884
 TQDefaultPlotter.cxx:885
 TQDefaultPlotter.cxx:886
 TQDefaultPlotter.cxx:887
 TQDefaultPlotter.cxx:888
 TQDefaultPlotter.cxx:889
 TQDefaultPlotter.cxx:890
 TQDefaultPlotter.cxx:891
 TQDefaultPlotter.cxx:892
 TQDefaultPlotter.cxx:893
 TQDefaultPlotter.cxx:894
 TQDefaultPlotter.cxx:895
 TQDefaultPlotter.cxx:896
 TQDefaultPlotter.cxx:897
 TQDefaultPlotter.cxx:898
 TQDefaultPlotter.cxx:899
 TQDefaultPlotter.cxx:900
 TQDefaultPlotter.cxx:901
 TQDefaultPlotter.cxx:902
 TQDefaultPlotter.cxx:903
 TQDefaultPlotter.cxx:904
 TQDefaultPlotter.cxx:905
 TQDefaultPlotter.cxx:906
 TQDefaultPlotter.cxx:907
 TQDefaultPlotter.cxx:908
 TQDefaultPlotter.cxx:909
 TQDefaultPlotter.cxx:910
 TQDefaultPlotter.cxx:911
 TQDefaultPlotter.cxx:912
 TQDefaultPlotter.cxx:913
 TQDefaultPlotter.cxx:914
 TQDefaultPlotter.cxx:915
 TQDefaultPlotter.cxx:916
 TQDefaultPlotter.cxx:917
 TQDefaultPlotter.cxx:918
 TQDefaultPlotter.cxx:919
 TQDefaultPlotter.cxx:920
 TQDefaultPlotter.cxx:921
 TQDefaultPlotter.cxx:922
 TQDefaultPlotter.cxx:923
 TQDefaultPlotter.cxx:924
 TQDefaultPlotter.cxx:925
 TQDefaultPlotter.cxx:926
 TQDefaultPlotter.cxx:927
 TQDefaultPlotter.cxx:928
 TQDefaultPlotter.cxx:929
 TQDefaultPlotter.cxx:930
 TQDefaultPlotter.cxx:931
 TQDefaultPlotter.cxx:932
 TQDefaultPlotter.cxx:933
 TQDefaultPlotter.cxx:934
 TQDefaultPlotter.cxx:935
 TQDefaultPlotter.cxx:936
 TQDefaultPlotter.cxx:937
 TQDefaultPlotter.cxx:938
 TQDefaultPlotter.cxx:939
 TQDefaultPlotter.cxx:940
 TQDefaultPlotter.cxx:941
 TQDefaultPlotter.cxx:942