Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/polarisation/src/G4PolarizedIonisationMollerXS.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 ]

Diff markup

Differences between /processes/electromagnetic/polarisation/src/G4PolarizedIonisationMollerXS.cc (Version 11.3.0) and /processes/electromagnetic/polarisation/src/G4PolarizedIonisationMollerXS.cc (Version 8.1)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 // -------------------------------------------    
 27 //                                                
 28 // Geant4 Class file                              
 29 //                                                
 30 // File name:     G4PolarizedIonisationMollerX    
 31 //                                                
 32 // Author:        Andreas Schaelicke              
 33 //                                                
 34 // Class Description:                             
 35 //   * calculates the differential cross secti    
 36 //     incoming electron K1(along positive z d    
 37 //     K2 at rest                                 
 38 //   * phi denotes the angle between the scatt    
 39 //     outgoing electron) and X-axis              
 40 //   * all stokes vectors refer to spins in th    
 41 //   * cross section as calculated by P.Starov    
 42                                                   
 43 #include "G4PolarizedIonisationMollerXS.hh"       
 44                                                   
 45 #include "G4PhysicalConstants.hh"                 
 46                                                   
 47 G4PolarizedIonisationMollerXS::G4PolarizedIoni    
 48   : fPhi0(0.)                                     
 49 {                                                 
 50   SetXmax(.5);                                    
 51   fPhi2 = G4ThreeVector(0., 0., 0.);              
 52   fPhi3 = G4ThreeVector(0., 0., 0.);              
 53 }                                                 
 54                                                   
 55 G4PolarizedIonisationMollerXS::~G4PolarizedIon    
 56                                                   
 57 void G4PolarizedIonisationMollerXS::Initialize    
 58                                                   
 59                                                   
 60                                                   
 61                                                   
 62 {                                                 
 63   constexpr G4double re2     = classic_electr_    
 64   G4double gamma2            = gamma * gamma;     
 65   G4double gmo               = (gamma - 1.);      
 66   G4double gmo2              = (gamma - 1.) *     
 67   G4double gpo               = (gamma + 1.);      
 68   G4double pref              = gamma2 * re2 /     
 69   constexpr G4double sqrttwo = 1.4142135623730    
 70   G4double f                 = (-1. + e);         
 71   G4double e2                = e * e;             
 72   G4double f2                = f * f;             
 73                                                   
 74   G4bool polarized = (!pol0.IsZero()) || (!pol    
 75                                                   
 76   if(flag == 0)                                   
 77     polarized = false;                            
 78   // Unpolarised part of XS                       
 79   fPhi0 = gmo2 / gamma2;                          
 80   fPhi0 += ((1. - 2. * gamma) / gamma2) * (1.     
 81   fPhi0 += 1. / (e * e) + 1. / ((1. - e) * (1.    
 82   fPhi0 *= 0.25;                                  
 83   // Initial state polarisarion dependence        
 84   if(polarized)                                   
 85   {                                               
 86     G4bool usephi = true;                         
 87     if(flag <= 1)                                 
 88       usephi = false;                             
 89     G4double xx = (gamma - f * e * gmo * (3. +    
 90     G4double yy = (-1. + f * e * gmo2 + 2. * g    
 91     G4double zz = (-(e * gmo * (3. + gamma)) +    
 92                    gamma * (-1. + 2. * gamma))    
 93                   (4. * f * e * gamma2);          
 94                                                   
 95     fPhi0 += xx * pol0.x() * pol1.x() + yy * p    
 96              zz * pol0.z() * pol1.z();            
 97                                                   
 98     if(usephi)                                    
 99     {                                             
100       G4double xy = 0.;                           
101       G4double xz = -((-1. + 2. * e) * gmo) /     
102                     (2. * sqrttwo * gamma2 * s    
103       G4double yx = 0.;                           
104       G4double yz = 0.;                           
105       G4double zx = -((-1. + 2. * e) * gmo) /     
106                     (2. * sqrttwo * gamma2 * s    
107       G4double zy = 0.;                           
108       fPhi0 += yx * pol0.y() * pol1.x() + xy *    
109       fPhi0 += zx * pol0.z() * pol1.x() + xz *    
110       fPhi0 += zy * pol0.z() * pol1.y() + yz *    
111     }                                             
112   }                                               
113   // Final state polarisarion dependence          
114   fPhi2 = G4ThreeVector();                        
115   fPhi3 = G4ThreeVector();                        
116                                                   
117   if(flag >= 1)                                   
118   {                                               
119     // Final Electron P1                          
120     // initial electron K1                        
121     if(!pol0.IsZero())                            
122     {                                             
123       G4double xxP1K1 =                           
124         (std::sqrt(gpo / (1. + e2 * gmo + gamm    
125          (gamma - e * gpo)) /                     
126         (4. * e2 * gamma);                        
127       G4double xyP1K1 = 0.;                       
128       G4double xzP1K1 = (-1. + 2. * e * gamma)    
129                         (2. * sqrttwo * f * ga    
130                          std::sqrt(e * e2 * (1    
131       G4double yxP1K1 = 0.;                       
132       G4double yyP1K1 =                           
133         (-gamma2 + e * (-1. + gamma * (2. + ga    
134       G4double yzP1K1 = 0.;                       
135       G4double zxP1K1 = (1. + 2. * e2 * gmo -     
136                         (2. * sqrttwo * f * e     
137                          std::sqrt(e * (1. + e    
138       G4double zyP1K1 = 0.;                       
139       G4double zzP1K1 =                           
140         (-gamma + e * (1. - 2. * e * gmo + gam    
141         (4. * f * e2 * gamma * std::sqrt(1. -     
142       fPhi2[0] += xxP1K1 * pol0.x() + xyP1K1 *    
143       fPhi2[1] += yxP1K1 * pol0.x() + yyP1K1 *    
144       fPhi2[2] += zxP1K1 * pol0.x() + zyP1K1 *    
145     }                                             
146     // initial electron K2                        
147     if(!pol1.IsZero())                            
148     {                                             
149       G4double xxP1K2 =                           
150         ((1. + e * (-3. + gamma)) *               
151          std::sqrt(gpo / (1. + e2 * gmo + gamm    
152         (4. * f * e * gamma);                     
153       G4double xyP1K2 = 0.;                       
154       G4double xzP1K2 =                           
155         (-2. + 2. * e + gamma) / (2. * sqrttwo    
156                                   std::sqrt(e     
157       G4double yxP1K2 = 0.;                       
158       G4double yyP1K2 = (1. - 2. * gamma + e *    
159                         (4. * f2 * e * gamma2)    
160       G4double yzP1K2 = 0.;                       
161       G4double zxP1K2 = (2. * e * (1. + e * gm    
162                         (2. * sqrttwo * f2 * g    
163                          std::sqrt(e * (1. + e    
164       G4double zyP1K2 = 0.;                       
165       G4double zzP1K2 =                           
166         (1. - 2. * gamma + e * (-1. - 2. * e *    
167         (4. * f2 * e * gamma * std::sqrt(1. -     
168       fPhi2[0] += xxP1K2 * pol1.x() + xyP1K2 *    
169       fPhi2[1] += yxP1K2 * pol1.x() + yyP1K2 *    
170       fPhi2[2] += zxP1K2 * pol1.x() + zyP1K2 *    
171     }                                             
172                                                   
173     // Final Electron P2                          
174     // initial electron K1                        
175     if(!pol0.IsZero())                            
176     {                                             
177       G4double xxP2K1 =                           
178         (-1. + e + e * gamma) /                   
179         (4. * f2 * gamma * std::sqrt((e * (2.     
180       G4double xyP2K1 = 0.;                       
181       G4double xzP2K1 =                           
182         -((1. + 2. * f * gamma) * std::sqrt(f     
183         (2. * sqrttwo * f2 * e * gamma);          
184       G4double yxP2K1 = 0.;                       
185       G4double yyP2K1 = (1. - 2. * gamma + e *    
186                         (4. * f2 * e * gamma2)    
187       G4double yzP2K1 = 0.;                       
188       G4double zxP2K1 =                           
189         (1. + 2. * e * (-2. + e + gamma - e *     
190         (2. * sqrttwo * f * e * std::sqrt(-(f     
191       G4double zyP2K1 = 0.;                       
192       G4double zzP2K1 =                           
193         (std::sqrt((e * gpo) / (2. + e * gmo))    
194          (-3. + e * (5. + 2. * e * gmo - 3. *     
195         (4. * f2 * e * gamma);                    
196                                                   
197       fPhi3[0] += xxP2K1 * pol0.x() + xyP2K1 *    
198       fPhi3[1] += yxP2K1 * pol0.x() + yyP2K1 *    
199       fPhi3[2] += zxP2K1 * pol0.x() + zyP2K1 *    
200     }                                             
201     // initial electron K2                        
202     if(!pol1.IsZero())                            
203     {                                             
204       G4double xxP2K2 =                           
205         (-2. - e * (-3. + gamma) + gamma) /       
206         (4. * f * e * gamma * std::sqrt((e * (    
207       G4double xyP2K2 = 0.;                       
208       G4double xzP2K2 =                           
209         ((-2. * e + gamma) * std::sqrt(f / (-2    
210         (2. * sqrttwo * f * e2 * gamma);          
211       G4double yxP2K2 = 0.;                       
212       G4double yyP2K2 =                           
213         (-gamma2 + e * (-1. + gamma * (2. + ga    
214       G4double yzP2K2 = 0.;                       
215       G4double zxP2K2 =                           
216         (gamma + 2. * e * (-1. + e - e * gamma    
217         (2. * sqrttwo * e2 * std::sqrt(-(f * (    
218       G4double zyP2K2 = 0.;                       
219       G4double zzP2K2 = (std::sqrt((e * gpo) /    
220                          (-2. + e * (3. + 2. *    
221                         (4. * f * e2 * gamma);    
222       fPhi3[0] += xxP2K2 * pol1.x() + xyP2K2 *    
223       fPhi3[1] += yxP2K2 * pol1.x() + yyP2K2 *    
224       fPhi3[2] += zxP2K2 * pol1.x() + zyP2K2 *    
225     }                                             
226   }                                               
227   fPhi0 *= pref;                                  
228   fPhi2 *= pref;                                  
229   fPhi3 *= pref;                                  
230 }                                                 
231                                                   
232 G4double G4PolarizedIonisationMollerXS::XSecti    
233                                                   
234 {                                                 
235   G4double xs = fPhi0;                            
236                                                   
237   G4bool polarized = (!pol2.IsZero()) || (!pol    
238   if(polarized)                                   
239   {                                               
240     xs += fPhi2 * pol2 + fPhi3 * pol3;            
241   }                                               
242   return xs;                                      
243 }                                                 
244                                                   
245 G4double G4PolarizedIonisationMollerXS::TotalX    
246   G4double xmin, G4double xmax, G4double gamma    
247   const G4StokesVector& pol1)                     
248 {                                                 
249   G4double xs = 0.;                               
250   G4double x  = xmin;                             
251                                                   
252   if(xmax != 0.5)                                 
253   {                                               
254     G4ExceptionDescription ed;                    
255     ed << " warning xmax expected to be 1/2 bu    
256     G4Exception("G4PolarizedIonisationMollerXS    
257                 JustWarning, ed);                 
258   }                                               
259                                                   
260   constexpr G4double re2 = classic_electr_radi    
261   G4double gamma2        = gamma * gamma;         
262   G4double gmo2          = (gamma - 1.) * (gam    
263   G4double logMEM        = std::log(1. / x - 1    
264   G4double pref          = twopi * gamma2 * re    
265   // unpolarised XS                               
266   G4double sigma0 = (gmo2 / gamma2) * (0.5 - x    
267   sigma0 += ((1. - 2. * gamma) / gamma2) * log    
268   sigma0 += 1. / x - 1. / (1. - x);               
269   //    longitudinal part                         
270   G4double sigma2 = ((gamma2 + 2. * gamma - 3.    
271   sigma2 += (1. / gamma - 2.) * logMEM;           
272   //    transverse part                           
273   G4double sigma3 = (2. * (1. - gamma) / gamma    
274   sigma3 += (1. - 3. * gamma) / (2. * gamma2)     
275   // total cross section                          
276   xs += pref * (sigma0 + sigma2 * pol0.z() * p    
277                 sigma3 * (pol0.x() * pol1.x()     
278                                                   
279   return xs;                                      
280 }                                                 
281                                                   
282 G4StokesVector G4PolarizedIonisationMollerXS::    
283 {                                                 
284   // Note, mean polarization can not contain c    
285   return G4StokesVector(1. / fPhi0 * fPhi2);      
286 }                                                 
287 G4StokesVector G4PolarizedIonisationMollerXS::    
288 {                                                 
289   // Note, mean polarization can not contain c    
290   return G4StokesVector(1. / fPhi0 * fPhi3);      
291 }                                                 
292