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