]>
Commit | Line | Data |
---|---|---|
9e44412b | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | // Analysis task for B2 (AOD) | |
17 | // author: Eulogio Serradilla <eulogio.serradilla@cern.ch> | |
18 | ||
19 | #include <AliAnalysisTaskSE.h> | |
20 | #include <AliAnalysisManager.h> | |
21 | #include <AliInputEventHandler.h> | |
22 | #include <AliExternalTrackParam.h> | |
23 | #include <AliAODEvent.h> | |
24 | #include <AliAODVertex.h> | |
25 | #include <AliAODTrack.h> | |
26 | #include <AliAODMCParticle.h> | |
27 | #include <TH1D.h> | |
28 | #include <TH2D.h> | |
29 | #include <TList.h> | |
30 | #include <TString.h> | |
31 | #include <TVector3.h> | |
32 | #include <TProfile.h> | |
33 | #include <AliLog.h> | |
34 | ||
35 | #include "AliLnID.h" | |
36 | #include "AliLnHistoMap.h" | |
37 | #include "AliLnAODtrackCuts.h" | |
38 | #include "AliAnalysisTaskB2AOD.h" | |
39 | ||
40 | ClassImp(AliAnalysisTaskB2AOD) | |
41 | ||
42 | AliAnalysisTaskB2AOD::AliAnalysisTaskB2AOD() | |
43 | : AliAnalysisTaskSE() | |
44 | , fSpecies("Proton") | |
45 | , fPartCode(AliPID::kProton) | |
46 | , fHeavyIons(0) | |
47 | , fSimulation(0) | |
48 | , fMultTriggerFired(0) | |
49 | , fCentTriggerFired(0) | |
50 | , fTriggerFired(0) | |
51 | , fGoodVertex(0) | |
52 | , fPileUpEvent(0) | |
53 | , fV0AND(0) | |
54 | , fNoFastOnly(0) | |
55 | , fNtrkMultTrigger(0) | |
56 | , fMinKNOmult(-10) | |
57 | , fMaxKNOmult(100000) | |
58 | , fMinCentrality(0) | |
59 | , fMaxCentrality(100) | |
60 | , fNch(0) | |
61 | , fNtrk(0) | |
62 | , fMeanNtrk(1) | |
63 | , fKNOmult(1) | |
64 | , fMinVx(-1) | |
65 | , fMaxVx(1) | |
66 | , fMinVy(-1) | |
67 | , fMaxVy(1) | |
68 | , fMinVz(-10) | |
69 | , fMaxVz(10) | |
70 | , fMinDCAxy(-1) | |
71 | , fMaxDCAxy(1) | |
72 | , fMinDCAz(-2) | |
73 | , fMaxDCAz(2) | |
74 | , fMaxNSigma(3) | |
75 | , fMinEta(-0.8) | |
76 | , fMaxEta(0.8) | |
77 | , fMinY(-0.5) | |
78 | , fMaxY(0.5) | |
79 | , fAODevent(0) | |
80 | , fOutputContainer(0) | |
81 | , fHistoMap(0) | |
82 | , fTrackCuts(0) | |
83 | , fLnID(0) | |
84 | , fMaxNSigmaITS(3) | |
85 | , fMaxNSigmaTPC(3) | |
86 | , fMaxNSigmaTOF(3) | |
87 | , fMinM2(2.) | |
88 | , fMaxM2(6.) | |
89 | , fMomentumCorrection(0) | |
90 | , fMoCpfx(0) | |
91 | ||
92 | { | |
93 | // | |
94 | // Default constructor | |
95 | // | |
96 | AliLog::SetGlobalLogLevel(AliLog::kFatal); | |
97 | } | |
98 | ||
99 | AliAnalysisTaskB2AOD::AliAnalysisTaskB2AOD(const char* name) | |
100 | : AliAnalysisTaskSE(name) | |
101 | , fSpecies("Proton") | |
102 | , fPartCode(AliPID::kProton) | |
103 | , fHeavyIons(0) | |
104 | , fSimulation(0) | |
105 | , fMultTriggerFired(0) | |
106 | , fCentTriggerFired(0) | |
107 | , fTriggerFired(0) | |
108 | , fGoodVertex(0) | |
109 | , fPileUpEvent(0) | |
110 | , fV0AND(0) | |
111 | , fNoFastOnly(0) | |
112 | , fNtrkMultTrigger(0) | |
113 | , fMinKNOmult(-10) | |
114 | , fMaxKNOmult(100000) | |
115 | , fMinCentrality(-1) | |
116 | , fMaxCentrality(100) | |
117 | , fNch(0) | |
118 | , fNtrk(0) | |
119 | , fMeanNtrk(1) | |
120 | , fKNOmult(1) | |
121 | , fMinVx(-1) | |
122 | , fMaxVx(1) | |
123 | , fMinVy(-1) | |
124 | , fMaxVy(1) | |
125 | , fMinVz(-10) | |
126 | , fMaxVz(10) | |
127 | , fMinDCAxy(-1) | |
128 | , fMaxDCAxy(1) | |
129 | , fMinDCAz(-2) | |
130 | , fMaxDCAz(2) | |
131 | , fMaxNSigma(3) | |
132 | , fMinEta(-0.8) | |
133 | , fMaxEta(0.8) | |
134 | , fMinY(-0.5) | |
135 | , fMaxY(0.5) | |
136 | , fAODevent(0) | |
137 | , fOutputContainer(0) | |
138 | , fHistoMap(0) | |
139 | , fTrackCuts(0) | |
140 | , fLnID(0) | |
141 | , fMaxNSigmaITS(3) | |
142 | , fMaxNSigmaTPC(3) | |
143 | , fMaxNSigmaTOF(3) | |
144 | , fMinM2(2.) | |
145 | , fMaxM2(6.) | |
146 | , fMomentumCorrection(0) | |
147 | , fMoCpfx(0) | |
148 | ||
149 | { | |
150 | // | |
151 | // Constructor | |
152 | // | |
153 | DefineOutput(1, TList::Class()); | |
154 | ||
155 | AliLog::SetGlobalLogLevel(AliLog::kFatal); | |
156 | } | |
157 | ||
158 | void AliAnalysisTaskB2AOD::UserCreateOutputObjects() | |
159 | { | |
160 | // | |
161 | // Create output objects | |
162 | // | |
163 | if(fHistoMap == 0) AliFatal("no histogram map"); // should be created somewhere else | |
164 | ||
165 | fOutputContainer = new TList(); | |
166 | fOutputContainer->SetOwner(kTRUE); | |
167 | ||
168 | TObjString* key; | |
169 | TIter iter(fHistoMap->GetMap()); | |
170 | while((key = dynamic_cast<TObjString*>(iter.Next()))) fOutputContainer->Add((TH1*)fHistoMap->Get(key)); | |
171 | ||
172 | PostData(1, fOutputContainer); | |
173 | } | |
174 | ||
175 | AliAnalysisTaskB2AOD::~AliAnalysisTaskB2AOD() | |
176 | { | |
177 | // | |
178 | // Default destructor | |
179 | // | |
180 | delete fHistoMap; | |
181 | delete fOutputContainer; | |
182 | delete fTrackCuts; | |
183 | delete fLnID; | |
184 | ||
185 | delete fMoCpfx; | |
186 | } | |
187 | ||
188 | void AliAnalysisTaskB2AOD::SetParticleSpecies(const TString& species) | |
189 | { | |
190 | // | |
191 | // set the particle species and the AliPID code | |
192 | // | |
193 | fSpecies = species; | |
194 | fPartCode = this->GetPidCode(species); | |
195 | } | |
196 | ||
197 | void AliAnalysisTaskB2AOD::UserExec(Option_t* ) | |
198 | { | |
199 | // | |
200 | // Execute analysis for the current event | |
201 | // | |
202 | fAODevent = dynamic_cast<AliAODEvent*>(InputEvent()); | |
203 | ||
204 | if (!fAODevent) | |
205 | { | |
206 | this->Error("Exec", "AOD event not available"); | |
207 | return; | |
208 | } | |
209 | ||
210 | if(fTrackCuts == 0) AliFatal("track cuts not set"); | |
211 | ||
212 | if(fLnID == 0) AliFatal("PID not set"); | |
213 | ||
214 | // multiplicity and centrality | |
0a918d8d | 215 | AliAODHeader * header = dynamic_cast<AliAODHeader*>(fAODevent->GetHeader()); |
216 | if(!header) AliFatal("Not a standard AOD"); | |
217 | ||
218 | fNtrk = (fMaxEta > 0.5) ? header->GetRefMultiplicityComb08() : header->GetRefMultiplicityComb05(); | |
9e44412b | 219 | |
220 | if(fSimulation) fNch = this->GetChargedMultiplicity(fMaxEta); | |
221 | ||
222 | fKNOmult = fNtrk/fMeanNtrk; | |
223 | ||
224 | ((TH1D*)fHistoMap->Get(fSpecies + "_Event_Ntrk"))->Fill(fNtrk); | |
225 | ((TH1D*)fHistoMap->Get(fSpecies + "_Event_Zmult"))->Fill(fKNOmult); | |
226 | ||
227 | fMultTriggerFired = (fNtrk > 0) && (fKNOmult >= fMinKNOmult) && (fKNOmult < fMaxKNOmult); | |
228 | ||
229 | if(fHeavyIons) | |
230 | { | |
0a918d8d | 231 | Double_t centrality = ((AliVAODHeader*)fAODevent->GetHeader())->GetCentrality(); |
9e44412b | 232 | |
233 | fCentTriggerFired = (centrality >= fMinCentrality) && (centrality < fMaxCentrality); | |
234 | } | |
235 | ||
236 | // trigger | |
237 | ||
238 | AliInputEventHandler* eventH = dynamic_cast<AliInputEventHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()); | |
239 | if(eventH == 0) | |
240 | { | |
241 | this->Error("Exec", "could not get AliInputEventHandler"); | |
242 | return; | |
243 | } | |
244 | ||
245 | UInt_t triggerBits = eventH->IsEventSelected(); | |
246 | ||
247 | if(fHeavyIons) | |
248 | { | |
249 | fTriggerFired = ( this->IsMB(triggerBits) && fCentTriggerFired ); | |
250 | } | |
251 | else | |
252 | { | |
253 | fTriggerFired = this->IsMB(triggerBits); | |
254 | if(fNoFastOnly) fTriggerFired = ( fTriggerFired && !this->IsFastOnly(triggerBits) ); | |
255 | if(fV0AND) fTriggerFired = ( fTriggerFired && this->IsV0AND(triggerBits) ); | |
256 | if(fNtrkMultTrigger) fTriggerFired = ( fTriggerFired && fMultTriggerFired ); | |
257 | } | |
258 | ||
259 | // vertex | |
260 | ||
261 | fGoodVertex = kFALSE; | |
262 | ||
263 | const AliAODVertex* vtx = fAODevent->GetPrimaryVertex(); // best primary vertex | |
264 | ||
265 | if(vtx->GetNContributors()>0) | |
266 | { | |
267 | fGoodVertex=kTRUE; | |
268 | ||
269 | ((TH2D*)fHistoMap->Get(fSpecies + "_Vertex_YX"))->Fill(vtx->GetX(), vtx->GetY()); | |
270 | ((TH2D*)fHistoMap->Get(fSpecies + "_Vertex_YZ"))->Fill(vtx->GetZ(), vtx->GetY()); | |
271 | ((TH2D*)fHistoMap->Get(fSpecies + "_Vertex_XZ"))->Fill(vtx->GetZ(), vtx->GetX()); | |
272 | } | |
273 | ||
274 | if( (vtx->GetX() <= fMinVx) || (vtx->GetX() >= fMaxVx) ) fGoodVertex=kFALSE; | |
275 | if( (vtx->GetY() <= fMinVy) || (vtx->GetY() >= fMaxVy) ) fGoodVertex=kFALSE; | |
276 | if( (vtx->GetZ() <= fMinVz) || (vtx->GetZ() >= fMaxVz) ) fGoodVertex=kFALSE; | |
277 | ||
278 | // pile up | |
279 | ||
280 | fPileUpEvent = fAODevent->IsPileupFromSPDInMultBins(); | |
281 | ||
282 | // event stats | |
283 | ||
284 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(0); // number of events | |
285 | ||
286 | if(fTriggerFired) | |
287 | { | |
288 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(1); // triggering events | |
289 | ||
290 | if(vtx->GetNContributors()>0) | |
291 | { | |
292 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(3); // valid vertex within a triggering event | |
293 | ||
294 | if((vtx->GetZ() > fMinVz) && (vtx->GetZ() < fMaxVz)) | |
295 | { | |
296 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(4); // Vz | |
297 | ||
298 | if( (vtx->GetX() > fMinVx) && (vtx->GetX() < fMaxVx) | |
299 | && (vtx->GetY() > fMinVy) && (vtx->GetY() < fMaxVy)) | |
300 | { | |
301 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(5); // Vx, Vy | |
302 | ||
303 | if(fGoodVertex) | |
304 | { | |
305 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(6); // VertexerZ | |
306 | ||
307 | if(!fPileUpEvent) | |
308 | { | |
309 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(7); // no pile-up | |
310 | } | |
311 | } | |
312 | } | |
313 | } | |
314 | } | |
315 | } | |
316 | ||
317 | // Particles and tracks for this event | |
318 | ||
319 | if(fSimulation) this->GetParticles(); | |
320 | ||
321 | this->GetTracks(); | |
322 | ||
323 | // Post the data (input/output slots #0 already used by the base class) | |
324 | PostData(1, fOutputContainer); | |
325 | } | |
326 | ||
327 | Int_t AliAnalysisTaskB2AOD::GetParticles() | |
328 | { | |
329 | // | |
330 | // Get particles from current event | |
331 | // | |
332 | Int_t nParticles = 0; | |
333 | ||
334 | TList* lst = fAODevent->GetList(); | |
335 | TClonesArray* lop = dynamic_cast<TClonesArray*>(lst->FindObject(AliAODMCParticle::StdBranchName())); | |
336 | ||
337 | if (!lop) | |
338 | { | |
339 | AliDebug(AliLog::kWarning, "list of particles not available"); | |
340 | return 0; | |
341 | } | |
342 | ||
343 | for (Int_t i = 0; i < lop->GetEntries(); ++i) | |
344 | { | |
345 | AliAODMCParticle* iParticle = dynamic_cast<AliAODMCParticle*>(lop->At(i)); | |
346 | ||
347 | if(!iParticle) continue; | |
348 | ||
349 | Int_t pid = fLnID->GetPID(iParticle); | |
350 | ||
351 | if(pid != fPartCode) continue; | |
352 | ||
353 | // physical primaries | |
354 | ||
355 | if(!iParticle->IsPhysicalPrimary()) continue; | |
356 | ||
357 | TString particle = fSpecies; | |
358 | if(iParticle->Charge() < 0) particle.Prepend("Anti"); | |
359 | ||
360 | Double_t genP = iParticle->P(); | |
361 | Double_t genPt = iParticle->Pt(); | |
362 | Double_t genY = iParticle->Y(); | |
363 | Double_t genPhi = iParticle->Phi(); | |
364 | Double_t genEta = iParticle->Eta(); | |
365 | ||
366 | // multiplicity and centrality | |
367 | ||
368 | if( fHeavyIons && !fCentTriggerFired) continue; | |
369 | if( fNtrkMultTrigger && !fMultTriggerFired) continue; | |
370 | ||
371 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Prim_P"))->Fill(genP); | |
372 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Prim_Pt"))->Fill(genPt); | |
373 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Prim_Y"))->Fill(genY); | |
374 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Prim_Phi"))->Fill(genPhi); | |
375 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Prim_Eta"))->Fill(genEta); | |
376 | ((TH2D*)fHistoMap->Get(particle + "_Gen_Prim_PtY"))->Fill(genY, genPt); | |
377 | ((TH2D*)fHistoMap->Get(particle + "_Gen_Prim_EtaY"))->Fill(genY, genEta); | |
378 | ||
379 | // is within phase space? | |
380 | ||
381 | if(TMath::Abs(genY) >= fMaxY) continue; | |
382 | ||
383 | ((TH1D*)fHistoMap->Get(particle + "_Gen_PhS_Prim_P"))->Fill(genP); | |
384 | ((TH1D*)fHistoMap->Get(particle + "_Gen_PhS_Prim_Pt"))->Fill(genPt); | |
385 | ||
386 | // is from a triggering event? (same as rec.) | |
387 | ||
388 | if(!fTriggerFired) | |
389 | { | |
390 | ((TH1D*)fHistoMap->Get(particle + "_Gen_NoTrig_Prim_Pt"))->Fill(genPt); | |
391 | continue; | |
392 | } | |
393 | ||
394 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Trig_Prim_Pt"))->Fill(genPt); | |
395 | ||
396 | // is from a triggering event with good vertex? | |
397 | ||
398 | if(fAODevent->GetPrimaryVertex()->GetNContributors() <= 0) | |
399 | { | |
400 | ((TH1D*)fHistoMap->Get(particle + "_Gen_NoVtx_Prim_Pt"))->Fill(genPt); | |
401 | } | |
402 | ||
403 | if(!fGoodVertex) continue; | |
404 | if(fPileUpEvent) continue; | |
405 | ||
406 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Nch"))->Fill(fNch); | |
407 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Vtx_Prim_Pt"))->Fill(genPt); | |
408 | ||
409 | // is within the geometrical acceptance? | |
410 | ||
411 | if(!fTrackCuts->IsWithinGeoAcceptance(iParticle)) continue; | |
412 | ||
413 | ((TH2D*)fHistoMap->Get(particle + "_Gen_Acc_Prim_PtY"))->Fill(genY,genPt); | |
414 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Acc_Prim_P"))->Fill(genP); | |
415 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Acc_Prim_Pt"))->Fill(genPt); | |
416 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Acc_Prim_Phi"))->Fill(genPhi); | |
417 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Acc_Prim_Y"))->Fill(genY); | |
418 | } | |
419 | ||
420 | return nParticles; | |
421 | } | |
422 | ||
423 | Int_t AliAnalysisTaskB2AOD::GetTracks() | |
424 | { | |
425 | // | |
426 | // Get tracks from current event | |
427 | // | |
428 | using namespace std; | |
429 | ||
430 | Int_t nTracks = 0; | |
431 | ||
432 | // trigger, vertex and pile-up | |
433 | ||
434 | if(!fTriggerFired) return 0; | |
435 | if(!fGoodVertex) return 0; | |
436 | if(fPileUpEvent) return 0; | |
437 | ||
438 | // this is a 'good' event | |
439 | ||
440 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(2); // analyzed events | |
441 | ||
442 | ((TH1D*)fHistoMap->Get(fSpecies + "_Ana_Event_Ntrk"))->Fill(fNtrk); | |
443 | ((TH1D*)fHistoMap->Get(fSpecies + "_Ana_Event_Zmult"))->Fill(fKNOmult); | |
444 | ||
445 | if(fSimulation) | |
446 | { | |
447 | ((TH2D*)fHistoMap->Get(fSpecies + "_Ana_Event_Nch_Ntrk"))->Fill(fNtrk, fNch); | |
448 | } | |
449 | ||
450 | const AliAODVertex* vtx = fAODevent->GetPrimaryVertex(); | |
451 | ||
452 | ((TH2D*)fHistoMap->Get(fSpecies + "_Ana_Vertex_YX"))->Fill(vtx->GetX(), vtx->GetY()); | |
453 | ((TH2D*)fHistoMap->Get(fSpecies + "_Ana_Vertex_YZ"))->Fill(vtx->GetZ(), vtx->GetY()); | |
454 | ((TH2D*)fHistoMap->Get(fSpecies + "_Ana_Vertex_XZ"))->Fill(vtx->GetZ(), vtx->GetX()); | |
455 | ||
456 | // track loop | |
457 | for(Int_t i = 0; i < fAODevent->GetNumberOfTracks(); ++i) | |
458 | { | |
459 | AliAODTrack* iTrack = fAODevent->GetTrack(i); | |
460 | ||
461 | if(!iTrack) continue; | |
462 | ||
463 | TString particle = fSpecies; | |
464 | if(iTrack->Charge() < 0) particle.Prepend("Anti"); | |
465 | ||
466 | // track parameters at the DCA to the primary vertex | |
467 | ||
468 | AliExternalTrackParam trkparam; | |
469 | trkparam.CopyFromVTrack(iTrack); | |
470 | ||
471 | if(trkparam.GetX() > 3.) continue; // only valid for propagation inside the beam pipe | |
472 | ||
473 | // impact parameters | |
474 | Double_t b[2]; | |
475 | Double_t bCov[3]; | |
476 | if(!trkparam.PropagateToDCA(fAODevent->GetPrimaryVertex(), fAODevent->GetMagneticField(), 10000., b, bCov)) continue; | |
477 | ||
478 | Double_t dcaxy = b[0]; | |
479 | Double_t dcaz = b[1]; | |
480 | ||
481 | if(iTrack->Charge() < 0) // in case of asymmetry | |
482 | { | |
483 | dcaxy = -dcaxy; | |
484 | dcaz = -dcaz; | |
485 | } | |
486 | ||
487 | Double_t nSigmaVtx = fTrackCuts->GetNSigmaToVertex(b, bCov); | |
488 | ||
489 | // momentum | |
368c671a | 490 | Double_t pDCA[3] = { iTrack->Px(), iTrack->Py(), iTrack->Pz() }; |
491 | //trkparam.GetPxPyPz(pDCA); | |
9e44412b | 492 | |
493 | Double_t p = TMath::Sqrt(pDCA[0]*pDCA[0] + pDCA[1]*pDCA[1] + pDCA[2]*pDCA[2]); | |
494 | Double_t pt = TMath::Sqrt(pDCA[0]*pDCA[0] + pDCA[1]*pDCA[1]); | |
495 | Double_t pz = pDCA[2]; | |
496 | ||
497 | // track cuts | |
498 | ||
499 | TVector3 pVect(pDCA[0],pDCA[1],pDCA[2]); | |
500 | Double_t eta = pVect.Eta(); | |
501 | Double_t phi = this->GetPhi(pDCA); | |
502 | ||
503 | ((TH2D*)fHistoMap->Get(particle + "_Before_Phi_Eta"))->Fill(eta,phi); | |
504 | ||
505 | if(!fTrackCuts->AcceptTrack(iTrack,b, bCov)) continue; // with next track | |
506 | if(!fTrackCuts->IsWithinGeoAcceptance(pDCA)) continue; // with next track | |
507 | ||
508 | // end track cuts | |
509 | ||
510 | ++nTracks; | |
511 | ||
512 | ((TH2D*)fHistoMap->Get(particle + "_After_Phi_Eta"))->Fill(eta, phi); | |
513 | ||
514 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_DCAxy"))->Fill(dcaxy); | |
515 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_DCAz"))->Fill(dcaz); | |
516 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_NSigma"))->Fill(nSigmaVtx); | |
517 | //((TH1D*)fHistoMap->Get(particle + "_TrackCuts_ITSchi2PerCls"))->Fill(this->GetITSchi2PerCluster(iTrack)); | |
518 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_TPCncls"))->Fill(iTrack->GetTPCNcls()); | |
519 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_TPCxRowsOverF"))->Fill(fTrackCuts->GetNTPCXRowsOverFindable(iTrack)); | |
520 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_TPCxRows"))->Fill(iTrack->GetTPCNCrossedRows()); | |
521 | //((TH1D*)fHistoMap->Get(particle + "_TrackCuts_TPCchi2PerCls"))->Fill(iTrack->GetTPCchi2()/iTrack->GetTPCNcls()); | |
522 | //((TH1D*)fHistoMap->Get(particle + "_TrackCuts_TPCchi2Global"))->Fill(iTrack->GetChi2TPCConstrainedVsGlobal(fAODevent->GetPrimaryVertex())); | |
523 | ||
524 | // detector signals | |
525 | ||
526 | Double_t pITS = p; | |
527 | Double_t pTPC = iTrack->GetTPCmomentum(); | |
528 | Double_t pTOF = p; | |
529 | Double_t dEdxITS = iTrack->GetITSsignal(); | |
530 | Double_t dEdxTPC = iTrack->GetTPCsignal(); | |
531 | Int_t nPointsITS = this->GetITSnPointsPID(iTrack); | |
532 | Int_t nPointsTPC = iTrack->GetTPCsignalN(); | |
533 | Double_t beta = 0; | |
534 | Double_t mass = 0; | |
535 | Double_t m2 = 0; | |
536 | ||
537 | ((TH2D*)fHistoMap->Get(particle + "_ITS_dEdx_P"))->Fill(pITS, dEdxITS); | |
538 | ((TH2D*)fHistoMap->Get(particle + "_TPC_dEdx_P"))->Fill(pTPC, dEdxTPC); | |
539 | ||
540 | if(fTrackCuts->TOFmatch()) | |
541 | { | |
542 | beta = this->GetBeta(iTrack); | |
543 | m2 = this->GetMassSquared(p, beta); | |
544 | mass = TMath::Sqrt(TMath::Abs(m2)); | |
545 | ||
546 | ((TH2D*)fHistoMap->Get(particle + "_TOF_Beta_P"))->Fill(pTOF, beta); | |
547 | ((TH2D*)fHistoMap->Get(particle + "_TOF_Mass_P"))->Fill(pTOF, mass); | |
548 | } | |
549 | ||
368c671a | 550 | // get the pid |
551 | Int_t pid = fLnID->GetPID( fPartCode, pITS, dEdxITS, nPointsITS, pTPC, dEdxTPC, nPointsTPC, pTOF, beta, fMaxNSigmaITS, fMaxNSigmaTPC, fMaxNSigmaTOF); | |
552 | ||
553 | Int_t offset = AliPID::kDeuteron - 5; | |
554 | ||
555 | // for bayes iteration | |
556 | if(pid != -1) | |
557 | { | |
558 | Int_t iBin = (pid > AliPID::kProton) ? pid - offset : pid; | |
559 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats_PID"))->Fill(iBin); | |
560 | } | |
561 | ||
562 | // fix momentum | |
563 | ||
564 | if(fPartCode > AliPID::kTriton) | |
565 | { | |
566 | p *= 2.; | |
567 | pt *= 2.; | |
568 | pz *= 2.; | |
569 | } | |
570 | ||
571 | if(fMomentumCorrection) | |
572 | { | |
573 | pt += this->GetMomentumCorrection(pt); | |
574 | p = TMath::Sqrt(pt*pt + pz*pz); | |
575 | ||
576 | if(fTrackCuts->TOFmatch()) | |
577 | { | |
578 | m2 = this->GetMassSquared(p, beta); | |
579 | mass = TMath::Sqrt(TMath::Abs(m2)); | |
580 | } | |
581 | } | |
582 | ||
9e44412b | 583 | // for pid and efficiency |
584 | ||
585 | Double_t simPt = 0; | |
586 | Double_t simPhi = 0; | |
587 | Double_t simY = 0; | |
588 | ||
589 | Int_t simpid = -1; | |
590 | AliAODMCParticle* iParticle = 0; | |
591 | ||
592 | if(fSimulation) | |
593 | { | |
594 | iParticle = this->GetParticle(iTrack); | |
595 | ||
596 | if(iParticle == 0) continue; | |
597 | ||
598 | simPt = iParticle->Pt(); | |
599 | simPhi = iParticle->Phi(); | |
600 | simY = iParticle->Y(); | |
601 | ||
602 | simpid = fLnID->GetPID(iParticle); | |
603 | ||
604 | if(simpid == fPartCode) | |
605 | { | |
606 | TString simparticle = fSpecies; | |
607 | if(iParticle->Charge()<0) simparticle.Prepend("Anti"); | |
608 | ||
609 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_PtY"))->Fill(simY, simPt); | |
610 | ||
611 | if(TMath::Abs(simY) < fMaxY) | |
612 | { | |
613 | ((TH2D*)fHistoMap->Get(simparticle + "_Response_Matrix"))->Fill(pt, simPt); | |
614 | ||
615 | if(iParticle->IsPhysicalPrimary()) | |
616 | { | |
617 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Ntrk"))->Fill(fNtrk); | |
618 | } | |
619 | ||
620 | // for pid | |
621 | if(!this->IsFakeTrack(iTrack)) | |
622 | { | |
623 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Pt"))->Fill(simPt); | |
624 | ||
625 | if(iParticle->IsPhysicalPrimary()) // the efficiency is calculated on the primaries | |
626 | { | |
627 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Prim_Pt"))->Fill(simPt); | |
628 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Prim_Y"))->Fill(simY); | |
629 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Prim_Phi"))->Fill(simPhi); | |
630 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Prim_Rec_Pt"))->Fill(pt); | |
631 | ||
632 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_Prim_DCAxy_Pt"))->Fill(simPt,dcaxy); | |
633 | ||
634 | ((TH2D*)fHistoMap->Get(simparticle + "_Prim_Response_Matrix"))->Fill(pt, simPt); | |
635 | ||
636 | ((TH2D*)fHistoMap->Get(simparticle + "_Prim_DiffPt_RecPt"))->Fill(pt,simPt-pt); | |
637 | ||
638 | if( fTrackCuts->TOFmatch() ) | |
639 | { | |
640 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_Prim_M2_P"))->Fill(pTOF, m2); | |
641 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_Prim_M2_Pt"))->Fill(pt, m2); | |
642 | } | |
643 | } | |
644 | else if(iParticle->IsSecondaryFromWeakDecay()) | |
645 | { | |
646 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Fdwn_Pt"))->Fill(simPt); | |
647 | ||
648 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_Fdwn_DCAxy_Pt"))->Fill(simPt,dcaxy); | |
649 | } | |
650 | else | |
651 | { | |
652 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Mat_Pt"))->Fill(simPt); | |
653 | ||
654 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_Mat_DCAxy_Pt"))->Fill(simPt,dcaxy); | |
655 | } | |
656 | } | |
657 | else // fake tracks | |
658 | { | |
659 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Fake_Pt"))->Fill(simPt); | |
660 | if(iParticle->IsPhysicalPrimary()) | |
661 | { | |
662 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Fake_Prim_Pt"))->Fill(simPt); | |
663 | } | |
664 | else if(iParticle->IsSecondaryFromWeakDecay()) | |
665 | { | |
666 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Fake_Fdwn_Pt"))->Fill(simPt); | |
667 | } | |
668 | else | |
669 | { | |
670 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Fake_Mat_Pt"))->Fill(simPt); | |
671 | } | |
672 | } | |
673 | } | |
674 | } | |
368c671a | 675 | |
676 | // pid table for prior probabilities (only Bayes) | |
677 | ||
9e44412b | 678 | Int_t sim = (simpid > AliPID::kProton) ? simpid - offset : simpid; |
679 | Int_t rec = (pid > AliPID::kProton) ? pid - offset : pid; | |
680 | ||
681 | if((sim > -1) && (rec > -1)) // pid performance | |
682 | { | |
683 | ((TH2D*)fHistoMap->Get(fSpecies + "_Stats_PID_Table"))->Fill(sim, rec); | |
684 | ((TH2D*)fHistoMap->Get(fSpecies + "_Stats_PID_Table"))->Fill(9, rec); | |
685 | } | |
686 | if(sim > -1) | |
687 | { | |
688 | ((TH2D*)fHistoMap->Get(fSpecies + "_Stats_PID_Table"))->Fill(sim, 9); | |
689 | } | |
690 | } | |
691 | ||
368c671a | 692 | // candidate tracks |
9e44412b | 693 | |
694 | if(pid != fPartCode) continue; | |
695 | ||
9e44412b | 696 | Bool_t goodPid = 0; |
697 | ||
698 | if(fSimulation) | |
699 | { | |
700 | goodPid = ( simpid == pid ); | |
701 | } | |
702 | ||
703 | ((TH2D*)fHistoMap->Get(particle + "_PID_Ntrk_pTPC"))->Fill(pTPC,fNtrk); | |
704 | ((TH2D*)fHistoMap->Get(particle + "_PID_Zmult_pTPC"))->Fill(pTPC,fKNOmult); | |
705 | ||
706 | // pid performance | |
707 | ((TH2D*)fHistoMap->Get(particle + "_PID_ITSdEdx_P"))->Fill(pITS, dEdxITS); | |
708 | ((TH2D*)fHistoMap->Get(particle + "_PID_TPCdEdx_P"))->Fill(pTPC, dEdxTPC); | |
709 | ||
710 | if(fTrackCuts->TOFmatch()) | |
711 | { | |
712 | ((TH2D*)fHistoMap->Get(particle + "_PID_Beta_P"))->Fill(pTOF, beta); | |
713 | ((TH2D*)fHistoMap->Get(particle + "_PID_Mass_P"))->Fill(pTOF, mass); | |
714 | if(fSimulation && goodPid) | |
715 | { | |
716 | ((TH1D*)fHistoMap->Get(particle + "_Sim_PID_Mass"))->Fill(mass); | |
717 | } | |
718 | } | |
719 | ||
9e44412b | 720 | Double_t y = this->GetRapidity(p, pz, AliPID::ParticleMass(fPartCode)); |
721 | ||
722 | ((TH1D*)fHistoMap->Get(particle + "_PID_Y"))->Fill(y); | |
723 | ((TH2D*)fHistoMap->Get(particle + "_PID_Pt_Y"))->Fill(y, pt); | |
724 | ||
368c671a | 725 | // results in |y| < fMaxY |
726 | ||
9e44412b | 727 | if(TMath::Abs(y) >= fMaxY) continue; |
728 | ||
729 | ((TH1D*)fHistoMap->Get(particle + "_PID_Pt"))->Fill(pt); | |
730 | ((TH1D*)fHistoMap->Get(particle + "_PID_Phi"))->Fill(phi); | |
731 | ||
732 | if(iTrack->IsOn(AliAODTrack::kTRDin)) | |
733 | { | |
734 | ((TH1D*)fHistoMap->Get(particle + "_PID_TRDin_Pt"))->Fill(pt); | |
735 | ||
736 | if(iTrack->IsOn(AliAODTrack::kTRDout)) ((TH1D*)fHistoMap->Get(particle + "_PID_TRDin_TRDout_Pt"))->Fill(pt); | |
737 | if(iTrack->IsOn(AliAODTrack::kTOFout)) ((TH1D*)fHistoMap->Get(particle + "_PID_TRDin_TOFout_Pt"))->Fill(pt); | |
738 | } | |
739 | ||
740 | if(iTrack->IsOn(AliAODTrack::kTOFin)) | |
741 | { | |
742 | ((TH1D*)fHistoMap->Get(particle + "_PID_TOFin_Pt"))->Fill(pt); | |
743 | ||
744 | if(iTrack->IsOn(AliAODTrack::kTOFout)) ((TH1D*)fHistoMap->Get(particle + "_PID_TOFin_TOFout_Pt"))->Fill(pt); | |
745 | } | |
746 | ||
747 | if(fTrackCuts->TOFmatch()) | |
748 | { | |
749 | Double_t dm2 = this->GetM2Difference(beta, p, AliPID::ParticleMass(fPartCode)); | |
750 | Double_t t = iTrack->GetTOFsignal()*1.e-3; // ns | |
751 | Double_t dt = t - this->GetExpectedTime(iTrack, AliPID::ParticleMass(fPartCode))*1.e-3; | |
752 | ||
753 | ((TH2D*)fHistoMap->Get(particle + "_PID_M2_Pt"))->Fill(pt, m2); | |
754 | ((TH2D*)fHistoMap->Get(particle + "_PID_DM2_Pt"))->Fill(pt, dm2); | |
755 | ((TH2D*)fHistoMap->Get(particle + "_PID_Time_Pt"))->Fill(pt, t); | |
756 | ((TH2D*)fHistoMap->Get(particle + "_PID_DTime_Pt"))->Fill(pt, dt); | |
757 | ((TH1D*)fHistoMap->Get(particle + "_PID_TOFmatch_Pt"))->Fill(pt); | |
758 | } | |
759 | ||
760 | // secondaries | |
761 | ||
762 | Bool_t m2match = kTRUE; | |
763 | ||
764 | if( fTrackCuts->TOFmatch() && (fLnID->GetPidProcedure() > AliLnID::kMaxLikelihood)) | |
765 | { | |
766 | if ((m2 < fMinM2) || (m2 >= fMaxM2)) m2match = kFALSE; | |
767 | } | |
768 | ||
769 | if(m2match) | |
770 | { | |
771 | ((TH2D*)fHistoMap->Get(particle + "_PID_DCAxy_Pt"))->Fill(pt, dcaxy); | |
772 | ((TH2D*)fHistoMap->Get(particle + "_PID_DCAz_Pt"))->Fill(pt, dcaz); | |
773 | ((TH2D*)fHistoMap->Get(particle + "_PID_NSigma_Pt"))->Fill(pt, nSigmaVtx); | |
774 | } | |
775 | ||
776 | if(fSimulation && goodPid) | |
777 | { | |
778 | // for unfolding and pid contamination | |
779 | if(!this->IsFakeTrack(iTrack)) | |
780 | { | |
781 | ((TH1D*)fHistoMap->Get(particle + "_Sim_PID_Pt"))->Fill(simPt); | |
782 | ||
783 | if( fTrackCuts->TOFmatch() ) | |
784 | { | |
785 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_M2_Pt"))->Fill(pt, m2); | |
786 | } | |
787 | ||
788 | if(iParticle->IsPhysicalPrimary()) | |
789 | { | |
790 | ((TH1D*)fHistoMap->Get(particle + "_Sim_PID_Prim_Pt"))->Fill(simPt); | |
791 | } | |
792 | ||
793 | if(m2match) | |
794 | { | |
795 | if(iParticle->IsPhysicalPrimary()) | |
796 | { | |
797 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Prim_DCAxy_Pt"))->Fill(pt, dcaxy); | |
798 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Prim_DCAz_Pt"))->Fill(pt, dcaz); | |
799 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Prim_NSigma_Pt"))->Fill(pt, nSigmaVtx); | |
800 | } | |
801 | else if(iParticle->IsSecondaryFromWeakDecay()) | |
802 | { | |
803 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fdwn_DCAxy_Pt"))->Fill(pt, dcaxy); | |
804 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fdwn_DCAz_Pt"))->Fill(pt, dcaz); | |
805 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fdwn_NSigma_Pt"))->Fill(pt, nSigmaVtx); | |
806 | } | |
807 | else // from materials | |
808 | { | |
809 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Mat_DCAxy_Pt"))->Fill(pt, dcaxy); | |
810 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Mat_DCAz_Pt"))->Fill(pt, dcaz); | |
811 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Mat_NSigma_Pt"))->Fill(pt, nSigmaVtx); | |
812 | } | |
813 | } | |
814 | } | |
815 | else // fake tracks | |
816 | { | |
817 | ((TH1D*)fHistoMap->Get(particle + "_Sim_PID_Fake_Pt"))->Fill(simPt); | |
818 | ||
819 | if(m2match) | |
820 | { | |
821 | if(iParticle->IsPhysicalPrimary()) | |
822 | { | |
823 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fake_Prim_DCAxy_Pt"))->Fill(pt, dcaxy); | |
824 | } | |
825 | else if(iParticle->IsSecondaryFromWeakDecay()) | |
826 | { | |
827 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fake_Fdwn_DCAxy_Pt"))->Fill(pt, dcaxy); | |
828 | } | |
829 | else // from materials | |
830 | { | |
831 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fake_Mat_DCAxy_Pt"))->Fill(pt, dcaxy); | |
832 | } | |
833 | } | |
834 | } | |
835 | } | |
836 | } | |
837 | ||
838 | return nTracks; | |
839 | } | |
840 | ||
841 | void AliAnalysisTaskB2AOD::Terminate(Option_t* ) | |
842 | { | |
843 | // The Terminate() function is the last function to be called during | |
844 | // a query. It always runs on the client, it can be used to present | |
845 | // the results graphically or save the results to file. | |
846 | ||
847 | } | |
848 | ||
849 | Bool_t AliAnalysisTaskB2AOD::IsV0AND(UInt_t /*triggerBits*/) const | |
850 | { | |
851 | // | |
852 | // signals in both V0A and V0C | |
853 | // | |
854 | //return ( (triggerBits&AliVEvent::kINT7) == AliVEvent::kINT7 ); | |
855 | ||
856 | AliAODVZERO* vzero = fAODevent->GetVZEROData(); | |
857 | if(vzero == 0) return kFALSE; | |
858 | ||
859 | if(!vzero->TestBit(AliAODVZERO::kDecisionFilled)) return kFALSE; | |
860 | ||
861 | return ( (vzero->GetV0ADecision() == AliVVZERO::kV0BB) && (vzero->GetV0CDecision() == AliVVZERO::kV0BB) ); | |
862 | } | |
863 | ||
864 | Bool_t AliAnalysisTaskB2AOD::IsFastOnly(UInt_t triggerBits) const | |
865 | { | |
866 | // | |
867 | // kFastOnly trigger | |
868 | // | |
869 | return ( (triggerBits&AliVEvent::kFastOnly) == AliVEvent::kFastOnly ); | |
870 | } | |
871 | ||
872 | Bool_t AliAnalysisTaskB2AOD::IsMB(UInt_t triggerBits) const | |
873 | { | |
874 | // | |
875 | // MB event | |
876 | // | |
877 | return ( (triggerBits&AliVEvent::kMB) == AliVEvent::kMB ); | |
878 | } | |
879 | ||
880 | AliAODMCParticle* AliAnalysisTaskB2AOD::GetParticle(const AliAODTrack* trk) const | |
881 | { | |
882 | // | |
883 | // Particle that left the track | |
884 | // | |
885 | TList* lst = fAODevent->GetList(); | |
886 | TClonesArray* lop = dynamic_cast<TClonesArray*>(lst->FindObject(AliAODMCParticle::StdBranchName())); | |
887 | ||
888 | if (!lop) return 0; | |
889 | ||
890 | Int_t label = TMath::Abs(trk->GetLabel()); // if negative then it shares points from other tracks | |
891 | if( label >= lop->GetEntries() ) return 0; | |
892 | ||
893 | return dynamic_cast<AliAODMCParticle*>(lop->At(label)); | |
894 | } | |
895 | ||
896 | Bool_t AliAnalysisTaskB2AOD::IsFakeTrack(const AliAODTrack* trk) const | |
897 | { | |
898 | // | |
899 | // Check if the track shares some clusters with different particles | |
900 | // (definition changed to label=0? ) | |
901 | // | |
902 | return ( trk->GetLabel() < 0 ); | |
903 | } | |
904 | ||
905 | Double_t AliAnalysisTaskB2AOD::GetPhi(Double_t p[3]) const | |
906 | { | |
907 | // | |
908 | // Azimuthal angle [0,2pi) | |
909 | // | |
910 | Double_t px = p[0]; | |
911 | Double_t py = p[1]; | |
912 | ||
913 | return TMath::Pi()+TMath::ATan2(-py, -px); | |
914 | } | |
915 | ||
916 | Double_t AliAnalysisTaskB2AOD::GetBeta(const AliAODTrack* trk) const | |
917 | { | |
918 | // | |
919 | // Velocity | |
920 | // | |
921 | Double_t t = trk->GetTOFsignal(); // ps | |
922 | Double_t l = fTrackCuts->GetIntegratedLength(trk, fPartCode); // cm | |
923 | ||
924 | if(t <= 0) return 1.e+6; // 1M times the speed of light ;) | |
925 | ||
926 | return (l/t)/2.99792458e-2; | |
927 | } | |
928 | ||
929 | Double_t AliAnalysisTaskB2AOD::GetExpectedTime(const AliAODTrack* trk, Double_t m) const | |
930 | { | |
931 | // | |
932 | // Expected time workaround for the given mass hypothesis (ps) | |
933 | // | |
934 | Double_t p = (fPartCode > AliPID::kTriton) ? 2.*trk->P() : trk->P(); | |
935 | Double_t beta = p/TMath::Sqrt(p*p + m*m); | |
936 | Double_t l = fTrackCuts->GetIntegratedLength(trk, fPartCode); | |
937 | ||
938 | return l/beta/2.99792458e-2; | |
939 | } | |
940 | ||
941 | Double_t AliAnalysisTaskB2AOD::GetMassSquared(Double_t p, Double_t beta) const | |
942 | { | |
943 | // | |
944 | // Mass squared | |
945 | // | |
946 | return p*p*(1./(beta*beta) - 1.); | |
947 | } | |
948 | ||
949 | Double_t AliAnalysisTaskB2AOD::GetM2Difference(Double_t beta, Double_t p, Double_t m) const | |
950 | { | |
951 | // | |
952 | // Mass squared difference | |
953 | // | |
954 | Double_t expBeta2 = p*p/(p*p+m*m); | |
955 | ||
956 | return p*p*(1./(beta*beta)-1./expBeta2); | |
957 | } | |
958 | ||
959 | Int_t AliAnalysisTaskB2AOD::GetChargedMultiplicity(Double_t etaMax) const | |
960 | { | |
961 | // | |
962 | // Charged particle multiplicity using ALICE physical primary definition | |
963 | // | |
964 | TList* lst = fAODevent->GetList(); | |
965 | TClonesArray* lop = dynamic_cast<TClonesArray*>(lst->FindObject(AliAODMCParticle::StdBranchName())); | |
966 | ||
967 | if (!lop) return 0; | |
968 | ||
969 | Int_t nch = 0; | |
970 | ||
971 | for (Int_t i = 0; i < lop->GetEntries(); ++i) | |
972 | { | |
973 | AliAODMCParticle* iParticle = dynamic_cast<AliAODMCParticle*>(lop->At(i)); | |
974 | ||
975 | if(!iParticle) continue; | |
976 | ||
977 | if(!iParticle->IsPhysicalPrimary()) continue; | |
978 | ||
979 | if(TMath::Abs(iParticle->Eta()) >= etaMax) continue; | |
980 | ||
981 | if(iParticle->Charge()==0) continue; | |
982 | ||
983 | ++nch; | |
984 | } | |
985 | ||
986 | return nch; | |
987 | } | |
988 | ||
989 | Int_t AliAnalysisTaskB2AOD::GetITSnClusters(const AliAODTrack* trk) const | |
990 | { | |
991 | // | |
992 | // ITS number of clusters | |
993 | // | |
994 | UChar_t map = trk->GetITSClusterMap(); | |
995 | ||
996 | Int_t npoints=0; | |
997 | for(Int_t j=0; j<6; j++) | |
998 | { | |
999 | if(map&(1<<j)) ++npoints; | |
1000 | } | |
1001 | ||
1002 | return npoints; | |
1003 | } | |
1004 | ||
1005 | Int_t AliAnalysisTaskB2AOD::GetITSnPointsPID(const AliAODTrack* trk) const | |
1006 | { | |
1007 | // | |
1008 | // ITS number of points for PID | |
1009 | // | |
1010 | UChar_t map = trk->GetITSClusterMap(); | |
1011 | ||
1012 | Int_t npoints = 0; | |
1013 | for(Int_t j=2; j<6; j++) | |
1014 | { | |
1015 | if(map&(1<<j)) ++npoints; | |
1016 | } | |
1017 | ||
1018 | return npoints; | |
1019 | } | |
1020 | ||
1021 | Int_t AliAnalysisTaskB2AOD::GetPidCode(const TString& species) const | |
1022 | { | |
1023 | // | |
1024 | // Return AliPID code of the given species | |
1025 | // | |
1026 | TString name = species; | |
1027 | name.ToLower(); | |
1028 | ||
1029 | if(name == "electron") return AliPID::kElectron; | |
1030 | if(name == "muon") return AliPID::kMuon; | |
1031 | if(name == "pion") return AliPID::kPion; | |
1032 | if(name == "kaon") return AliPID::kKaon; | |
1033 | if(name == "proton") return AliPID::kProton; | |
1034 | if(name == "deuteron") return AliPID::kDeuteron; | |
1035 | if(name == "triton") return AliPID::kTriton; | |
1036 | if(name == "he3") return AliPID::kHe3; | |
1037 | if(name == "alpha") return AliPID::kAlpha; | |
1038 | ||
1039 | return -1; | |
1040 | } | |
1041 | ||
1042 | Double_t AliAnalysisTaskB2AOD::GetMomentumCorrection(Double_t ptrec) const | |
1043 | { | |
1044 | // | |
1045 | // momentum correction for low pt | |
1046 | // | |
1047 | if(fMoCpfx == 0) return 0; | |
1048 | ||
1049 | return fMoCpfx->Interpolate(ptrec); | |
1050 | } | |
1051 | ||
1052 | Double_t AliAnalysisTaskB2AOD::GetRapidity(Double_t p, Double_t pz, Double_t m) const | |
1053 | { | |
1054 | // | |
1055 | // Rapidity | |
1056 | // | |
1057 | Double_t e = TMath::Sqrt(p*p + m*m); | |
1058 | ||
1059 | if(e <= pz) return 1.e+16; | |
1060 | ||
1061 | return 0.5*TMath::Log( (e+pz)/(e-pz) ); | |
1062 | } |