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(),
49 //____________________________________________________________________
50 AliForwardMultiplicityTask::AliForwardMultiplicityTask(const char* name)
51 : AliForwardMultiplicityBase(name),
56 fEventInspector("event"),
57 fSharingFilter("sharing"),
58 fDensityCalculator("density"),
59 fCorrections("corrections"),
60 fHistCollector("collector"),
69 DefineOutput(1, TList::Class());
72 //____________________________________________________________________
73 AliForwardMultiplicityTask::AliForwardMultiplicityTask(const AliForwardMultiplicityTask& o)
74 : AliForwardMultiplicityBase(o),
79 fEventInspector(o.fEventInspector),
80 fSharingFilter(o.fSharingFilter),
81 fDensityCalculator(o.fDensityCalculator),
82 fCorrections(o.fCorrections),
83 fHistCollector(o.fHistCollector),
90 // o Object to copy from
92 DefineOutput(1, TList::Class());
95 //____________________________________________________________________
96 AliForwardMultiplicityTask&
97 AliForwardMultiplicityTask::operator=(const AliForwardMultiplicityTask& o)
100 // Assignment operator
103 // o Object to assign from
106 // Reference to this object
108 AliForwardMultiplicityBase::operator=(o);
111 fEventInspector = o.fEventInspector;
112 fSharingFilter = o.fSharingFilter;
113 fDensityCalculator = o.fDensityCalculator;
114 fCorrections = o.fCorrections;
115 fHistCollector = o.fHistCollector;
123 //____________________________________________________________________
125 AliForwardMultiplicityTask::SetDebug(Int_t dbg)
133 fEventInspector.SetDebug(dbg);
134 fSharingFilter.SetDebug(dbg);
135 fDensityCalculator.SetDebug(dbg);
136 fCorrections.SetDebug(dbg);
137 fHistCollector.SetDebug(dbg);
140 //____________________________________________________________________
142 AliForwardMultiplicityTask::InitializeSubs()
145 // Initialise the sub objects and stuff. Called on first event
151 if (!ReadCorrections(pe,pv)) return;
156 fHData = static_cast<TH2D*>(fAODFMD.GetHistogram().Clone("d2Ndetadphi"));
158 fHData->SetDirectory(0);
161 fEventInspector.Init(*pv);
162 fDensityCalculator.Init(*pe);
163 fCorrections.Init(*pe);
164 fHistCollector.Init(*pv,*pe);
169 //____________________________________________________________________
171 AliForwardMultiplicityTask::UserCreateOutputObjects()
174 // Create output objects
180 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
182 dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
183 if (!ah) AliFatal("No AOD output handler set in analysis manager");
186 TObject* obj = &fAODFMD;
187 ah->AddBranch("AliAODForwardMult", &obj);
189 fEventInspector.DefineOutput(fList);
190 fSharingFilter.DefineOutput(fList);
191 fDensityCalculator.DefineOutput(fList);
192 fCorrections.DefineOutput(fList);
193 fHistCollector.DefineOutput(fList);
197 //____________________________________________________________________
199 AliForwardMultiplicityTask::UserExec(Option_t*)
202 // Process each event
208 // static Int_t cnt = 0;
210 // Get the input data
211 AliESDEvent* esd = GetESDEvent();
218 Bool_t lowFlux = kFALSE;
223 UInt_t found = fEventInspector.Process(esd, triggers, lowFlux,
226 if (found & AliFMDEventInspector::kNoEvent) return;
227 if (found & AliFMDEventInspector::kNoTriggers) return;
229 // Set trigger bits, and mark this event for storage
230 fAODFMD.SetTriggerBits(triggers);
231 fAODFMD.SetSNN(fEventInspector.GetEnergy());
232 fAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
233 fAODFMD.SetCentrality(cent);
236 if (found & AliFMDEventInspector::kNoSPD) return;
237 if (found & AliFMDEventInspector::kNoFMD) return;
238 if (found & AliFMDEventInspector::kNoVertex) return;
240 if (triggers & AliAODForwardMult::kPileUp) return;
244 if (found & AliFMDEventInspector::kBadVertex) return;
246 // We we do not want to use low flux specific code, we disable it here.
247 if (!fEnableLowFlux) lowFlux = false;
250 AliESDFMD* esdFMD = esd->GetFMDData();
251 // // Apply the sharing filter (or hit merging or clustering if you like)
252 if (!fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD)) {
253 AliWarning("Sharing filter failed!");
257 // Calculate the inclusive charged particle density
258 //if (!fDensityCalculator.Calculate(fESDFMD, fHistos, ivz, lowFlux)) {
259 if (!fDensityCalculator.Calculate(*esdFMD, fHistos, ivz, lowFlux)) {
260 AliWarning("Density calculator failed!");
264 // Do the secondary and other corrections.
265 if (!fCorrections.Correct(fHistos, ivz)) {
266 AliWarning("Corrections failed");
270 if (!fHistCollector.Collect(fHistos, ivz, fAODFMD.GetHistogram())) {
271 AliWarning("Histogram collector failed");
275 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
276 fHData->Add(&(fAODFMD.GetHistogram()));
281 //____________________________________________________________________
283 AliForwardMultiplicityTask::Terminate(Option_t*)
292 TList* list = dynamic_cast<TList*>(GetOutputData(1));
294 AliError(Form("No output list defined (%p)", GetOutputData(1)));
295 if (GetOutputData(1)) GetOutputData(1)->Print();
299 // Get our histograms from the container
300 TH1I* hEventsTr = 0;//static_cast<TH1I*>(list->FindObject("nEventsTr"));
301 TH1I* hEventsTrVtx = 0;//static_cast<TH1I*>(list->FindObject("nEventsTrVtx"));
303 if (!fEventInspector.FetchHistograms(list, hEventsTr,
304 hEventsTrVtx, hTriggers)) {
305 AliError(Form("Didn't get histograms from event selector "
306 "(hEventsTr=%p,hEventsTrVtx=%p)",
307 hEventsTr, hEventsTrVtx));
312 TH2D* hData = static_cast<TH2D*>(list->FindObject("d2Ndetadphi"));
314 AliError(Form("Couldn't get our summed histogram from output "
315 "list %s (d2Ndetadphi=%p)", list->GetName(), hData));
320 // TH1D* dNdeta = fHData->ProjectionX("dNdeta", 0, -1, "e");
321 TH1D* dNdeta = hData->ProjectionX("dNdeta", 1, -1, "e");
322 TH1D* norm = hData->ProjectionX("norm", 0, 0, "");
323 dNdeta->SetTitle("dN_{ch}/d#eta in the forward regions");
324 dNdeta->SetYTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}");
325 dNdeta->Divide(norm);
327 dNdeta->Scale(Double_t(hEventsTrVtx->GetEntries())/hEventsTr->GetEntries(),
332 fSharingFilter.ScaleHistograms(list,Int_t(hEventsTr->Integral()));
333 fDensityCalculator.ScaleHistograms(list,Int_t(hEventsTrVtx->Integral()));
334 fCorrections.ScaleHistograms(list,Int_t(hEventsTrVtx->Integral()));