ROOT logo
#include "TCanvas.h"
#include <TH1.h>
#include <TF1.h>
#include <TFile.h>
#include <Rtypes.h>
#include <TLegend.h>
#include <TString.h>
#include <TAttMarker.h>
#include <RtypesCint.h>
#include <TNamed.h>
#include "TDirectoryFile.h"
#include <TPRegexp.h>
#include <TGraphAsymmErrors.h>
#include <cfloat>

namespace RawProduction {
  class Output;
}

enum EffVersion { LHC10h_1234_Apr_10 };
EffVersion effVersion = LHC10h_1234_Apr_10;
bool canvHalfWidth=false;
int maxFailedCombined = 0;

TH1* MakeCombinedMethodeProduction(const RawProduction::Output& rawOutput, const TString& trigger="kMB", int fromCent=0, int toCent=10, const TString& pid="All", const TString& graphName="yr1", Color_t color=kBlack, Style_t style=kFullDotSmall);
TH1* MakeCombinedProduction(const RawProduction::Output& rawOutput, const TString& trigger="kMB", int fromCent=0, int toCent=10, const TString& pid="All", const TString& graphName="yr1", Color_t color=kBlack, Style_t style=kFullDotSmall);

TF1* GetEfficiency(const TString& trigger, int fromCent, int toCent, const TString& pid, const TString& methode)
{
  // Dmitri LHC10h Apr. 10 Efficiencies
  // avalible pids: Allcore Disp2core CPVcore Both2core Disp2 All CPV Both2
  if( effVersion == LHC10h_1234_Apr_10 ) {
    if( ! methode.Contains("yr1") ) {
      Printf("ERROR:GetEfficiency: only pol1 efficiancies avalible");
      return 0x0;
    }
    
    // Cent bin defintion as extracted from PHOS_embedding/
    int cent = -1;
    if( 0 == fromCent && 5 == toCent ) cent = 0;
    if( 5 == fromCent && 10 == toCent ) cent = 1;
    if( 10 == fromCent && 20 == toCent ) cent = 2;
    if( 20 == fromCent && 40 == toCent ) cent = 3;
    if( 40 == fromCent && 60 == toCent ) cent = 4;
    if( 60 == fromCent && 80 == toCent ) cent = 5;
    if( cent < 0 ) {
      Printf("ERROR:GetEfficiency not avalible for centrality [%i,%i)", fromCent, toCent);
      return 0x0;
    }
    
    // determine name and return efficiancy function
    TDirectory* pastDir = gDirectory;
    TFile* file = TFile::Open("PHOS_eff_Full_PbPb_1234.root", "READ");
    char funcName[256]; 
    if ( methode.Contains("int") ) 
      sprintf(funcName, "eff_int_Pi0_Gaus_PbPb_%s_cen%i", pid.Data(), cent);
    else 
      sprintf(funcName, "eff_int_Pi0_Gaus_PbPb_%s_cen%i", pid.Data(), cent);
    TF1* func = dynamic_cast<TF1*> ( file->Get(funcName) );
    pastDir->cd();
    
    if( ! func )
      Printf("ERROR:GetEfficiency: efficiancy function %s does not exist", funcName);
    return func;
  }
  return 0x0; // should not be reached
}

TH1* GetRawProduction(const RawProduction::Output& rawOutput, const TString& trigger="kMB", int fromCent=0, int toCent=10,
		      const TString& pid="All", const TString& graphName="yr1", Color_t color=kBlack, Style_t style=kFullDotSmall)
{
  TString newName = Form("raw_%s_%02i-%02i_%s_%s", trigger.Data(), fromCent, toCent, pid.Data(), graphName.Data());
  TH1* hist = dynamic_cast<TH1*> ( gDirectory->Get(newName.Data()) );

  if( ! hist ) {
    TString oldName(Form("%s/c%02i-%02i/%s/%s", trigger.Data(), fromCent, toCent, pid.Data(), graphName.Data()));
    TH1* hist = rawOutput.GetHistogram(oldName.Data());
    hist->SetName(newName.Data());
    hist->SetTitle(Form("%s, %02i-%02i%%, %s", trigger.Data(), fromCent, toCent, graphName.Data()));
    hist->GetXaxis()->SetTitle("p_{T}");
  }
  hist->SetLineColor(color);
  hist->SetMarkerColor(color);
  hist->SetMarkerStyle(style);
  return hist;
}



TH1* MakeProduction(const RawProduction::Output& rawOutput, const TString& trigger="kMB", int fromCent=0, int toCent=10,
		      const TString& pid="All", const TString& methode="yr1", Color_t color=kBlack, Style_t style=kFullDotSmall)
{  
  // First, check if production histogram allready exist in cd.
  TString name = Form("prod_%s_%02i-%02i_%s_%s", trigger.Data(), fromCent, toCent, pid.Data(), methode.Data());
  TH1* hist = dynamic_cast<TH1*> ( gDirectory->Get(name.Data()) );
  
  // Check if combined, The order corresponds to combining methodes then PID.
  if( ! hist ) hist = MakeCombinedProduction(rawOutput, trigger, fromCent, toCent, pid, methode, color, style);
  if( ! hist ) hist = MakeCombinedMethodeProduction(rawOutput, trigger, fromCent, toCent, pid, methode, color, style);
  

  // else clone raw and correct for efficiancy
  if( ! hist ) { 
    const TH1* rawHist = GetRawProduction(rawOutput, trigger, fromCent, toCent, pid, methode, color, style);
    hist = (TH1*) rawHist->Clone(name.Data());
    TF1* efficiency = GetEfficiency(trigger, fromCent, toCent, pid, methode);
    hist->Divide(efficiency, 2*TMath::Pi());
    hist->GetYaxis()->SetTitle("#frac{d^{2}N_{#pi^{0}}}{2#pi p_{T}dp_{T}dy N_{ev}}");
  }
  hist->SetLineColor(color);
  hist->SetMarkerColor(color);
  hist->SetMarkerStyle(style);
  return hist;
}

TH1* CombinePID(const RawProduction::Output& rawOutput, const TString& trigger, int fromCent, int toCent, const TString& combinedPidName, const TString& pids, const TString& methode, Color_t color, Style_t style)
{
  // First, check if production histogram allready exist in cd.
  TString name = Form("prod_%s_%02i-%02i_%s_%s", trigger.Data(), fromCent, toCent, combinedPidName.Data(), methode.Data());
  TH1* hist = dynamic_cast<TH1*> ( gDirectory->Get(name.Data()) );
  if( hist ) return hist;
  
  const int capacity = 16;
  const int nHists = TMath::Min( pids.CountChar(' ')+1, capacity);
  TH1* hists[capacity];
  TStringToken pidst(pids, " ");
  pidst.NextToken();
  const TString firstPID = pidst;
  hists[0] = MakeProduction(rawOutput, trigger, fromCent, toCent, firstPID, methode, color, style);
  int index = 1;
  while( pidst.NextToken() && index < capacity ) {
    hists[index] = MakeProduction(rawOutput, trigger, fromCent, toCent, pidst, methode, color, style);
    ++index;
  }
  TH1* combHist = hists[0]->Clone(name.Data());
  combHist->SetTitle(TString(combHist->GetTitle()).ReplaceAll(firstPID.Data(), combinedPidName.Data()));
  
  for(int ptBin=0; ptBin<combHist->GetNbinsX(); ++ptBin){
    double wmeansum = 0.;
    double sumw = 0.;
    double mins = DBL_MAX;
    int nFailed = 0;
    for(int i=0; i<nHists; ++i) {
      const double x = hists[i]->GetBinContent(ptBin);
      const double s = hists[i]->GetBinError(ptBin);
      if( 0.==x || 0.==s) {
	nFailed++;
	continue;
      }
      const double w = 1./(s*s);
      wmeansum += w*x;
      sumw +=w;
      if( mins > s )
	mins = s;
    }
    if(nFailed > maxFailedCombined) {
      combHist->SetBinContent(ptBin, 0.);
      combHist->SetBinError(ptBin, 0.);
    }
    else {
      const double wmean = wmeansum/sumw;
      combHist->SetBinContent(ptBin, wmean);
      combHist->SetBinError(ptBin, mins);
    }
  }

  return combHist;
}


TH1* MakeCombinedProduction(const RawProduction::Output& rawOutput, const TString& trigger, int fromCent, int toCent, const TString& combinedPidName, const TString& methode, Color_t color, Style_t style)
{
  TString pids;
  if( combinedPidName.Contains("Combcore") )
    pids = "Allcore CPVcore Disp2core Both2core";
  else
    return 0x0;
  
  // First, check if production histogram allready exist in cd.
  TString name = Form("prod_%s_%02i-%02i_%s_%s", trigger.Data(), fromCent, toCent, combinedPidName.Data(), methode.Data());
  TH1* hist = dynamic_cast<TH1*> ( gDirectory->Get(name.Data()) );
  if( hist ) 
    return hist;

  return CombinePID(rawOutput, trigger, fromCent, toCent, combinedPidName, pids, methode, color, style);
}

TH1* MergeMethodes(const RawProduction::Output& rawOutput, const TString& trigger, int fromCent, int toCent, const TString& pid, const TString& combMethodeName, const TString& methodes, Color_t color, Style_t style)
{
  // First, check if production histogram allready exist in cd.
  TString name = Form("prod_%s_%02i-%02i_%s_%s", trigger.Data(), fromCent, toCent, pid.Data(), combMethodeName.Data());
  TH1* hist = dynamic_cast<TH1*> ( gDirectory->Get(name.Data()) );
  if( hist ) return hist;
  
  const int capacity = 16;
  const int nHists = TMath::Min( methodes.CountChar(' ')+1, capacity);
  TH1* hists[capacity];
  TStringToken mst(methodes, " ");
  mst.NextToken();
  const TString firstMethode = mst;
  hists[0] = MakeProduction(rawOutput, trigger, fromCent, toCent, pid, firstMethode, color, style);
  int index = 1;
  while( mst.NextToken() && index < capacity ) {
    hists[index] = MakeProduction(rawOutput, trigger, fromCent, toCent, pid, mst, color, style);
    ++index;
  }
  TH1* combHist = hists[0]->Clone(name.Data());
  combHist->SetTitle(TString(combHist->GetTitle()).ReplaceAll(firstMethode.Data(),combMethodeName.Data()));
  
  for(int ptBin=0; ptBin<combHist->GetNbinsX(); ++ptBin){
    double wmeansum = 0.;
    double sumw = 0.;
    double mins = DBL_MAX;
    int nFailed = 0;
    for(int i=0; i<nHists; ++i) {
      const double x = hists[i]->GetBinContent(ptBin);
      const double s = hists[i]->GetBinError(ptBin);
      if( 0.==x || 0.==s) {
	nFailed++;
	continue;
      }
      const double w = 1./(s*s);
      wmeansum += w*x;
      sumw +=w;
      if( mins > s )
	mins = s;
    }
    if(nFailed > maxFailedCombined) {
      combHist->SetBinContent(ptBin, 0.);
      combHist->SetBinError(ptBin, 0.);
    }
    else {
      const double wmean = wmeansum/sumw;
      combHist->SetBinContent(ptBin, wmean);
      combHist->SetBinError(ptBin, mins);
    }
  }

  return combHist;
}

TH1* MakeCombinedMethodeProduction(const RawProduction::Output& rawOutput, const TString& trigger, int fromCent, int toCent, const TString& pid, const TString& combMethodeName, Color_t color, Style_t style)
{  
  TString methodes;
  if( combMethodeName.EqualTo("yr1comb") )
    methodes = "yr1 yr1int";
  else 
    return 0x0;
 
  // First, check if production histogram allready exist in cd.
  TString name = Form("prod_%s_%02i-%02i_%s_%s", trigger.Data(), fromCent, toCent, pid.Data(), combMethodeName.Data());
  TH1* hist = dynamic_cast<TH1*> ( gDirectory->Get(name.Data()) );
  if( hist ) 
    return hist;

  return MergeMethodes(rawOutput, trigger, fromCent, toCent, pid, combMethodeName, methodes, color, style);
}

TH1* MakeRatio(TH1* h1, TH1* h2, const TString& title ="")
{
  TString name = Form("%s_%s", h1->GetName(), h2->GetName());
  TH1* hist = dynamic_cast<TH1*> ( gDirectory->Get(name.Data()) );
  if( hist )
    return hist;

  hist = (TH1*)h1->Clone(name.Data());
  hist->Divide(h1, h2, 1, 1, "B");
  hist->SetTitle(title.Data());
  hist->GetYaxis()->SetTitle("Ratio");
  return hist;
}


TCanvas* DrawPIDProductionWithRatios(const RawProduction::Output& rawOutput, const TString& trigger,
		       int fromCent, int toCent, const TString& methode="yr1",
		       const TString& pids = TString("Allcore CPVcore Disp2core Both2core"), bool raw = false)
{
  const int capacity = 8;
  const int nHists = TMath::Min( pids.CountChar(' ')+1, capacity);
  TStringToken pidst = TStringToken(pids, " ");
  char pidsa[capacity][64] ={""};
  
  TH1* hists[capacity] = {0x0};
  const Style_t markers[capacity] = {22, 22, 23, 33, 24, 26, 32, 27};
  const Color_t colors[capacity] = {kBlack, kRed, kBlue, kGreen, kGray, kMagenta, kCyan, kOrange};
  
  int index = 0;
  while(pidst.NextToken() && index < capacity) {
    sprintf(pidsa[index], "%s", pidst.Data());
    if(raw)
      hists[index] = GetRawProduction(rawOutput, trigger, fromCent, toCent, pidst, methode, colors[index], markers[index]);
    else
      hists[index] = MakeProduction(rawOutput, trigger, fromCent, toCent, pidst, methode, colors[index], markers[index]);
    index++;
  }
  
  //TString pids_underscore = TString(pids); pids_underscore.ReplaceAll(" ", "_");
  TString key = Form("PIDRatios_%s_c%02i-%02i_%s_%s_raw%i_h%i", trigger.Data(), fromCent, toCent, methode.Data(), TString(pids).ReplaceAll(" ", "_").Data(), raw, canvHalfWidth);
  //TString key = Form("PIDRatios_%s_c%02i-%02i_%s_raw%i", trigger.Data(), fromCent, toCent, methode.Data(), raw);
  
  TCanvas* canv = 0x0;
  if( canvHalfWidth) 
    canv = new TCanvas(key.Data(), key.Data(), 1024/2, 768);
  else 
    canv = new TCanvas(key.Data(), key.Data(), 1024, 768);

  // Direct
  canv->cd();
  TPad *pad1 = new TPad("pad1","pad1",0,0.4,1,1);
  pad1->SetBottomMargin(0);
  pad1->SetLogy();
  pad1->Draw();
  pad1->cd();
  if( canvHalfWidth ) {
    hists[0]->GetYaxis()->SetLabelFont(63); //font in pixels
    hists[0]->GetYaxis()->SetLabelSize(10); //in pixels
    hists[0]->GetYaxis()->SetTitleSize(0.03);
    hists[0]->GetYaxis()->SetTitleOffset(1.2);
  } else {
    hists[0]->GetYaxis()->SetLabelFont(63); //font in pixels
    hists[0]->GetYaxis()->SetLabelSize(20); //in pixels
    hists[0]->GetYaxis()->SetTitleSize(0.055);
    hists[0]->GetYaxis()->SetTitleOffset(0.7);
  }
  if( raw )
    hists[0]->GetYaxis()->SetRangeUser(1.e-7, 1.e1);
  else
    hists[0]->GetYaxis()->SetRangeUser(1.e-6, 1.e3);
  // Draw
  hists[0]->DrawCopy();
  for(int i=1;i<nHists;++i)
    hists[i]->DrawCopy("same");
  // Legend
  TLegend* leg1 = new TLegend(0.7,0.6,0.85,0.88);
  for(int i=0;i<nHists;++i)
    leg1->AddEntry(hists[i], pidsa[i] , "lep");
  leg1->Draw();
  
  // Ratios
  canv->cd();
  TPad *pad2 = new TPad("pad2","pad2",0,0,1,0.4);
  pad2->SetTopMargin(0);
  pad2->Draw();
  pad2->cd();
  pad2->SetGridy();
  TH1* firstRatio = MakeRatio(hists[1], hists[0]);
  if ( raw )
    firstRatio->GetYaxis()->SetRangeUser(0., 2.);
  else
    firstRatio->GetYaxis()->SetRangeUser(0.6, 1.4);
  firstRatio->GetYaxis()->SetTitle("");
  firstRatio->GetYaxis()->SetLabelFont(63); 
  firstRatio->GetYaxis()->SetLabelSize(25);
  firstRatio->GetXaxis()->SetLabelFont(63); 
  firstRatio->GetXaxis()->SetLabelSize(20);
  firstRatio->SetTitle("Ratio");
  // Draw
  firstRatio->DrawCopy("AXIS");
  firstRatio->DrawCopy("AXIGsame");
  firstRatio->DrawCopy("same");
  for(int i=2;i<nHists;++i)
    MakeRatio(hists[i],hists[0])->DrawCopy("same");
  // Ratios
  TLegend* leg2 = new TLegend(0.7,0.63,0.85,0.98);
  for(int i=1;i<nHists;++i)
    leg2->AddEntry(MakeRatio(hists[i],hists[0]), Form("%s/%s", pidsa[i], pidsa[0]), "lep");
  leg2->Draw();
  
  canv->SaveAs(Form("imgs/%s.pdf", key.Data()));
  canv->SaveAs(Form("imgs/%s.png", key.Data()));
  
  return canv;
  //delete canv;
}


TCanvas* DrawMethodeProductionWithRatios(const RawProduction::Output& rawOutput, const TString& trigger,
		       int fromCent, int toCent, const TString& methodes="yr1comb yr1 yr1int",
		       const TString& pid = "Allcore", bool raw = false)
{
  const int capacity = 8;
  const int nHists = TMath::Min( methodes.CountChar(' ')+1, capacity);
  TStringToken methodest = TStringToken(methodes, " ");
  char methodesa[capacity][64] ={""};
  
  TH1* hists[capacity] = {0x0};
  const Style_t markers[capacity] = {22, 22, 23, 33, 24, 26, 32, 27};
  const Color_t colors[capacity] = {kBlack, kRed, kBlue, kGreen, kGray, kMagenta, kCyan, kOrange};
  
  int index = 0;
  while(methodest.NextToken() && index < capacity) {
    sprintf(methodesa[index], "%s", methodest.Data());
    if(raw)
      hists[index] = GetRawProduction(rawOutput, trigger, fromCent, toCent, pid, methodest, colors[index], markers[index]);
    else
      hists[index] = MakeProduction(rawOutput, trigger, fromCent, toCent, pid, methodest, colors[index], markers[index]);
    index++;
  }
  
  TString key = Form("MethodeRatios_%s_c%02i-%02i_%s_%s_raw%i_h%i", trigger.Data(), fromCent, toCent, TString(methodes).ReplaceAll(" ", "_").Data(), pid.Data(), raw, canvHalfWidth);
  
  TCanvas* canv = 0x0;
  if( canvHalfWidth) 
    canv = new TCanvas(key.Data(), key.Data(), 1024/2, 768);
  else 
    canv = new TCanvas(key.Data(), key.Data(), 1024, 768);

  // Direct
  canv->cd();
  TPad *pad1 = new TPad("pad1","pad1",0,0.4,1,1);
  pad1->SetBottomMargin(0);
  pad1->SetLogy();
  pad1->Draw();
  pad1->cd();
  if( canvHalfWidth ) {
    hists[0]->GetYaxis()->SetLabelFont(63); //font in pixels
    hists[0]->GetYaxis()->SetLabelSize(10); //in pixels
    hists[0]->GetYaxis()->SetTitleSize(0.03);
    hists[0]->GetYaxis()->SetTitleOffset(1.2);
  } else {
    hists[0]->GetYaxis()->SetLabelFont(63); //font in pixels
    hists[0]->GetYaxis()->SetLabelSize(20); //in pixels
    hists[0]->GetYaxis()->SetTitleSize(0.055);
    hists[0]->GetYaxis()->SetTitleOffset(0.7);
  }
  if( raw )
    hists[0]->GetYaxis()->SetRangeUser(1.e-7, 1.e1);
  else
    hists[0]->GetYaxis()->SetRangeUser(1.e-6, 1.e3);
  // Draw
  hists[0]->DrawCopy();
  for(int i=1;i<nHists;++i)
    hists[i]->DrawCopy("same");
  // Legend
  TLegend* leg1 = new TLegend(0.7,0.6,0.85,0.88);
  for(int i=0;i<nHists;++i)
    leg1->AddEntry(hists[i], methodesa[i] , "lep");
  leg1->Draw();
  
  // Ratios
  canv->cd();
  TPad *pad2 = new TPad("pad2","pad2",0,0,1,0.4);
  pad2->SetTopMargin(0);
  pad2->Draw();
  pad2->cd();
  pad2->SetGridy();
  TH1* firstRatio = MakeRatio(hists[1], hists[0]);
  if ( raw )
    firstRatio->GetYaxis()->SetRangeUser(0., 2.);
  else
    firstRatio->GetYaxis()->SetRangeUser(0.6, 1.4);
  firstRatio->GetYaxis()->SetTitle("");
  firstRatio->GetYaxis()->SetLabelFont(63); 
  firstRatio->GetYaxis()->SetLabelSize(25);
  firstRatio->GetXaxis()->SetLabelFont(63); 
  firstRatio->GetXaxis()->SetLabelSize(20);
  firstRatio->SetTitle("Ratio");
  // Draw
  firstRatio->DrawCopy("AXIS");
  firstRatio->DrawCopy("AXIGsame");
  firstRatio->DrawCopy("same");
  for(int i=2;i<nHists;++i)
    MakeRatio(hists[i],hists[0])->DrawCopy("same");
  // Ratios
  TLegend* leg2 = new TLegend(0.7,0.63,0.85,0.98);
  for(int i=1;i<nHists;++i)
    leg2->AddEntry(MakeRatio(hists[i],hists[0]), Form("%s/%s", methodesa[i], methodesa[0]), "lep");
  leg2->Draw();
  
  canv->SaveAs(Form("imgs/%s.pdf", key.Data()));
  canv->SaveAs(Form("imgs/%s.png", key.Data()));
  
  return canv;
  //delete canv;
}

TGraphAsymmErrors* GetPWWGACombinedYield(int fromCent, int toCent, const TString& detector = "")
{
  // detector may be "", "PHOS, "PCM"

  // InvYieldPbPbStatErr_4060
  // InvYieldPbPbPHOSStatErr_0010
  const TString graphName = Form("InvYieldPbPb%sStatErr_%02i%02i", detector.Data(), fromCent, toCent);

  const TString fileName = "CombinedResultsPbPb.root";
  TFile* file = TFile::Open(fileName.Data());
  TGraphAsymmErrors* graph = dynamic_cast<TGraphAsymmErrors*> ( file->Get(graphName.Data()) );
  
  if( ! graph )
    Printf("ERROR: GetPWWGACombinedYield(%i,%i,%s): %s was not found", fromCent, toCent, detector.Data(), graphName.Data());

  return graph;
}


void CompareToPWGGA(const RawProduction::Output& rawOutput, const TString& trigger, int fromCent, int toCent, 
		    const TString& methode="yr1comb", const TString& pid = "Combcore", const TString& detector="")
{
  TGraphAsymmErrors* pwgGraph =  GetPWWGACombinedYield(fromCent, toCent, detector);
  TH1* production = MakeProduction(rawOutput, trigger, fromCent, toCent, pid, methode, kRed, kFullDotMedium);
  TString name = Form("pwggaRatio%s_%s", detector.Data(), production->GetName());
  TH1* hRatio = production->Clone(name.Data());
  TString detStr = detector;
  if( detStr.EqualTo("") ) detStr = "Combined PWGGA (PHOS+PCM)";
  hRatio->SetTitle(Form("%s vs %s", hRatio->GetTitle(), detStr.Data()));
  hRatio->GetYaxis()->SetTitle(Form("PHOS 11h (10h eff.) / %s", detStr.Data()));
  
  
  TString canvName = Form("PWGGAprod%s_%s", detector.Data(), production->GetName());
  TCanvas* canv = new TCanvas(canvName.Data(), canvName.Data(), 1024, 768);
  production->GetYaxis()->SetRangeUser(1.e-6, 1.e3);
  canv->SetLogy();
  production->Draw();
  pwgGraph->Draw();
  TLegend* leg = new TLegend(0.4,0.7,0.85,0.88);
  leg->AddEntry(production, "11h (10h eff.)", "lep");
  leg->AddEntry(pwgGraph, Form("10h %s", detStr.Data()), "lep");
  leg->Draw();
  canv->SaveAs(Form("imgs/%s.png", canvName.Data()));
  canv->SaveAs(Form("imgs/%s.pdf", canvName.Data()));
  
  
  for(int ptBin=1; ptBin <production->GetNbinsX(); ptBin++) {
    int graphBin = ptBin-3;
    if( graphBin >= 0 && pwgGraph->GetN() > ptBin ) {
      //Printf("%f %f %f", production->GetBinLowEdge(ptBin), pwgGraph->GetX()[graphBin], production->GetBinLowEdge(ptBin+1));
      double p = production->GetBinContent(ptBin);
      double p_e = production->GetBinError(ptBin);
      double pwgP = pwgGraph->GetY()[graphBin];
      double pwgP_e = (pwgGraph->GetEYlow()[graphBin] + pwgGraph->GetEYhigh()[graphBin])/2;
      if( 0. != p && 0. != pwgP) {
	double ratio = p/pwgP;
	double ratio_e = TMath::Sqrt((p_e*p_e + pwgP_e*pwgP_e*p/pwgP)/pwgP);
	//Printf("%f %f - %f", p, pwgP, ratio);
	hRatio->SetBinContent(ptBin, ratio);
	hRatio->SetBinError(ptBin, ratio_e);
      }
      else {
	hRatio->SetBinContent(ptBin, 0.);
	hRatio->SetBinError(ptBin, 0.);
      }
    }
    else {
      hRatio->SetBinContent(ptBin, 0.);
      hRatio->SetBinError(ptBin, 0.);
    }
  }
  TString canvRName = Form("PWGGAratio%s_%s", detector.Data(), production->GetName());
  TCanvas* canvRatio = new TCanvas(canvRName.Data(), canvRName.Data(), 1024, 768);;
  canvRatio->SetLogy();
  hRatio->GetYaxis()->SetRangeUser(0.1, 5.);
  hRatio->Draw();
  canvRatio->SaveAs(Form("imgs/%s.png", canvRName.Data()));
  canvRatio->SaveAs(Form("imgs/%s.pdf", canvRName.Data()));
}

void DrawPIDRatios(const RawProduction::Output& rawOutput)
{
  const int nCent = 2;
  int centBins[nCent][2] = {{0,5}, {5,10}/*, {10,20}, {20,40}, {40,60}, {60,80}*/};
  TStringToken methodes("yr1 yr1int", " ");
  while( methodes.NextToken() ) {
    for(int ic=0; ic<nCent; ++ic) {
      DrawPIDProductionWithRatios(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], methodes.Data(), "Allcore CPVcore Disp2core Both2core All CPV Disp2 Both2", true );
      DrawPIDProductionWithRatios(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], methodes.Data(), "Allcore CPVcore Disp2core Both2core All CPV Disp2 Both2", false );
      DrawPIDProductionWithRatios(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], methodes.Data(), "Allcore CPVcore Disp2core Both2core", true );
      DrawPIDProductionWithRatios(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], methodes.Data(), "Allcore CPVcore Disp2core Both2core", false );
      DrawPIDProductionWithRatios(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], methodes.Data(), "All Disp2 CPV Both2 Allcore", true );
      DrawPIDProductionWithRatios(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], methodes.Data(), "All Disp2 CPV Both2 Allcore", false );
    }
  }
}

void DrawPIDRatiosCombined(const RawProduction::Output& rawOutput)
{
  const int nCent = 2;
  int centBins[nCent][2] = {{0,5}, {5,10}/*, {10,20}, {20,40}, {40,60}, {60,80}*/};
  TStringToken methodes("yr1comb", " ");
  while( methodes.NextToken() ) {
    for(int ic=0; ic<nCent; ++ic) {
      DrawPIDProductionWithRatios(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], methodes.Data(), "Allcore CPVcore Disp2core Both2core All CPV Disp2 Both2", false );
      DrawPIDProductionWithRatios(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], methodes.Data(), "Allcore CPVcore Disp2core Both2core", false );
      DrawPIDProductionWithRatios(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], methodes.Data(), "Combcore Allcore CPVcore Disp2core Both2core", false );
      DrawPIDProductionWithRatios(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], methodes.Data(), "All Disp2 CPV Both2 Allcore", false );
    }
  }
}

void DrawMethodeRatios(const RawProduction::Output& rawOutput)
{
  const int nCent = 2;
  int centBins[nCent][2] = {{0,5}, {5,10}/*, {10,20}, {20,40}, {40,60}, {60,80}*/};
  TStringToken pids("Allcore CPVcore Disp2core Both2core", " ");
  while( pids.NextToken() ) {
    for(int ic=0; ic<nCent; ++ic) {
      DrawMethodeProductionWithRatios(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], "yr1comb yr1 yr1int", pids, false );
    }
  }
}

void ComparePWGGA(const RawProduction::Output& rawOutput)
{
  const int nCent = 2;
  int centBins[nCent][2] = {{0,5}, {5,10}/*, {10,20}, {20,40}, {40,60}, {60,80}*/};
  for(int ic=0; ic<nCent; ++ic) {// TODO: return to "<nCent"
    CompareToPWGGA(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], "yr1comb", "Combcore");
    CompareToPWGGA(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], "yr1comb", "Combcore", "PHOS");
    CompareToPWGGA(rawOutput, "kCentral", centBins[ic][0], centBins[ic][1], "yr1comb", "Combcore", "PCM");
  }
}


void DrawProduction()
{
  gROOT->LoadMacro("MakeRawProduction.C+g");
  RawProduction::Output rawOutput;
  gStyle->SetOptStat(0);
  
  ComparePWGGA(rawOutput);
  
  DrawMethodeRatios(rawOutput);
  DrawPIDRatiosCombined(rawOutput);
  
  canvHalfWidth = true;
  DrawPIDRatios(rawOutput);
}
 DrawProduction.C:1
 DrawProduction.C:2
 DrawProduction.C:3
 DrawProduction.C:4
 DrawProduction.C:5
 DrawProduction.C:6
 DrawProduction.C:7
 DrawProduction.C:8
 DrawProduction.C:9
 DrawProduction.C:10
 DrawProduction.C:11
 DrawProduction.C:12
 DrawProduction.C:13
 DrawProduction.C:14
 DrawProduction.C:15
 DrawProduction.C:16
 DrawProduction.C:17
 DrawProduction.C:18
 DrawProduction.C:19
 DrawProduction.C:20
 DrawProduction.C:21
 DrawProduction.C:22
 DrawProduction.C:23
 DrawProduction.C:24
 DrawProduction.C:25
 DrawProduction.C:26
 DrawProduction.C:27
 DrawProduction.C:28
 DrawProduction.C:29
 DrawProduction.C:30
 DrawProduction.C:31
 DrawProduction.C:32
 DrawProduction.C:33
 DrawProduction.C:34
 DrawProduction.C:35
 DrawProduction.C:36
 DrawProduction.C:37
 DrawProduction.C:38
 DrawProduction.C:39
 DrawProduction.C:40
 DrawProduction.C:41
 DrawProduction.C:42
 DrawProduction.C:43
 DrawProduction.C:44
 DrawProduction.C:45
 DrawProduction.C:46
 DrawProduction.C:47
 DrawProduction.C:48
 DrawProduction.C:49
 DrawProduction.C:50
 DrawProduction.C:51
 DrawProduction.C:52
 DrawProduction.C:53
 DrawProduction.C:54
 DrawProduction.C:55
 DrawProduction.C:56
 DrawProduction.C:57
 DrawProduction.C:58
 DrawProduction.C:59
 DrawProduction.C:60
 DrawProduction.C:61
 DrawProduction.C:62
 DrawProduction.C:63
 DrawProduction.C:64
 DrawProduction.C:65
 DrawProduction.C:66
 DrawProduction.C:67
 DrawProduction.C:68
 DrawProduction.C:69
 DrawProduction.C:70
 DrawProduction.C:71
 DrawProduction.C:72
 DrawProduction.C:73
 DrawProduction.C:74
 DrawProduction.C:75
 DrawProduction.C:76
 DrawProduction.C:77
 DrawProduction.C:78
 DrawProduction.C:79
 DrawProduction.C:80
 DrawProduction.C:81
 DrawProduction.C:82
 DrawProduction.C:83
 DrawProduction.C:84
 DrawProduction.C:85
 DrawProduction.C:86
 DrawProduction.C:87
 DrawProduction.C:88
 DrawProduction.C:89
 DrawProduction.C:90
 DrawProduction.C:91
 DrawProduction.C:92
 DrawProduction.C:93
 DrawProduction.C:94
 DrawProduction.C:95
 DrawProduction.C:96
 DrawProduction.C:97
 DrawProduction.C:98
 DrawProduction.C:99
 DrawProduction.C:100
 DrawProduction.C:101
 DrawProduction.C:102
 DrawProduction.C:103
 DrawProduction.C:104
 DrawProduction.C:105
 DrawProduction.C:106
 DrawProduction.C:107
 DrawProduction.C:108
 DrawProduction.C:109
 DrawProduction.C:110
 DrawProduction.C:111
 DrawProduction.C:112
 DrawProduction.C:113
 DrawProduction.C:114
 DrawProduction.C:115
 DrawProduction.C:116
 DrawProduction.C:117
 DrawProduction.C:118
 DrawProduction.C:119
 DrawProduction.C:120
 DrawProduction.C:121
 DrawProduction.C:122
 DrawProduction.C:123
 DrawProduction.C:124
 DrawProduction.C:125
 DrawProduction.C:126
 DrawProduction.C:127
 DrawProduction.C:128
 DrawProduction.C:129
 DrawProduction.C:130
 DrawProduction.C:131
 DrawProduction.C:132
 DrawProduction.C:133
 DrawProduction.C:134
 DrawProduction.C:135
 DrawProduction.C:136
 DrawProduction.C:137
 DrawProduction.C:138
 DrawProduction.C:139
 DrawProduction.C:140
 DrawProduction.C:141
 DrawProduction.C:142
 DrawProduction.C:143
 DrawProduction.C:144
 DrawProduction.C:145
 DrawProduction.C:146
 DrawProduction.C:147
 DrawProduction.C:148
 DrawProduction.C:149
 DrawProduction.C:150
 DrawProduction.C:151
 DrawProduction.C:152
 DrawProduction.C:153
 DrawProduction.C:154
 DrawProduction.C:155
 DrawProduction.C:156
 DrawProduction.C:157
 DrawProduction.C:158
 DrawProduction.C:159
 DrawProduction.C:160
 DrawProduction.C:161
 DrawProduction.C:162
 DrawProduction.C:163
 DrawProduction.C:164
 DrawProduction.C:165
 DrawProduction.C:166
 DrawProduction.C:167
 DrawProduction.C:168
 DrawProduction.C:169
 DrawProduction.C:170
 DrawProduction.C:171
 DrawProduction.C:172
 DrawProduction.C:173
 DrawProduction.C:174
 DrawProduction.C:175
 DrawProduction.C:176
 DrawProduction.C:177
 DrawProduction.C:178
 DrawProduction.C:179
 DrawProduction.C:180
 DrawProduction.C:181
 DrawProduction.C:182
 DrawProduction.C:183
 DrawProduction.C:184
 DrawProduction.C:185
 DrawProduction.C:186
 DrawProduction.C:187
 DrawProduction.C:188
 DrawProduction.C:189
 DrawProduction.C:190
 DrawProduction.C:191
 DrawProduction.C:192
 DrawProduction.C:193
 DrawProduction.C:194
 DrawProduction.C:195
 DrawProduction.C:196
 DrawProduction.C:197
 DrawProduction.C:198
 DrawProduction.C:199
 DrawProduction.C:200
 DrawProduction.C:201
 DrawProduction.C:202
 DrawProduction.C:203
 DrawProduction.C:204
 DrawProduction.C:205
 DrawProduction.C:206
 DrawProduction.C:207
 DrawProduction.C:208
 DrawProduction.C:209
 DrawProduction.C:210
 DrawProduction.C:211
 DrawProduction.C:212
 DrawProduction.C:213
 DrawProduction.C:214
 DrawProduction.C:215
 DrawProduction.C:216
 DrawProduction.C:217
 DrawProduction.C:218
 DrawProduction.C:219
 DrawProduction.C:220
 DrawProduction.C:221
 DrawProduction.C:222
 DrawProduction.C:223
 DrawProduction.C:224
 DrawProduction.C:225
 DrawProduction.C:226
 DrawProduction.C:227
 DrawProduction.C:228
 DrawProduction.C:229
 DrawProduction.C:230
 DrawProduction.C:231
 DrawProduction.C:232
 DrawProduction.C:233
 DrawProduction.C:234
 DrawProduction.C:235
 DrawProduction.C:236
 DrawProduction.C:237
 DrawProduction.C:238
 DrawProduction.C:239
 DrawProduction.C:240
 DrawProduction.C:241
 DrawProduction.C:242
 DrawProduction.C:243
 DrawProduction.C:244
 DrawProduction.C:245
 DrawProduction.C:246
 DrawProduction.C:247
 DrawProduction.C:248
 DrawProduction.C:249
 DrawProduction.C:250
 DrawProduction.C:251
 DrawProduction.C:252
 DrawProduction.C:253
 DrawProduction.C:254
 DrawProduction.C:255
 DrawProduction.C:256
 DrawProduction.C:257
 DrawProduction.C:258
 DrawProduction.C:259
 DrawProduction.C:260
 DrawProduction.C:261
 DrawProduction.C:262
 DrawProduction.C:263
 DrawProduction.C:264
 DrawProduction.C:265
 DrawProduction.C:266
 DrawProduction.C:267
 DrawProduction.C:268
 DrawProduction.C:269
 DrawProduction.C:270
 DrawProduction.C:271
 DrawProduction.C:272
 DrawProduction.C:273
 DrawProduction.C:274
 DrawProduction.C:275
 DrawProduction.C:276
 DrawProduction.C:277
 DrawProduction.C:278
 DrawProduction.C:279
 DrawProduction.C:280
 DrawProduction.C:281
 DrawProduction.C:282
 DrawProduction.C:283
 DrawProduction.C:284
 DrawProduction.C:285
 DrawProduction.C:286
 DrawProduction.C:287
 DrawProduction.C:288
 DrawProduction.C:289
 DrawProduction.C:290
 DrawProduction.C:291
 DrawProduction.C:292
 DrawProduction.C:293
 DrawProduction.C:294
 DrawProduction.C:295
 DrawProduction.C:296
 DrawProduction.C:297
 DrawProduction.C:298
 DrawProduction.C:299
 DrawProduction.C:300
 DrawProduction.C:301
 DrawProduction.C:302
 DrawProduction.C:303
 DrawProduction.C:304
 DrawProduction.C:305
 DrawProduction.C:306
 DrawProduction.C:307
 DrawProduction.C:308
 DrawProduction.C:309
 DrawProduction.C:310
 DrawProduction.C:311
 DrawProduction.C:312
 DrawProduction.C:313
 DrawProduction.C:314
 DrawProduction.C:315
 DrawProduction.C:316
 DrawProduction.C:317
 DrawProduction.C:318
 DrawProduction.C:319
 DrawProduction.C:320
 DrawProduction.C:321
 DrawProduction.C:322
 DrawProduction.C:323
 DrawProduction.C:324
 DrawProduction.C:325
 DrawProduction.C:326
 DrawProduction.C:327
 DrawProduction.C:328
 DrawProduction.C:329
 DrawProduction.C:330
 DrawProduction.C:331
 DrawProduction.C:332
 DrawProduction.C:333
 DrawProduction.C:334
 DrawProduction.C:335
 DrawProduction.C:336
 DrawProduction.C:337
 DrawProduction.C:338
 DrawProduction.C:339
 DrawProduction.C:340
 DrawProduction.C:341
 DrawProduction.C:342
 DrawProduction.C:343
 DrawProduction.C:344
 DrawProduction.C:345
 DrawProduction.C:346
 DrawProduction.C:347
 DrawProduction.C:348
 DrawProduction.C:349
 DrawProduction.C:350
 DrawProduction.C:351
 DrawProduction.C:352
 DrawProduction.C:353
 DrawProduction.C:354
 DrawProduction.C:355
 DrawProduction.C:356
 DrawProduction.C:357
 DrawProduction.C:358
 DrawProduction.C:359
 DrawProduction.C:360
 DrawProduction.C:361
 DrawProduction.C:362
 DrawProduction.C:363
 DrawProduction.C:364
 DrawProduction.C:365
 DrawProduction.C:366
 DrawProduction.C:367
 DrawProduction.C:368
 DrawProduction.C:369
 DrawProduction.C:370
 DrawProduction.C:371
 DrawProduction.C:372
 DrawProduction.C:373
 DrawProduction.C:374
 DrawProduction.C:375
 DrawProduction.C:376
 DrawProduction.C:377
 DrawProduction.C:378
 DrawProduction.C:379
 DrawProduction.C:380
 DrawProduction.C:381
 DrawProduction.C:382
 DrawProduction.C:383
 DrawProduction.C:384
 DrawProduction.C:385
 DrawProduction.C:386
 DrawProduction.C:387
 DrawProduction.C:388
 DrawProduction.C:389
 DrawProduction.C:390
 DrawProduction.C:391
 DrawProduction.C:392
 DrawProduction.C:393
 DrawProduction.C:394
 DrawProduction.C:395
 DrawProduction.C:396
 DrawProduction.C:397
 DrawProduction.C:398
 DrawProduction.C:399
 DrawProduction.C:400
 DrawProduction.C:401
 DrawProduction.C:402
 DrawProduction.C:403
 DrawProduction.C:404
 DrawProduction.C:405
 DrawProduction.C:406
 DrawProduction.C:407
 DrawProduction.C:408
 DrawProduction.C:409
 DrawProduction.C:410
 DrawProduction.C:411
 DrawProduction.C:412
 DrawProduction.C:413
 DrawProduction.C:414
 DrawProduction.C:415
 DrawProduction.C:416
 DrawProduction.C:417
 DrawProduction.C:418
 DrawProduction.C:419
 DrawProduction.C:420
 DrawProduction.C:421
 DrawProduction.C:422
 DrawProduction.C:423
 DrawProduction.C:424
 DrawProduction.C:425
 DrawProduction.C:426
 DrawProduction.C:427
 DrawProduction.C:428
 DrawProduction.C:429
 DrawProduction.C:430
 DrawProduction.C:431
 DrawProduction.C:432
 DrawProduction.C:433
 DrawProduction.C:434
 DrawProduction.C:435
 DrawProduction.C:436
 DrawProduction.C:437
 DrawProduction.C:438
 DrawProduction.C:439
 DrawProduction.C:440
 DrawProduction.C:441
 DrawProduction.C:442
 DrawProduction.C:443
 DrawProduction.C:444
 DrawProduction.C:445
 DrawProduction.C:446
 DrawProduction.C:447
 DrawProduction.C:448
 DrawProduction.C:449
 DrawProduction.C:450
 DrawProduction.C:451
 DrawProduction.C:452
 DrawProduction.C:453
 DrawProduction.C:454
 DrawProduction.C:455
 DrawProduction.C:456
 DrawProduction.C:457
 DrawProduction.C:458
 DrawProduction.C:459
 DrawProduction.C:460
 DrawProduction.C:461
 DrawProduction.C:462
 DrawProduction.C:463
 DrawProduction.C:464
 DrawProduction.C:465
 DrawProduction.C:466
 DrawProduction.C:467
 DrawProduction.C:468
 DrawProduction.C:469
 DrawProduction.C:470
 DrawProduction.C:471
 DrawProduction.C:472
 DrawProduction.C:473
 DrawProduction.C:474
 DrawProduction.C:475
 DrawProduction.C:476
 DrawProduction.C:477
 DrawProduction.C:478
 DrawProduction.C:479
 DrawProduction.C:480
 DrawProduction.C:481
 DrawProduction.C:482
 DrawProduction.C:483
 DrawProduction.C:484
 DrawProduction.C:485
 DrawProduction.C:486
 DrawProduction.C:487
 DrawProduction.C:488
 DrawProduction.C:489
 DrawProduction.C:490
 DrawProduction.C:491
 DrawProduction.C:492
 DrawProduction.C:493
 DrawProduction.C:494
 DrawProduction.C:495
 DrawProduction.C:496
 DrawProduction.C:497
 DrawProduction.C:498
 DrawProduction.C:499
 DrawProduction.C:500
 DrawProduction.C:501
 DrawProduction.C:502
 DrawProduction.C:503
 DrawProduction.C:504
 DrawProduction.C:505
 DrawProduction.C:506
 DrawProduction.C:507
 DrawProduction.C:508
 DrawProduction.C:509
 DrawProduction.C:510
 DrawProduction.C:511
 DrawProduction.C:512
 DrawProduction.C:513
 DrawProduction.C:514
 DrawProduction.C:515
 DrawProduction.C:516
 DrawProduction.C:517
 DrawProduction.C:518
 DrawProduction.C:519
 DrawProduction.C:520
 DrawProduction.C:521
 DrawProduction.C:522
 DrawProduction.C:523
 DrawProduction.C:524
 DrawProduction.C:525
 DrawProduction.C:526
 DrawProduction.C:527
 DrawProduction.C:528
 DrawProduction.C:529
 DrawProduction.C:530
 DrawProduction.C:531
 DrawProduction.C:532
 DrawProduction.C:533
 DrawProduction.C:534
 DrawProduction.C:535
 DrawProduction.C:536
 DrawProduction.C:537
 DrawProduction.C:538
 DrawProduction.C:539
 DrawProduction.C:540
 DrawProduction.C:541
 DrawProduction.C:542
 DrawProduction.C:543
 DrawProduction.C:544
 DrawProduction.C:545
 DrawProduction.C:546
 DrawProduction.C:547
 DrawProduction.C:548
 DrawProduction.C:549
 DrawProduction.C:550
 DrawProduction.C:551
 DrawProduction.C:552
 DrawProduction.C:553
 DrawProduction.C:554
 DrawProduction.C:555
 DrawProduction.C:556
 DrawProduction.C:557
 DrawProduction.C:558
 DrawProduction.C:559
 DrawProduction.C:560
 DrawProduction.C:561
 DrawProduction.C:562
 DrawProduction.C:563
 DrawProduction.C:564
 DrawProduction.C:565
 DrawProduction.C:566
 DrawProduction.C:567
 DrawProduction.C:568
 DrawProduction.C:569
 DrawProduction.C:570
 DrawProduction.C:571
 DrawProduction.C:572
 DrawProduction.C:573
 DrawProduction.C:574
 DrawProduction.C:575
 DrawProduction.C:576
 DrawProduction.C:577
 DrawProduction.C:578
 DrawProduction.C:579
 DrawProduction.C:580
 DrawProduction.C:581
 DrawProduction.C:582
 DrawProduction.C:583
 DrawProduction.C:584
 DrawProduction.C:585
 DrawProduction.C:586
 DrawProduction.C:587
 DrawProduction.C:588
 DrawProduction.C:589
 DrawProduction.C:590
 DrawProduction.C:591
 DrawProduction.C:592
 DrawProduction.C:593
 DrawProduction.C:594
 DrawProduction.C:595
 DrawProduction.C:596
 DrawProduction.C:597
 DrawProduction.C:598
 DrawProduction.C:599
 DrawProduction.C:600
 DrawProduction.C:601
 DrawProduction.C:602
 DrawProduction.C:603
 DrawProduction.C:604
 DrawProduction.C:605
 DrawProduction.C:606
 DrawProduction.C:607
 DrawProduction.C:608
 DrawProduction.C:609
 DrawProduction.C:610
 DrawProduction.C:611
 DrawProduction.C:612
 DrawProduction.C:613
 DrawProduction.C:614
 DrawProduction.C:615
 DrawProduction.C:616
 DrawProduction.C:617
 DrawProduction.C:618
 DrawProduction.C:619
 DrawProduction.C:620
 DrawProduction.C:621
 DrawProduction.C:622
 DrawProduction.C:623
 DrawProduction.C:624
 DrawProduction.C:625
 DrawProduction.C:626
 DrawProduction.C:627