]>
Commit | Line | Data |
---|---|---|
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 | //____________________________________________________________________________ | |
49 | AliCaloTrackMCReader::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 | //_________________________________ |
61 | AliCaloTrackMCReader::~AliCaloTrackMCReader() { | |
62 | //Dtor | |
63 | ||
64 | if(fChargedParticlesArray) delete fChargedParticlesArray ; | |
65 | if(fNeutralParticlesArray) delete fNeutralParticlesArray ; | |
66 | if(fStatusArray) delete fStatusArray ; | |
67 | ||
68 | } | |
69 | ||
70 | //____________________________________________________________________________ | |
71 | void 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 | //_______________________________________________________________ |
83 | void 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 | //____________________________________________________________________________ |
118 | void 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 | 160 | void 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 | 211 | Bool_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 | //________________________________________________________________ | |
316 | Bool_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 | //________________________________________________________________ | |
331 | Bool_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 | //________________________________________________________________ | |
343 | void 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 | //____________________________________________________________________________ | |
375 | void 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 | 416 | void 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 | //________________________________________________________________ | |
424 | Bool_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 | //____________________________________________________________________ | |
437 | void 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 | 676 | void 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 | } |