388f2c07 |
1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
3 | * * |
4 | * Author: The ALICE Off-line Project. * |
5 | * Contributors are mentioned in the code where appropriate. * |
6 | * * |
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 | **************************************************************************/ |
15 | |
803d1ab0 |
16 | /* $Id$ */ |
88cb7938 |
17 | |
388f2c07 |
18 | /////////////////////////////////////////////////////////////////// |
19 | // Parameterisation of pi, K, n and p eta and pt distributions // |
20 | // eta: according to HIJING (shadowing + quenching) // |
21 | // pT : according to CDF measurement at 1.8 TeV // |
22 | // Author: andreas.morsch@cern.ch // |
23 | // // |
24 | /////////////////////////////////////////////////////////////////// |
25 | |
116cbefd |
26 | #include <TArrayF.h> |
27 | #include <TF1.h> |
28 | #include <TPDGCode.h> |
29 | |
30 | #include "AliConst.h" |
388f2c07 |
31 | #include "AliGenEventHeader.h" |
116cbefd |
32 | #include "AliGenHIJINGparaBa.h" |
388f2c07 |
33 | #include "AliRun.h" |
388f2c07 |
34 | |
35 | ClassImp(AliGenHIJINGparaBa) |
36 | |
37 | |
38 | static Double_t ptpi(Double_t *px, Double_t *) |
39 | { |
40 | // |
41 | // PT-PARAMETERIZATION CDF, PRL 61(88) 1819 |
42 | // POWER LAW FOR PT > 500 MEV |
43 | // MT SCALING BELOW (T=160 MEV) |
44 | // |
45 | const Double_t kp0 = 1.3; |
46 | const Double_t kxn = 8.28; |
47 | const Double_t kxlim=0.5; |
48 | const Double_t kt=0.160; |
49 | const Double_t kxmpi=0.139; |
50 | const Double_t kb=1.; |
51 | Double_t y, y1, xmpi2, ynorm, a; |
52 | Double_t x=*px; |
53 | // |
54 | y1=TMath::Power(kp0/(kp0+kxlim),kxn); |
55 | xmpi2=kxmpi*kxmpi; |
56 | ynorm=kb*(TMath::Exp(-sqrt(kxlim*kxlim+xmpi2)/kt)); |
57 | a=ynorm/y1; |
58 | if (x > kxlim) |
59 | y=a*TMath::Power(kp0/(kp0+x),kxn); |
60 | else |
61 | y=kb*TMath::Exp(-sqrt(x*x+xmpi2)/kt); |
62 | return y*x; |
63 | } |
64 | |
65 | //_____________________________________________________________________________ |
66 | static Double_t ptscal(Double_t pt, Int_t np) |
67 | { |
68 | // SCALING EN MASSE PAR RAPPORT A PTPI |
69 | // MASS PI,K,ETA,RHO,OMEGA,ETA',PHI |
70 | const Double_t khm[10] = {.13957,.493,.5488,.769,.7826,.958,1.02,0,0,0}; |
71 | // VALUE MESON/PI AT 5 GEV |
72 | const Double_t kfmax[10]={1.,0.3,0.55,1.0,1.0,1.0,1.0,0,0,0}; |
73 | np--; |
74 | Double_t f5=TMath::Power((( |
75 | sqrt(100.018215)+2.)/(sqrt(100.+khm[np]*khm[np])+2.0)),12.3); |
76 | Double_t fmax2=f5/kfmax[np]; |
77 | // PIONS |
78 | Double_t ptpion=100.*ptpi(&pt, (Double_t*) 0); |
79 | Double_t fmtscal=TMath::Power((( |
80 | sqrt(pt*pt+0.018215)+2.)/ (sqrt(pt*pt+khm[np]*khm[np])+2.0)),12.3)/ |
81 | fmax2; |
82 | return fmtscal*ptpion; |
83 | } |
84 | |
85 | //_____________________________________________________________________________ |
86 | static Double_t ptka( Double_t *px, Double_t *) |
87 | { |
88 | // |
89 | // pt parametrisation for k |
90 | // |
91 | return ptscal(*px,2); |
92 | } |
93 | |
94 | |
95 | //_____________________________________________________________________________ |
96 | static Double_t etapic( Double_t *py, Double_t *) |
97 | { |
98 | // |
99 | // eta parametrisation for pi |
100 | // |
101 | const Double_t ka1 = 4913.; |
102 | const Double_t ka2 = 1819.; |
103 | const Double_t keta1 = 0.22; |
104 | const Double_t keta2 = 3.66; |
105 | const Double_t kdeta1 = 1.47; |
106 | const Double_t kdeta2 = 1.51; |
107 | Double_t y=TMath::Abs(*py); |
108 | // |
109 | Double_t ex1 = (y-keta1)*(y-keta1)/(2*kdeta1*kdeta1); |
110 | Double_t ex2 = (y-keta2)*(y-keta2)/(2*kdeta2*kdeta2); |
111 | return ka1*TMath::Exp(-ex1)+ka2*TMath::Exp(-ex2); |
112 | } |
113 | |
114 | //_____________________________________________________________________________ |
115 | static Double_t etakac( Double_t *py, Double_t *) |
116 | { |
117 | // |
118 | // eta parametrisation for ka |
119 | // |
120 | const Double_t ka1 = 497.6; |
121 | const Double_t ka2 = 215.6; |
122 | const Double_t keta1 = 0.79; |
123 | const Double_t keta2 = 4.09; |
124 | const Double_t kdeta1 = 1.54; |
125 | const Double_t kdeta2 = 1.40; |
126 | Double_t y=TMath::Abs(*py); |
127 | // |
128 | Double_t ex1 = (y-keta1)*(y-keta1)/(2*kdeta1*kdeta1); |
129 | Double_t ex2 = (y-keta2)*(y-keta2)/(2*kdeta2*kdeta2); |
130 | return ka1*TMath::Exp(-ex1)+ka2*TMath::Exp(-ex2); |
131 | } |
132 | |
133 | static Double_t ptbaryon( Double_t *px, Double_t *) |
134 | { |
135 | // baryons |
136 | // pt-distribution |
137 | //____________________________________________________________ |
138 | |
139 | return ptscal(*px,7); // 7==> Baryon in the PtScal function |
140 | } |
141 | |
142 | static Double_t etabaryon( Double_t *py, Double_t *) |
143 | { |
144 | // eta-distribution |
145 | //____________________________________________________________ |
0af12c00 |
146 | const Float_t kp0 = 1.10343e+02; |
147 | const Float_t kp1 = 1.73247e+01; |
148 | const Float_t kp2 = -7.23808e+00; |
149 | const Float_t kp3 = 4.48334e-01; |
150 | const Double_t ky = TMath::Abs(*py); |
388f2c07 |
151 | // |
0af12c00 |
152 | return (kp0+kp1*ky+kp2*ky*ky+kp3*ky*ky*ky)/20.; |
388f2c07 |
153 | } |
154 | |
155 | AliGenHIJINGparaBa::AliGenHIJINGparaBa() |
1c56e311 |
156 | :AliGenHIJINGpara(), |
157 | fPtba(0), |
158 | fETAba(0) |
388f2c07 |
159 | { |
160 | // |
161 | // Default constructor |
162 | // |
163 | fName="HIGINGparaBa"; |
164 | fTitle="HIJING Parametrisation Particle Generator with Baryons"; |
388f2c07 |
165 | } |
166 | |
167 | //_____________________________________________________________________________ |
168 | AliGenHIJINGparaBa::AliGenHIJINGparaBa(Int_t npart) |
1c56e311 |
169 | :AliGenHIJINGpara(npart), |
170 | fPtba(0), |
171 | fETAba(0) |
388f2c07 |
172 | { |
173 | // |
174 | // Standard constructor |
175 | // |
176 | fName="HIGINGparaBa"; |
177 | fTitle="HIJING Parametrisation Particle Generator with Baryons"; |
388f2c07 |
178 | } |
179 | |
180 | //_____________________________________________________________________________ |
181 | AliGenHIJINGparaBa::~AliGenHIJINGparaBa() |
182 | { |
183 | // |
184 | // Standard destructor |
185 | // |
186 | delete fPtba; |
187 | delete fETAba; |
188 | } |
189 | |
190 | //_____________________________________________________________________________ |
191 | void AliGenHIJINGparaBa::Init() |
192 | { |
193 | // |
194 | // Initialise the HIJING parametrisation |
195 | // |
196 | Float_t etaMin =-TMath::Log(TMath::Tan( |
197 | TMath::Min((Double_t)fThetaMax/2,TMath::Pi()/2-1.e-10))); |
198 | Float_t etaMax = -TMath::Log(TMath::Tan( |
199 | TMath::Max((Double_t)fThetaMin/2,1.e-10))); |
200 | fPtpi = new TF1("ptpi",&ptpi,0,20,0); |
201 | fPtka = new TF1("ptka",&ptka,0,20,0); |
202 | fPtba = new TF1("ptbaryon",&ptbaryon,0,20,0); |
203 | fETApic = new TF1("etapic",&etapic,etaMin,etaMax,0); |
204 | fETAkac = new TF1("etakac",&etakac,etaMin,etaMax,0); |
205 | fETAba = new TF1("etabaryon",&etabaryon,etaMin,etaMax,0); |
206 | |
2a336e15 |
207 | TF1 etaPic0("etapic(-7,7)",&etapic, -7, 7, 0); |
208 | TF1 etaKac0("etakac(-7,7)",&etakac, -7, 7, 0); |
209 | TF1 etaBar0("etabar(-7,7)",&etabaryon, -7, 7, 0); |
388f2c07 |
210 | |
2a336e15 |
211 | TF1 ptPic0("ptpi(0,15)", &ptpi, 0., 15., 0); |
212 | TF1 ptKac0("ptka(0,15)", &ptka, 0., 15., 0); |
213 | TF1 ptBar0("ptbar(0,15)", &ptbaryon, 0., 15., 0); |
388f2c07 |
214 | |
2a336e15 |
215 | Float_t intETApi = etaPic0.Integral(-0.5, 0.5); |
216 | Float_t intETAka = etaKac0.Integral(-0.5, 0.5); |
217 | Float_t intETAba = etaBar0.Integral(-0.5, 0.5); |
388f2c07 |
218 | |
219 | Float_t scalePi = 6979./(intETApi/1.5); |
220 | Float_t scaleKa = 657./(intETAka/2.0); |
221 | Float_t scaleBa = 364./(intETAba/2.0); |
222 | |
223 | // Fraction of events corresponding to the selected pt-range |
2a336e15 |
224 | Float_t intPt = (0.837*ptPic0.Integral(0, 15)+ |
225 | 0.105*ptKac0.Integral(0, 15)+ |
226 | 0.058*ptBar0.Integral(0, 15)); |
227 | Float_t intPtSel = (0.837*ptPic0.Integral(fPtMin, fPtMax)+ |
228 | 0.105*ptKac0.Integral(fPtMin, fPtMax)+ |
229 | 0.058*ptBar0.Integral(fPtMin, fPtMax)); |
388f2c07 |
230 | Float_t ptFrac = intPtSel/intPt; |
231 | |
232 | // Fraction of events corresponding to the selected eta-range |
2a336e15 |
233 | Float_t intETASel = (scalePi*etaPic0.Integral(etaMin, etaMax)+ |
234 | scaleKa*etaKac0.Integral(etaMin, etaMax)+ |
235 | scaleBa*etaBar0.Integral(etaMin, etaMax)); |
388f2c07 |
236 | // Fraction of events corresponding to the selected phi-range |
237 | Float_t phiFrac = (fPhiMax-fPhiMin)/2/TMath::Pi(); |
238 | |
239 | fParentWeight = Float_t(fNpart)/(intETASel*ptFrac*phiFrac); |
240 | |
241 | printf("%s: The number of particles in the selected kinematic region corresponds to %f percent of a full event \n", |
242 | ClassName(),100.*fParentWeight); |
243 | |
244 | // Issue warning message if etaMin or etaMax are outside the alowed range |
245 | // of the parametrization |
246 | if (etaMin < -8.001 || etaMax > 8.001) { |
247 | printf("\n \n WARNING FROM AliGenHIJINGParaBa !"); |
248 | printf("\n YOU ARE USING THE PARAMETERISATION OUTSIDE "); |
249 | printf("\n THE ALLOWED PSEUDORAPIDITY RANGE (-8. - 8.)"); |
250 | printf("\n YOUR LIMITS: %f %f \n \n ", etaMin, etaMax); |
251 | } |
252 | } |
253 | |
254 | //_____________________________________________________________________________ |
255 | void AliGenHIJINGparaBa::Generate() |
256 | { |
257 | // |
258 | // Generate one trigger |
259 | // |
260 | |
261 | |
262 | const Float_t kBorne1 = 0.837; |
263 | const Float_t kBorne2 = kBorne1+0.105; |
264 | |
265 | Float_t polar[3]= {0,0,0}; |
266 | // |
267 | const Int_t kPions[3] = {kPi0, kPiPlus, kPiMinus}; |
268 | const Int_t kKaons[4] = {kK0Long, kK0Short, kKPlus, kKMinus}; |
269 | const Int_t kBaryons[4] = {kProton, kProtonBar, kNeutron, kNeutronBar}; |
270 | // |
271 | Float_t origin[3]; |
272 | Float_t pt, pl, ptot; |
273 | Float_t phi, theta; |
274 | Float_t p[3]; |
275 | Int_t i, part, nt, j; |
276 | // |
277 | TF1 *ptf; |
278 | TF1 *etaf; |
279 | // |
280 | Float_t random[6]; |
281 | // |
282 | for (j=0;j<3;j++) origin[j]=fOrigin[j]; |
283 | |
284 | if(fVertexSmear == kPerEvent) { |
285 | Float_t dv[3]; |
286 | dv[2] = 1.e10; |
287 | while(TMath::Abs(dv[2]) > fCutVertexZ*fOsigma[2]) { |
288 | Rndm(random,6); |
289 | for (j=0; j < 3; j++) { |
290 | dv[j] = fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())* |
291 | TMath::Sqrt(-2*TMath::Log(random[2*j+1])); |
292 | } |
293 | } |
294 | for (j=0; j < 3; j++) origin[j] += dv[j]; |
295 | } // if kPerEvent |
296 | TArrayF eventVertex; |
297 | eventVertex.Set(3); |
298 | eventVertex[0] = origin[0]; |
299 | eventVertex[1] = origin[1]; |
300 | eventVertex[2] = origin[2]; |
301 | |
302 | for(i=0;i<fNpart;i++) { |
303 | while(1) { |
304 | Rndm(random,3); |
305 | if(random[0] < kBorne1) { |
306 | part = kPions[Int_t (random[1]*3)]; |
307 | ptf = fPtpi; |
308 | etaf = fETApic; |
309 | } else if (random[0] < kBorne2) { |
310 | part = kKaons[Int_t (random[1]*4)]; |
311 | ptf = fPtka; |
312 | etaf = fETAkac; |
313 | } else { |
314 | part = kBaryons[Int_t (random[1]*4)]; |
315 | ptf = fPtba; |
316 | etaf = fETAba; |
317 | } |
318 | |
319 | phi=fPhiMin+random[2]*(fPhiMax-fPhiMin); |
320 | theta=2*TMath::ATan(TMath::Exp(-etaf->GetRandom())); |
321 | if(theta<fThetaMin || theta>fThetaMax) continue; |
322 | pt=ptf->GetRandom(); |
323 | pl=pt/TMath::Tan(theta); |
324 | ptot=TMath::Sqrt(pt*pt+pl*pl); |
325 | if(ptot<fPMin || ptot>fPMax) continue; |
326 | p[0]=pt*TMath::Cos(phi); |
327 | p[1]=pt*TMath::Sin(phi); |
328 | p[2]=pl; |
329 | if(fVertexSmear==kPerTrack) { |
330 | Rndm(random,6); |
331 | for (j=0;j<3;j++) { |
332 | origin[j]=fOrigin[j]+fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())* |
333 | TMath::Sqrt(-2*TMath::Log(random[2*j+1])); |
334 | } |
335 | } |
642f15cf |
336 | PushTrack(fTrackIt,-1,part,p,origin,polar,0,kPPrimary,nt,fParentWeight); |
388f2c07 |
337 | break; |
338 | } // while(1) |
339 | } // Particle loop |
340 | // Header |
341 | AliGenEventHeader* header = new AliGenEventHeader("HIJINGparam"); |
342 | // Event Vertex |
343 | header->SetPrimaryVertex(eventVertex); |
344 | gAlice->SetGenEventHeader(header); |
345 | } |
346 | |
347 | |
348 | |