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)) 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);
193 //____________________________________________________________________
195 AliForwardMCMultiplicityTask::UserCreateOutputObjects()
198 // Create output objects
203 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
205 dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
206 if (!ah) AliFatal("No AOD output handler set in analysis manager");
209 TObject* obj = &fAODFMD;
210 ah->AddBranch("AliAODForwardMult", &obj);
212 TObject* mcobj = &fMCAODFMD;
213 ah->AddBranch("AliAODForwardMult", &mcobj);
215 fPrimary = new TH2D("primary", "MC Primaries",
216 200, -4, 6, 20, 0, 2*TMath::Pi());
217 fPrimary->SetXTitle("#eta");
218 fPrimary->SetYTitle("#varphi [radians]");
219 fPrimary->SetZTitle("d^{2}N_{ch}/d#etad#phi");
221 fPrimary->SetStats(0);
222 fPrimary->SetDirectory(0);
223 ah->AddBranch("TH2D", &fPrimary);
225 fEventInspector.DefineOutput(fList);
226 fEnergyFitter.DefineOutput(fList);
227 fSharingFilter.DefineOutput(fList);
228 fDensityCalculator.DefineOutput(fList);
229 fCorrections.DefineOutput(fList);
233 //____________________________________________________________________
235 AliForwardMCMultiplicityTask::UserExec(Option_t*)
238 // Process each event
244 // Get the input data
245 AliESDEvent* esd = GetESDEvent();
256 Bool_t lowFlux = kFALSE;
260 UInt_t found = fEventInspector.Process(esd, triggers, lowFlux, ivz, vz);
264 Bool_t isAccepted = true;
265 if (found & AliFMDEventInspector::kNoEvent) isAccepted = false; // return;
266 if (found & AliFMDEventInspector::kNoTriggers) isAccepted = false; // return;
268 // Set trigger bits, and mark this event for storage
269 fAODFMD.SetTriggerBits(triggers);
270 fMCAODFMD.SetTriggerBits(triggers);
272 //All events should be stored - HHD
273 //MarkEventForStore();
275 if (found & AliFMDEventInspector::kNoSPD) isAccepted = false; // return;
276 if (found & AliFMDEventInspector::kNoFMD) isAccepted = false; // return;
277 if (found & AliFMDEventInspector::kNoVertex) isAccepted = false; // return;
281 fMCAODFMD.SetIpZ(vz);
283 if (found & AliFMDEventInspector::kBadVertex) isAccepted = false; // return;
285 // We we do not want to use low flux specific code, we disable it here.
286 if (!fEnableLowFlux) lowFlux = false;
289 AliESDFMD* esdFMD = esd->GetFMDData();
290 AliMCEvent* mcEvent = MCEvent();
291 // Apply the sharing filter (or hit merging or clustering if you like)
292 if (isAccepted && !fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD)) {
293 AliWarning("Sharing filter failed!");
296 if (!fSharingFilter.FilterMC(*esdFMD, *mcEvent, vz, fMCESDFMD, fPrimary)) {
297 AliWarning("MC Sharing filter failed!");
300 if (!isAccepted) return; // Exit on MC event w/o trigger, vertex, data
301 fSharingFilter.CompareResults(fESDFMD, fMCESDFMD);
303 // Do the energy stuff
304 if (!fEnergyFitter.Accumulate(*esdFMD, triggers & AliAODForwardMult::kEmpty)){
305 AliWarning("Energy fitter failed");
309 // Calculate the inclusive charged particle density
310 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, ivz, lowFlux)) {
311 AliWarning("Density calculator failed!");
314 if (!fDensityCalculator.CalculateMC(fMCESDFMD, fMCHistos)) {
315 AliWarning("MC Density calculator failed!");
318 fDensityCalculator.CompareResults(fHistos, fMCHistos);
320 // Do the secondary and other corrections.
321 if (!fCorrections.Correct(fHistos, ivz)) {
322 AliWarning("Corrections failed");
325 if (!fCorrections.CorrectMC(fMCHistos, ivz)) {
326 AliWarning("MC Corrections failed");
329 fCorrections.CompareResults(fHistos, fMCHistos);
331 if (!fHistCollector.Collect(fHistos, ivz, fAODFMD.GetHistogram())) {
332 AliWarning("Histogram collector failed");
335 if (!fHistCollector.Collect(fMCHistos, ivz, fMCAODFMD.GetHistogram())) {
336 AliWarning("MC Histogram collector failed");
340 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
341 fHData->Add(&(fAODFMD.GetHistogram()));
346 //____________________________________________________________________
348 AliForwardMCMultiplicityTask::Terminate(Option_t*)
356 TList* list = dynamic_cast<TList*>(GetOutputData(1));
358 AliError(Form("No output list defined (%p)", GetOutputData(1)));
359 if (GetOutputData(1)) GetOutputData(1)->Print();
363 // Get our histograms from the container
365 TH1I* hEventsTrVtx = 0;
367 if (!fEventInspector.FetchHistograms(list, hEventsTr,
368 hEventsTrVtx, hTriggers)) {
369 AliError(Form("Didn't get histograms from event selector "
370 "(hEventsTr=%p,hEventsTrVtx=%p)",
371 hEventsTr, hEventsTrVtx));
376 TH2D* hData = static_cast<TH2D*>(list->FindObject("d2Ndetadphi"));
378 AliError(Form("Couldn't get our summed histogram from output "
379 "list %s (d2Ndetadphi=%p)", list->GetName(), hData));
384 // TH1D* dNdeta = fHData->ProjectionX("dNdeta", 0, -1, "e");
385 TH1D* dNdeta = hData->ProjectionX("dNdeta", 1, -1, "e");
386 TH1D* norm = hData->ProjectionX("norm", 0, 1, "");
387 dNdeta->SetTitle("dN_{ch}/d#eta in the forward regions");
388 dNdeta->SetYTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}");
389 dNdeta->Divide(norm);
391 dNdeta->Scale(Double_t(hEventsTrVtx->GetEntries())/hEventsTr->GetEntries(),
396 fEnergyFitter.Fit(list);
397 fSharingFilter.ScaleHistograms(list,hEventsTr->Integral());
398 fDensityCalculator.ScaleHistograms(list,hEventsTrVtx->Integral());
399 fCorrections.ScaleHistograms(list,hEventsTrVtx->Integral());