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>
31 //====================================================================
32 AliForwardMultiplicityTask::AliForwardMultiplicityTask()
33 : AliForwardMultiplicityBase(),
51 //____________________________________________________________________
52 AliForwardMultiplicityTask::AliForwardMultiplicityTask(const char* name)
53 : AliForwardMultiplicityBase(name),
58 fEventInspector("event"),
59 fEnergyFitter("energy"),
60 fSharingFilter("sharing"),
61 fDensityCalculator("density"),
62 fCorrections("corrections"),
63 fHistCollector("collector"),
72 DefineOutput(1, TList::Class());
75 //____________________________________________________________________
76 AliForwardMultiplicityTask::AliForwardMultiplicityTask(const AliForwardMultiplicityTask& o)
77 : AliForwardMultiplicityBase(o),
82 fEventInspector(o.fEventInspector),
83 fEnergyFitter(o.fEnergyFitter),
84 fSharingFilter(o.fSharingFilter),
85 fDensityCalculator(o.fDensityCalculator),
86 fCorrections(o.fCorrections),
87 fHistCollector(o.fHistCollector),
94 // o Object to copy from
96 DefineOutput(1, TList::Class());
99 //____________________________________________________________________
100 AliForwardMultiplicityTask&
101 AliForwardMultiplicityTask::operator=(const AliForwardMultiplicityTask& o)
104 // Assignment operator
107 // o Object to assign from
110 // Reference to this object
112 AliForwardMultiplicityBase::operator=(o);
115 fEventInspector = o.fEventInspector;
116 fEnergyFitter = o.fEnergyFitter;
117 fSharingFilter = o.fSharingFilter;
118 fDensityCalculator = o.fDensityCalculator;
119 fCorrections = o.fCorrections;
120 fHistCollector = o.fHistCollector;
128 //____________________________________________________________________
130 AliForwardMultiplicityTask::SetDebug(Int_t dbg)
138 fEventInspector.SetDebug(dbg);
139 fEnergyFitter.SetDebug(dbg);
140 fSharingFilter.SetDebug(dbg);
141 fDensityCalculator.SetDebug(dbg);
142 fCorrections.SetDebug(dbg);
143 fHistCollector.SetDebug(dbg);
146 //____________________________________________________________________
148 AliForwardMultiplicityTask::InitializeSubs()
151 // Initialise the sub objects and stuff. Called on first event
154 UInt_t what = AliForwardCorrectionManager::kAll;
156 what ^= AliForwardCorrectionManager::kDoubleHit;
157 if (!fCorrections.IsUseMergingEfficiency())
158 what ^= AliForwardCorrectionManager::kMergingEfficiency;
160 AliForwardCorrectionManager& fcm = AliForwardCorrectionManager::Instance();
161 fcm.Init(fEventInspector.GetCollisionSystem(),
162 fEventInspector.GetEnergy(),
163 fEventInspector.GetField(),
166 if (!CheckCorrections(what)) return;
169 const TAxis* pe = fcm.GetEtaAxis();
170 const TAxis* pv = fcm.GetVertexAxis();
171 if (!pe) AliFatal("No eta axis defined");
172 if (!pv) AliFatal("No vertex axis defined");
177 fHData = static_cast<TH2D*>(fAODFMD.GetHistogram().Clone("d2Ndetadphi"));
179 fHData->SetDirectory(0);
182 fEnergyFitter.Init(*pe);
183 fEventInspector.Init(*pv);
184 fDensityCalculator.Init(*pe);
185 fHistCollector.Init(*pv);
190 //____________________________________________________________________
192 AliForwardMultiplicityTask::UserCreateOutputObjects()
195 // Create output objects
200 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
202 dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
203 if (!ah) AliFatal("No AOD output handler set in analysis manager");
206 TObject* obj = &fAODFMD;
207 ah->AddBranch("AliAODForwardMult", &obj);
209 fEventInspector.DefineOutput(fList);
210 fEnergyFitter.DefineOutput(fList);
211 fSharingFilter.DefineOutput(fList);
212 fDensityCalculator.DefineOutput(fList);
213 fCorrections.DefineOutput(fList);
217 //____________________________________________________________________
219 AliForwardMultiplicityTask::UserExec(Option_t*)
222 // Process each event
228 // static Int_t cnt = 0;
230 // Get the input data
231 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
232 // AliInfo(Form("Event # %6d (esd=%p)", cnt, esd));
234 AliWarning("No ESD event found for input event");
238 // On the first event, initialize the parameters
239 if (fFirstEvent && esd->GetESDRun()) {
240 fEventInspector.ReadRunDetails(esd);
242 AliInfo(Form("Initializing with parameters from the ESD:\n"
243 " AliESDEvent::GetBeamEnergy() ->%f\n"
244 " AliESDEvent::GetBeamType() ->%s\n"
245 " AliESDEvent::GetCurrentL3() ->%f\n"
246 " AliESDEvent::GetMagneticField()->%f\n"
247 " AliESDEvent::GetRunNumber() ->%d\n",
248 esd->GetBeamEnergy(),
251 esd->GetMagneticField(),
252 esd->GetRunNumber()));
263 Bool_t lowFlux = kFALSE;
267 UInt_t found = fEventInspector.Process(esd, triggers, lowFlux, ivz, vz);
268 if (found & AliFMDEventInspector::kNoEvent) return;
269 if (found & AliFMDEventInspector::kNoTriggers) return;
271 // Set trigger bits, and mark this event for storage
272 fAODFMD.SetTriggerBits(triggers);
275 if (found & AliFMDEventInspector::kNoSPD) return;
276 if (found & AliFMDEventInspector::kNoFMD) return;
277 if (found & AliFMDEventInspector::kNoVertex) return;
280 if (found & AliFMDEventInspector::kBadVertex) return;
282 // We we do not want to use low flux specific code, we disable it here.
283 if (!fEnableLowFlux) lowFlux = false;
286 AliESDFMD* esdFMD = esd->GetFMDData();
287 // Apply the sharing filter (or hit merging or clustering if you like)
288 if (!fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD)) {
289 AliWarning("Sharing filter failed!");
293 // Do the energy stuff
294 if (!fEnergyFitter.Accumulate(*esdFMD, triggers & AliAODForwardMult::kEmpty)){
295 AliWarning("Energy fitter failed");
299 // Calculate the inclusive charged particle density
300 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, ivz, lowFlux)) {
301 AliWarning("Density calculator failed!");
305 // Do the secondary and other corrections.
306 if (!fCorrections.Correct(fHistos, ivz)) {
307 AliWarning("Corrections failed");
311 if (!fHistCollector.Collect(fHistos, ivz, fAODFMD.GetHistogram())) {
312 AliWarning("Histogram collector failed");
316 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
317 fHData->Add(&(fAODFMD.GetHistogram()));
322 //____________________________________________________________________
324 AliForwardMultiplicityTask::Terminate(Option_t*)
333 TList* list = dynamic_cast<TList*>(GetOutputData(1));
335 AliError(Form("No output list defined (%p)", GetOutputData(1)));
336 if (GetOutputData(1)) GetOutputData(1)->Print();
340 // Get our histograms from the container
341 TH1I* hEventsTr = 0;//static_cast<TH1I*>(list->FindObject("nEventsTr"));
342 TH1I* hEventsTrVtx = 0;//static_cast<TH1I*>(list->FindObject("nEventsTrVtx"));
344 if (!fEventInspector.FetchHistograms(list, hEventsTr,
345 hEventsTrVtx, hTriggers)) {
346 AliError(Form("Didn't get histograms from event selector "
347 "(hEventsTr=%p,hEventsTrVtx=%p)",
348 hEventsTr, hEventsTrVtx));
353 TH2D* hData = static_cast<TH2D*>(list->FindObject("d2Ndetadphi"));
355 AliError(Form("Couldn't get our summed histogram from output "
356 "list %s (d2Ndetadphi=%p)", list->GetName(), hData));
361 // TH1D* dNdeta = fHData->ProjectionX("dNdeta", 0, -1, "e");
362 TH1D* dNdeta = hData->ProjectionX("dNdeta", 1, -1, "e");
363 TH1D* norm = hData->ProjectionX("norm", 0, 1, "");
364 dNdeta->SetTitle("dN_{ch}/d#eta in the forward regions");
365 dNdeta->SetYTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}");
366 dNdeta->Divide(norm);
368 dNdeta->Scale(Double_t(hEventsTrVtx->GetEntries())/hEventsTr->GetEntries(),
373 fEnergyFitter.Fit(list);
374 fSharingFilter.ScaleHistograms(list,hEventsTr->Integral());
375 fDensityCalculator.ScaleHistograms(list,hEventsTrVtx->Integral());
376 fCorrections.ScaleHistograms(list,hEventsTrVtx->Integral());