1 #include "AliHBTParticle.h"
2 //___________________________________________________________
3 /////////////////////////////////////////////////////////////
5 // class AliHBTParticle
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 "AliHBTTrackPoints.h"
19 #include "AliHBTClusterMap.h"
21 ClassImp(AliHBTParticle)
23 Int_t AliHBTParticle::fgDebug = 0;
24 //______________________________________________________________________________
25 AliHBTParticle::AliHBTParticle():
26 fPdgIdx(0), fIdxInEvent(0),fNPids(0),fPids(0x0),fPidProb(0x0),
27 fCalcMass(0),fPx(0), fPy(0),fPz(0),fE(0), fVx(0), fVy(0),fVz(0),fVt(0),
28 fTrackPoints(0x0),fITSTrackPoints(0x0),fClusterMap(0x0)
31 //______________________________________________________________________________
33 AliHBTParticle::AliHBTParticle(Int_t pdg, Int_t idx,
34 Double_t px, Double_t py, Double_t pz, Double_t etot,
35 Double_t vx, Double_t vy, Double_t vz, Double_t time):
36 fPdgIdx(0), fIdxInEvent(idx),fNPids(0),fPids(0x0),fPidProb(0x0),
38 fPx(px), fPy(py),fPz(pz),fE(etot),
39 fVx(vx), fVy(vy),fVz(vz),fVt(time),
40 fTrackPoints(0x0),fITSTrackPoints(0x0),fClusterMap(0x0)
45 fCalcMass = GetPDG()->Mass();
47 Double_t a2 = fE*fE -fPx*fPx -fPy*fPy -fPz*fPz;
48 if (a2 >= 0) fCalcMass = TMath::Sqrt(a2);
49 else fCalcMass = -TMath::Sqrt(-a2);
52 //______________________________________________________________________________
54 AliHBTParticle::AliHBTParticle(Int_t pdg, Float_t prob, Int_t idx,
55 Double_t px, Double_t py, Double_t pz, Double_t etot,
56 Double_t vx, Double_t vy, Double_t vz, Double_t time):
57 fPdgIdx(0), fIdxInEvent(idx),fNPids(0),fPids(0x0),fPidProb(0x0),
59 fPx(px), fPy(py),fPz(pz),fE(etot),
60 fVx(vx), fVy(vy),fVz(vz),fVt(time),
61 fTrackPoints(0x0),fITSTrackPoints(0x0),fClusterMap(0x0)
66 fCalcMass = GetPDG()->Mass();
68 Double_t a2 = fE*fE -fPx*fPx -fPy*fPy -fPz*fPz;
69 if (a2 >= 0) fCalcMass = TMath::Sqrt(a2);
70 else fCalcMass = -TMath::Sqrt(-a2);
73 //______________________________________________________________________________
74 AliHBTParticle::AliHBTParticle(const AliHBTParticle& 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.Energy()),
80 fVx(in.Vx()),fVy(in.Vy()),fVz(in.Vz()),fVt(in.T()),
81 fTrackPoints(0x0), fITSTrackPoints(0x0), fClusterMap(0x0)
84 for(Int_t i = 0; i<fNPids; i++)
86 fPids[i] = in.fPids[i];
87 fPidProb[i] = in.fPidProb[i];
91 fTrackPoints = (AliHBTTrackPoints*)in.fTrackPoints->Clone();
92 if (in.fITSTrackPoints)
93 fITSTrackPoints = (AliHBTTrackPoints*)in.fITSTrackPoints->Clone();
95 fClusterMap = (AliHBTClusterMap*)in.fClusterMap->Clone();
98 //______________________________________________________________________________
99 AliHBTParticle::AliHBTParticle(const TParticle &p,Int_t idx):
100 fPdgIdx(0), fIdxInEvent(idx),
101 fNPids(0),fPids(0x0),fPidProb(0x0),
102 fCalcMass(p.GetCalcMass()),
103 fPx(p.Px()),fPy(p.Py()),fPz(p.Pz()),fE(p.Energy()),
104 fVx(p.Vx()),fVy(p.Vy()),fVz(p.Vz()),fVt(p.T()),
105 fTrackPoints(0x0), fITSTrackPoints(0x0), fClusterMap(0x0)
107 //all copied in the initialization
108 SetPdgCode(p.GetPdgCode());
110 //______________________________________________________________________________
112 AliHBTParticle::~AliHBTParticle()
118 delete fITSTrackPoints;
121 //______________________________________________________________________________
123 AliHBTParticle& AliHBTParticle::operator=(const AliHBTParticle& in)
130 Int_t* fPids = new Int_t[fNPids];
131 Float_t* fPidProb = new Float_t[fNPids];
132 for (Int_t i = 0; i < fNPids;i++)
134 fPids[i] = in.fPids[i];
135 fPidProb[i] = in.fPidProb[i];
138 fPdgIdx = in.fPdgIdx;
139 fIdxInEvent = in.fIdxInEvent;
140 fCalcMass = in.GetCalcMass();
151 fTrackPoints = (in.fTrackPoints)?(AliHBTTrackPoints*)in.fTrackPoints->Clone():0x0;
153 delete fITSTrackPoints;
154 fITSTrackPoints = (in.fTrackPoints)?(AliHBTTrackPoints*)in.fITSTrackPoints->Clone():0x0;
157 fClusterMap = (in.fClusterMap)?(AliHBTClusterMap*)in.fClusterMap->Clone():0x0;
161 //______________________________________________________________________________
163 void AliHBTParticle::SetPdgCode(Int_t pdg,Float_t prob)
165 SetPIDprobability(pdg,prob);
166 fPdgIdx = GetPidSlot(pdg);
169 //______________________________________________________________________________
170 void AliHBTParticle::SetPIDprobability(Int_t pdg, Float_t prob)
172 //Sets another pdg code and corresponding probabilty
173 //Ids are set in decreasing order
174 //Check if total prbaility is not ivercoming unity is performed
175 //in case, warning is printed
176 if (fgDebug > 9) Info("SetPIDprobability","Setting PID %d prob %f",pdg,prob);
178 Float_t totprob = 0.0;//sums up probabilities
179 Int_t idx = GetPidSlot(pdg);
183 fPidProb[idx] = prob;
184 for (i = 0; i < fNPids;i++) totprob+=fPidProb[i];
185 if (totprob > (1.0+0.000001))
187 Warning("SetPIDprobability","Total probability greater than unity (%f)",totprob);
191 Info("SetPIDprobability","Current Total probability: %f",totprob);
196 Int_t currentpid = GetPdgCode();
198 Float_t* aPidProbNew = new Float_t[fNPids];
199 Int_t* aPidsNew = new Int_t[fNPids];
201 for (i = 0; i < fNPids-1;i++)//find a slot
203 if ( fPidProb[i] > prob)
205 if (fgDebug>9) Info("SetPID","Copying entry %d",i);
206 aPidProbNew[i] = fPidProb[i];
207 aPidsNew[i] = fPids[i];
208 totprob+=fPidProb[i];
213 if (fgDebug > 9) Info("SetPID","Setting new PID on entry %d",i);
214 aPidProbNew[i] = prob;
219 for (Int_t j = fNPids-1; j > i ;j--)//copy rest of old araays
221 if (fgDebug > 9) Info("SetPID","Copying from old entry %d to new entry %d",j-1,j);
222 aPidProbNew[j] = fPidProb[j-1];
223 aPidsNew[j] = fPids[j-1];
224 totprob+=fPidProb[j-1];
230 fPidProb = aPidProbNew;
233 fPdgIdx = GetPidSlot(currentpid);
234 if (fPdgIdx == -1) fPdgIdx = 0;
236 if (totprob > (1.0+0.000001))//place for numerical error
238 Warning("SetId","Total probability is greater than unity (%f)!!!",totprob);
242 //______________________________________________________________________________
244 Float_t AliHBTParticle::GetPIDprobability(Int_t pdg) const
246 //Returns probability that this particle is the type of pdg
247 Int_t idx = GetPidSlot(pdg);
248 if (idx < 0) return 0.0;//such pid was not specified for this particle
249 return fPidProb[idx];
251 //______________________________________________________________________________
253 const Char_t* AliHBTParticle::GetName() const
255 //returns name of this particle
256 static char def[4] = "XXX";
257 const TParticlePDG *ap = TDatabasePDG::Instance()->GetParticle(GetPdgCode());
258 if (ap) return ap->GetName();
261 //______________________________________________________________________________
263 Int_t AliHBTParticle::GetPidSlot(Int_t pdg) const
265 //returns position of the given PID in fPids (and fPidProb) array.
266 if (fPids == 0x0) return -1;
267 for (Int_t i = 0; i< fNPids; i++)
269 if (fPids[i] == pdg) return i;
273 //______________________________________________________________________________
275 Int_t AliHBTParticle::GetNthPid(Int_t idx) const
277 //returns PID sitting on slot idx in fPids
278 if ( (idx < 0) || (idx >= fNPids) )
280 Error("GetNthPid","Out Of Bounds");
285 //______________________________________________________________________________
287 Float_t AliHBTParticle::GetNthPidProb(Int_t idx) const
289 //returns PID sitting on slot idx in fPidProb
290 if ( (idx < 0) || (idx >= fNPids) )
292 Error("GetNthPid","Out Of Bounds");
295 return fPidProb[idx];
297 //______________________________________________________________________________
299 void AliHBTParticle::Print() const
301 //prints information about particle
302 printf("____________________________________________________\n");
303 printf("Idx: %d PID: %d Name: ",fIdxInEvent,GetPdgCode());
304 TParticlePDG *pdgp = TDatabasePDG::Instance()->GetParticle(GetPdgCode());
307 printf("%s Mass: %f\n",pdgp->GetName(),pdgp->Mass());
311 printf("Not known\n");
314 printf("Px: %+f Py: %+f Pz: %+f E: %+f Calculated Mass: %f\nVx: %+f Vy: %+f Vz: %+f T: %+f\n",
315 Px(),Py(),Pz(),Energy(),GetCalcMass(),Vx(),Vy(),Vz(),T());
317 for (Int_t i = 0; i < fNPids; i++)
319 printf("# %d PID: %d Probability %f name ",i,fPids[i],fPidProb[i]);
320 const TParticlePDG *ap = TDatabasePDG::Instance()->GetParticle(fPids[i]);
323 printf("%s Mass %f\n",ap->GetName(),ap->Mass());
327 printf("Not known\n");
332 //______________________________________________________________________________
334 //void AliHBTParticle::Streamer(TBuffer &b)
336 // // Stream all objects in the array to or from the I/O buffer.
337 // UInt_t R__s, R__c;
339 // if (b.IsReading())
342 // delete [] fPidProb;
344 // Version_t v = b.ReadVersion(&R__s, &R__c);
347 // AliHBTParticle::Class()->ReadBuffer(b, this);
351 // TObject::Streamer(b);
356 // Int_t* fPids = new Int_t[fNPids];
357 // Float_t* fPidProb = new Float_t[fNPids];
358 // for (i = 0;i<fNPids;i++)
362 // for (i = 0;i<fNPids;i++)
377 // Info("Streamer","Read data");
381 // b.CheckByteCount(R__s, R__c,AliHBTParticle::IsA());
385 // R__c = b.WriteVersion(AliHBTParticle::IsA(), kTRUE);
386 // TObject::Streamer(b);
387 // Info("Streamer","Read data");
393 // for (i = 0;i<fNPids;i++)
399 // for (i = 0;i<fNPids;i++)
415 // b.SetByteCount(R__c, kTRUE);