1 //Simplified TParticle class
2 #include "AliHBTParticle.h"
6 ClassImp(AliHBTParticle)
8 Int_t AliHBTParticle::fgDebug = 0;
9 //______________________________________________________________________________
10 AliHBTParticle::AliHBTParticle():
11 fPdgIdx(0), fIdxInEvent(0),fNPids(0),fPids(0x0),fPidProb(0x0),
12 fCalcMass(0),fPx(0), fPy(0),fPz(0),fE(0), fVx(0), fVy(0),fVz(0),fVt(0)
15 //______________________________________________________________________________
17 AliHBTParticle::AliHBTParticle(Int_t pdg, Int_t idx,
18 Double_t px, Double_t py, Double_t pz, Double_t etot,
19 Double_t vx, Double_t vy, Double_t vz, Double_t time):
20 fPdgIdx(0), fIdxInEvent(idx),fNPids(0),fPids(0x0),fPidProb(0x0),
22 fPx(px), fPy(py),fPz(pz),fE(etot),
23 fVx(vx), fVy(vy),fVz(vz),fVt(time)
28 fCalcMass = GetPDG()->Mass();
30 Double_t a2 = fE*fE -fPx*fPx -fPy*fPy -fPz*fPz;
31 if (a2 >= 0) fCalcMass = TMath::Sqrt(a2);
32 else fCalcMass = -TMath::Sqrt(-a2);
35 //______________________________________________________________________________
37 AliHBTParticle::AliHBTParticle(Int_t pdg, Float_t prob, Int_t idx,
38 Double_t px, Double_t py, Double_t pz, Double_t etot,
39 Double_t vx, Double_t vy, Double_t vz, Double_t time):
40 fPdgIdx(0), fIdxInEvent(idx),fNPids(0),fPids(0x0),fPidProb(0x0),
42 fPx(px), fPy(py),fPz(pz),fE(etot),
43 fVx(vx), fVy(vy),fVz(vz),fVt(time)
48 fCalcMass = GetPDG()->Mass();
50 Double_t a2 = fE*fE -fPx*fPx -fPy*fPy -fPz*fPz;
51 if (a2 >= 0) fCalcMass = TMath::Sqrt(a2);
52 else fCalcMass = -TMath::Sqrt(-a2);
55 //______________________________________________________________________________
56 AliHBTParticle::AliHBTParticle(const AliHBTParticle& in):
58 fPdgIdx(in.fPdgIdx), fIdxInEvent(in.fIdxInEvent),
59 fNPids(in.fNPids),fPids(new Int_t[fNPids]),fPidProb(new Float_t[fNPids]),
60 fCalcMass(in.GetCalcMass()),
61 fPx(in.Px()),fPy(in.Py()),fPz(in.Pz()),fE(in.Energy()),
62 fVx(in.Vx()),fVy(in.Vy()),fVz(in.Vz()),fVt(in.T())
65 for(Int_t i = 0; i<fNPids; i++)
67 fPids[i] = in.fPids[i];
68 fPidProb[i] = in.fPidProb[i];
72 //______________________________________________________________________________
73 AliHBTParticle::AliHBTParticle(const TParticle &p,Int_t idx):
74 fPdgIdx(0), fIdxInEvent(idx),
75 fNPids(0),fPids(0x0),fPidProb(0x0),
76 fCalcMass(p.GetCalcMass()),
77 fPx(p.Px()),fPy(p.Py()),fPz(p.Pz()),fE(p.Energy()),
78 fVx(p.Vx()),fVy(p.Vy()),fVz(p.Vz()),fVt(p.T())
80 //all copied in the initialization
81 SetPdgCode(p.GetPdgCode());
83 //______________________________________________________________________________
85 AliHBTParticle::~AliHBTParticle()
91 //______________________________________________________________________________
93 AliHBTParticle& AliHBTParticle::operator=(const AliHBTParticle& in)
100 Int_t* fPids = new Int_t[fNPids];
101 Float_t* fPidProb = new Float_t[fNPids];
102 for (Int_t i = 0; i < fNPids;i++)
104 fPids[i] = in.fPids[i];
105 fPidProb[i] = in.fPidProb[i];
108 fPdgIdx = in.fPdgIdx;
109 fIdxInEvent = in.fIdxInEvent;
110 fCalcMass = in.GetCalcMass();
122 //______________________________________________________________________________
124 void AliHBTParticle::SetPdgCode(Int_t pdg,Float_t prob)
126 SetPIDprobability(pdg,prob);
127 fPdgIdx = GetPidSlot(pdg);
130 //______________________________________________________________________________
131 void AliHBTParticle::SetPIDprobability(Int_t pdg, Float_t prob)
133 //Sets another pdg code and corresponding probabilty
134 //Ids are set in decreasing order
135 //Check if total prbaility is not ivercoming unity is performed
136 //in case, warning is printed
137 if (fgDebug > 9) Info("SetPIDprobability","Setting PID %d prob %f",pdg,prob);
139 Float_t totprob = 0.0;//sums up probabilities
140 Int_t idx = GetPidSlot(pdg);
144 fPidProb[idx] = prob;
145 for (i = 0; i < fNPids;i++) totprob+=fPidProb[i];
146 if (totprob > (1.0+0.000001))
148 Warning("SetPIDprobability","Total probability greater than unity (%f)",totprob);
152 Info("SetPIDprobability","Current Total probability: %f",totprob);
157 Int_t currentpid = GetPdgCode();
159 Float_t* aPidProbNew = new Float_t[fNPids];
160 Int_t* aPidsNew = new Int_t[fNPids];
162 for (i = 0; i < fNPids-1;i++)//find a slot
164 if ( fPidProb[i] > prob)
166 if (fgDebug>9) Info("SetPID","Copying entry %d",i);
167 aPidProbNew[i] = fPidProb[i];
168 aPidsNew[i] = fPids[i];
169 totprob+=fPidProb[i];
174 if (fgDebug > 9) Info("SetPID","Setting new PID on entry %d",i);
175 aPidProbNew[i] = prob;
180 for (Int_t j = fNPids-1; j > i ;j--)//copy rest of old araays
182 if (fgDebug > 9) Info("SetPID","Copying from old entry %d to new entry %d",j-1,j);
183 aPidProbNew[j] = fPidProb[j-1];
184 aPidsNew[j] = fPids[j-1];
185 totprob+=fPidProb[j-1];
191 fPidProb = aPidProbNew;
194 fPdgIdx = GetPidSlot(currentpid);
195 if (fPdgIdx == -1) fPdgIdx = 0;
197 if (totprob > (1.0+0.000001))//place for numerical error
199 Warning("SetId","Total probability is greater than unity (%f)!!!",totprob);
203 //______________________________________________________________________________
205 Float_t AliHBTParticle::GetPIDprobability(Int_t pdg)
207 Int_t idx = GetPidSlot(pdg);
208 if (idx < 0) return 0.0;//such pid was not specified for this particle
209 return fPidProb[idx];
211 //______________________________________________________________________________
213 const Char_t* AliHBTParticle::GetName() const
215 static char def[4] = "XXX";
216 const TParticlePDG *ap = TDatabasePDG::Instance()->GetParticle(GetPdgCode());
217 if (ap) return ap->GetName();
222 //______________________________________________________________________________
223 Int_t AliHBTParticle::GetPidSlot(Int_t pdg) const
225 //returns position of the given PID in fPids (and fPidProb) array.
226 if (fPids == 0x0) return -1;
227 for (Int_t i = 0; i< fNPids; i++)
229 if (fPids[i] == pdg) return i;
233 //______________________________________________________________________________
235 Int_t AliHBTParticle::GetNthPid(Int_t idx) const
237 //returns PID sitting on slot idx in fPids
238 if ( (idx < 0) || (idx >= fNPids) )
240 Error("GetNthPid","Out Of Bounds");
245 //______________________________________________________________________________
247 Float_t AliHBTParticle::GetNthPidProb(Int_t idx) const
249 //returns PID sitting on slot idx in fPidProb
250 if ( (idx < 0) || (idx >= fNPids) )
252 Error("GetNthPid","Out Of Bounds");
255 return fPidProb[idx];
257 //______________________________________________________________________________
259 void AliHBTParticle::Print() const
261 //prints information about particle
262 printf("____________________________________________________\n");
263 printf("Idx: %d PID: %d Name: ",fIdxInEvent,GetPdgCode());
264 TParticlePDG *pdgp = TDatabasePDG::Instance()->GetParticle(GetPdgCode());
267 printf("%s Mass: %f\n",pdgp->GetName(),pdgp->Mass());
271 printf("Not known\n");
274 printf("Px: %+f Py: %+f Pz: %+f E: %+f Calculated Mass: %f\nVx: %+f Vy: %+f Vz: %+f T: %+f\n",
275 Px(),Py(),Pz(),Energy(),GetCalcMass(),Vx(),Vy(),Vz(),T());
277 for (Int_t i = 0; i < fNPids; i++)
279 printf("# %d PID: %d Probability %f name ",i,fPids[i],fPidProb[i]);
280 const TParticlePDG *ap = TDatabasePDG::Instance()->GetParticle(fPids[i]);
283 printf("%s Mass %f\n",ap->GetName(),ap->Mass());
287 printf("Not known\n");
292 //______________________________________________________________________________
294 //void AliHBTParticle::Streamer(TBuffer &b)
296 // // Stream all objects in the array to or from the I/O buffer.
297 // UInt_t R__s, R__c;
299 // if (b.IsReading())
302 // delete [] fPidProb;
304 // Version_t v = b.ReadVersion(&R__s, &R__c);
307 // AliHBTParticle::Class()->ReadBuffer(b, this);
311 // TObject::Streamer(b);
316 // Int_t* fPids = new Int_t[fNPids];
317 // Float_t* fPidProb = new Float_t[fNPids];
318 // for (i = 0;i<fNPids;i++)
322 // for (i = 0;i<fNPids;i++)
337 // Info("Streamer","Read data");
341 // b.CheckByteCount(R__s, R__c,AliHBTParticle::IsA());
345 // R__c = b.WriteVersion(AliHBTParticle::IsA(), kTRUE);
346 // TObject::Streamer(b);
347 // Info("Streamer","Read data");
353 // for (i = 0;i<fNPids;i++)
359 // for (i = 0;i<fNPids;i++)
375 // b.SetByteCount(R__c, kTRUE);