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 //____________________________________________________________________
51 AliForwardMultiplicityTask::AliForwardMultiplicityTask(const char* name)
52 : AliForwardMultiplicityBase(name),
58 fEventInspector("event"),
59 fSharingFilter("sharing"),
60 fDensityCalculator("density"),
61 fCorrections("corrections"),
62 fHistCollector("collector"),
71 DefineOutput(1, TList::Class());
74 //____________________________________________________________________
75 AliForwardMultiplicityTask::AliForwardMultiplicityTask(const AliForwardMultiplicityTask& o)
76 : AliForwardMultiplicityBase(o),
81 fRingSums(o.fRingSums),
82 fEventInspector(o.fEventInspector),
83 fSharingFilter(o.fSharingFilter),
84 fDensityCalculator(o.fDensityCalculator),
85 fCorrections(o.fCorrections),
86 fHistCollector(o.fHistCollector),
93 // o Object to copy from
95 DefineOutput(1, TList::Class());
98 //____________________________________________________________________
99 AliForwardMultiplicityTask&
100 AliForwardMultiplicityTask::operator=(const AliForwardMultiplicityTask& o)
103 // Assignment operator
106 // o Object to assign from
109 // Reference to this object
111 if (&o == this) return *this;
112 AliForwardMultiplicityBase::operator=(o);
115 fEventInspector = o.fEventInspector;
116 fSharingFilter = o.fSharingFilter;
117 fDensityCalculator = o.fDensityCalculator;
118 fCorrections = o.fCorrections;
119 fHistCollector = o.fHistCollector;
122 fRingSums = o.fRingSums;
128 //____________________________________________________________________
130 AliForwardMultiplicityTask::SetDebug(Int_t dbg)
138 fEventInspector.SetDebug(dbg);
139 fSharingFilter.SetDebug(dbg);
140 fDensityCalculator.SetDebug(dbg);
141 fCorrections.SetDebug(dbg);
142 fHistCollector.SetDebug(dbg);
145 //____________________________________________________________________
147 AliForwardMultiplicityTask::InitializeSubs()
150 // Initialise the sub objects and stuff. Called on first event
156 if (!ReadCorrections(pe,pv)) return;
162 fHData = static_cast<TH2D*>(fAODFMD.GetHistogram().Clone("d2Ndetadphi"));
164 fHData->SetDirectory(0);
167 TList* rings = new TList;
168 rings->SetName("ringSums");
172 rings->Add(fRingSums.Get(1, 'I'));
173 rings->Add(fRingSums.Get(2, 'I'));
174 rings->Add(fRingSums.Get(2, 'O'));
175 rings->Add(fRingSums.Get(3, 'I'));
176 rings->Add(fRingSums.Get(3, 'O'));
177 fRingSums.Get(1, 'I')->SetMarkerColor(AliForwardUtil::RingColor(1, 'I'));
178 fRingSums.Get(2, 'I')->SetMarkerColor(AliForwardUtil::RingColor(2, 'I'));
179 fRingSums.Get(2, 'O')->SetMarkerColor(AliForwardUtil::RingColor(2, 'O'));
180 fRingSums.Get(3, 'I')->SetMarkerColor(AliForwardUtil::RingColor(3, 'I'));
181 fRingSums.Get(3, 'O')->SetMarkerColor(AliForwardUtil::RingColor(3, 'O'));
183 fEventInspector.Init(*pv);
184 fSharingFilter.Init();
185 fDensityCalculator.Init(*pe);
186 fCorrections.Init(*pe);
187 fHistCollector.Init(*pv,*pe);
192 //____________________________________________________________________
194 AliForwardMultiplicityTask::UserCreateOutputObjects()
197 // Create output objects
203 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
205 dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
206 if (!ah) AliFatal("No AOD output handler set in analysis manager");
209 TObject* obj = &fAODFMD;
210 ah->AddBranch("AliAODForwardMult", &obj);
212 fEventInspector.DefineOutput(fList);
213 fSharingFilter.DefineOutput(fList);
214 fDensityCalculator.DefineOutput(fList);
215 fCorrections.DefineOutput(fList);
216 fHistCollector.DefineOutput(fList);
220 //____________________________________________________________________
222 AliForwardMultiplicityTask::UserExec(Option_t*)
225 // Process each event
231 // static Int_t cnt = 0;
233 // Get the input data
234 AliESDEvent* esd = GetESDEvent();
241 Bool_t lowFlux = kFALSE;
246 UShort_t nClusters = 0;
247 UInt_t found = fEventInspector.Process(esd, triggers, lowFlux,
248 ivz, vz, cent, nClusters);
250 if (found & AliFMDEventInspector::kNoEvent) return;
251 if (found & AliFMDEventInspector::kNoTriggers) return;
253 // Set trigger bits, and mark this event for storage
254 fAODFMD.SetTriggerBits(triggers);
255 fAODFMD.SetSNN(fEventInspector.GetEnergy());
256 fAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
257 fAODFMD.SetCentrality(cent);
258 fAODFMD.SetNClusters(nClusters);
261 if (found & AliFMDEventInspector::kNoSPD) return;
262 if (found & AliFMDEventInspector::kNoFMD) return;
263 if (found & AliFMDEventInspector::kNoVertex) return;
265 if (triggers & AliAODForwardMult::kPileUp) return;
269 if (found & AliFMDEventInspector::kBadVertex) return;
271 // We we do not want to use low flux specific code, we disable it here.
272 if (!fEnableLowFlux) lowFlux = false;
275 AliESDFMD* esdFMD = esd->GetFMDData();
276 // // Apply the sharing filter (or hit merging or clustering if you like)
277 if (!fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD)) {
278 AliWarning("Sharing filter failed!");
282 // Calculate the inclusive charged particle density
283 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, ivz, lowFlux, cent)) {
284 // if (!fDensityCalculator.Calculate(*esdFMD, fHistos, ivz, lowFlux)) {
285 AliWarning("Density calculator failed!");
289 // Do the secondary and other corrections.
290 if (!fCorrections.Correct(fHistos, ivz)) {
291 AliWarning("Corrections failed");
295 if (!fHistCollector.Collect(fHistos, fRingSums,
296 ivz, fAODFMD.GetHistogram())) {
297 AliWarning("Histogram collector failed");
301 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
302 fHData->Add(&(fAODFMD.GetHistogram()));
307 //____________________________________________________________________
309 AliForwardMultiplicityTask::Terminate(Option_t*)
318 TList* list = dynamic_cast<TList*>(GetOutputData(1));
320 AliError(Form("No output list defined (%p)", GetOutputData(1)));
321 if (GetOutputData(1)) GetOutputData(1)->Print();
325 // Get our histograms from the container
326 TH1I* hEventsTr = 0;//static_cast<TH1I*>(list->FindObject("nEventsTr"));
327 TH1I* hEventsTrVtx = 0;//static_cast<TH1I*>(list->FindObject("nEventsTrVtx"));
329 if (!fEventInspector.FetchHistograms(list, hEventsTr,
330 hEventsTrVtx, hTriggers)) {
331 AliError(Form("Didn't get histograms from event selector "
332 "(hEventsTr=%p,hEventsTrVtx=%p)",
333 hEventsTr, hEventsTrVtx));
338 TH2D* hData = static_cast<TH2D*>(list->FindObject("d2Ndetadphi"));
340 AliError(Form("Couldn't get our summed histogram from output "
341 "list %s (d2Ndetadphi=%p)", list->GetName(), hData));
346 // TH1D* dNdeta = fHData->ProjectionX("dNdeta", 0, -1, "e");
347 TH1D* dNdeta = hData->ProjectionX("dNdeta", 1, -1, "e");
348 TH1D* norm = hData->ProjectionX("norm", 0, 0, "");
349 dNdeta->SetTitle("dN_{ch}/d#eta in the forward regions");
350 dNdeta->SetYTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}");
351 dNdeta->Divide(norm);
353 dNdeta->Scale(Double_t(hEventsTrVtx->GetEntries())/hEventsTr->GetEntries(),
358 MakeRingdNdeta(list, "ringSums", list, "ringResults");
360 fSharingFilter.ScaleHistograms(list,Int_t(hEventsTr->Integral()));
361 fDensityCalculator.ScaleHistograms(list,Int_t(hEventsTrVtx->Integral()));
362 fCorrections.ScaleHistograms(list,Int_t(hEventsTrVtx->Integral()));