10 #include <AliAnalysisManager.h>
11 #include <AliAODEvent.h>
12 #include <AliAODHandler.h>
13 #include <AliAODInputHandler.h>
20 #include <TParameter.h>
37 else if (c < 10)
return 1;
38 else if (c < 20)
return 2;
39 else if (c < 30)
return 3;
40 else if (c < 40)
return 4;
41 else if (c < 50)
return 5;
42 else if (c < 60)
return 6;
43 else if (c < 70)
return 7;
44 else if (c < 80)
return 8;
45 else if (c < 90)
return 9;
59 const Color_t
cc[] = { kMagenta+2,
86 else if (c < 10)
return 1;
87 else if (c < 20)
return 2;
88 else if (c < 40)
return 3;
89 else if (c < 60)
return 4;
90 else if (c < 80)
return 5;
91 else if (c < 100)
return 6;
105 const Color_t
cc[] = { kMagenta+2,
113 Int_t bin = pPbBin(c1,c2);
125 fListOfCentralities(0),
126 fNormalizationScheme(kFull),
127 fFinalMCCorrFile(
""),
128 fSatelliteVertices(0),
129 fEmpiricalCorrection(0),
133 fCentMethod(
"default"),
135 fUseUtilPileup(false),
143 DGUARD(fDebug,3,
"Default CTOR of AliBasedNdetaTask");
153 fListOfCentralities(0),
154 fNormalizationScheme(kFull),
155 fFinalMCCorrFile(
""),
156 fSatelliteVertices(0),
157 fEmpiricalCorrection(0),
161 fCentMethod(
"default"),
163 fUseUtilPileup(false),
171 DGUARD(fDebug, 3,
"Named CTOR of AliBasedNdetaTask: %s", name);
190 DGUARD(fDebug,3,
"Destruction of AliBasedNdetaTask");
197 AliAnalysisTaskSE::SetDebugLevel(lvl);
216 DGUARD(fDebug,3,
"Add a centrality bin [%6.2f,%6.2f] @ %d", low, high, at);
219 Error(
"AddCentralityBin",
220 "Failed to create centrality bin for %s [%6.2f,%6.2f] @ %d",
221 GetName(), low, high, at);
229 else color = pPbColor (low,high);
231 DMSG(fDebug, 3,
"Color of bin %d", color);
252 DGUARD(fDebug,3,
"Make a centrality bin %s [%6.2f,%6.2f]", name, low, high);
256 #define TESTAPPEND(SCHEME,BIT,STRING) \
257 do { if (!(SCHEME & BIT)) break; \
258 if (!s.IsNull()) s.Append(","); s.Append(STRING); } while(false)
270 if (scheme ==
kFull) {
288 if (twhat.EqualTo(
"DEFAULT"))
291 TObjArray* token = twhat.Tokenize(
" ,|");
293 while ((opt = static_cast<TObjString*>(next()))) {
295 if (s.IsNull())
continue;
298 case '-': add =
false;
299 case '+': s.Remove(0,1);
302 if (s.EqualTo(
"SHAPE")) {
303 AliWarningGeneral(
"AliBasedNdetaTask",
304 Form(
"SHAPE correction no longer supported (%s)",
309 else if (s.CompareTo(
"BACKGROUND")== 0) bit =
kBackground;
311 else if (s.CompareTo(
"FULL") == 0) bit =
kFull;
312 else if (s.CompareTo(
"NONE") == 0) bit =
kNone;
313 else if (s.CompareTo(
"ZEROBIN") == 0) bit =
kZeroBin;
315 ::Warning(
"SetNormalizationScheme",
"Unknown option %s", s.Data());
316 if (add) scheme |= bit;
329 DGUARD(fDebug,3,
"Set the normalization scheme: %s", what);
336 DGUARD(fDebug,3,
"Set the normalization scheme: 0x%x", scheme);
345 AliErrorF(
"Unknown centrality estimator: %s", method.Data());
351 AliInfoF(
"No centrality estimator: \"%s\"", method.Data());
357 if (fName.Contains(
"Forward", TString::kIgnoreCase) && meth.Contains(
"FMD"))
358 AliWarningF(
"Centrality estimator %s used by %s - beware of auto-corr",
359 meth.Data(), fName.Data());
360 else if (fName.Contains(
"Central", TString::kIgnoreCase) &&
361 (meth.Contains(
"CL0") || meth.Contains(
"TKL")))
362 AliWarningF(
"Centrality estimator %s used by %s - beware of auto-corr",
363 meth.Data(), fName.Data());
366 AliInfoF(
"Centrality estimator set to %s", fCentMethod.Data());
377 if (m.EqualTo(
"NONE") || m.EqualTo(
"NO") || m.EqualTo(
"FALSE"))
384 else if (m.BeginsWith(
"NPA")) ret =
kCentNPA;
385 else if (m.BeginsWith(
"ZPC")) ret =
kCentZPC;
386 else if (m.BeginsWith(
"ZPA")) ret =
kCentZPA;
387 else if (m.BeginsWith(
"ZNC")) ret =
kCentZNC;
388 else if (m.BeginsWith(
"ZNA")) ret =
kCentZNA;
389 else if (m.BeginsWith(
"CND")) ret =
kCentCND;
390 else if (m.BeginsWith(
"CL1")) ret =
kCentCL1;
391 else if (m.BeginsWith(
"CL0")) ret =
kCentCL0;
392 else if (m.BeginsWith(
"TKL")) ret =
kCentTkl;
393 else if (m.BeginsWith(
"TRK")) ret =
kCentTrk;
394 else if (m.BeginsWith(
"FMD")) ret =
kCentFMD;
395 else if (m.BeginsWith(
"V0C")) ret =
kCentV0C;
396 else if (m.BeginsWith(
"V0A123")) ret =
kCentV0A123;
397 else if (m.BeginsWith(
"V0A")) ret =
kCentV0A;
398 else if (m.BeginsWith(
"V0M")) ret =
kCentV0M;
399 else if (m.BeginsWith(
"MULTV0A")) ret =
kMultV0A;
400 else if (m.BeginsWith(
"MULTV0M")) ret =
kMultV0M;
401 else if (m.BeginsWith(
"MULTV0C")) ret =
kMultV0C;
402 else if (m.BeginsWith(
"MULT")) ret =
kMult;
403 if (m.Contains(
"TRUE")) ret |=
kCentTrue;
404 if (m.Contains(
"EQ")) ret |=
kCentEq;
435 case kMult: ret =
"MULT";
break;
436 case kMultV0A: ret =
"MULTV0A";
break;
437 case kMultV0M: ret =
"MULTV0M";
break;
438 case kMultV0C: ret =
"MULTV0C";
break;
439 default: ret =
"";
break;
444 if (!tru) ret.Append(
"eq");
445 else ret.Append(
"Eq");
447 if (tru) ret.Append(
"true");
464 if (
fCentMethod.EqualTo(
"none", TString::kIgnoreCase)) {
468 Info(
"InitializeCentBins",
469 "No centrality, forcing centrality axis to null");
470 h->GetXaxis()->Set(0,0,0);
477 for (
Int_t i = 0; i < nbin; i++)
492 DGUARD(fDebug,1,
"Create user ouput object");
512 while ((bin = static_cast<CentralityBin*>(next())))
524 a.GetSize()-1, a.GetArray());
526 "Integral vs centrality",
527 a.GetSize()-2, a.GetArray());
535 "Integral vs centrality",
543 fMeanVsC =
new TProfile(
"sumVsC",
"Null",1,0,100);
552 fMeanVsC->SetYTitle(
"#LT#int signal#GT");
559 fTakenCent->SetTitle(
"Centralities taken by bins");
600 DGUARD(fDebug,2,
"Getting centrality from event of object: %s",
614 DMSG(fDebug,1,
"Centrality stored in AOD forward: %5.1f%%", cent);
618 if (cent < 0) cent = -.5;
619 else if (TMath::Abs(cent-100) < 1.1) cent = 100;
620 DMSG(fDebug,1,
"Centrality from mult: %5.1f%% (%d)", cent, qual);
647 DGUARD(fDebug,1,
"Analyse the AOD event");
651 if (!forward)
return false;
658 if (!data)
return false;
668 DMSG(fDebug,5,
"IPz=%f -> Weight %f", vtx, ipzW);
688 fMeanVsC->Fill(cent, data->Integral());
691 DMSG(fDebug,1,
"Got event centrality %f (%s)", cent,
694 "out-of-calib" :
"in-calib");
697 DMSG(fDebug,1,
"Centrality %5.2f%% maps to bin %d", cent, icent);
699 TMath::Abs(cent-
fCentAxis.GetXmax()) < 1e-6)
703 if (icent >= 1 && icent <=
fCentAxis.GetNbins())
737 const char*
title,
const char* ytitle)
750 h->SetMarkerColor(colour);
751 h->SetMarkerStyle(marker);
752 h->SetMarkerSize(marker == 29 || marker == 30 ? 1.2 : 1);
755 if (ytitle && ytitle[0] !=
'\0') ytit = ytitle;
756 ytit =
"#frac{1}{#it{N}}#frac{d#it{N}_{ch}}{d#it{#eta}}";
758 h->GetXaxis()->SetTitleFont(132);
759 h->GetXaxis()->SetLabelFont(132);
760 h->GetXaxis()->SetNdivisions(10);
761 h->GetYaxis()->SetTitleFont(132);
762 h->GetYaxis()->SetLabelFont(132);
763 h->GetYaxis()->SetNdivisions(10);
764 h->GetYaxis()->SetDecimals();
774 for (
Int_t i = 1; i <= copy->GetNbinsX(); i++) {
775 Double_t a = norm->GetBinContent(i);
776 for (
Int_t j = 1; j <= copy->GetNbinsY(); j++) {
778 copy->SetBinContent(i,j,0);
779 copy->SetBinError(i,j,0);
782 Double_t c = copy->GetBinContent(i, j);
783 Double_t e = copy->GetBinError(i, j);
784 copy->SetBinContent(i, j, c / a);
785 copy->SetBinError(i, j, e / a);
795 for (
Int_t i = 1; i <= copy->GetNbinsX(); i++) {
796 Double_t a = norm->GetBinContent(i);
798 copy->SetBinContent(i,0);
799 copy->SetBinError(i,0);
802 Double_t c = copy->GetBinContent(i);
804 copy->SetBinContent(i, c / a);
805 copy->SetBinError(i, e / a);
834 return h->ProjectionX(name, firstbin, lastbin, (error ?
"e" :
""));
836 const TAxis* xaxis = h->GetXaxis();
837 const TAxis* yaxis = h->GetYaxis();
838 TH1D* ret =
new TH1D(name, h->GetTitle(), xaxis->GetNbins(),
839 xaxis->GetXmin(), xaxis->GetXmax());
840 static_cast<const TAttLine*
>(h)->Copy(*ret);
841 static_cast<const TAttFill*
>(h)->Copy(*ret);
842 static_cast<const TAttMarker*
>(h)->Copy(*ret);
843 ret->GetXaxis()->ImportAttributes(xaxis);
845 Int_t first = firstbin;
846 Int_t last = lastbin;
847 if (first < 0) first = 1;
848 else if (first >= yaxis->GetNbins()+2) first = yaxis->GetNbins()+1;
849 if (last < 0) last = yaxis->GetNbins();
850 else if (last >= yaxis->GetNbins()+2) last = yaxis->GetNbins()+1;
851 if (last-first < 0) {
852 AliWarningGeneral(
"AliBasedNdetaTask",
853 Form(
"Nothing to project [%d,%d]", first, last));
860 Int_t ybins = (last-first+1);
861 for (
Int_t xbin = 0; xbin <= xaxis->GetNbins()+1; xbin++) {
867 for (
Int_t ybin = first; ybin <= last; ybin++) {
868 Double_t c1 = h->GetBinContent(h->GetBin(xbin, ybin));
869 Double_t e1 = h->GetBinError(h->GetBin(xbin, ybin));
872 if (c1 < 1e-12)
continue;
882 if(content > 0 && nbins > 0) {
885 AliWarningGeneral(ret->GetName(),
886 Form(
"factor @ %d is %d/%d -> %f",
887 xbin, ybins, nbins, factor));
891 ret->SetBinContent(xbin, content * factor);
892 ret->SetBinError(xbin, factor * TMath::Sqrt(error2));
895 ret->SetBinContent(xbin, factor * content);
916 DGUARD(fDebug,1,
"Process final merged results");
932 Info(
"",
"centAxis: %p (%s)", cH, (cH ? cH->ClassName() :
"null"));
934 TAxis* cA = (cH ? cH->GetXaxis() : 0);
948 gStyle->SetPalette(1);
949 THStack* dndetaStack =
new THStack(
"dndeta",
"dN/d#eta");
950 THStack* dndetaMCStack =
new THStack(
"dndetaMC",
"dN_{ch}/d#eta");
951 THStack* dndetaEmpStack =
new THStack(
"dndetaEmp",
"dN_{ch}/d#eta");
952 THStack* leftRightStack =
new THStack(
"leftRight",
"#eta>0/#eta<0");
955 TList* truthlist = 0;
961 mclist =
dynamic_cast<TList*
>(ftest->Get(Form(
"%sResults",GetName())));
962 truthlist =
dynamic_cast<TList*
>(ftest->Get(
"MCTruthResults"));
965 AliWarning(
"MC analysis file invalid - no final MC correction possible");
970 DMSG(fDebug,3,
"Marker style=%d, color=%d", style, color);
971 while ((bin = static_cast<CentralityBin*>(next()))) {
974 style, color, mclist, truthlist);
978 AliWarning(
"Skipping MB bin since we have centrality");
984 TH1* leftRight =
Asymmetry(dndetaEmp ? dndetaEmp : dndeta);
986 DMSG(fDebug,2,
"Results: bare=%p mcbare=%p", dndeta, dndetaMC);
987 if (dndeta) dndetaStack->Add(dndeta);
988 if (dndetaMC) dndetaMCStack->Add(dndetaMC);
989 if (dndetaEmp) dndetaEmpStack->Add(dndetaEmp);
990 if (leftRight) leftRightStack->Add(leftRight);
996 if (!dndetaMCStack->GetHists() ||
997 dndetaMCStack->GetHists()->GetEntries() <= 0) {
999 delete dndetaMCStack;
1002 if (dndetaMCStack)
fResults->Add(dndetaMCStack);
1005 DMSG(0,fDebug,
"Emp stack: %p (%d)", dndetaEmpStack,
1006 dndetaEmpStack->GetHists() && dndetaEmpStack->GetHists()->GetEntries()
1007 ? dndetaEmpStack->GetHists()->GetEntries() : -1);
1008 if (!dndetaEmpStack->GetHists() ||
1009 dndetaEmpStack->GetHists()->GetEntries() <= 0) {
1011 delete dndetaEmpStack;
1014 if (dndetaEmpStack)
fResults->Add(dndetaEmpStack);
1018 if (!leftRightStack->GetHists() ||
1019 leftRightStack->GetHists()->GetEntries() <= 0) {
1021 delete leftRightStack;
1024 if (leftRightStack)
fResults->Add(leftRightStack);
1030 sNNObj->SetUniqueID(sNN);
1038 sysObj->SetUniqueID(sys);
1044 centEstimator->SetUniqueID(centID);
1053 maskObj->SetUniqueID(trig);
1061 maskObj->SetUniqueID(filter);
1069 schemeObj->SetUniqueID(scheme);
1075 fIPzAxis.SetTitle(Form(
"v_{z}#in[%+5.1f,%+5.1f]cm",
1087 str.Append(Form(
"Empty bins %scorrected for, ",
fCorrEmpty ?
"" :
"not "));
1088 str.Append(Form(
"TH2::ProjectionX %sused",
fUseROOTProj ?
"" :
"not "));
1089 options->SetTitle(str);
1094 fMeanVsC =
static_cast<TProfile*
>(sumVsC->Clone());
1102 #define PF(N,V,...) \
1103 AliForwardUtil::PrintField(N,V, ## __VA_ARGS__)
1104 #define PFB(N,FLAG) \
1106 AliForwardUtil::PrintName(N); \
1107 std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
1109 #define PFV(N,VALUE) \
1111 AliForwardUtil::PrintName(N); \
1112 std::cout << (VALUE) << std::endl; } while(false)
1115 void appendBit(
TString&
str,
const char* bit)
1117 if (!str.IsNull()) str.Append(
"|");
1133 gROOT->IncreaseDirLevel();
1137 PFV(
"Normalization scheme", schemeString );
1148 if (opt.Contains(
"R") &&
1153 while ((bin = next())) bin->Print(option);
1155 gROOT->DecreaseDirLevel();
1162 Int_t base = bits & (0xFE);
1165 case kCircle:
return (hollow ? 24 : 20);
1166 case kSquare:
return (hollow ? 25 : 21);
1169 case kDiamond:
return (hollow ? 27 : 33);
1170 case kCross:
return (hollow ? 28 : 34);
1171 case kStar:
return (hollow ? 30 : 29);
1181 case 24:
case 25:
case 26:
case 27:
case 28:
case 30:
case 32:
1185 case 20:
case 24: bits |=
kCircle;
break;
1186 case 21:
case 25: bits |=
kSquare;
break;
1189 case 27:
case 33: bits |=
kDiamond;
break;
1190 case 28:
case 34: bits |=
kCross;
break;
1191 case 29:
case 30: bits |=
kStar;
break;
1208 DGUARD(
fDebug,1,
"Initializing sums with %s", data->GetName());
1211 const char* postfix = GetTitle();
1213 fSum =
static_cast<TH2D*
>(data->Clone(n));
1214 if (postfix)
fSum->SetTitle(Form(
"%s (%s)", data->GetTitle(), postfix));
1215 fSum->SetDirectory(0);
1216 fSum->SetMarkerColor(col);
1221 fSum0 =
static_cast<TH2D*
>(data->Clone(n0));
1223 fSum0->SetTitle(Form(
"%s 0-bin (%s)", data->GetTitle(), postfix));
1225 fSum0->SetTitle(Form(
"%s 0-bin", data->GetTitle()));
1226 fSum0->SetDirectory(0);
1227 fSum0->SetMarkerColor(col);
1234 fEvents->SetFillColor(kRed+1);
1236 fEvents->GetXaxis()->SetBinLabel(1,
"Non-zero");
1237 fEvents->GetXaxis()->SetBinLabel(2,
"Zero");
1244 Int_t what,
const char* post)
1248 case 0: n =
"sum";
break;
1249 case 1: n =
"sum0";
break;
1250 case 2: n =
"events";
break;
1252 if (post && post[0] !=
'\0') n.Append(post);
1260 return GetHistName(GetName(), what, GetTitle());
1267 DGUARD(fDebug,2,
"Adding %s to sums w/weight %f (%f)",
1268 data->GetName(),weight,data->Integral());
1269 if (isZero) fSum0->Add(data, weight);
1270 else fSum->Add(data, weight);
1271 fEvents->Fill(isZero ? 1 : 0);
1284 DGUARD(fDebug,2,
"Calculating final summed histogram %s", fSum->GetName());
1287 TH2D* ret =
static_cast<TH2D*
>(fSum->Clone(fSum->GetName()));
1288 ret->SetDirectory(0);
1295 "Adding histograms %s(%d) and %s(%d) w/weights %f and %f resp.",
1296 fSum0->GetName(), n, fSum->GetName(), n0, 1./epsilon,1./epsilon0);
1297 ret->Add(fSum0, fSum, 1. / epsilon0, 1. / epsilon);
1298 ntotal = n / epsilon + n0 / epsilon0;
1303 const char* postfix = GetTitle();
1304 if (!postfix) postfix =
"";
1305 out->SetName(Form(
"partial%s", postfix));
1311 TH2D* sumCopy =
static_cast<TH2D*
>(fSum->Clone(
"sum"));
1312 TH2D* sum0Copy =
static_cast<TH2D*
>(fSum0->Clone(
"sum0"));
1313 TH2D* retCopy =
static_cast<TH2D*
>(ret->Clone(
"sumAll"));
1315 sumCopy->SetDirectory(0);
1317 sum0Copy->SetDirectory(0);
1318 retCopy->SetMarkerStyle(marker);
1319 retCopy->SetDirectory(0);
1321 Int_t nY = fSum->GetNbinsY();
1323 TH1D* norm =
ProjectX(fSum,
"norm", o, o, rootProj, corrEmpty,
false);
1324 TH1D* norm0 =
ProjectX(fSum0,
"norm0", o, o, rootProj, corrEmpty,
false);
1325 TH1D* normAll =
ProjectX(ret,
"normAll", o, o, rootProj, corrEmpty,
false);
1326 norm->SetTitle(
"#eta coverage - >0-bin");
1327 norm0->SetTitle(
"#eta coverage - 0-bin");
1328 normAll->SetTitle(
"#eta coverage");
1329 norm->SetDirectory(0);
1330 norm0->SetDirectory(0);
1331 normAll->SetDirectory(0);
1333 TH1D* sumCopyPx =
ProjectX(sumCopy,
"average", 1,nY,rootProj,corrEmpty);
1334 TH1D* sum0CopyPx =
ProjectX(sum0Copy,
"average0", 1,nY,rootProj,corrEmpty);
1335 TH1D* retCopyPx =
ProjectX(retCopy,
"averageAll", 1,nY,rootProj,corrEmpty);
1336 sumCopyPx-> SetTitle(Form(
"#sum_{i}^{N_{#phi}}%s", sumCopy->GetTitle()));
1337 sum0CopyPx->SetTitle(Form(
"#sum_{i}^{N_{#phi}}%s", sum0Copy->GetTitle()));
1338 retCopyPx-> SetTitle(Form(
"#sum_{i}^{N_{#phi}}%s", retCopy->GetTitle()));
1339 sumCopyPx-> SetDirectory(0);
1340 sum0CopyPx->SetDirectory(0);
1341 retCopyPx-> SetDirectory(0);
1343 TH1D* phi =
ProjectX(fSum,
"phi", nY+1,nY+1,rootProj,corrEmpty,
false);
1344 TH1D* phi0 =
ProjectX(fSum0,
"phi0", nY+1,nY+1,rootProj,corrEmpty,
false);
1345 TH1D* phiAll =
ProjectX(ret,
"phiAll", nY+1,nY+1,rootProj,corrEmpty,
false);
1346 phi ->SetTitle(
"#phi acceptance from dead strips - >0-bin");
1347 phi0 ->SetTitle(
"#phi acceptance from dead strips - 0-bin");
1348 phiAll->SetTitle(
"#phi acceptance from dead strips");
1349 phi ->SetDirectory(0);
1350 phi0 ->SetDirectory(0);
1351 phiAll->SetDirectory(0);
1353 const TH1D* cov = (corrEmpty ? norm : phi);
1354 const TH1D* cov0 = (corrEmpty ? norm0 : phi0);
1355 const TH1D* covAll = (corrEmpty ? normAll : phiAll);
1363 sumCopyPx ->Scale(1.,
"width");
1364 sum0CopyPx->Scale(1.,
"width");
1365 retCopyPx ->Scale(1.,
"width");
1367 DMSG(fDebug,2,
"Maximum %f,%f changed to %f", sumCopyPx->GetMaximum(),
1368 sum0CopyPx->GetMaximum(), retCopyPx->GetMaximum());
1371 norm ->Scale(n > 0 ? 1. / n : 1);
1372 norm0 ->Scale(n0 > 0 ? 1. / n0 : 1);
1373 normAll->Scale(ntotal > 0 ? 1. / ntotal : 1);
1376 phi ->Scale(n > 0 ? 1. / n : 1);
1377 phi0 ->Scale(n0 > 0 ? 1. / n0 : 1);
1378 phiAll->Scale(ntotal > 0 ? 1. / ntotal : 1);
1383 out->Add(sumCopyPx);
1384 out->Add(sum0CopyPx);
1385 out->Add(retCopyPx);
1395 DMSG(fDebug,1,
"Returning (1/%f * %s + 1/%f * %s), "
1396 "1/%f * %d + 1/%f * %d = %d",
1397 epsilon0, fSum0->GetName(), epsilon, fSum->GetName(),
1398 epsilon0, n0, epsilon, n, int(ntotal));
1400 DMSG(fDebug,1,
"Returning %s, %d", fSum->GetName(), int(ntotal));
1404 for (
Int_t i = 1; i <= ret->GetNbinsX(); i++) {
1405 Double_t nc = sum->GetBinContent(i, 0);
1406 Double_t nc0 = sum0->GetBinContent(i, 0);
1407 ret->SetBinContent(i, 0, nc + nc0);
1417 PFV(
"dN/deta sum bin", GetName());
1418 gROOT->IncreaseDirLevel();
1419 PF(
"Normal sum",
"%s (%p)", GetHistName(0).
Data(), fSum);
1420 PF(
"0-bin sum",
"%s (%p)", GetHistName(1).
Data(), fSum0);
1421 PF(
"Event count",
"%s (%p)", GetHistName(2).
Data(), fEvents);
1422 gROOT->DecreaseDirLevel();
1436 fDoFinalMCCorrection(false),
1443 DGUARD(
fDebug,3,
"Default CTOR of AliBasedNdeta::CentralityBin");
1445 #define TRUNC(X) (Int_t(X) + Float_t(Int_t(X*100)%100)/100)
1459 fDoFinalMCCorrection(false),
1471 DGUARD(
fDebug,3,
"Named CTOR of AliBasedNdeta::CentralityBin: "
1473 if (low <= 0 && high <= 0) {
1476 SetTitle(
"All centralities");
1481 SetTitle(Form(
"Centrality bin from %6.2f%% to %6.2f%%", low, high));
1495 fDoFinalMCCorrection(o.fDoFinalMCCorrection),
1505 DGUARD(
fDebug,3,
"Copy CTOR of AliBasedNdeta::CentralityBin");
1513 DGUARD(fDebug,3,
"DTOR of AliBasedNdeta::CentralityBin");
1532 DGUARD(fDebug,3,
"Centrality bin assignment");
1533 if (&o ==
this)
return *
this;
1534 SetName(o.GetName());
1535 SetTitle(o.GetTitle());
1551 Color_t Brighten(Color_t origNum,
Int_t nTimes=2)
1553 TColor* col = gROOT->GetColor(origNum);
1554 if (!col)
return origNum;
1558 Int_t off = nTimes*0x33;
1559 Int_t newR = TMath::Min((origR+off),0xff);
1560 Int_t newG = TMath::Min((origG+off),0xff);
1561 Int_t newB = TMath::Min((origB+off),0xff);
1562 Int_t newNum = TColor::GetColor(newR, newG, newB);
1573 if (IsAllBin())
return kBlack;
1575 Int_t nCol = gStyle->GetNumberOfColors();
1576 Int_t icol = TMath::Min(nCol-1,
int(fc * nCol + .5));
1577 Int_t col = gStyle->GetColorPalette(icol);
1580 col = Brighten(orig);
1596 if (IsAllBin())
return "all";
1597 return Form(
"cent%03dd%02d_%03dd%02d",
1612 DGUARD(fDebug,1,
"Create centrality bin output objects");
1614 fSums->SetName(GetListName());
1622 fStatus->SetDirectory(0);
1625 fSums->Add(fStatus);
1635 if (fSum) fSum->fDebug = lvl;
1636 if (fSumMC) fSumMC->fDebug = lvl;
1643 const char* post = (mc ?
"MC" :
"");
1647 TH2D* sum =
static_cast<TH2D*
>(list->FindObject(sn));
1648 TH2D* sum0 =
static_cast<TH2D*
>(list->FindObject(sn0));
1649 TH1I* events =
static_cast<TH1I*
>(list->FindObject(ev));
1650 if (!sum || !sum0 || !events) {
1652 AliWarningF(
"Failed to find one or more histograms: "
1653 "%s (%p) %s (%p) %s (%p)",
1659 Sum* ret =
new Sum(GetName(), post);
1664 if (mc) fSumMC = ret;
1681 DGUARD(fDebug,1,
"Create centrality bin sums from %s",
1682 data ? data->GetName() :
"(null)");
1684 fSum =
new Sum(GetName(),
"");
1686 fSum->fDebug = fDebug;
1692 fSumMC =
new Sum(GetName(),
"MC");
1694 fSumMC->fDebug = fDebug;
1714 if (!forward)
return false;
1716 DGUARD(fDebug,2,
"Check the event "
1717 "IPz: %f < %f < %f Trigger: 0x%08x (masked 0x%08x vetoed 0x%08x)",
1718 vzMin, forward->
GetIpZ(), vzMax,
1725 DMSG(fDebug, 2,
"%s", (ret ?
"Accepted" :
"Rejected"));
1754 DGUARD(fDebug,1,
"Process one event for %s a given centrality bin "
1755 "[%5.1f%%,%5.1f%%) w/weight %f",
1756 data ? data->GetName() :
"(null)", fLow, fHigh, weight);
1757 if (!
CheckEvent(forward, triggerMask, vzMin, vzMax, filter))
1759 if (!data)
return false;
1760 if (!fSum) CreateSums(data, mc);
1762 fSum->Add(data, isZero, weight);
1763 if (mc) fSumMC->Add(mc, isZero, weight);
1785 DGUARD(fDebug,1,
"Normalize centrality bin %s [%6.2f-%6.2f%%] with %s",
1786 GetName(), fLow, fHigh, t.GetName());
1798 if (nTriggered <= 0.1) {
1799 AliError(
"Number of triggered events <= 0");
1802 if (nWithVertex <= 0.1) {
1803 AliError(
"Number of events with vertex <= 0");
1807 Double_t vtxEff = nWithVertex / nTriggered;
1815 ntotal = nAccepted / vtxEff;
1817 DMSG(fDebug,0,
"Calculating event normalisation as\n"
1818 " N = N_A * N_T / N_V = %d * %d / %d = %f (%f)",
1834 ntotal -= nAccepted * beta / nWithVertex;
1838 scaler /= (1 - beta / nTriggered);
1839 DMSG(fDebug,0,
"Calculating event normalisation as\n"
1840 " beta = N_a + N_c + 2 N_e = %d + %d - 2 * %d = %d\n"
1841 " N = N - N_A * beta / N_V = %f - %d * %d / %d = %f (%f)",
1843 nAccepted / vtxEff,
Int_t(nAccepted),
Int_t(beta),
1844 Int_t(nWithVertex), ntotal, scaler);
1845 rhs.Append(
"(1/eps_V - beta/N_vtx)");
1848 rhs.Append(
"/eps_V");
1854 DMSG(fDebug,0,
"Correcting for trigger efficiency:\n"
1855 " N = 1 / E_X * N = 1 / %f * %d = %f (%f)",
1856 trigEff, old, ntotal, scaler);
1857 rhs.Append(
"/eps_T");
1871 ntotal = nAccepted * (1 + 1/trigEff * (nTriggered / nWithVertex - 1
1872 - beta / nWithVertex));
1873 scaler = nWithVertex / (nWithVertex +
1874 1/trigEff * (nTriggered-nWithVertex-beta));
1875 DMSG(fDebug,0,
"Calculating event normalisation as\n"
1876 " beta = N_a + N_c + 2 N_e = %d + %d - 2 * %d = %d\n"
1877 " N = N_A (1 + 1/E_X (N_T/N_V - 1 - beta / N_V)) = "
1878 "%d (1 + 1 / %f (%d / %d - 1 - %d / %d)) = %f (%f)",
1880 Int_t(nAccepted), trigEff,
Int_t(nTriggered),
1883 rhs.Append(
"(1+1/eps_T(1/eps_V-1-beta/N_vtx))");
1887 text->Append(Form(
"%-40s = %d\n",
"N_all",
UInt_t(nAll)));
1888 text->Append(Form(
"%-40s = %d\n",
"N_acc",
UInt_t(nAccepted)));
1889 text->Append(Form(
"%-40s = %d\n",
"N_trg",
UInt_t(nTriggered)));
1890 text->Append(Form(
"%-40s = %d\n",
"N_vtx",
UInt_t(nWithVertex)));
1891 text->Append(Form(
"%-40s = %d\n",
"N_B",
UInt_t(nB)));
1892 text->Append(Form(
"%-40s = %d\n",
"N_A",
UInt_t(nA)));
1893 text->Append(Form(
"%-40s = %d\n",
"N_C",
UInt_t(nC)));
1894 text->Append(Form(
"%-40s = %d\n",
"N_E",
UInt_t(nE)));
1895 text->Append(Form(
"%-40s = %d\n",
"beta = N_A + N_C - 2N_E",
UInt_t(beta)));
1896 text->Append(Form(
"%-40s = %f\n",
"eps_V = N_vtx/N_trg",vtxEff));
1897 text->Append(Form(
"%-40s = %f\n",
"eps_T", trigEff));
1898 text->Append(Form(
"%-40s = %f\n", rhs.Data(), ntotal));
1901 tN.ReplaceAll(
"w/Selected trigger (",
"");
1902 tN.ReplaceAll(
")",
"");
1905 " Total of %9d events for %s\n"
1906 " of these %9d have an offline trigger\n"
1907 " of these N_T = %9d has the selected trigger (%s)\n"
1908 " of these N_V = %9d has a vertex\n"
1909 " of these N_A = %9d were in the selected range",
1910 Int_t(nAll), GetTitle(),
1912 Int_t(nTriggered), tN.Data(),
1916 " Triggers by hardware type:\n"
1918 " N_ac = %9d (%d+%d)\n"
1920 " Vertex efficiency: %f\n"
1921 " Trigger efficiency: %f\n"
1922 " Total number of events: N = %f\n"
1923 " Scaler (N_A/N): %f\n"
1932 rhs.Data(), ntotal);
1935 " Total of %9d events for %s",
Int_t(nAll), GetTitle());
1936 DMSG(d,0,
" of these %9d have an offline trigger",
Int_t(nOffline));
1937 DMSG(d,0,
" of these N_T = %9d has the selected trigger (%s)",
1938 Int_t(nTriggered), tN.Data());
1939 DMSG(d,0,
" of these N_V = %9d has a vertex",
Int_t(nWithVertex));
1940 DMSG(d,0,
" of these N_A = %9d were in the selected range",
Int_t(nAccepted));
1941 DMSG(d,0,
" Triggers by hardware type:");
1945 DMSG(d,0,
" Vertex efficiency: %f",vtxEff);
1946 DMSG(d,0,
" Trigger efficiency: %f",trigEff);
1947 DMSG(d,0,
" Total number of events: N = %f",ntotal);
1948 DMSG(d,0,
" Scaler (N_A/N): %f",scaler);
1949 DMSG(fDebug, 0,
" %-25s = %f", rhs.Data(), ntotal);
1960 n.ReplaceAll(
"dNdeta",
"");
1961 n.Prepend(
"dndeta");
1971 AliWarningF(
"No output list defined in %s [%6.2f,%6.2f]", GetName(),
1975 TString n = GetResultName(postfix);
1976 TObject* o = fOutput->FindObject(n.Data());
1979 AliWarningF(
"Object %s not found in output list of %s",
1980 n.Data(), GetName());
1983 return static_cast<TH1*
>(o);
1989 const char* postfix,
2008 DGUARD(fDebug,1,
"Make centrality bin result from %s", sum->GetName());
2010 base.ReplaceAll(
"dNdeta",
"");
2011 base.Append(postfix);
2012 TH2D* copy =
static_cast<TH2D*
>(sum->Clone(Form(
"d2Ndetadphi%s",
2016 Int_t nY = sum->GetNbinsY();
2027 Int_t o = (corrEmpty ? 0 : nY+1);
2028 accNorm =
ProjectX(sum, Form(
"norm%s",base.Data()), o, o,
2029 rootProj, corrEmpty,
false);
2030 accNorm->SetDirectory(0);
2036 copy->Scale(scaler);
2040 TH1D* dndeta =
ProjectX(copy, Form(
"dndeta%s",base.Data()),
2041 1, nY, rootProj, corrEmpty);
2042 dndeta->SetDirectory(0);
2046 dndeta->Scale(scaler);
2048 dndeta->Scale(1.,
"width");
2049 copy->Scale(1.,
"width");
2051 TH1D* dndetaMCCorrection = 0;
2052 TH1D* dndetaMCtruth = 0;
2053 TList* centlist = 0;
2054 TList* truthcentlist = 0;
2060 centlist =
static_cast<TList*
> (mclist->FindObject(GetListName()));
2062 dndetaMCCorrection =
2063 static_cast<TH1D*
>(centlist->FindObject(Form(
"dndeta%s%s",
2068 truthcentlist =
static_cast<TList*
>(truthlist->FindObject(GetListName()));
2072 static_cast<TH1D*
>(truthcentlist->FindObject(Form(
"dndetaMCTruth%s",
2076 if (dndetaMCCorrection && dndetaMCtruth) {
2077 AliInfo(
"Correcting with final MC correction");
2078 TString testString(dndetaMCCorrection->GetName());
2081 dndetaMCCorrection->Divide(dndetaMCtruth);
2082 dndetaMCCorrection->SetTitle(
"Final MC correction");
2083 dndetaMCCorrection->SetName(
"finalMCCorr");
2084 for(
Int_t m = 1; m <= dndetaMCCorrection->GetNbinsX(); m++) {
2085 if(dndetaMCCorrection->GetBinContent(m) < 0.5 ||
2086 dndetaMCCorrection->GetBinContent(m) > 1.75) {
2087 dndetaMCCorrection->SetBinContent(m,1.);
2088 dndetaMCCorrection->SetBinError(m,0.1);
2095 dndeta->Divide(dndetaMCCorrection);
2099 for(
Int_t m = 1; m <= dndeta->GetNbinsX(); m++) {
2100 if(dndeta->GetBinContent(m) <= 0.01 )
continue;
2102 Double_t eta = dndeta->GetXaxis()->GetBinCenter(m);
2103 Int_t bin = dndetaMCCorrection->GetXaxis()->FindBin(eta);
2104 Double_t mccorr = dndetaMCCorrection->GetBinContent(bin);
2105 Double_t mcerror = dndetaMCCorrection->GetBinError(bin);
2106 if (mccorr < 1e-6) {
2107 dndeta->SetBinContent(m, 0);
2108 dndeta->SetBinError(m, 0);
2110 Double_t value = dndeta->GetBinContent(m);
2111 Double_t error = dndeta->GetBinError(m);
2112 Double_t sumw2 = (error * error * mccorr * mccorr +
2113 mcerror * mcerror * value * value);
2114 dndeta->SetBinContent(m,value/mccorr) ;
2115 dndeta->SetBinError(m,TMath::Sqrt(sumw2)/mccorr/mccorr);
2120 DMSG(fDebug,1,
"No final MC correction applied");
2125 if (postfix && postfix[0] !=
'\0') post = Form(
" (%s)", postfix);
2127 Form(
"ALICE %s%s", GetName(), post.Data()));
2129 Form(
"ALICE %s normalisation%s",
2130 GetName(), post.Data()));
2133 fOutput->Add(dndeta);
2134 fOutput->Add(accNorm);
2136 if (dndetaMCCorrection) fOutput->Add(dndetaMCCorrection);
2142 for (
Int_t nn=1; nn <= sum->GetNbinsY(); nn++) {
2143 TH1D* dndeta_phi =
ProjectX(copy, Form(
"dndeta%s_phibin%d",
2145 nn, nn, rootProj, corrEmpty);
2146 dndeta_phi->SetDirectory(0);
2148 dndeta_phi->Scale(TMath::Pi()/10.,
"width");
2151 dndetaMCCorrection =
2152 static_cast<TH1D*
>(centlist->FindObject(Form(
"dndeta%s_phibin%d",
2156 =
static_cast<TH1D*
>(truthcentlist->FindObject(
"dndetaMCTruth"));
2158 if (dndetaMCCorrection && dndetaMCtruth) {
2159 AliInfo(
"Correcting with final MC correction");
2160 TString testString(dndetaMCCorrection->GetName());
2161 dndetaMCCorrection->Divide(dndetaMCtruth);
2162 dndetaMCCorrection->SetTitle(Form(
"Final_MC_correction_phibin%d",nn));
2163 dndetaMCCorrection->SetName(Form(
"Final_MC_correction_phibin%d",nn));
2164 for(
Int_t m = 1; m <= dndetaMCCorrection->GetNbinsX(); m++) {
2165 if(dndetaMCCorrection->GetBinContent(m) < 0.25 ||
2166 dndetaMCCorrection->GetBinContent(m) > 1.75) {
2167 dndetaMCCorrection->SetBinContent(m,1.);
2168 dndetaMCCorrection->SetBinError(m,0.1);
2172 dndeta_phi->Divide(dndetaMCCorrection);
2174 fOutput->Add(dndeta_phi);
2175 if(dndetaMCCorrection) fOutput->Add(dndetaMCCorrection);
2205 DGUARD(fDebug,1,
"End centrality bin procesing");
2207 fSums =
dynamic_cast<TList*
>(sums->FindObject(GetListName()));
2209 AliError(
"Could not retrieve TList fSums");
2213 fOutput =
new TList;
2214 fOutput->SetName(GetListName());
2215 fOutput->SetOwner();
2216 results->Add(fOutput);
2219 if (!ReadSum(
fSums,
false)) {
2220 AliInfo(
"This task did not produce any output");
2224 if (!fSumMC) ReadSum(
fSums,
true);
2229 AliError(
"Couldn't find histogram 'triggers' in list");
2236 DMSG(fDebug,2,
"Using epsilonT=%f, epsilonT0=%f for 0x%x",
2237 epsilonT, epsilonT0, triggerMask);
2241 TH2D* sum = fSum->CalcSum(fOutput, nSum, epsilonT0, epsilonT,
2242 marker, rootProj, corrEmpty);
2245 if (fSumMC) sumMC = fSumMC->CalcSum(fOutput, nSumMC,
2246 epsilonT0, epsilonT, marker,
2247 rootProj, corrEmpty);
2249 AliError(
"Failed to get sum from summer - bailing out");
2257 AliError(
"Failed to calculate normalization - bailing out");
2261 fOutput->Add(
new TNamed(
"normCalc", text.Data()));
2266 MakeResult(sum,
"", rootProj, corrEmpty, scaler, marker, color,
2271 MakeResult(sumMC,
"MC", rootProj, corrEmpty, scaler,
2284 PFV(
"Centrality bin", GetTitle());
2285 gROOT->IncreaseDirLevel();
2286 PF(
"Range",
"%6.2f - %6.2f%%", fLow, fHigh);
2287 PFB(
"All bin", IsAllBin());
2288 PFB(
"Final MC", fDoFinalMCCorrection);
2293 if (opt.Contains(
"R")) {
2294 if (fSum) fSum->Print(option);
2295 if (fSumMC) fSumMC->Print(option);
2298 gROOT->DecreaseDirLevel();
2312 for (
int i=1;i<=data->GetNbinsX();i++) {
2314 ->FindBin(data->GetXaxis()->GetBinCenter(i));
2318 ->GetBinContent(binzvertex,bincorrection);
2319 if(correction<0.001) {
2320 data->SetBinContent(i,0,0);
2321 data->SetBinContent(i,data->GetNbinsY()+1,0);
2323 for(
int j=1;j<=data->GetNbinsY();j++) {
2324 if (data->GetBinContent(i,j)>0.0) {
2325 data->SetBinContent(i,j,data->GetBinContent(i,j)*correction);
2326 data->SetBinError(i,j,data->GetBinError(i,j)*correction);
2339 TH1* ret =
static_cast<TH1*
>(h->Clone(Form(
"%s_leftright", h->GetName())));
2346 ret->SetDirectory(0);
2348 ret->SetTitle(Form(
"%s (+/-)", h->GetTitle()));
2349 ret->SetYTitle(
"Right/Left");
2350 Int_t nBins = h->GetNbinsX();
2351 for (
Int_t i = 1; i <= nBins; i++) {
2357 if (c1 <= 0)
continue;
2359 Int_t j = h->FindBin(-x);
2360 if (j <= 0 || j > nBins)
continue;
2366 Double_t e = TMath::Sqrt((e2*e2*c1*c1+e1*e1*c2*c2)/(c12*c12));
2368 Int_t k = ret->FindBin(x);
2369 ret->SetBinContent(k, c2/c1);
2370 ret->SetBinError(k, e);
virtual Bool_t CheckEvent(const AliAODForwardMult &forward)
const char * GetResultName(const char *postfix="") const
return jsonbuilder str().c_str()
void Print(Option_t *option="R") const
static void ScaleToCoverage(TH2D *copy, const TH1D *norm)
void SetTriggerBits(UInt_t bits)
static const char * CenterOfMassEnergyString(UShort_t cms)
static UShort_t ParseNormalizationScheme(const Char_t *what)
TH2D * fEmpiricalCorrection
UShort_t fNormalizationScheme
Double_t GetCentrality(AliAODEvent &event, AliAODForwardMult *forward, Int_t &qual)
virtual Bool_t Event(AliAODEvent &aod)
static TH1I * MakeTriggerHistogram(const char *name="triggers", UInt_t mask=0)
virtual void InitializeCentBins()
#define DMSG(L, N, F,...)
static TH1 * Asymmetry(TH1 *h)
TH2D * CalcSum(TList *o, Double_t &ntotal, Double_t zeroEff, Double_t otherEff=1, Int_t marker=20, Bool_t rootXproj=false, Bool_t corrEmpty=true) const
virtual void MakeResult(const TH2D *sum, const char *postfix, bool rootProj, bool corrEmpty, Double_t scaler, Int_t marker, Int_t color, TList *mclist, TList *truthlist)
virtual void CheckEventData(Double_t vtx, TH2 *data, TH2 *mcData)
virtual void SetDebugLevel(Int_t level)
virtual void Print(Option_t *option="") const
void SetIPzAxis(Int_t n, Double_t min, Double_t max)
virtual ~AliBasedNdetaTask()
static Int_t GetMarkerStyle(UShort_t bits)
static Int_t FlipHollowStyle(Int_t style)
virtual Bool_t Finalize()
AliAnalysisUtils fAnaUtil
void SetNormalizationScheme(UShort_t scheme)
void Init(TList *list, const TH2D *data, Int_t col)
static Bool_t IsTriggerBits(UInt_t bits, UInt_t trg)
virtual Bool_t CheckEvent(const AliAODForwardMult *forward, Int_t triggerMask, Double_t vzMin, Double_t vzMax, Int_t filter)
Various utilities used in PWGLF/FORWARD.
Bool_t fSatelliteVertices
static void GetParameter(TObject *o, UShort_t &value)
void Print(Option_t *option="") const
void SetDebugLevel(Int_t lvl)
virtual Int_t GetColor() const
virtual void CreateSums(const TH2D *data, const TH2D *mc)
virtual Bool_t ProcessEvent(const AliAODForwardMult *forward, UInt_t triggerMask, Bool_t isZero, Double_t vzMin, Double_t vzMax, const TH2D *data, const TH2D *mc, UInt_t filter, Double_t weight)
void SetColor(Color_t colour)
Bool_t fDoFinalMCCorrection
TObjArray * fListOfCentralities
static const Char_t * GetTriggerString(UInt_t mask, const char *sep="&")
#define DGUARD(L, N, F,...)
const char * GetListName() const
CentralityBin & operator=(const CentralityBin &other)
static Int_t GetCentMethodID(const TString &meth)
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
static const char * GetCentMethod(UShort_t id)
virtual CentralityBin * MakeCentralityBin(const char *name, Float_t low, Float_t high) const
static TObject * MakeParameter(const char *name, UShort_t value)
void SetSatelliteVertices(Bool_t satVtx)
virtual TH2D * GetHistogram(const AliAODEvent &aod, Bool_t mc=false)=0
static TH1I * MakeStatusHistogram(const char *name="status")
virtual Bool_t ReadSum(TList *list, bool mc=false)
void AddCentralityBin(UShort_t at, Float_t low, Float_t high)
Bool_t ApplyEmpiricalCorrection(const AliAODForwardMult *aod, TH2D *data)
TH1 * GetResult(const char *postfix="", Bool_t verbose=true) const
static Float_t GetCentrality(const AliVEvent &event, const TString &method, Int_t &qual, Bool_t verbose=false)
static TH1D * ProjectX(const TH2D *h, const char *name, Int_t firstbin, Int_t lastbin, bool useROOT=false, bool corr=true, bool error=true)
void Add(const TH2D *data, Bool_t isZero, Double_t weight)
AliAODForwardMult * GetForward(const AliAODEvent &aod, Bool_t mc=false, Bool_t verb=true)
UInt_t GetTriggerBits() const
virtual void End(TList *sums, TList *results, UShort_t scheme, Double_t trigEff, Double_t trigEff0, Bool_t rootProj, Bool_t corrEmpty, Int_t triggerMask, Int_t marker, Int_t color, TList *mclist, TList *truthlist)
Bool_t fSatelliteVertices
virtual Bool_t CheckEvent(const AliAODForwardMult &forward)
static TString GetHistName(const char *name, Int_t what=0, const char *post=0)
#define TESTAPPEND(SCHEME, BIT, STRING)
static const char * CollisionSystemString(UShort_t sys)
virtual void CreateOutputObjects(TList *dir, Int_t mask)
virtual Int_t GetMarker() const
virtual Double_t GetCentrality(AliAODEvent &event, AliAODForwardMult *forward, Int_t &qual)
virtual void Print(Option_t *option="") const
Bool_t CheckEvent(UInt_t triggerMask=kInel, Double_t vzMin=-10, Double_t vzMax=10, Double_t cMin=0, Double_t cMax=100, TH1 *hist=0, TH1 *status=0, UInt_t filterMask=kDefaultFilter) const
Int_t GetColor(Int_t fallback=kRed+2) const
static UShort_t GetMarkerBits(Int_t style)
Bool_t HasCentrality() const
Bool_t SetCentralityMethod(const TString &method)
static const Char_t * NormalizationSchemeString(UShort_t scheme)
virtual Double_t Normalization(const TH1I &t, UShort_t scheme, Double_t trgEff, Double_t &ntotal, TString *text) const
static void SetHistogramAttributes(TH1D *h, Int_t colour, Int_t marker, const char *title, const char *ytitle=0)