Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/polarisation/src/G4PolarizedAnnihilationXS.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 
 35 #include "G4PolarizedAnnihilationXS.hh"
 36 
 37 #include "G4PhysicalConstants.hh"
 38 
 39 G4PolarizedAnnihilationXS::G4PolarizedAnnihilationXS()
 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......
 60 G4PolarizedAnnihilationXS::~G4PolarizedAnnihilationXS() {}
 61 
 62 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 63 void 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......
 77 void G4PolarizedAnnihilationXS::Initialize(
 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......
211 G4double G4PolarizedAnnihilationXS::XSection(const G4StokesVector& pol2,
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......
220 G4double G4PolarizedAnnihilationXS::TotalXSection(G4double, G4double,
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......
251 G4StokesVector G4PolarizedAnnihilationXS::GetPol2()
252 {
253   // Note, mean polarization can not contain correlation effects.
254   return G4StokesVector(1. / fPhi0 * fPhi2);
255 }
256 
257 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
258 G4StokesVector G4PolarizedAnnihilationXS::GetPol3()
259 {
260   // Note, mean polarization can not contain correlation effects.
261   return G4StokesVector(1. / fPhi0 * fPhi3);
262 }
263 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
264 void 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......
282 G4double G4PolarizedAnnihilationXS::GetXmin(G4double y)
283 {
284   return 0.5 * (1. - std::sqrt((y - 1.) / (y + 1.)));
285 }
286 
287 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
288 G4double G4PolarizedAnnihilationXS::GetXmax(G4double y)
289 {
290   return 0.5 * (1. + std::sqrt((y - 1.) / (y + 1.)));
291 }
292 
293 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
294 G4double G4PolarizedAnnihilationXS::DiceEpsilon() { return fDice; }
295 
296 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
297 G4double G4PolarizedAnnihilationXS::getVar(G4int choice)
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 }
313