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>
31 //====================================================================
32 AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask()
33 : AliForwardMultiplicityBase(),
55 //____________________________________________________________________
56 AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask(const char* name)
57 : AliForwardMultiplicityBase(name),
66 fEventInspector("event"),
67 fEnergyFitter("energy"),
68 fSharingFilter("sharing"),
69 fDensityCalculator("density"),
70 fCorrections("corrections"),
71 fHistCollector("collector"),
80 DefineOutput(1, TList::Class());
83 //____________________________________________________________________
84 AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask(const AliForwardMCMultiplicityTask& o)
85 : AliForwardMultiplicityBase(o),
90 fMCESDFMD(o.fMCESDFMD),
91 fMCHistos(o.fMCHistos),
92 fMCAODFMD(o.fMCAODFMD),
94 fEventInspector(o.fEventInspector),
95 fEnergyFitter(o.fEnergyFitter),
96 fSharingFilter(o.fSharingFilter),
97 fDensityCalculator(o.fDensityCalculator),
98 fCorrections(o.fCorrections),
99 fHistCollector(o.fHistCollector),
106 // o Object to copy from
108 DefineOutput(1, TList::Class());
111 //____________________________________________________________________
112 AliForwardMCMultiplicityTask&
113 AliForwardMCMultiplicityTask::operator=(const AliForwardMCMultiplicityTask& o)
116 // Assignment operator
119 // o Object to assign from
122 // Reference to this object
124 AliForwardMultiplicityBase::operator=(o);
127 fEventInspector = o.fEventInspector;
128 fEnergyFitter = o.fEnergyFitter;
129 fSharingFilter = o.fSharingFilter;
130 fDensityCalculator = o.fDensityCalculator;
131 fCorrections = o.fCorrections;
132 fHistCollector = o.fHistCollector;
135 fMCHistos = o.fMCHistos;
136 fMCAODFMD = o.fMCAODFMD;
137 fPrimary = o.fPrimary;
143 //____________________________________________________________________
145 AliForwardMCMultiplicityTask::SetDebug(Int_t dbg)
153 fEventInspector.SetDebug(dbg);
154 fEnergyFitter.SetDebug(dbg);
155 fSharingFilter.SetDebug(dbg);
156 fDensityCalculator.SetDebug(dbg);
157 fCorrections.SetDebug(dbg);
158 fHistCollector.SetDebug(dbg);
160 //____________________________________________________________________
162 AliForwardMCMultiplicityTask::InitializeSubs()
165 // Initialise the sub objects and stuff. Called on first event
171 if (!ReadCorrections(pe,pv,true)) return;
178 fHData = static_cast<TH2D*>(fAODFMD.GetHistogram().Clone("d2Ndetadphi"));
180 fHData->SetDirectory(0);
184 fEnergyFitter.Init(*pe);
185 fEventInspector.Init(*pv);
186 fDensityCalculator.Init(*pe);
187 fCorrections.Init(*pe);
188 fHistCollector.Init(*pv,*pe);
193 //____________________________________________________________________
195 AliForwardMCMultiplicityTask::UserCreateOutputObjects()
198 // Create output objects
204 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
206 dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
207 if (!ah) AliFatal("No AOD output handler set in analysis manager");
210 TObject* obj = &fAODFMD;
211 ah->AddBranch("AliAODForwardMult", &obj);
213 TObject* mcobj = &fMCAODFMD;
214 ah->AddBranch("AliAODForwardMult", &mcobj);
216 fPrimary = new TH2D("primary", "MC Primaries",
217 200, -4, 6, 20, 0, 2*TMath::Pi());
218 fPrimary->SetXTitle("#eta");
219 fPrimary->SetYTitle("#varphi [radians]");
220 fPrimary->SetZTitle("d^{2}N_{ch}/d#etad#phi");
222 fPrimary->SetStats(0);
223 fPrimary->SetDirectory(0);
224 ah->AddBranch("TH2D", &fPrimary);
226 fEventInspector.DefineOutput(fList);
227 fEnergyFitter.DefineOutput(fList);
228 fSharingFilter.DefineOutput(fList);
229 fDensityCalculator.DefineOutput(fList);
230 fCorrections.DefineOutput(fList);
231 fHistCollector.DefineOutput(fList);
235 //____________________________________________________________________
237 AliForwardMCMultiplicityTask::UserExec(Option_t*)
240 // Process each event
246 // Get the input data
247 AliESDEvent* esd = GetESDEvent();
248 AliMCEvent* mcEvent = MCEvent();
259 Bool_t lowFlux = kFALSE;
264 UInt_t found = fEventInspector.Process(esd, triggers, lowFlux,
271 fEventInspector.ProcessMC(mcEvent, triggers, ivzMC, vzMC, b, phiR);
277 Bool_t isAccepted = true;
278 if (found & AliFMDEventInspector::kNoEvent) isAccepted = false; // return;
279 if (found & AliFMDEventInspector::kNoTriggers) isAccepted = false; // return;
280 //MarkEventForStore();
281 // Set trigger bits, and mark this event for storage
282 fAODFMD.SetTriggerBits(triggers);
283 fMCAODFMD.SetTriggerBits(triggers);
284 fAODFMD.SetCentrality(cent);
286 //All events should be stored - HHD
287 //if (isAccepted) MarkEventForStore();
289 // Disable this check on SPD - will bias data
290 // if (found & AliFMDEventInspector::kNoSPD) isAccepted = false; // return;
291 if (found & AliFMDEventInspector::kNoFMD) isAccepted = false; // return;
292 if (found & AliFMDEventInspector::kNoVertex) isAccepted = false; // return;
296 fMCAODFMD.SetIpZ(vz);
298 if (found & AliFMDEventInspector::kBadVertex) isAccepted = false; // return;
300 // We we do not want to use low flux specific code, we disable it here.
301 if (!fEnableLowFlux) lowFlux = false;
306 AliESDFMD* esdFMD = esd->GetFMDData();
308 // Apply the sharing filter (or hit merging or clustering if you like)
309 if (isAccepted && !fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD)) {
310 AliWarning("Sharing filter failed!");
313 if (!fSharingFilter.FilterMC(*esdFMD, *mcEvent, vz, fMCESDFMD, fPrimary)) {
314 AliWarning("MC Sharing filter failed!");
317 if (!isAccepted) return; // Exit on MC event w/o trigger, vertex, data
318 // HHD if (!isAccepted) return; // Exit on MC event w/o trigger, vertex, data
320 //MarkEventForStore();
321 fSharingFilter.CompareResults(fESDFMD, fMCESDFMD);
323 // Do the energy stuff
324 if (!fEnergyFitter.Accumulate(*esdFMD, cent,
325 triggers & AliAODForwardMult::kEmpty)){
326 AliWarning("Energy fitter failed");
330 // Calculate the inclusive charged particle density
331 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, ivz, lowFlux)) {
332 AliWarning("Density calculator failed!");
335 if (!fDensityCalculator.CalculateMC(fMCESDFMD, fMCHistos)) {
336 AliWarning("MC Density calculator failed!");
339 fDensityCalculator.CompareResults(fHistos, fMCHistos);
341 // Do the secondary and other corrections.
342 if (!fCorrections.Correct(fHistos, ivz)) {
343 AliWarning("Corrections failed");
346 if (!fCorrections.CorrectMC(fMCHistos, ivz)) {
347 AliWarning("MC Corrections failed");
350 fCorrections.CompareResults(fHistos, fMCHistos);
352 if (!fHistCollector.Collect(fHistos, ivz, fAODFMD.GetHistogram())) {
353 AliWarning("Histogram collector failed");
356 if (!fHistCollector.Collect(fMCHistos, ivz, fMCAODFMD.GetHistogram())) {
357 AliWarning("MC Histogram collector failed");
361 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
362 fHData->Add(&(fAODFMD.GetHistogram()));
367 //____________________________________________________________________
369 AliForwardMCMultiplicityTask::Terminate(Option_t*)
377 TList* list = dynamic_cast<TList*>(GetOutputData(1));
379 AliError(Form("No output list defined (%p)", GetOutputData(1)));
380 if (GetOutputData(1)) GetOutputData(1)->Print();
384 // Get our histograms from the container
386 TH1I* hEventsTrVtx = 0;
388 if (!fEventInspector.FetchHistograms(list, hEventsTr,
389 hEventsTrVtx, hTriggers)) {
390 AliError(Form("Didn't get histograms from event selector "
391 "(hEventsTr=%p,hEventsTrVtx=%p)",
392 hEventsTr, hEventsTrVtx));
397 TH2D* hData = static_cast<TH2D*>(list->FindObject("d2Ndetadphi"));
399 AliError(Form("Couldn't get our summed histogram from output "
400 "list %s (d2Ndetadphi=%p)", list->GetName(), hData));
405 // TH1D* dNdeta = fHData->ProjectionX("dNdeta", 0, -1, "e");
406 TH1D* dNdeta = hData->ProjectionX("dNdeta", 1, -1, "e");
407 TH1D* norm = hData->ProjectionX("norm", 0, 1, "");
408 dNdeta->SetTitle("dN_{ch}/d#eta in the forward regions");
409 dNdeta->SetYTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}");
410 dNdeta->Divide(norm);
412 dNdeta->Scale(Double_t(hEventsTrVtx->GetEntries())/hEventsTr->GetEntries(),
417 fEnergyFitter.Fit(list);
418 fSharingFilter.ScaleHistograms(list,Int_t(hEventsTr->Integral()));
419 fDensityCalculator.ScaleHistograms(list,Int_t(hEventsTrVtx->Integral()));
420 fCorrections.ScaleHistograms(list,Int_t(hEventsTrVtx->Integral()));