Geant4 11.3.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4PolarizedAnnihilationXS.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// Geant4 Class file
27//
28// File name: G4PolarizedAnnihilationXS
29//
30// Author: Andreas Schaelicke
31//
32// Class Description:
33// * calculates the differential cross section in e+e- -> gamma gamma
34
36
38
40 : polxx(0.)
41 , polyy(0.)
42 , polzz(0.)
43 , polxz(0.)
44 , polzx(0.)
45 , polxy(0.)
46 , polyx(0.)
47 , polyz(0.)
48 , polzy(0.)
49 , fPhi0(0.)
50{
51 fPhi2 = G4ThreeVector(0., 0., 0.);
52 fPhi3 = G4ThreeVector(0., 0., 0.);
53 fDice = 0.;
54 fPolXS = 0.;
55 fUnpXS = 0.;
56 ISPxx = ISPyy = ISPzz = ISPnd = 0.;
57}
58
59//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
61
62//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
63void G4PolarizedAnnihilationXS::TotalXS()
64{
65 // total cross section is sum of
66 // + unpol xsec "sigma0"
67 // + longitudinal polarised cross section "sigma_zz" times
68 // pol_3(e-)*pol_3(e+)
69 // + transverse contribution "(sigma_xx+sigma_yy)/2" times
70 // pol_T(e-)*pol_T(e+)
71 // (Note: if both beams are transversely polarised, i.e. pol_T(e-)!=0 and
72 // pol_T(e+)!=0, and sigma_xx!=sigma_yy, then the diff. cross section
73 // will exhibit a azimuthal asymmetry even if pol_T(e-)*pol_T(e+)==0)
74}
75
76//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
78 G4double eps, G4double gam,
79 G4double, // phi
80 const G4StokesVector& pol0, // positron polarization
81 const G4StokesVector& pol1, // electron polarization
82 G4int flag)
83{
84 G4double diffXSFactor = re2 / (gam - 1.);
85 DefineCoefficients(pol0, pol1);
86
87 // prepare dicing
88 fDice = 0.;
89 G4double symmXS =
90 0.125 * ((-1. / sqr(gam + 1.)) / sqr(eps) +
91 ((sqr(gam) + 4. * gam - 1.) / sqr(gam + 1.)) / eps - 1.);
92
93 G4ThreeVector epsVector(1. / sqr(eps), 1. / eps, 1.);
94 G4ThreeVector oneEpsVector(1. / sqr(1. - eps), 1. / (1. - eps), 1.);
95 G4ThreeVector sumEpsVector(epsVector + oneEpsVector);
96 G4ThreeVector difEpsVector(epsVector - oneEpsVector);
97 G4ThreeVector calcVector(0., 0., 0.);
98
99 // temporary variables
100 G4double helpVar2 = 0., helpVar1 = 0.;
101
102 // unpolarised contribution
103 helpVar1 = (gam * gam + 4. * gam + 1.) / sqr(gam + 1.);
104 helpVar2 = -1. / sqr(gam + 1.);
105 calcVector = G4ThreeVector(helpVar2, helpVar1, -1.);
106 fUnpXS = 0.125 * calcVector * sumEpsVector;
107
108 // initial particles polarised contribution
109 helpVar2 = 1. / sqr(gam + 1.);
110 helpVar1 = -(gam * gam + 4. * gam + 1.) / sqr(gam + 1.);
111 calcVector = G4ThreeVector(helpVar2, helpVar1, 0.5 * (gam + 3.));
112 ISPxx = 0.25 * (calcVector * sumEpsVector) / (gam - 1.);
113
114 helpVar1 = 1. / sqr(gam + 1.);
115 calcVector = G4ThreeVector(-helpVar1, 2. * gam * helpVar1, -1.);
116 ISPyy = 0.125 * calcVector * sumEpsVector;
117
118 helpVar1 = 1. / (gam - 1.);
119 helpVar2 = 1. / sqr(gam + 1.);
120 calcVector = G4ThreeVector(
121 -(gam * gam + 1.) * helpVar2,
122 (gam * gam * (gam + 1.) + 7. * gam + 3.) * helpVar2, -(gam + 3.));
123 ISPzz = 0.125 * helpVar1 * (calcVector * sumEpsVector);
124
125 helpVar1 = std::sqrt(std::fabs(eps * (1. - eps) * 2. * (gam + 1.) - 1.));
126 calcVector = G4ThreeVector(-1. / (gam * gam - 1.), 2. / (gam - 1.), 0.);
127 ISPnd = 0.125 * (calcVector * difEpsVector) * helpVar1;
128
129 fPolXS = ISPxx * polxx + ISPyy * polyy + ISPzz * polzz;
130 fPolXS += ISPnd * (polzx + polxz);
131 fPhi0 = fUnpXS + fPolXS;
132 fDice = symmXS;
133
134 if(polzz != 0.)
135 {
136 fDice *= (1. + (polzz * ISPzz / fUnpXS));
137 if(fDice < 0.)
138 fDice = 0.;
139 }
140 // prepare final state coefficients
141 if(flag == 2)
142 {
143 // circular polarisation
144 G4double circ1 = 0., circ2 = 0., circ3 = 0.;
145 helpVar1 = 8. * sqr(1. - eps) * sqr(eps) * (gam - 1.) * sqr(gam + 1.) /
146 std::sqrt(gam * gam - 1.);
147 helpVar2 = sqr(gam + 1.) * sqr(eps) * (-2. * eps + 3.) -
148 (gam * gam + 3. * gam + 2.) * eps;
149 circ1 = helpVar2 + gam;
150 circ1 /= helpVar1;
151 circ2 = helpVar2 + 1.;
152 circ2 /= helpVar1;
153 helpVar1 = std::sqrt(std::fabs(eps * (1. - eps) * 2. * (gam + 1.) - 1.));
154 helpVar1 /= std::sqrt(gam * gam - 1.);
155 calcVector = G4ThreeVector(1., -2. * gam, 0.);
156 circ3 = 0.125 * (calcVector * sumEpsVector) / (gam + 1.);
157 circ3 *= helpVar1;
158
159 fPhi2.setZ(circ2 * pol1.z() + circ1 * pol0.z() +
160 circ3 * (pol1.x() + pol0.x()));
161 fPhi3.setZ(-circ1 * pol1.z() - circ2 * pol0.z() -
162 circ3 * (pol1.x() + pol0.x()));
163
164 // common to both linear polarisation
165 calcVector = G4ThreeVector(-1., 2. * gam, 0.);
166 G4double linearZero = 0.125 * (calcVector * sumEpsVector) / sqr(gam + 1.);
167
168 // Linear Polarisation #1
169 helpVar1 = std::sqrt(std::fabs(2. * (gam + 1.) * (1. - eps) * eps - 1.)) /
170 ((gam + 1.) * eps * (1. - eps));
171 helpVar2 = helpVar1 * helpVar1;
172
173 // photon 1
174 G4double diagContrib = 0.125 * helpVar2 * (polxx + polyy - polzz);
175 G4double nonDiagContrib =
176 0.125 * helpVar1 * (-polxz / (1. - eps) + polzx / eps);
177
178 fPhi2.setX(linearZero + diagContrib + nonDiagContrib);
179
180 // photon 2
181 nonDiagContrib = 0.125 * helpVar1 * (polxz / eps - polzx / (1. - eps));
182
183 fPhi3.setX(linearZero + diagContrib + nonDiagContrib);
184
185 // Linear Polarisation #2
186 helpVar1 =
187 std::sqrt(gam * gam - 1.) * (2. * (gam + 1.) * eps * (1. - eps) - 1.);
188 helpVar1 /= 8. * sqr(1. - eps) * sqr(eps) * sqr(gam + 1.) * (gam - 1.);
189 helpVar2 = std::sqrt((gam * gam - 1.) *
190 std::fabs(2. * (gam + 1.) * eps * (1. - eps) - 1.));
191 helpVar2 /= 8. * sqr(1. - eps) * sqr(eps) * sqr(gam + 1.) * (gam - 1.);
192
193 G4double contrib21 = (-polxy + polyx) * helpVar1;
194 G4double contrib32 =
195 -(eps * (gam + 1.) - 1.) * polyz + (eps * (gam + 1.) - gam) * polzy;
196
197 contrib32 *= helpVar2;
198 fPhi2.setY(contrib21 + contrib32);
199
200 contrib32 =
201 -(eps * (gam + 1.) - gam) * polyz + (eps * (gam + 1.) - 1.) * polzy;
202 contrib32 *= helpVar2;
203 fPhi3.setY(contrib21 + contrib32);
204 }
205 fPhi0 *= diffXSFactor;
206 fPhi2 *= diffXSFactor;
207 fPhi3 *= diffXSFactor;
208}
209
210//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
212 const G4StokesVector& pol3)
213{
214 G4double xs = fPhi0 + pol2 * fPhi2 + pol3 * fPhi3;
215 return xs;
216}
217
218// calculate total cross section
219//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
221 G4double gam,
222 const G4StokesVector& pol0,
223 const G4StokesVector& pol1)
224{
225 G4double totalXSFactor = pi * re2 / (gam + 1.); // atomic number ignored
226 DefineCoefficients(pol0, pol1);
227
228 G4double xs = 0.;
229
230 G4double gam2 = gam * gam;
231 G4double sqrtgam1 = std::sqrt(gam2 - 1.);
232 G4double logMEM = std::log(gam + sqrtgam1);
233 G4double unpME = (gam * (gam + 4.) + 1.) * logMEM;
234 unpME += -(gam + 3.) * sqrtgam1;
235 unpME /= 4. * (gam2 - 1.);
236 G4double longPart = (3 + gam * (gam * (gam + 1.) + 7.)) * logMEM;
237 longPart += -(5. + gam * (3 * gam + 4.)) * sqrtgam1;
238 longPart /= 4. * sqr(gam - 1.) * (gam + 1.);
239 G4double tranPart = -(5 * gam + 1.) * logMEM;
240 tranPart += (gam + 5.) * sqrtgam1;
241 tranPart /= 4. * sqr(gam - 1.) * (gam + 1.);
242
243 xs += unpME;
244 xs += polzz * longPart;
245 xs += (polxx + polyy) * tranPart;
246
247 return xs * totalXSFactor;
248}
249
250//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
252{
253 // Note, mean polarization can not contain correlation effects.
254 return G4StokesVector(1. / fPhi0 * fPhi2);
255}
256
257//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
259{
260 // Note, mean polarization can not contain correlation effects.
261 return G4StokesVector(1. / fPhi0 * fPhi3);
262}
263//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
264void G4PolarizedAnnihilationXS::DefineCoefficients(const G4StokesVector& pol0,
265 const G4StokesVector& pol1)
266{
267 polxx = pol0.x() * pol1.x();
268 polyy = pol0.y() * pol1.y();
269 polzz = pol0.z() * pol1.z();
270
271 polxz = pol0.x() * pol1.z();
272 polzx = pol0.z() * pol1.x();
273
274 polyz = pol0.y() * pol1.z();
275 polzy = pol0.z() * pol1.y();
276
277 polxy = pol0.x() * pol1.y();
278 polyx = pol0.y() * pol1.x();
279}
280
281//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
283{
284 return 0.5 * (1. - std::sqrt((y - 1.) / (y + 1.)));
285}
286
287//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
289{
290 return 0.5 * (1. + std::sqrt((y - 1.) / (y + 1.)));
291}
292
293//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
295
296//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
298{
299 if(choice == -1)
300 return fPolXS / fUnpXS;
301 if(choice == 0)
302 return fUnpXS;
303 if(choice == 1)
304 return ISPxx;
305 if(choice == 2)
306 return ISPyy;
307 if(choice == 3)
308 return ISPzz;
309 if(choice == 4)
310 return ISPnd;
311 return 0;
312}
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
double z() const
double x() const
double y() const
virtual G4double GetXmax(G4double y) override
virtual G4double TotalXSection(G4double xmin, G4double xmax, G4double y, const G4StokesVector &pol0, const G4StokesVector &pol1) override
virtual void Initialize(G4double eps, G4double gamma, G4double phi, const G4StokesVector &p0, const G4StokesVector &p1, G4int flag=0) override
virtual G4StokesVector GetPol3() override
virtual ~G4PolarizedAnnihilationXS() override
virtual G4StokesVector GetPol2() override
virtual G4double XSection(const G4StokesVector &pol2, const G4StokesVector &pol3) override
virtual G4double GetXmin(G4double y) override
T sqr(const T &x)
Definition templates.hh:128