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(),
52 //____________________________________________________________________
53 AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask(const char* name)
54 : AliForwardMultiplicityBase(name),
61 fEventInspector("event"),
62 fSharingFilter("sharing"),
63 fDensityCalculator("density"),
64 fCorrections("corrections"),
65 fHistCollector("collector"),
66 fEventPlaneFinder("eventplane")
76 //____________________________________________________________________
77 AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask(const AliForwardMCMultiplicityTask& o)
78 : AliForwardMultiplicityBase(o),
80 fMCESDFMD(o.fMCESDFMD),
81 fMCHistos(o.fMCHistos),
82 fMCAODFMD(o.fMCAODFMD),
83 fMCRingSums(o.fMCRingSums),
85 fEventInspector(o.fEventInspector),
86 fSharingFilter(o.fSharingFilter),
87 fDensityCalculator(o.fDensityCalculator),
88 fCorrections(o.fCorrections),
89 fHistCollector(o.fHistCollector),
90 fEventPlaneFinder(o.fEventPlaneFinder)
96 // o Object to copy from
100 //____________________________________________________________________
101 AliForwardMCMultiplicityTask&
102 AliForwardMCMultiplicityTask::operator=(const AliForwardMCMultiplicityTask& o)
105 // Assignment operator
108 // o Object to assign from
111 // Reference to this object
113 if (&o == this) return *this;
114 AliForwardMultiplicityBase::operator=(o);
116 fEventInspector = o.fEventInspector;
117 fSharingFilter = o.fSharingFilter;
118 fDensityCalculator = o.fDensityCalculator;
119 fCorrections = o.fCorrections;
120 fHistCollector = o.fHistCollector;
121 fEventPlaneFinder = o.fEventPlaneFinder;
122 fMCHistos = o.fMCHistos;
123 fMCAODFMD = o.fMCAODFMD;
124 fMCRingSums = o.fMCRingSums;
125 fPrimary = o.fPrimary;
129 //____________________________________________________________________
131 AliForwardMCMultiplicityTask::SetOnlyPrimary(Bool_t use)
133 fSharingFilter.GetTrackDensity().SetUseOnlyPrimary(use);
134 fCorrections.SetSecondaryForMC(!use);
137 //____________________________________________________________________
139 AliForwardMCMultiplicityTask::CreateBranches(AliAODHandler* ah)
142 // Create output objects
145 AliForwardMultiplicityBase::CreateBranches(ah);
147 TObject* mcobj = &fMCAODFMD;
148 ah->AddBranch("AliAODForwardMult", &mcobj);
150 fPrimary = new TH2D("primary", "MC Primaries", 1,0,1,20,0,TMath::TwoPi());
151 fPrimary->SetXTitle("#eta");
152 fPrimary->SetYTitle("#varphi [radians]");
153 fPrimary->SetZTitle("d^{2}N_{ch}/d#etad#phi");
155 fPrimary->SetStats(0);
156 fPrimary->SetDirectory(0);
158 ah->AddBranch("TH2D", &fPrimary);
162 //____________________________________________________________________
164 AliForwardMCMultiplicityTask::InitMembers(const TAxis* pe, const TAxis* pv)
167 // Initialise the sub objects and stuff. Called on first event
170 AliForwardMultiplicityBase::InitMembers(pe, pv);
174 fMCRingSums.Init(*pe);
176 AliForwardUtil::Histos::RebinEta(fPrimary, *pe);
178 TList* mcRings = new TList;
179 mcRings->SetName("mcRingSums");
183 mcRings->Add(fMCRingSums.Get(1, 'I'));
184 mcRings->Add(fMCRingSums.Get(2, 'I'));
185 mcRings->Add(fMCRingSums.Get(2, 'O'));
186 mcRings->Add(fMCRingSums.Get(3, 'I'));
187 mcRings->Add(fMCRingSums.Get(3, 'O'));
188 fMCRingSums.Get(1, 'I')->SetMarkerColor(AliForwardUtil::RingColor(1, 'I'));
189 fMCRingSums.Get(2, 'I')->SetMarkerColor(AliForwardUtil::RingColor(2, 'I'));
190 fMCRingSums.Get(2, 'O')->SetMarkerColor(AliForwardUtil::RingColor(2, 'O'));
191 fMCRingSums.Get(3, 'I')->SetMarkerColor(AliForwardUtil::RingColor(3, 'I'));
192 fMCRingSums.Get(3, 'O')->SetMarkerColor(AliForwardUtil::RingColor(3, 'O'));
195 //____________________________________________________________________
197 AliForwardMCMultiplicityTask::UserExec(Option_t*)
200 // Process each event
206 // Read production details
208 fEventInspector.ReadProductionDetails(MCEvent());
210 // Get the input data
211 AliESDEvent* esd = GetESDEvent();
212 AliMCEvent* mcEvent = MCEvent();
213 if (!esd || !mcEvent) return;
225 Bool_t lowFlux = kFALSE;
228 TVector3 ip(1024, 1024, 0);
230 UShort_t nClusters = 0;
231 UInt_t found = fEventInspector.Process(esd, triggers, lowFlux,
232 ivz, ip, cent, nClusters);
241 fEventInspector.ProcessMC(mcEvent, triggers, ivzMC, vzMC, b, cMC,
243 fEventInspector.CompareResults(ip.Z(), vzMC, cent, cMC, b, npart, nbin);
248 Bool_t isAccepted = true;
249 if (found & AliFMDEventInspector::kNoEvent) isAccepted = false; // return;
250 if (found & AliFMDEventInspector::kNoTriggers) isAccepted = false; // return;
251 //MarkEventForStore();
252 // Always set the B trigger - each MC event _is_ a collision
253 triggers |= AliAODForwardMult::kB;
254 // Set trigger bits, and mark this event for storage
255 fAODFMD.SetTriggerBits(triggers);
256 fAODFMD.SetSNN(fEventInspector.GetEnergy());
257 fAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
258 fAODFMD.SetCentrality(cent);
259 fAODFMD.SetNClusters(nClusters);
261 fMCAODFMD.SetTriggerBits(triggers);
262 fMCAODFMD.SetSNN(fEventInspector.GetEnergy());
263 fMCAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
264 fMCAODFMD.SetCentrality(cent);
265 fMCAODFMD.SetNClusters(nClusters);
267 //All events should be stored - HHD
268 //if (isAccepted) MarkEventForStore();
270 // Disable this check on SPD - will bias data
271 // if (found & AliFMDEventInspector::kNoSPD) isAccepted = false; // return;
272 if (found & AliFMDEventInspector::kNoFMD) isAccepted = false; // return;
273 if (found & AliFMDEventInspector::kNoVertex) isAccepted = false; // return;
276 fAODFMD.SetIpZ(ip.Z());
277 fMCAODFMD.SetIpZ(ip.Z());
279 if (found & AliFMDEventInspector::kBadVertex) isAccepted = false; // return;
281 // We we do not want to use low flux specific code, we disable it here.
282 if (!fEnableLowFlux) lowFlux = false;
287 AliESDFMD* esdFMD = esd->GetFMDData();
289 // Apply the sharing filter (or hit merging or clustering if you like)
290 if (isAccepted && !fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD,ip.Z())) {
291 AliWarning("Sharing filter failed!");
294 if (!fSharingFilter.FilterMC(*esdFMD, *mcEvent, ip.Z(),fMCESDFMD,fPrimary)) {
295 AliWarning("MC Sharing filter failed!");
298 if (!isAccepted) return; // Exit on MC event w/o trigger, vertex, data
299 // HHD if (!isAccepted) return; // Exit on MC event w/o trigger, vertex, data
301 //MarkEventForStore();
302 fSharingFilter.CompareResults(fESDFMD, fMCESDFMD);
304 // Calculate the inclusive charged particle density
305 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, lowFlux, cent, ip)) {
306 AliWarning("Density calculator failed!");
309 if (!fDensityCalculator.CalculateMC(fMCESDFMD, fMCHistos)) {
310 AliWarning("MC Density calculator failed!");
313 fDensityCalculator.CompareResults(fHistos, fMCHistos);
315 if (fEventInspector.GetCollisionSystem() == AliFMDEventInspector::kPbPb) {
316 if (!fEventPlaneFinder.FindEventplane(esd, fAODEP,
317 &(fAODFMD.GetHistogram()) , &fHistos))
318 AliWarning("Eventplane finder failed!");
321 // Do the secondary and other corrections.
322 if (!fCorrections.Correct(fHistos, ivz)) {
323 AliWarning("Corrections failed");
326 if (!fCorrections.CorrectMC(fMCHistos, ivz)) {
327 AliWarning("MC Corrections failed");
330 fCorrections.CompareResults(fHistos, fMCHistos);
332 if (!fHistCollector.Collect(fHistos, fRingSums,
333 ivz, fAODFMD.GetHistogram(),
334 fAODFMD.GetCentrality())) {
335 AliWarning("Histogram collector failed");
338 if (!fHistCollector.Collect(fMCHistos, fMCRingSums,
339 ivz, fMCAODFMD.GetHistogram())) {
340 AliWarning("MC Histogram collector failed");
344 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
345 fHData->Add(&(fAODFMD.GetHistogram()));
350 //____________________________________________________________________
352 AliForwardMCMultiplicityTask::EstimatedNdeta(const TList* input,
355 AliForwardMultiplicityBase::EstimatedNdeta(input, output);
356 MakeRingdNdeta(input, "mcRingSums", output, "mcRingResults", 24);