2 // Calculate the multiplicity in the forward regions event-by-event
14 #include "AliForwardMultiplicityTask.h"
15 #include "AliTriggerAnalysis.h"
16 #include "AliPhysicsSelection.h"
18 #include "AliESDEvent.h"
19 #include "AliAODHandler.h"
20 #include "AliMultiplicity.h"
21 #include "AliInputEventHandler.h"
22 #include "AliForwardCorrectionManager.h"
23 #include "AliAnalysisManager.h"
25 #include <TDirectory.h>
30 //====================================================================
31 AliForwardMultiplicityTask::AliForwardMultiplicityTask()
32 : AliForwardMultiplicityBase(),
50 DGUARD(0,0,"Default construction of AliForwardMultiplicityTask");
53 //____________________________________________________________________
54 AliForwardMultiplicityTask::AliForwardMultiplicityTask(const char* name)
55 : AliForwardMultiplicityBase(name),
62 fEventInspector("event"),
63 fSharingFilter("sharing"),
64 fDensityCalculator("density"),
65 fCorrections("corrections"),
66 fHistCollector("collector"),
67 fEventPlaneFinder("eventplane"),
76 DGUARD(0,0,"named construction of AliForwardMultiplicityTask: %s", name);
77 DefineOutput(1, TList::Class());
80 //____________________________________________________________________
81 AliForwardMultiplicityTask::AliForwardMultiplicityTask(const AliForwardMultiplicityTask& o)
82 : AliForwardMultiplicityBase(o),
88 fRingSums(o.fRingSums),
89 fEventInspector(o.fEventInspector),
90 fSharingFilter(o.fSharingFilter),
91 fDensityCalculator(o.fDensityCalculator),
92 fCorrections(o.fCorrections),
93 fHistCollector(o.fHistCollector),
94 fEventPlaneFinder(o.fEventPlaneFinder),
101 // o Object to copy from
103 DGUARD(0,0,"Copy construction of AliForwardMultiplicityTask");
104 DefineOutput(1, TList::Class());
107 //____________________________________________________________________
108 AliForwardMultiplicityTask&
109 AliForwardMultiplicityTask::operator=(const AliForwardMultiplicityTask& o)
112 // Assignment operator
115 // o Object to assign from
118 // Reference to this object
120 DGUARD(fDebug,3,"Assignment to AliForwardMultiplicityTask");
121 if (&o == this) return *this;
122 AliForwardMultiplicityBase::operator=(o);
125 fEventInspector = o.fEventInspector;
126 fSharingFilter = o.fSharingFilter;
127 fDensityCalculator = o.fDensityCalculator;
128 fCorrections = o.fCorrections;
129 fHistCollector = o.fHistCollector;
130 fEventPlaneFinder = o.fEventPlaneFinder;
134 fRingSums = o.fRingSums;
140 //____________________________________________________________________
142 AliForwardMultiplicityTask::SetDebug(Int_t dbg)
150 fEventInspector.SetDebug(dbg);
151 fSharingFilter.SetDebug(dbg);
152 fDensityCalculator.SetDebug(dbg);
153 fCorrections.SetDebug(dbg);
154 fHistCollector.SetDebug(dbg);
155 fEventPlaneFinder.SetDebug(dbg);
158 //____________________________________________________________________
160 AliForwardMultiplicityTask::InitializeSubs()
163 // Initialise the sub objects and stuff. Called on first event
166 DGUARD(fDebug,1,"Initialize sub-algorithms");
170 if (!ReadCorrections(pe,pv)) return false;
177 fHData = static_cast<TH2D*>(fAODFMD.GetHistogram().Clone("d2Ndetadphi"));
179 fHData->SetDirectory(0);
182 TList* rings = new TList;
183 rings->SetName("ringSums");
187 rings->Add(fRingSums.Get(1, 'I'));
188 rings->Add(fRingSums.Get(2, 'I'));
189 rings->Add(fRingSums.Get(2, 'O'));
190 rings->Add(fRingSums.Get(3, 'I'));
191 rings->Add(fRingSums.Get(3, 'O'));
192 fRingSums.Get(1, 'I')->SetMarkerColor(AliForwardUtil::RingColor(1, 'I'));
193 fRingSums.Get(2, 'I')->SetMarkerColor(AliForwardUtil::RingColor(2, 'I'));
194 fRingSums.Get(2, 'O')->SetMarkerColor(AliForwardUtil::RingColor(2, 'O'));
195 fRingSums.Get(3, 'I')->SetMarkerColor(AliForwardUtil::RingColor(3, 'I'));
196 fRingSums.Get(3, 'O')->SetMarkerColor(AliForwardUtil::RingColor(3, 'O'));
198 fEventInspector.Init(*pv);
199 fSharingFilter.Init(*pe);
200 fDensityCalculator.Init(*pe);
201 fCorrections.Init(*pe);
202 fHistCollector.Init(*pv,*pe);
203 fEventPlaneFinder.Init(*pe);
209 //____________________________________________________________________
211 AliForwardMultiplicityTask::UserCreateOutputObjects()
214 // Create output objects
217 DGUARD(fDebug,1,"Create user ouput");
221 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
223 dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
224 if (!ah) AliFatal("No AOD output handler set in analysis manager");
227 TObject* obj = &fAODFMD;
228 ah->AddBranch("AliAODForwardMult", &obj);
229 TObject* epobj = &fAODEP;
230 ah->AddBranch("AliAODForwardEP", &epobj);
232 fEventInspector.DefineOutput(fList);
233 fSharingFilter.DefineOutput(fList);
234 fDensityCalculator.DefineOutput(fList);
235 fCorrections.DefineOutput(fList);
236 fHistCollector.DefineOutput(fList);
237 fEventPlaneFinder.DefineOutput(fList);
241 //____________________________________________________________________
243 AliForwardMultiplicityTask::UserExec(Option_t*)
246 // Process each event
252 DGUARD(fDebug,1,"Process the input event");
253 // static Int_t cnt = 0;
255 // Get the input data
256 AliESDEvent* esd = GetESDEvent();
265 Bool_t lowFlux = kFALSE;
270 UShort_t nClusters = 0;
271 UInt_t found = fEventInspector.Process(esd, triggers, lowFlux,
272 ivz, vz, cent, nClusters);
274 if (found & AliFMDEventInspector::kNoEvent) return;
275 if (found & AliFMDEventInspector::kNoTriggers) return;
277 // Set trigger bits, and mark this event for storage
278 fAODFMD.SetTriggerBits(triggers);
279 fAODFMD.SetSNN(fEventInspector.GetEnergy());
280 fAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
281 fAODFMD.SetCentrality(cent);
282 fAODFMD.SetNClusters(nClusters);
285 if (found & AliFMDEventInspector::kNoSPD) return;
286 if (found & AliFMDEventInspector::kNoFMD) return;
287 if (found & AliFMDEventInspector::kNoVertex) return;
289 if (triggers & AliAODForwardMult::kPileUp) return;
293 if (found & AliFMDEventInspector::kBadVertex) return;
295 // We we do not want to use low flux specific code, we disable it here.
296 if (!fEnableLowFlux) lowFlux = false;
299 AliESDFMD* esdFMD = esd->GetFMDData();
300 // // Apply the sharing filter (or hit merging or clustering if you like)
301 if (!fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD, vz)) {
302 AliWarning("Sharing filter failed!");
306 // Calculate the inclusive charged particle density
307 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, ivz, lowFlux, cent,vz)) {
308 // if (!fDensityCalculator.Calculate(*esdFMD, fHistos, ivz, lowFlux)) {
309 AliWarning("Density calculator failed!");
313 if (fEventInspector.GetCollisionSystem() == AliFMDEventInspector::kPbPb) {
314 if (!fEventPlaneFinder.FindEventplane(esd, fAODEP, &(fAODFMD.GetHistogram()), &fHistos))
315 AliWarning("Eventplane finder failed!");
318 // Do the secondary and other corrections.
319 if (!fCorrections.Correct(fHistos, ivz)) {
320 AliWarning("Corrections failed");
324 if (!fHistCollector.Collect(fHistos, fRingSums,
325 ivz, fAODFMD.GetHistogram())) {
326 AliWarning("Histogram collector failed");
330 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
331 fHData->Add(&(fAODFMD.GetHistogram()));
336 //____________________________________________________________________
338 AliForwardMultiplicityTask::Terminate(Option_t*)
346 DGUARD(fDebug,1,"Processing the merged results");
348 TList* list = dynamic_cast<TList*>(GetOutputData(1));
350 AliError(Form("No output list defined (%p)", GetOutputData(1)));
351 if (GetOutputData(1)) GetOutputData(1)->Print();
355 // Get our histograms from the container
356 TH1I* hEventsTr = 0;//static_cast<TH1I*>(list->FindObject("nEventsTr"));
357 TH1I* hEventsTrVtx = 0;//static_cast<TH1I*>(list->FindObject("nEventsTrVtx"));
359 if (!fEventInspector.FetchHistograms(list, hEventsTr,
360 hEventsTrVtx, hTriggers)) {
361 AliError(Form("Didn't get histograms from event selector "
362 "(hEventsTr=%p,hEventsTrVtx=%p)",
363 hEventsTr, hEventsTrVtx));
368 TH2D* hData = static_cast<TH2D*>(list->FindObject("d2Ndetadphi"));
370 AliError(Form("Couldn't get our summed histogram from output "
371 "list %s (d2Ndetadphi=%p)", list->GetName(), hData));
376 // TH1D* dNdeta = fHData->ProjectionX("dNdeta", 0, -1, "e");
377 TH1D* dNdeta = hData->ProjectionX("dNdeta", 1, -1, "e");
378 TH1D* norm = hData->ProjectionX("norm", 0, 0, "");
379 dNdeta->SetTitle("dN_{ch}/d#eta in the forward regions");
380 dNdeta->SetYTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}");
381 dNdeta->Divide(norm);
383 dNdeta->Scale(Double_t(hEventsTrVtx->GetEntries())/hEventsTr->GetEntries(),
388 MakeRingdNdeta(list, "ringSums", list, "ringResults");
390 fSharingFilter.ScaleHistograms(list,Int_t(hEventsTr->Integral()));
391 fDensityCalculator.ScaleHistograms(list,Int_t(hEventsTrVtx->Integral()));
392 fCorrections.ScaleHistograms(list,Int_t(hEventsTrVtx->Integral()));