]>
Commit | Line | Data |
---|---|---|
7984e5f7 | 1 | // |
2 | // Calculate the multiplicity in the forward regions event-by-event | |
3 | // | |
4 | // Inputs: | |
5 | // - AliESDEvent | |
6 | // | |
7 | // Outputs: | |
8 | // - AliAODForwardMult | |
9 | // | |
10 | // Histograms | |
11 | // | |
12 | // Corrections used | |
13 | // | |
0bd4b00f | 14 | #include "AliForwardMultiplicityTask.h" |
7e4038b5 | 15 | #include "AliTriggerAnalysis.h" |
16 | #include "AliPhysicsSelection.h" | |
17 | #include "AliLog.h" | |
7e4038b5 | 18 | #include "AliESDEvent.h" |
19 | #include "AliAODHandler.h" | |
20 | #include "AliMultiplicity.h" | |
21 | #include "AliInputEventHandler.h" | |
0bd4b00f | 22 | #include "AliForwardCorrectionManager.h" |
23 | #include "AliAnalysisManager.h" | |
7e4038b5 | 24 | #include <TH1.h> |
25 | #include <TDirectory.h> | |
26 | #include <TTree.h> | |
0bd4b00f | 27 | #include <TROOT.h> |
7ec4d843 | 28 | |
7e4038b5 | 29 | |
30 | //==================================================================== | |
0bd4b00f | 31 | AliForwardMultiplicityTask::AliForwardMultiplicityTask() |
eb865a4f | 32 | : AliForwardMultiplicityBase(), |
7e4038b5 | 33 | fHData(0), |
7e4038b5 | 34 | fESDFMD(), |
35 | fHistos(), | |
36 | fAODFMD(), | |
fffea31d | 37 | fEventInspector(), |
38 | fEnergyFitter(), | |
7e4038b5 | 39 | fSharingFilter(), |
40 | fDensityCalculator(), | |
41 | fCorrections(), | |
42 | fHistCollector(), | |
fffea31d | 43 | fList(0) |
7e4038b5 | 44 | { |
7984e5f7 | 45 | // |
46 | // Constructor | |
47 | // | |
7e4038b5 | 48 | } |
49 | ||
50 | //____________________________________________________________________ | |
0bd4b00f | 51 | AliForwardMultiplicityTask::AliForwardMultiplicityTask(const char* name) |
eb865a4f | 52 | : AliForwardMultiplicityBase(name), |
7e4038b5 | 53 | fHData(0), |
7e4038b5 | 54 | fESDFMD(), |
55 | fHistos(), | |
4cbdf467 | 56 | fAODFMD(false), |
fffea31d | 57 | fEventInspector("event"), |
58 | fEnergyFitter("energy"), | |
7e4038b5 | 59 | fSharingFilter("sharing"), |
60 | fDensityCalculator("density"), | |
61 | fCorrections("corrections"), | |
62 | fHistCollector("collector"), | |
fffea31d | 63 | fList(0) |
7e4038b5 | 64 | { |
7984e5f7 | 65 | // |
66 | // Constructor | |
67 | // | |
68 | // Parameters: | |
69 | // name Name of task | |
70 | // | |
7e4038b5 | 71 | DefineOutput(1, TList::Class()); |
7e4038b5 | 72 | } |
73 | ||
74 | //____________________________________________________________________ | |
0bd4b00f | 75 | AliForwardMultiplicityTask::AliForwardMultiplicityTask(const AliForwardMultiplicityTask& o) |
eb865a4f | 76 | : AliForwardMultiplicityBase(o), |
7e4038b5 | 77 | fHData(o.fHData), |
7e4038b5 | 78 | fESDFMD(o.fESDFMD), |
79 | fHistos(o.fHistos), | |
80 | fAODFMD(o.fAODFMD), | |
fffea31d | 81 | fEventInspector(o.fEventInspector), |
82 | fEnergyFitter(o.fEnergyFitter), | |
7e4038b5 | 83 | fSharingFilter(o.fSharingFilter), |
84 | fDensityCalculator(o.fDensityCalculator), | |
85 | fCorrections(o.fCorrections), | |
86 | fHistCollector(o.fHistCollector), | |
fffea31d | 87 | fList(o.fList) |
7e4038b5 | 88 | { |
7984e5f7 | 89 | // |
90 | // Copy constructor | |
91 | // | |
92 | // Parameters: | |
93 | // o Object to copy from | |
94 | // | |
0bd4b00f | 95 | DefineOutput(1, TList::Class()); |
7e4038b5 | 96 | } |
97 | ||
98 | //____________________________________________________________________ | |
0bd4b00f | 99 | AliForwardMultiplicityTask& |
100 | AliForwardMultiplicityTask::operator=(const AliForwardMultiplicityTask& o) | |
7e4038b5 | 101 | { |
7984e5f7 | 102 | // |
103 | // Assignment operator | |
104 | // | |
105 | // Parameters: | |
106 | // o Object to assign from | |
107 | // | |
108 | // Return: | |
109 | // Reference to this object | |
110 | // | |
eb865a4f | 111 | AliForwardMultiplicityBase::operator=(o); |
fffea31d | 112 | |
7e4038b5 | 113 | fHData = o.fHData; |
fffea31d | 114 | fEventInspector = o.fEventInspector; |
115 | fEnergyFitter = o.fEnergyFitter; | |
7e4038b5 | 116 | fSharingFilter = o.fSharingFilter; |
117 | fDensityCalculator = o.fDensityCalculator; | |
118 | fCorrections = o.fCorrections; | |
119 | fHistCollector = o.fHistCollector; | |
120 | fHistos = o.fHistos; | |
121 | fAODFMD = o.fAODFMD; | |
122 | fList = o.fList; | |
7e4038b5 | 123 | |
124 | return *this; | |
125 | } | |
126 | ||
fffea31d | 127 | //____________________________________________________________________ |
128 | void | |
0bd4b00f | 129 | AliForwardMultiplicityTask::SetDebug(Int_t dbg) |
fffea31d | 130 | { |
7984e5f7 | 131 | // |
132 | // Set debug level | |
133 | // | |
134 | // Parameters: | |
135 | // dbg Debug level | |
136 | // | |
fffea31d | 137 | fEventInspector.SetDebug(dbg); |
138 | fEnergyFitter.SetDebug(dbg); | |
139 | fSharingFilter.SetDebug(dbg); | |
140 | fDensityCalculator.SetDebug(dbg); | |
141 | fCorrections.SetDebug(dbg); | |
142 | fHistCollector.SetDebug(dbg); | |
143 | } | |
144 | ||
7e4038b5 | 145 | //____________________________________________________________________ |
146 | void | |
0bd4b00f | 147 | AliForwardMultiplicityTask::InitializeSubs() |
7e4038b5 | 148 | { |
7984e5f7 | 149 | // |
150 | // Initialise the sub objects and stuff. Called on first event | |
151 | // | |
152 | // | |
7ec4d843 | 153 | const TAxis* pe = 0; |
154 | const TAxis* pv = 0; | |
0bd4b00f | 155 | |
7ec4d843 | 156 | if (!ReadCorrections(pe,pv)) return; |
fffea31d | 157 | |
0bd4b00f | 158 | fHistos.Init(*pe); |
159 | fAODFMD.Init(*pe); | |
7e4038b5 | 160 | |
161 | fHData = static_cast<TH2D*>(fAODFMD.GetHistogram().Clone("d2Ndetadphi")); | |
162 | fHData->SetStats(0); | |
163 | fHData->SetDirectory(0); | |
9d99b0dd | 164 | fList->Add(fHData); |
165 | ||
0bd4b00f | 166 | fEnergyFitter.Init(*pe); |
167 | fEventInspector.Init(*pv); | |
1174780f | 168 | fDensityCalculator.Init(*pe); |
7ec4d843 | 169 | fCorrections.Init(*pe); |
12fffad7 | 170 | fHistCollector.Init(*pv,*pe); |
0bd4b00f | 171 | |
172 | this->Print(); | |
7e4038b5 | 173 | } |
174 | ||
175 | //____________________________________________________________________ | |
176 | void | |
0bd4b00f | 177 | AliForwardMultiplicityTask::UserCreateOutputObjects() |
7e4038b5 | 178 | { |
7984e5f7 | 179 | // |
180 | // Create output objects | |
181 | // | |
182 | // | |
7e4038b5 | 183 | fList = new TList; |
9d05ffeb | 184 | fList->SetOwner(); |
7e4038b5 | 185 | |
186 | AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager(); | |
0bd4b00f | 187 | AliAODHandler* ah = |
188 | dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler()); | |
fffea31d | 189 | if (!ah) AliFatal("No AOD output handler set in analysis manager"); |
7e4038b5 | 190 | |
191 | ||
192 | TObject* obj = &fAODFMD; | |
193 | ah->AddBranch("AliAODForwardMult", &obj); | |
194 | ||
fffea31d | 195 | fEventInspector.DefineOutput(fList); |
196 | fEnergyFitter.DefineOutput(fList); | |
9d99b0dd | 197 | fSharingFilter.DefineOutput(fList); |
198 | fDensityCalculator.DefineOutput(fList); | |
199 | fCorrections.DefineOutput(fList); | |
12fffad7 | 200 | fHistCollector.DefineOutput(fList); |
0bd4b00f | 201 | |
202 | PostData(1, fList); | |
7e4038b5 | 203 | } |
204 | //____________________________________________________________________ | |
205 | void | |
0bd4b00f | 206 | AliForwardMultiplicityTask::UserExec(Option_t*) |
7e4038b5 | 207 | { |
7984e5f7 | 208 | // |
209 | // Process each event | |
210 | // | |
211 | // Parameters: | |
212 | // option Not used | |
213 | // | |
214 | ||
0bd4b00f | 215 | // static Int_t cnt = 0; |
216 | // cnt++; | |
7e4038b5 | 217 | // Get the input data |
7ec4d843 | 218 | AliESDEvent* esd = GetESDEvent(); |
7e4038b5 | 219 | |
7e4038b5 | 220 | // Clear stuff |
221 | fHistos.Clear(); | |
222 | fESDFMD.Clear(); | |
223 | fAODFMD.Clear(); | |
e58000b7 | 224 | |
fffea31d | 225 | Bool_t lowFlux = kFALSE; |
226 | UInt_t triggers = 0; | |
0bd4b00f | 227 | UShort_t ivz = 0; |
fffea31d | 228 | Double_t vz = 0; |
5e4d905e | 229 | Double_t cent = -1; |
230 | UInt_t found = fEventInspector.Process(esd, triggers, lowFlux, | |
231 | ivz, vz, cent); | |
e58000b7 | 232 | |
9bff843b | 233 | if (found & AliFMDEventInspector::kNoEvent) return; |
234 | if (found & AliFMDEventInspector::kNoTriggers) return; | |
235 | ||
fffea31d | 236 | // Set trigger bits, and mark this event for storage |
9d99b0dd | 237 | fAODFMD.SetTriggerBits(triggers); |
b2e7f2d6 | 238 | fAODFMD.SetSNN(fEventInspector.GetEnergy()); |
239 | fAODFMD.SetSystem(fEventInspector.GetCollisionSystem()); | |
e58000b7 | 240 | fAODFMD.SetCentrality(cent); |
7e4038b5 | 241 | MarkEventForStore(); |
e58000b7 | 242 | |
3c5497d0 | 243 | if (found & AliFMDEventInspector::kNoSPD) return; |
244 | if (found & AliFMDEventInspector::kNoFMD) return; | |
245 | if (found & AliFMDEventInspector::kNoVertex) return; | |
e58000b7 | 246 | |
247 | if (triggers & AliAODForwardMult::kPileUp) return; | |
248 | ||
fffea31d | 249 | fAODFMD.SetIpZ(vz); |
7e4038b5 | 250 | |
fffea31d | 251 | if (found & AliFMDEventInspector::kBadVertex) return; |
7e4038b5 | 252 | |
0bd4b00f | 253 | // We we do not want to use low flux specific code, we disable it here. |
254 | if (!fEnableLowFlux) lowFlux = false; | |
255 | ||
fffea31d | 256 | // Get FMD data |
257 | AliESDFMD* esdFMD = esd->GetFMDData(); | |
12fffad7 | 258 | // // Apply the sharing filter (or hit merging or clustering if you like) |
fffea31d | 259 | if (!fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD)) { |
260 | AliWarning("Sharing filter failed!"); | |
7e4038b5 | 261 | return; |
262 | } | |
263 | ||
fffea31d | 264 | // Do the energy stuff |
5e4d905e | 265 | if (!fEnergyFitter.Accumulate(*esdFMD, cent, |
266 | triggers & AliAODForwardMult::kEmpty)){ | |
fffea31d | 267 | AliWarning("Energy fitter failed"); |
7e4038b5 | 268 | return; |
269 | } | |
270 | ||
271 | // Calculate the inclusive charged particle density | |
12fffad7 | 272 | //if (!fDensityCalculator.Calculate(fESDFMD, fHistos, ivz, lowFlux)) { |
273 | if (!fDensityCalculator.Calculate(*esdFMD, fHistos, ivz, lowFlux)) { | |
7e4038b5 | 274 | AliWarning("Density calculator failed!"); |
275 | return; | |
276 | } | |
277 | ||
278 | // Do the secondary and other corrections. | |
279 | if (!fCorrections.Correct(fHistos, ivz)) { | |
280 | AliWarning("Corrections failed"); | |
281 | return; | |
282 | } | |
283 | ||
284 | if (!fHistCollector.Collect(fHistos, ivz, fAODFMD.GetHistogram())) { | |
285 | AliWarning("Histogram collector failed"); | |
286 | return; | |
287 | } | |
288 | ||
289 | if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel)) | |
290 | fHData->Add(&(fAODFMD.GetHistogram())); | |
2d68d438 | 291 | |
292 | PostData(1, fList); | |
7e4038b5 | 293 | } |
294 | ||
295 | //____________________________________________________________________ | |
296 | void | |
0bd4b00f | 297 | AliForwardMultiplicityTask::Terminate(Option_t*) |
7e4038b5 | 298 | { |
7984e5f7 | 299 | // |
300 | // End of job | |
301 | // | |
302 | // Parameters: | |
303 | // option Not used | |
304 | // | |
305 | ||
7e4038b5 | 306 | TList* list = dynamic_cast<TList*>(GetOutputData(1)); |
307 | if (!list) { | |
2d68d438 | 308 | AliError(Form("No output list defined (%p)", GetOutputData(1))); |
309 | if (GetOutputData(1)) GetOutputData(1)->Print(); | |
7e4038b5 | 310 | return; |
311 | } | |
9d99b0dd | 312 | |
313 | // Get our histograms from the container | |
fffea31d | 314 | TH1I* hEventsTr = 0;//static_cast<TH1I*>(list->FindObject("nEventsTr")); |
315 | TH1I* hEventsTrVtx = 0;//static_cast<TH1I*>(list->FindObject("nEventsTrVtx")); | |
316 | TH1I* hTriggers = 0; | |
317 | if (!fEventInspector.FetchHistograms(list, hEventsTr, | |
318 | hEventsTrVtx, hTriggers)) { | |
319 | AliError(Form("Didn't get histograms from event selector " | |
320 | "(hEventsTr=%p,hEventsTrVtx=%p)", | |
321 | hEventsTr, hEventsTrVtx)); | |
322 | list->ls(); | |
323 | return; | |
324 | } | |
325 | ||
9d99b0dd | 326 | TH2D* hData = static_cast<TH2D*>(list->FindObject("d2Ndetadphi")); |
fffea31d | 327 | if (!hData) { |
328 | AliError(Form("Couldn't get our summed histogram from output " | |
329 | "list %s (d2Ndetadphi=%p)", list->GetName(), hData)); | |
2d68d438 | 330 | list->ls(); |
331 | return; | |
332 | } | |
9d99b0dd | 333 | |
7e4038b5 | 334 | // TH1D* dNdeta = fHData->ProjectionX("dNdeta", 0, -1, "e"); |
9d99b0dd | 335 | TH1D* dNdeta = hData->ProjectionX("dNdeta", 1, -1, "e"); |
12fffad7 | 336 | TH1D* norm = hData->ProjectionX("norm", 0, 0, ""); |
7e4038b5 | 337 | dNdeta->SetTitle("dN_{ch}/d#eta in the forward regions"); |
338 | dNdeta->SetYTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}"); | |
339 | dNdeta->Divide(norm); | |
340 | dNdeta->SetStats(0); | |
9d99b0dd | 341 | dNdeta->Scale(Double_t(hEventsTrVtx->GetEntries())/hEventsTr->GetEntries(), |
7e4038b5 | 342 | "width"); |
7e4038b5 | 343 | list->Add(dNdeta); |
0bd4b00f | 344 | list->Add(norm); |
fffea31d | 345 | |
346 | fEnergyFitter.Fit(list); | |
6feacd76 | 347 | fSharingFilter.ScaleHistograms(list,Int_t(hEventsTr->Integral())); |
348 | fDensityCalculator.ScaleHistograms(list,Int_t(hEventsTrVtx->Integral())); | |
349 | fCorrections.ScaleHistograms(list,Int_t(hEventsTrVtx->Integral())); | |
7e4038b5 | 350 | } |
7e4038b5 | 351 | |
352 | // | |
353 | // EOF | |
354 | // |