2 // Calculate the multiplicity in the forward regions event-by-event
10 // - AliAODForwardMult
16 #include "AliForwardMCMultiplicityTask.h"
17 #include "AliTriggerAnalysis.h"
18 #include "AliPhysicsSelection.h"
20 #include "AliESDEvent.h"
21 #include "AliAODHandler.h"
22 #include "AliMultiplicity.h"
23 #include "AliInputEventHandler.h"
24 #include "AliForwardCorrectionManager.h"
25 #include "AliAnalysisManager.h"
27 #include <TDirectory.h>
33 //====================================================================
34 AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask()
35 : AliForwardMultiplicityBase(),
57 //____________________________________________________________________
58 AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask(const char* name)
59 : AliForwardMultiplicityBase(name),
68 fEventInspector("event"),
69 fEnergyFitter("energy"),
70 fSharingFilter("sharing"),
71 fDensityCalculator("density"),
72 fCorrections("corrections"),
73 fHistCollector("collector"),
82 DefineOutput(1, TList::Class());
85 //____________________________________________________________________
86 AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask(const AliForwardMCMultiplicityTask& o)
87 : AliForwardMultiplicityBase(o),
92 fMCESDFMD(o.fMCESDFMD),
93 fMCHistos(o.fMCHistos),
94 fMCAODFMD(o.fMCAODFMD),
96 fEventInspector(o.fEventInspector),
97 fEnergyFitter(o.fEnergyFitter),
98 fSharingFilter(o.fSharingFilter),
99 fDensityCalculator(o.fDensityCalculator),
100 fCorrections(o.fCorrections),
101 fHistCollector(o.fHistCollector),
108 // o Object to copy from
110 DefineOutput(1, TList::Class());
113 //____________________________________________________________________
114 AliForwardMCMultiplicityTask&
115 AliForwardMCMultiplicityTask::operator=(const AliForwardMCMultiplicityTask& o)
118 // Assignment operator
121 // o Object to assign from
124 // Reference to this object
126 AliForwardMultiplicityBase::operator=(o);
129 fEventInspector = o.fEventInspector;
130 fEnergyFitter = o.fEnergyFitter;
131 fSharingFilter = o.fSharingFilter;
132 fDensityCalculator = o.fDensityCalculator;
133 fCorrections = o.fCorrections;
134 fHistCollector = o.fHistCollector;
137 fMCHistos = o.fMCHistos;
138 fMCAODFMD = o.fMCAODFMD;
139 fPrimary = o.fPrimary;
145 //____________________________________________________________________
147 AliForwardMCMultiplicityTask::SetDebug(Int_t dbg)
155 fEventInspector.SetDebug(dbg);
156 fEnergyFitter.SetDebug(dbg);
157 fSharingFilter.SetDebug(dbg);
158 fDensityCalculator.SetDebug(dbg);
159 fCorrections.SetDebug(dbg);
160 fHistCollector.SetDebug(dbg);
162 //____________________________________________________________________
164 AliForwardMCMultiplicityTask::InitializeSubs()
167 // Initialise the sub objects and stuff. Called on first event
170 UInt_t what = AliForwardCorrectionManager::kAll;
172 what ^= AliForwardCorrectionManager::kDoubleHit;
173 if (!fCorrections.IsUseMergingEfficiency())
174 what ^= AliForwardCorrectionManager::kMergingEfficiency;
176 AliForwardCorrectionManager& fcm = AliForwardCorrectionManager::Instance();
177 fcm.Init(fEventInspector.GetCollisionSystem(),
178 fEventInspector.GetEnergy(),
179 fEventInspector.GetField(),
182 if (!CheckCorrections(what)) return;
184 const TAxis* pe = fcm.GetEtaAxis();
185 const TAxis* pv = fcm.GetVertexAxis();
186 if (!pe) AliFatal("No eta axis defined");
187 if (!pv) AliFatal("No vertex axis defined");
194 fHData = static_cast<TH2D*>(fAODFMD.GetHistogram().Clone("d2Ndetadphi"));
196 fHData->SetDirectory(0);
200 fEnergyFitter.Init(*pe);
201 fEventInspector.Init(*pv);
202 fDensityCalculator.Init(*pe);
203 fCorrections.Init(*pe);
204 fHistCollector.Init(*pv);
209 //____________________________________________________________________
211 AliForwardMCMultiplicityTask::UserCreateOutputObjects()
214 // Create output objects
219 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
221 dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
222 if (!ah) AliFatal("No AOD output handler set in analysis manager");
225 TObject* obj = &fAODFMD;
226 ah->AddBranch("AliAODForwardMult", &obj);
228 TObject* mcobj = &fMCAODFMD;
229 ah->AddBranch("AliAODForwardMult", &mcobj);
231 fPrimary = new TH2D("primary", "MC Primaries",
232 200, -4, 6, 20, 0, 2*TMath::Pi());
233 fPrimary->SetXTitle("#eta");
234 fPrimary->SetYTitle("#varphi [radians]");
235 fPrimary->SetZTitle("d^{2}N_{ch}/d#etad#phi");
237 fPrimary->SetStats(0);
238 fPrimary->SetDirectory(0);
239 ah->AddBranch("TH2D", &fPrimary);
241 fEventInspector.DefineOutput(fList);
242 fEnergyFitter.DefineOutput(fList);
243 fSharingFilter.DefineOutput(fList);
244 fDensityCalculator.DefineOutput(fList);
245 fCorrections.DefineOutput(fList);
249 //____________________________________________________________________
251 AliForwardMCMultiplicityTask::UserExec(Option_t*)
254 // Process each event
260 // Get the input data
261 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
263 AliWarning("No ESD event found for input event");
267 // On the first event, initialize the parameters
268 if (fFirstEvent && esd->GetESDRun()) {
269 fEventInspector.ReadRunDetails(esd);
271 AliInfo(Form("Initializing with parameters from the ESD:\n"
272 " AliESDEvent::GetBeamEnergy() ->%f\n"
273 " AliESDEvent::GetBeamType() ->%s\n"
274 " AliESDEvent::GetCurrentL3() ->%f\n"
275 " AliESDEvent::GetMagneticField()->%f\n"
276 " AliESDEvent::GetRunNumber() ->%d\n",
277 esd->GetBeamEnergy(),
280 esd->GetMagneticField(),
281 esd->GetRunNumber()));
296 Bool_t lowFlux = kFALSE;
300 UInt_t found = fEventInspector.Process(esd, triggers, lowFlux, ivz, vz);
304 Bool_t isAccepted = true;
305 if (found & AliFMDEventInspector::kNoEvent) isAccepted = false; // return;
306 if (found & AliFMDEventInspector::kNoTriggers) isAccepted = false; // return;
308 // Set trigger bits, and mark this event for storage
309 fAODFMD.SetTriggerBits(triggers);
310 fMCAODFMD.SetTriggerBits(triggers);
312 //All events should be stored - HHD
313 //MarkEventForStore();
315 if (found & AliFMDEventInspector::kNoSPD) isAccepted = false; // return;
316 if (found & AliFMDEventInspector::kNoFMD) isAccepted = false; // return;
317 if (found & AliFMDEventInspector::kNoVertex) isAccepted = false; // return;
321 fMCAODFMD.SetIpZ(vz);
323 if (found & AliFMDEventInspector::kBadVertex) isAccepted = false; // return;
325 // We we do not want to use low flux specific code, we disable it here.
326 if (!fEnableLowFlux) lowFlux = false;
329 AliESDFMD* esdFMD = esd->GetFMDData();
330 AliMCEvent* mcEvent = MCEvent();
331 // Apply the sharing filter (or hit merging or clustering if you like)
332 if (isAccepted && !fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD)) {
333 AliWarning("Sharing filter failed!");
336 if (!fSharingFilter.FilterMC(*esdFMD, *mcEvent, vz, fMCESDFMD, fPrimary)) {
337 AliWarning("MC Sharing filter failed!");
340 if (!isAccepted) return; // Exit on MC event w/o trigger, vertex, data
341 fSharingFilter.CompareResults(fESDFMD, fMCESDFMD);
343 // Do the energy stuff
344 if (!fEnergyFitter.Accumulate(*esdFMD, triggers & AliAODForwardMult::kEmpty)){
345 AliWarning("Energy fitter failed");
349 // Calculate the inclusive charged particle density
350 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, ivz, lowFlux)) {
351 AliWarning("Density calculator failed!");
354 if (!fDensityCalculator.CalculateMC(fMCESDFMD, fMCHistos)) {
355 AliWarning("MC Density calculator failed!");
358 fDensityCalculator.CompareResults(fHistos, fMCHistos);
360 // Do the secondary and other corrections.
361 if (!fCorrections.Correct(fHistos, ivz)) {
362 AliWarning("Corrections failed");
365 if (!fCorrections.CorrectMC(fMCHistos, ivz)) {
366 AliWarning("MC Corrections failed");
369 fCorrections.CompareResults(fHistos, fMCHistos);
371 if (!fHistCollector.Collect(fHistos, ivz, fAODFMD.GetHistogram())) {
372 AliWarning("Histogram collector failed");
375 if (!fHistCollector.Collect(fMCHistos, ivz, fMCAODFMD.GetHistogram())) {
376 AliWarning("MC Histogram collector failed");
380 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
381 fHData->Add(&(fAODFMD.GetHistogram()));
386 //____________________________________________________________________
388 AliForwardMCMultiplicityTask::Terminate(Option_t*)
396 TList* list = dynamic_cast<TList*>(GetOutputData(1));
398 AliError(Form("No output list defined (%p)", GetOutputData(1)));
399 if (GetOutputData(1)) GetOutputData(1)->Print();
403 // Get our histograms from the container
405 TH1I* hEventsTrVtx = 0;
407 if (!fEventInspector.FetchHistograms(list, hEventsTr,
408 hEventsTrVtx, hTriggers)) {
409 AliError(Form("Didn't get histograms from event selector "
410 "(hEventsTr=%p,hEventsTrVtx=%p)",
411 hEventsTr, hEventsTrVtx));
416 TH2D* hData = static_cast<TH2D*>(list->FindObject("d2Ndetadphi"));
418 AliError(Form("Couldn't get our summed histogram from output "
419 "list %s (d2Ndetadphi=%p)", list->GetName(), hData));
424 // TH1D* dNdeta = fHData->ProjectionX("dNdeta", 0, -1, "e");
425 TH1D* dNdeta = hData->ProjectionX("dNdeta", 1, -1, "e");
426 TH1D* norm = hData->ProjectionX("norm", 0, 1, "");
427 dNdeta->SetTitle("dN_{ch}/d#eta in the forward regions");
428 dNdeta->SetYTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}");
429 dNdeta->Divide(norm);
431 dNdeta->Scale(Double_t(hEventsTrVtx->GetEntries())/hEventsTr->GetEntries(),
436 fEnergyFitter.Fit(list);
437 fSharingFilter.ScaleHistograms(list,hEventsTr->Integral());
438 fDensityCalculator.ScaleHistograms(list,hEventsTrVtx->Integral());
439 fCorrections.ScaleHistograms(list,hEventsTrVtx->Integral());