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 #define PRIMARY_SLOT 5
33 # define DEFINE(N,C) DefineOutput(N,C)
34 # define POST(N,O) PostData(N,O)
36 # define DEFINE(N,C) do { } while(false)
37 # define POST(N,O) do { } while(false)
40 # define MAKE_SW(NAME) do {} while(false)
41 # define START_SW(NAME) do {} while(false)
42 # define FILL_SW(NAME,WHICH) do {} while(false)
44 # define MAKE_SW(NAME) TStopwatch NAME
45 # define START_SW(NAME) if (fDoTiming) NAME.Start(true)
46 # define FILL_SW(NAME,WHICH) \
47 if (fDoTiming) fHTiming->Fill(WHICH,NAME.CpuTime())
50 //====================================================================
51 AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask()
52 : AliForwardMultiplicityBase(),
72 //____________________________________________________________________
73 AliForwardMCMultiplicityTask::AliForwardMCMultiplicityTask(const char* name)
74 : AliForwardMultiplicityBase(name),
81 fEventInspector("event"),
82 fESDFixer("esdFizer"),
83 fSharingFilter("sharing"),
84 fDensityCalculator("density"),
85 fCorrections("corrections"),
86 fHistCollector("collector"),
87 fEventPlaneFinder("eventplane")
95 fPrimary = new TH2D("primary", "MC Primaries", 1,0,1,20,0,TMath::TwoPi());
96 fPrimary->SetXTitle("#eta");
97 fPrimary->SetYTitle("#varphi [radians]");
98 fPrimary->SetZTitle("d^{2}N_{ch}/d#etad#phi");
100 fPrimary->SetStats(0);
101 fPrimary->SetDirectory(0);
102 DEFINE(MCAOD_SLOT,AliAODForwardMult::Class());
103 DEFINE(PRIM_SLOT, TH2D::Class());
106 //____________________________________________________________________
108 AliForwardMCMultiplicityTask::SetOnlyPrimary(Bool_t use)
110 fSharingFilter.GetTrackDensity().SetUseOnlyPrimary(use);
111 fCorrections.SetSecondaryForMC(!use);
114 //____________________________________________________________________
116 AliForwardMCMultiplicityTask::CreateBranches(AliAODHandler* ah)
119 // Create output objects
122 AliForwardMultiplicityBase::CreateBranches(ah);
124 TObject* mcobj = &fMCAODFMD;
125 ah->AddBranch("AliAODForwardMult", &mcobj);
126 ah->AddBranch("TH2D", &fPrimary);
129 //____________________________________________________________________
131 AliForwardMCMultiplicityTask::Book()
133 // We do this to explicitly disable the noise corrector for MC
134 GetESDFixer().SetRecoNoiseFactor(5);
136 Bool_t ret = AliForwardMultiplicityBase::Book();
137 POST(MCAOD_SLOT, &fMCAODFMD);
138 POST(PRIM_SLOT, fPrimary);
142 //____________________________________________________________________
144 AliForwardMCMultiplicityTask::InitMembers(const TAxis& eta, const TAxis& vertex)
147 // Initialise the sub objects and stuff. Called on first event
150 AliForwardMultiplicityBase::InitMembers(eta, vertex);
154 fMCRingSums.Init(eta);
156 AliForwardUtil::Histos::RebinEta(fPrimary, eta);
157 DMSG(fDebug,0,"Primary histogram rebinned to %d,%f,%f eta axis %d,%f,%f",
158 fPrimary->GetXaxis()->GetNbins(),
159 fPrimary->GetXaxis()->GetXmin(),
160 fPrimary->GetXaxis()->GetXmax(),
166 TList* mcRings = new TList;
167 mcRings->SetName("mcRingSums");
171 mcRings->Add(fMCRingSums.Get(1, 'I'));
172 mcRings->Add(fMCRingSums.Get(2, 'I'));
173 mcRings->Add(fMCRingSums.Get(2, 'O'));
174 mcRings->Add(fMCRingSums.Get(3, 'I'));
175 mcRings->Add(fMCRingSums.Get(3, 'O'));
176 fMCRingSums.Get(1, 'I')->SetMarkerColor(AliForwardUtil::RingColor(1, 'I'));
177 fMCRingSums.Get(2, 'I')->SetMarkerColor(AliForwardUtil::RingColor(2, 'I'));
178 fMCRingSums.Get(2, 'O')->SetMarkerColor(AliForwardUtil::RingColor(2, 'O'));
179 fMCRingSums.Get(3, 'I')->SetMarkerColor(AliForwardUtil::RingColor(3, 'I'));
180 fMCRingSums.Get(3, 'O')->SetMarkerColor(AliForwardUtil::RingColor(3, 'O'));
183 //____________________________________________________________________
185 AliForwardMCMultiplicityTask::PreEvent()
188 fEventInspector.ReadProductionDetails(MCEvent());
200 //____________________________________________________________________
202 AliForwardMCMultiplicityTask::Event(AliESDEvent& esd)
205 // Process each event
213 START_SW(individual);
215 // Read production details
217 // Get the input data
218 AliMCEvent* mcEvent = MCEvent();
219 if (!mcEvent) return false;
221 Bool_t lowFlux = kFALSE;
224 TVector3 ip(1024, 1024, 0);
226 UShort_t nClusters = 0;
227 UInt_t found = fEventInspector.Process(&esd, triggers, lowFlux,
228 ivz, ip, cent, nClusters);
237 fEventInspector.ProcessMC(mcEvent, triggers, ivzMC, vzMC, b, cMC,
239 fEventInspector.CompareResults(ip.Z(), vzMC, cent, cMC, b, npart, nbin);
240 FILL_SW(individual,kTimingEventInspector);
245 Bool_t isAccepted = true;
246 if (found & AliFMDEventInspector::kNoEvent) {
251 if (found & AliFMDEventInspector::kNoTriggers) {
256 //MarkEventForStore();
257 // Always set the B trigger - each MC event _is_ a collision
258 triggers |= AliAODForwardMult::kB;
259 // Set trigger bits, and mark this event for storage
260 fAODFMD.SetTriggerBits(triggers);
261 fAODFMD.SetSNN(fEventInspector.GetEnergy());
262 fAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
263 fAODFMD.SetCentrality(cent);
264 fAODFMD.SetNClusters(nClusters);
266 fMCAODFMD.SetTriggerBits(triggers);
267 fMCAODFMD.SetSNN(fEventInspector.GetEnergy());
268 fMCAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
269 fMCAODFMD.SetCentrality(cent);
270 fMCAODFMD.SetNClusters(nClusters);
272 // Disable this check on SPD - will bias data
273 // if (found & AliFMDEventInspector::kNoSPD) isAccepted = false; // return;
274 if (found & AliFMDEventInspector::kNoFMD) {
279 if (found & AliFMDEventInspector::kNoVertex) {
286 fAODFMD.SetIpZ(ip.Z());
287 fMCAODFMD.SetIpZ(ip.Z());
289 if (found & AliFMDEventInspector::kBadVertex) isAccepted = false; // return;
291 // We we do not want to use low flux specific code, we disable it here.
292 if (!fEnableLowFlux) lowFlux = false;
297 AliESDFMD* esdFMD = esd.GetFMDData();
299 // Fix up the the ESD
300 GetESDFixer().Fix(*esdFMD, ip.Z());
302 // Apply the sharing filter (or hit merging or clustering if you like)
303 START_SW(individual);
304 if (isAccepted && !fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD,ip.Z())){
305 AliWarning("Sharing filter failed!");
309 if (!fSharingFilter.FilterMC(*esdFMD, *mcEvent, ip.Z(),fMCESDFMD,fPrimary)){
310 AliWarning("MC Sharing filter failed!");
315 // Store some MC parameters in corners of histogram :-)
316 fPrimary->SetBinContent(0, 0, vzMC);
317 fPrimary->SetBinContent(fPrimary->GetNbinsX()+1,0, phiR);
318 fPrimary->SetBinContent(fPrimary->GetNbinsX()+1,fPrimary->GetNbinsY(),cMC);
322 // Exit on MC event w/o trigger, vertex, data - since there's no more
324 FILL_SW(individual,kTimingSharingFilter);
328 //MarkEventForStore();
329 fSharingFilter.CompareResults(fESDFMD, fMCESDFMD);
330 FILL_SW(individual,kTimingSharingFilter);
333 // Calculate the inclusive charged particle density
334 START_SW(individual);
335 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, lowFlux, cent, ip)) {
336 AliWarning("Density calculator failed!");
340 if (!fDensityCalculator.CalculateMC(fMCESDFMD, fMCHistos)) {
341 AliWarning("MC Density calculator failed!");
345 fDensityCalculator.CompareResults(fHistos, fMCHistos);
346 FILL_SW(individual,kTimingDensityCalculator);
348 if (fEventInspector.GetCollisionSystem() == AliFMDEventInspector::kPbPb) {
349 START_SW(individual);
350 if (!fEventPlaneFinder.FindEventplane(&esd, fAODEP,
351 &(fAODFMD.GetHistogram()), &fHistos)){
352 AliWarning("Eventplane finder failed!");
355 FILL_SW(individual,kTimingEventPlaneFinder);
358 // Do the secondary and other corrections.
359 START_SW(individual);
360 if (!fCorrections.Correct(fHistos, ivz)) {
361 AliWarning("Corrections failed");
365 if (!fCorrections.CorrectMC(fMCHistos, ivz)) {
366 AliWarning("MC Corrections failed");
370 fCorrections.CompareResults(fHistos, fMCHistos);
371 FILL_SW(individual,kTimingCorrections);
373 // Collect our 'super' histogram
374 Bool_t add = fAODFMD.IsTriggerBits(AliAODForwardMult::kInel);
375 START_SW(individual);
376 if (!fHistCollector.Collect(fHistos,
379 fAODFMD.GetHistogram(),
380 fAODFMD.GetCentrality(),
383 AliWarning("Histogram collector failed");
387 if (!fHistCollector.Collect(fMCHistos,
390 fMCAODFMD.GetHistogram(),
394 AliWarning("MC Histogram collector failed");
398 FILL_SW(individual,kTimingHistCollector);
400 // Copy underflow bins to overflow bins - always full phi coverage
401 TH2& hMC = fMCAODFMD.GetHistogram();
402 Int_t nEta = hMC.GetNbinsX();
403 Int_t nY = hMC.GetNbinsY();
404 for (Int_t iEta = 1; iEta <= nEta; iEta++) {
405 hMC.SetBinContent(iEta, nY+1, hMC.GetBinContent(iEta, 0));
410 fHData->Add(&(fAODFMD.GetHistogram()));
416 FILL_SW(total,kTimingTotal);
421 //____________________________________________________________________
423 AliForwardMCMultiplicityTask::PostEvent()
425 Bool_t ret = AliForwardMultiplicityBase::PostEvent();
426 POST(MCAOD_SLOT, &fMCAODFMD);
427 POST(PRIMARY_SLOT, fPrimary);
431 //____________________________________________________________________
433 AliForwardMCMultiplicityTask::EstimatedNdeta(const TList* input,
436 AliForwardMultiplicityBase::EstimatedNdeta(input, output);
437 MakeRingdNdeta(input, "mcRingSums", output, "mcRingResults", 24);