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 //____________________________________________________________________
78 AliForwardMCMultiplicityTask::SetOnlyPrimary(Bool_t use)
80 fSharingFilter.GetTrackDensity().SetUseOnlyPrimary(use);
81 fCorrections.SetSecondaryForMC(!use);
84 //____________________________________________________________________
86 AliForwardMCMultiplicityTask::CreateBranches(AliAODHandler* ah)
89 // Create output objects
92 AliForwardMultiplicityBase::CreateBranches(ah);
94 TObject* mcobj = &fMCAODFMD;
95 ah->AddBranch("AliAODForwardMult", &mcobj);
97 fPrimary = new TH2D("primary", "MC Primaries", 1,0,1,20,0,TMath::TwoPi());
98 fPrimary->SetXTitle("#eta");
99 fPrimary->SetYTitle("#varphi [radians]");
100 fPrimary->SetZTitle("d^{2}N_{ch}/d#etad#phi");
102 fPrimary->SetStats(0);
103 fPrimary->SetDirectory(0);
105 ah->AddBranch("TH2D", &fPrimary);
109 //____________________________________________________________________
111 AliForwardMCMultiplicityTask::InitMembers(const TAxis& eta, const TAxis& vertex)
114 // Initialise the sub objects and stuff. Called on first event
117 AliForwardMultiplicityBase::InitMembers(eta, vertex);
121 fMCRingSums.Init(eta);
123 AliForwardUtil::Histos::RebinEta(fPrimary, eta);
124 DMSG(fDebug,0,"Primary histogram rebinned to %d,%f,%f eta axis %d,%f,%f",
125 fPrimary->GetXaxis()->GetNbins(),
126 fPrimary->GetXaxis()->GetXmin(),
127 fPrimary->GetXaxis()->GetXmax(),
133 TList* mcRings = new TList;
134 mcRings->SetName("mcRingSums");
138 mcRings->Add(fMCRingSums.Get(1, 'I'));
139 mcRings->Add(fMCRingSums.Get(2, 'I'));
140 mcRings->Add(fMCRingSums.Get(2, 'O'));
141 mcRings->Add(fMCRingSums.Get(3, 'I'));
142 mcRings->Add(fMCRingSums.Get(3, 'O'));
143 fMCRingSums.Get(1, 'I')->SetMarkerColor(AliForwardUtil::RingColor(1, 'I'));
144 fMCRingSums.Get(2, 'I')->SetMarkerColor(AliForwardUtil::RingColor(2, 'I'));
145 fMCRingSums.Get(2, 'O')->SetMarkerColor(AliForwardUtil::RingColor(2, 'O'));
146 fMCRingSums.Get(3, 'I')->SetMarkerColor(AliForwardUtil::RingColor(3, 'I'));
147 fMCRingSums.Get(3, 'O')->SetMarkerColor(AliForwardUtil::RingColor(3, 'O'));
150 //____________________________________________________________________
152 AliForwardMCMultiplicityTask::PreEvent()
155 fEventInspector.ReadProductionDetails(MCEvent());
167 //____________________________________________________________________
169 AliForwardMCMultiplicityTask::Event(AliESDEvent& esd)
172 // Process each event
178 // Read production details
180 // Get the input data
181 AliMCEvent* mcEvent = MCEvent();
182 if (!mcEvent) return false;
184 Bool_t lowFlux = kFALSE;
187 TVector3 ip(1024, 1024, 0);
189 UShort_t nClusters = 0;
190 UInt_t found = fEventInspector.Process(&esd, triggers, lowFlux,
191 ivz, ip, cent, nClusters);
200 fEventInspector.ProcessMC(mcEvent, triggers, ivzMC, vzMC, b, cMC,
202 fEventInspector.CompareResults(ip.Z(), vzMC, cent, cMC, b, npart, nbin);
207 Bool_t isAccepted = true;
208 if (found & AliFMDEventInspector::kNoEvent) isAccepted = false; // return;
209 if (found & AliFMDEventInspector::kNoTriggers) isAccepted = false; // return;
210 //MarkEventForStore();
211 // Always set the B trigger - each MC event _is_ a collision
212 triggers |= AliAODForwardMult::kB;
213 // Set trigger bits, and mark this event for storage
214 fAODFMD.SetTriggerBits(triggers);
215 fAODFMD.SetSNN(fEventInspector.GetEnergy());
216 fAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
217 fAODFMD.SetCentrality(cent);
218 fAODFMD.SetNClusters(nClusters);
220 fMCAODFMD.SetTriggerBits(triggers);
221 fMCAODFMD.SetSNN(fEventInspector.GetEnergy());
222 fMCAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
223 fMCAODFMD.SetCentrality(cent);
224 fMCAODFMD.SetNClusters(nClusters);
226 // Disable this check on SPD - will bias data
227 // if (found & AliFMDEventInspector::kNoSPD) isAccepted = false; // return;
228 if (found & AliFMDEventInspector::kNoFMD) isAccepted = false; // return;
229 if (found & AliFMDEventInspector::kNoVertex) isAccepted = false; // return;
232 fAODFMD.SetIpZ(ip.Z());
233 fMCAODFMD.SetIpZ(ip.Z());
235 if (found & AliFMDEventInspector::kBadVertex) isAccepted = false; // return;
237 // We we do not want to use low flux specific code, we disable it here.
238 if (!fEnableLowFlux) lowFlux = false;
243 AliESDFMD* esdFMD = esd.GetFMDData();
245 // Apply the sharing filter (or hit merging or clustering if you like)
246 if (isAccepted && !fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD,ip.Z())){
247 AliWarning("Sharing filter failed!");
250 if (!fSharingFilter.FilterMC(*esdFMD, *mcEvent, ip.Z(),fMCESDFMD,fPrimary)){
251 AliWarning("MC Sharing filter failed!");
255 // Store some MC parameters in corners of histogram :-)
256 fPrimary->SetBinContent(0, 0, vzMC);
257 fPrimary->SetBinContent(fPrimary->GetNbinsX()+1,0, phiR);
258 fPrimary->SetBinContent(fPrimary->GetNbinsX()+1,fPrimary->GetNbinsY(),cMC);
262 // Exit on MC event w/o trigger, vertex, data - since there's no more
266 //MarkEventForStore();
267 fSharingFilter.CompareResults(fESDFMD, fMCESDFMD);
269 // Calculate the inclusive charged particle density
270 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, lowFlux, cent, ip)) {
271 AliWarning("Density calculator failed!");
274 if (!fDensityCalculator.CalculateMC(fMCESDFMD, fMCHistos)) {
275 AliWarning("MC Density calculator failed!");
278 fDensityCalculator.CompareResults(fHistos, fMCHistos);
280 if (fEventInspector.GetCollisionSystem() == AliFMDEventInspector::kPbPb) {
281 if (!fEventPlaneFinder.FindEventplane(&esd, fAODEP,
282 &(fAODFMD.GetHistogram()), &fHistos))
283 AliWarning("Eventplane finder failed!");
286 // Do the secondary and other corrections.
287 if (!fCorrections.Correct(fHistos, ivz)) {
288 AliWarning("Corrections failed");
291 if (!fCorrections.CorrectMC(fMCHistos, ivz)) {
292 AliWarning("MC Corrections failed");
295 fCorrections.CompareResults(fHistos, fMCHistos);
297 if (!fHistCollector.Collect(fHistos, fRingSums,
298 ivz, fAODFMD.GetHistogram(),
299 fAODFMD.GetCentrality())) {
300 AliWarning("Histogram collector failed");
303 if (!fHistCollector.Collect(fMCHistos, fMCRingSums,
304 ivz, fMCAODFMD.GetHistogram(), -1, true)) {
305 AliWarning("MC Histogram collector failed");
309 // Copy underflow bins to overflow bins - always full phi coverage
310 TH2& hMC = fMCAODFMD.GetHistogram();
311 Int_t nEta = hMC.GetNbinsX();
312 Int_t nY = hMC.GetNbinsY();
313 for (Int_t iEta = 1; iEta <= nEta; iEta++) {
314 hMC.SetBinContent(iEta, nY+1, hMC.GetBinContent(iEta, 0));
318 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
319 fHData->Add(&(fAODFMD.GetHistogram()));
324 //____________________________________________________________________
326 AliForwardMCMultiplicityTask::EstimatedNdeta(const TList* input,
329 AliForwardMultiplicityBase::EstimatedNdeta(input, output);
330 MakeRingdNdeta(input, "mcRingSums", output, "mcRingResults", 24);