2020/// \author Igor Altsybeev <Igor.Altsybeev@cern.ch>
2121
2222#include <TCanvas.h>
23+ #include <TColor.h>
2324#include <TDirectory.h>
2425#include <TFile.h>
2526#include <TH1.h>
3031#include <TString.h>
3132#include <TStyle.h>
3233
34+ #include <Rtypes.h>
35+
3336#include <algorithm>
37+ #include <array>
3438#include <cstdio>
3539#include <memory>
36- #include <string>
3740#include <vector>
3841
3942namespace bcoccqa
4043{
41- TDirectory * gDir = nullptr ;
42-
4344// histogram from the task directory (or from one of its subdirectories), detached from the file
4445template < typename T >
45- T * getHist (const char * name )
46+ T * getHist (TDirectory * dir , const char * name )
4647{
47- TObject * obj = gDir -> Get (name );
48+ TObject * obj = dir -> Get (name );
4849 if (!obj ) {
49- for (TObject * key : * gDir -> GetListOfKeys ()) {
50- if (auto * sub = dynamic_cast < TDirectory * > (static_cast < TKey * > (key )-> ReadObj ())) {
50+ for (TObject * key : * dir -> GetListOfKeys ()) {
51+ auto* tkey = dynamic_cast < TKey * > (key );
52+ if (!tkey ) {
53+ continue ;
54+ }
55+ if (auto * sub = dynamic_cast < TDirectory * > (tkey -> ReadObj ())) {
5156 obj = sub -> Get (name );
5257 if (obj ) {
5358 break ;
@@ -69,9 +74,9 @@ T* getHist(const char* name)
6974}
7075
7176// fraction of BCs per bin: numerator / denominator (binomial errors)
72- TH1D * makeRatio (const TH1 * num , const TH1 * den , const char * name , const char * title )
77+ TH1 * makeRatio (const TH1 * num , const TH1 * den , const char * name , const char * title )
7378{
74- auto* r = static_cast < TH1D * > (num -> Clone (name ));
79+ auto* r = dynamic_cast < TH1 * > (num -> Clone (name ));
7580 r -> SetTitle (title );
7681 r -> Divide (num , den , 1. , 1. , "B" );
7782 r -> SetStats (false);
@@ -95,7 +100,7 @@ double upperEdgeOfFilledRange(const TH1* h)
95100void plotBcOccupancyQa (const char * fileName = "AnalysisResults.root" , const char * outPdf = "bcOccupancyQa.pdf" , const char * dirName = "bc-occupancy-qa-task" , const char * outRoot = "" )
96101{
97102 using namespace bcoccqa ;
98- TH1 ::AddDirectory (kFALSE );
103+ TH1 ::AddDirectory (false );
99104 gStyle -> SetOptStat (0 );
100105 gStyle -> SetPalette (kViridis );
101106
@@ -104,34 +109,34 @@ void plotBcOccupancyQa(const char* fileName = "AnalysisResults.root", const char
104109 std ::printf ("cannot open %s\n" , fileName );
105110 return ;
106111 }
107- gDir = f -> GetDirectory (dirName );
108- if (!gDir ) {
112+ TDirectory * dir = f -> GetDirectory (dirName );
113+ if (!dir ) {
109114 std ::printf ("directory %s not found in %s\n" , dirName , fileName );
110115 return ;
111116 }
112117
113- auto* hBcCounter = getHist < TH1 > ("hBcCounter" );
114- auto* hNumCollsInBC = getHist < TH1 > ("hNumCollsInBC" );
115- auto* hNumCollsInRof = getHist < TH1 > ("hNumCollsInRof" );
116- auto* hNumCollsInRofVsInBC = getHist < TH2 > ("hNumCollsInRofVsInBC" );
117- auto* hNumCollsInRofUpcMode = getHist < TH1 > ("hNumCollsInRofUpcMode" );
118- auto* hBcInTF = getHist < TH1 > ("hBcInTF" );
119- auto* hBcInTFDefined = getHist < TH1 > ("hBcInTFOccupancyDefined" );
120- auto* hOccTracks = getHist < TH1 > ("hOccupancyByTracks" );
121- auto* hOccFT0C = getHist < TH1 > ("hOccupancyByFT0C" );
122- auto* hOccTracksVsFT0C = getHist < TH2 > ("hOccupancyByTracksVsFT0C" );
123- auto* hMedianTime = getHist < TH1 > ("hMedianTime" );
124- auto* pOccVsBcInTF = getHist < TProfile > ("pOccupancyByTracksVsBcInTF" );
125- auto* pOccVsBcInOrbit = getHist < TProfile > ("pOccupancyByTracksVsBcInOrbit" );
126- auto* hFlags = getHist < TH1 > ("hOccupancyFlags" );
127- auto* hFlagsVsOcc = getHist < TH2 > ("hOccupancyFlagsVsOccupancyByTracks" );
128- auto* hBcIndexCheck = getHist < TH1 > ("hBcIndexCheck" );
118+ auto* hBcCounter = getHist < TH1 > (dir , "hBcCounter" );
119+ auto* hNumCollsInBC = getHist < TH1 > (dir , "hNumCollsInBC" );
120+ auto* hNumCollsInRof = getHist < TH1 > (dir , "hNumCollsInRof" );
121+ auto* hNumCollsInRofVsInBC = getHist < TH2 > (dir , "hNumCollsInRofVsInBC" );
122+ auto* hNumCollsInRofUpcMode = getHist < TH1 > (dir , "hNumCollsInRofUpcMode" );
123+ auto* hBcInTF = getHist < TH1 > (dir , "hBcInTF" );
124+ auto* hBcInTFDefined = getHist < TH1 > (dir , "hBcInTFOccupancyDefined" );
125+ auto* hOccTracks = getHist < TH1 > (dir , "hOccupancyByTracks" );
126+ auto* hOccFT0C = getHist < TH1 > (dir , "hOccupancyByFT0C" );
127+ auto* hOccTracksVsFT0C = getHist < TH2 > (dir , "hOccupancyByTracksVsFT0C" );
128+ auto* hMedianTime = getHist < TH1 > (dir , "hMedianTime" );
129+ auto* pOccVsBcInTF = getHist < TProfile > (dir , "pOccupancyByTracksVsBcInTF" );
130+ auto* pOccVsBcInOrbit = getHist < TProfile > (dir , "pOccupancyByTracksVsBcInOrbit" );
131+ auto* hFlags = getHist < TH1 > (dir , "hOccupancyFlags" );
132+ auto* hFlagsVsOcc = getHist < TH2 > (dir , "hOccupancyFlagsVsOccupancyByTracks" );
133+ auto* hBcIndexCheck = getHist < TH1 > (dir , "hBcIndexCheck" );
129134 // aod::BcOccs, and its comparison with aod::BcOccsAll
130- auto* hBcOccsCounter = getHist < TH1 > ("BcOccs/hBcCounter" );
131- auto* hBcOccsOccTracks = getHist < TH1 > ("BcOccs/hOccupancyByTracks" );
132- auto* hBcOccsOccTracksVsFT0C = getHist < TH2 > ("BcOccs/hOccupancyByTracksVsFT0C" );
133- auto* hBcOccsFlags = getHist < TH1 > ("BcOccs/hOccupancyFlags" );
134- auto* hBcOccsVsBcOccsAll = getHist < TH1 > ("BcOccsVsBcOccsAll/hCheck" );
135+ auto* hBcOccsCounter = getHist < TH1 > (dir , "BcOccs/hBcCounter" );
136+ auto* hBcOccsOccTracks = getHist < TH1 > (dir , "BcOccs/hOccupancyByTracks" );
137+ auto* hBcOccsOccTracksVsFT0C = getHist < TH2 > (dir , "BcOccs/hOccupancyByTracksVsFT0C" );
138+ auto* hBcOccsFlags = getHist < TH1 > (dir , "BcOccs/hOccupancyFlags" );
139+ auto* hBcOccsVsBcOccsAll = getHist < TH1 > (dir , "BcOccsVsBcOccsAll/hCheck" );
135140
136141 // ### summary
137142 std ::printf ("\n=== BC occupancy QA: %s ===\n" , fileName );
@@ -272,7 +277,7 @@ void plotBcOccupancyQa(const char* fileName = "AnalysisResults.root", const char
272277 c = newPage ("cOccupancyFlags" , "occupancy flags" , 1200 , 550 , 2 , 1 );
273278 if (hFlags && hFlags -> GetBinContent (1 ) > 0 ) {
274279 c -> cd (1 )-> SetBottomMargin (0.3 );
275- auto* hFlagsFrac = static_cast < TH1 * > (hFlags -> Clone ("hFlagsFrac" ));
280+ auto* hFlagsFrac = dynamic_cast < TH1 * > (hFlags -> Clone ("hFlagsFrac" ));
276281 hFlagsFrac -> Scale (1. / hFlags -> GetBinContent (1 ));
277282 hFlagsFrac -> SetTitle ("fraction of BCs passing each flag;;fraction of BCs" );
278283 hFlagsFrac -> GetXaxis ()-> LabelsOption ("v" );
@@ -284,13 +289,13 @@ void plotBcOccupancyQa(const char* fileName = "AnalysisResults.root", const char
284289 if (hFlagsVsOcc ) {
285290 // fraction of BCs passing each flag vs occupancy
286291 c -> cd (2 );
287- TLegend * leg = new TLegend (0.45 , 0.6 , 0.89 , 0.89 );
292+ auto * leg = new TLegend (0.45 , 0.6 , 0.89 , 0.89 );
288293 TH1D * hAll = hFlagsVsOcc -> ProjectionY ("hFlagsAll" , 1 , 1 );
289- const int colors [] = {kRed + 1 , kOrange + 7 , kGreen + 2 , kAzure + 2 , kBlue + 2 , kMagenta + 1 , kBlack };
294+ const std :: array < int , 7 > colors = {kRed + 1 , kOrange + 7 , kGreen + 2 , kAzure + 2 , kBlue + 2 , kMagenta + 1 , kBlack };
290295 bool first = true;
291296 for (int i = 2 ; i <= hFlagsVsOcc -> GetNbinsX (); i ++ ) {
292297 TH1D * hPass = hFlagsVsOcc -> ProjectionY (Form ("hFlagPass%d" , i ), i , i );
293- TH1D * hFrac = makeRatio (hPass , hAll , Form ("hFracVsOccupancy_%s" , hFlagsVsOcc -> GetXaxis ()-> GetBinLabel (i )), "fraction of BCs passing the flags vs occupancy;occupancy by ITS tracks;fraction of BCs" );
298+ TH1 * hFrac = makeRatio (hPass , hAll , Form ("hFracVsOccupancy_%s" , hFlagsVsOcc -> GetXaxis ()-> GetBinLabel (i )), "fraction of BCs passing the flags vs occupancy;occupancy by ITS tracks;fraction of BCs" );
294299 hFrac -> SetLineColor (colors [(i - 2 ) % 7 ]);
295300 hFrac -> SetMarkerColor (colors [(i - 2 ) % 7 ]);
296301 hFrac -> SetMarkerStyle (20 );
@@ -310,7 +315,7 @@ void plotBcOccupancyQa(const char* fileName = "AnalysisResults.root", const char
310315 c = newPage ("cBcPosition" , "BC position in the TF and in the orbit" , 1200 , 800 , 1 , 3 );
311316 if (hBcInTF && hBcInTFDefined ) {
312317 c -> cd (1 );
313- TH1D * hFracDefined = makeRatio (hBcInTFDefined , hBcInTF , "hFracDefined" , "fraction of BCs with calculated occupancy;BC in TF;fraction" );
318+ TH1 * hFracDefined = makeRatio (hBcInTFDefined , hBcInTF , "hFracDefined" , "fraction of BCs with calculated occupancy;BC in TF;fraction" );
314319 hFracDefined -> SetMinimum (0. );
315320 hFracDefined -> SetMaximum (1.1 );
316321 hFracDefined -> Draw ("hist" );
@@ -336,7 +341,7 @@ void plotBcOccupancyQa(const char* fileName = "AnalysisResults.root", const char
336341 }
337342 if (hBcOccsFlags && hBcOccsFlags -> GetBinContent (1 ) > 0 ) {
338343 c -> cd (2 )-> SetBottomMargin (0.3 );
339- auto* hFlagsFracBcOccs = static_cast < TH1 * > (hBcOccsFlags -> Clone ("BcOccs_hFlagsFrac" ));
344+ auto* hFlagsFracBcOccs = dynamic_cast < TH1 * > (hBcOccsFlags -> Clone ("BcOccs_hFlagsFrac" ));
340345 hFlagsFracBcOccs -> Scale (1. / hBcOccsFlags -> GetBinContent (1 ));
341346 hFlagsFracBcOccs -> SetTitle ("BcOccs: fraction of BCs passing each flag;;fraction of BCs" );
342347 hFlagsFracBcOccs -> GetXaxis ()-> LabelsOption ("v" );
0 commit comments