36b81802 |
1 | /************************************************************************** |
2 | * Copyright(c) 1998-2002, 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 | * Copyright(c) 1997, 1998, 2002, Adrian Alscher and Kai Hencken * |
17 | * See $ALICE_ROOT/EpEmGen/diffcross.f for full Copyright notice * |
18 | * * |
19 | * * |
20 | * Copyright(c) 2002 Kai Hencken, Yuri Kharlov, Serguei Sadovsky * |
21 | * See $ALICE_ROOT/EpEmGen/epemgen.f for full Copyright notice * |
22 | * * |
23 | **************************************************************************/ |
24 | |
803d1ab0 |
25 | /* $Id$ */ |
36b81802 |
26 | |
27 | // Event generator of single e+e- pair production in ultraperipheral PbPb collisions |
28 | // at 5.5 TeV/nucleon. |
29 | // The generator is based on 5-dimentional differential cross section of the process. |
30 | //% |
31 | // References: |
32 | // [1] "Multiple electromagnetic electron positron pair production in |
33 | // relativistic heavy ion collisions". |
34 | // Adrian Alscher, Kai Hencken, Dirk Trautmann, and Gerhard Baur, |
35 | // Phys. Rev. A55 (1997) 396. |
36 | // [2] K.Hencken, Yu.Kharlov, S.Sadovsky, Internal ALICE Note 2002-27. |
37 | //% |
38 | // Usage: |
39 | // Initialization: |
40 | // AliGenEpEmv1 *gener = new AliGenEpEmv1(); |
41 | // gener->SetXXXRange(); // Set kinematics range |
42 | // gener->Init(); |
43 | // Event generation: |
44 | // gener->Generate(); // Produce one e+e- pair with the event weight assigned |
45 | // // to each track. The sum of event weights, divided by |
46 | // // the total number of generated events, gives the |
47 | // // integral cross section of the process of e+e- pair |
48 | // // production in the above mentioned kinematics range. |
49 | // // Sum of the selected event weights, divided by the total |
50 | // // number of generated events, gives the integral cross |
51 | // // section corresponded to the set of selected events |
52 | //% |
53 | // The generator consists of several modules: |
54 | // 1) $ALICE_ROOT/EpEmGen/diffcross.f: |
55 | // Exact calculation of the total differential e+ e- -pair production |
56 | // in Relativistic Heavy Ion Collisions for a point particle in an |
57 | // external field approach. See full comments in the mentioned file. |
58 | // 2) $ALICE_ROOT/EpEmGen/epemgen.f: |
59 | // Generator of e+e- pairs produced in PbPb collisions at LHC |
60 | // it generates events according to the parametrization of the |
61 | // differential cross section. Produces events have weights calculated |
62 | // by the exact differential cross section calculation (diffcross.f). |
63 | // See full comments in the mentioned file. |
64 | // 3) Class TEpEmGen: |
65 | // Interface from the fortran event generator to ALIROOT |
66 | // 4) Class AliGenEpEmv1: |
67 | // The event generator to call within ALIROOT |
68 | //% |
69 | // Author of this module: Yuri.Kharlov@cern.ch |
70 | // 9 October 2002 |
71 | |
72 | #include "AliGenEpEmv1.h" |
73 | #include <TParticle.h> |
74 | #include <TParticlePDG.h> |
75 | #include <TDatabasePDG.h> |
76 | #include <TEpEmGen.h> |
77 | |
78 | ClassImp(AliGenEpEmv1) |
79 | |
80 | //------------------------------------------------------------ |
81 | |
82 | AliGenEpEmv1::AliGenEpEmv1() |
83 | { |
84 | // Default constructor |
85 | // Avoid zero pt |
86 | if (fPtMin == 0) fPtMin = 1.E-04; |
87 | } |
88 | |
89 | //____________________________________________________________ |
90 | AliGenEpEmv1::AliGenEpEmv1(const AliGenEpEmv1 & gen) |
67c32e43 |
91 | :AliGenMC(gen) |
36b81802 |
92 | { |
93 | // copy constructor |
94 | gen.Copy(*this); |
95 | } |
96 | |
97 | //____________________________________________________________ |
98 | AliGenEpEmv1::~AliGenEpEmv1() |
99 | { |
100 | // Destructor |
101 | } |
102 | |
103 | //____________________________________________________________ |
104 | void AliGenEpEmv1::Init() |
105 | { |
106 | // Initialisation: |
107 | // 1) define a generator |
108 | // 2) initialize the generator of e+e- pair production |
109 | |
110 | fMass = TDatabasePDG::Instance()->GetParticle(11)->Mass(); |
111 | |
112 | SetMC(new TEpEmGen()); |
23a8d5be |
113 | fEpEmGen = (TEpEmGen*) fMCEvGen; |
36b81802 |
114 | fEpEmGen ->Initialize(fYMin,fYMax,fPtMin,fPtMax); |
115 | fEvent = 0; |
116 | } |
117 | |
118 | //____________________________________________________________ |
119 | void AliGenEpEmv1::Generate() |
120 | { |
121 | // |
122 | // Generate one e+e- pair |
123 | // Gaussian smearing on the vertex is done if selected. |
124 | //% |
125 | // Each produced e+e- pair is defined by the following variables: |
126 | // rapidities of e-, e+ (yElectron,yPositron) |
127 | // log10(pt in MeV/c) of e-, e+ (xElectron,xPositron) |
128 | // azymuth angles between e- and e+ (phi12) |
129 | //% |
130 | // On output an event weight is given (weight) which is assigned to each track. |
131 | // The sum of event weights, divided by the total number of generated events, |
132 | // gives the integral cross section of the e+e- pair production in the |
133 | // selected kinematics range. |
134 | // |
135 | |
136 | Float_t polar[3]= {0,0,0}; |
137 | Float_t origin[3]; |
138 | Float_t p[3]; |
139 | |
140 | Double_t ptElectron,ptPositron, phiElectron,phiPositron, mt; |
141 | Double_t phi12=0,xElectron=0,xPositron=0,yElectron=0,yPositron=0,weight=0; |
142 | Int_t j, nt, id; |
143 | Float_t random[6]; |
144 | |
145 | fEpEmGen->GenerateEvent(fYMin,fYMax,fPtMin,fPtMax, |
146 | yElectron,yPositron,xElectron,xPositron,phi12,weight); |
147 | if (fDebug == 1) |
148 | printf("AliGenEpEmv1::Generate(): y=(%f,%f), x=(%f,%f), phi=%f\n", |
149 | yElectron,yPositron,xElectron,xPositron,phi12); |
150 | |
151 | for (j=0;j<3;j++) origin[j]=fOrigin[j]; |
152 | if(fVertexSmear==kPerEvent) { |
153 | Rndm(random,6); |
154 | for (j=0;j<3;j++) { |
155 | origin[j]+=fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())* |
156 | TMath::Sqrt(-2*TMath::Log(random[2*j+1])); |
157 | } |
158 | } |
159 | |
160 | Rndm(random,1); |
161 | ptElectron = TMath::Power(10,xElectron) * 1.e-03;; |
162 | ptPositron = TMath::Power(10,xPositron) * 1.e-03;; |
163 | phiElectron = fPhiMin + random[0] * (fPhiMax-fPhiMin); |
164 | phiPositron = phiElectron + phi12; |
165 | |
166 | // Produce electron |
167 | mt = TMath::Sqrt(ptElectron*ptElectron + fMass*fMass); |
168 | p[0] = ptElectron*TMath::Cos(phiElectron); |
169 | p[1] = ptElectron*TMath::Sin(phiElectron); |
170 | p[2] = mt*TMath::SinH(yElectron); |
171 | id = 11; |
172 | if (fDebug == 2) |
173 | printf("id=%+3d, p = (%+11.4e,%+11.4e,%+11.4e) GeV\n",id,p[0],p[1],p[2]); |
642f15cf |
174 | PushTrack(fTrackIt,-1, id,p,origin,polar,0,kPPrimary,nt,weight); |
36b81802 |
175 | |
176 | // Produce positron |
177 | mt = TMath::Sqrt(ptPositron*ptPositron + fMass*fMass); |
178 | p[0] = ptPositron*TMath::Cos(phiPositron); |
179 | p[1] = ptPositron*TMath::Sin(phiPositron); |
180 | p[2] = mt*TMath::SinH(yPositron); |
181 | id = -11; |
182 | if (fDebug == 2) |
183 | printf("id=%+3d, p = (%+11.4e,%+11.4e,%+11.4e) GeV\n",id,p[0],p[1],p[2]); |
642f15cf |
184 | PushTrack(fTrackIt,-1, id,p,origin,polar,0,kPPrimary,nt,weight); |
36b81802 |
185 | |
186 | fEvent++; |
187 | if (fEvent%1000 == 0) { |
188 | printf("=====> AliGenEpEmv1::Generate(): \n Event %d, sigma=%f +- %f kb\n", |
189 | fEvent,fEpEmGen->GetXsection(),fEpEmGen->GetDsection()); |
190 | } |
191 | } |
192 | |