1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 **************************************************************************/
18 Revision 1.17 2002/11/07 09:06:10 morsch
19 J/Psi and Upsilon pt and y distributions from R. Vogt 2002 added.
21 Revision 1.16 2002/10/14 14:55:35 hristov
22 Merging the VirtualMC branch to the main development branch (HEAD)
24 Revision 1.14.6.1 2002/06/10 14:57:41 hristov
27 Revision 1.15 2002/04/17 10:11:51 morsch
28 Coding Rule violations corrected.
30 Revision 1.14 2002/02/22 17:26:43 morsch
33 Revision 1.13 2001/03/27 11:01:04 morsch
34 Charm pt-distribution corrected. More realistic y-distribution for pi and K.
36 Revision 1.12 2001/03/09 13:01:41 morsch
37 - enum constants for paramterisation type (particle family) moved to AliGen*lib.h
38 - use AliGenGSIlib::kUpsilon, AliGenPHOSlib::kEtaPrime to access the constants
40 Revision 1.11 2000/11/30 07:12:50 alibrary
41 Introducing new Rndm and QA classes
43 Revision 1.10 2000/06/29 21:08:27 morsch
44 All paramatrisation libraries derive from the pure virtual base class AliGenLib.
45 This allows to pass a pointer to a library directly to AliGenParam and avoids the
46 use of function pointers in Config.C.
48 Revision 1.9 2000/06/14 15:20:56 morsch
51 Revision 1.8 2000/06/09 20:32:11 morsch
52 All coding rule violations except RS3 corrected
54 Revision 1.7 2000/05/02 08:12:13 morsch
55 Coding rule violations corrected.
57 Revision 1.6 1999/09/29 09:24:14 fca
58 Introduction of the Copyright and cvs Log
62 // Library class for particle pt and y distributions used for
63 // muon spectrometer simulations.
64 // To be used with AliGenParam.
65 // The following particle typed can be simulated:
66 // pi, K, phi, omega, eta, J/Psi, Upsilon, charm and beauty mesons.
68 // andreas.morsch@cern.ch
74 #include "AliGenMUONlib.h"
76 ClassImp(AliGenMUONlib)
79 Double_t AliGenMUONlib::PtPion(Double_t *px, Double_t *dummy)
82 // PT-PARAMETERIZATION CDF, PRL 61(88) 1819
83 // POWER LAW FOR PT > 500 MEV
84 // MT SCALING BELOW (T=160 MEV)
86 const Double_t kp0 = 1.3;
87 const Double_t kxn = 8.28;
88 const Double_t kxlim=0.5;
89 const Double_t kt=0.160;
90 const Double_t kxmpi=0.139;
92 Double_t y, y1, xmpi2, ynorm, a;
95 y1=TMath::Power(kp0/(kp0+kxlim),kxn);
97 ynorm=kb*(TMath::Exp(-sqrt(kxlim*kxlim+xmpi2)/kt));
100 y=a*TMath::Power(kp0/(kp0+x),kxn);
102 y=kb*TMath::Exp(-sqrt(x*x+xmpi2)/kt);
108 Double_t AliGenMUONlib::YPion( Double_t *py, Double_t *dummy)
111 Double_t y=TMath::Abs(*py);
113 const Double_t ka = 7000.;
114 const Double_t kdy = 4.;
115 Double_t ex = y*y/(2*kdy*kdy);
116 return ka*TMath::Exp(-ex);
118 return 1.16526e+04+y*-3.79886e+03+y*y*4.31130e+02;
121 // particle composition
123 Int_t AliGenMUONlib::IpPion(TRandom *ran)
126 if (ran->Rndm() < 0.5) {
133 //____________________________________________________________
137 Double_t AliGenMUONlib::PtScal(Double_t pt, Int_t np)
139 // SCALING EN MASSE PAR RAPPORT A PTPI
140 // MASS PI,K,ETA,RHO,OMEGA,ETA',PHI
141 const Double_t khm[10] = {.13957,.493,.5488,.769,.7826,.958,1.02,0,0,0};
142 // VALUE MESON/PI AT 5 GEV
143 const Double_t kfmax[10]={1.,0.3,0.55,1.0,1.0,1.0,1.0,0,0,0};
145 Double_t f5=TMath::Power(((sqrt(100.018215)+2.)/(sqrt(100.+khm[np]*khm[np])+2.0)),12.3);
146 Double_t fmax2=f5/kfmax[np];
148 Double_t ptpion=100.*PtPion(&pt, (Double_t*) 0);
149 Double_t fmtscal=TMath::Power(((sqrt(pt*pt+0.018215)+2.)/
150 (sqrt(pt*pt+khm[np]*khm[np])+2.0)),12.3)/ fmax2;
151 return fmtscal*ptpion;
157 //____________________________________________________________
158 Double_t AliGenMUONlib::PtKaon( Double_t *px, Double_t *dummy)
161 return PtScal(*px,2);
165 //____________________________________________________________
166 Double_t AliGenMUONlib::YKaon( Double_t *py, Double_t *dummy)
169 Double_t y=TMath::Abs(*py);
171 const Double_t ka = 1000.;
172 const Double_t kdy = 4.;
174 Double_t ex = y*y/(2*kdy*kdy);
175 return ka*TMath::Exp(-ex);
178 return 1.16526e+04+y*-3.79886e+03+y*y*4.31130e+02;
181 // particle composition
183 Int_t AliGenMUONlib::IpKaon(TRandom *ran)
186 if (ran->Rndm() < 0.5) {
197 //____________________________________________________________
198 Double_t AliGenMUONlib::PtJpsi( Double_t *px, Double_t *dummy)
201 const Double_t kpt0 = 4.;
202 const Double_t kxn = 3.6;
205 Double_t pass1 = 1.+(x/kpt0)*(x/kpt0);
206 return x/TMath::Power(pass1,kxn);
209 Double_t AliGenMUONlib::PtJpsiPbPb( Double_t *px, Double_t *dummy)
216 // mc = 1.4 GeV, pt-kick 1 GeV
219 Float_t ptJpsi[100] = {
220 0.0000e-01, 4.5870e+01, 6.5200e+01, 7.1740e+01, 6.5090e+01,
221 5.5070e+01, 4.9420e+01, 3.9780e+01, 3.2390e+01, 2.8120e+01,
222 2.3870e+01, 1.9540e+01, 1.6510e+01, 1.4180e+01, 1.2050e+01,
223 1.0390e+01, 8.7970e+00, 7.8680e+00, 6.7710e+00, 5.9360e+00,
224 5.3460e+00, 4.5670e+00, 4.6500e+00, 3.9360e+00, 3.5070e+00,
225 3.2070e+00, 2.8310e+00, 2.6340e+00, 2.4900e+00, 2.2410e+00,
226 2.1090e+00, 1.9070e+00, 1.7360e+00, 1.6120e+00, 1.5450e+00,
227 1.4350e+00, 1.3890e+00, 1.2610e+00, 1.0880e+00, 1.0930e+00,
228 1.0680e+00, 9.2500e-01, 8.6790e-01, 8.1790e-01, 7.9770e-01,
229 7.4660e-01, 7.3110e-01, 6.5120e-01, 6.8140e-01, 5.7960e-01,
230 5.8210e-01, 5.4640e-01, 5.1700e-01, 5.0760e-01, 4.8280e-01,
231 4.5360e-01, 4.4910e-01, 4.2410e-01, 4.2100e-01, 3.9530e-01,
232 3.7220e-01, 3.4840e-01, 3.4550e-01, 3.3000e-01, 3.1670e-01,
233 3.1470e-01, 2.8920e-01, 2.7650e-01, 2.6860e-01, 2.5390e-01,
234 2.4190e-01, 2.5200e-01, 2.2960e-01, 2.2540e-01, 2.0950e-01,
235 2.0250e-01, 1.8720e-01, 1.8200e-01, 1.7860e-01, 1.8290e-01,
236 1.6970e-01, 1.7130e-01, 1.6310e-01, 1.5500e-01, 1.5100e-01,
237 1.5770e-01, 1.4240e-01, 1.4560e-01, 1.3330e-01, 1.4190e-01,
238 1.2010e-01, 1.2430e-01, 1.2430e-01, 1.1340e-01, 1.1840e-01,
239 1.1380e-01, 1.0330e-01, 1.0130e-01, 1.0390e-01, 9.5810e-02
241 Float_t x = px[0] * px[0];
242 if (x < 1.5 || x > 100) {
245 Float_t y = Interpolate(x, ptJpsi, 0.5, 1., 100, 4);
251 //____________________________________________________________
252 Double_t AliGenMUONlib::YJpsi(Double_t *py, Double_t *dummy)
255 const Double_t ky0 = 4.;
256 const Double_t kb=1.;
258 Double_t y=TMath::Abs(*py);
263 yj=kb*TMath::Exp(-(y-ky0)*(y-ky0)/2);
268 Double_t AliGenMUONlib::YJpsiPbPb( Double_t *px, Double_t *dummy)
278 // mc = 1.4 GeV, pt-kick 1 GeV
283 0.3981E-03, 0.1169E-01, 0.6143E-01, 0.3554E+00, 0.1249E+01
284 , 0.1677E+01, 0.3634E+01, 0.5414E+01, 0.8242E+01, 0.1102E+02
285 , 0.1353E+02, 0.1964E+02, 0.2357E+02, 0.2662E+02, 0.3023E+02
286 , 0.3250E+02, 0.3137E+02, 0.3243E+02, 0.3120E+02, 0.3249E+02
287 , 0.3166E+02, 0.3104E+02, 0.3203E+02, 0.3149E+02, 0.3117E+02
288 , 0.3210E+02, 0.3170E+02, 0.3279E+02, 0.3079E+02, 0.3208E+02
289 , 0.3218E+02, 0.3218E+02, 0.3208E+02, 0.3079E+02, 0.3279E+02
290 , 0.3170E+02, 0.3210E+02, 0.3118E+02, 0.3149E+02, 0.3203E+02
291 , 0.3104E+02, 0.3167E+02, 0.3250E+02, 0.3120E+02, 0.3243E+02
292 , 0.3137E+02, 0.3250E+02, 0.3022E+02, 0.2662E+02, 0.2357E+02
293 , 0.1964E+02, 0.1353E+02, 0.1102E+02, 0.8242E+01, 0.5414E+01
294 , 0.3634E+01, 0.1677E+01, 0.1249E+01, 0.3554E+00, 0.6142E-01
295 , 0.1169E-01, 0.3981E-03};
297 return Interpolate(px[0], yJpsi, -7.625, 0.25, 62, 2);
300 // particle composition
302 Int_t AliGenMUONlib::IpJpsi(TRandom *)
312 //____________________________________________________________
313 Double_t AliGenMUONlib::PtUpsilon( Double_t *px, Double_t *dummy )
316 const Double_t kpt0 = 5.3;
317 const Double_t kxn = 2.5;
320 Double_t pass1 = 1.+(x/kpt0)*(x/kpt0);
321 return x/TMath::Power(pass1,kxn);
324 Double_t AliGenMUONlib::PtUpsilonPbPb( Double_t *px, Double_t *dummy)
334 // mc = 1.4 GeV, pt-kick 1 GeV
339 0.0000e-01, -1.5290e-02, 2.6020e-01, 3.4220e-01, 3.3710e-01,
340 3.1880e-01, 3.3420e-01, 2.7740e-01, 2.3730e-01, 2.0640e-01,
341 1.7690e-01, 1.6190e-01, 1.4500e-01, 1.3310e-01, 1.1440e-01,
342 1.0800e-01, 1.0210e-01, 8.4690e-02, 8.0050e-02, 7.0710e-02,
343 6.4160e-02, 6.5200e-02, 6.6890e-02, 6.0600e-02, 5.4030e-02,
344 5.1140e-02, 4.6120e-02, 4.4800e-02, 4.2490e-02, 4.1440e-02,
345 4.0310e-02, 3.7110e-02, 3.5890e-02, 3.5420e-02, 3.0370e-02,
346 2.9970e-02, 3.0770e-02, 2.6380e-02, 2.7740e-02, 2.6690e-02,
347 2.4210e-02, 2.5200e-02, 2.3760e-02, 2.1370e-02, 2.2290e-02,
348 2.2700e-02, 2.0110e-02, 1.9320e-02, 1.8830e-02, 1.9910e-02,
349 1.9740e-02, 1.8460e-02, 1.8240e-02, 1.6740e-02, 1.6140e-02,
350 1.7340e-02, 1.5950e-02, 1.5430e-02, 1.4780e-02, 1.2750e-02,
351 1.4370e-02, 1.2810e-02, 1.2900e-02, 1.1070e-02, 1.1830e-02,
352 1.1150e-02, 1.1260e-02, 1.1610e-02, 1.0700e-02, 1.1600e-02,
353 1.0390e-02, 1.0280e-02, 1.0180e-02, 1.0030e-02, 9.6050e-03,
354 8.8050e-03, 8.9680e-03, 9.0120e-03, 8.4110e-03, 8.6660e-03,
355 8.3060e-03, 8.5850e-03, 8.2600e-03, 8.3800e-03, 8.4200e-03,
356 7.5690e-03, 7.2100e-03, 7.1230e-03, 7.3350e-03, 7.1980e-03,
357 6.7500e-03, 6.6190e-03, 6.3370e-03, 6.6270e-03, 6.8290e-03,
358 6.0880e-03, 6.6310e-03, 6.0490e-03, 5.8900e-03, 5.6100e-03
360 Float_t x = px[0] * px[0];
361 if (x < 1.5 || x > 100) {
364 Float_t y = Interpolate(x, ptUps, 0.5, 1., 100, 4);
372 //____________________________________________________________
373 Double_t AliGenMUONlib::YUpsilon(Double_t *py, Double_t *dummy)
376 const Double_t ky0 = 3.;
377 const Double_t kb=1.;
379 Double_t y=TMath::Abs(*py);
384 yu=kb*TMath::Exp(-(y-ky0)*(y-ky0)/2);
389 Double_t AliGenMUONlib::YUpsilonPbPb( Double_t *px, Double_t *dummy)
399 // mc = 1.4 GeV, pt-kick 1 GeV
404 0.000000, 0.000065, 0.000767, 0.004332, 0.014790,
405 0.029370, 0.052060, 0.077930, 0.122500, 0.135800,
406 0.184000, 0.207900, 0.228300, 0.258500, 0.269500,
407 0.288500, 0.316200, 0.304100, 0.315800, 0.323300,
408 0.322400, 0.322600, 0.345500, 0.338100, 0.331900,
409 0.343700, 0.343700, 0.331900, 0.338100, 0.345500,
410 0.322600, 0.322400, 0.323300, 0.315800, 0.304100,
411 0.316200, 0.288500, 0.269500, 0.258500, 0.228300,
412 0.207900, 0.184000, 0.135800, 0.122500, 0.077930,
413 0.052060, 0.029380, 0.014780, 0.004332, 0.000767,
414 0.6479E-04, 0.1013E-06
419 return Interpolate(px[0], yUps, -6.5, 0.25, 52, 2);
422 // particle composition
424 Int_t AliGenMUONlib::IpUpsilon(TRandom *)
434 // pt-distribution (by scaling of pion distribution)
435 //____________________________________________________________
436 Double_t AliGenMUONlib::PtPhi( Double_t *px, Double_t *dummy)
439 return PtScal(*px,7);
442 Double_t AliGenMUONlib::YPhi( Double_t *px, Double_t *dummy)
446 return YJpsi(px,dum);
448 // particle composition
450 Int_t AliGenMUONlib::IpPhi(TRandom *)
460 // pt-distribution (by scaling of pion distribution)
461 //____________________________________________________________
462 Double_t AliGenMUONlib::PtOmega( Double_t *px, Double_t *dummy)
465 return PtScal(*px,5);
468 Double_t AliGenMUONlib::YOmega( Double_t *px, Double_t *dummy)
472 return YJpsi(px,dum);
474 // particle composition
476 Int_t AliGenMUONlib::IpOmega(TRandom *)
487 // pt-distribution (by scaling of pion distribution)
488 //____________________________________________________________
489 Double_t AliGenMUONlib::PtEta( Double_t *px, Double_t *dummy)
492 return PtScal(*px,3);
495 Double_t AliGenMUONlib::YEta( Double_t *px, Double_t *dummy)
499 return YJpsi(px,dum);
501 // particle composition
503 Int_t AliGenMUONlib::IpEta(TRandom *)
514 //____________________________________________________________
515 Double_t AliGenMUONlib::PtCharm( Double_t *px, Double_t *dummy)
518 const Double_t kpt0 = 4.08;
519 const Double_t kxn = 9.40;
523 Double_t pass1 = 1.+(x/kpt0);
524 return x/TMath::Power(pass1,kxn);
527 Double_t AliGenMUONlib::YCharm( Double_t *px, Double_t *dummy)
531 return YJpsi(px,dum);
534 Int_t AliGenMUONlib::IpCharm(TRandom *ran)
540 random = ran->Rndm();
543 } else if (random < 0.75) {
545 } else if (random < 0.90) {
550 if (ran->Rndm() < 0.5) {ip=-ip;}
561 //____________________________________________________________
562 Double_t AliGenMUONlib::PtBeauty( Double_t *px, Double_t *dummy)
565 const Double_t kpt0 = 4.;
566 const Double_t kxn = 3.6;
569 Double_t pass1 = 1.+(x/kpt0)*(x/kpt0);
570 return x/TMath::Power(pass1,kxn);
573 Double_t AliGenMUONlib::YBeauty( Double_t *px, Double_t *dummy)
577 return YJpsi(px,dum);
580 Int_t AliGenMUONlib::IpBeauty(TRandom *ran)
582 // Beauty Composition
585 random = ran->Rndm();
588 } else if (random < 0.75) {
590 } else if (random < 0.90) {
595 if (ran->Rndm() < 0.5) {ip=-ip;}
600 typedef Double_t (*GenFunc) (Double_t*, Double_t*);
601 GenFunc AliGenMUONlib::GetPt(Int_t param, const char* tname) const
603 // Return pointer to pT parameterisation
604 TString sname = TString(tname);
618 if (sname == "Vogt") {
625 if (sname == "Vogt") {
645 printf("<AliGenMUONlib::GetPt> unknown parametrisation\n");
650 GenFunc AliGenMUONlib::GetY(Int_t param, const char* tname) const
652 TString sname = TString(tname);
654 // Return pointer to y- parameterisation
668 if (sname == "Vogt") {
675 if (sname == "Vogt") {
695 printf("<AliGenMUONlib::GetY> unknown parametrisation\n");
699 typedef Int_t (*GenFuncIp) (TRandom *);
700 GenFuncIp AliGenMUONlib::GetIp(Int_t param, const char* tname) const
702 // Return pointer to particle type parameterisation
735 printf("<AliGenMUONlib::GetIp> unknown parametrisation\n");
742 Float_t AliGenMUONlib::Interpolate(Float_t x, Float_t* y, Float_t x0,
747 // Neville's alorithm for interpolation
753 // n: number of data points
754 // no: order of polynom
756 Float_t* c = new Float_t[n];
757 Float_t* d = new Float_t[n];
759 for (i = 0; i < n; i++) {
764 Int_t ns = int((x - x0)/dx);
768 for (m = 0; m < no; m++) {
769 for (i = 0; i < n-m; i++) {
770 Float_t ho = x0 + Float_t(i) * dx - x;
771 Float_t hp = x0 + Float_t(i+m+1) * dx - x;
772 Float_t w = c[i+1] - d[i];
780 if (2*ns < (n-m-1)) {