1 //====================================================================
3 // Base class for classes that calculate the multiplicity in the
4 // forward regions event-by-event
10 // - AliAODForwardMult
15 #include "AliForwardMultiplicityBase.h"
16 #include "AliForwardCorrectionManager.h"
17 #include "AliForwardUtil.h"
18 #include "AliFMDCorrELossFit.h"
20 #include "AliAODHandler.h"
21 #include "AliInputEventHandler.h"
22 #include "AliAnalysisManager.h"
23 #include "AliFMDEventInspector.h"
24 #include "AliFMDSharingFilter.h"
25 #include "AliFMDDensityCalculator.h"
26 #include "AliFMDCorrector.h"
27 #include "AliFMDHistCollector.h"
28 #include "AliFMDEventPlaneFinder.h"
29 #include "AliESDEvent.h"
38 //====================================================================
39 AliForwardMultiplicityBase::AliForwardMultiplicityBase(const char* name)
40 : AliBaseESDTask(name, "AliForwardMultiplicityBase",
41 &(AliForwardCorrectionManager::Instance())),
42 fEnableLowFlux(false),
52 DGUARD(fDebug, 3,"Named CTOR of AliForwardMultiplicityBase %s",name);
56 //____________________________________________________________________
58 AliForwardMultiplicityBase::SetDebug(Int_t dbg)
66 AliBaseESDTask:: SetDebug(dbg);
67 GetSharingFilter() .SetDebug(dbg);
68 GetDensityCalculator().SetDebug(dbg);
69 GetCorrections() .SetDebug(dbg);
70 GetHistCollector() .SetDebug(dbg);
71 GetEventPlaneFinder() .SetDebug(dbg);
74 //____________________________________________________________________
76 AliForwardMultiplicityBase::Book()
79 // Create output objects
82 DGUARD(fDebug,1,"Create user ouput");
83 UInt_t what = AliForwardCorrectionManager::kAll;
85 what ^= AliForwardCorrectionManager::kDoubleHit;
86 if (!GetCorrections().IsUseVertexBias())
87 what ^= AliForwardCorrectionManager::kVertexBias;
88 if (!GetCorrections().IsUseAcceptance())
89 what ^= AliForwardCorrectionManager::kAcceptance;
90 if (!GetCorrections().IsUseMergingEfficiency())
91 what ^= AliForwardCorrectionManager::kMergingEfficiency;
92 fNeededCorrections = what;
94 GetSharingFilter() .CreateOutputObjects(fList);
95 GetDensityCalculator().CreateOutputObjects(fList);
96 GetCorrections() .CreateOutputObjects(fList);
97 GetHistCollector() .CreateOutputObjects(fList);
98 GetEventPlaneFinder() .CreateOutputObjects(fList);
103 if (fDebug > 1) fDoTiming = true;
105 fHTiming = new TProfile("timing", "Timing of task",
106 kTimingTotal, 0.5, kTimingTotal+.5);
107 fHTiming->SetDirectory(0);
108 fHTiming->SetFillColor(kRed+1);
109 fHTiming->SetFillStyle(3001);
110 fHTiming->SetMarkerStyle(20);
111 fHTiming->SetMarkerColor(kBlack);
112 fHTiming->SetLineColor(kBlack);
113 fHTiming->SetXTitle("Part");
114 fHTiming->SetYTitle("#LTt_{part}#GT [CPU]");
115 fHTiming->SetStats(0);
116 TAxis* xaxis = fHTiming->GetXaxis();
117 xaxis->SetBinLabel(kTimingEventInspector,
118 GetEventInspector() .GetName());
119 xaxis->SetBinLabel(kTimingSharingFilter,
120 GetSharingFilter() .GetName());
121 xaxis->SetBinLabel(kTimingDensityCalculator,
122 GetDensityCalculator().GetName());
123 xaxis->SetBinLabel(kTimingCorrections,
124 GetCorrections() .GetName());
125 xaxis->SetBinLabel(kTimingHistCollector,
126 GetHistCollector() .GetName());
127 xaxis->SetBinLabel(kTimingEventPlaneFinder,
128 GetEventPlaneFinder() .GetName());
129 xaxis->SetBinLabel(kTimingTotal, "Total");
130 fList->Add(fHTiming);
134 //____________________________________________________________________
136 AliForwardMultiplicityBase::CreateBranches(AliAODHandler* ah)
138 TObject* obj = &fAODFMD; ah->AddBranch("AliAODForwardMult", &obj);
139 TObject* epobj = &fAODEP; ah->AddBranch("AliAODForwardEP", &epobj);
141 if (!fStorePerRing) return;
143 AliWarning("Per-ring histograms in AOD\n"
144 "*********************************************************\n"
145 "* For each event 5 additional 2D histogram are stored *\n"
146 "* in separate branches of the AODs. This will increase *\n"
147 "* the size of the AODs - proceed with caution *\n"
148 "*********************************************************");
149 TObject* hists[] = { fHistos.fFMD1i,
150 fHistos.fFMD2i, fHistos.fFMD2o,
151 fHistos.fFMD3i, fHistos.fFMD3o };
152 for (Int_t i = 0; i < 5; i++) {
153 ah->AddBranch("TH2D", &(hists[i]));
157 //____________________________________________________________________
159 AliForwardMultiplicityBase::PreData(const TAxis& vertex, const TAxis& eta)
162 // Initialise the sub objects and stuff. Called on first event
165 DGUARD(fDebug,1,"Initialize sub-algorithms");
167 // Force this here so we select the proper quality
168 AliForwardCorrectionManager& fcm = AliForwardCorrectionManager::Instance();
170 UInt_t what = fNeededCorrections;
171 // Check that we have the energy loss fits, needed by
172 // AliFMDSharingFilter
173 // AliFMDDensityCalculator
174 if (what & AliForwardCorrectionManager::kELossFits && !fcm.GetELossFit())
175 AliFatal(Form("No energy loss fits"));
177 // Check that we have the double hit correction - (optionally) used by
178 // AliFMDDensityCalculator
179 if (what & AliForwardCorrectionManager::kDoubleHit && !fcm.GetDoubleHit())
180 AliFatal("No double hit corrections");
182 // Check that we have the secondary maps, needed by
184 // AliFMDHistCollector
185 if (what & AliForwardCorrectionManager::kSecondaryMap &&
186 !fcm.GetSecondaryMap())
187 AliFatal("No secondary corrections");
189 // Check that we have the vertex bias correction, needed by
191 if (what & AliForwardCorrectionManager::kVertexBias && !fcm.GetVertexBias())
192 AliFatal("No event vertex bias corrections");
194 // Check that we have the merging efficiencies, optionally used by
196 if (what & AliForwardCorrectionManager::kMergingEfficiency &&
197 !fcm.GetMergingEfficiency())
198 AliFatal("No merging efficiencies");
200 // Check that we have the acceptance correction, needed by
202 if (what & AliForwardCorrectionManager::kAcceptance && !fcm.GetAcceptance())
203 AliFatal("No acceptance corrections");
205 const AliFMDCorrELossFit* fits = fcm.GetELossFit();
206 fits->CacheBins(GetDensityCalculator().GetMinQuality());
208 InitMembers(eta,vertex);
210 GetSharingFilter() .SetupForData(eta);
211 GetDensityCalculator().SetupForData(eta);
212 GetCorrections() .SetupForData(eta);
213 GetHistCollector() .SetupForData(vertex,eta);
215 GetEventPlaneFinder() .SetRunNumber(GetEventInspector().GetRunNumber());
216 GetEventPlaneFinder() .SetupForData(eta);
218 fAODFMD.SetBit(AliAODForwardMult::kSecondary,
219 GetCorrections().IsUseSecondaryMap());
220 fAODFMD.SetBit(AliAODForwardMult::kVertexBias,
221 GetCorrections().IsUseVertexBias());
222 fAODFMD.SetBit(AliAODForwardMult::kAcceptance,
223 GetCorrections().IsUseAcceptance());
224 fAODFMD.SetBit(AliAODForwardMult::kMergingEfficiency,
225 GetCorrections().IsUseMergingEfficiency());
226 fAODFMD.SetBit(AliAODForwardMult::kSum,
227 GetHistCollector().GetMergeMethod() ==
228 AliFMDHistCollector::kSum);
232 //____________________________________________________________________
234 AliForwardMultiplicityBase::InitMembers(const TAxis& eta, const TAxis& /*pv*/)
241 fHData = static_cast<TH2D*>(fAODFMD.GetHistogram().Clone("d2Ndetadphi"));
243 fHData->SetDirectory(0);
246 TList* rings = new TList;
247 rings->SetName("ringSums");
251 rings->Add(fRingSums.Get(1, 'I'));
252 rings->Add(fRingSums.Get(2, 'I'));
253 rings->Add(fRingSums.Get(2, 'O'));
254 rings->Add(fRingSums.Get(3, 'I'));
255 rings->Add(fRingSums.Get(3, 'O'));
256 fRingSums.Get(1, 'I')->SetMarkerColor(AliForwardUtil::RingColor(1, 'I'));
257 fRingSums.Get(2, 'I')->SetMarkerColor(AliForwardUtil::RingColor(2, 'I'));
258 fRingSums.Get(2, 'O')->SetMarkerColor(AliForwardUtil::RingColor(2, 'O'));
259 fRingSums.Get(3, 'I')->SetMarkerColor(AliForwardUtil::RingColor(3, 'I'));
260 fRingSums.Get(3, 'O')->SetMarkerColor(AliForwardUtil::RingColor(3, 'O'));
262 //____________________________________________________________________
264 AliForwardMultiplicityBase::Finalize()
272 DGUARD(fDebug,1,"Processing the merged results");
275 TList* output = fResults;
276 Double_t nTr = 0, nTrVtx = 0, nAcc = 0;
277 MakeSimpledNdeta(list, output, nTr, nTrVtx, nAcc);
279 EstimatedNdeta(list, output);
281 GetSharingFilter() .Terminate(list,output,Int_t(nTr));
282 GetDensityCalculator().Terminate(list,output,Int_t(nTrVtx));
283 GetCorrections() .Terminate(list,output,Int_t(nTrVtx));
285 TProfile* timing = static_cast<TProfile*>(list->FindObject("timing"));
287 TProfile* p = static_cast<TProfile*>(timing->Clone());
289 p->Scale(100. / p->GetBinContent(p->GetNbinsX()));
290 p->SetYTitle("#LTt_{part}#GT/#LTt_{total}#GT [%]");
291 p->SetTitle("Relative timing of task");
297 //____________________________________________________________________
299 AliForwardMultiplicityBase::EstimatedNdeta(const TList* input,
302 MakeRingdNdeta(input, "ringSums", output, "ringResults");
305 //____________________________________________________________________
307 AliForwardMultiplicityBase::MakeSimpledNdeta(const TList* input,
313 // Get our histograms from the container
315 TH1I* hEventsTrVtx = 0;
316 TH1I* hEventsAcc = 0;
318 if (!GetEventInspector().FetchHistograms(input,
323 AliError(Form("Didn't get histograms from event selector "
324 "(hEventsTr=%p,hEventsTrVtx=%p,hEventsAcc=%p,hTriggers=%p)",
325 hEventsTr, hEventsTrVtx, hEventsAcc, hTriggers));
329 nTr = hEventsTr->Integral();
330 nTrVtx = hEventsTrVtx->Integral();
331 nAcc = hEventsAcc->Integral();
332 Double_t vtxEff = nTrVtx / nTr;
333 TH2D* hData = static_cast<TH2D*>(input->FindObject("d2Ndetadphi"));
335 AliError(Form("Couldn't get our summed histogram from output "
336 "list %s (d2Ndetadphi=%p)", input->GetName(), hData));
341 Int_t nY = hData->GetNbinsY();
342 TH1D* dNdeta = hData->ProjectionX("dNdeta", 1, nY, "e");
343 TH1D* dNdeta_ = hData->ProjectionX("dNdeta_", 1, nY, "e");
344 TH1D* norm = hData->ProjectionX("norm", 0, 0, "");
345 TH1D* phi = hData->ProjectionX("phi", nY+1, nY+1, "");
346 dNdeta->SetTitle("dN_{ch}/d#eta in the forward regions");
347 dNdeta->SetYTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}");
348 dNdeta->SetMarkerColor(kRed+1);
349 dNdeta->SetMarkerStyle(20);
350 dNdeta->SetDirectory(0);
352 dNdeta_->SetTitle("dN_{ch}/d#eta in the forward regions");
353 dNdeta_->SetYTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}");
354 dNdeta_->SetMarkerColor(kMagenta+1);
355 dNdeta_->SetMarkerStyle(21);
356 dNdeta_->SetDirectory(0);
358 norm->SetTitle("Normalization to #eta coverage");
359 norm->SetYTitle("#eta coverage");
360 norm->SetLineColor(kBlue+1);
361 norm->SetMarkerColor(kBlue+1);
362 norm->SetMarkerStyle(21);
363 norm->SetFillColor(kBlue+1);
364 norm->SetFillStyle(3005);
365 norm->SetDirectory(0);
367 phi->SetTitle("Normalization to #phi acceptance");
368 phi->SetYTitle("#phi acceptance");
369 phi->SetLineColor(kGreen+1);
370 phi->SetMarkerColor(kGreen+1);
371 phi->SetMarkerStyle(20);
372 phi->SetFillColor(kGreen+1);
373 phi->SetFillStyle(3004);
374 // phi->Scale(1. / nAcc);
375 phi->SetDirectory(0);
377 // dNdeta->Divide(norm);
380 dNdeta->Scale(vtxEff, "width");
382 dNdeta_->Divide(norm);
383 dNdeta_->SetStats(0);
384 dNdeta_->Scale(vtxEff, "width");
387 output->Add(dNdeta_);
395 //____________________________________________________________________
397 AliForwardMultiplicityBase::MakeRingdNdeta(const TList* input,
403 // Make dN/deta for each ring found in the input list.
405 // A stack of all the dN/deta is also made for easy drawing.
407 // Note, that the distributions are normalised to the number of
408 // observed events only - they should be corrected for
409 DGUARD(fDebug,3,"Make first-shot ring dN/deta");
412 TList* list = static_cast<TList*>(input->FindObject(inName));
414 AliWarning(Form("No list %s found in %s", inName, input->GetName()));
418 TList* out = new TList;
419 out->SetName(outName);
423 THStack* dndetaRings = new THStack("all", "dN/d#eta per ring");
424 const char* names[] = { "FMD1I", "FMD2I", "FMD2O", "FMD3I", "FMD3O", 0 };
425 const char** ptr = names;
428 TList* thisList = new TList;
429 thisList->SetOwner();
430 thisList->SetName(*ptr);
433 TH2D* h = static_cast<TH2D*>(list->FindObject(Form("%s_cache", *ptr)));
435 AliWarning(Form("Didn't find %s_cache in %s", *ptr, list->GetName()));
439 TH2D* sumPhi = static_cast<TH2D*>(h->Clone("sum_phi"));
440 sumPhi->SetDirectory(0);
441 thisList->Add(sumPhi);
443 TH2D* sumEta = static_cast<TH2D*>(h->Clone("sum_eta"));
444 sumEta->SetDirectory(0);
445 thisList->Add(sumEta);
447 Int_t nY = sumEta->GetNbinsY();
448 TH1D* etaCov =static_cast<TH1D*>(h->ProjectionX("etaCov", 0, 0, ""));
449 TH1D* phiAcc =static_cast<TH1D*>(h->ProjectionX("phiAcc", nY+1, nY+1, ""));
451 etaCov->SetTitle("Normalization to #eta coverage");
452 etaCov->SetYTitle("#eta coverage");
453 etaCov->SetMarkerColor(kBlue+1);
454 etaCov->SetFillColor(kBlue+1);
455 etaCov->SetFillStyle(3005);
456 etaCov->SetDirectory(0);
458 phiAcc->SetTitle("Normalization to #phi acceptance");
459 phiAcc->SetYTitle("#phi acceptance");
460 phiAcc->SetMarkerColor(kGreen+1);
461 phiAcc->SetFillColor(kGreen+1);
462 phiAcc->SetFillStyle(3004);
463 // phiAcc->Scale(1. / nAcc);
464 phiAcc->SetDirectory(0);
466 // Double_t s = (etaCov->GetMaximum() > 0 ? 1. / etaCov->GetMaximum() : 1);
467 for (Int_t i = 1; i <= sumEta->GetNbinsX(); i++) {
468 for (Int_t j = 1; j <= nY; j++) {
469 Double_t c = sumEta->GetBinContent(i, j);
470 Double_t e = sumEta->GetBinError(i, j);
471 Double_t a = etaCov->GetBinContent(i);
472 Double_t p = phiAcc->GetBinContent(i);
473 // Double_t t = p; // * a
474 sumEta->SetBinContent(i, j, a <= 0 ? 0 : c / a);
475 sumEta->SetBinError( i, j, a <= 0 ? 0 : e / a);
476 sumPhi->SetBinContent(i, j, p <= 0 ? 0 : c / p);
477 sumPhi->SetBinError( i, j, p <= 0 ? 0 : e / p);
483 TH1D* resPhi =static_cast<TH1D*>(sumPhi->ProjectionX("dndeta_phi",
485 resPhi->SetMarkerStyle(style);
486 resPhi->SetDirectory(0);
487 resPhi->Scale(1, "width");
489 TH1D* resEta =static_cast<TH1D*>(sumEta->ProjectionX("dndeta_eta",
491 resEta->SetMarkerStyle(style);
492 resEta->SetDirectory(0);
493 resEta->Scale(1, "width");
495 thisList->Add(resEta);
496 thisList->Add(etaCov);
497 thisList->Add(resPhi);
498 thisList->Add(phiAcc);
499 dndetaRings->Add(resPhi);
502 out->Add(dndetaRings);
504 #define PFB(N,FLAG) \
506 AliForwardUtil::PrintName(N); \
507 std::cout << std::boolalpha << (FLAG) << std::noboolalpha << std::endl; \
509 //____________________________________________________________________
511 AliForwardMultiplicityBase::Print(Option_t* option) const
519 AliBaseESDTask::Print(option);
520 gROOT->IncreaseDirLevel();
521 PFB("Enable low flux code", fEnableLowFlux);
522 PFB("Store per-ring hists", fStorePerRing);
523 PFB("Make timing histogram", fDoTiming);
524 // gROOT->IncreaseDirLevel();
525 GetSharingFilter() .Print(option);
526 GetDensityCalculator().Print(option);
527 GetCorrections() .Print(option);
528 GetHistCollector() .Print(option);
529 GetEventPlaneFinder() .Print(option);
530 // gROOT->DecreaseDirLevel();
531 gROOT->DecreaseDirLevel();