ROOT logo
#include <TH1.h>
#include <TMath.h>
#include <TLegend.h>


namespace RawProduction {
  class Output;
}

const int nFrom=4;
const int nTo=4;
float fromRanges[nFrom] = {0.04, 0.05, 0.07, 0.10};
float toRanges[nTo] = {0.20, 0.25, 0.30, 0.40};
RawProduction::Output* output[nFrom][nTo] = {0};

const Double_t maxyPlot = 5., minyPlot = 1.e-3;
const Double_t minReasonableY=1.e-7;

TH1* GetHist(RawProduction::Output* out, const char* trigger, const char* pid, int cent, const char* methode)
{
  //TH1* hist[4][4] = {0};
  char name[256];
  sprintf(name, "%s/c%03i/%s/%s", trigger, cent, pid, methode);
  return out->GetHistogram(name);
}

void SetVariation(TH1* hist, const char* trigger, const char* pid, int cent, const char* methode)
{
  for(int ptb=1; ptb <= hist->GetNbinsX(); ++ptb) {
    int rejected =0;
    Double_t y[nFrom][nTo] = {0};
    for(int fidx=0; fidx<nFrom; fidx++) {
      for(int tidx=0; tidx<nTo; tidx++) {
	TH1* fthist = GetHist(output[fidx][tidx], trigger, pid, cent, methode);
	if( 0. == fthist->GetBinContent(ptb) )
	  rejected++;
	y[fidx][tidx] = fthist->GetBinContent(ptb);
      }
    }
    if( 0 == rejected ) {
      Double_t N = (nFrom*nTo);
      Double_t m = TMath::Mean(N, (Double_t*)y);
      Double_t s = TMath::RMS(N, (Double_t*)y)*TMath::Sqrt(N/(N-1));
      Double_t s_rel = s/m;
      Double_t e_s_rel = s_rel / TMath::Sqrt(2*(N-1));
      hist->SetBinContent(ptb, s_rel);
      hist->SetBinError(ptb, e_s_rel);
      //Printf("%f %f", s_rel, e_s_rel);
    }
    else {
      hist->SetBinContent(ptb, 0.);
      hist->SetBinError(ptb, 0.);
    }
  }
  if( hist->GetMaximum() > maxyPlot )
    Printf("Warning, maximum of %s is %e, larger range max: %e", hist->GetName(), hist->GetMaximum(), maxyPlot);
  if( hist->GetMinimum(minReasonableY) < minyPlot)
    Printf("Warning, minimum of %s is %e, larger range min: %e", hist->GetName(), hist->GetMinimum(minReasonableY), minyPlot);
}

void DrawVar(const char* trigger, const char* pid, int cent)
{
  gStyle->SetOptStat(0);
  TString name = Form("%s_%s_c%03i", trigger, pid, cent);
  TCanvas* canv = new TCanvas(name.Data(), name.Data());
  
  TLegend* leg = new TLegend(0.87, 0.12, 0.99,0.32);
  
  // yr1
  TH1* hist = (TH1*)GetHist(output[0][0], trigger, pid, cent, "yr1")->Clone(Form("%s_%s_c%03i_yr1", trigger, pid, cent));
  hist->SetTitle(Form("Variation of peak position with fit Range, %s, %s, %s", trigger, pid, RawProduction::GetCentString(cent)));
  SetVariation(hist, trigger, pid, cent, "yr1");
  hist->GetXaxis()->SetTitle("p_T [GeV/c]");
  hist->GetYaxis()->SetTitle("#frac{s}{#bar #hat #mu}");
  canv->SetLogy();
  hist->GetYaxis()->SetRangeUser(minyPlot, maxyPlot);
  hist->SetMarkerStyle(21);
  leg->AddEntry(hist, "yr1", "lep");
  hist->DrawCopy("E");
    
  // yr2
  hist = (TH1*)GetHist(output[0][0], trigger, pid, cent, "yr2")->Clone(Form("%s_%s_c%03i_yr2", trigger, pid, cent));
  SetVariation(hist, trigger, pid, cent, "yr2");
  hist->SetMarkerStyle(23);
  hist->SetMarkerColor(kRed);
  hist->SetLineColor(kRed);
  leg->AddEntry(hist, "yr2", "lep");
  hist->Draw("same");
  
  // yr1int
  hist = (TH1*)GetHist(output[0][0], trigger, pid, cent, "yr1int")->Clone(Form("%s_%s_c%03i_yr1int", trigger, pid, cent));
  SetVariation(hist, trigger, pid, cent, "yr1int");
  hist->SetMarkerStyle(24);
  hist->SetMarkerColor(kGreen);
  hist->SetLineColor(kGreen);
  leg->AddEntry(hist, "yr1int", "lep");
  hist->Draw("same");

  // yr2int
  hist = (TH1*)GetHist(output[0][0], trigger, pid, cent, "yr2int")->Clone(Form("%s_%s_c%03i_yr2int", trigger, pid, cent));
  SetVariation(hist, trigger, pid, cent, "yr2int");
  hist->SetMarkerStyle(25);
  hist->SetMarkerColor(kBlue);
  hist->SetLineColor(kBlue);
  leg->AddEntry(hist, "yr2int", "lep");
  hist->Draw("same");

  leg->Draw();

  canv->SaveAs(Form("imgs/RV_c%03i_%s_%s.png", cent, trigger, pid));
  canv->SaveAs(Form("imgs/RV_c%03i_%s_%s.pdf", cent, trigger, pid));
}


void DrawRangeVar()
{
  for(int fidx=0; fidx<nFrom; fidx++) {
    for(int tidx=0; tidx<nTo; tidx++) {
      output[fidx][tidx] = new RawProduction::Output(Form("RawProduction_%.2f_%.2f.root", fromRanges[fidx], toRanges[tidx]));
    }
  }
  
  //TStringToken triggers("kMB kCentral kSemiCentral kPHOSPb", " ");
  TStringToken triggers("kPHOSPb kCentral kSemiCentral kMB", " ");
  while(triggers.NextToken()) {
    //TStringToken pids("All Allcore Allwou Disp Disp2 Dispcore Disp2core Dispwou CPV CPVcore CPV2 CPV2core Both Bothcore Both2 Both2core", " ");
    TStringToken pids("All Allcore Disp CPV Both", " ");
    while(pids.NextToken()) {
      for(int cent = -11; cent < 0; ++cent) {
	if(triggers.EqualTo("kMB") || triggers.EqualTo("kPHOSPb")) {
	  if( -1 == cent || -11 == cent || -10 == cent || -6 == cent )
	    DrawVar(triggers.Data(), pids.Data(), cent);
	}
	if(triggers.EqualTo("kCentral") ) {
	  if( -1 == cent )
	    DrawVar(triggers.Data(), pids.Data(), cent);
	}
	if(triggers.EqualTo("kSemiCentral") ) {
	  if( -11 == cent )
	    DrawVar(triggers.Data(), pids.Data(), cent);
	}
      } // cent
    } // pid
  } // triggers
}


void DrawRangeVariation()
{
  gROOT->LoadMacro("MakeRawProduction.C+g");

  DrawRangeVar();
}
 DrawRangeVariation.C:1
 DrawRangeVariation.C:2
 DrawRangeVariation.C:3
 DrawRangeVariation.C:4
 DrawRangeVariation.C:5
 DrawRangeVariation.C:6
 DrawRangeVariation.C:7
 DrawRangeVariation.C:8
 DrawRangeVariation.C:9
 DrawRangeVariation.C:10
 DrawRangeVariation.C:11
 DrawRangeVariation.C:12
 DrawRangeVariation.C:13
 DrawRangeVariation.C:14
 DrawRangeVariation.C:15
 DrawRangeVariation.C:16
 DrawRangeVariation.C:17
 DrawRangeVariation.C:18
 DrawRangeVariation.C:19
 DrawRangeVariation.C:20
 DrawRangeVariation.C:21
 DrawRangeVariation.C:22
 DrawRangeVariation.C:23
 DrawRangeVariation.C:24
 DrawRangeVariation.C:25
 DrawRangeVariation.C:26
 DrawRangeVariation.C:27
 DrawRangeVariation.C:28
 DrawRangeVariation.C:29
 DrawRangeVariation.C:30
 DrawRangeVariation.C:31
 DrawRangeVariation.C:32
 DrawRangeVariation.C:33
 DrawRangeVariation.C:34
 DrawRangeVariation.C:35
 DrawRangeVariation.C:36
 DrawRangeVariation.C:37
 DrawRangeVariation.C:38
 DrawRangeVariation.C:39
 DrawRangeVariation.C:40
 DrawRangeVariation.C:41
 DrawRangeVariation.C:42
 DrawRangeVariation.C:43
 DrawRangeVariation.C:44
 DrawRangeVariation.C:45
 DrawRangeVariation.C:46
 DrawRangeVariation.C:47
 DrawRangeVariation.C:48
 DrawRangeVariation.C:49
 DrawRangeVariation.C:50
 DrawRangeVariation.C:51
 DrawRangeVariation.C:52
 DrawRangeVariation.C:53
 DrawRangeVariation.C:54
 DrawRangeVariation.C:55
 DrawRangeVariation.C:56
 DrawRangeVariation.C:57
 DrawRangeVariation.C:58
 DrawRangeVariation.C:59
 DrawRangeVariation.C:60
 DrawRangeVariation.C:61
 DrawRangeVariation.C:62
 DrawRangeVariation.C:63
 DrawRangeVariation.C:64
 DrawRangeVariation.C:65
 DrawRangeVariation.C:66
 DrawRangeVariation.C:67
 DrawRangeVariation.C:68
 DrawRangeVariation.C:69
 DrawRangeVariation.C:70
 DrawRangeVariation.C:71
 DrawRangeVariation.C:72
 DrawRangeVariation.C:73
 DrawRangeVariation.C:74
 DrawRangeVariation.C:75
 DrawRangeVariation.C:76
 DrawRangeVariation.C:77
 DrawRangeVariation.C:78
 DrawRangeVariation.C:79
 DrawRangeVariation.C:80
 DrawRangeVariation.C:81
 DrawRangeVariation.C:82
 DrawRangeVariation.C:83
 DrawRangeVariation.C:84
 DrawRangeVariation.C:85
 DrawRangeVariation.C:86
 DrawRangeVariation.C:87
 DrawRangeVariation.C:88
 DrawRangeVariation.C:89
 DrawRangeVariation.C:90
 DrawRangeVariation.C:91
 DrawRangeVariation.C:92
 DrawRangeVariation.C:93
 DrawRangeVariation.C:94
 DrawRangeVariation.C:95
 DrawRangeVariation.C:96
 DrawRangeVariation.C:97
 DrawRangeVariation.C:98
 DrawRangeVariation.C:99
 DrawRangeVariation.C:100
 DrawRangeVariation.C:101
 DrawRangeVariation.C:102
 DrawRangeVariation.C:103
 DrawRangeVariation.C:104
 DrawRangeVariation.C:105
 DrawRangeVariation.C:106
 DrawRangeVariation.C:107
 DrawRangeVariation.C:108
 DrawRangeVariation.C:109
 DrawRangeVariation.C:110
 DrawRangeVariation.C:111
 DrawRangeVariation.C:112
 DrawRangeVariation.C:113
 DrawRangeVariation.C:114
 DrawRangeVariation.C:115
 DrawRangeVariation.C:116
 DrawRangeVariation.C:117
 DrawRangeVariation.C:118
 DrawRangeVariation.C:119
 DrawRangeVariation.C:120
 DrawRangeVariation.C:121
 DrawRangeVariation.C:122
 DrawRangeVariation.C:123
 DrawRangeVariation.C:124
 DrawRangeVariation.C:125
 DrawRangeVariation.C:126
 DrawRangeVariation.C:127
 DrawRangeVariation.C:128
 DrawRangeVariation.C:129
 DrawRangeVariation.C:130
 DrawRangeVariation.C:131
 DrawRangeVariation.C:132
 DrawRangeVariation.C:133
 DrawRangeVariation.C:134
 DrawRangeVariation.C:135
 DrawRangeVariation.C:136
 DrawRangeVariation.C:137
 DrawRangeVariation.C:138
 DrawRangeVariation.C:139
 DrawRangeVariation.C:140
 DrawRangeVariation.C:141
 DrawRangeVariation.C:142
 DrawRangeVariation.C:143
 DrawRangeVariation.C:144
 DrawRangeVariation.C:145
 DrawRangeVariation.C:146
 DrawRangeVariation.C:147
 DrawRangeVariation.C:148
 DrawRangeVariation.C:149
 DrawRangeVariation.C:150
 DrawRangeVariation.C:151
 DrawRangeVariation.C:152
 DrawRangeVariation.C:153
 DrawRangeVariation.C:154