ROOT logo
#include "TDirectoryFile.h"
#include "THnBase.h"
#include "THnSparse.h"
#include "TH1.h"
#include "TH1D.h"
#include "TAxis.h"
#include "TFile.h"
#include "AliCFGridSparse.h"
#include "AliCFContainer.h"
#include "AliCFEffGrid.h"

#include "TROOT.h"
#include "TStyle.h"
#include "TSystem.h"
#include "Riostream.h"

//
// Macro to project (and rebin) the output of CFSingleTrackEfficiencyTask
//
// Parameters:
//   input file name
//   variable to project and rebin
//   steps to project (1:GenAcc/LimAcc, 2: RecCuts/GenAcc, 3: RecPID/GenAcc, 4: Rec/GenAcc, 5: RecAcc/GenAcc)
//   container directory suffix
//

void RebinCFContainer(const char *infile="AnalysisResults.root",Int_t rebinVar=0, Int_t myEff=3, const char * name="Nch"){

  gSystem->SetIncludePath("-I. -I$ALICE_ROOT -I$ALICE_ROOT/include -I$ALICE_ROOT/ITS -I$ALICE_ROOT/TPC -I$ALICE_ROOT/RAW -I$ALICE_ROOT/CONTAINERS -I$ALICE_ROOT/STEER/STEER -I$ALICE_ROOT/STEER/STEERBase -I$ALICE_ROOT/STEER/ESD -I$ALICE_ROOT/STEER/AOD -I$ALICE_ROOT/TRD -I$ALICE_ROOT/macros -I$ALICE_ROOT/ANALYSIS -I$ALICE_ROOT/PWGPP -g");

  // gROOT->LoadMacro("AliSingleTrackEffCuts.cxx++g");
  // gROOT->LoadMacro("AliCFSingleTrackEfficiencyTask.cxx++g");

  gROOT->SetStyle("Plain");
  gStyle->SetPalette(1);
  gStyle->SetOptStat(0);
  gStyle->SetPalette(1);
  gStyle->SetCanvasColor(0);
  gStyle->SetFrameFillColor(0);
  gStyle->SetOptTitle(0);
  
  
  TFile* file = TFile::Open(infile,"read");
  
  TDirectoryFile *d = 0;
  AliCFContainer *data = 0;
  d = (TDirectoryFile*)file->Get(Form("PWGPP_CFSingleTrack%s",name));
  if(!d) {
    cout<<" no directory "<<endl;
    return;
  }
  data = (AliCFContainer*) (d->Get("container"));
  if(!data){
    cout <<" no container"<<endl;
  }

  //
  // *********** NUMERATOR
  //
  AliCFGridSparse* gridSparse = 0;		
  if( myEff == 1 )  gridSparse = (AliCFGridSparse*)data->GetGrid(1); // GenAcc
  else if( myEff == 2 )  gridSparse = (AliCFGridSparse*)data->GetGrid(6); // Rec (acc + cuts) draw reco properties
  else if( myEff == 3 )  gridSparse = (AliCFGridSparse*)data->GetGrid(7); // RecPID
  else if( myEff == 4 )  gridSparse = (AliCFGridSparse*)data->GetGrid(3); // Rec (no cuts)
  else if( myEff == 5 )  gridSparse = (AliCFGridSparse*)data->GetGrid(4); // RecAcc
  else if( myEff == 6 )  gridSparse = (AliCFGridSparse*)data->GetGrid(5); // Rec (acc + cuts) draw kine properties

  THnSparse* numData = (THnSparse*)gridSparse->GetGrid();
  
  // method 2: defining a new THnSparse changing only the axis of interest
  Printf("Method 2 ");
  THnSparse* newnumData = (THnSparse*)numData->Clone("numNew");
  newnumData->Reset();

  Int_t nLimits=0;
  Double_t* newLimits =0;
  if(rebinVar==0) {
    nLimits = 15;
    newLimits = new Double_t[nLimits+1];
    newLimits[0]=0;
    newLimits[1]=0.5;
    newLimits[2]=1;
    newLimits[3]=1.5;
    newLimits[4]=2;
    newLimits[5]=2.5;
    newLimits[6]=3;
    newLimits[7]=4;
    newLimits[8]=5;
    newLimits[9]=6;
    newLimits[10]=7;
    newLimits[11]=8;
    newLimits[12]=10;
    newLimits[13]=12;
    newLimits[14]=14;
    newLimits[15]=16;
  } else if (rebinVar==1) {
    nLimits = 9;
    newLimits = new Double_t[nLimits+1];
    newLimits[0]=-0.9;
    newLimits[1]=-0.7;
    newLimits[2]=-0.5;
    newLimits[3]=-0.3;
    newLimits[4]=-0.1;
    newLimits[5]=0.1;
    newLimits[6]=0.3;
    newLimits[7]=0.5;
    newLimits[8]=0.7;
    newLimits[9]=0.9;
  }
  const Int_t nnewLimits = nLimits;
  
  
  TAxis* axis = (TAxis*)newnumData->GetAxis(rebinVar);
  axis->Set(nnewLimits,newLimits);
  newnumData->SetBinEdges(rebinVar,newLimits);
  
  newnumData->RebinnedAdd(numData, 1);
  
  // checking the bin contents
  TH1D* h1 = (TH1D*)numData->Projection(rebinVar);
  Float_t sum = 0;
  Float_t sumnew = 0;
  Printf("Original THnSparse");
  for (Int_t ibin = 1; ibin<=h1->GetNbinsX(); ibin++){
    Printf("ibin = %d, low edge = %f, content = %f",ibin,h1->GetBinLowEdge(ibin),h1->GetBinContent(ibin));
    sum+=h1->GetBinContent(ibin);
  }

  Printf("THnSparse changing only one axis");
  TH1D* h2num = (TH1D*)newnumData->Projection(rebinVar);
  for (Int_t ibin = 1; ibin<=h2num->GetNbinsX(); ibin++){
    Printf("ibin = %d, low edge = %f, content = %f",ibin,h2num->GetBinLowEdge(ibin),h2num->GetBinContent(ibin));
    sumnew+=h2num->GetBinContent(ibin);
  }
  
  Printf("sum = %f, sumnew = %f",sum, sumnew);

  //  
  // *********** DENOMINATOR RECPID
  //
  Printf("DENOMINATOR");
  
  AliCFGridSparse* gridSparse2 = 0;
  if( myEff == 1 )  gridSparse2 = (AliCFGridSparse*)data->GetGrid(0); // LimAcc
  else gridSparse2 = (AliCFGridSparse*)data->GetGrid(1);              // GenAcc

  THnSparse* denData = (THnSparse*)gridSparse2->GetGrid();
  
  // method 2: defining a new THnSparse changing only the axis of interest
  Printf("Method 2 ");
  THnSparse* newdenData = (THnSparse*)denData->Clone("denNew");
  newdenData->Reset();
  
  TAxis* axis2 = (TAxis*)newdenData->GetAxis(rebinVar);
  axis2->Set(nnewLimits,newLimits);
  newdenData->SetBinEdges(rebinVar,newLimits);
  
  newdenData->RebinnedAdd(denData, 1);
  
  // checking the bin contents
  TH1D* h1d = (TH1D*)denData->Projection(rebinVar);
  sum = 0;
  sumnew = 0;
  Printf("Original THnSparse");
  for (Int_t ibin = 1; ibin<=h1d->GetNbinsX(); ibin++){
    Printf("ibin = %d, low edge = %f, content = %f",ibin,h1d->GetBinLowEdge(ibin),h1d->GetBinContent(ibin));
    sum+=h1d->GetBinContent(ibin);
  }
  
  Printf("THnSparse changing only one axis");
  TH1D* h2 = (TH1D*)newdenData->Projection(rebinVar);
  for (Int_t ibin = 1; ibin<=h2->GetNbinsX(); ibin++){
    Printf("ibin = %d, low edge = %f, content = %f",ibin,h2->GetBinLowEdge(ibin),h2->GetBinContent(ibin));
    sumnew+=h2->GetBinContent(ibin);
  }
  
  Printf("sum = %f, sumnew = %f",sum, sumnew);
  
  TH1D* heff = (TH1D*)h2num->Clone("heff");
  heff->Divide(h2num, h2,1,1,"B");
  //  heff->GetXaxis()->SetRangeUser(0,23.5);
  TFile* fout = NULL;
  if( myEff == 1 ) {
    fout = new TFile(Form("efficiency_STE_GenAcc_over_LimAcc_rebinned_%d_%s.root",rebinVar,name),"RECREATE");
    heff->Write("hpteffCFLimAccGenAcc");
    h2num->Write("hptLimAcc");
    h2->Write("hptGenAcc");
  }
  else if( myEff == 2 ) {
    fout = new TFile(Form("efficiency_STE_RecPPR_over_GenAcc_rebinned_%d_%s.root",rebinVar,name),"RECREATE");
    heff->Write("hpteffCFRecPPRGenAcc");
    h2num->Write("hptRecPPR");
    h2->Write("hptGenAcc");
  }
  else if( myEff == 3 ) {
    fout = new TFile(Form("efficiency_STE_RecPID_over_GenAcc_rebinned_%d_%s.root",rebinVar,name),"RECREATE");
    heff->Write("hpteffCFRecPIDGenAcc");
    h2num->Write("hptRecPID");
    h2->Write("hptGenAcc");
  }
  else if( myEff == 4 ) {
    fout = new TFile(Form("efficiency_STE_Rec_over_GenAcc_rebinned_%d_%s.root",rebinVar,name),"RECREATE");
    heff->Write("hpteffCFRecGenAcc");
    h2num->Write("hptRec");
    h2->Write("hptGenAcc");
  }
  else if( myEff == 5 ) {
    fout = new TFile(Form("efficiency_STE_RecAcc_over_GenAcc_rebinned_%d_%s.root",rebinVar,name),"RECREATE");
    heff->Write("hpteffCFRecAccGenAcc");
    h2num->Write("hptRecAcc");
    h2->Write("hptGenAcc");
  }
  else if( myEff == 6 ) {
    fout = new TFile(Form("efficiency_STE_RecPPRKine_over_GenAcc_rebinned_%d_%s.root",rebinVar,name),"RECREATE");
    heff->Write("hpteffCFRecPPRKineGenAcc");
    h2num->Write("hptRecPPRKine");
    h2->Write("hptGenAcc");
  }
  fout->Close();

}
 RebinCFContainer.C:1
 RebinCFContainer.C:2
 RebinCFContainer.C:3
 RebinCFContainer.C:4
 RebinCFContainer.C:5
 RebinCFContainer.C:6
 RebinCFContainer.C:7
 RebinCFContainer.C:8
 RebinCFContainer.C:9
 RebinCFContainer.C:10
 RebinCFContainer.C:11
 RebinCFContainer.C:12
 RebinCFContainer.C:13
 RebinCFContainer.C:14
 RebinCFContainer.C:15
 RebinCFContainer.C:16
 RebinCFContainer.C:17
 RebinCFContainer.C:18
 RebinCFContainer.C:19
 RebinCFContainer.C:20
 RebinCFContainer.C:21
 RebinCFContainer.C:22
 RebinCFContainer.C:23
 RebinCFContainer.C:24
 RebinCFContainer.C:25
 RebinCFContainer.C:26
 RebinCFContainer.C:27
 RebinCFContainer.C:28
 RebinCFContainer.C:29
 RebinCFContainer.C:30
 RebinCFContainer.C:31
 RebinCFContainer.C:32
 RebinCFContainer.C:33
 RebinCFContainer.C:34
 RebinCFContainer.C:35
 RebinCFContainer.C:36
 RebinCFContainer.C:37
 RebinCFContainer.C:38
 RebinCFContainer.C:39
 RebinCFContainer.C:40
 RebinCFContainer.C:41
 RebinCFContainer.C:42
 RebinCFContainer.C:43
 RebinCFContainer.C:44
 RebinCFContainer.C:45
 RebinCFContainer.C:46
 RebinCFContainer.C:47
 RebinCFContainer.C:48
 RebinCFContainer.C:49
 RebinCFContainer.C:50
 RebinCFContainer.C:51
 RebinCFContainer.C:52
 RebinCFContainer.C:53
 RebinCFContainer.C:54
 RebinCFContainer.C:55
 RebinCFContainer.C:56
 RebinCFContainer.C:57
 RebinCFContainer.C:58
 RebinCFContainer.C:59
 RebinCFContainer.C:60
 RebinCFContainer.C:61
 RebinCFContainer.C:62
 RebinCFContainer.C:63
 RebinCFContainer.C:64
 RebinCFContainer.C:65
 RebinCFContainer.C:66
 RebinCFContainer.C:67
 RebinCFContainer.C:68
 RebinCFContainer.C:69
 RebinCFContainer.C:70
 RebinCFContainer.C:71
 RebinCFContainer.C:72
 RebinCFContainer.C:73
 RebinCFContainer.C:74
 RebinCFContainer.C:75
 RebinCFContainer.C:76
 RebinCFContainer.C:77
 RebinCFContainer.C:78
 RebinCFContainer.C:79
 RebinCFContainer.C:80
 RebinCFContainer.C:81
 RebinCFContainer.C:82
 RebinCFContainer.C:83
 RebinCFContainer.C:84
 RebinCFContainer.C:85
 RebinCFContainer.C:86
 RebinCFContainer.C:87
 RebinCFContainer.C:88
 RebinCFContainer.C:89
 RebinCFContainer.C:90
 RebinCFContainer.C:91
 RebinCFContainer.C:92
 RebinCFContainer.C:93
 RebinCFContainer.C:94
 RebinCFContainer.C:95
 RebinCFContainer.C:96
 RebinCFContainer.C:97
 RebinCFContainer.C:98
 RebinCFContainer.C:99
 RebinCFContainer.C:100
 RebinCFContainer.C:101
 RebinCFContainer.C:102
 RebinCFContainer.C:103
 RebinCFContainer.C:104
 RebinCFContainer.C:105
 RebinCFContainer.C:106
 RebinCFContainer.C:107
 RebinCFContainer.C:108
 RebinCFContainer.C:109
 RebinCFContainer.C:110
 RebinCFContainer.C:111
 RebinCFContainer.C:112
 RebinCFContainer.C:113
 RebinCFContainer.C:114
 RebinCFContainer.C:115
 RebinCFContainer.C:116
 RebinCFContainer.C:117
 RebinCFContainer.C:118
 RebinCFContainer.C:119
 RebinCFContainer.C:120
 RebinCFContainer.C:121
 RebinCFContainer.C:122
 RebinCFContainer.C:123
 RebinCFContainer.C:124
 RebinCFContainer.C:125
 RebinCFContainer.C:126
 RebinCFContainer.C:127
 RebinCFContainer.C:128
 RebinCFContainer.C:129
 RebinCFContainer.C:130
 RebinCFContainer.C:131
 RebinCFContainer.C:132
 RebinCFContainer.C:133
 RebinCFContainer.C:134
 RebinCFContainer.C:135
 RebinCFContainer.C:136
 RebinCFContainer.C:137
 RebinCFContainer.C:138
 RebinCFContainer.C:139
 RebinCFContainer.C:140
 RebinCFContainer.C:141
 RebinCFContainer.C:142
 RebinCFContainer.C:143
 RebinCFContainer.C:144
 RebinCFContainer.C:145
 RebinCFContainer.C:146
 RebinCFContainer.C:147
 RebinCFContainer.C:148
 RebinCFContainer.C:149
 RebinCFContainer.C:150
 RebinCFContainer.C:151
 RebinCFContainer.C:152
 RebinCFContainer.C:153
 RebinCFContainer.C:154
 RebinCFContainer.C:155
 RebinCFContainer.C:156
 RebinCFContainer.C:157
 RebinCFContainer.C:158
 RebinCFContainer.C:159
 RebinCFContainer.C:160
 RebinCFContainer.C:161
 RebinCFContainer.C:162
 RebinCFContainer.C:163
 RebinCFContainer.C:164
 RebinCFContainer.C:165
 RebinCFContainer.C:166
 RebinCFContainer.C:167
 RebinCFContainer.C:168
 RebinCFContainer.C:169
 RebinCFContainer.C:170
 RebinCFContainer.C:171
 RebinCFContainer.C:172
 RebinCFContainer.C:173
 RebinCFContainer.C:174
 RebinCFContainer.C:175
 RebinCFContainer.C:176
 RebinCFContainer.C:177
 RebinCFContainer.C:178
 RebinCFContainer.C:179
 RebinCFContainer.C:180
 RebinCFContainer.C:181
 RebinCFContainer.C:182
 RebinCFContainer.C:183
 RebinCFContainer.C:184
 RebinCFContainer.C:185
 RebinCFContainer.C:186
 RebinCFContainer.C:187
 RebinCFContainer.C:188
 RebinCFContainer.C:189
 RebinCFContainer.C:190
 RebinCFContainer.C:191
 RebinCFContainer.C:192
 RebinCFContainer.C:193
 RebinCFContainer.C:194
 RebinCFContainer.C:195
 RebinCFContainer.C:196
 RebinCFContainer.C:197
 RebinCFContainer.C:198
 RebinCFContainer.C:199
 RebinCFContainer.C:200
 RebinCFContainer.C:201
 RebinCFContainer.C:202
 RebinCFContainer.C:203
 RebinCFContainer.C:204
 RebinCFContainer.C:205
 RebinCFContainer.C:206
 RebinCFContainer.C:207
 RebinCFContainer.C:208
 RebinCFContainer.C:209
 RebinCFContainer.C:210
 RebinCFContainer.C:211
 RebinCFContainer.C:212
 RebinCFContainer.C:213
 RebinCFContainer.C:214
 RebinCFContainer.C:215
 RebinCFContainer.C:216
 RebinCFContainer.C:217
 RebinCFContainer.C:218
 RebinCFContainer.C:219
 RebinCFContainer.C:220
 RebinCFContainer.C:221
 RebinCFContainer.C:222