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"
26 #include <TDirectory.h>
29 #include <TStopwatch.h>
32 //====================================================================
33 AliForwardMultiplicityTask::AliForwardMultiplicityTask()
34 : AliForwardMultiplicityBase(),
46 DGUARD(fDebug, 3,"Default CTOR of AliForwardMultiplicityTask");
49 //____________________________________________________________________
50 AliForwardMultiplicityTask::AliForwardMultiplicityTask(const char* name)
51 : AliForwardMultiplicityBase(name),
53 fEventInspector("event"),
54 fSharingFilter("sharing"),
55 fDensityCalculator("density"),
56 fCorrections("corrections"),
57 fHistCollector("collector"),
58 fEventPlaneFinder("eventplane")
66 DGUARD(fDebug, 3,"named CTOR of AliForwardMultiplicityTask: %s", name);
70 //____________________________________________________________________
72 AliForwardMultiplicityTask::PreEvent()
81 //____________________________________________________________________
83 AliForwardMultiplicityTask::Event(AliESDEvent& esd)
92 TStopwatch individual;
93 if (fDoTiming) total.Start(true);
95 DGUARD(fDebug,1,"Process the input event");
98 if (fDoTiming) individual.Start(true);
99 Bool_t lowFlux = kFALSE;
104 UShort_t nClusters = 0;
105 UInt_t found = fEventInspector.Process(&esd, triggers, lowFlux,
106 ivz, ip, cent, nClusters);
107 if (fDoTiming) fHTiming->Fill(kTimingEventInspector, individual.CpuTime());
109 if (found & AliFMDEventInspector::kNoEvent) return false;
110 if (found & AliFMDEventInspector::kNoTriggers) return false;
112 // Set trigger bits, and mark this event for storage
113 fAODFMD.SetTriggerBits(triggers);
114 fAODFMD.SetSNN(fEventInspector.GetEnergy());
115 fAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
116 fAODFMD.SetCentrality(cent);
117 fAODFMD.SetNClusters(nClusters);
120 // Do not check if SPD data is there - potential bias
121 // if (found & AliFMDEventInspector::kNoSPD) return false;
122 if (found & AliFMDEventInspector::kNoFMD) return false;
123 if (found & AliFMDEventInspector::kNoVertex) return false;
124 if (triggers & AliAODForwardMult::kPileUp) return false;
125 fAODFMD.SetIpZ(ip.Z());
126 if (found & AliFMDEventInspector::kBadVertex) return false;
128 // We we do not want to use low flux specific code, we disable it here.
129 if (!fEnableLowFlux) lowFlux = false;
132 AliESDFMD* esdFMD = esd.GetFMDData();
134 // Apply the sharing filter (or hit merging or clustering if you like)
135 if (fDoTiming) individual.Start(true);
136 if (!fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD, ip.Z())) {
137 AliWarning("Sharing filter failed!");
140 if (fDoTiming) fHTiming->Fill(kTimingSharingFilter, individual.CpuTime());
142 // Calculate the inclusive charged particle density
143 if (fDoTiming) individual.Start(true);
144 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, lowFlux, cent, ip)) {
145 // if (!fDensityCalculator.Calculate(*esdFMD, fHistos, ivz, lowFlux)) {
146 AliWarning("Density calculator failed!");
149 if (fDoTiming) fHTiming->Fill(kTimingDensityCalculator,individual.CpuTime());
151 // Check if we should do the event plane finder
152 if (fEventInspector.GetCollisionSystem() == AliFMDEventInspector::kPbPb) {
153 if (fDoTiming) individual.Start(true);
154 if (!fEventPlaneFinder.FindEventplane(&esd, fAODEP,
155 &(fAODFMD.GetHistogram()), &fHistos))
156 AliWarning("Eventplane finder failed!");
157 if (fDoTiming) fHTiming->Fill(kTimingEventPlaneFinder,individual.CpuTime());
160 // Check how many rings have been marked for skipping
162 for (UShort_t d=1; d<=3; d++) {
163 for (UShort_t q=0; q<=(d/2); q++) {
164 TH2D* h = fHistos.Get(d,q == 0 ? 'I' : 'O');
165 if (h && h->TestBit(AliForwardUtil::kSkipRing)) nSkip++;
169 // Skip the rest if we have too many outliers
172 // Do the secondary and other corrections.
173 if (fDoTiming) individual.Start(true);
174 if (!fCorrections.Correct(fHistos, ivz)) {
175 AliWarning("Corrections failed");
178 if (fDoTiming) fHTiming->Fill(kTimingCorrections, individual.CpuTime());
180 // Collect our `super' histogram
181 if (fDoTiming) individual.Start(true);
182 if (!fHistCollector.Collect(fHistos, fRingSums,
183 ivz, fAODFMD.GetHistogram(),
184 fAODFMD.GetCentrality())) {
185 AliWarning("Histogram collector failed");
188 if (fDoTiming) fHTiming->Fill(kTimingHistCollector, individual.CpuTime());
190 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel) && nSkip < 1)
191 fHData->Add(&(fAODFMD.GetHistogram()));
193 if (fDoTiming) fHTiming->Fill(kTimingTotal, total.CpuTime());