]>
Commit | Line | Data |
---|---|---|
6b91e8c0 | 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 | |
17 | // author: Eulogio Serradilla <eulogio.serradilla@cern.ch> | |
18 | ||
19 | #include <Riostream.h> | |
20 | #include <TTree.h> | |
21 | #include <TChain.h> | |
22 | #include <TString.h> | |
23 | ||
24 | #include <AliLog.h> | |
25 | ||
26 | #include <AliAnalysisTask.h> | |
27 | #include <AliAnalysisManager.h> | |
28 | ||
29 | #include <AliESD.h> | |
30 | #include <AliESDEvent.h> | |
31 | #include <AliESDInputHandler.h> | |
32 | #include <AliESDtrackCuts.h> | |
33 | #include <AliExternalTrackParam.h> | |
34 | ||
35 | #include <AliMCEvent.h> | |
36 | #include <AliMCEventHandler.h> | |
37 | #include <AliMCVertex.h> | |
38 | #include <AliStack.h> | |
39 | #include <TParticle.h> | |
40 | #include <TParticlePDG.h> | |
41 | #include <TMCProcess.h> | |
42 | ||
43 | #include <AliTriggerAnalysis.h> // for offline signals | |
44 | #include <AliCentrality.h> | |
45 | #include <AliESDUtils.h> | |
46 | ||
47 | #include <AliESDpid.h> | |
48 | ||
49 | #include <TH1D.h> | |
50 | #include <TH2D.h> | |
68a84436 | 51 | #include <TList.h> |
2b4e5f2c | 52 | #include <TProfile.h> |
6b91e8c0 | 53 | |
54 | #include "AliLnID.h" | |
55 | #include "AliLnHistoMap.h" | |
56 | #include "AliAnalysisTaskB2.h" | |
57 | ||
58 | ClassImp(AliAnalysisTaskB2) | |
59 | ||
60 | AliAnalysisTaskB2::AliAnalysisTaskB2() | |
61 | : AliAnalysisTask() | |
62 | , fSpecies("Proton") | |
63 | , fPartCode(AliPID::kProton) | |
6b91e8c0 | 64 | , fHeavyIons(0) |
65 | , fSimulation(0) | |
dc8b5f72 | 66 | , fMultTriggerFired(0) |
67 | , fCentTriggerFired(0) | |
6b91e8c0 | 68 | , fTriggerFired(0) |
69 | , fGoodVertex(0) | |
70 | , fPileUpEvent(0) | |
6b91e8c0 | 71 | , fV0AND(0) |
72 | , fNoFastOnly(0) | |
dc8b5f72 | 73 | , fNtrkMultTrigger(0) |
6b91e8c0 | 74 | , fMinKNOmult(-10) |
75 | , fMaxKNOmult(100000) | |
76 | , fMinCentrality(0) | |
77 | , fMaxCentrality(100) | |
ec499c6d | 78 | , fNch(0) |
6b91e8c0 | 79 | , fNtrk(0) |
80 | , fMeanNtrk(1) | |
81 | , fKNOmult(1) | |
6b91e8c0 | 82 | , fMinVx(-1) |
83 | , fMaxVx(1) | |
84 | , fMinVy(-1) | |
85 | , fMaxVy(1) | |
86 | , fMinVz(-10) | |
87 | , fMaxVz(10) | |
6b91e8c0 | 88 | , fMinDCAxy(-1) |
89 | , fMaxDCAxy(1) | |
90 | , fMinDCAz(-2) | |
91 | , fMaxDCAz(2) | |
92 | , fMaxNSigma(3) | |
6b91e8c0 | 93 | , fMinEta(-0.8) |
94 | , fMaxEta(0.8) | |
95 | , fMinY(-0.5) | |
96 | , fMaxY(0.5) | |
6b91e8c0 | 97 | , fMCevent(0) |
98 | , fESDevent(0) | |
68a84436 | 99 | , fOutputContainer(0) |
6b91e8c0 | 100 | , fHistoMap(0) |
101 | , fESDtrackCuts(0) | |
102 | , fLnID(0) | |
6b91e8c0 | 103 | , fMaxNSigmaITS(3) |
104 | , fMaxNSigmaTPC(3) | |
105 | , fMaxNSigmaTOF(3) | |
6b91e8c0 | 106 | , fTrigAna(0) |
107 | , fESDpid(0) | |
108 | , fIsPidOwner(0) | |
109 | , fTimeZeroType(AliESDpid::kTOF_T0) | |
110 | , fTOFmatch(0) | |
1cb68411 | 111 | , fMinM2(2.) |
112 | , fMaxM2(6.) | |
2b4e5f2c | 113 | , fMomentumCorrection(0) |
114 | , fMoCpfx(0) | |
6b91e8c0 | 115 | |
116 | { | |
117 | // | |
118 | // Default constructor | |
119 | // | |
120 | AliLog::SetGlobalLogLevel(AliLog::kFatal); | |
121 | ||
122 | fTrigAna = new AliTriggerAnalysis(); | |
123 | } | |
124 | ||
125 | AliAnalysisTaskB2::AliAnalysisTaskB2(const char* name) | |
126 | : AliAnalysisTask(name,"") | |
127 | , fSpecies("Proton") | |
128 | , fPartCode(AliPID::kProton) | |
6b91e8c0 | 129 | , fHeavyIons(0) |
130 | , fSimulation(0) | |
dc8b5f72 | 131 | , fMultTriggerFired(0) |
132 | , fCentTriggerFired(0) | |
6b91e8c0 | 133 | , fTriggerFired(0) |
134 | , fGoodVertex(0) | |
135 | , fPileUpEvent(0) | |
6b91e8c0 | 136 | , fV0AND(0) |
137 | , fNoFastOnly(0) | |
dc8b5f72 | 138 | , fNtrkMultTrigger(0) |
6b91e8c0 | 139 | , fMinKNOmult(-10) |
140 | , fMaxKNOmult(100000) | |
141 | , fMinCentrality(-1) | |
142 | , fMaxCentrality(100) | |
b9e8e52e | 143 | , fNch(0) |
6b91e8c0 | 144 | , fNtrk(0) |
145 | , fMeanNtrk(1) | |
146 | , fKNOmult(1) | |
6b91e8c0 | 147 | , fMinVx(-1) |
148 | , fMaxVx(1) | |
149 | , fMinVy(-1) | |
150 | , fMaxVy(1) | |
151 | , fMinVz(-10) | |
152 | , fMaxVz(10) | |
6b91e8c0 | 153 | , fMinDCAxy(-1) |
154 | , fMaxDCAxy(1) | |
155 | , fMinDCAz(-2) | |
156 | , fMaxDCAz(2) | |
157 | , fMaxNSigma(3) | |
6b91e8c0 | 158 | , fMinEta(-0.8) |
159 | , fMaxEta(0.8) | |
160 | , fMinY(-0.5) | |
161 | , fMaxY(0.5) | |
6b91e8c0 | 162 | , fMCevent(0) |
163 | , fESDevent(0) | |
68a84436 | 164 | , fOutputContainer(0) |
6b91e8c0 | 165 | , fHistoMap(0) |
166 | , fESDtrackCuts(0) | |
167 | , fLnID(0) | |
6b91e8c0 | 168 | , fMaxNSigmaITS(3) |
169 | , fMaxNSigmaTPC(3) | |
170 | , fMaxNSigmaTOF(3) | |
6b91e8c0 | 171 | , fTrigAna(0) |
172 | , fESDpid(0) | |
173 | , fIsPidOwner(0) | |
174 | , fTimeZeroType(AliESDpid::kTOF_T0) | |
175 | , fTOFmatch(0) | |
1cb68411 | 176 | , fMinM2(2.) |
177 | , fMaxM2(6.) | |
2b4e5f2c | 178 | , fMomentumCorrection(0) |
179 | , fMoCpfx(0) | |
6b91e8c0 | 180 | |
181 | { | |
182 | // | |
183 | // Constructor | |
184 | // | |
185 | DefineInput(0, TChain::Class()); | |
b2c24401 | 186 | DefineOutput(0, TTree::Class()); |
187 | DefineOutput(1, TList::Class()); | |
6b91e8c0 | 188 | |
189 | //kFatal, kError, kWarning, kInfo, kDebug, kMaxType | |
190 | AliLog::SetGlobalLogLevel(AliLog::kFatal); | |
191 | ||
192 | fTrigAna = new AliTriggerAnalysis(); | |
193 | } | |
194 | ||
195 | void AliAnalysisTaskB2::ConnectInputData(Option_t *) | |
196 | { | |
197 | // | |
198 | // Connect input data | |
199 | // | |
6b91e8c0 | 200 | TTree* tree = dynamic_cast<TTree*> (GetInputData(0)); |
201 | if(!tree) | |
202 | { | |
f20bd9a4 | 203 | this->Error("ConnectInputData", "could not read chain from input slot 0"); |
6b91e8c0 | 204 | return; |
205 | } | |
206 | ||
207 | // Get the pointer to the existing analysis manager via the static access method. | |
208 | AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager(); | |
209 | if (!mgr) | |
210 | { | |
f20bd9a4 | 211 | this->Error("ConnectInputData", "could not get analysis manager"); |
6b91e8c0 | 212 | return; |
213 | } | |
214 | ||
215 | // cast type AliVEventHandler | |
216 | AliESDInputHandler* esdH = dynamic_cast<AliESDInputHandler*>(mgr->GetInputEventHandler()); | |
217 | if (!esdH) | |
218 | { | |
f20bd9a4 | 219 | this->Error("ConnectInputData", "could not get ESDInputHandler"); |
6b91e8c0 | 220 | return; |
221 | } | |
222 | ||
223 | // Get pointer to esd event from input handler | |
224 | fESDevent = esdH->GetEvent(); | |
225 | ||
226 | // PID object for TOF | |
227 | fESDpid = esdH->GetESDpid(); | |
228 | ||
229 | if(!fESDpid) | |
230 | { //in case of no Tender attached | |
231 | fESDpid = new AliESDpid(); | |
232 | fIsPidOwner = kTRUE; | |
233 | } | |
6b91e8c0 | 234 | } |
235 | ||
236 | void AliAnalysisTaskB2::CreateOutputObjects() | |
237 | { | |
238 | // | |
239 | // Create output objects | |
240 | // | |
241 | if(fHistoMap == 0) exit(1); // should be created somewhere else | |
242 | ||
68a84436 | 243 | fOutputContainer = new TList(); |
05798e84 | 244 | fOutputContainer->SetOwner(kTRUE); |
68a84436 | 245 | |
246 | TObjString* key; | |
247 | TIter iter(fHistoMap->GetMap()); | |
248 | while((key = (TObjString*)iter.Next())) fOutputContainer->Add((TH1*)fHistoMap->Get(key)); | |
249 | ||
b2c24401 | 250 | PostData(1, fOutputContainer); |
6b91e8c0 | 251 | } |
252 | ||
253 | AliAnalysisTaskB2::~AliAnalysisTaskB2() | |
254 | { | |
255 | // | |
256 | // Default destructor | |
257 | // | |
258 | delete fHistoMap; | |
68a84436 | 259 | delete fOutputContainer; |
6b91e8c0 | 260 | delete fESDtrackCuts; |
261 | delete fLnID; | |
262 | ||
263 | delete fTrigAna; | |
264 | ||
265 | if(fIsPidOwner) delete fESDpid; | |
2b4e5f2c | 266 | |
267 | delete fMoCpfx; | |
6b91e8c0 | 268 | } |
269 | ||
270 | void AliAnalysisTaskB2::SetParticleSpecies(const TString& species) | |
271 | { | |
272 | // | |
273 | // set the particle species and the AliPID code | |
274 | // | |
275 | fSpecies = species; | |
276 | fPartCode = this->GetPidCode(species); | |
277 | } | |
278 | ||
279 | void AliAnalysisTaskB2::Exec(Option_t* ) | |
280 | { | |
281 | // | |
282 | // Execute analysis for the current event | |
283 | // | |
f20bd9a4 | 284 | if(fESDevent == 0) |
6b91e8c0 | 285 | { |
f20bd9a4 | 286 | this->Error("Exec", "AliESDEvent not available"); |
6b91e8c0 | 287 | return; |
288 | } | |
289 | ||
290 | if(fESDtrackCuts == 0) | |
291 | { | |
f20bd9a4 | 292 | this->Error("Exec", "ESD track cuts not set"); |
6b91e8c0 | 293 | return; |
294 | } | |
295 | ||
296 | if(fLnID == 0) | |
297 | { | |
f20bd9a4 | 298 | this->Error("Exec", "PID not set"); |
6b91e8c0 | 299 | return; |
300 | } | |
301 | ||
87ed2a3a | 302 | if(fSimulation) |
303 | { | |
304 | AliMCEventHandler* mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()); | |
305 | ||
306 | if(mcH == 0) return; | |
307 | ||
308 | fMCevent = mcH->MCEvent(); | |
309 | ||
310 | if(fMCevent == 0) return; | |
311 | } | |
312 | ||
6b91e8c0 | 313 | // --------- multiplicity and centrality ------------------ |
314 | ||
68a84436 | 315 | fNtrk = AliESDtrackCuts::GetReferenceMultiplicity(fESDevent, AliESDtrackCuts::kTrackletsITSTPC, fMaxEta); |
316 | if(fSimulation) fNch = this->GetChargedMultiplicity(fMaxEta); | |
6b91e8c0 | 317 | |
6b91e8c0 | 318 | fKNOmult = fNtrk/fMeanNtrk; |
319 | ||
1a9524cf | 320 | ((TH1D*)fHistoMap->Get(fSpecies + "_Event_Ntrk"))->Fill(fNtrk); |
321 | ((TH1D*)fHistoMap->Get(fSpecies + "_Event_Zmult"))->Fill(fKNOmult); | |
322 | ||
dc8b5f72 | 323 | fMultTriggerFired = (fNtrk > 0) && (fKNOmult >= fMinKNOmult) && (fKNOmult < fMaxKNOmult); |
6b91e8c0 | 324 | |
325 | if(fHeavyIons) | |
326 | { | |
327 | AliCentrality* esdCent = fESDevent->GetCentrality(); | |
328 | ||
329 | Float_t centrality = esdCent->GetCentralityPercentile("V0M"); | |
330 | ||
dc8b5f72 | 331 | fCentTriggerFired = (centrality >= fMinCentrality) && (centrality < fMaxCentrality); |
6b91e8c0 | 332 | |
333 | Float_t v0ScaMult; | |
334 | Float_t v0Mult = AliESDUtils::GetCorrV0(fESDevent,v0ScaMult); | |
335 | ||
336 | ((TH1D*)fHistoMap->Get(fSpecies + "_V0_Mult"))->Fill(v0Mult); | |
337 | ((TH1D*)fHistoMap->Get(fSpecies + "_V0_Scaled_Mult"))->Fill(v0ScaMult); | |
338 | } | |
339 | ||
340 | // ----------------- trigger -------------------- | |
341 | ||
2e693567 | 342 | AliInputEventHandler* eventH = dynamic_cast<AliInputEventHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()); |
343 | if(eventH == 0) | |
344 | { | |
f20bd9a4 | 345 | this->Error("Exec", "could not get AliInputEventHandler"); |
2e693567 | 346 | return; |
347 | } | |
348 | ||
349 | UInt_t triggerBits = eventH->IsEventSelected(); | |
6b91e8c0 | 350 | |
351 | if(fHeavyIons) | |
352 | { | |
dc8b5f72 | 353 | fTriggerFired = ( this->IsMB(triggerBits) && fCentTriggerFired ); |
6b91e8c0 | 354 | } |
355 | else | |
356 | { | |
357 | fTriggerFired = this->IsMB(triggerBits); | |
dc8b5f72 | 358 | if(fNoFastOnly) fTriggerFired = ( fTriggerFired && !this->IsFastOnly(triggerBits) ); |
359 | if(fV0AND) fTriggerFired = ( fTriggerFired && this->IsV0AND() ); | |
360 | if(fNtrkMultTrigger) fTriggerFired = ( fTriggerFired && fMultTriggerFired ); | |
6b91e8c0 | 361 | } |
362 | ||
363 | // --------------------- vertex -------------- | |
364 | ||
dc8b5f72 | 365 | fGoodVertex = kFALSE; |
366 | ||
6b91e8c0 | 367 | const AliESDVertex* vtx = fESDevent->GetPrimaryVertex(); // best primary vertex |
368 | ||
369 | if(vtx->GetStatus()) | |
370 | { | |
371 | fGoodVertex=kTRUE; | |
372 | ||
373 | ((TH2D*)fHistoMap->Get(fSpecies + "_Vertex_YX"))->Fill(vtx->GetX(), vtx->GetY()); | |
374 | ((TH2D*)fHistoMap->Get(fSpecies + "_Vertex_YZ"))->Fill(vtx->GetZ(), vtx->GetY()); | |
375 | ((TH2D*)fHistoMap->Get(fSpecies + "_Vertex_XZ"))->Fill(vtx->GetZ(), vtx->GetX()); | |
376 | } | |
377 | ||
378 | if(fESDevent->GetPrimaryVertex()->IsFromVertexerZ()) | |
379 | { | |
380 | if(fESDevent->GetPrimaryVertex()->GetDispersion() > 0.02) fGoodVertex=kFALSE; | |
381 | if(fESDevent->GetPrimaryVertex()->GetZRes() > 0.25 ) fGoodVertex=kFALSE; | |
382 | } | |
383 | ||
384 | if( (vtx->GetX() <= fMinVx) || (vtx->GetX() >= fMaxVx) ) fGoodVertex=kFALSE; | |
385 | if( (vtx->GetY() <= fMinVy) || (vtx->GetY() >= fMaxVy) ) fGoodVertex=kFALSE; | |
386 | if( (vtx->GetZ() <= fMinVz) || (vtx->GetZ() >= fMaxVz) ) fGoodVertex=kFALSE; | |
387 | ||
388 | // -------------------- pile up ------------------ | |
389 | ||
dc8b5f72 | 390 | fPileUpEvent = fESDevent->IsPileupFromSPDInMultBins(); |
6b91e8c0 | 391 | |
392 | // ---------------- event stats ---------------- | |
393 | ||
394 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(0); // number of events | |
395 | ||
396 | if(fTriggerFired) | |
397 | { | |
f4d6dd11 | 398 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(1); // triggering events |
6b91e8c0 | 399 | |
400 | if(vtx->GetStatus()) | |
401 | { | |
f4d6dd11 | 402 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(3); // valid vertex within a triggering event |
6b91e8c0 | 403 | |
404 | if((vtx->GetZ() > fMinVz) && (vtx->GetZ() < fMaxVz)) | |
405 | { | |
406 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(4); // Vz | |
407 | ||
408 | if( (vtx->GetX() > fMinVx) && (vtx->GetX() < fMaxVx) | |
409 | && (vtx->GetY() > fMinVy) && (vtx->GetY() < fMaxVy)) | |
410 | { | |
411 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(5); // Vx, Vy | |
412 | ||
413 | if(fGoodVertex) | |
414 | { | |
415 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(6); // VertexerZ | |
416 | ||
417 | if(!fPileUpEvent) | |
418 | { | |
419 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(7); // no pile-up | |
420 | } | |
421 | } | |
422 | } | |
423 | } | |
424 | } | |
425 | } | |
426 | ||
427 | // ------------- Particles and tracks for this event --------------- | |
428 | ||
429 | Int_t nParticles = 0; | |
430 | if(fSimulation) | |
431 | { | |
432 | nParticles = this->GetParticles(); | |
433 | } | |
434 | ||
435 | this->GetTracks(); | |
436 | ||
437 | // Post the data (input/output slots #0 already used by the base class) | |
b2c24401 | 438 | PostData(1, fOutputContainer); |
6b91e8c0 | 439 | } |
440 | ||
441 | Int_t AliAnalysisTaskB2::GetParticles() | |
442 | { | |
443 | // | |
444 | // Get particles from current event | |
445 | // | |
77dac0a6 | 446 | Int_t nParticles = 0; |
6b91e8c0 | 447 | |
448 | AliStack* stack = fMCevent->Stack(); | |
449 | if (!stack) | |
450 | { | |
451 | AliDebug(AliLog::kWarning, "stack not available"); | |
452 | return 0; | |
453 | } | |
454 | ||
455 | for (Int_t i = 0; i < fMCevent->GetNumberOfTracks(); ++i) | |
456 | { | |
457 | TParticle* iParticle = stack->Particle(i); | |
458 | ||
459 | if(!iParticle) continue; | |
460 | ||
461 | Int_t pid = fLnID->GetPID(iParticle); | |
462 | ||
463 | if(pid != fPartCode) continue; | |
464 | ||
465 | // ------- physical primaries ------------ | |
466 | ||
467 | if(!stack->IsPhysicalPrimary(i)) continue; | |
468 | ||
469 | TString particle = fSpecies; | |
470 | if(iParticle->GetPDG()->Charge() < 0) particle.Prepend("Anti"); | |
471 | ||
472 | Double_t genP = iParticle->P(); | |
473 | Double_t genPt = iParticle->Pt(); | |
474 | Double_t genY = iParticle->Y(); | |
475 | Double_t genPhi = iParticle->Phi(); | |
476 | Double_t genEta = iParticle->Eta(); | |
477 | ||
ec499c6d | 478 | // ------- multiplicity and centrality ------------- |
479 | ||
dc8b5f72 | 480 | if( fHeavyIons && !fCentTriggerFired) continue; |
481 | if( fNtrkMultTrigger && !fMultTriggerFired) continue; | |
6b91e8c0 | 482 | |
483 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Prim_P"))->Fill(genP); | |
484 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Prim_Pt"))->Fill(genPt); | |
485 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Prim_Y"))->Fill(genY); | |
486 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Prim_Phi"))->Fill(genPhi); | |
487 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Prim_Eta"))->Fill(genEta); | |
488 | ((TH2D*)fHistoMap->Get(particle + "_Gen_Prim_PtY"))->Fill(genY, genPt); | |
489 | ((TH2D*)fHistoMap->Get(particle + "_Gen_Prim_EtaY"))->Fill(genY, genEta); | |
490 | ||
6b91e8c0 | 491 | // ------ is within phase space? ---------- |
492 | ||
493 | if(TMath::Abs(genY) >= fMaxY) continue; | |
494 | ||
ec499c6d | 495 | ((TH1D*)fHistoMap->Get(particle + "_Gen_PhS_Prim_P"))->Fill(genP); |
6b91e8c0 | 496 | ((TH1D*)fHistoMap->Get(particle + "_Gen_PhS_Prim_Pt"))->Fill(genPt); |
497 | ||
f4d6dd11 | 498 | // ------- is from a triggering event? (same as rec.) -------- |
6b91e8c0 | 499 | |
500 | if(!fTriggerFired) | |
501 | { | |
502 | ((TH1D*)fHistoMap->Get(particle + "_Gen_NoTrig_Prim_Pt"))->Fill(genPt); | |
503 | continue; | |
504 | } | |
505 | ||
506 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Trig_Prim_Pt"))->Fill(genPt); | |
507 | ||
f4d6dd11 | 508 | // ------- is from a triggering event with good vertex? ------------- |
6b91e8c0 | 509 | |
510 | if(!fESDevent->GetPrimaryVertex()->GetStatus()) | |
511 | { | |
512 | ((TH1D*)fHistoMap->Get(particle + "_Gen_NoVtx_Prim_Pt"))->Fill(genPt); | |
513 | } | |
514 | ||
515 | if(!fGoodVertex) continue; | |
516 | if(fPileUpEvent) continue; | |
517 | ||
ec499c6d | 518 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Nch"))->Fill(fNch); |
6b91e8c0 | 519 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Vtx_Prim_Pt"))->Fill(genPt); |
520 | ||
521 | // ------ is within the geometrical acceptance? ------------ | |
522 | ||
f4d6dd11 | 523 | if(TMath::Abs(genEta) >= fMaxEta) continue; |
6b91e8c0 | 524 | |
525 | ((TH2D*)fHistoMap->Get(particle + "_Gen_Acc_Prim_PtY"))->Fill(genY,genPt); | |
526 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Acc_Prim_P"))->Fill(genP); | |
527 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Acc_Prim_Pt"))->Fill(genPt); | |
528 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Acc_Prim_Phi"))->Fill(genPhi); | |
529 | ((TH1D*)fHistoMap->Get(particle + "_Gen_Acc_Prim_Y"))->Fill(genY); | |
530 | } | |
531 | ||
532 | return nParticles; | |
533 | } | |
534 | ||
535 | Int_t AliAnalysisTaskB2::GetTracks() | |
536 | { | |
537 | // | |
538 | // Get tracks from current event | |
539 | // | |
540 | using namespace std; | |
541 | ||
542 | Int_t nTracks = 0; | |
543 | ||
544 | // --------- trigger, vertex and pile-up ----------- | |
545 | ||
546 | if(!fTriggerFired) return 0; | |
547 | if(!fGoodVertex) return 0; | |
548 | if(fPileUpEvent) return 0; | |
549 | ||
550 | // ------------ this is a 'good' event ------------- | |
551 | ||
552 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats"))->Fill(2); // analyzed events | |
553 | ||
554 | ((TH1D*)fHistoMap->Get(fSpecies + "_Ana_Event_Ntrk"))->Fill(fNtrk); | |
1a9524cf | 555 | ((TH1D*)fHistoMap->Get(fSpecies + "_Ana_Event_Zmult"))->Fill(fKNOmult); |
6b91e8c0 | 556 | |
557 | if(fSimulation) | |
558 | { | |
ec499c6d | 559 | ((TH2D*)fHistoMap->Get(fSpecies + "_Ana_Event_Nch_Ntrk"))->Fill(fNtrk, fNch); |
6b91e8c0 | 560 | } |
561 | ||
562 | const AliESDVertex* vtx = fESDevent->GetPrimaryVertex(); | |
563 | ||
564 | ((TH2D*)fHistoMap->Get(fSpecies + "_Ana_Vertex_YX"))->Fill(vtx->GetX(), vtx->GetY()); | |
565 | ((TH2D*)fHistoMap->Get(fSpecies + "_Ana_Vertex_YZ"))->Fill(vtx->GetZ(), vtx->GetY()); | |
566 | ((TH2D*)fHistoMap->Get(fSpecies + "_Ana_Vertex_XZ"))->Fill(vtx->GetZ(), vtx->GetX()); | |
567 | ||
568 | if(fHeavyIons) | |
569 | { | |
570 | Float_t v0ScaMult; | |
571 | Float_t v0Mult = AliESDUtils::GetCorrV0(fESDevent,v0ScaMult); | |
572 | ||
573 | ((TH1D*)fHistoMap->Get(fSpecies + "_Ana_V0_Mult"))->Fill(v0Mult); | |
574 | ((TH1D*)fHistoMap->Get(fSpecies + "_Ana_V0_Scaled_Mult"))->Fill(v0ScaMult); | |
575 | } | |
576 | ||
577 | // ------- track loop -------- | |
578 | ||
579 | for(Int_t i = 0; i < fESDevent->GetNumberOfTracks(); ++i) | |
580 | { | |
581 | AliESDtrack* iTrack = fESDevent->GetTrack(i); | |
582 | ||
583 | if(!iTrack) continue; | |
584 | ||
ec499c6d | 585 | Float_t sign = 1; |
586 | TString particle = fSpecies; | |
587 | if(iTrack->GetSign()<0 ) | |
588 | { | |
589 | particle.Prepend("Anti"); | |
590 | sign = -1; | |
591 | } | |
592 | ||
6b91e8c0 | 593 | // -------- track cuts ------------------------ |
594 | ||
052278a6 | 595 | Double_t eta = iTrack->Eta(); |
596 | Double_t phi = this->GetPhi(iTrack); | |
6b91e8c0 | 597 | |
052278a6 | 598 | ((TH2D*)fHistoMap->Get(particle + "_Before_Phi_Eta"))->Fill(eta,phi); |
6b91e8c0 | 599 | |
600 | if(!fESDtrackCuts->AcceptTrack(iTrack)) continue; // with next track | |
601 | if(fTOFmatch && !this->AcceptTOFtrack(iTrack)) continue; // with next track | |
602 | ||
603 | // --------------------- end track cuts ----------------------- | |
604 | ||
052278a6 | 605 | ((TH2D*)fHistoMap->Get(particle + "_After_Phi_Eta"))->Fill(eta, phi); |
6b91e8c0 | 606 | |
607 | ++nTracks; | |
608 | ||
609 | // charge | |
610 | ||
611 | Double_t z = 1; | |
612 | if(fPartCode>AliPID::kTriton) z = 2; | |
5b88d60e | 613 | |
6b91e8c0 | 614 | // impact parameters |
615 | ||
616 | Float_t dcaxy, dcaz; | |
617 | iTrack->GetImpactParameters(dcaxy, dcaz); | |
618 | ||
619 | dcaxy *= sign; | |
620 | dcaz *= sign; | |
621 | ||
622 | Double_t nSigmaVtx = fESDtrackCuts->GetSigmaToVertex(iTrack); | |
623 | ||
624 | // momentum | |
625 | ||
2b4e5f2c | 626 | Double_t p = iTrack->GetP()*z; // p at DCA |
77dac0a6 | 627 | Double_t pt = iTrack->Pt()*z; // pt at DCA |
6b91e8c0 | 628 | Double_t y = this->GetRapidity(iTrack, fPartCode); |
629 | Double_t pITS = this->GetITSmomentum(iTrack); | |
630 | Double_t pTPC = iTrack->GetTPCmomentum(); | |
631 | Double_t pTOF = this->GetTOFmomentum(iTrack); | |
632 | Double_t dEdxITS = iTrack->GetITSsignal(); | |
633 | Double_t dEdxTPC = iTrack->GetTPCsignal(); | |
634 | Int_t nPointsITS = this->GetITSnPointsPID(iTrack); | |
635 | Int_t nPointsTPC = iTrack->GetTPCsignalN(); | |
636 | ||
2b4e5f2c | 637 | if(fMomentumCorrection) |
638 | { | |
639 | pt += this->GetMomentumCorrection(pt); | |
640 | p = TMath::Sqrt(pt*pt + iTrack->Pz()*iTrack->Pz()); | |
641 | y = this->GetRapidity(p, iTrack->Pz(), fPartCode); | |
642 | } | |
643 | ||
6b91e8c0 | 644 | Double_t beta = 0; |
645 | Double_t mass = 0; | |
646 | Double_t m2 = 0; | |
5b88d60e | 647 | Double_t dm2 = -100; |
067aa49d | 648 | Double_t t = 0; |
649 | Double_t dt = -1000; | |
6b91e8c0 | 650 | |
651 | Double_t simPt = 0; | |
652 | Double_t simPhi = 0; | |
653 | Double_t simY = 0; | |
654 | ||
655 | // --------- track cuts ------------ | |
656 | ||
ec499c6d | 657 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_DCAxy"))->Fill(dcaxy); |
658 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_DCAz"))->Fill(dcaz); | |
659 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_NSigma"))->Fill(nSigmaVtx); | |
6b91e8c0 | 660 | |
ec499c6d | 661 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_ITSchi2PerCls"))->Fill(this->GetITSchi2PerCluster(iTrack)); |
6b91e8c0 | 662 | |
ec499c6d | 663 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_TPCncls"))->Fill(iTrack->GetTPCNcls()); |
b3f10f7e | 664 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_TPCxRowsOverF"))->Fill(static_cast<Double_t>(iTrack->GetTPCCrossedRows())/static_cast<Double_t>(iTrack->GetTPCNclsF())); |
ec499c6d | 665 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_TPCxRows"))->Fill(iTrack->GetTPCCrossedRows()); |
666 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_TPCchi2PerCls"))->Fill(iTrack->GetTPCchi2()/iTrack->GetTPCNcls()); | |
667 | ((TH1D*)fHistoMap->Get(particle + "_TrackCuts_TPCchi2Global"))->Fill(iTrack->GetChi2TPCConstrainedVsGlobal(fESDevent->GetPrimaryVertex())); | |
6b91e8c0 | 668 | |
669 | // ------------- | |
670 | ||
ec499c6d | 671 | ((TH2D*)fHistoMap->Get(particle + "_ITS_dEdx_P"))->Fill(pITS, dEdxITS); |
672 | ((TH2D*)fHistoMap->Get(particle + "_TPC_dEdx_P"))->Fill(pTPC, dEdxTPC); | |
6b91e8c0 | 673 | |
674 | if(this->TOFmatch(iTrack)) | |
675 | { | |
676 | beta = this->GetBeta(iTrack); | |
067aa49d | 677 | m2 = this->GetMassSquared(iTrack); |
6b91e8c0 | 678 | mass = TMath::Sqrt(TMath::Abs(m2)); |
067aa49d | 679 | dm2 = this->GetM2Difference(beta, pTOF, AliPID::ParticleMass(fPartCode)); |
680 | t = this->GetTimeOfFlight(iTrack)*1.e-3; // ns | |
681 | dt = t - 1.e-3*this->GetExpectedTime(iTrack, AliPID::ParticleMass(fPartCode)); | |
6b91e8c0 | 682 | |
ec499c6d | 683 | ((TH2D*)fHistoMap->Get(particle + "_TOF_Beta_P"))->Fill(pTOF, beta); |
684 | ((TH2D*)fHistoMap->Get(particle + "_TOF_Mass_P"))->Fill(pTOF, mass); | |
6b91e8c0 | 685 | } |
686 | ||
687 | // ----------------------------------------------- | |
688 | // for pid and efficiency | |
689 | // ----------------------------------------------- | |
690 | ||
691 | Int_t simpid = -1; | |
692 | TParticle* iParticle = 0; | |
693 | ||
694 | if(fSimulation) | |
695 | { | |
696 | iParticle = this->GetParticle(iTrack); | |
697 | ||
698 | if(iParticle == 0) continue; | |
699 | ||
700 | simPt = iParticle->Pt(); | |
701 | simPhi = iParticle->Phi(); | |
702 | simY = iParticle->Y(); | |
703 | ||
704 | simpid = fLnID->GetPID(iParticle); | |
705 | ||
706 | if(simpid == fPartCode) | |
707 | { | |
708 | TString simparticle = fSpecies; | |
709 | if(this->GetSign(iParticle)<0) simparticle.Prepend("Anti"); | |
710 | ||
711 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_PtY"))->Fill(simY, simPt); | |
712 | ||
713 | if(TMath::Abs(y) < fMaxY) | |
714 | { | |
715 | ((TH2D*)fHistoMap->Get(simparticle + "_Response_Matrix"))->Fill(pt, simPt); | |
716 | ||
ec499c6d | 717 | if(this->IsPhysicalPrimary(iParticle)) |
718 | { | |
719 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Ntrk"))->Fill(fNtrk); | |
720 | } | |
721 | ||
6b91e8c0 | 722 | // for pid |
723 | if(!this->IsFakeTrack(iTrack)) | |
724 | { | |
725 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Pt"))->Fill(simPt); | |
726 | ||
727 | if(this->IsPhysicalPrimary(iParticle)) // the efficiency is calculated on the primaries | |
728 | { | |
729 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Prim_Pt"))->Fill(simPt); | |
730 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Prim_Y"))->Fill(simY); | |
731 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Prim_Phi"))->Fill(simPhi); | |
052278a6 | 732 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Prim_Rec_Pt"))->Fill(pt); |
6b91e8c0 | 733 | |
734 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_Prim_DCAxy_Pt"))->Fill(simPt,dcaxy); | |
735 | ||
736 | ((TH2D*)fHistoMap->Get(simparticle + "_Prim_Response_Matrix"))->Fill(pt, simPt); | |
737 | ||
738 | ((TH2D*)fHistoMap->Get(simparticle + "_Prim_DiffPt_RecPt"))->Fill(pt,simPt-pt); | |
739 | ||
740 | if( this->TOFmatch(iTrack) ) | |
741 | { | |
742 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_Prim_M2_P"))->Fill(pTOF, m2); | |
743 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_Prim_M2_Pt"))->Fill(pt, m2); | |
744 | } | |
1cb68411 | 745 | } |
746 | else if(this->IsFromWeakDecay(iParticle)) | |
747 | { | |
748 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Fdwn_Pt"))->Fill(simPt); | |
6b91e8c0 | 749 | |
1cb68411 | 750 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_Fdwn_DCAxy_Pt"))->Fill(simPt,dcaxy); |
6b91e8c0 | 751 | } |
1cb68411 | 752 | else // if(this->IsFromMaterial(iParticle) |
6b91e8c0 | 753 | { |
1cb68411 | 754 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Mat_Pt"))->Fill(simPt); |
755 | ||
756 | ((TH2D*)fHistoMap->Get(simparticle + "_Sim_Mat_DCAxy_Pt"))->Fill(simPt,dcaxy); | |
6b91e8c0 | 757 | } |
758 | } | |
759 | else // fake tracks | |
760 | { | |
761 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Fake_Pt"))->Fill(simPt); | |
762 | if(this->IsPhysicalPrimary(iParticle)) | |
763 | { | |
764 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Fake_Prim_Pt"))->Fill(simPt); | |
765 | } | |
766 | else if(this->IsFromWeakDecay(iParticle)) | |
767 | { | |
768 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Fake_Fdwn_Pt"))->Fill(simPt); | |
769 | } | |
1cb68411 | 770 | else |
6b91e8c0 | 771 | { |
772 | ((TH1D*)fHistoMap->Get(simparticle + "_Sim_Fake_Mat_Pt"))->Fill(simPt); | |
773 | } | |
774 | } | |
775 | } | |
776 | } | |
777 | } | |
778 | ||
779 | // get the pid | |
780 | Int_t pid = fLnID->GetPID( fPartCode, pITS, dEdxITS, nPointsITS, pTPC, dEdxTPC, nPointsTPC, pTOF, beta, fMaxNSigmaITS, fMaxNSigmaTPC, fMaxNSigmaTOF); | |
781 | ||
782 | // pid table for prior probabilities (only Bayes) | |
783 | ||
784 | Int_t offset = AliPID::kDeuteron - 5; | |
785 | ||
786 | if( fSimulation ) | |
787 | { | |
788 | Int_t sim = simpid > AliPID::kProton ? simpid - offset : simpid; | |
789 | Int_t rec = pid > AliPID::kProton ? pid - offset : pid; | |
790 | ||
791 | if((sim > -1) && (rec > -1)) // pid performance | |
792 | { | |
793 | ((TH2D*)fHistoMap->Get(fSpecies + "_Stats_PID_Table"))->Fill(sim, rec); | |
794 | ((TH2D*)fHistoMap->Get(fSpecies + "_Stats_PID_Table"))->Fill(9, rec); | |
795 | } | |
796 | if(sim > -1) | |
797 | { | |
798 | ((TH2D*)fHistoMap->Get(fSpecies + "_Stats_PID_Table"))->Fill(sim, 9); | |
799 | } | |
800 | } | |
801 | ||
802 | // for bayes iteration | |
803 | if(pid != -1) | |
804 | { | |
805 | Int_t iBin = pid > AliPID::kProton ? pid - offset : pid; | |
806 | ((TH1D*)fHistoMap->Get(fSpecies + "_Stats_PID"))->Fill(iBin); | |
807 | } | |
808 | ||
809 | if(pid != fPartCode) continue; | |
810 | ||
811 | Bool_t goodPid = 0; | |
812 | ||
813 | if(fSimulation) | |
814 | { | |
815 | goodPid = ( simpid == pid ); | |
816 | } | |
817 | ||
067aa49d | 818 | ((TH2D*)fHistoMap->Get(particle + "_PID_Ntrk_pTPC"))->Fill(pTPC,fNtrk); |
819 | ((TH2D*)fHistoMap->Get(particle + "_PID_Zmult_pTPC"))->Fill(pTPC,fKNOmult); | |
ec499c6d | 820 | |
6b91e8c0 | 821 | // pid performance |
2e693567 | 822 | ((TH2D*)fHistoMap->Get(particle + "_PID_ITSdEdx_P"))->Fill(pITS, dEdxITS); |
77dac0a6 | 823 | ((TH2D*)fHistoMap->Get(particle + "_PID_TPCdEdx_P"))->Fill(pTPC, dEdxTPC); |
6b91e8c0 | 824 | |
825 | if(this->TOFmatch(iTrack)) | |
826 | { | |
77dac0a6 | 827 | ((TH2D*)fHistoMap->Get(particle + "_PID_Beta_P"))->Fill(pTOF, beta); |
828 | ((TH2D*)fHistoMap->Get(particle + "_PID_Mass_P"))->Fill(pTOF, mass); | |
6b91e8c0 | 829 | if(fSimulation && goodPid) |
830 | { | |
831 | ((TH1D*)fHistoMap->Get(particle + "_Sim_PID_Mass"))->Fill(mass); | |
832 | } | |
833 | } | |
834 | ||
835 | // --------------------------------- | |
836 | // results in |y| < fMaxY | |
837 | // --------------------------------- | |
838 | ||
839 | ((TH1D*)fHistoMap->Get(particle + "_PID_Y"))->Fill(y); | |
840 | ((TH2D*)fHistoMap->Get(particle + "_PID_Pt_Y"))->Fill(y, pt); | |
841 | ||
842 | if(TMath::Abs(y) >= fMaxY) continue; | |
843 | ||
844 | ((TH1D*)fHistoMap->Get(particle + "_PID_Pt"))->Fill(pt); | |
845 | ((TH1D*)fHistoMap->Get(particle + "_PID_Phi"))->Fill(phi); | |
846 | ||
7421dabb | 847 | if(iTrack->IsOn(AliESDtrack::kTRDin)) |
848 | { | |
849 | ((TH1D*)fHistoMap->Get(particle + "_PID_TRDin_Pt"))->Fill(pt); | |
850 | ||
851 | if(iTrack->IsOn(AliESDtrack::kTRDout)) ((TH1D*)fHistoMap->Get(particle + "_PID_TRDin_TRDout_Pt"))->Fill(pt); | |
852 | if(iTrack->IsOn(AliESDtrack::kTOFout)) ((TH1D*)fHistoMap->Get(particle + "_PID_TRDin_TOFout_Pt"))->Fill(pt); | |
853 | } | |
854 | ||
855 | if(iTrack->IsOn(AliESDtrack::kTOFin)) | |
856 | { | |
857 | ((TH1D*)fHistoMap->Get(particle + "_PID_TOFin_Pt"))->Fill(pt); | |
858 | ||
859 | if(iTrack->IsOn(AliESDtrack::kTOFout)) ((TH1D*)fHistoMap->Get(particle + "_PID_TOFin_TOFout_Pt"))->Fill(pt); | |
860 | } | |
861 | ||
6b91e8c0 | 862 | if( this->TOFmatch(iTrack) ) |
863 | { | |
864 | ((TH2D*)fHistoMap->Get(particle + "_PID_M2_Pt"))->Fill(pt, m2); | |
5b88d60e | 865 | ((TH2D*)fHistoMap->Get(particle + "_PID_DM2_Pt"))->Fill(pt, dm2); |
067aa49d | 866 | ((TH2D*)fHistoMap->Get(particle + "_PID_Time_Pt"))->Fill(pt, t); |
867 | ((TH2D*)fHistoMap->Get(particle + "_PID_DTime_Pt"))->Fill(pt, dt); | |
7421dabb | 868 | ((TH1D*)fHistoMap->Get(particle + "_PID_TOFmatch_Pt"))->Fill(pt); |
6b91e8c0 | 869 | } |
870 | ||
871 | // secondaries | |
1cb68411 | 872 | |
873 | Bool_t m2match = kTRUE; | |
874 | ||
875 | if( fTOFmatch && (fLnID->GetPidProcedure() > AliLnID::kMaxLikelihood)) | |
6b91e8c0 | 876 | { |
067aa49d | 877 | if( pt < 1.8 ) |
878 | { | |
879 | if ((m2 < fMinM2) || (m2 >= fMaxM2)) m2match = kFALSE; | |
880 | } | |
881 | else | |
882 | { | |
883 | if((dt < -0.6) || (dt >= 1)) m2match = kFALSE; | |
884 | } | |
6b91e8c0 | 885 | } |
1cb68411 | 886 | |
887 | if(m2match) | |
6b91e8c0 | 888 | { |
889 | ((TH2D*)fHistoMap->Get(particle + "_PID_DCAxy_Pt"))->Fill(pt, dcaxy); | |
890 | ((TH2D*)fHistoMap->Get(particle + "_PID_DCAz_Pt"))->Fill(pt, dcaz); | |
891 | ((TH2D*)fHistoMap->Get(particle + "_PID_NSigma_Pt"))->Fill(pt, nSigmaVtx); | |
892 | } | |
893 | ||
894 | if(fSimulation && goodPid) | |
895 | { | |
896 | // for unfolding and pid contamination | |
897 | if(!this->IsFakeTrack(iTrack)) | |
898 | { | |
899 | ((TH1D*)fHistoMap->Get(particle + "_Sim_PID_Pt"))->Fill(simPt); | |
900 | ||
901 | if( this->TOFmatch(iTrack) ) | |
902 | { | |
13dc5112 | 903 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_M2_Pt"))->Fill(pt, m2); |
6b91e8c0 | 904 | } |
905 | ||
906 | if(this->IsPhysicalPrimary(iParticle)) | |
907 | { | |
908 | ((TH1D*)fHistoMap->Get(particle + "_Sim_PID_Prim_Pt"))->Fill(simPt); | |
6b91e8c0 | 909 | } |
1cb68411 | 910 | |
911 | if(m2match) | |
6b91e8c0 | 912 | { |
1cb68411 | 913 | if(this->IsPhysicalPrimary(iParticle)) |
914 | { | |
915 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Prim_DCAxy_Pt"))->Fill(pt, dcaxy); | |
916 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Prim_DCAz_Pt"))->Fill(pt, dcaz); | |
917 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Prim_NSigma_Pt"))->Fill(pt, nSigmaVtx); | |
918 | } | |
919 | else if(this->IsFromWeakDecay(iParticle)) | |
6b91e8c0 | 920 | { |
13dc5112 | 921 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fdwn_DCAxy_Pt"))->Fill(pt, dcaxy); |
922 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fdwn_DCAz_Pt"))->Fill(pt, dcaz); | |
923 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fdwn_NSigma_Pt"))->Fill(pt, nSigmaVtx); | |
6b91e8c0 | 924 | } |
1cb68411 | 925 | else // from materials |
6b91e8c0 | 926 | { |
13dc5112 | 927 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Mat_DCAxy_Pt"))->Fill(pt, dcaxy); |
928 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Mat_DCAz_Pt"))->Fill(pt, dcaz); | |
929 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Mat_NSigma_Pt"))->Fill(pt, nSigmaVtx); | |
6b91e8c0 | 930 | } |
931 | } | |
932 | } | |
933 | else // fake tracks | |
934 | { | |
935 | ((TH1D*)fHistoMap->Get(particle + "_Sim_PID_Fake_Pt"))->Fill(simPt); | |
936 | ||
1cb68411 | 937 | if(m2match) |
6b91e8c0 | 938 | { |
1cb68411 | 939 | if(this->IsPhysicalPrimary(iParticle)) |
940 | { | |
941 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fake_Prim_DCAxy_Pt"))->Fill(pt, dcaxy); | |
942 | } | |
943 | else if(this->IsFromWeakDecay(iParticle)) | |
944 | { | |
945 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fake_Fdwn_DCAxy_Pt"))->Fill(pt, dcaxy); | |
946 | } | |
947 | else // from materials | |
948 | { | |
949 | ((TH2D*)fHistoMap->Get(particle + "_Sim_PID_Fake_Mat_DCAxy_Pt"))->Fill(pt, dcaxy); | |
950 | } | |
6b91e8c0 | 951 | } |
952 | } | |
953 | } | |
954 | } | |
955 | ||
956 | return nTracks; | |
957 | } | |
958 | ||
959 | void AliAnalysisTaskB2::Terminate(Option_t* ) | |
960 | { | |
961 | // The Terminate() function is the last function to be called during | |
962 | // a query. It always runs on the client, it can be used to present | |
963 | // the results graphically or save the results to file. | |
964 | ||
965 | } | |
966 | ||
967 | Bool_t AliAnalysisTaskB2::IsV0AND() const | |
968 | { | |
969 | // | |
970 | // signals in both V0A and V0C | |
971 | // | |
972 | return ( fTrigAna->IsOfflineTriggerFired(fESDevent, AliTriggerAnalysis::kV0A) && | |
973 | fTrigAna->IsOfflineTriggerFired(fESDevent, AliTriggerAnalysis::kV0C) ); | |
974 | } | |
975 | ||
976 | Bool_t AliAnalysisTaskB2::IsFastOnly(UInt_t triggerBits) const | |
977 | { | |
978 | // | |
979 | // kFastOnly trigger | |
980 | // | |
981 | return ( (triggerBits&AliVEvent::kFastOnly) == AliVEvent::kFastOnly ); | |
982 | } | |
983 | ||
984 | Bool_t AliAnalysisTaskB2::IsMB(UInt_t triggerBits) const | |
985 | { | |
986 | // | |
987 | // MB event | |
988 | // | |
989 | return ( (triggerBits&AliVEvent::kMB) == AliVEvent::kMB ); | |
990 | } | |
991 | ||
992 | Bool_t AliAnalysisTaskB2::TOFmatch(const AliESDtrack* trk) const | |
993 | { | |
994 | // | |
995 | // Check for TOF match signal | |
996 | // | |
997 | return ( trk->IsOn(AliESDtrack::kTOFout) && trk->IsOn(AliESDtrack::kTIME) ); | |
998 | } | |
999 | ||
1000 | Bool_t AliAnalysisTaskB2::AcceptTOFtrack(const AliESDtrack* trk) const | |
1001 | { | |
1002 | // | |
1003 | // Additional checks for TOF match signal | |
1004 | // | |
1005 | if( !this->TOFmatch(trk) ) return kFALSE; | |
1006 | if( trk->GetIntegratedLength() < 350) return kFALSE; | |
1007 | if( trk->GetTOFsignal() < 1e-6) return kFALSE; | |
1008 | ||
1009 | return kTRUE; | |
1010 | } | |
1011 | ||
1012 | TParticle* AliAnalysisTaskB2::GetParticle(const AliESDtrack* trk) const | |
1013 | { | |
1014 | // | |
1015 | // Particle that left the track | |
1016 | // | |
1017 | AliStack* stack = fMCevent->Stack(); | |
1018 | ||
1019 | Int_t label = TMath::Abs(trk->GetLabel()); // if negative then it shares points from other tracks | |
1020 | if( label >= fMCevent->GetNumberOfTracks() ) return 0; | |
1021 | ||
1022 | return stack->Particle(label); | |
1023 | } | |
1024 | ||
1025 | Bool_t AliAnalysisTaskB2::IsFakeTrack(const AliESDtrack* trk) const | |
1026 | { | |
1027 | // | |
1028 | // Check if the track shares some clusters with different particles | |
0f539a2b | 1029 | // (definition changed to label=0? ) |
6b91e8c0 | 1030 | // |
1031 | return ( trk->GetLabel() < 0 ); | |
1032 | } | |
1033 | ||
1034 | Bool_t AliAnalysisTaskB2::IsPhysicalPrimary(const TParticle* prt) const | |
1035 | { | |
1036 | // | |
1037 | // Check if the particle is physical primary | |
1038 | // | |
1039 | AliStack* stack = fMCevent->Stack(); | |
1040 | Int_t index = stack->Particles()->IndexOf(prt); | |
1041 | ||
1042 | return stack->IsPhysicalPrimary(index); | |
1043 | } | |
1044 | ||
1045 | Bool_t AliAnalysisTaskB2::IsFromMaterial(const TParticle* prt) const | |
1046 | { | |
1047 | // | |
1048 | // Check if the particle is originated at the materials | |
1049 | // | |
1050 | AliStack* stack = fMCevent->Stack(); | |
1051 | Int_t index = stack->Particles()->IndexOf(prt); | |
1052 | ||
1053 | return stack->IsSecondaryFromMaterial(index); | |
1054 | } | |
1055 | ||
1056 | Bool_t AliAnalysisTaskB2::IsFromWeakDecay(const TParticle* prt) const | |
1057 | { | |
1058 | // | |
1059 | // Check if the particle comes from a weak decay | |
1060 | // | |
1061 | AliStack* stack = fMCevent->Stack(); | |
1062 | Int_t index = stack->Particles()->IndexOf(prt); | |
1063 | ||
1064 | return stack->IsSecondaryFromWeakDecay(index); | |
1065 | } | |
1066 | ||
1067 | Double_t AliAnalysisTaskB2::GetSign(TParticle* prt) const | |
1068 | { | |
1069 | // | |
1070 | // Sign of the particle | |
1071 | // | |
1072 | TParticlePDG* pdg = prt->GetPDG(); | |
1073 | ||
1074 | if(pdg != 0) return pdg->Charge(); | |
1075 | ||
1076 | return 0; | |
1077 | } | |
1078 | ||
1079 | Double_t AliAnalysisTaskB2::GetPhi(const AliESDtrack* trk) const | |
1080 | { | |
1081 | // | |
1082 | // Azimuthal angle [0,2pi) using the pt at the DCA point | |
1083 | // | |
1084 | Double_t px = trk->Px(); | |
1085 | Double_t py = trk->Py(); | |
1086 | ||
1087 | return TMath::Pi()+TMath::ATan2(-py, -px); | |
1088 | } | |
1089 | ||
1090 | Double_t AliAnalysisTaskB2::GetTheta(const AliESDtrack* trk) const | |
1091 | { | |
1092 | // | |
1093 | // Polar angle using the pt at the DCA point | |
1094 | // | |
1095 | Double_t p = trk->GetP(); | |
1096 | Double_t pz = trk->Pz(); | |
1097 | ||
1098 | return (pz == 0) ? TMath::PiOver2() : TMath::ACos(pz/p); | |
1099 | } | |
1100 | ||
1101 | Double_t AliAnalysisTaskB2::GetRapidity(const AliESDtrack* trk, Int_t pid) const | |
1102 | { | |
1103 | // | |
1104 | // Rapidity assuming the given particle hypothesis | |
1105 | // and using the momentum at the DCA | |
1106 | // | |
1107 | Double_t m = AliPID::ParticleMass(pid); | |
77dac0a6 | 1108 | Double_t p = (pid>AliPID::kTriton) ? 2.*trk->GetP() : trk->GetP(); |
6b91e8c0 | 1109 | Double_t e = TMath::Sqrt(p*p + m*m); |
77dac0a6 | 1110 | Double_t pz = (pid>AliPID::kTriton) ? 2.*trk->Pz() : trk->Pz(); |
6b91e8c0 | 1111 | |
1112 | if(e <= pz) return 1.e+16; | |
1113 | ||
1114 | return 0.5*TMath::Log( (e+pz)/(e-pz) ); | |
1115 | } | |
1116 | ||
1117 | Double_t AliAnalysisTaskB2::GetITSmomentum(const AliESDtrack* trk) const | |
1118 | { | |
1119 | // | |
1120 | // Momentum for ITS pid | |
1121 | // | |
1122 | Double_t pDCA = trk->GetP(); | |
1123 | Double_t pTPC = trk->GetTPCmomentum(); | |
1124 | ||
1125 | return (pDCA+pTPC)/2.; | |
1126 | } | |
1127 | ||
1128 | Double_t AliAnalysisTaskB2::GetTOFmomentum(const AliESDtrack* trk) const | |
1129 | { | |
1130 | // | |
1131 | // Momentum for TOF pid | |
1132 | // | |
067aa49d | 1133 | Double_t pIn = trk->GetTPCmomentum(); |
6b91e8c0 | 1134 | |
1135 | const AliExternalTrackParam* param = trk->GetOuterParam(); | |
1136 | Double_t pOut = param ? param->GetP() : trk->GetP(); | |
1137 | ||
067aa49d | 1138 | return (pIn+pOut)/2.; |
6b91e8c0 | 1139 | } |
1140 | ||
1141 | Double_t AliAnalysisTaskB2::GetBeta(const AliESDtrack* trk) const | |
1142 | { | |
1143 | // | |
1144 | // Velocity | |
1145 | // | |
1146 | Double_t t = this->GetTimeOfFlight(trk); // ps | |
1147 | Double_t l = trk->GetIntegratedLength(); // cm | |
1148 | ||
1149 | if(t <= 0) return 1.e6; // 1M times the speed of light ;) | |
1150 | ||
1151 | return (l/t)/2.99792458e-2; | |
1152 | } | |
1153 | ||
067aa49d | 1154 | Double_t AliAnalysisTaskB2::GetExpectedTime(const AliESDtrack* trk, Double_t m) const |
6b91e8c0 | 1155 | { |
1156 | // | |
067aa49d | 1157 | // Expected time (ps) for the given mass hypothesis |
1158 | // | |
1159 | Double_t p = (fPartCode>AliPID::kTriton) ? 2.*this->GetTOFmomentum(trk) : this->GetTOFmomentum(trk); | |
1160 | Double_t beta = p/TMath::Sqrt(p*p + m*m); | |
1161 | Double_t l = trk->GetIntegratedLength(); | |
1162 | ||
1163 | return l/beta/2.99792458e-2; | |
1164 | } | |
1165 | ||
1166 | Double_t AliAnalysisTaskB2::GetMassSquared(const AliESDtrack* trk) const | |
1167 | { | |
1168 | // | |
1169 | // Mass squared | |
6b91e8c0 | 1170 | // |
77dac0a6 | 1171 | Double_t p = (fPartCode>AliPID::kTriton) ? 2.*this->GetTOFmomentum(trk) : this->GetTOFmomentum(trk); |
6b91e8c0 | 1172 | Double_t beta = this->GetBeta(trk); |
1173 | ||
1174 | return p*p*(1./(beta*beta) - 1.); | |
1175 | } | |
1176 | ||
067aa49d | 1177 | Double_t AliAnalysisTaskB2::GetM2Difference(Double_t beta, Double_t momentum, Double_t m) const |
1178 | { | |
1179 | // | |
1180 | // Mass squared difference | |
1181 | // | |
1182 | Double_t p = (fPartCode>AliPID::kTriton) ? 2.*momentum : momentum; | |
1183 | Double_t expBeta2 = p*p/(p*p+m*m); | |
1184 | ||
1185 | return p*p*(1./(beta*beta)-1./expBeta2); | |
1186 | } | |
1187 | ||
77dac0a6 | 1188 | Int_t AliAnalysisTaskB2::GetChargedMultiplicity(Double_t etaMax) const |
6b91e8c0 | 1189 | { |
1190 | // | |
1191 | // Charged particle multiplicity using ALICE physical primary definition | |
1192 | // | |
1193 | AliStack* stack = fMCevent->Stack(); | |
1194 | ||
77dac0a6 | 1195 | Int_t nch = 0; |
6b91e8c0 | 1196 | //for (Int_t i=0; i < stack->GetNprimary(); ++i) |
1197 | for (Int_t i=0; i < stack->GetNtrack(); ++i) | |
1198 | { | |
1199 | if(!stack->IsPhysicalPrimary(i)) continue; | |
1200 | ||
1201 | TParticle* iParticle = stack->Particle(i); | |
1202 | ||
1203 | if(TMath::Abs(iParticle->Eta()) >= etaMax) continue; | |
1204 | //if (iParticle->Pt() < -1) continue; | |
1205 | ||
1206 | TParticlePDG* iPDG = iParticle->GetPDG(); // There are some particles with no PDG | |
1207 | if (iPDG && iPDG->Charge() == 0) continue; | |
1208 | ||
1209 | ++nch; | |
1210 | } | |
1211 | ||
1212 | return nch; | |
1213 | } | |
1214 | ||
1215 | Double_t AliAnalysisTaskB2::GetTimeOfFlight(const AliESDtrack* trk) const | |
1216 | { | |
1217 | // | |
1218 | // Time of flight associated to the track. | |
1219 | // Adapted from ANALYSIS/AliAnalysisTaskESDfilter.cxx | |
1220 | // | |
1221 | if(!fESDevent->GetTOFHeader()) | |
1222 | { //protection in case the pass2 LHC10b,c,d have been processed without tender. | |
1223 | Float_t t0spread[10]; | |
1224 | Float_t intrinsicTOFres=100; //ps ok for LHC10b,c,d pass2!! | |
1225 | for (Int_t j=0; j<10; j++) t0spread[j] = (TMath::Sqrt(fESDevent->GetSigma2DiamondZ()))/0.03; //0.03 to convert from cm to ps | |
1226 | fESDpid->GetTOFResponse().SetT0resolution(t0spread); | |
1227 | fESDpid->GetTOFResponse().SetTimeResolution(intrinsicTOFres); | |
1228 | ||
1229 | fESDpid->SetTOFResponse(fESDevent, (AliESDpid::EStartTimeType_t)fTimeZeroType); | |
1230 | } | |
1231 | ||
1232 | if(fESDevent->GetTOFHeader() && fIsPidOwner) fESDpid->SetTOFResponse(fESDevent, (AliESDpid::EStartTimeType_t)fTimeZeroType); //in case of AOD production strating form LHC10e without Tender. | |
1233 | ||
1234 | Double_t timeZero = fESDpid->GetTOFResponse().GetStartTime(trk->P()); | |
1235 | ||
1236 | return trk->GetTOFsignal()-timeZero; | |
1237 | } | |
1238 | ||
1239 | Int_t AliAnalysisTaskB2::GetITSnClusters(const AliESDtrack* trk) const | |
1240 | { | |
1241 | // | |
1242 | // ITS number of clusters | |
1243 | // | |
1244 | UChar_t map = trk->GetITSClusterMap(); | |
1245 | ||
1246 | Int_t npoints=0; | |
1247 | for(Int_t j=0; j<6; j++) | |
1248 | { | |
1249 | if(map&(1<<j)) ++npoints; | |
1250 | } | |
1251 | ||
1252 | return npoints; | |
1253 | } | |
1254 | ||
1255 | Double_t AliAnalysisTaskB2::GetITSchi2PerCluster(const AliESDtrack* trk) const | |
1256 | { | |
1257 | // | |
1258 | // ITS chi2 per number of clusters | |
1259 | // | |
1260 | Double_t chi2 = trk->GetITSchi2(); | |
1261 | Int_t ncls = this->GetITSnClusters(trk); | |
1262 | ||
1263 | Double_t chi2ncls = (ncls==0) ? 1.e10 : chi2/ncls; | |
1264 | ||
1265 | return chi2ncls; | |
1266 | } | |
1267 | ||
1268 | Int_t AliAnalysisTaskB2::GetITSnPointsPID(const AliESDtrack* trk) const | |
1269 | { | |
1270 | // | |
1271 | // ITS number of points for PID | |
1272 | // | |
1273 | UChar_t map = trk->GetITSClusterMap(); | |
1274 | ||
1275 | Int_t npoints = 0; | |
1276 | for(Int_t j=2; j<6; j++) | |
1277 | { | |
1278 | if(map&(1<<j)) ++npoints; | |
1279 | } | |
1280 | ||
1281 | return npoints; | |
1282 | } | |
1283 | ||
1284 | Int_t AliAnalysisTaskB2::GetPidCode(const TString& species) const | |
1285 | { | |
1286 | // | |
1287 | // Return AliPID code of the given species | |
1288 | // | |
1289 | TString name = species; | |
1290 | name.ToLower(); | |
1291 | ||
1292 | if(name == "electron") return AliPID::kElectron; | |
1293 | if(name == "muon") return AliPID::kMuon; | |
1294 | if(name == "pion") return AliPID::kPion; | |
1295 | if(name == "kaon") return AliPID::kKaon; | |
1296 | if(name == "proton") return AliPID::kProton; | |
1297 | if(name == "deuteron") return AliPID::kDeuteron; | |
1298 | if(name == "triton") return AliPID::kTriton; | |
1299 | if(name == "he3") return AliPID::kHe3; | |
1300 | if(name == "alpha") return AliPID::kAlpha; | |
1301 | ||
1302 | return -1; | |
1303 | } | |
2b4e5f2c | 1304 | |
1305 | Double_t AliAnalysisTaskB2::GetMomentumCorrection(Double_t ptrec) const | |
1306 | { | |
1307 | // | |
1308 | // momentum correction for low pt | |
1309 | // | |
1310 | if(fMoCpfx == 0) return 0; | |
1311 | ||
1312 | return fMoCpfx->Interpolate(ptrec); | |
1313 | } | |
1314 | ||
1315 | Double_t AliAnalysisTaskB2::GetRapidity(Double_t p, Double_t pz, Int_t pid) const | |
1316 | { | |
1317 | // | |
1318 | // Rapidity (for momentum correction) | |
1319 | // | |
1320 | Double_t m = AliPID::ParticleMass(pid); | |
1321 | Double_t e = TMath::Sqrt(p*p + m*m); | |
1322 | ||
1323 | if(e <= pz) return 1.e+16; | |
1324 | ||
1325 | return 0.5*TMath::Log( (e+pz)/(e-pz) ); | |
1326 | } |