1 /**************************************************************************
2 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 // Generator for particles according generic functions
18 // TF1 * fFMomentum; // momentum distribution function inGeV
19 // TF1 * fFPhi; // phi distribution function in rad
20 // TF1 * fFTheta; // theta distribution function in rad
21 // TF3 * fFPosition; // position distribution function in cm
22 // TF1 * fFPdg; // pdg distribution function
23 // We assume that the moment, postion and PDG code of particles are independent
24 // Only tracks/particle crossing the reference radius at given z range
26 // Origin: marian.ivanov@cern.ch
30 Example generic function for cosmic generation:
33 AliGenFunction *generCosmic = new AliGenFunction;
34 generCosmic->SetNumberParticles(100);
35 TF1 *fmom = new TF1("fmom","TMath::Exp(-x/8)",0,30);
37 TF1 *fphi = new TF1("fphi","TMath::Gaus(x,-TMath::Pi()/2,0.3)",-3.14,3.14);
38 TF1 *ftheta = new TF1("ftheta","TMath::Gaus(x,TMath::Pi()/2,0.3)",-3.14,3.14);
39 TF3 *fpos = new TF3("fpos","1+(x+y+z)*0",-2000,2000,700,701,-2000,2000);
40 TF1 * fpdg= new TF1("fpdg","1*(abs(x-13)<0.1)+1*(abs(x+13)<0.1)",-300,300);
41 fpdg->SetNpx(10000); // neccessary - number of bins for generation
42 generCosmic->SetVertexSmear(kPerEvent);
43 generCosmic->SetFunctions(fmom,fphi,ftheta,fpos,fpdg);
44 generCosmic->SetCylinder(375,-375,375);
45 generCosmic->SetBkG(0.2);
46 gener->AddGenerator(generCosmic,"generCosmic",1);
55 #include <TParticle.h>
58 #include <TDatabasePDG.h>
61 #include "AliESDtrack.h"
62 #include "AliESDVertex.h"
63 #include "AliGenFunction.h"
65 ClassImp(AliGenFunction)
67 //-----------------------------------------------------------------------------
68 AliGenFunction::AliGenFunction():
71 fFMomentum(0), // momentum distribution function
72 fFPhi(0), // phi distribution function
73 fFTheta(0), // theta distribution function
74 fFPosition(0), // position distribution function
75 fFPdg(0), // pdg distribution function
76 fRefRadius(0), // reference radius to be crossed
77 fZmin(0), // minimal z at reference radius
78 fZmax(0), // z at reference radius
79 fMaxTrial(10000) // maximal number of attempts
82 // Default constructor
84 SetNumberParticles(1);
86 //-----------------------------------------------------------------------------
87 void AliGenFunction::Generate()
94 for (Int_t ipart=0; ipart<fMaxTrial && naccepted<fNpart; ipart++){
102 Double_t ptot,pt, phi, theta;
104 ptot = fFMomentum->GetRandom();
105 phi = fFPhi->GetRandom();
106 theta = fFTheta->GetRandom();
107 pt = ptot*TMath::Sin(theta);
108 mom[0] = pt*TMath::Cos(phi);
109 mom[1] = pt*TMath::Sin(phi);
110 mom[2] = ptot*TMath::Cos(theta);
113 fFPosition->GetRandom3(pos[0],pos[1],pos[2]);
117 pdg = TMath::Nint(fFPdg->GetRandom());
118 if (!IntersectCylinder(fRefRadius,fZmin, fZmax, pdg, posf, mom)) continue;
121 Float_t polarization[3]= {0,0,0};
123 PushTrack(fTrackIt,-1,pdg,mom, posf, polarization,0,kPPrimary,nt);
130 //-----------------------------------------------------------------------------
131 void AliGenFunction::Init()
134 // Initialisation, check consistency of selected ranges
136 printf("************ AliGenFunction ****************\n");
137 printf("************************************************\n");
139 AliFatal("Momentum distribution function not specified");
142 AliFatal("Position distribution function not specified");
145 AliFatal("PDG distribution function not specified");
148 AliFatal("Z range not specified");
154 void AliGenFunction::SetFunctions(TF1 * momentum, TF1 *fphi, TF1 *ftheta,TF3 * position, TF1* pdg){
158 fFMomentum = momentum;
161 fFPosition = position;
165 void AliGenFunction::SetCylinder(Double_t refR, Double_t zmin, Double_t zmax){
169 fRefRadius = refR; // reference radius to be crossed
170 fZmin = zmin; // minimal z at reference radius
171 fZmax = zmax; // maximal z at reference radius
176 //-----------------------------------------------------------------------------
177 Bool_t AliGenFunction::IntersectCylinder(Float_t r,Float_t zmin, Float_t zmax,Int_t pdg,
178 Float_t o[3],Float_t p[3]) const
181 // Intersection between muon and cylinder [-z,+z] with radius r
184 if (TDatabasePDG::Instance()->GetParticle(pdg)){
185 mass = TDatabasePDG::Instance()->GetParticle(13)->Mass();
188 Float_t en = TMath::Sqrt(mass*mass+p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
189 TParticle part(pdg,0,0,0,0,0,p[0],p[1],p[2],en,o[0],o[1],o[2],0);
190 AliESDtrack track(&part);
191 Double_t pos[3]={0.,0.,0.},sigma[3]={0.,0.,0.};
192 AliESDVertex origin(pos,sigma);
194 track.RelateToVertex(&origin,fBkG,10000.);
196 Float_t d0z0[2],covd0z0[3];
197 track.GetImpactParameters(d0z0,covd0z0);
200 if(TMath::Abs(d0z0[0])>r) return kFALSE;
202 if(d0z0[1]>zmax) return kFALSE;
203 if(d0z0[1]<zmin) return kFALSE;