ROOT logo
// $Id$
/*
 * Plotting macro for comparing offline- and HLT- ESD trees from
 * HLT-OFFLINE-GLOBAL-comparison.root produced using $ALICE_ROOT/HLT/QA/tasks/AliAnalysisTaskHLT.*
 *
 * Usage: aliroot drawGlobalESDHistograms.C++ in compiled mode
 *
 * It saves all canvases with the output histograms in a png and a ROOT file.
 * The second argument of the macro will produce individual files for all pads,
 * in case it is turned to kTRUE.
 *
 * @ingroup alihlt_qa
 * @author Camilla.Stokkevag@student.uib.no, Kalliopi.Kanaki@ift.uib.no 
 */

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "TSystem.h"
#include "TROOT.h"
#include "TFile.h"
#include "TString.h"
#include "TList.h"
#include "TCanvas.h"
#include "TText.h"
#include "TPaveStats.h"
#include "TPaveText.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TLegend.h"
#include "TStyle.h"
#include "TPad.h"
#include <iostream>
#include <cstdlib>
using std::endl;
#endif

// --------------------- forward declerations --------------//

void plot(TH1F *h1, TH1F *h2);
void printStats(TH1F *h1);
void printStats(TH1F *h1, TH1F *h2);

//==========================================================//

void drawGlobalESDHistograms(const char* filename="HLT-OFFLINE-GLOBAL-comparison.root", bool option=kFALSE){
 
 gROOT->SetStyle("Plain");
 gStyle->SetPalette(1);
 gStyle->SetOptStat("emr");
 gStyle->SetTitleX(gStyle->GetPadLeftMargin());

 TFile *file = TFile::Open(filename); 
 if(!file || file->IsZombie()) {
    printf("file %s does not exist or there is an error opening it\n", filename);
    return;
 }

 TList *list = (TList*)file->Get("global_histograms");
 if(!list){
    printf("No list %s contained in your input file\n", list->GetName()); 
    return; 
 }
 
 TText *runInfo = (TText*)list->FindObject("text");
 if(!runInfo) printf("No runInfo string\n");

 TText *cuts = (TText*)list->FindObject("cuts");
 if(!cuts) printf("No cuts string\n");

 TString folder = "GlobalTask_";
 folder += runInfo->GetTitle();
 folder.ReplaceAll(" ",""); 
 folder.ReplaceAll(",","_");
 gSystem->Exec("mkdir "+folder); // create a folder whose name contains run number and date of run

 const static int sizeTrack=8;
 const char *trackHLT[sizeTrack]={"fMomentum_hlt","fNcluster_hlt","fEta_hlt","fPhi_hlt","fDCAr_hlt","fDCAz_hlt","fCharge_hlt","fNITScluster_hlt"};
 const char *trackOFF[sizeTrack]={"fMomentum_off","fNcluster_off","fEta_off","fPhi_off","fDCAr_off","fDCAz_off","fCharge_off","fNITScluster_off"};
 const char *trackHLTcut[sizeTrack]={"fMomentum_hltcut","fNcluster_hltcut","fEta_hltcut","fPhi_hltcut","fDCAr_hltcut","fDCAz_hltcut","fCharge_hltcut","fNITScluster_hltcut"};

 const static int sizeEvent=9;
 const char *eventHLT[sizeEvent]={"fXvertex_hlt","fYvertex_hlt","fZvertex_hlt","fSPDXvertex_hlt","fSPDYvertex_hlt","fSPDZvertex_hlt","fMult_hlt","fNcont_hlt","fV0cent"};
 const char *eventOFF[sizeEvent]={"fXvertex_off","fYvertex_off","fZvertex_off","fSPDXvertex_off","fSPDYvertex_off","fSPDZvertex_off","fMult_off","fNcont_off","fV0cent"};

 TCanvas *c1 = new TCanvas("c1","track properties HLT vs. OFF",1250,700);
 c1->Divide(4,2);

 TH1F *h1 = NULL;
 TH1F *h2 = NULL;
 
 for(int i=0;i<sizeTrack;i++){
     c1->cd(i+1);
     h1 = (TH1F*)list->FindObject(trackHLT[i]); 
     h2 = (TH1F*)list->FindObject(trackOFF[i]); 
     if(h1 && h2){
        plot(h1,h2);
        if(i==0){
           TLegend *leg1 = new TLegend(0.6,0.2,0.8,0.5);
           leg1->SetFillColor(10);
           leg1->SetLineColor(10);
           leg1->AddEntry(h1,"HLT", "l");
           leg1->AddEntry(h2,"OFF", "l");
           leg1->Draw("same");
        }
     }
 }

 TCanvas *c4 = new TCanvas("c4","HLT track properties with and w/o cuts",1250,700);
 c4->Divide(4,2);
 
 for(int i=0;i<sizeTrack;i++){
     c4->cd(i+1);
     h1 = (TH1F*)list->FindObject(trackHLT[i]);    
     h2 = (TH1F*)list->FindObject(trackHLTcut[i]); 
     if(h1 && h2){
        plot(h1,h2);
        if(i==0){
  	   TPaveText *pave = new TPaveText(2.1,24000,8.3,31600);
  	   pave->SetFillColor(kWhite);
  	   pave->SetLineColor(kWhite);
  	   pave->SetShadowColor(kWhite);
  	   TString tmp=cuts->GetTitle();
  	   pave->SetTextColor(2);
  	   pave->AddText(tmp);
  	   pave->SetTextFont(42);
  	   pave->SetTextSize(0.04);
  	   pave->Draw();
  	   c4->Update();
        }
     }
 }

 TCanvas *c2 = new TCanvas("c2","vertex event properties",1200,700);
 c2->Divide(3,2);
 
 for(int i=0;i<6;i++){
     c2->cd(i+1);
     h1 = (TH1F*)list->FindObject(eventHLT[i]); 
     h2 = (TH1F*)list->FindObject(eventOFF[i]); 
     if(h1 && h2){
        plot(h1,h2);
        if(i==0){
           TLegend *leg1 = new TLegend(0.6,0.2,0.8,0.5);
           leg1->SetFillColor(10);
           leg1->SetLineColor(10);
           leg1->AddEntry(h1,"HLT", "l");
           leg1->AddEntry(h2,"OFF", "l");
           leg1->Draw("same");
        }
     }
 }

 TCanvas *c3 = new TCanvas("c3","general event properties",1200,500);
 c3->Divide(3,1);

 for(int i=6;i<9;i++){
     c3->cd(i-5);
     h2 = (TH1F*)list->FindObject(eventOFF[i]); 
     h1 = (TH1F*)list->FindObject(eventHLT[i]); 
     if(h1 && h2){
        plot(h1,h2);
        if(i==6){
           TLegend *leg1 = new TLegend(0.6,0.2,0.8,0.5);
           leg1->SetFillColor(10);
           leg1->SetLineColor(10);
           leg1->AddEntry(h1,"HLT", "l");
           leg1->AddEntry(h2,"OFF", "l");
           leg1->Draw("same");
        }
     }
 }
 
 c1->SaveAs(folder+"/track_properties.png");  
 c1->SaveAs(folder+"/track_properties.root");  
 c2->SaveAs(folder+"/vertex_event_properties.png");  
 c2->SaveAs(folder+"/vertex_event_properties.root");  
 c3->SaveAs(folder+"/general_event_properties.png");  
 c3->SaveAs(folder+"/general_event_properties.root");  
 c4->SaveAs(folder+"/HLT_track_properties_cuts.png");  
 c4->SaveAs(folder+"/HLT_track_properties_cuts.root");  
 
 if(option==kTRUE){ 
    TPad *pad = NULL; 
    for(int i=1; i<=sizeTrack; i++){
       pad = (TPad*)c1->GetListOfPrimitives()->FindObject(Form("c1_%d",i));
       if(!pad){
  	  printf("Empty pad %d in canvas %s.\n", i, c1->GetName());
  	  continue;	    
       }
       pad->SaveAs(Form(folder+"/c1_%s_off.png",trackHLT[i-1]));
    }

    for(int i=1; i<=sizeTrack; i++){
       pad = (TPad*)c4->GetListOfPrimitives()->FindObject(Form("c4_%d",i));
       if(!pad){
  	  printf("Empty pad %d in canvas %s.\n", i, c4->GetName());
  	  continue;	    
       }
       pad->SaveAs(Form(folder+"/c4_%s_cuts.png",trackHLT[i-1]));
    }
    
    for(int i=1; i<7; i++){
       pad = (TPad*)c2->GetListOfPrimitives()->FindObject(Form("c2_%d",i));
       if(!pad){
  	  printf("Empty pad %d in canvas %s.\n", i, c2->GetName());
  	  continue;	    
       }
       pad->SaveAs(Form(folder+"/c2_%s_off.png",eventHLT[i-1]));
    }

    for(int i=6; i<9; i++){
       pad = (TPad*)c3->GetListOfPrimitives()->FindObject(Form("c3_%d",i-5));
       if(!pad){
  	  printf("Empty pad %d in canvas %s.\n", i-5, c3->GetName());
  	  continue;	    
       }
       pad->SaveAs(Form(folder+"/c3_%s_off.png",eventHLT[i]));
    }
 }
 
 return;	
}

void printStats(TH1F* h1, TH1F* h2){    
  gPad->Update();
  TPaveStats *st1 = (TPaveStats*)h1->FindObject("stats"); if(!st1) { printf("TPaveStats st1 is 0x0\n"); return; }	
  st1->SetLineColor(0);
 
  gPad->Update();
  TPaveStats *st2 = (TPaveStats*)h2->FindObject("stats"); if(!st2) { printf("TPaveStats st2 is 0x0\n"); return; }
  st2->SetY2NDC(st1->GetY1NDC()-0.05);
  st2->SetY1NDC(st2->GetY2NDC()-TMath::Abs(st1->GetY1NDC()-st1->GetY2NDC()));
  st2->SetLineColor(0);
  st2->SetTextColor(h2->GetLineColor());
  st2->Draw();  
  return;
}

void printStats(TH1F* h1){    
  gPad->Update();
  TPaveStats *st1 = (TPaveStats*)h1->FindObject("stats"); if(!st1) { printf("TPaveStats st1 is 0x0\n"); return; }	
  st1->SetLineColor(0);
  return;
}

void plot(TH1F *h1, TH1F *h2){ 
  //Y axis
  if(h1->GetMaximum() > h2->GetMaximum()) h2->SetMaximum(1.1*h1->GetMaximum());
  else h1->SetMaximum(1.1*h2->GetMaximum());
  
  h1->SetMinimum(0);
  h2->SetMinimum(0);
  h2->SetLineColor(2);
 
  // X axis  
  double xmin, xmax;  
  if(h1->GetBinLowEdge(1) > h2->GetBinLowEdge(1)) xmin = h1->GetBinLowEdge(1);
  else xmin = h2->GetBinLowEdge(1);
  if(h1->GetBinLowEdge(h1->GetNbinsX()+1) > h2->GetBinLowEdge(h1->GetNbinsX()+1)) xmax = h1->GetBinLowEdge(h1->GetNbinsX()+1);
  else xmax = h2->GetBinLowEdge(h2->GetNbinsX()+1);
  
  h2->SetAxisRange(xmin, xmax, "X");  
  
  h1->Draw();
  h2->Draw("sames");
  printStats(h1,h2);
  return;
}
 drawGlobalESDHistograms.C:1
 drawGlobalESDHistograms.C:2
 drawGlobalESDHistograms.C:3
 drawGlobalESDHistograms.C:4
 drawGlobalESDHistograms.C:5
 drawGlobalESDHistograms.C:6
 drawGlobalESDHistograms.C:7
 drawGlobalESDHistograms.C:8
 drawGlobalESDHistograms.C:9
 drawGlobalESDHistograms.C:10
 drawGlobalESDHistograms.C:11
 drawGlobalESDHistograms.C:12
 drawGlobalESDHistograms.C:13
 drawGlobalESDHistograms.C:14
 drawGlobalESDHistograms.C:15
 drawGlobalESDHistograms.C:16
 drawGlobalESDHistograms.C:17
 drawGlobalESDHistograms.C:18
 drawGlobalESDHistograms.C:19
 drawGlobalESDHistograms.C:20
 drawGlobalESDHistograms.C:21
 drawGlobalESDHistograms.C:22
 drawGlobalESDHistograms.C:23
 drawGlobalESDHistograms.C:24
 drawGlobalESDHistograms.C:25
 drawGlobalESDHistograms.C:26
 drawGlobalESDHistograms.C:27
 drawGlobalESDHistograms.C:28
 drawGlobalESDHistograms.C:29
 drawGlobalESDHistograms.C:30
 drawGlobalESDHistograms.C:31
 drawGlobalESDHistograms.C:32
 drawGlobalESDHistograms.C:33
 drawGlobalESDHistograms.C:34
 drawGlobalESDHistograms.C:35
 drawGlobalESDHistograms.C:36
 drawGlobalESDHistograms.C:37
 drawGlobalESDHistograms.C:38
 drawGlobalESDHistograms.C:39
 drawGlobalESDHistograms.C:40
 drawGlobalESDHistograms.C:41
 drawGlobalESDHistograms.C:42
 drawGlobalESDHistograms.C:43
 drawGlobalESDHistograms.C:44
 drawGlobalESDHistograms.C:45
 drawGlobalESDHistograms.C:46
 drawGlobalESDHistograms.C:47
 drawGlobalESDHistograms.C:48
 drawGlobalESDHistograms.C:49
 drawGlobalESDHistograms.C:50
 drawGlobalESDHistograms.C:51
 drawGlobalESDHistograms.C:52
 drawGlobalESDHistograms.C:53
 drawGlobalESDHistograms.C:54
 drawGlobalESDHistograms.C:55
 drawGlobalESDHistograms.C:56
 drawGlobalESDHistograms.C:57
 drawGlobalESDHistograms.C:58
 drawGlobalESDHistograms.C:59
 drawGlobalESDHistograms.C:60
 drawGlobalESDHistograms.C:61
 drawGlobalESDHistograms.C:62
 drawGlobalESDHistograms.C:63
 drawGlobalESDHistograms.C:64
 drawGlobalESDHistograms.C:65
 drawGlobalESDHistograms.C:66
 drawGlobalESDHistograms.C:67
 drawGlobalESDHistograms.C:68
 drawGlobalESDHistograms.C:69
 drawGlobalESDHistograms.C:70
 drawGlobalESDHistograms.C:71
 drawGlobalESDHistograms.C:72
 drawGlobalESDHistograms.C:73
 drawGlobalESDHistograms.C:74
 drawGlobalESDHistograms.C:75
 drawGlobalESDHistograms.C:76
 drawGlobalESDHistograms.C:77
 drawGlobalESDHistograms.C:78
 drawGlobalESDHistograms.C:79
 drawGlobalESDHistograms.C:80
 drawGlobalESDHistograms.C:81
 drawGlobalESDHistograms.C:82
 drawGlobalESDHistograms.C:83
 drawGlobalESDHistograms.C:84
 drawGlobalESDHistograms.C:85
 drawGlobalESDHistograms.C:86
 drawGlobalESDHistograms.C:87
 drawGlobalESDHistograms.C:88
 drawGlobalESDHistograms.C:89
 drawGlobalESDHistograms.C:90
 drawGlobalESDHistograms.C:91
 drawGlobalESDHistograms.C:92
 drawGlobalESDHistograms.C:93
 drawGlobalESDHistograms.C:94
 drawGlobalESDHistograms.C:95
 drawGlobalESDHistograms.C:96
 drawGlobalESDHistograms.C:97
 drawGlobalESDHistograms.C:98
 drawGlobalESDHistograms.C:99
 drawGlobalESDHistograms.C:100
 drawGlobalESDHistograms.C:101
 drawGlobalESDHistograms.C:102
 drawGlobalESDHistograms.C:103
 drawGlobalESDHistograms.C:104
 drawGlobalESDHistograms.C:105
 drawGlobalESDHistograms.C:106
 drawGlobalESDHistograms.C:107
 drawGlobalESDHistograms.C:108
 drawGlobalESDHistograms.C:109
 drawGlobalESDHistograms.C:110
 drawGlobalESDHistograms.C:111
 drawGlobalESDHistograms.C:112
 drawGlobalESDHistograms.C:113
 drawGlobalESDHistograms.C:114
 drawGlobalESDHistograms.C:115
 drawGlobalESDHistograms.C:116
 drawGlobalESDHistograms.C:117
 drawGlobalESDHistograms.C:118
 drawGlobalESDHistograms.C:119
 drawGlobalESDHistograms.C:120
 drawGlobalESDHistograms.C:121
 drawGlobalESDHistograms.C:122
 drawGlobalESDHistograms.C:123
 drawGlobalESDHistograms.C:124
 drawGlobalESDHistograms.C:125
 drawGlobalESDHistograms.C:126
 drawGlobalESDHistograms.C:127
 drawGlobalESDHistograms.C:128
 drawGlobalESDHistograms.C:129
 drawGlobalESDHistograms.C:130
 drawGlobalESDHistograms.C:131
 drawGlobalESDHistograms.C:132
 drawGlobalESDHistograms.C:133
 drawGlobalESDHistograms.C:134
 drawGlobalESDHistograms.C:135
 drawGlobalESDHistograms.C:136
 drawGlobalESDHistograms.C:137
 drawGlobalESDHistograms.C:138
 drawGlobalESDHistograms.C:139
 drawGlobalESDHistograms.C:140
 drawGlobalESDHistograms.C:141
 drawGlobalESDHistograms.C:142
 drawGlobalESDHistograms.C:143
 drawGlobalESDHistograms.C:144
 drawGlobalESDHistograms.C:145
 drawGlobalESDHistograms.C:146
 drawGlobalESDHistograms.C:147
 drawGlobalESDHistograms.C:148
 drawGlobalESDHistograms.C:149
 drawGlobalESDHistograms.C:150
 drawGlobalESDHistograms.C:151
 drawGlobalESDHistograms.C:152
 drawGlobalESDHistograms.C:153
 drawGlobalESDHistograms.C:154
 drawGlobalESDHistograms.C:155
 drawGlobalESDHistograms.C:156
 drawGlobalESDHistograms.C:157
 drawGlobalESDHistograms.C:158
 drawGlobalESDHistograms.C:159
 drawGlobalESDHistograms.C:160
 drawGlobalESDHistograms.C:161
 drawGlobalESDHistograms.C:162
 drawGlobalESDHistograms.C:163
 drawGlobalESDHistograms.C:164
 drawGlobalESDHistograms.C:165
 drawGlobalESDHistograms.C:166
 drawGlobalESDHistograms.C:167
 drawGlobalESDHistograms.C:168
 drawGlobalESDHistograms.C:169
 drawGlobalESDHistograms.C:170
 drawGlobalESDHistograms.C:171
 drawGlobalESDHistograms.C:172
 drawGlobalESDHistograms.C:173
 drawGlobalESDHistograms.C:174
 drawGlobalESDHistograms.C:175
 drawGlobalESDHistograms.C:176
 drawGlobalESDHistograms.C:177
 drawGlobalESDHistograms.C:178
 drawGlobalESDHistograms.C:179
 drawGlobalESDHistograms.C:180
 drawGlobalESDHistograms.C:181
 drawGlobalESDHistograms.C:182
 drawGlobalESDHistograms.C:183
 drawGlobalESDHistograms.C:184
 drawGlobalESDHistograms.C:185
 drawGlobalESDHistograms.C:186
 drawGlobalESDHistograms.C:187
 drawGlobalESDHistograms.C:188
 drawGlobalESDHistograms.C:189
 drawGlobalESDHistograms.C:190
 drawGlobalESDHistograms.C:191
 drawGlobalESDHistograms.C:192
 drawGlobalESDHistograms.C:193
 drawGlobalESDHistograms.C:194
 drawGlobalESDHistograms.C:195
 drawGlobalESDHistograms.C:196
 drawGlobalESDHistograms.C:197
 drawGlobalESDHistograms.C:198
 drawGlobalESDHistograms.C:199
 drawGlobalESDHistograms.C:200
 drawGlobalESDHistograms.C:201
 drawGlobalESDHistograms.C:202
 drawGlobalESDHistograms.C:203
 drawGlobalESDHistograms.C:204
 drawGlobalESDHistograms.C:205
 drawGlobalESDHistograms.C:206
 drawGlobalESDHistograms.C:207
 drawGlobalESDHistograms.C:208
 drawGlobalESDHistograms.C:209
 drawGlobalESDHistograms.C:210
 drawGlobalESDHistograms.C:211
 drawGlobalESDHistograms.C:212
 drawGlobalESDHistograms.C:213
 drawGlobalESDHistograms.C:214
 drawGlobalESDHistograms.C:215
 drawGlobalESDHistograms.C:216
 drawGlobalESDHistograms.C:217
 drawGlobalESDHistograms.C:218
 drawGlobalESDHistograms.C:219
 drawGlobalESDHistograms.C:220
 drawGlobalESDHistograms.C:221
 drawGlobalESDHistograms.C:222
 drawGlobalESDHistograms.C:223
 drawGlobalESDHistograms.C:224
 drawGlobalESDHistograms.C:225
 drawGlobalESDHistograms.C:226
 drawGlobalESDHistograms.C:227
 drawGlobalESDHistograms.C:228
 drawGlobalESDHistograms.C:229
 drawGlobalESDHistograms.C:230
 drawGlobalESDHistograms.C:231
 drawGlobalESDHistograms.C:232
 drawGlobalESDHistograms.C:233
 drawGlobalESDHistograms.C:234
 drawGlobalESDHistograms.C:235
 drawGlobalESDHistograms.C:236
 drawGlobalESDHistograms.C:237
 drawGlobalESDHistograms.C:238
 drawGlobalESDHistograms.C:239
 drawGlobalESDHistograms.C:240
 drawGlobalESDHistograms.C:241
 drawGlobalESDHistograms.C:242
 drawGlobalESDHistograms.C:243
 drawGlobalESDHistograms.C:244
 drawGlobalESDHistograms.C:245
 drawGlobalESDHistograms.C:246
 drawGlobalESDHistograms.C:247
 drawGlobalESDHistograms.C:248
 drawGlobalESDHistograms.C:249
 drawGlobalESDHistograms.C:250
 drawGlobalESDHistograms.C:251
 drawGlobalESDHistograms.C:252
 drawGlobalESDHistograms.C:253
 drawGlobalESDHistograms.C:254
 drawGlobalESDHistograms.C:255
 drawGlobalESDHistograms.C:256
 drawGlobalESDHistograms.C:257
 drawGlobalESDHistograms.C:258
 drawGlobalESDHistograms.C:259
 drawGlobalESDHistograms.C:260
 drawGlobalESDHistograms.C:261
 drawGlobalESDHistograms.C:262
 drawGlobalESDHistograms.C:263
 drawGlobalESDHistograms.C:264
 drawGlobalESDHistograms.C:265
 drawGlobalESDHistograms.C:266
 drawGlobalESDHistograms.C:267
 drawGlobalESDHistograms.C:268