Line data Source code
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 :
16 : /* $Id$ */
17 :
18 : //======================================================================
19 : // AliGenPHOSlib class contains parameterizations of the
20 : // pion, kaon, eta, omega, etaprime, phi and baryon (proton,
21 : // antiproton, neutron and anti-neutron) particles for the
22 : // study of the neutral background in PHOS detector.
23 : // These parameterizations are used by the
24 : // AliGenParam class:
25 : // AliGenParam(npar, param, AliGenPHOSlib::GetPt(param),
26 : // AliGenPHOSlib::GetY(param),
27 : // AliGenPHOSlib::GetIp(param) )
28 : // param represents the particle to be simulated :
29 : // Pion, Kaon, Eta, Omega, Etaprime, Phi or Baryon
30 : // Pt distributions are calculated from the transverse mass scaling
31 : // with Pions, using the PtScal function taken from AliGenMUONlib
32 : // version aliroot 3.01
33 : //
34 : // Gines MARTINEZ. Laurent APHECETCHE and Yves SCHUTZ
35 : // GPS @ SUBATECH, Nantes , France (October 1999)
36 : // http://www-subatech.in2p3.fr/~photons/subatech
37 : // martinez@subatech.in2p3.fr
38 : // Additional particle species simulation options has been added:
39 : // Charged Pion, Charged Kaons, KLong Proton, Anti-Proton, Neutron,
40 : // Anti-Neutron --> Changes made by Gustavo Conesa in November 2004
41 : // Add flat Omega(782) distribution in Nov. 2010 by Renzhuo WAN
42 : //======================================================================
43 :
44 : #include "TMath.h"
45 : #include "TRandom.h"
46 :
47 : #include "AliGenPHOSlib.h"
48 :
49 6 : ClassImp(AliGenPHOSlib)
50 :
51 : //======================================================================
52 : // P I O N S
53 : // (From GetPt, GetY and GetIp as param = Pion)
54 : // Transverse momentum distribution" PtPion
55 : // Rapidity distribution YPion
56 : // Particle distribution IdPion 111, 211 and -211 (pi0, pi+ and pi-)
57 : //
58 : Double_t AliGenPHOSlib::PtPion(const Double_t *px, const Double_t *)
59 : {
60 : // Pion transverse momentum distribtuion taken
61 : // from AliGenMUONlib class, version 3.01 of aliroot
62 : // PT-PARAMETERIZATION CDF, PRL 61(88) 1819
63 : // POWER LAW FOR PT > 500 MEV
64 : // MT SCALING BELOW (T=160 MEV)
65 : //
66 : const Double_t kp0 = 1.3;
67 : const Double_t kxn = 8.28;
68 : const Double_t kxlim=0.5;
69 : const Double_t kt=0.160;
70 : const Double_t kxmpi=0.139;
71 : const Double_t kb=1.;
72 : Double_t y, y1, kxmpi2, ynorm, a;
73 0 : Double_t x=*px;
74 : //
75 0 : y1=TMath::Power(kp0/(kp0+kxlim),kxn);
76 : kxmpi2=kxmpi*kxmpi;
77 0 : ynorm=kb*(TMath::Exp(-sqrt(kxlim*kxlim+kxmpi2)/kt));
78 0 : a=ynorm/y1;
79 0 : if (x > kxlim)
80 0 : y=a*TMath::Power(kp0/(kp0+x),kxn);
81 : else
82 0 : y=kb*TMath::Exp(-sqrt(x*x+kxmpi2)/kt);
83 0 : return y*x;
84 : }
85 : Double_t AliGenPHOSlib::YPion( const Double_t *py, const Double_t *)
86 : {
87 : //
88 : // pion y-distribution
89 : //
90 :
91 : const Double_t ka = 7000.;
92 : const Double_t kdy = 4.;
93 :
94 0 : Double_t y=TMath::Abs(*py);
95 : //
96 0 : Double_t ex = y*y/(2*kdy*kdy);
97 0 : return ka*TMath::Exp(-ex);
98 : }
99 :
100 : Int_t AliGenPHOSlib::IpPion(TRandom */*ran*/)
101 : {
102 : // particle composition pi+, pi0, pi-
103 : //
104 :
105 0 : return 111 ;
106 : }
107 : Int_t AliGenPHOSlib::IpChargedPion(TRandom *ran)
108 : {
109 : // particle composition pi+, pi0, pi-
110 : //
111 :
112 0 : Float_t random = ran->Rndm();
113 :
114 0 : if ( (2.*random) < 1. )
115 : {
116 0 : return 211 ;
117 : }
118 : else
119 : {
120 0 : return -211 ;
121 : }
122 0 : }
123 :
124 : //End Pions
125 : //======================================================================
126 : // Pi 0 Flat Distribution
127 : // Transverse momentum distribution PtPi0Flat
128 : // Rapidity distribution YPi0Flat
129 : // Particle distribution IdPi0Flat 111 (pi0)
130 : //
131 :
132 : Double_t AliGenPHOSlib::PtPi0(const Double_t * px, const Double_t *)
133 : {
134 : // Pion transverse momentum
135 : const Double_t kp0 =1.35;
136 : const Double_t kxn= 6.18;
137 0 : return TMath::Power(kp0 /(kp0 + px[0]), kxn);
138 : }
139 :
140 : Double_t AliGenPHOSlib::PtPi0Flat(const Double_t */*px*/, const Double_t *)
141 : {
142 : // Pion transverse momentum flat distribution
143 :
144 0 : return 1;
145 :
146 : }
147 :
148 : Double_t AliGenPHOSlib::YPi0Flat( const Double_t */*py*/, const Double_t *)
149 : {
150 :
151 : // pion y-distribution
152 : //
153 0 : return 1.;
154 : }
155 :
156 : Int_t AliGenPHOSlib::IpPi0Flat(TRandom *)
157 : {
158 :
159 : // particle composition pi0
160 : //
161 0 : return 111 ;
162 : }
163 : // End Pi0Flat
164 : //=============================================================
165 : //
166 : Double_t AliGenPHOSlib::PtScal(Double_t pt, Int_t np)
167 : {
168 : // Mt-scaling
169 : // Fonction for the calculation of the Pt distribution for a
170 : // given particle np, from the pion Pt distribution using the
171 : // mt scaling. This function was taken from AliGenMUONlib
172 : // aliroot version 3.01, and was extended for baryons
173 : // np = 1=>Pions 2=>Kaons 3=>Etas 4=>Omegas 5=>ETA' 6=>PHI
174 : // 7=>BARYONS-BARYONBARS
175 :
176 : // SCALING EN MASSE PAR RAPPORT A PTPI
177 : // MASS 0=>PI, 1=>K, 2=>ETA, 3=>OMEGA, 4=>ETA',5=>PHI
178 : const Double_t khm[10] = {0.1396, 0.494, 0.547, 0.782, 0.957, 1.02,
179 : // MASS 6=>BARYON-BARYONBAR
180 : 0.938, 0. , 0., 0.};
181 : // VALUE MESON/PI AT 5 GEV
182 : const Double_t kfmax[10]={1., 1., 1., 1., 1., 1., 1., 1., 1., 1.};
183 0 : Double_t f5=TMath::Power(((sqrt(100.018215)+2.)/(sqrt(100.+khm[np]*khm[np])+2.0)),12.3);
184 0 : Double_t kfmax2=f5/kfmax[np];
185 : // PIONS
186 0 : Double_t ptpion=100.*PtPion(&pt, (Double_t*) 0);
187 0 : Double_t fmtscal=TMath::Power(((sqrt(pt*pt+0.018215)+2.)/
188 0 : (sqrt(pt*pt+khm[np]*khm[np])+2.0)),12.3)/ kfmax2;
189 0 : return fmtscal*ptpion;
190 :
191 : }
192 : // End Scaling
193 : //============================================================================
194 : // K A O N S
195 : Double_t AliGenPHOSlib::PtKaon( const Double_t *px, const Double_t *)
196 : {
197 : // kaon
198 : // pt-distribution
199 : //____________________________________________________________
200 :
201 0 : return PtScal(*px,1); // 1==> Kaon in the PtScal function
202 : }
203 :
204 : Double_t AliGenPHOSlib::YKaon( const Double_t *py, const Double_t *)
205 : {
206 : // y-distribution
207 : //____________________________________________________________
208 :
209 : const Double_t ka = 1000.;
210 : const Double_t kdy = 4.;
211 :
212 :
213 0 : Double_t y=TMath::Abs(*py);
214 : //
215 0 : Double_t ex = y*y/(2*kdy*kdy);
216 0 : return ka*TMath::Exp(-ex);
217 : }
218 :
219 : Int_t AliGenPHOSlib::IpKaon(TRandom *ran)
220 : {
221 : // particle composition
222 : //
223 :
224 0 : Float_t random = ran->Rndm();
225 0 : Float_t random2 = ran->Rndm();
226 0 : if (random2 < 0.5)
227 : {
228 0 : if (random < 0.5) {
229 0 : return 321; // K+
230 : } else {
231 0 : return -321; // K-
232 : }
233 : }
234 : else
235 : {
236 0 : if (random < 0.5) {
237 0 : return 130; // K^0 short
238 : } else {
239 0 : return 310; // K^0 long
240 : }
241 : }
242 0 : }
243 :
244 : Int_t AliGenPHOSlib::IpChargedKaon(TRandom *ran)
245 : {
246 : // particle composition
247 : //
248 :
249 0 : Float_t random = ran->Rndm();
250 :
251 0 : if (random < 0.5) {
252 0 : return 321; // K+
253 : } else {
254 0 : return -321; // K-
255 : }
256 :
257 :
258 0 : }
259 : Int_t AliGenPHOSlib::IpKaon0L(TRandom *)
260 : {
261 : // particle composition
262 : //
263 :
264 0 : return 130; // K^0 long
265 : }
266 : // End Kaons
267 : //============================================================================
268 : //============================================================================
269 : // E T A S
270 : Double_t AliGenPHOSlib::PtEta( const Double_t *px, const Double_t *)
271 : {
272 : // etas
273 : // pt-distribution
274 : //____________________________________________________________
275 :
276 0 : return PtScal(*px,2); // 2==> Eta in the PtScal function
277 : }
278 :
279 : Double_t AliGenPHOSlib::YEta( const Double_t *py, const Double_t *)
280 : {
281 : // y-distribution
282 : //____________________________________________________________
283 :
284 : const Double_t ka = 1000.;
285 : const Double_t kdy = 4.;
286 :
287 :
288 0 : Double_t y=TMath::Abs(*py);
289 : //
290 0 : Double_t ex = y*y/(2*kdy*kdy);
291 0 : return ka*TMath::Exp(-ex);
292 : }
293 :
294 : Int_t AliGenPHOSlib::IpEta(TRandom *)
295 : {
296 : // particle composition
297 : //
298 :
299 0 : return 221; // eta
300 : }
301 : // End Etas
302 :
303 : //======================================================================
304 : // Eta Flat Distribution
305 : // Transverse momentum distribution PtEtaFlat
306 : // Rapidity distribution YEtaFlat
307 : // Particle distribution IdEtaFlat 111 (pi0)
308 : //
309 :
310 : Double_t AliGenPHOSlib::PtEtaFlat(const Double_t */*px*/, const Double_t *)
311 : {
312 : // Eta transverse momentum flat distribution
313 :
314 0 : return 1;
315 :
316 : }
317 :
318 : Double_t AliGenPHOSlib::YEtaFlat( const Double_t */*py*/, const Double_t *)
319 : {
320 : //
321 : // pion y-distribution
322 : //
323 0 : return 1.;
324 : }
325 :
326 : Int_t AliGenPHOSlib::IpEtaFlat(TRandom *)
327 : {
328 : //
329 : // particle composition eta
330 : //
331 0 : return 221 ;
332 : }
333 : // End EtaFlat
334 : //============================================================================
335 : //============================================================================
336 : // O M E G A S
337 : Double_t AliGenPHOSlib::PtOmega( const Double_t *px, const Double_t *)
338 : {
339 : // omegas
340 : // pt-distribution
341 : //____________________________________________________________
342 :
343 0 : return PtScal(*px,3); // 3==> Omega in the PtScal function
344 : }
345 :
346 : Double_t AliGenPHOSlib::YOmega( const Double_t *py, const Double_t *)
347 : {
348 : // y-distribution
349 : //____________________________________________________________
350 :
351 : const Double_t ka = 1000.;
352 : const Double_t kdy = 4.;
353 :
354 :
355 0 : Double_t y=TMath::Abs(*py);
356 : //
357 0 : Double_t ex = y*y/(2*kdy*kdy);
358 0 : return ka*TMath::Exp(-ex);
359 : }
360 :
361 : Int_t AliGenPHOSlib::IpOmega(TRandom *)
362 : {
363 : // particle composition
364 : //
365 :
366 0 : return 223; // Omega
367 : }
368 : // End Omega
369 : //============================================================================
370 : //======================================================================
371 : // Omega(782) Flat Distribution
372 : // Transverse momentum distribution PtOmegaFlat
373 : // Rapidity distribution YOmegaFlat
374 : // Particle distribution IdOmegaFlat 223(0mega)
375 : //
376 :
377 : Double_t AliGenPHOSlib::PtOmegaFlat(const Double_t */*px*/, const Double_t *)
378 : {
379 : // omega transverse momentum flat distribution
380 :
381 0 : return 1;
382 :
383 : }
384 :
385 : Double_t AliGenPHOSlib::YOmegaFlat( const Double_t */*py*/, const Double_t *)
386 : {
387 :
388 : // omega y-distribution
389 : //
390 0 : return 1.;
391 : }
392 :
393 : Int_t AliGenPHOSlib::IpOmegaFlat(TRandom *)
394 : {
395 :
396 : // particle composition omega
397 : //
398 0 : return 223 ;
399 : }
400 : // End OmegaFlat
401 :
402 :
403 : //============================================================================
404 : // E T A P R I M E
405 : Double_t AliGenPHOSlib::PtEtaprime( const Double_t *px, const Double_t *)
406 : {
407 : // etaprime
408 : // pt-distribution
409 : //____________________________________________________________
410 :
411 0 : return PtScal(*px,4); // 4==> Etaprime in the PtScal function
412 : }
413 :
414 : Double_t AliGenPHOSlib::YEtaprime( const Double_t *py, const Double_t *)
415 : {
416 : // y-distribution
417 : //____________________________________________________________
418 :
419 : const Double_t ka = 1000.;
420 : const Double_t kdy = 4.;
421 :
422 :
423 0 : Double_t y=TMath::Abs(*py);
424 : //
425 0 : Double_t ex = y*y/(2*kdy*kdy);
426 0 : return ka*TMath::Exp(-ex);
427 : }
428 :
429 : Int_t AliGenPHOSlib::IpEtaprime(TRandom *)
430 : {
431 : // particle composition
432 : //
433 :
434 0 : return 331; // Etaprime
435 : }
436 : // End EtaPrime
437 : //===================================================================
438 : //============================================================================
439 : // P H I S
440 : Double_t AliGenPHOSlib::PtPhi( const Double_t *px, const Double_t *)
441 : {
442 : // phi
443 : // pt-distribution
444 : //____________________________________________________________
445 :
446 0 : return PtScal(*px,5); // 5==> Phi in the PtScal function
447 : }
448 :
449 : Double_t AliGenPHOSlib::YPhi( const Double_t *py, const Double_t *)
450 : {
451 : // y-distribution
452 : //____________________________________________________________
453 :
454 : const Double_t ka = 1000.;
455 : const Double_t kdy = 4.;
456 :
457 :
458 0 : Double_t y=TMath::Abs(*py);
459 : //
460 0 : Double_t ex = y*y/(2*kdy*kdy);
461 0 : return ka*TMath::Exp(-ex);
462 : }
463 :
464 : Int_t AliGenPHOSlib::IpPhi(TRandom *)
465 : {
466 : // particle composition
467 : //
468 :
469 0 : return 333; // Phi
470 : }
471 : // End Phis
472 : //===================================================================
473 : //============================================================================
474 : // B A R Y O N S == protons, protonsbar, neutrons, and neutronsbars
475 : Double_t AliGenPHOSlib::PtBaryon( const Double_t *px, const Double_t *)
476 : {
477 : // baryons
478 : // pt-distribution
479 : //____________________________________________________________
480 :
481 0 : return PtScal(*px,6); // 6==> Baryon in the PtScal function
482 : }
483 :
484 : Double_t AliGenPHOSlib::YBaryon( const Double_t *py, const Double_t *)
485 : {
486 : // y-distribution
487 : //____________________________________________________________
488 :
489 : const Double_t ka = 1000.;
490 : const Double_t kdy = 4.;
491 :
492 :
493 0 : Double_t y=TMath::Abs(*py);
494 : //
495 0 : Double_t ex = y*y/(2*kdy*kdy);
496 0 : return ka*TMath::Exp(-ex);
497 : }
498 :
499 : Int_t AliGenPHOSlib::IpBaryon(TRandom *ran)
500 : {
501 : // particle composition
502 : //
503 :
504 0 : Float_t random = ran->Rndm();
505 0 : Float_t random2 = ran->Rndm();
506 0 : if (random2 < 0.5)
507 : {
508 0 : if (random < 0.5) {
509 0 : return 2212; // p
510 : } else {
511 0 : return -2212; // pbar
512 : }
513 : }
514 : else
515 : {
516 0 : if (random < 0.5) {
517 0 : return 2112; // n
518 : } else {
519 0 : return -2112; // n bar
520 : }
521 : }
522 0 : }
523 :
524 : Int_t AliGenPHOSlib::IpProton(TRandom *)
525 : {
526 : // particle composition
527 : //
528 0 : return 2212; // p
529 :
530 : }
531 : Int_t AliGenPHOSlib::IpAProton(TRandom *)
532 : {
533 : // particle composition
534 : //
535 0 : return -2212; // p bar
536 :
537 : }
538 :
539 : Int_t AliGenPHOSlib::IpNeutron(TRandom *)
540 : {
541 : // particle composition
542 : //
543 0 : return 2112; // n
544 :
545 : }
546 : Int_t AliGenPHOSlib::IpANeutron(TRandom *)
547 : {
548 : // particle composition
549 : //
550 0 : return -2112; // n
551 :
552 : }
553 : // End Baryons
554 : //===================================================================
555 :
556 : typedef Double_t (*GenFunc) (const Double_t*, const Double_t*);
557 : GenFunc AliGenPHOSlib::GetPt(Int_t param, const char* /*tname*/) const
558 : {
559 : // Return pinter to pT parameterisation
560 : GenFunc func;
561 :
562 0 : switch (param)
563 : {
564 : case kPion:
565 : func=PtPion;
566 0 : break;
567 : case kPi0:
568 : func=PtPi0;
569 0 : break;
570 : case kPi0Flat:
571 : func=PtPi0Flat;
572 0 : break;
573 : case kKaon:
574 : func=PtKaon;
575 0 : break;
576 : case kEta:
577 : func=PtEta;
578 0 : break;
579 : case kEtaFlat:
580 : func=PtEtaFlat;
581 0 : break;
582 : case kOmega:
583 : func=PtOmega;
584 0 : break;
585 : case kOmegaFlat:
586 : func=PtOmegaFlat;
587 0 : break;
588 : case kEtaPrime:
589 : func=PtEtaprime;
590 0 : break;
591 : case kBaryon:
592 : func=PtBaryon;
593 0 : break;
594 : default:
595 : func=0;
596 0 : printf("<AliGenPHOSlib::GetPt> unknown parametrisationn");
597 0 : }
598 0 : return func;
599 : }
600 :
601 : GenFunc AliGenPHOSlib::GetY(Int_t param, const char* /*tname*/) const
602 : {
603 : // Return pointer to Y parameterisation
604 : GenFunc func;
605 0 : switch (param)
606 : {
607 : case kPion:
608 : func=YPion;
609 0 : break;
610 : case kPi0:
611 : case kPi0Flat:
612 : func=YPi0Flat;
613 0 : break;
614 : case kKaon:
615 : func=YKaon;
616 0 : break;
617 : case kEta:
618 : func=YEta;
619 0 : break;
620 : case kEtaFlat:
621 : func=YEtaFlat;
622 0 : break;
623 : case kOmega:
624 : func=YOmega;
625 0 : break;
626 : case kOmegaFlat:
627 : func=YOmegaFlat;
628 0 : break;
629 : case kEtaPrime:
630 : func=YEtaprime;
631 0 : break;
632 : case kPhi:
633 : func=YPhi;
634 0 : break;
635 : case kBaryon:
636 : func=YBaryon;
637 0 : break;
638 : default:
639 : func=0;
640 0 : printf("<AliGenPHOSlib::GetY> unknown parametrisationn");
641 0 : }
642 0 : return func;
643 : }
644 : typedef Int_t (*GenFuncIp) (TRandom *);
645 : GenFuncIp AliGenPHOSlib::GetIp(Int_t param, const char* /*tname*/) const
646 : {
647 : // Return pointer to particle composition
648 : GenFuncIp func;
649 0 : switch (param)
650 : {
651 : case kPion:
652 : func=IpPion;
653 0 : break;
654 : case kChargedPion:
655 : func=IpChargedPion;
656 0 : break;
657 : case kPi0:
658 : case kPi0Flat:
659 : func=IpPi0Flat;
660 0 : break;
661 : case kKaon:
662 : func=IpKaon;
663 0 : break;
664 : case kChargedKaon:
665 : func=IpChargedKaon;
666 0 : break;
667 : case kKaon0L:
668 : func=IpKaon0L;
669 0 : break;
670 : case kEta:
671 : func=IpEta;
672 0 : break;
673 : case kEtaFlat:
674 : func=IpEtaFlat;
675 0 : break;
676 :
677 : case kOmega:
678 : func=IpOmega;
679 0 : break;
680 : case kOmegaFlat:
681 : func=IpOmegaFlat;
682 0 : break;
683 : case kEtaPrime:
684 : func=IpEtaprime;
685 0 : break;
686 : case kPhi:
687 : func=IpPhi;
688 0 : break;
689 : case kBaryon:
690 : func=IpBaryon;
691 0 : break;
692 : case kProton:
693 : func=IpProton;
694 0 : break;
695 : case kAProton:
696 : func=IpAProton;
697 0 : break;
698 : case kNeutron:
699 : func=IpNeutron;
700 0 : break;
701 : case kANeutron:
702 : func=IpANeutron;
703 0 : break;
704 :
705 : default:
706 : func=0;
707 0 : printf("<AliGenPHOSlib::GetIp> unknown parametrisationn");
708 0 : }
709 0 : return func;
710 : }
711 :
|