1 #include "AliForwardMultiplicity.h"
2 #include "AliTriggerAnalysis.h"
3 #include "AliPhysicsSelection.h"
5 #include "AliFMDAnaParameters.h"
6 #include "AliESDEvent.h"
7 #include "AliAODHandler.h"
8 #include "AliMultiplicity.h"
9 #include "AliInputEventHandler.h"
11 #include <TDirectory.h>
14 //====================================================================
15 AliForwardMultiplicity::AliForwardMultiplicity()
16 : AliAnalysisTaskSE(),
32 //____________________________________________________________________
33 AliForwardMultiplicity::AliForwardMultiplicity(const char* name)
34 : AliAnalysisTaskSE(name),
40 fEventInspector("event"),
41 fEnergyFitter("energy"),
42 fSharingFilter("sharing"),
43 fDensityCalculator("density"),
44 fCorrections("corrections"),
45 fHistCollector("collector"),
48 DefineOutput(1, TList::Class());
51 //____________________________________________________________________
52 AliForwardMultiplicity::AliForwardMultiplicity(const AliForwardMultiplicity& o)
53 : AliAnalysisTaskSE(o),
59 fEventInspector(o.fEventInspector),
60 fEnergyFitter(o.fEnergyFitter),
61 fSharingFilter(o.fSharingFilter),
62 fDensityCalculator(o.fDensityCalculator),
63 fCorrections(o.fCorrections),
64 fHistCollector(o.fHistCollector),
69 //____________________________________________________________________
70 AliForwardMultiplicity&
71 AliForwardMultiplicity::operator=(const AliForwardMultiplicity& o)
73 AliAnalysisTaskSE::operator=(o);
76 fFirstEvent = o.fFirstEvent;
77 fEventInspector = o.fEventInspector;
78 fEnergyFitter = o.fEnergyFitter;
79 fSharingFilter = o.fSharingFilter;
80 fDensityCalculator = o.fDensityCalculator;
81 fCorrections = o.fCorrections;
82 fHistCollector = o.fHistCollector;
90 //____________________________________________________________________
92 AliForwardMultiplicity::SetDebug(Int_t dbg)
94 fEventInspector.SetDebug(dbg);
95 fEnergyFitter.SetDebug(dbg);
96 fSharingFilter.SetDebug(dbg);
97 fDensityCalculator.SetDebug(dbg);
98 fCorrections.SetDebug(dbg);
99 fHistCollector.SetDebug(dbg);
102 //____________________________________________________________________
104 AliForwardMultiplicity::Init()
109 //____________________________________________________________________
111 AliForwardMultiplicity::InitializeSubs()
113 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
117 TAxis e(pars->GetNetaBins(), pars->GetEtaMin(), pars->GetEtaMax());
118 TAxis v(pars->GetNvtxBins(), -pars->GetVtxCutZ(), pars->GetVtxCutZ());
123 fHData = static_cast<TH2D*>(fAODFMD.GetHistogram().Clone("d2Ndetadphi"));
125 fHData->SetDirectory(0);
128 fEnergyFitter.Init(e);
129 fEventInspector.Init(v);
130 fHistCollector.Init(v);
133 //____________________________________________________________________
135 AliForwardMultiplicity::UserCreateOutputObjects()
139 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
140 AliAODHandler* ah = dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
141 if (!ah) AliFatal("No AOD output handler set in analysis manager");
144 TObject* obj = &fAODFMD;
145 ah->AddBranch("AliAODForwardMult", &obj);
147 fEventInspector.DefineOutput(fList);
148 fEnergyFitter.DefineOutput(fList);
149 fSharingFilter.DefineOutput(fList);
150 fDensityCalculator.DefineOutput(fList);
151 fCorrections.DefineOutput(fList);
153 //____________________________________________________________________
155 AliForwardMultiplicity::UserExec(Option_t*)
157 // Get the input data
158 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(InputEvent());
160 AliWarning("No ESD event found for input event");
164 // On the first event, initialize the parameters
165 if (fFirstEvent && esd->GetESDRun()) {
166 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
167 AliInfo(Form("Initializing with parameters from the ESD:\n"
168 " AliESDEvent::GetBeamEnergy() ->%f\n"
169 " AliESDEvent::GetBeamType() ->%s\n"
170 " AliESDEvent::GetCurrentL3() ->%f\n"
171 " AliESDEvent::GetMagneticField()->%f\n"
172 " AliESDEvent::GetRunNumber() ->%d\n",
173 esd->GetBeamEnergy(),
176 esd->GetMagneticField(),
177 esd->GetRunNumber()));
178 pars->SetParametersFromESD(esd);
189 Bool_t lowFlux = kFALSE;
193 UInt_t found = fEventInspector.Process(esd, triggers, lowFlux, ivz, vz);
194 if (found & AliFMDEventInspector::kNoEvent) return;
195 if (found & AliFMDEventInspector::kNoTriggers) return;
197 // Set trigger bits, and mark this event for storage
198 fAODFMD.SetTriggerBits(triggers);
201 if (found & AliFMDEventInspector::kNoSPD) return;
202 if (found & AliFMDEventInspector::kNoFMD) return;
203 if (found & AliFMDEventInspector::kNoVertex) return;
206 if (found & AliFMDEventInspector::kBadVertex) return;
209 AliESDFMD* esdFMD = esd->GetFMDData();
210 // Apply the sharing filter (or hit merging or clustering if you like)
211 if (!fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD)) {
212 AliWarning("Sharing filter failed!");
216 // Do the energy stuff
217 if (!fEnergyFitter.Accumulate(*esdFMD, triggers & AliAODForwardMult::kEmpty)){
218 AliWarning("Energy fitter failed");
222 // Calculate the inclusive charged particle density
223 if (!fDensityCalculator.Calculate(fESDFMD, fHistos, ivz, lowFlux)) {
224 AliWarning("Density calculator failed!");
228 // Do the secondary and other corrections.
229 if (!fCorrections.Correct(fHistos, ivz)) {
230 AliWarning("Corrections failed");
234 if (!fHistCollector.Collect(fHistos, ivz, fAODFMD.GetHistogram())) {
235 AliWarning("Histogram collector failed");
239 if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
240 fHData->Add(&(fAODFMD.GetHistogram()));
245 //____________________________________________________________________
247 AliForwardMultiplicity::Terminate(Option_t*)
249 TList* list = dynamic_cast<TList*>(GetOutputData(1));
251 AliError(Form("No output list defined (%p)", GetOutputData(1)));
252 if (GetOutputData(1)) GetOutputData(1)->Print();
256 // Get our histograms from the container
257 TH1I* hEventsTr = 0;//static_cast<TH1I*>(list->FindObject("nEventsTr"));
258 TH1I* hEventsTrVtx = 0;//static_cast<TH1I*>(list->FindObject("nEventsTrVtx"));
260 if (!fEventInspector.FetchHistograms(list, hEventsTr,
261 hEventsTrVtx, hTriggers)) {
262 AliError(Form("Didn't get histograms from event selector "
263 "(hEventsTr=%p,hEventsTrVtx=%p)",
264 hEventsTr, hEventsTrVtx));
269 TH2D* hData = static_cast<TH2D*>(list->FindObject("d2Ndetadphi"));
271 AliError(Form("Couldn't get our summed histogram from output "
272 "list %s (d2Ndetadphi=%p)", list->GetName(), hData));
277 // TH1D* dNdeta = fHData->ProjectionX("dNdeta", 0, -1, "e");
278 TH1D* dNdeta = hData->ProjectionX("dNdeta", 1, -1, "e");
279 TH1D* norm = hData->ProjectionX("dNdeta", 0, 1, "");
280 dNdeta->SetTitle("dN_{ch}/d#eta in the forward regions");
281 dNdeta->SetYTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}");
282 dNdeta->Divide(norm);
284 dNdeta->Scale(Double_t(hEventsTrVtx->GetEntries())/hEventsTr->GetEntries(),
288 fEnergyFitter.Fit(list);
289 fSharingFilter.ScaleHistograms(list,hEventsTr->Integral());
290 fDensityCalculator.ScaleHistograms(list,hEventsTrVtx->Integral());
291 fCorrections.ScaleHistograms(list,hEventsTrVtx->Integral());
294 //____________________________________________________________________
296 AliForwardMultiplicity::MarkEventForStore() const
298 // Make sure the AOD tree is filled
299 AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
301 dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
303 AliFatal("No AOD output handler set in analysis manager");
305 ah->SetFillAOD(kTRUE);
308 //____________________________________________________________________
310 AliForwardMultiplicity::Print(Option_t*) const