1 #include "AliHBTPositionRandomizer.h"
2 //___________________________________________________
3 ////////////////////////////////////////////////////////////////////////////////
5 // class AliHBTPositionRandomizer
7 // These class randomizes particle vertex positions
8 // Piotr.Skowronski@cern.ch
10 ////////////////////////////////////////////////////////////////////////////////
14 #include "AliVAODParticle.h"
17 ClassImp(AliHBTPositionRandomizer)
19 const Int_t AliHBTPositionRandomizer::fgkNumberOfPids = 10;
21 /*********************************************************************/
23 AliHBTPositionRandomizer::AliHBTPositionRandomizer():
25 fDefaultRandomizer(0x0),
29 fAddToExistingPos(kFALSE),
30 fOnlyParticlesFromVertex(kFALSE),
31 fRandomizeTracks(kFALSE),
38 /*********************************************************************/
40 AliHBTPositionRandomizer::AliHBTPositionRandomizer(AliReader* reader):
42 fRandomizers(new TObjArray(fgkNumberOfPids)),
44 fPids(new Int_t[fgkNumberOfPids]),
45 fAddToExistingPos(kFALSE),
46 fOnlyParticlesFromVertex(kFALSE),
47 fRandomizeTracks(kFALSE),
53 fRandomizers->AddAt(new AliHBTRndmGaussBall(8.0,0.0,0.0),0);
55 /*********************************************************************/
57 AliHBTPositionRandomizer::AliHBTPositionRandomizer(const AliHBTPositionRandomizer& in):
63 fAddToExistingPos(kFALSE),
64 fOnlyParticlesFromVertex(kFALSE),
65 fRandomizeTracks(kFALSE),
73 /*********************************************************************/
74 AliHBTPositionRandomizer::~AliHBTPositionRandomizer()
81 /*********************************************************************/
82 AliHBTPositionRandomizer& AliHBTPositionRandomizer::operator=(const AliHBTPositionRandomizer& in)
88 /*********************************************************************/
90 AliAOD* AliHBTPositionRandomizer::GetEventSim() const
92 // gets from fReader and randomizes current particle event
95 Error("GetEventSim","Reader is null");
98 AliAOD *e = fReader->GetEventSim();
100 if (e->IsRandomized() == kFALSE)
104 /*********************************************************************/
106 AliAOD* AliHBTPositionRandomizer::GetEventRec() const
108 // gets from fReader and randomizes current track event
111 Error("GetEventRec","Reader is null");
114 AliAOD *e = fReader->GetEventRec();
115 if (fRandomizeTracks && e) if (e->IsRandomized() == kFALSE) Randomize(e);
118 /*********************************************************************/
120 AliAOD* AliHBTPositionRandomizer::GetEventSim(Int_t n)
123 if (fReader == 0x0) return 0x0;
124 AliAOD *e = fReader->GetEventSim(n);
125 if (e->IsRandomized() == kFALSE) Randomize(e);
129 /*********************************************************************/
130 void AliHBTPositionRandomizer::Randomize(AliAOD* event) const
132 // randomizes postions of all particles in the event
133 static const Double_t kfmtocm = 1.e-13;
134 if (AliVAODParticle::GetDebug() > 5) Info("Randomize(AliAOD*)","");
135 if (event == 0x0) return;
137 for (Int_t i = 0; i < event->GetNumberOfParticles(); i++)
139 AliVAODParticle* p = event->GetParticle(i);
140 Double_t x,y,z,t=0.0;
141 AliHBTRndm* r = GetRandomizer(p->GetPdgCode());
142 r->Randomize(x,y,z,t,p);
144 Double_t nx = x*kfmtocm;
145 Double_t ny = y*kfmtocm;
146 Double_t nz = z*kfmtocm;
147 Double_t nt = t*kfmtocm;
149 if (fAddToExistingPos)
156 p->SetProductionVertex(nx,ny,nz,nt);
158 event->SetRandomized();
160 /*********************************************************************/
162 AliHBTRndm* AliHBTPositionRandomizer::GetRandomizer(Int_t pdg) const
164 //returns randomizer for a given pdg
165 Int_t idx = GetRandomizerIndex(pdg);//in most of cases
166 if (idx < 0) idx = 0;//if not found return a default one
167 return (AliHBTRndm*)fRandomizers->At(idx);
169 /*********************************************************************/
170 Int_t AliHBTPositionRandomizer::GetRandomizerIndex(Int_t pdg) const
172 //returns randomizer index for a given pdg
174 if (pdg == 0) return 0;
176 for (Int_t i=1; i < fNPid; i++)
184 /*********************************************************************/
186 void AliHBTPositionRandomizer::SetRandomizer(Int_t pid, AliHBTRndm* rndm)
188 //sets the randomizer for a given particle type
191 Error("SetRandomizer","Randomizer is null");
195 Int_t idx = GetRandomizerIndex(pid);
198 delete fRandomizers->At(idx);
199 fRandomizers->AddAt(rndm,idx);
202 if (fNPid == fgkNumberOfPids)
204 Error("SetRandomizer","There is no more space in the array");
209 fRandomizers->AddAt(rndm,fNPid);
212 /*********************************************************************/
214 void AliHBTPositionRandomizer::SetGaussianBall(Int_t pid, Double_t r, Double_t meantime, Double_t sigmatime)
216 //Sets Gaussian Ball Model
217 SetGaussianBall(pid,r,r,r,meantime,sigmatime);
219 /*********************************************************************/
221 void AliHBTPositionRandomizer::SetGaussianBall(Int_t pid, Double_t rx, Double_t ry, Double_t rz, Double_t meantime, Double_t sigmatime)
223 //Sets Gaussian Ball Model
224 AliHBTRndm* rndm = new AliHBTRndmGaussBall(rx,ry,rz,meantime,sigmatime);
225 SetRandomizer(pid,rndm);
227 /*********************************************************************/
229 void AliHBTPositionRandomizer::SetCyllinderSurface(Int_t pid, Double_t r, Double_t l)
231 //Sets Cylinder Surface Model
232 AliHBTRndm* rndm = new AliHBTRndmCyllSurf(r,l);
233 SetRandomizer(pid,rndm);
235 /*********************************************************************/
237 void AliHBTPositionRandomizer::SetEventVertex(Double_t x, Double_t y,Double_t z)
239 //sets event vertex position
246 void AliHBTPositionRandomizer::SetEllipse(Int_t pid, Double_t rx, Double_t ryz)
248 //sets the ellipse randomization for the given pid
249 AliHBTRndm* rndm = new AliHBTRndmEllipse(rx,ryz);
250 SetRandomizer(pid,rndm);
253 /*********************************************************************/
254 //_____________________________________________________________________
255 ///////////////////////////////////////////////////////////////////////
257 // class AliHBTRndmGaussBall //
259 ///////////////////////////////////////////////////////////////////////
261 AliHBTRndmGaussBall::AliHBTRndmGaussBall():
270 /*********************************************************************/
272 AliHBTRndmGaussBall::AliHBTRndmGaussBall(Float_t r, Double_t meantime, Double_t sigmatime):
281 /*********************************************************************/
283 AliHBTRndmGaussBall::AliHBTRndmGaussBall(Float_t rx, Float_t ry, Float_t rz, Double_t meantime, Double_t sigmatime):
292 /*********************************************************************/
295 AliHBTRndmEllipse::AliHBTRndmEllipse(Float_t rmin, Float_t rmax):
302 /*********************************************************************/
304 void AliHBTRndmGaussBall::Randomize(Double_t& x,Double_t& y,Double_t&z,Double_t&t, AliVAODParticle*/*particle*/) const
306 //randomizez gauss for each coordinate separately
307 x = gRandom->Gaus(0.0,fRx);
308 y = gRandom->Gaus(0.0,fRy);
309 z = gRandom->Gaus(0.0,fRz);
317 t = gRandom->Gaus(fTmean,fTsigma);
320 /*********************************************************************/
321 //_____________________________________________________________________
322 ///////////////////////////////////////////////////////////////////////
324 // class AliHBTRndmGaussBall //
326 ///////////////////////////////////////////////////////////////////////
328 void AliHBTRndmCyllSurf::Randomize(Double_t& x,Double_t& y,Double_t&z,Double_t&/*t*/, AliVAODParticle* particle) const
331 Double_t r = fR + gRandom->Gaus(0.0, 1.0);
332 Double_t sf = r/particle->Pt();//scaling factor for position transformation ->
333 //we move direction of string momentum but legth defined by r
334 x = sf*particle->Px();
335 y = sf*particle->Py();
336 z = gRandom->Uniform(-fL,fL);
339 /*********************************************************************/
340 /*********************************************************************/
342 void AliHBTRndmEllipse::Randomize(Double_t& x, Double_t& y, Double_t& z,Double_t&/*t*/, AliVAODParticle*p) const
344 // p=0; //workaround - fix this damn little thingy
348 R=fRmin+(fRmax-fRmin)*TMath::Sin(phi);