]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG4/PartCorrBase/AliCaloTrackMCReader.cxx
Many fixes:
[u/mrichter/AliRoot.git] / PWG4 / PartCorrBase / AliCaloTrackMCReader.cxx
CommitLineData
1c5acb87 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 *
477d6cee 12 * about the suitability of this software for any purpose. It is *
1c5acb87 13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15/* $Id: $ */
16
17//_________________________________________________________________________
18// Class for reading data (Kinematics) in order to do prompt gamma
19// or other particle identification and correlations
29b2ceec 20// Separates generated particles into charged (CTS)
21// and neutral (PHOS or EMCAL acceptance)
1c5acb87 22//
23//*-- Author: Gustavo Conesa (LNF-INFN)
24//////////////////////////////////////////////////////////////////////////////
25
26
27// --- ROOT system ---
28
29#include <TParticle.h>
c180f65d 30#include <TDatabasePDG.h>
1c5acb87 31#include <TRandom.h>
477d6cee 32#include <TArrayI.h>
29b2ceec 33#include "TParticle.h"
1c5acb87 34//#include "Riostream.h"
35
36//---- ANALYSIS system ----
37#include "AliCaloTrackMCReader.h"
1c5acb87 38#include "AliGenEventHeader.h"
39#include "AliStack.h"
0ae57829 40#include "AliVCluster.h"
1c5acb87 41#include "AliAODTrack.h"
477d6cee 42#include "AliAODEvent.h"
ff45398a 43#include "AliFiducialCut.h"
29b2ceec 44#include "AliMCAnalysisUtils.h"
1c5acb87 45
477d6cee 46 ClassImp(AliCaloTrackMCReader)
1c5acb87 47
48//____________________________________________________________________________
49AliCaloTrackMCReader::AliCaloTrackMCReader() :
50 AliCaloTrackReader(), fDecayPi0(0),
477d6cee 51 fNeutralParticlesArray(0x0), fChargedParticlesArray(0x0),
52 fStatusArray(0x0), fKeepAllStatus(0), fCheckOverlap(0),
53 fEMCALOverlapAngle(0),fPHOSOverlapAngle(0), fIndex2ndPhoton(0)
1c5acb87 54{
55 //Ctor
56
57 //Initialize parameters
58 InitParameters();
1c5acb87 59}
1c5acb87 60//_________________________________
61AliCaloTrackMCReader::~AliCaloTrackMCReader() {
62 //Dtor
63
64 if(fChargedParticlesArray) delete fChargedParticlesArray ;
65 if(fNeutralParticlesArray) delete fNeutralParticlesArray ;
66 if(fStatusArray) delete fStatusArray ;
67
68}
69
70//____________________________________________________________________________
71void AliCaloTrackMCReader::GetVertex(Double_t v[3]) const {
72 //Return vertex position
73
74 TArrayF pv;
75 GetGenEventHeader()->PrimaryVertex(pv);
76 v[0]=pv.At(0);
77 v[1]=pv.At(1);
78 v[2]=pv.At(2);
79
80}
81
1c5acb87 82//_______________________________________________________________
83void AliCaloTrackMCReader::InitParameters()
84{
85
86 //Initialize the parameters of the analysis.
87
88 fDecayPi0 = kFALSE;
89
90 fChargedParticlesArray = new TArrayI(1);
91 fChargedParticlesArray->SetAt(11,0);
92 //Int_t pdgarray[]={12,14,16};// skip neutrinos
93 //fNeutralParticlesArray = new TArrayI(3, pdgarray);
94 fNeutralParticlesArray = new TArrayI(3);
95 fNeutralParticlesArray->SetAt(12,0); fNeutralParticlesArray->SetAt(14,1); fNeutralParticlesArray->SetAt(16,2);
96 fStatusArray = new TArrayI(1);
97 fStatusArray->SetAt(1,0);
98
99 fKeepAllStatus = kTRUE;
1c5acb87 100
691bdd02 101 fCheckOverlap = kFALSE;
102 fEMCALOverlapAngle = 2.5 * TMath::DegToRad();
103 fPHOSOverlapAngle = 0.5 * TMath::DegToRad();
104 fIndex2ndPhoton = -1;
d7c10d78 105
106 fDataType = kMC;
107 fReadStack = kTRUE;
108 fReadAODMCParticles = kFALSE;
109
110 //For this reader we own the objects of the arrays
111 fAODCTS->SetOwner(kTRUE);
112 fAODEMCAL->SetOwner(kTRUE);
113 fAODPHOS->SetOwner(kTRUE);
114
691bdd02 115}
d7c10d78 116
691bdd02 117//____________________________________________________________________________
118void AliCaloTrackMCReader::CheckOverlap(const Float_t anglethres, const Int_t imom, Int_t & iPrimary, Int_t & index, TLorentzVector & mom, Int_t & pdg) {
119 //Check overlap of decay photons
120 if( fIndex2ndPhoton==iPrimary ){
121 fIndex2ndPhoton=-1;
122 return;
123 }
124 else fIndex2ndPhoton=-1;
125
126
127 if(pdg!=22) return;
128
129 TLorentzVector ph1, ph2;
130 TParticle *meson = GetStack()->Particle(imom);
131 Int_t mepdg = meson->GetPdgCode();
132 Int_t idaug1 = meson->GetFirstDaughter();
133 if((mepdg == 111 || mepdg == 221 ) && meson->GetNDaughters() == 2){ //Check only decay in 2 photons
134 TParticle * d1 = GetStack()->Particle(idaug1);
135 TParticle *d2 = GetStack()->Particle(idaug1+1);
136 if(d1->GetPdgCode() == 22 && d2->GetPdgCode() == 22 ){
137 d1->Momentum(ph1);
138 d2->Momentum(ph2);
139 //printf("angle %2.2f\n",ph1.Angle(ph2.Vect()));
140
141 if(anglethres > ph1.Angle(ph2.Vect())){
142 //Keep the meson
143 pdg=mepdg;
144 index=imom;
145 meson->Momentum(mom);
146 //printf("Overlap:: pt %2.2f, phi %2.2f, eta %2.2f\n",mom.Pt(),mom.Phi(),mom.Eta());
147 if(iPrimary == idaug1) iPrimary++; //skip next photon in list
148 }
149 else{
150 //Do not check overlapping for next decay photon from same meson
151 if(iPrimary == idaug1) {fIndex2ndPhoton = idaug1+1;
152 }
153
154 }
155 }
156 }//Meson Decay with 2 photon daughters
1c5acb87 157}
158
159//____________________________________________________________________________
d7c10d78 160void AliCaloTrackMCReader::FillCalorimeters(Int_t & iParticle, TParticle* particle, TLorentzVector &momentum) {
477d6cee 161 //Fill AODCaloClusters or TParticles lists of PHOS or EMCAL
162 //In PHOS
5efec477 163 if(fFillPHOS && momentum.Pt() > fPHOSPtMin){
164
decca433 165 if(fCheckFidCut && !fFiducialCut->IsInFiducialCut(momentum,"PHOS")) return;
5efec477 166
477d6cee 167 Int_t index = iParticle ;
168 Int_t pdg = TMath::Abs(particle->GetPdgCode());
169 if(fCheckOverlap)
170 CheckOverlap(fPHOSOverlapAngle,particle->GetFirstMother(),index, iParticle, momentum, pdg);
171
0ae57829 172 Char_t ttype= AliVCluster::kPHOSNeutral;
477d6cee 173 Int_t labels[] = {index};
174 Float_t x[] = {momentum.X(), momentum.Y(), momentum.Z()};
175 //Create object and write it to file
0ae57829 176 AliAODCaloCluster *calo = new AliAODCaloCluster(index,1,labels,momentum.E(), x, NULL, ttype, 0);
477d6cee 177
178 SetCaloClusterPID(pdg,calo) ;
179 if(fDebug > 3 && momentum.Pt() > 0.2)
a3aebfff 180 printf("AliCaloTrackMCReader::FillCalorimeters() - PHOS : Selected cluster %s E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
477d6cee 181 particle->GetName(),momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
182 fAODPHOS->Add(calo);//reference the selected object to the list
183 }
9415d854 184
477d6cee 185 //In EMCAL
5efec477 186 if(fFillEMCAL && momentum.Pt() > fEMCALPtMin){
187
decca433 188 if(fCheckFidCut && !fFiducialCut->IsInFiducialCut(momentum,"EMCAL")) return;
5efec477 189
477d6cee 190 Int_t index = iParticle ;
191 Int_t pdg = TMath::Abs(particle->GetPdgCode());
192 //Int_t pdgorg=pdg;
193 if(fCheckOverlap)
194 CheckOverlap(fEMCALOverlapAngle,particle->GetFirstMother(),iParticle, index, momentum, pdg);
195
0ae57829 196 Char_t ttype= AliVCluster::kEMCALClusterv1;
477d6cee 197 Int_t labels[] = {index};
198 Float_t x[] = {momentum.X(), momentum.Y(), momentum.Z()};
199 //Create object and write it to file
0ae57829 200 AliAODCaloCluster *calo = new AliAODCaloCluster(iParticle,1,labels,momentum.E(), x, NULL, ttype, 0);
477d6cee 201
202 SetCaloClusterPID(pdg,calo) ;
203 if(fDebug > 3 && momentum.Pt() > 0.2)
a3aebfff 204 printf("AliCaloTrackMCReader::FillCalorimeters() - EMCAL : Selected cluster %s E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
477d6cee 205 particle->GetName(),momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
206 fAODEMCAL->Add(calo);//reference the selected object to the list
207 }
1c5acb87 208}
209
210//____________________________________________________________________________
29b2ceec 211Bool_t AliCaloTrackMCReader::FillInputEvent(const Int_t iEntry, const char * currentFileName){
477d6cee 212 //Fill the event counter and input lists that are needed, called by the analysis maker.
213
214 fEventNumber = iEntry;
a79a2424 215 fCurrentFileName = TString(currentFileName);
216
29b2ceec 217 //In case of analysis of events with jets, skip those with jet pt > 5 pt hard
218 if(fComparePtHardAndJetPt && GetStack()) {
591cc579 219 if(!ComparePtHardAndJetPt()) return kFALSE ;
220 }
29b2ceec 221
edffc439 222 //Fill Vertex array
223 FillVertexArray();
224
477d6cee 225 Int_t iParticle = 0 ;
226 Double_t charge = 0.;
6639984f 227
477d6cee 228 for (iParticle = 0 ; iParticle < GetStack()->GetNtrack() ; iParticle++) {
229 TParticle * particle = GetStack()->Particle(iParticle);
230 TLorentzVector momentum;
231 Float_t p[3];
232 Float_t x[3];
233 Int_t pdg = particle->GetPdgCode();
234
235 //Keep particles with a given status
236 if(KeepParticleWithStatus(particle->GetStatusCode()) && (particle->Pt() > 0) ){
237
238 //Skip bizarre particles, they crash when charge is calculated
239 // if(TMath::Abs(pdg) == 3124 || TMath::Abs(pdg) > 10000000) continue ;
240
241 charge = TDatabasePDG::Instance()->GetParticle(pdg)->Charge();
242 particle->Momentum(momentum);
243 //---------- Charged particles ----------------------
5efec477 244 if(charge != 0){
245 if(fFillCTS && (momentum.Pt() > fCTSPtMin)){
477d6cee 246 //Particles in CTS acceptance
5efec477 247
decca433 248 if(fCheckFidCut && !fFiducialCut->IsInFiducialCut(momentum,"CTS")) continue;
d7c10d78 249
250 if(TMath::Abs(pdg) == 11 && GetStack()->Particle(particle->GetFirstMother())->GetPdgCode()==22) continue ;
251
477d6cee 252 if(fDebug > 3 && momentum.Pt() > 0.2)
a3aebfff 253 printf("AliCaloTrackMCReader::FillInputEvent() - CTS : Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
477d6cee 254 momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
255
256 x[0] = particle->Vx(); x[1] = particle->Vy(); x[2] = particle->Vz();
257 p[0] = particle->Px(); p[1] = particle->Py(); p[2] = particle->Pz();
258 //Create object and write it to file
0ae57829 259 AliAODTrack *aodTrack = new AliAODTrack(0, iParticle, p, kTRUE, x, kFALSE,NULL, 0, 0,
477d6cee 260 NULL,
261 0x0,//primary,
262 kFALSE, // No fit performed
263 kFALSE, // No fit performed
264 AliAODTrack::kPrimary,
265 0);
266 SetTrackChargeAndPID(pdg, aodTrack);
267 fAODCTS->Add(aodTrack);//reference the selected object to the list
268 }
269 //Keep some charged particles in calorimeters lists
0ae57829 270 if((fFillPHOS || fFillEMCAL) && KeepChargedParticles(pdg)) FillCalorimeters(iParticle, particle, momentum);
1c5acb87 271
477d6cee 272 }//Charged
273
274 //-------------Neutral particles ----------------------
275 else if(charge == 0 && (fFillPHOS || fFillEMCAL)){
276 //Skip neutrinos or other neutral particles
277 //if(SkipNeutralParticles(pdg) || particle->IsPrimary()) continue ; // protection added (MG)
278 if(SkipNeutralParticles(pdg)) continue ;
279 //Fill particle/calocluster arrays
280 if(!fDecayPi0) {
0ae57829 281 FillCalorimeters(iParticle, particle, momentum);
1c5acb87 282 }
477d6cee 283 else {
284 //Sometimes pi0 are stable for the generator, if needed decay it by hand
285 if(pdg == 111 ){
286 if(momentum.Pt() > fPHOSPtMin || momentum.Pt() > fEMCALPtMin){
287 TLorentzVector lvGamma1, lvGamma2 ;
288 //Double_t angle = 0;
289
290 //Decay
291 MakePi0Decay(momentum,lvGamma1,lvGamma2);//,angle);
292
293 //Check if Pi0 is in the acceptance of the calorimeters, if aperture angle is small, keep it
294 TParticle * pPhoton1 = new TParticle(22,1,iParticle,0,0,0,lvGamma1.Px(),lvGamma1.Py(),
295 lvGamma1.Pz(),lvGamma1.E(),0,0,0,0);
296 TParticle * pPhoton2 = new TParticle(22,1,iParticle,0,0,0,lvGamma2.Px(),lvGamma2.Py(),
297 lvGamma2.Pz(),lvGamma2.E(),0,0,0,0);
298 //Fill particle/calocluster arrays
0ae57829 299 FillCalorimeters(iParticle,pPhoton1,lvGamma1);
300 FillCalorimeters(iParticle,pPhoton2,lvGamma2);
477d6cee 301 }//pt cut
302 }//pi0
0ae57829 303 else FillCalorimeters(iParticle,particle, momentum); //Add the rest
1c5acb87 304 }
477d6cee 305 }//neutral particles
306 } //particle with correct status
307 }//particle loop
308
309 fIndex2ndPhoton = -1; //In case of overlapping studies, reset for each event
29b2ceec 310
311 return kTRUE;
312
1c5acb87 313}
314
315//________________________________________________________________
316Bool_t AliCaloTrackMCReader::KeepParticleWithStatus(Int_t status) const {
317 //Check if status is equal to one of the list
318 //These particles will be used in analysis.
319 if(!fKeepAllStatus){
320 for(Int_t i= 0; i < fStatusArray->GetSize(); i++)
321 if(status == fStatusArray->At(i)) return kTRUE ;
322
323 return kFALSE;
324
325 }
326 else
327 return kTRUE ;
328}
329
330//________________________________________________________________
331Bool_t AliCaloTrackMCReader::KeepChargedParticles(Int_t pdg) const {
332 //Check if pdg is equal to one of the charged particles list
333 //These particles will be added to the calorimeters lists.
334
335 for(Int_t i= 0; i < fChargedParticlesArray->GetSize(); i++)
336 if(TMath::Abs(pdg) == fChargedParticlesArray->At(i)) return kTRUE ;
337
338 return kFALSE;
339
340}
341
342//________________________________________________________________
343void AliCaloTrackMCReader::Print(const Option_t * opt) const
344{
345 //Print some relevant parameters set for the analysis
346 if(! opt)
347 return;
348
0ae57829 349 AliCaloTrackReader::Print(opt);
350
a3aebfff 351 printf("**** Print **** %s %s ****\n", GetName(), GetTitle() ) ;
1c5acb87 352
353 printf("Decay Pi0? : %d\n", fDecayPi0) ;
691bdd02 354 printf("Check Overlap in Calo? : %d\n", fCheckOverlap) ;
1c5acb87 355 printf("Keep all status? : %d\n", fKeepAllStatus) ;
356
357 if(!fKeepAllStatus) printf("Keep particles with status : ");
358 for(Int_t i= 0; i < fStatusArray->GetSize(); i++)
359 printf(" %d ; ", fStatusArray->At(i));
360 printf("\n");
361
362 printf("Skip neutral particles in calo : ");
363 for(Int_t i= 0; i < fNeutralParticlesArray->GetSize(); i++)
364 printf(" %d ; ", fNeutralParticlesArray->At(i));
365 printf("\n");
366
367 printf("Keep charged particles in calo : ");
368 for(Int_t i= 0; i < fChargedParticlesArray->GetSize(); i++)
369 printf(" %d ; ", fChargedParticlesArray->At(i));
370 printf("\n");
371
372}
373
374//____________________________________________________________________________
375void AliCaloTrackMCReader::MakePi0Decay(TLorentzVector &p0, TLorentzVector &p1,
376 TLorentzVector &p2) const {//, Double_t &angle) {
377 // Perform isotropic decay pi0 -> 2 photons
378 // p0 is pi0 4-momentum (inut)
379 // p1 and p2 are photon 4-momenta (output)
380 // cout<<"Boost vector"<<endl;
381 Double_t mPi0 = TDatabasePDG::Instance()->GetParticle(111)->Mass();
382 TVector3 b = p0.BoostVector();
383 //cout<<"Parameters"<<endl;
384 //Double_t mPi0 = p0.M();
385 Double_t phi = TMath::TwoPi() * gRandom->Rndm();
386 Double_t cosThe = 2 * gRandom->Rndm() - 1;
387 Double_t cosPhi = TMath::Cos(phi);
388 Double_t sinPhi = TMath::Sin(phi);
389 Double_t sinThe = TMath::Sqrt(1-cosThe*cosThe);
390 Double_t ePi0 = mPi0/2.;
391 //cout<<"ePi0 "<<ePi0<<endl;
392 //cout<<"Components"<<endl;
393 p1.SetPx(+ePi0*cosPhi*sinThe);
394 p1.SetPy(+ePi0*sinPhi*sinThe);
395 p1.SetPz(+ePi0*cosThe);
396 p1.SetE(ePi0);
397 //cout<<"p1: "<<p1.Px()<<" "<<p1.Py()<<" "<<p1.Pz()<<" "<<p1.E()<<endl;
398 //cout<<"p1 Mass: "<<p1.Px()*p1.Px()+p1.Py()*p1.Py()+p1.Pz()*p1.Pz()-p1.E()*p1.E()<<endl;
399 p2.SetPx(-ePi0*cosPhi*sinThe);
400 p2.SetPy(-ePi0*sinPhi*sinThe);
401 p2.SetPz(-ePi0*cosThe);
402 p2.SetE(ePi0);
403 //cout<<"p2: "<<p2.Px()<<" "<<p2.Py()<<" "<<p2.Pz()<<" "<<p2.E()<<endl;
404 //cout<<"p2 Mass: "<<p2.Px()*p2.Px()+p2.Py()*p2.Py()+p2.Pz()*p2.Pz()-p2.E()*p2.E()<<endl;
405 //cout<<"Boost "<<b.X()<<" "<<b.Y()<<" "<<b.Z()<<endl;
406 p1.Boost(b);
407 //cout<<"p1: "<<p1.Px()<<" "<<p1.Py()<<" "<<p1.Pz()<<" "<<p1.E()<<endl;
408 p2.Boost(b);
409 //cout<<"p2: "<<p2.Px()<<" "<<p2.Py()<<" "<<p2.Pz()<<" "<<p2.E()<<endl;
410 //cout<<"angle"<<endl;
411 //angle = p1.Angle(p2.Vect());
412 //cout<<angle<<endl;
413}
414
415//____________________________________________________________________________
477d6cee 416void AliCaloTrackMCReader::SetInputOutputMCEvent(AliVEvent* /*esd*/, AliAODEvent* aod, AliMCEvent* mc) {
1c5acb87 417 // Connect the data pointer
477d6cee 418 SetMC(mc);
419 SetOutputEvent(aod);
1c5acb87 420}
421
422
423//________________________________________________________________
424Bool_t AliCaloTrackMCReader::SkipNeutralParticles(Int_t pdg) const {
425 //Check if pdg is equal to one of the neutral particles list
426 //These particles will be skipped from analysis.
427
428 for(Int_t i= 0; i < fNeutralParticlesArray->GetSize(); i++)
429 if(TMath::Abs(pdg) == fNeutralParticlesArray->At(i)) return kTRUE ;
430
431 return kFALSE;
432
433}
434
435
436//____________________________________________________________________
437void AliCaloTrackMCReader::SetTrackChargeAndPID(const Int_t pdgCode, AliAODTrack *track) const {
438//Give a PID weight for tracks equal to 1 depending on the particle type
439
440 Float_t pid[10] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
441
442 switch (pdgCode) {
443
444 case 22: // gamma
445 track->SetCharge(0);
446 pid[AliAODTrack::kUnknown] = 1.;
447 track->SetPID(pid);
448 break;
449
450 case 11: // e-
451 track->SetCharge(-1);
452 pid[AliAODTrack::kElectron] = 1.;
453 track->SetPID(pid);
454 break;
455
456 case -11: // e+
457 track->SetCharge(+1);
458 pid[AliAODTrack::kElectron] = 1.;
459 track->SetPID(pid);
460 break;
461
462 case 13: // mu-
463 track->SetCharge(-1);
464 pid[AliAODTrack::kMuon] = 1.;
465 track->SetPID(pid);
466 break;
467
468 case -13: // mu+
469 track->SetCharge(+1);
470 pid[AliAODTrack::kMuon] = 1.;
471 track->SetPID(pid);
472 break;
473
474 case 111: // pi0
475 track->SetCharge(0);
476 pid[AliAODTrack::kUnknown] = 1.;
477 track->SetPID(pid);
478 break;
479
480 case 211: // pi+
481 track->SetCharge(+1);
482 pid[AliAODTrack::kPion] = 1.;
483 track->SetPID(pid);
484 break;
485
486 case -211: // pi-
487 track->SetCharge(-1);
488 pid[AliAODTrack::kPion] = 1.;
489 track->SetPID(pid);
490 break;
491
492 case 130: // K0L
493 track->SetCharge(0);
494 pid[AliAODTrack::kUnknown] = 1.;
495 track->SetPID(pid);
496 break;
497
498 case 321: // K+
499 track->SetCharge(+1);
500 pid[AliAODTrack::kKaon] = 1.;
501 track->SetPID(pid);
502 break;
503
504 case -321: // K-
505 track->SetCharge(-1);
506 pid[AliAODTrack::kKaon] = 1.;
507 track->SetPID(pid);
508 break;
509
510 case 2112: // n
511 track->SetCharge(0);
512 pid[AliAODTrack::kUnknown] = 1.;
513 track->SetPID(pid);
514 break;
515
516 case 2212: // p
517 track->SetCharge(+1);
518 pid[AliAODTrack::kProton] = 1.;
519 track->SetPID(pid);
520 break;
521
522 case -2212: // anti-p
523 track->SetCharge(-1);
524 pid[AliAODTrack::kProton] = 1.;
525 track->SetPID(pid);
526 break;
527
528 case 310: // K0S
529 track->SetCharge(0);
530 pid[AliAODTrack::kUnknown] = 1.;
531 track->SetPID(pid);
532 break;
533
534 case 311: // K0
535 track->SetCharge(0);
536 pid[AliAODTrack::kUnknown] = 1.;
537 track->SetPID(pid);
538 break;
539
540 case -311: // anti-K0
541 track->SetCharge(0);
542 pid[AliAODTrack::kUnknown] = 1.;
543 track->SetPID(pid);
544 break;
545
546 case 221: // eta
547 track->SetCharge(0);
548 pid[AliAODTrack::kUnknown] = 1.;
549 track->SetPID(pid);
550 break;
551
552 case 3122: // lambda
553 track->SetCharge(0);
554 pid[AliAODTrack::kUnknown] = 1.;
555 track->SetPID(pid);
556 break;
557
558 case 3222: // Sigma+
559 track->SetCharge(+1);
560 pid[AliAODTrack::kUnknown] = 1.;
561 track->SetPID(pid);
562 break;
563
564 case 3212: // Sigma0
565 track->SetCharge(-1);
566 pid[AliAODTrack::kUnknown] = 1.;
567 track->SetPID(pid);
568 break;
569
570 case 3112: // Sigma-
571 track->SetCharge(-1);
572 pid[AliAODTrack::kUnknown] = 1.;
573 track->SetPID(pid);
574 break;
575
576 case 3322: // Xi0
577 track->SetCharge(0);
578 pid[AliAODTrack::kUnknown] = 1.;
579 track->SetPID(pid);
580 break;
581
582 case 3312: // Xi-
583 track->SetCharge(-1);
584 pid[AliAODTrack::kUnknown] = 1.;
585 track->SetPID(pid);
586 break;
587
588 case 3334: // Omega-
589 track->SetCharge(-1);
590 pid[AliAODTrack::kUnknown] = 1.;
591 track->SetPID(pid);
592 break;
593
594 case -2112: // n-bar
595 track->SetCharge(0);
596 pid[AliAODTrack::kUnknown] = 1.;
597 track->SetPID(pid);
598 break;
599
600 case -3122: // anti-Lambda
601 track->SetCharge(0);
602 pid[AliAODTrack::kUnknown] = 1.;
603 track->SetPID(pid);
604 break;
605
606 case -3222: // anti-Sigma-
607 track->SetCharge(-1);
608 pid[AliAODTrack::kUnknown] = 1.;
609 track->SetPID(pid);
610 break;
611
612 case -3212: // anti-Sigma0
613 track->SetCharge(0);
614 pid[AliAODTrack::kUnknown] = 1.;
615 track->SetPID(pid);
616 break;
617
618 case -3112: // anti-Sigma+
619 track->SetCharge(+1);
620 pid[AliAODTrack::kUnknown] = 1.;
621 track->SetPID(pid);
622 break;
623
624 case -3322: // anti-Xi0
625 track->SetCharge(0);
626 pid[AliAODTrack::kUnknown] = 1.;
627 track->SetPID(pid);
628 break;
629
630 case -3312: // anti-Xi+
631 track->SetCharge(+1);
632 break;
633
634 case -3334: // anti-Omega+
635 track->SetCharge(+1);
636 pid[AliAODTrack::kUnknown] = 1.;
637 track->SetPID(pid);
638 break;
639
640 case 411: // D+
641 track->SetCharge(+1);
642 pid[AliAODTrack::kUnknown] = 1.;
643 track->SetPID(pid);
644 break;
645
646 case -411: // D-
647 track->SetCharge(-1);
648 pid[AliAODTrack::kUnknown] = 1.;
649 track->SetPID(pid);
650 break;
651
652 case 421: // D0
653 track->SetCharge(0);
654 pid[AliAODTrack::kUnknown] = 1.;
655 track->SetPID(pid);
656 break;
657
658 case -421: // anti-D0
659 track->SetCharge(0);
660 pid[AliAODTrack::kUnknown] = 1.;
661 track->SetPID(pid);
662 break;
663
664 default : // unknown
665 track->SetCharge(-99);
666 pid[AliAODTrack::kUnknown] = 1.;
667 track->SetPID(pid);
668 }
669
670 track->SetPID(pid);
671
672 return;
673}
674
675//____________________________________________________________________
0ae57829 676void AliCaloTrackMCReader::SetCaloClusterPID(const Int_t pdgCode, AliVCluster *calo) const {
1c5acb87 677//Give a PID weight for CaloClusters equal to 1 depending on the particle type
678
679 Float_t pid[13] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
680
681 switch (pdgCode) {
682
683 case 22: // gamma
0ae57829 684 pid[AliVCluster::kPhoton] = 1.;
1c5acb87 685 calo->SetPID(pid);
686 break;
687
688 case 11: // e-
0ae57829 689 pid[AliVCluster::kElectron] = 1.;
1c5acb87 690 calo->SetPID(pid);
691 break;
692
693 case -11: // e+
0ae57829 694 pid[AliVCluster::kElectron] = 1.;
1c5acb87 695 calo->SetPID(pid);
696 break;
697
698 case 13: // mu-
0ae57829 699 pid[AliVCluster::kCharged] = 1.;
1c5acb87 700 calo->SetPID(pid);
701 break;
702
703 case -13: // mu+
0ae57829 704 pid[AliVCluster::kCharged] = 1.;
1c5acb87 705 calo->SetPID(pid);
706 break;
707
708 case 111: // pi0
0ae57829 709 pid[AliVCluster::kPi0] = 1.;
1c5acb87 710 calo->SetPID(pid);
711 break;
712
713 case 211: // pi+
0ae57829 714 pid[AliVCluster::kCharged] = 1.;
1c5acb87 715 calo->SetPID(pid);
716 break;
717
718 case -211: // pi-
0ae57829 719 pid[AliVCluster::kCharged] = 1.;
1c5acb87 720 calo->SetPID(pid);
721 break;
722
723 case 130: // K0L
0ae57829 724 pid[AliVCluster::kKaon0] = 1.;
725 pid[AliVCluster::kNeutral] = 1;
1c5acb87 726 calo->SetPID(pid);
727 break;
728
729 case 321: // K+
0ae57829 730 pid[AliVCluster::kCharged] = 1.;
1c5acb87 731 calo->SetPID(pid);
732 break;
733
734 case -321: // K-
0ae57829 735 pid[AliVCluster::kCharged] = 1.;
1c5acb87 736 calo->SetPID(pid);
737 break;
738
739 case 2112: // n
0ae57829 740 pid[AliVCluster::kNeutron] = 1.;
741 pid[AliVCluster::kNeutral] = 1.;
1c5acb87 742 calo->SetPID(pid);
743 break;
744
745 case 2212: // p
0ae57829 746 pid[AliVCluster::kCharged] = 1.;
1c5acb87 747 calo->SetPID(pid);
748 break;
749
750 case -2212: // anti-p
0ae57829 751 pid[AliVCluster::kCharged] = 1.;
1c5acb87 752 calo->SetPID(pid);
753 break;
754
755 case 310: // K0S
0ae57829 756 pid[AliVCluster::kKaon0] = 1.;
757 pid[AliVCluster::kNeutral] = 1.;
1c5acb87 758 calo->SetPID(pid);
759 break;
760
761 case 311: // K0
0ae57829 762 pid[AliVCluster::kKaon0] = 1.;
763 pid[AliVCluster::kNeutral] = 1.;
1c5acb87 764 calo->SetPID(pid);
765 break;
766
767 case -311: // anti-K0
0ae57829 768 pid[AliVCluster::kKaon0] = 1.;
769 pid[AliVCluster::kNeutral] = 1.;
1c5acb87 770 calo->SetPID(pid);
771 break;
772
773 case 221: // eta
0ae57829 774 pid[AliVCluster::kNeutral] = 1.;
1c5acb87 775 calo->SetPID(pid);
776 break;
777
778 case 3122: // lambda
0ae57829 779 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 780 calo->SetPID(pid);
781 break;
782
783 case 3222: // Sigma+
0ae57829 784 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 785 calo->SetPID(pid);
786 break;
787
788 case 3212: // Sigma0
0ae57829 789 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 790 calo->SetPID(pid);
791 break;
792
793 case 3112: // Sigma-
0ae57829 794 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 795 calo->SetPID(pid);
796 break;
797
798 case 3322: // Xi0
0ae57829 799 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 800 calo->SetPID(pid);
801 break;
802
803 case 3312: // Xi-
0ae57829 804 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 805 calo->SetPID(pid);
806 break;
807
808 case 3334: // Omega-
0ae57829 809 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 810 calo->SetPID(pid);
811 break;
812
813 case -2112: // n-bar
0ae57829 814 pid[AliVCluster::kNeutron] = 1.;
815 pid[AliVCluster::kNeutral] = 1.;
1c5acb87 816 calo->SetPID(pid);
817 break;
818
819 case -3122: // anti-Lambda
0ae57829 820 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 821 calo->SetPID(pid);
822 break;
823
824 case -3222: // anti-Sigma-
0ae57829 825 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 826 calo->SetPID(pid);
827 break;
828
829 case -3212: // anti-Sigma0
0ae57829 830 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 831 calo->SetPID(pid);
832 break;
833
834 case -3112: // anti-Sigma+
0ae57829 835 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 836 calo->SetPID(pid);
837 break;
838
839 case -3322: // anti-Xi0
0ae57829 840 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 841 calo->SetPID(pid);
842 break;
843
844 case -3312: // anti-Xi+
0ae57829 845 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 846 calo->SetPID(pid);
847 break;
848
849 case -3334: // anti-Omega+
0ae57829 850 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 851 calo->SetPID(pid);
852 break;
853
854 case 411: // D+
0ae57829 855 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 856 calo->SetPID(pid);
857 break;
858
859 case -411: // D-
0ae57829 860 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 861 calo->SetPID(pid);
862 break;
863
864 case 421: // D0
0ae57829 865 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 866 calo->SetPID(pid);
867 break;
868
869 case -421: // anti-D0
0ae57829 870 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 871 calo->SetPID(pid);
872 break;
873
874 default : // unknown
0ae57829 875 pid[AliVCluster::kUnknown] = 1.;
1c5acb87 876 calo->SetPID(pid);
877 }
878
879
880 return;
881}