1 #include "AliAODParticle.h"
2 //___________________________________________________________
3 /////////////////////////////////////////////////////////////
5 // class AliAODParticle
7 // Ali HBT Particle: simplified class TParticle
8 // Simplified in order to minimize the size of object
9 // - we want to keep a lot of such a objects in memory
10 // Additionaly adjusted for HBT Analysies purposes
11 // + pointer to Track Points
12 // + pointer to Cluster Map(s)
14 // Piotr.Skowronski@cern.ch
16 /////////////////////////////////////////////////////////////
17 #include <TParticle.h>
18 #include "AliTrackPoints.h"
19 #include "AliClusterMap.h"
21 ClassImp(AliAODParticle)
23 //______________________________________________________________________________
24 AliAODParticle::AliAODParticle():
25 fPdgIdx(0), fIdxInEvent(0),fNPids(0),fPids(0x0),fPidProb(0x0),
26 fCalcMass(0),fPx(0), fPy(0),fPz(0),fE(0), fVx(0), fVy(0),fVz(0),fVt(0),
27 fTPCTrackPoints(0x0),fITSTrackPoints(0x0),fClusterMap(0x0)
30 //______________________________________________________________________________
32 AliAODParticle::AliAODParticle(Int_t pdg, Int_t idx,
33 Double_t px, Double_t py, Double_t pz, Double_t etot,
34 Double_t vx, Double_t vy, Double_t vz, Double_t time):
35 fPdgIdx(0), fIdxInEvent(idx),fNPids(0),fPids(0x0),fPidProb(0x0),
37 fPx(px), fPy(py),fPz(pz),fE(etot),
38 fVx(vx), fVy(vy),fVz(vz),fVt(time),
39 fTPCTrackPoints(0x0),fITSTrackPoints(0x0),fClusterMap(0x0)
44 fCalcMass = GetPDG()->Mass();
46 Double_t a2 = fE*fE -fPx*fPx -fPy*fPy -fPz*fPz;
47 if (a2 >= 0) fCalcMass = TMath::Sqrt(a2);
48 else fCalcMass = -TMath::Sqrt(-a2);
51 //______________________________________________________________________________
53 AliAODParticle::AliAODParticle(Int_t pdg, Float_t prob, Int_t idx,
54 Double_t px, Double_t py, Double_t pz, Double_t etot,
55 Double_t vx, Double_t vy, Double_t vz, Double_t time):
56 fPdgIdx(0), fIdxInEvent(idx),fNPids(0),fPids(0x0),fPidProb(0x0),
58 fPx(px), fPy(py),fPz(pz),fE(etot),
59 fVx(vx), fVy(vy),fVz(vz),fVt(time),
60 fTPCTrackPoints(0x0),fITSTrackPoints(0x0),fClusterMap(0x0)
65 fCalcMass = GetPDG()->Mass();
67 Double_t a2 = fE*fE -fPx*fPx -fPy*fPy -fPz*fPz;
68 if (a2 >= 0) fCalcMass = TMath::Sqrt(a2);
69 else fCalcMass = -TMath::Sqrt(-a2);
72 //______________________________________________________________________________
74 AliAODParticle::AliAODParticle(const AliAODParticle& in):
76 fPdgIdx(in.fPdgIdx), fIdxInEvent(in.fIdxInEvent),
77 fNPids(in.fNPids),fPids(new Int_t[fNPids]),fPidProb(new Float_t[fNPids]),
78 fCalcMass(in.GetCalcMass()),
79 fPx(in.Px()),fPy(in.Py()),fPz(in.Pz()),fE(in.E()),
80 fVx(in.Vx()),fVy(in.Vy()),fVz(in.Vz()),fVt(in.T()),
81 fTPCTrackPoints(0x0),fITSTrackPoints(0x0),fClusterMap(0x0)
84 // Info("AliAODParticle(const AliAODParticle& in)","");
85 for(Int_t i = 0; i<fNPids; i++)
87 fPids[i] = in.fPids[i];
88 fPidProb[i] = in.fPidProb[i];
91 if (in.fTPCTrackPoints)
92 fTPCTrackPoints = (AliTrackPoints*)in.fTPCTrackPoints->Clone();
93 if (in.fITSTrackPoints)
94 fITSTrackPoints = (AliTrackPoints*)in.fITSTrackPoints->Clone();
96 fClusterMap = (AliClusterMap*)in.fClusterMap->Clone();
98 //______________________________________________________________________________
100 AliAODParticle::AliAODParticle(const AliVAODParticle& in):
102 fPdgIdx(0), fIdxInEvent(in.GetUID()),
103 fNPids(0),fPids(0x0),fPidProb(0x0),
105 fPx(in.Px()),fPy(in.Py()),fPz(in.Pz()),fE(in.E()),
106 fVx(in.Vx()),fVy(in.Vy()),fVz(in.Vz()),fVt(in.T()),
107 fTPCTrackPoints(0x0),fITSTrackPoints(0x0),fClusterMap(0x0)
110 // Info("AliAODParticle(const AliVAODParticle& in)","");
111 for(Int_t i = 0; i<in.GetNumberOfPids(); i++)
113 SetPIDprobability(in.GetNthPid(i),in.GetNthPidProb(i));
115 SetPdgCode(in.GetPdgCode(),in.GetPidProb());
117 AliTrackPoints* tpts = in.GetTPCTrackPoints();
118 if (tpts) SetTPCTrackPoints((AliTrackPoints*)tpts->Clone());
120 tpts = in.GetITSTrackPoints();
121 if (tpts) SetITSTrackPoints((AliTrackPoints*)tpts->Clone());
123 AliClusterMap* clmap = in.GetClusterMap();
124 if (clmap) SetClusterMap((AliClusterMap*)clmap->Clone());
126 //______________________________________________________________________________
128 AliAODParticle::AliAODParticle(const TParticle &p,Int_t idx):
129 fPdgIdx(0), fIdxInEvent(idx),
130 fNPids(0),fPids(0x0),fPidProb(0x0),
131 fCalcMass(p.GetCalcMass()),
132 fPx(p.Px()),fPy(p.Py()),fPz(p.Pz()),fE(p.Energy()),
133 fVx(p.Vx()),fVy(p.Vy()),fVz(p.Vz()),fVt(p.T()),
134 fTPCTrackPoints(0x0),fITSTrackPoints(0x0),fClusterMap(0x0)
136 //all copied in the initialization
137 SetPdgCode(p.GetPdgCode());
139 //______________________________________________________________________________
141 AliAODParticle::~AliAODParticle()
146 delete fTPCTrackPoints;
147 delete fITSTrackPoints;
150 //______________________________________________________________________________
152 void AliAODParticle::Clear(Option_t*)
154 //Must be implemented in order to store this object in Clones Array
157 delete fTPCTrackPoints;
158 delete fITSTrackPoints;
163 fTPCTrackPoints = 0x0;
164 fITSTrackPoints = 0x0;
167 //______________________________________________________________________________
169 AliVAODParticle& AliAODParticle::operator=(const AliVAODParticle& in)
172 // Info("operator=(const AliVAODParticle& in)","AliAODParticle");
174 if (&in == this) return *this;
182 Int_t npids = in.GetNumberOfPids();
183 for (Int_t i = 0; i < npids; i++)
185 SetPIDprobability(in.GetNthPid(i),in.GetNthPidProb(i));
188 SetPdgCode(in.GetPdgCode(),in.GetPidProb());
192 fCalcMass = in.Mass();
203 delete fTPCTrackPoints;
204 AliTrackPoints* tpts = in.GetTPCTrackPoints();
205 fTPCTrackPoints = (tpts)?(AliTrackPoints*)tpts->Clone():0x0;
207 delete fITSTrackPoints;
208 tpts = in.GetITSTrackPoints();
209 fITSTrackPoints = (tpts)?(AliTrackPoints*)tpts->Clone():0x0;
212 AliClusterMap* incmap = in.GetClusterMap();
213 fClusterMap = (incmap)?(AliClusterMap*)incmap->Clone():0x0;
217 //______________________________________________________________________________
219 AliAODParticle& AliAODParticle::operator=(const AliAODParticle& in)
222 // Info("operator=(const AliAODParticle& in)","AliAODParticle");
223 if (&in == this) return *this;
227 fPids = new Int_t[fNPids];
228 fPidProb = new Float_t[fNPids];
229 for (Int_t i = 0; i < fNPids;i++)
231 fPids[i] = in.fPids[i];
232 fPidProb[i] = in.fPidProb[i];
235 fPdgIdx = in.fPdgIdx;
236 fIdxInEvent = in.fIdxInEvent;
237 fCalcMass = in.GetCalcMass();
247 delete fTPCTrackPoints;
248 fTPCTrackPoints = (in.fTPCTrackPoints)?(AliTrackPoints*)in.fTPCTrackPoints->Clone():0x0;
250 delete fITSTrackPoints;
251 fITSTrackPoints = (in.fITSTrackPoints)?(AliTrackPoints*)in.fITSTrackPoints->Clone():0x0;
254 fClusterMap = (in.fClusterMap)?(AliClusterMap*)in.fClusterMap->Clone():0x0;
258 //______________________________________________________________________________
260 void AliAODParticle::SetPdgCode(Int_t pdg,Float_t prob)
263 SetPIDprobability(pdg,prob);
264 fPdgIdx = GetPidSlot(pdg);
267 //______________________________________________________________________________
268 void AliAODParticle::SetPIDprobability(Int_t pdg, Float_t prob)
270 //Sets another pdg code and corresponding probabilty
271 //Ids are set in decreasing order
272 //Check if total probability is not overcoming unity is performed
273 //in case, warning is printed
274 if (GetDebug() > 9) Info("SetPIDprobability","Setting PID %d prob %f",pdg,prob);
276 Float_t totprob = 0.0;//sums up probabilities
277 Int_t idx = GetPidSlot(pdg);
282 fPidProb[idx] = prob;
283 for (i = 0; i < fNPids;i++) totprob+=fPidProb[i];
284 if (totprob > (1.0+0.000001))
286 Warning("SetPIDprobability","Total probability greater than unity (%f)",totprob);
290 Info("SetPIDprobability","Current Total probability: %f",totprob);
295 Int_t currentpid = GetPdgCode();
297 Float_t* aPidProbNew = new Float_t[fNPids];
298 Int_t* aPidsNew = new Int_t[fNPids];
300 for (i = 0; i < fNPids-1;i++)//find a slot
302 if ( fPidProb[i] > prob)
304 if (GetDebug()>9) Info("SetPID","Copying entry %d",i);
305 aPidProbNew[i] = fPidProb[i];
306 aPidsNew[i] = fPids[i];
307 totprob+=fPidProb[i];
312 if (GetDebug() > 9) Info("SetPID","Setting new PID on entry %d",i);
313 aPidProbNew[i] = prob;
318 for (Int_t j = fNPids-1; j > i ;j--)//copy rest of old arays
320 if (GetDebug() > 9) Info("SetPID","Copying from old entry %d to new entry %d",j-1,j);
321 aPidProbNew[j] = fPidProb[j-1];
322 aPidsNew[j] = fPids[j-1];
323 totprob+=fPidProb[j-1];
329 fPidProb = aPidProbNew;
332 fPdgIdx = GetPidSlot(currentpid);
333 if (fPdgIdx == -1) fPdgIdx = 0;
335 if (totprob > (1.0+0.000001))//space for numerical error
337 Warning("SetId","Total probability is greater than unity (%f)!!!",totprob);
341 //______________________________________________________________________________
343 Float_t AliAODParticle::GetPIDprobability(Int_t pdg) const
345 //Returns probability that this particle is the type of pdg
346 Int_t idx = GetPidSlot(pdg);
347 if (idx < 0) return 0.0;//such pid was not specified for this particle
348 return fPidProb[idx];
350 //______________________________________________________________________________
352 const Char_t* AliAODParticle::GetName() const
354 //returns name of this particle
355 static char def[4] = "XXX";
356 const TParticlePDG *ap = TDatabasePDG::Instance()->GetParticle(GetPdgCode());
357 if (ap) return ap->GetName();
360 //______________________________________________________________________________
362 Int_t AliAODParticle::GetPidSlot(Int_t pdg) const
364 //returns position of the given PID in fPids (and fPidProb) array.
365 if (fPids == 0x0) return -1;
366 for (Int_t i = 0; i< fNPids; i++)
368 if (fPids[i] == pdg) return i;
372 //______________________________________________________________________________
374 Int_t AliAODParticle::GetNthPid(Int_t idx) const
376 //returns PID sitting on slot idx in fPids
377 if ( (idx < 0) || (idx >= fNPids) )
379 Error("GetNthPid","Out Of Bounds");
384 //______________________________________________________________________________
386 Float_t AliAODParticle::GetNthPidProb(Int_t idx) const
388 //returns PID sitting on slot idx in fPidProb
389 if ( (idx < 0) || (idx >= fNPids) )
391 Error("GetNthPid","Out Of Bounds");
394 return fPidProb[idx];
396 //______________________________________________________________________________
398 void AliAODParticle::Print() const
400 //prints information about particle
401 printf("____________________________________________________\n");
402 printf("Idx: %d PID: %d Name: ",fIdxInEvent,GetPdgCode());
403 TParticlePDG *pdgp = TDatabasePDG::Instance()->GetParticle(GetPdgCode());
406 printf("%s Mass: %f\n",pdgp->GetName(),pdgp->Mass());
410 printf("Not known\n");
413 printf("Px: %+f Py: %+f Pz: %+f E: %+f Calculated Mass: %f\nVx: %+f Vy: %+f Vz: %+f T: %+f\n",
414 Px(),Py(),Pz(),E(),GetCalcMass(),Vx(),Vy(),Vz(),T());
416 for (Int_t i = 0; i < fNPids; i++)
418 printf("# %d PID: %d Probability %f name ",i,fPids[i],fPidProb[i]);
419 const TParticlePDG *ap = TDatabasePDG::Instance()->GetParticle(fPids[i]);
422 printf("%s Mass %f\n",ap->GetName(),ap->Mass());
426 printf("Not known\n");
430 if (fITSTrackPoints) fITSTrackPoints->Print();
431 if (fTPCTrackPoints) fTPCTrackPoints->Print();
435 //______________________________________________________________________________
437 //void AliAODParticle::Streamer(TBuffer &b)
439 // // Stream all objects in the array to or from the I/O buffer.
440 // UInt_t R__s, R__c;
442 // if (b.IsReading())
445 // delete [] fPidProb;
447 // Version_t v = b.ReadVersion(&R__s, &R__c);
450 // AliAODParticle::Class()->ReadBuffer(b, this);
454 // TObject::Streamer(b);
459 // Int_t* fPids = new Int_t[fNPids];
460 // Float_t* fPidProb = new Float_t[fNPids];
461 // for (i = 0;i<fNPids;i++)
465 // for (i = 0;i<fNPids;i++)
480 // Info("Streamer","Read data");
484 // b.CheckByteCount(R__s, R__c,AliAODParticle::IsA());
488 // R__c = b.WriteVersion(AliAODParticle::IsA(), kTRUE);
489 // TObject::Streamer(b);
490 // Info("Streamer","Read data");
496 // for (i = 0;i<fNPids;i++)
502 // for (i = 0;i<fNPids;i++)
518 // b.SetByteCount(R__c, kTRUE);