Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4PolarizedAnnihilationCrossSection.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// -------------------------------------------------------------------
27// $Id$
28// -------------------------------------------------------------------
29//
30// GEANT4 Class file
31//
32//
33// File name: G4PolarizedAnnihilationCrossSection
34//
35// Author: Andreas Schaelicke
36//
37// Creation date: 22.03.2006
38//
39// Modifications:
40// 24-03-06 included cross section as given in W.McMaster, Nuovo Cimento 7, 1960, 395
41// 27-07-06 new calculation by P.Starovoitov
42// 15.10.07 introduced a more general framework for cross sections (AS)
43// 16.10.07 some minor corrections in formula longPart
44//
45// Class Description:
46// * calculates the differential cross section in e+e- -> gamma gamma
47//
48
51
53 polxx(0.), polyy(0.), polzz(0.), polxz(0.), polzx(0.), polxy(0.),
54 polyx(0.), polyz(0.), polzy(0.),
55 re2(1.), diffXSFactor(1.), totalXSFactor(1.),
56 phi0(0.)
57{
58 re2 = classic_electr_radius * classic_electr_radius;
59 phi2 = G4ThreeVector(0., 0., 0.);
60 phi3 = G4ThreeVector(0., 0., 0.);
61 dice = 0.;
62 polXS= 0.;
63 unpXS = 0.;
64 ISPxx=ISPyy=ISPzz=ISPnd=0.;
65}
66
67//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
68
70{
71}
72
73//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
74
75void G4PolarizedAnnihilationCrossSection::TotalXS()
76{
77 // total cross section is sum of
78 // + unpol xsec "sigma0"
79 // + longitudinal polarised cross section "sigma_zz" times pol_3(e-)*pol_3(e+)
80 // + transverse contribution "(sigma_xx+sigma_yy)/2" times pol_T(e-)*pol_T(e+)
81 // (Note: if both beams are transversely polarised, i.e. pol_T(e-)!=0 and
82 // pol_T(e+)!=0, and sigma_xx!=sigma_yy, then the diff. cross section will
83 // exhibit a azimuthal asymmetry even if pol_T(e-)*pol_T(e+)==0)
84
85
86}
87
88//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
89
91 G4double eps,
92 G4double gam,
93 G4double , // phi
94 const G4StokesVector & pol0, // positron polarization
95 const G4StokesVector & pol1, // electron polarization
96 G4int flag)
97{
98
99 diffXSFactor=re2/(gam - 1.);
100 DefineCoefficients(pol0,pol1);
101 //
102 // prepare dicing
103 //
104 dice = 0.;
105 G4double symmXS = 0.125*((-1./sqr(gam + 1.))/sqr(eps) +
106 ((sqr(gam) + 4.*gam - 1.)/sqr(gam + 1.))/eps - 1.);
107 //
108 //
109 //
110 G4ThreeVector epsVector(1./sqr(eps), 1./eps, 1.);
111 G4ThreeVector oneEpsVector(1./sqr(1. - eps), 1./(1.-eps), 1.);
112 G4ThreeVector sumEpsVector(epsVector + oneEpsVector);
113 G4ThreeVector difEpsVector(epsVector - oneEpsVector);
114 G4ThreeVector calcVector(0., 0., 0.);
115 //
116 // temporary variables
117 //
118 G4double helpVar2 = 0., helpVar1 = 0.;
119 //
120 // unpolarised contribution
121 //
122 helpVar1 = (gam*gam + 4.*gam + 1.)/sqr(gam + 1.);
123 helpVar2 = -1./sqr(gam + 1.);
124 calcVector = G4ThreeVector(helpVar2, helpVar1, -1.);
125 unpXS = 0.125 * calcVector * sumEpsVector;
126
127 // initial particles polarised contribution
128 helpVar2 = 1./sqr(gam + 1.);
129 helpVar1 = -(gam*gam + 4.*gam + 1.)/sqr(gam + 1.);
130 calcVector = G4ThreeVector(helpVar2, helpVar1, 0.5*(gam + 3.));
131 ISPxx = 0.25*(calcVector * sumEpsVector)/(gam - 1.);
132
133 helpVar1 = 1./sqr(gam + 1.);
134 calcVector = G4ThreeVector(-helpVar1, 2.*gam*helpVar1, -1.);
135 ISPyy = 0.125 * calcVector * sumEpsVector;
136
137 helpVar1 = 1./(gam - 1.);
138 helpVar2 = 1./sqr(gam + 1.);
139 calcVector = G4ThreeVector(-(gam*gam + 1.)*helpVar2,(gam*gam*(gam + 1.) + 7.*gam + 3.)*helpVar2, -(gam + 3.));
140 ISPzz = 0.125*helpVar1*(calcVector * sumEpsVector);
141
142 helpVar1 = std::sqrt(std::fabs(eps*(1. - eps)*2.*(gam + 1.) - 1.));
143 calcVector = G4ThreeVector(-1./(gam*gam - 1.), 2./(gam - 1.), 0.);
144 ISPnd = 0.125*(calcVector * difEpsVector) * helpVar1;
145
146 polXS = 0.;
147 polXS += ISPxx*polxx;
148 polXS += ISPyy*polyy;
149 polXS += ISPzz*polzz;
150 polXS += ISPnd*(polzx + polxz);
151 phi0 = unpXS + polXS;
152 dice = symmXS;
153 // if(polzz != 0.) dice *= (1. + std::fabs(polzz*ISPzz/unpXS));
154 if(polzz != 0.) {
155 dice *= (1. + (polzz*ISPzz/unpXS));
156 if (dice<0.) dice=0.;
157 }
158 // prepare final state coefficients
159 if (flag==2) {
160 //
161 // circular polarisation
162 //
163 G4double circ1 = 0., circ2 = 0., circ3 = 0.;
164 helpVar1 = 8.*sqr(1. - eps)*sqr(eps)*(gam - 1.)*sqr(gam + 1.)/std::sqrt(gam*gam - 1.);
165 helpVar2 = sqr(gam + 1.)*sqr(eps)*(-2.*eps + 3.) - (gam*gam + 3.*gam + 2.)*eps;
166 circ1 = helpVar2 + gam;
167 circ1 /= helpVar1;
168 circ2 = helpVar2 + 1.;
169 circ2 /= helpVar1;
170 helpVar1 = std::sqrt(std::fabs(eps*(1. - eps)*2.*(gam + 1.) - 1.));
171 helpVar1 /= std::sqrt(gam*gam - 1.);
172 calcVector = G4ThreeVector(1., -2.*gam, 0.);
173 circ3 = 0.125*(calcVector * sumEpsVector)/(gam + 1.);
174 circ3 *= helpVar1;
175
176 phi2.setZ( circ2*pol1.z() + circ1*pol0.z() + circ3*(pol1.x() + pol0.x()));
177 phi3.setZ(-circ1*pol1.z() - circ2*pol0.z() - circ3*(pol1.x() + pol0.x()));
178 //
179 // common to both linear polarisation
180 //
181 calcVector = G4ThreeVector(-1., 2.*gam, 0.);
182 G4double linearZero = 0.125*(calcVector * sumEpsVector)/sqr(gam + 1.);
183 //
184 // Linear Polarisation #1
185 //
186 helpVar1 = std::sqrt(std::fabs(2.*(gam + 1.)*(1. - eps)*eps - 1.))/((gam + 1.)*eps*(1. - eps));
187 helpVar2 = helpVar1*helpVar1;
188 //
189 // photon 1
190 //
191 G4double diagContrib = 0.125*helpVar2*(polxx + polyy - polzz);
192 G4double nonDiagContrib = 0.125*helpVar1*(-polxz/(1. - eps) + polzx/eps);
193
194 phi2.setX(linearZero + diagContrib + nonDiagContrib);
195 //
196 // photon 2
197 //
198 nonDiagContrib = 0.125*helpVar1*(polxz/eps - polzx/(1. - eps));
199
200
201 phi3.setX(linearZero + diagContrib + nonDiagContrib);
202 //
203 // Linear Polarisation #2
204 //
205 helpVar1 = std::sqrt(gam*gam - 1.)*(2.*(gam + 1.)*eps*(1. - eps) - 1.);
206 helpVar1 /= 8.*sqr(1. - eps)*sqr(eps)*sqr(gam + 1.)*(gam - 1.);
207 helpVar2 = std::sqrt((gam*gam - 1.)*std::fabs(2.*(gam + 1.)*eps*(1. - eps) - 1.));
208 helpVar2 /= 8.*sqr(1. - eps)*sqr(eps)*sqr(gam + 1.)*(gam - 1.);
209
210 G4double contrib21 = (-polxy + polyx)*helpVar1;
211 G4double contrib32 = -(eps*(gam + 1.) - 1.)*polyz + (eps*(gam + 1.) - gam)*polzy;
212
213 contrib32 *=helpVar2;
214 phi2.setY(contrib21 + contrib32);
215
216 contrib32 = -(eps*(gam + 1.) - gam)*polyz + (eps*(gam + 1.) - 1.)*polzy;
217 contrib32 *=helpVar2;
218 phi3.setY(contrib21 + contrib32);
219
220 }
221 phi0 *= diffXSFactor;
222 phi2 *= diffXSFactor;
223 phi3 *= diffXSFactor;
224}
225
226
227//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
228
230 const G4StokesVector & pol3)
231{
232 G4double xs=phi0+pol2*phi2+pol3*phi3;
233 return xs;
234}
235//
236// calculate total cross section
237//
240 const G4StokesVector & pol0,const G4StokesVector & pol1)
241{
242 totalXSFactor =pi*re2/(gam + 1.); // atomic number ignored
243 DefineCoefficients(pol0,pol1);
244
245 G4double xs = 0.;
246
247
248 G4double gam2 = gam*gam;
249 G4double sqrtgam1 = std::sqrt(gam2 - 1.);
250 G4double logMEM = std::log(gam+sqrtgam1);
251 G4double unpME = (gam*(gam + 4.) + 1.)*logMEM;
252 unpME += -(gam + 3.)*sqrtgam1;
253 unpME /= 4.*(gam2 - 1.);
254// G4double longPart = - 2.*(gam*(gam + 4.) + 1.)*logMEM;
255// longPart += (gam*(gam + 4.) + 7.)*sqrtgam1;
256// longPart /= 4.*sqr(gam - 1.)*(gam + 1.);
257 G4double longPart = (3+gam*(gam*(gam + 1.) + 7.))*logMEM;
258 longPart += - (5.+ gam*(3*gam + 4.))*sqrtgam1;
259 longPart /= 4.*sqr(gam - 1.)*(gam + 1.);
260 G4double tranPart = -(5*gam + 1.)*logMEM;
261 tranPart += (gam + 5.)*sqrtgam1;
262 tranPart /= 4.*sqr(gam - 1.)*(gam + 1.);
263
264 xs += unpME;
265 xs += polzz*longPart;
266 xs += (polxx + polyy)*tranPart;
267
268 return xs*totalXSFactor;
269}
270
271//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
273{
274 // Note, mean polarization can not contain correlation
275 // effects.
276 return 1./phi0 * phi2;
277}
278
279//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
280
282{
283 // Note, mean polarization can not contain correlation
284 // effects.
285 return 1./phi0 * phi3;
286}
287//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
288void G4PolarizedAnnihilationCrossSection::DefineCoefficients(const G4StokesVector & pol0,
289 const G4StokesVector & pol1)
290{
291 polxx=pol0.x()*pol1.x();
292 polyy=pol0.y()*pol1.y();
293 polzz=pol0.z()*pol1.z();
294
295 polxz=pol0.x()*pol1.z();
296 polzx=pol0.z()*pol1.x();
297
298 polyz=pol0.y()*pol1.z();
299 polzy=pol0.z()*pol1.y();
300
301 polxy=pol0.x()*pol1.y();
302 polyx=pol0.y()*pol1.x();
303}
304
305//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
306
308{
309 return 0.5*(1.-std::sqrt((y-1.)/(y+1.)));
310}
312{
313 return 0.5*(1.+std::sqrt((y-1.)/(y+1.)));
314}
315
316//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
318{
319 return dice;
320}
321//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
323{
324 if (choice == -1) return polXS/unpXS;
325 if (choice == 0) return unpXS;
326 if (choice == 1) return ISPxx;
327 if (choice == 2) return ISPyy;
328 if (choice == 3) return ISPzz;
329 if (choice == 4) return ISPnd;
330 return 0;
331}
332//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
double z() const
double x() const
void setY(double)
double y() const
void setZ(double)
void setX(double)
virtual G4double TotalXSection(G4double xmin, G4double xmax, G4double y, const G4StokesVector &pol0, const G4StokesVector &pol1)
virtual G4double XSection(const G4StokesVector &pol2, const G4StokesVector &pol3)
virtual void Initialize(G4double eps, G4double gamma, G4double phi, const G4StokesVector &p0, const G4StokesVector &p1, G4int flag=0)
T sqr(const T &x)
Definition: templates.hh:145