10 #include <AliAnalysisManager.h>
11 #include <AliAODEvent.h>
12 #include <AliAODHandler.h>
13 #include <AliAODInputHandler.h>
20 #include <TParameter.h>
38 else if (c < 10)
return 1;
39 else if (c < 20)
return 2;
40 else if (c < 30)
return 3;
41 else if (c < 40)
return 4;
42 else if (c < 50)
return 5;
43 else if (c < 60)
return 6;
44 else if (c < 70)
return 7;
45 else if (c < 80)
return 8;
46 else if (c < 90)
return 9;
60 const Color_t
cc[] = { kMagenta+2,
87 else if (c < 10)
return 1;
88 else if (c < 20)
return 2;
89 else if (c < 40)
return 3;
90 else if (c < 60)
return 4;
91 else if (c < 80)
return 5;
92 else if (c < 100)
return 6;
106 const Color_t
cc[] = { kMagenta+2,
114 Int_t bin = pPbBin(c1,c2);
126 fListOfCentralities(0),
127 fNormalizationScheme(kFull),
128 fFinalMCCorrFile(
""),
129 fSatelliteVertices(0),
130 fEmpiricalCorrection(0),
134 fCentMethod(
"default"),
136 fUseUtilPileup(false),
144 DGUARD(fDebug,3,
"Default CTOR of AliBasedNdetaTask");
154 fListOfCentralities(0),
155 fNormalizationScheme(kFull),
156 fFinalMCCorrFile(
""),
157 fSatelliteVertices(0),
158 fEmpiricalCorrection(0),
162 fCentMethod(
"default"),
164 fUseUtilPileup(false),
172 DGUARD(fDebug, 3,
"Named CTOR of AliBasedNdetaTask: %s", name);
191 DGUARD(fDebug,3,
"Destruction of AliBasedNdetaTask");
198 AliAnalysisTaskSE::SetDebugLevel(lvl);
217 DGUARD(fDebug,3,
"Add a centrality bin [%6.2f,%6.2f] @ %d", low, high, at);
220 Error(
"AddCentralityBin",
221 "Failed to create centrality bin for %s [%6.2f,%6.2f] @ %d",
222 GetName(), low, high, at);
230 else color = pPbColor (low,high);
232 DMSG(fDebug, 3,
"Color of bin %d", color);
253 DGUARD(fDebug,3,
"Make a centrality bin %s [%6.2f,%6.2f]", name, low, high);
257 #define TESTAPPEND(SCHEME,BIT,STRING) \
258 do { if (!(SCHEME & BIT)) break; \
259 if (!s.IsNull()) s.Append(","); s.Append(STRING); } while(false)
271 if (scheme ==
kFull) {
289 if (twhat.EqualTo(
"DEFAULT"))
292 TObjArray* token = twhat.Tokenize(
" ,|");
294 while ((opt = static_cast<TObjString*>(next()))) {
296 if (s.IsNull())
continue;
299 case '-': add =
false;
300 case '+': s.Remove(0,1);
303 if (s.EqualTo(
"SHAPE")) {
304 AliWarningGeneral(
"AliBasedNdetaTask",
305 Form(
"SHAPE correction no longer supported (%s)",
310 else if (s.CompareTo(
"BACKGROUND")== 0) bit =
kBackground;
312 else if (s.CompareTo(
"FULL") == 0) bit =
kFull;
313 else if (s.CompareTo(
"NONE") == 0) bit =
kNone;
314 else if (s.CompareTo(
"ZEROBIN") == 0) bit =
kZeroBin;
316 ::Warning(
"SetNormalizationScheme",
"Unknown option %s", s.Data());
317 if (add) scheme |= bit;
330 DGUARD(fDebug,3,
"Set the normalization scheme: %s", what);
337 DGUARD(fDebug,3,
"Set the normalization scheme: 0x%x", scheme);
346 AliErrorF(
"Unknown centrality estimator: %s", method.Data());
352 AliInfoF(
"No centrality estimator: \"%s\"", method.Data());
358 if (fName.Contains(
"Forward", TString::kIgnoreCase) && meth.Contains(
"FMD"))
359 AliWarningF(
"Centrality estimator %s used by %s - beware of auto-corr",
360 meth.Data(), fName.Data());
361 else if (fName.Contains(
"Central", TString::kIgnoreCase) &&
362 (meth.Contains(
"CL0") || meth.Contains(
"TKL")))
363 AliWarningF(
"Centrality estimator %s used by %s - beware of auto-corr",
364 meth.Data(), fName.Data());
367 AliInfoF(
"Centrality estimator set to %s", fCentMethod.Data());
378 if (m.EqualTo(
"NONE") || m.EqualTo(
"NO") || m.EqualTo(
"FALSE"))
385 else if (m.BeginsWith(
"NPA")) ret =
kCentNPA;
386 else if (m.BeginsWith(
"ZPC")) ret =
kCentZPC;
387 else if (m.BeginsWith(
"ZPA")) ret =
kCentZPA;
388 else if (m.BeginsWith(
"ZNC")) ret =
kCentZNC;
389 else if (m.BeginsWith(
"ZNA")) ret =
kCentZNA;
390 else if (m.BeginsWith(
"CND")) ret =
kCentCND;
391 else if (m.BeginsWith(
"CL1")) ret =
kCentCL1;
392 else if (m.BeginsWith(
"CL0")) ret =
kCentCL0;
393 else if (m.BeginsWith(
"TKL")) ret =
kCentTkl;
394 else if (m.BeginsWith(
"TRK")) ret =
kCentTrk;
395 else if (m.BeginsWith(
"FMD")) ret =
kCentFMD;
396 else if (m.BeginsWith(
"V0C")) ret =
kCentV0C;
397 else if (m.BeginsWith(
"V0A123")) ret =
kCentV0A123;
398 else if (m.BeginsWith(
"V0A")) ret =
kCentV0A;
399 else if (m.BeginsWith(
"V0M")) ret =
kCentV0M;
400 else if (m.BeginsWith(
"MULTV0A")) ret =
kMultV0A;
401 else if (m.BeginsWith(
"MULTV0M")) ret =
kMultV0M;
402 else if (m.BeginsWith(
"MULTV0C")) ret =
kMultV0C;
403 else if (m.BeginsWith(
"MULT")) ret =
kMult;
404 if (m.Contains(
"TRUE")) ret |=
kCentTrue;
405 if (m.Contains(
"EQ")) ret |=
kCentEq;
436 case kMult: ret =
"MULT";
break;
437 case kMultV0A: ret =
"MULTV0A";
break;
438 case kMultV0M: ret =
"MULTV0M";
break;
439 case kMultV0C: ret =
"MULTV0C";
break;
440 default: ret =
"";
break;
445 if (!tru) ret.Append(
"eq");
446 else ret.Append(
"Eq");
448 if (tru) ret.Append(
"true");
465 if (
fCentMethod.EqualTo(
"none", TString::kIgnoreCase)) {
469 Info(
"InitializeCentBins",
470 "No centrality, forcing centrality axis to null");
471 h->GetXaxis()->Set(0,0,0);
478 for (
Int_t i = 0; i < nbin; i++)
493 DGUARD(fDebug,1,
"Create user ouput object");
513 while ((bin = static_cast<CentralityBin*>(next())))
525 a.GetSize()-1, a.GetArray());
527 "Integral vs centrality",
528 a.GetSize()-2, a.GetArray());
536 "Integral vs centrality",
544 fMeanVsC =
new TProfile(
"sumVsC",
"Null",1,0,100);
553 fMeanVsC->SetYTitle(
"#LT#int signal#GT");
560 fTakenCent->SetTitle(
"Centralities taken by bins");
601 DGUARD(fDebug,2,
"Getting centrality from event of object: %s",
615 DMSG(fDebug,1,
"Centrality stored in AOD forward: %5.1f%%", cent);
619 if (cent < 0) cent = -.5;
620 else if (TMath::Abs(cent-100) < 1.1) cent = 100;
621 DMSG(fDebug,1,
"Centrality from mult: %5.1f%% (%d)", cent, qual);
648 DGUARD(fDebug,1,
"Analyse the AOD event");
652 if (!forward)
return false;
659 if (!data)
return false;
669 DMSG(fDebug,5,
"IPz=%f -> Weight %f", vtx, ipzW);
689 fMeanVsC->Fill(cent, data->Integral());
692 DMSG(fDebug,1,
"Got event centrality %f (%s)", cent,
695 "out-of-calib" :
"in-calib");
698 DMSG(fDebug,1,
"Centrality %5.2f%% maps to bin %d", cent, icent);
700 TMath::Abs(cent-
fCentAxis.GetXmax()) < 1e-6)
704 if (icent >= 1 && icent <=
fCentAxis.GetNbins())
738 const char*
title,
const char* ytitle)
751 h->SetMarkerColor(colour);
752 h->SetMarkerStyle(marker);
753 h->SetMarkerSize(marker == 29 || marker == 30 ? 1.2 : 1);
756 if (ytitle && ytitle[0] !=
'\0') ytit = ytitle;
757 ytit =
"#frac{1}{#it{N}}#frac{d#it{N}_{ch}}{d#it{#eta}}";
759 h->GetXaxis()->SetTitleFont(132);
760 h->GetXaxis()->SetLabelFont(132);
761 h->GetXaxis()->SetNdivisions(10);
762 h->GetYaxis()->SetTitleFont(132);
763 h->GetYaxis()->SetLabelFont(132);
764 h->GetYaxis()->SetNdivisions(10);
765 h->GetYaxis()->SetDecimals();
775 for (
Int_t i = 1; i <= copy->GetNbinsX(); i++) {
776 Double_t a = norm->GetBinContent(i);
777 for (
Int_t j = 1; j <= copy->GetNbinsY(); j++) {
779 copy->SetBinContent(i,j,0);
780 copy->SetBinError(i,j,0);
783 Double_t c = copy->GetBinContent(i, j);
784 Double_t e = copy->GetBinError(i, j);
785 copy->SetBinContent(i, j, c / a);
786 copy->SetBinError(i, j, e / a);
796 for (
Int_t i = 1; i <= copy->GetNbinsX(); i++) {
797 Double_t a = norm->GetBinContent(i);
799 copy->SetBinContent(i,0);
800 copy->SetBinError(i,0);
803 Double_t c = copy->GetBinContent(i);
805 copy->SetBinContent(i, c / a);
806 copy->SetBinError(i, e / a);
835 return h->ProjectionX(name, firstbin, lastbin, (error ?
"e" :
""));
837 const TAxis* xaxis = h->GetXaxis();
838 const TAxis* yaxis = h->GetYaxis();
839 TH1D* ret =
new TH1D(name, h->GetTitle(), xaxis->GetNbins(),
840 xaxis->GetXmin(), xaxis->GetXmax());
841 static_cast<const TAttLine*
>(h)->Copy(*ret);
842 static_cast<const TAttFill*
>(h)->Copy(*ret);
843 static_cast<const TAttMarker*
>(h)->Copy(*ret);
844 ret->GetXaxis()->ImportAttributes(xaxis);
846 Int_t first = firstbin;
847 Int_t last = lastbin;
848 if (first < 0) first = 1;
849 else if (first >= yaxis->GetNbins()+2) first = yaxis->GetNbins()+1;
850 if (last < 0) last = yaxis->GetNbins();
851 else if (last >= yaxis->GetNbins()+2) last = yaxis->GetNbins()+1;
852 if (last-first < 0) {
853 AliWarningGeneral(
"AliBasedNdetaTask",
854 Form(
"Nothing to project [%d,%d]", first, last));
861 Int_t ybins = (last-first+1);
862 for (
Int_t xbin = 0; xbin <= xaxis->GetNbins()+1; xbin++) {
868 for (
Int_t ybin = first; ybin <= last; ybin++) {
869 Double_t c1 = h->GetBinContent(h->GetBin(xbin, ybin));
870 Double_t e1 = h->GetBinError(h->GetBin(xbin, ybin));
873 if (c1 < 1e-12)
continue;
883 if(content > 0 && nbins > 0) {
886 AliWarningGeneral(ret->GetName(),
887 Form(
"factor @ %d is %d/%d -> %f",
888 xbin, ybins, nbins, factor));
892 ret->SetBinContent(xbin, content * factor);
893 ret->SetBinError(xbin, factor * TMath::Sqrt(error2));
896 ret->SetBinContent(xbin, factor * content);
917 DGUARD(fDebug,1,
"Process final merged results");
933 Info(
"",
"centAxis: %p (%s)", cH, (cH ? cH->ClassName() :
"null"));
935 TAxis* cA = (cH ? cH->GetXaxis() : 0);
949 gStyle->SetPalette(1);
950 THStack* dndetaStack =
new THStack(
"dndeta",
"dN/d#eta");
951 THStack* dndetaMCStack =
new THStack(
"dndetaMC",
"dN_{ch}/d#eta");
952 THStack* dndetaEmpStack =
new THStack(
"dndetaEmp",
"dN_{ch}/d#eta");
953 THStack* leftRightStack =
new THStack(
"leftRight",
"#eta>0/#eta<0");
956 TList* truthlist = 0;
962 mclist =
dynamic_cast<TList*
>(ftest->Get(Form(
"%sResults",GetName())));
963 truthlist =
dynamic_cast<TList*
>(ftest->Get(
"MCTruthResults"));
966 AliWarning(
"MC analysis file invalid - no final MC correction possible");
971 DMSG(fDebug,3,
"Marker style=%d, color=%d", style, color);
972 while ((bin = static_cast<CentralityBin*>(next()))) {
975 style, color, mclist, truthlist);
979 AliWarning(
"Skipping MB bin since we have centrality");
985 TH1* leftRight =
Asymmetry(dndetaEmp ? dndetaEmp : dndeta);
987 DMSG(fDebug,2,
"Results: bare=%p mcbare=%p", dndeta, dndetaMC);
988 if (dndeta) dndetaStack->Add(dndeta);
989 if (dndetaMC) dndetaMCStack->Add(dndetaMC);
990 if (dndetaEmp) dndetaEmpStack->Add(dndetaEmp);
991 if (leftRight) leftRightStack->Add(leftRight);
997 if (!dndetaMCStack->GetHists() ||
998 dndetaMCStack->GetHists()->GetEntries() <= 0) {
1000 delete dndetaMCStack;
1003 if (dndetaMCStack)
fResults->Add(dndetaMCStack);
1006 DMSG(0,fDebug,
"Emp stack: %p (%d)", dndetaEmpStack,
1007 dndetaEmpStack->GetHists() && dndetaEmpStack->GetHists()->GetEntries()
1008 ? dndetaEmpStack->GetHists()->GetEntries() : -1);
1009 if (!dndetaEmpStack->GetHists() ||
1010 dndetaEmpStack->GetHists()->GetEntries() <= 0) {
1012 delete dndetaEmpStack;
1015 if (dndetaEmpStack)
fResults->Add(dndetaEmpStack);
1019 if (!leftRightStack->GetHists() ||
1020 leftRightStack->GetHists()->GetEntries() <= 0) {
1022 delete leftRightStack;
1025 if (leftRightStack)
fResults->Add(leftRightStack);
1031 sNNObj->SetUniqueID(sNN);
1039 sysObj->SetUniqueID(sys);
1045 centEstimator->SetUniqueID(centID);
1054 if (tstr.EqualTo(
"MBOR")) tstr =
"INEL";
1055 else if (tstr.EqualTo(
"V0AND")) tstr =
"NSD";
1057 else if (tstr.EqualTo(
"V0AND")) tstr =
"VISX";
1059 maskObj->SetUniqueID(trig);
1067 maskObj->SetUniqueID(filter);
1075 schemeObj->SetUniqueID(scheme);
1081 fIPzAxis.SetTitle(Form(
"v_{z}#in[%+5.1f,%+5.1f]cm",
1093 str.Append(Form(
"Empty bins %scorrected for, ",
fCorrEmpty ?
"" :
"not "));
1094 str.Append(Form(
"TH2::ProjectionX %sused",
fUseROOTProj ?
"" :
"not "));
1095 options->SetTitle(str);
1100 fMeanVsC =
static_cast<TProfile*
>(sumVsC->Clone());
1108 #define PF(N,V,...) \
1109 AliForwardUtil::PrintField(N,V, ## __VA_ARGS__)
1110 #define PFB(N,FLAG) \
1112 AliForwardUtil::PrintName(N); \
1113 std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
1115 #define PFV(N,VALUE) \
1117 AliForwardUtil::PrintName(N); \
1118 std::cout << (VALUE) << std::endl; } while(false)
1121 void appendBit(
TString&
str,
const char* bit)
1123 if (!str.IsNull()) str.Append(
"|");
1139 gROOT->IncreaseDirLevel();
1143 PFV(
"Normalization scheme", schemeString );
1154 if (opt.Contains(
"R") &&
1159 while ((bin = next())) bin->Print(option);
1161 gROOT->DecreaseDirLevel();
1168 Int_t base = bits & (0xFE);
1171 case kCircle:
return (hollow ? 24 : 20);
1172 case kSquare:
return (hollow ? 25 : 21);
1175 case kDiamond:
return (hollow ? 27 : 33);
1176 case kCross:
return (hollow ? 28 : 34);
1177 case kStar:
return (hollow ? 30 : 29);
1187 case 24:
case 25:
case 26:
case 27:
case 28:
case 30:
case 32:
1191 case 20:
case 24: bits |=
kCircle;
break;
1192 case 21:
case 25: bits |=
kSquare;
break;
1195 case 27:
case 33: bits |=
kDiamond;
break;
1196 case 28:
case 34: bits |=
kCross;
break;
1197 case 29:
case 30: bits |=
kStar;
break;
1214 DGUARD(
fDebug,1,
"Initializing sums with %s", data->GetName());
1217 const char* postfix = GetTitle();
1219 fSum =
static_cast<TH2D*
>(data->Clone(n));
1220 if (postfix)
fSum->SetTitle(Form(
"%s (%s)", data->GetTitle(), postfix));
1221 fSum->SetDirectory(0);
1222 fSum->SetMarkerColor(col);
1227 fSum0 =
static_cast<TH2D*
>(data->Clone(n0));
1229 fSum0->SetTitle(Form(
"%s 0-bin (%s)", data->GetTitle(), postfix));
1231 fSum0->SetTitle(Form(
"%s 0-bin", data->GetTitle()));
1232 fSum0->SetDirectory(0);
1233 fSum0->SetMarkerColor(col);
1240 fEvents->SetFillColor(kRed+1);
1242 fEvents->GetXaxis()->SetBinLabel(1,
"Non-zero");
1243 fEvents->GetXaxis()->SetBinLabel(2,
"Zero");
1250 Int_t what,
const char* post)
1254 case 0: n =
"sum";
break;
1255 case 1: n =
"sum0";
break;
1256 case 2: n =
"events";
break;
1258 if (post && post[0] !=
'\0') n.Append(post);
1266 return GetHistName(GetName(), what, GetTitle());
1273 DGUARD(fDebug,2,
"Adding %s to sums w/weight %f (%f)",
1274 data->GetName(),weight,data->Integral());
1275 if (isZero) fSum0->Add(data, weight);
1276 else fSum->Add(data, weight);
1277 fEvents->Fill(isZero ? 1 : 0);
1290 DGUARD(fDebug,2,
"Calculating final summed histogram %s", fSum->GetName());
1293 TH2D* ret =
static_cast<TH2D*
>(fSum->Clone(fSum->GetName()));
1294 ret->SetDirectory(0);
1301 "Adding histograms %s(%d) and %s(%d) w/weights %f and %f resp.",
1302 fSum0->GetName(), n, fSum->GetName(), n0, 1./epsilon,1./epsilon0);
1303 ret->Add(fSum0, fSum, 1. / epsilon0, 1. / epsilon);
1304 ntotal = n / epsilon + n0 / epsilon0;
1309 const char* postfix = GetTitle();
1310 if (!postfix) postfix =
"";
1311 out->SetName(Form(
"partial%s", postfix));
1317 TH2D* sumCopy =
static_cast<TH2D*
>(fSum->Clone(
"sum"));
1318 TH2D* sum0Copy =
static_cast<TH2D*
>(fSum0->Clone(
"sum0"));
1319 TH2D* retCopy =
static_cast<TH2D*
>(ret->Clone(
"sumAll"));
1321 sumCopy->SetDirectory(0);
1323 sum0Copy->SetDirectory(0);
1324 retCopy->SetMarkerStyle(marker);
1325 retCopy->SetDirectory(0);
1327 Int_t nY = fSum->GetNbinsY();
1329 TH1D* norm =
ProjectX(fSum,
"norm", o, o, rootProj, corrEmpty,
false);
1330 TH1D* norm0 =
ProjectX(fSum0,
"norm0", o, o, rootProj, corrEmpty,
false);
1331 TH1D* normAll =
ProjectX(ret,
"normAll", o, o, rootProj, corrEmpty,
false);
1332 norm->SetTitle(
"#eta coverage - >0-bin");
1333 norm0->SetTitle(
"#eta coverage - 0-bin");
1334 normAll->SetTitle(
"#eta coverage");
1335 norm->SetDirectory(0);
1336 norm0->SetDirectory(0);
1337 normAll->SetDirectory(0);
1339 TH1D* sumCopyPx =
ProjectX(sumCopy,
"average", 1,nY,rootProj,corrEmpty);
1340 TH1D* sum0CopyPx =
ProjectX(sum0Copy,
"average0", 1,nY,rootProj,corrEmpty);
1341 TH1D* retCopyPx =
ProjectX(retCopy,
"averageAll", 1,nY,rootProj,corrEmpty);
1342 sumCopyPx-> SetTitle(Form(
"#sum_{i}^{N_{#phi}}%s", sumCopy->GetTitle()));
1343 sum0CopyPx->SetTitle(Form(
"#sum_{i}^{N_{#phi}}%s", sum0Copy->GetTitle()));
1344 retCopyPx-> SetTitle(Form(
"#sum_{i}^{N_{#phi}}%s", retCopy->GetTitle()));
1345 sumCopyPx-> SetDirectory(0);
1346 sum0CopyPx->SetDirectory(0);
1347 retCopyPx-> SetDirectory(0);
1349 TH1D* phi =
ProjectX(fSum,
"phi", nY+1,nY+1,rootProj,corrEmpty,
false);
1350 TH1D* phi0 =
ProjectX(fSum0,
"phi0", nY+1,nY+1,rootProj,corrEmpty,
false);
1351 TH1D* phiAll =
ProjectX(ret,
"phiAll", nY+1,nY+1,rootProj,corrEmpty,
false);
1352 phi ->SetTitle(
"#phi acceptance from dead strips - >0-bin");
1353 phi0 ->SetTitle(
"#phi acceptance from dead strips - 0-bin");
1354 phiAll->SetTitle(
"#phi acceptance from dead strips");
1355 phi ->SetDirectory(0);
1356 phi0 ->SetDirectory(0);
1357 phiAll->SetDirectory(0);
1359 const TH1D* cov = (corrEmpty ? norm : phi);
1360 const TH1D* cov0 = (corrEmpty ? norm0 : phi0);
1361 const TH1D* covAll = (corrEmpty ? normAll : phiAll);
1369 sumCopyPx ->Scale(1.,
"width");
1370 sum0CopyPx->Scale(1.,
"width");
1371 retCopyPx ->Scale(1.,
"width");
1373 DMSG(fDebug,2,
"Maximum %f,%f changed to %f", sumCopyPx->GetMaximum(),
1374 sum0CopyPx->GetMaximum(), retCopyPx->GetMaximum());
1377 norm ->Scale(n > 0 ? 1. / n : 1);
1378 norm0 ->Scale(n0 > 0 ? 1. / n0 : 1);
1379 normAll->Scale(ntotal > 0 ? 1. / ntotal : 1);
1382 phi ->Scale(n > 0 ? 1. / n : 1);
1383 phi0 ->Scale(n0 > 0 ? 1. / n0 : 1);
1384 phiAll->Scale(ntotal > 0 ? 1. / ntotal : 1);
1389 out->Add(sumCopyPx);
1390 out->Add(sum0CopyPx);
1391 out->Add(retCopyPx);
1401 DMSG(fDebug,1,
"Returning (1/%f * %s + 1/%f * %s), "
1402 "1/%f * %d + 1/%f * %d = %d",
1403 epsilon0, fSum0->GetName(), epsilon, fSum->GetName(),
1404 epsilon0, n0, epsilon, n, int(ntotal));
1406 DMSG(fDebug,1,
"Returning %s, %d", fSum->GetName(), int(ntotal));
1410 for (
Int_t i = 1; i <= ret->GetNbinsX(); i++) {
1411 Double_t nc = sum->GetBinContent(i, 0);
1412 Double_t nc0 = sum0->GetBinContent(i, 0);
1413 ret->SetBinContent(i, 0, nc + nc0);
1423 PFV(
"dN/deta sum bin", GetName());
1424 gROOT->IncreaseDirLevel();
1425 PF(
"Normal sum",
"%s (%p)", GetHistName(0).
Data(), fSum);
1426 PF(
"0-bin sum",
"%s (%p)", GetHistName(1).
Data(), fSum0);
1427 PF(
"Event count",
"%s (%p)", GetHistName(2).
Data(), fEvents);
1428 gROOT->DecreaseDirLevel();
1442 fDoFinalMCCorrection(false),
1449 DGUARD(
fDebug,3,
"Default CTOR of AliBasedNdeta::CentralityBin");
1451 #define TRUNC(X) (Int_t(X) + Float_t(Int_t(X*100)%100)/100)
1465 fDoFinalMCCorrection(false),
1477 DGUARD(
fDebug,3,
"Named CTOR of AliBasedNdeta::CentralityBin: "
1479 if (low <= 0 && high <= 0) {
1482 SetTitle(
"All centralities");
1487 SetTitle(Form(
"Centrality bin from %6.2f%% to %6.2f%%", low, high));
1501 fDoFinalMCCorrection(o.fDoFinalMCCorrection),
1511 DGUARD(
fDebug,3,
"Copy CTOR of AliBasedNdeta::CentralityBin");
1519 DGUARD(fDebug,3,
"DTOR of AliBasedNdeta::CentralityBin");
1538 DGUARD(fDebug,3,
"Centrality bin assignment");
1539 if (&o ==
this)
return *
this;
1540 SetName(o.GetName());
1541 SetTitle(o.GetTitle());
1557 Color_t Brighten(Color_t origNum,
Int_t nTimes=2)
1559 TColor* col = gROOT->GetColor(origNum);
1560 if (!col)
return origNum;
1564 Int_t off = nTimes*0x33;
1565 Int_t newR = TMath::Min((origR+off),0xff);
1566 Int_t newG = TMath::Min((origG+off),0xff);
1567 Int_t newB = TMath::Min((origB+off),0xff);
1568 Int_t newNum = TColor::GetColor(newR, newG, newB);
1579 if (IsAllBin())
return kBlack;
1581 Int_t nCol = gStyle->GetNumberOfColors();
1582 Int_t icol = TMath::Min(nCol-1,
int(fc * nCol + .5));
1583 Int_t col = gStyle->GetColorPalette(icol);
1586 col = Brighten(orig);
1602 if (IsAllBin())
return "all";
1603 return Form(
"cent%03dd%02d_%03dd%02d",
1618 DGUARD(fDebug,1,
"Create centrality bin output objects");
1620 fSums->SetName(GetListName());
1628 fStatus->SetDirectory(0);
1631 fSums->Add(fStatus);
1641 if (fSum) fSum->fDebug = lvl;
1642 if (fSumMC) fSumMC->fDebug = lvl;
1649 const char* post = (mc ?
"MC" :
"");
1653 TH2D* sum =
static_cast<TH2D*
>(list->FindObject(sn));
1654 TH2D* sum0 =
static_cast<TH2D*
>(list->FindObject(sn0));
1655 TH1I* events =
static_cast<TH1I*
>(list->FindObject(ev));
1656 if (!sum || !sum0 || !events) {
1658 AliWarningF(
"Failed to find one or more histograms: "
1659 "%s (%p) %s (%p) %s (%p)",
1665 Sum* ret =
new Sum(GetName(), post);
1670 if (mc) fSumMC = ret;
1687 DGUARD(fDebug,1,
"Create centrality bin sums from %s",
1688 data ? data->GetName() :
"(null)");
1690 fSum =
new Sum(GetName(),
"");
1692 fSum->fDebug = fDebug;
1698 fSumMC =
new Sum(GetName(),
"MC");
1700 fSumMC->fDebug = fDebug;
1720 if (!forward)
return false;
1722 DGUARD(fDebug,2,
"Check the event "
1723 "IPz: %f < %f < %f Trigger: 0x%08x (masked 0x%08x vetoed 0x%08x)",
1724 vzMin, forward->
GetIpZ(), vzMax,
1731 DMSG(fDebug, 2,
"%s", (ret ?
"Accepted" :
"Rejected"));
1760 DGUARD(fDebug,1,
"Process one event for %s a given centrality bin "
1761 "[%5.1f%%,%5.1f%%) w/weight %f",
1762 data ? data->GetName() :
"(null)", fLow, fHigh, weight);
1763 if (!
CheckEvent(forward, triggerMask, vzMin, vzMax, filter))
1765 if (!data)
return false;
1766 if (!fSum) CreateSums(data, mc);
1768 fSum->Add(data, isZero, weight);
1769 if (mc) fSumMC->Add(mc, isZero, weight);
1791 DGUARD(fDebug,1,
"Normalize centrality bin %s [%6.2f-%6.2f%%] with %s",
1792 GetName(), fLow, fHigh, t.GetName());
1804 if (nTriggered <= 0.1) {
1805 AliError(
"Number of triggered events <= 0");
1808 if (nWithVertex <= 0.1) {
1809 AliError(
"Number of events with vertex <= 0");
1813 Double_t vtxEff = nWithVertex / nTriggered;
1821 ntotal = nAccepted / vtxEff;
1823 DMSG(fDebug,0,
"Calculating event normalisation as\n"
1824 " N = N_A * N_T / N_V = %d * %d / %d = %f (%f)",
1840 ntotal -= nAccepted * beta / nWithVertex;
1844 scaler /= (1 - beta / nTriggered);
1845 DMSG(fDebug,0,
"Calculating event normalisation as\n"
1846 " beta = N_a + N_c + 2 N_e = %d + %d - 2 * %d = %d\n"
1847 " N = N - N_A * beta / N_V = %f - %d * %d / %d = %f (%f)",
1849 nAccepted / vtxEff,
Int_t(nAccepted),
Int_t(beta),
1850 Int_t(nWithVertex), ntotal, scaler);
1851 rhs.Append(
"(1/eps_V - beta/N_vtx)");
1854 rhs.Append(
"/eps_V");
1860 DMSG(fDebug,0,
"Correcting for trigger efficiency:\n"
1861 " N = 1 / E_X * N = 1 / %f * %d = %f (%f)",
1862 trigEff, old, ntotal, scaler);
1863 rhs.Append(
"/eps_T");
1877 ntotal = nAccepted * (1 + 1/trigEff * (nTriggered / nWithVertex - 1
1878 - beta / nWithVertex));
1879 scaler = nWithVertex / (nWithVertex +
1880 1/trigEff * (nTriggered-nWithVertex-beta));
1881 DMSG(fDebug,0,
"Calculating event normalisation as\n"
1882 " beta = N_a + N_c + 2 N_e = %d + %d - 2 * %d = %d\n"
1883 " N = N_A (1 + 1/E_X (N_T/N_V - 1 - beta / N_V)) = "
1884 "%d (1 + 1 / %f (%d / %d - 1 - %d / %d)) = %f (%f)",
1886 Int_t(nAccepted), trigEff,
Int_t(nTriggered),
1889 rhs.Append(
"(1+1/eps_T(1/eps_V-1-beta/N_vtx))");
1893 text->Append(Form(
"%-40s = %d\n",
"N_all",
UInt_t(nAll)));
1894 text->Append(Form(
"%-40s = %d\n",
"N_acc",
UInt_t(nAccepted)));
1895 text->Append(Form(
"%-40s = %d\n",
"N_trg",
UInt_t(nTriggered)));
1896 text->Append(Form(
"%-40s = %d\n",
"N_vtx",
UInt_t(nWithVertex)));
1897 text->Append(Form(
"%-40s = %d\n",
"N_B",
UInt_t(nB)));
1898 text->Append(Form(
"%-40s = %d\n",
"N_A",
UInt_t(nA)));
1899 text->Append(Form(
"%-40s = %d\n",
"N_C",
UInt_t(nC)));
1900 text->Append(Form(
"%-40s = %d\n",
"N_E",
UInt_t(nE)));
1901 text->Append(Form(
"%-40s = %d\n",
"beta = N_A + N_C - 2N_E",
UInt_t(beta)));
1902 text->Append(Form(
"%-40s = %f\n",
"eps_V = N_vtx/N_trg",vtxEff));
1903 text->Append(Form(
"%-40s = %f\n",
"eps_T", trigEff));
1904 text->Append(Form(
"%-40s = %f\n", rhs.Data(), ntotal));
1907 tN.ReplaceAll(
"w/Selected trigger (",
"");
1908 tN.ReplaceAll(
")",
"");
1911 " Total of %9d events for %s\n"
1912 " of these %9d have an offline trigger\n"
1913 " of these N_T = %9d has the selected trigger (%s)\n"
1914 " of these N_V = %9d has a vertex\n"
1915 " of these N_A = %9d were in the selected range",
1916 Int_t(nAll), GetTitle(),
1918 Int_t(nTriggered), tN.Data(),
1922 " Triggers by hardware type:\n"
1924 " N_ac = %9d (%d+%d)\n"
1926 " Vertex efficiency: %f\n"
1927 " Trigger efficiency: %f\n"
1928 " Total number of events: N = %f\n"
1929 " Scaler (N_A/N): %f\n"
1938 rhs.Data(), ntotal);
1941 " Total of %9d events for %s",
Int_t(nAll), GetTitle());
1942 DMSG(d,0,
" of these %9d have an offline trigger",
Int_t(nOffline));
1943 DMSG(d,0,
" of these N_T = %9d has the selected trigger (%s)",
1944 Int_t(nTriggered), tN.Data());
1945 DMSG(d,0,
" of these N_V = %9d has a vertex",
Int_t(nWithVertex));
1946 DMSG(d,0,
" of these N_A = %9d were in the selected range",
Int_t(nAccepted));
1947 DMSG(d,0,
" Triggers by hardware type:");
1951 DMSG(d,0,
" Vertex efficiency: %f",vtxEff);
1952 DMSG(d,0,
" Trigger efficiency: %f",trigEff);
1953 DMSG(d,0,
" Total number of events: N = %f",ntotal);
1954 DMSG(d,0,
" Scaler (N_A/N): %f",scaler);
1955 DMSG(fDebug, 0,
" %-25s = %f", rhs.Data(), ntotal);
1966 n.ReplaceAll(
"dNdeta",
"");
1967 n.Prepend(
"dndeta");
1977 AliWarningF(
"No output list defined in %s [%6.2f,%6.2f]", GetName(),
1981 TString n = GetResultName(postfix);
1982 TObject* o = fOutput->FindObject(n.Data());
1985 AliWarningF(
"Object %s not found in output list of %s",
1986 n.Data(), GetName());
1989 return static_cast<TH1*
>(o);
1995 const char* postfix,
2014 DGUARD(fDebug,1,
"Make centrality bin result from %s", sum->GetName());
2016 base.ReplaceAll(
"dNdeta",
"");
2017 base.Append(postfix);
2018 TH2D* copy =
static_cast<TH2D*
>(sum->Clone(Form(
"d2Ndetadphi%s",
2022 Int_t nY = sum->GetNbinsY();
2033 Int_t o = (corrEmpty ? 0 : nY+1);
2034 accNorm =
ProjectX(sum, Form(
"norm%s",base.Data()), o, o,
2035 rootProj, corrEmpty,
false);
2036 accNorm->SetDirectory(0);
2042 copy->Scale(scaler);
2046 TH1D* dndeta =
ProjectX(copy, Form(
"dndeta%s",base.Data()),
2047 1, nY, rootProj, corrEmpty);
2048 dndeta->SetDirectory(0);
2052 dndeta->Scale(scaler);
2054 dndeta->Scale(1.,
"width");
2055 copy->Scale(1.,
"width");
2057 TH1D* dndetaMCCorrection = 0;
2058 TH1D* dndetaMCtruth = 0;
2059 TList* centlist = 0;
2060 TList* truthcentlist = 0;
2066 centlist =
static_cast<TList*
> (mclist->FindObject(GetListName()));
2068 dndetaMCCorrection =
2069 static_cast<TH1D*
>(centlist->FindObject(Form(
"dndeta%s%s",
2074 truthcentlist =
static_cast<TList*
>(truthlist->FindObject(GetListName()));
2078 static_cast<TH1D*
>(truthcentlist->FindObject(Form(
"dndetaMCTruth%s",
2082 if (dndetaMCCorrection && dndetaMCtruth) {
2083 AliInfo(
"Correcting with final MC correction");
2084 TString testString(dndetaMCCorrection->GetName());
2087 dndetaMCCorrection->Divide(dndetaMCtruth);
2088 dndetaMCCorrection->SetTitle(
"Final MC correction");
2089 dndetaMCCorrection->SetName(
"finalMCCorr");
2090 for(
Int_t m = 1; m <= dndetaMCCorrection->GetNbinsX(); m++) {
2091 if(dndetaMCCorrection->GetBinContent(m) < 0.5 ||
2092 dndetaMCCorrection->GetBinContent(m) > 1.75) {
2093 dndetaMCCorrection->SetBinContent(m,1.);
2094 dndetaMCCorrection->SetBinError(m,0.1);
2101 dndeta->Divide(dndetaMCCorrection);
2105 for(
Int_t m = 1; m <= dndeta->GetNbinsX(); m++) {
2106 if(dndeta->GetBinContent(m) <= 0.01 )
continue;
2108 Double_t eta = dndeta->GetXaxis()->GetBinCenter(m);
2109 Int_t bin = dndetaMCCorrection->GetXaxis()->FindBin(eta);
2110 Double_t mccorr = dndetaMCCorrection->GetBinContent(bin);
2111 Double_t mcerror = dndetaMCCorrection->GetBinError(bin);
2112 if (mccorr < 1e-6) {
2113 dndeta->SetBinContent(m, 0);
2114 dndeta->SetBinError(m, 0);
2116 Double_t value = dndeta->GetBinContent(m);
2117 Double_t error = dndeta->GetBinError(m);
2118 Double_t sumw2 = (error * error * mccorr * mccorr +
2119 mcerror * mcerror * value * value);
2120 dndeta->SetBinContent(m,value/mccorr) ;
2121 dndeta->SetBinError(m,TMath::Sqrt(sumw2)/mccorr/mccorr);
2126 DMSG(fDebug,1,
"No final MC correction applied");
2131 if (postfix && postfix[0] !=
'\0') post = Form(
" (%s)", postfix);
2133 Form(
"ALICE %s%s", GetName(), post.Data()));
2135 Form(
"ALICE %s normalisation%s",
2136 GetName(), post.Data()));
2139 fOutput->Add(dndeta);
2140 fOutput->Add(accNorm);
2142 if (dndetaMCCorrection) fOutput->Add(dndetaMCCorrection);
2148 for (
Int_t nn=1; nn <= sum->GetNbinsY(); nn++) {
2149 TH1D* dndeta_phi =
ProjectX(copy, Form(
"dndeta%s_phibin%d",
2151 nn, nn, rootProj, corrEmpty);
2152 dndeta_phi->SetDirectory(0);
2154 dndeta_phi->Scale(TMath::Pi()/10.,
"width");
2157 dndetaMCCorrection =
2158 static_cast<TH1D*
>(centlist->FindObject(Form(
"dndeta%s_phibin%d",
2162 =
static_cast<TH1D*
>(truthcentlist->FindObject(
"dndetaMCTruth"));
2164 if (dndetaMCCorrection && dndetaMCtruth) {
2165 AliInfo(
"Correcting with final MC correction");
2166 TString testString(dndetaMCCorrection->GetName());
2167 dndetaMCCorrection->Divide(dndetaMCtruth);
2168 dndetaMCCorrection->SetTitle(Form(
"Final_MC_correction_phibin%d",nn));
2169 dndetaMCCorrection->SetName(Form(
"Final_MC_correction_phibin%d",nn));
2170 for(
Int_t m = 1; m <= dndetaMCCorrection->GetNbinsX(); m++) {
2171 if(dndetaMCCorrection->GetBinContent(m) < 0.25 ||
2172 dndetaMCCorrection->GetBinContent(m) > 1.75) {
2173 dndetaMCCorrection->SetBinContent(m,1.);
2174 dndetaMCCorrection->SetBinError(m,0.1);
2178 dndeta_phi->Divide(dndetaMCCorrection);
2180 fOutput->Add(dndeta_phi);
2181 if(dndetaMCCorrection) fOutput->Add(dndetaMCCorrection);
2211 DGUARD(fDebug,1,
"End centrality bin procesing");
2213 fSums =
dynamic_cast<TList*
>(sums->FindObject(GetListName()));
2215 AliError(
"Could not retrieve TList fSums");
2219 fOutput =
new TList;
2220 fOutput->SetName(GetListName());
2221 fOutput->SetOwner();
2222 results->Add(fOutput);
2225 if (!ReadSum(
fSums,
false)) {
2226 AliInfo(
"This task did not produce any output");
2230 if (!fSumMC) ReadSum(
fSums,
true);
2235 AliError(
"Couldn't find histogram 'triggers' in list");
2242 DMSG(fDebug,2,
"Using epsilonT=%f, epsilonT0=%f for 0x%x",
2243 epsilonT, epsilonT0, triggerMask);
2247 TH2D* sum = fSum->CalcSum(fOutput, nSum, epsilonT0, epsilonT,
2248 marker, rootProj, corrEmpty);
2251 if (fSumMC) sumMC = fSumMC->CalcSum(fOutput, nSumMC,
2252 epsilonT0, epsilonT, marker,
2253 rootProj, corrEmpty);
2255 AliError(
"Failed to get sum from summer - bailing out");
2263 AliError(
"Failed to calculate normalization - bailing out");
2267 fOutput->Add(
new TNamed(
"normCalc", text.Data()));
2272 MakeResult(sum,
"", rootProj, corrEmpty, scaler, marker, color,
2277 MakeResult(sumMC,
"MC", rootProj, corrEmpty, scaler,
2290 PFV(
"Centrality bin", GetTitle());
2291 gROOT->IncreaseDirLevel();
2292 PF(
"Range",
"%6.2f - %6.2f%%", fLow, fHigh);
2293 PFB(
"All bin", IsAllBin());
2294 PFB(
"Final MC", fDoFinalMCCorrection);
2299 if (opt.Contains(
"R")) {
2300 if (fSum) fSum->Print(option);
2301 if (fSumMC) fSumMC->Print(option);
2304 gROOT->DecreaseDirLevel();
2318 for (
int i=1;i<=data->GetNbinsX();i++) {
2320 ->FindBin(data->GetXaxis()->GetBinCenter(i));
2324 ->GetBinContent(binzvertex,bincorrection);
2325 if(correction<0.001) {
2326 data->SetBinContent(i,0,0);
2327 data->SetBinContent(i,data->GetNbinsY()+1,0);
2329 for(
int j=1;j<=data->GetNbinsY();j++) {
2330 if (data->GetBinContent(i,j)>0.0) {
2331 data->SetBinContent(i,j,data->GetBinContent(i,j)*correction);
2332 data->SetBinError(i,j,data->GetBinError(i,j)*correction);
2345 TH1* ret =
static_cast<TH1*
>(h->Clone(Form(
"%s_leftright", h->GetName())));
2352 ret->SetDirectory(0);
2354 ret->SetTitle(Form(
"%s (+/-)", h->GetTitle()));
2355 ret->SetYTitle(
"Right/Left");
2356 Int_t nBins = h->GetNbinsX();
2357 for (
Int_t i = 1; i <= nBins; i++) {
2363 if (c1 <= 0)
continue;
2365 Int_t j = h->FindBin(-x);
2366 if (j <= 0 || j > nBins)
continue;
2371 Double_t e = TMath::Sqrt((e2*e2*c1*c1+e1*e1*c2*c2)/(c12*c12));
2372 Int_t k = ret->FindBin(x);
2373 ret->SetBinContent(k, c2/c1);
2374 ret->SetBinError(k, e);
2376 TF1* fit =
new TF1(
"fit",
"pol0");
2377 ret->Fit(fit,
"QN+");
2380 TLatex* ltx =
new TLatex(-1, fit->GetParameter(0),
2381 Form(
"%6.4f#pm%6.4f #chi^{2}/#nu=%5.2f",
2382 fit->GetParameter(0),
2383 fit->GetParError(0),
2384 fit->GetChisquare()/fit->GetNDF()));
2385 ltx->SetTextColor(ret->GetMarkerColor());
2386 ltx->SetTextAlign(12);
2387 if (!ret->GetListOfFunctions()->FindObject(fit))
2388 ret->GetListOfFunctions()->Add(fit);
2389 ret->GetListOfFunctions()->Add(ltx);
Int_t color[]
option to what and if export to output file
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)
TList * list
TDirectory file where lists per trigger are stored in train ouput.
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)