Geant4 Cross Reference |
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: G4PolarizedIonisationBhabhaX 31 // 32 // Author: Andreas Schaelicke 33 // 34 // Class Description: 35 // * calculates the differential cross secti 36 // incoming positron Kpl(along positive z 37 // an electron Kmn 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 42 #include "G4PolarizedIonisationBhabhaXS.hh" 43 44 #include "G4PhysicalConstants.hh" 45 46 G4PolarizedIonisationBhabhaXS::G4PolarizedIoni 47 : fPhi0(1.) 48 { 49 fPhi2 = G4ThreeVector(); 50 fPhi3 = G4ThreeVector(); 51 } 52 53 G4PolarizedIonisationBhabhaXS::~G4PolarizedIon 54 55 void G4PolarizedIonisationBhabhaXS::Initialize 56 57 58 59 60 { 61 SetXmax(1.); 62 63 constexpr G4double re2 = classic_electr_radi 64 G4double gamma2 = gamma * gamma; 65 G4double gamma3 = gamma2 * gamma; 66 G4double gmo = (gamma - 1.); 67 G4double gmo2 = (gamma - 1.) * (gam 68 G4double gmo3 = gmo2 * (gamma - 1.) 69 G4double gpo = (gamma + 1.); 70 G4double gpo2 = (gamma + 1.) * (gam 71 G4double gpo3 = gpo2 * (gamma + 1.) 72 G4double gpo12 = std::sqrt(gpo); 73 G4double gpo32 = gpo * gpo12; 74 G4double gpo52 = gpo2 * gpo12; 75 76 G4double pref = re2 / (gamma - 77 constexpr G4double sqrttwo = 1.4142135623730 78 G4double d = std::sqrt(1. / 79 G4double e2 = e * e; 80 G4double e3 = e2 * e; 81 82 G4double gmo12 = std::sqrt(gmo); 83 G4double gmo32 = gmo * gmo12; 84 G4double egmp32 = std::pow(e * (2 + e * gmo) 85 G4double e32 = e * std::sqrt(e); 86 87 G4bool polarized = (!pol0.IsZero()) || (!pol 88 89 if(flag == 0) 90 polarized = false; 91 // Unpolarised part of XS 92 fPhi0 = e2 * gmo3 / gpo3; 93 fPhi0 -= 2. * e * gamma * gmo2 / gpo3; 94 fPhi0 += (3. * gamma2 + 6. * gamma + 4.) * g 95 fPhi0 -= (2. * gamma2 + 4. * gamma + 1.) / ( 96 fPhi0 += gamma2 / (e2 * (gamma2 - 1.)); 97 fPhi0 *= 0.25; 98 // Initial state polarisation dependence 99 if(polarized) 100 { 101 G4double xx = -((e * gmo - gamma) * 102 (-1. - gamma + e * (e * gm 103 (4. * e * gpo3); 104 G4double yy = (e3 * gmo3 - 2. * e2 * gmo2 105 gpo * (1. + 2. * gamma) + e 106 (4. * e * gpo3); 107 G4double zz = 108 ((e * gmo - gamma) * (e2 * gmo * (3. + g 109 gpo * (1. + 2. * g 110 (4. * e * gpo3); 111 112 fPhi0 += xx * pol0.x() * pol1.x() + yy * p 113 zz * pol0.z() * pol1.z(); 114 115 { 116 G4double xy = 0.; 117 G4double xz = (d * (e * gmo - gamma) * ( 118 (2. * sqrttwo * gpo52); 119 G4double yx = 0.; 120 G4double yz = 0.; 121 G4double zx = xz; 122 G4double zy = 0.; 123 fPhi0 += yx * pol0.y() * pol1.x() + xy * 124 fPhi0 += zx * pol0.z() * pol1.x() + xz * 125 fPhi0 += zy * pol0.z() * pol1.y() + yz * 126 } 127 } 128 // Final state polarisarion dependence 129 fPhi2 = G4ThreeVector(); 130 fPhi3 = G4ThreeVector(); 131 132 if(flag >= 1) 133 { 134 // Final Positron Ppl 135 // initial positron Kpl 136 if(!pol0.IsZero()) 137 { 138 G4double xxPplKpl = -((-1. + e) * (e * g 139 (-(gamma * gpo) + 140 (4. * e2 * gpo * 141 std::sqrt(gmo * gpo 142 (1. + e + 143 G4double xyPplKpl = 0.; 144 G4double xzPplKpl = 145 ((e * gmo - gamma) * (-1. - gamma + e 146 (2. * sqrttwo * e32 * gmo * gpo2 * 147 std::sqrt(1. + e + gamma - e * gamma) 148 G4double yxPplKpl = 0.; 149 G4double yyPplKpl = (gamma2 * gpo + e2 * 150 e * gmo * (1. + 2. 151 (4. * e2 * gmo * gpo 152 G4double yzPplKpl = 0.; 153 G4double zxPplKpl = 154 ((e * gmo - gamma) * 155 (1. + e * (-1. + 2. * e * gmo - 2. * 156 (2. * sqrttwo * e * gmo * gpo2 * 157 std::sqrt(e * (1. + e + gamma - e * g 158 G4double zyPplKpl = 0.; 159 G4double zzPplKpl = 160 -((e * gmo - gamma) * std::sqrt((1. - 161 (2. * e2 * gmo2 + gamma + gamma2 - e 162 (4. * e2 * (-1. + gamma2)); 163 164 fPhi2[0] += 165 xxPplKpl * pol0.x() + xyPplKpl * pol0. 166 fPhi2[1] += 167 yxPplKpl * pol0.x() + yyPplKpl * pol0. 168 fPhi2[2] += 169 zxPplKpl * pol0.x() + zyPplKpl * pol0. 170 } 171 // initial electron Kmn 172 if(!pol1.IsZero()) 173 { 174 G4double xxPplKmn = 175 ((-1. + e) * (e * (-2. + gamma) * gmo 176 (4. * e * gpo32 * std::sqrt(1. + e2 * 177 G4double xyPplKmn = 0.; 178 G4double xzPplKmn = 179 (-1. + e * gmo + gmo * gamma) / 180 (2. * sqrttwo * gpo2 * std::sqrt(e * ( 181 G4double yxPplKmn = 0.; 182 G4double yyPplKmn = 183 (-1. - 2. * gamma + e * gmo * (3. + ga 184 G4double yzPplKmn = 0.; 185 G4double zxPplKmn = 186 (1. + 2. * e2 * gmo2 + gamma + gamma2 187 e * (1. + (3. - 4. * gamma) * gamma)) 188 (2. * sqrttwo * gpo2 * std::sqrt(e * ( 189 G4double zyPplKmn = 0.; 190 G4double zzPplKmn = -(std::sqrt((1. - e) 191 (2. * e2 * gmo2 + 192 e * (2. + gamma - 193 (4. * e * gpo); 194 195 fPhi2[0] += 196 xxPplKmn * pol1.x() + xyPplKmn * pol1. 197 fPhi2[1] += 198 yxPplKmn * pol1.x() + yyPplKmn * pol1. 199 fPhi2[2] += 200 zxPplKmn * pol1.x() + zyPplKmn * pol1. 201 } 202 // Final Electron Pmn 203 // initial positron Kpl 204 if(!pol0.IsZero()) 205 { 206 G4double xxPmnKpl = ((-1. + e * gmo) * ( 207 (4. * gpo * std::sqr 208 G4double xyPmnKpl = 0.; 209 G4double xzPmnKpl = (std::sqrt((-1. + e) 210 (e + gamma + e * ga 211 (2. * sqrttwo * e * 212 G4double yxPmnKpl = 0.; 213 G4double yyPmnKpl = 214 (-1. - 2. * gamma + e * gmo * (3. + ga 215 G4double yzPmnKpl = 0.; 216 G4double zxPmnKpl = 217 -((-1. + e) * (1. + 2. * e * gmo) * (e 218 (2. * sqrttwo * e * std::sqrt(-((-1. + 219 G4double zyPmnKpl = 0; 220 G4double zzPmnKpl = (-2. + 2. * e2 * gmo 221 e * (-2. + (5. - 3. 222 (4. * std::sqrt(e * 223 224 fPhi3[0] += 225 xxPmnKpl * pol0.x() + xyPmnKpl * pol0. 226 fPhi3[1] += 227 yxPmnKpl * pol0.x() + yyPmnKpl * pol0. 228 fPhi3[2] += 229 zxPmnKpl * pol0.x() + zyPmnKpl * pol0. 230 } 231 // initial electron Kmn 232 if(!pol1.IsZero()) 233 { 234 G4double xxPmnKmn = -((2. + e * gmo) * ( 235 (e * gmo - gamma) 236 (4. * gmo * egmp32); 237 G4double xyPmnKmn = 0.; 238 G4double xzPmnKmn = 239 ((e * gmo - gamma) * 240 std::sqrt((-1. + e + gamma - e * gamm 241 (e + gamma - e * gamma + gamma2)) / 242 (2. * sqrttwo * e2 * gmo32 * gpo2); 243 G4double yxPmnKmn = 0.; 244 G4double yyPmnKmn = (gamma2 * gpo + e2 * 245 e * gmo * (1. + 2. 246 (4. * e2 * gmo * gpo 247 G4double yzPmnKmn = 0.; 248 G4double zxPmnKmn = 249 -((-1. + e) * (e * gmo - gamma) * 250 (e * gmo + 2. * e2 * gmo2 - gamma * 251 (2. * sqrttwo * e2 * std::sqrt(-((-1. 252 gpo2); 253 G4double zyPmnKmn = 0.; 254 G4double zzPmnKmn = 255 ((e * gmo - gamma) * std::sqrt(e / ((2 256 (-(e * (-2. + gamma) * gmo) + 2. * e2 257 (4. * e2 * (-1. + gamma2)); 258 259 fPhi3[0] += 260 xxPmnKmn * pol1.x() + xyPmnKmn * pol1. 261 fPhi3[1] += 262 yxPmnKmn * pol1.x() + yyPmnKmn * pol1. 263 fPhi3[2] += 264 zxPmnKmn * pol1.x() + zyPmnKmn * pol1. 265 } 266 } 267 fPhi0 *= pref; 268 fPhi2 *= pref; 269 fPhi3 *= pref; 270 } 271 272 G4double G4PolarizedIonisationBhabhaXS::XSecti 273 274 { 275 G4double xs = 0.; 276 xs += fPhi0; 277 278 G4bool polarized = (!pol2.IsZero()) || (!pol 279 if(polarized) 280 { 281 xs += fPhi2 * pol2 + fPhi3 * pol3; 282 } 283 return xs; 284 } 285 286 G4double G4PolarizedIonisationBhabhaXS::TotalX 287 G4double xmin, G4double /*xmax*/, G4double 288 const G4StokesVector& pol0, 289 const G4StokesVector& pol1) 290 { 291 // VI: In this model an incorrect G4Exceptio 292 // xmax was compared with 1. In the case 293 // value is 0.5, for positrons 1.0. The 294 // cross section is left unchanged, so p 295 // from 0.5 to 1.0 is computed for elect 296 // correct, however, this part is signif 297 // from the interval xmin - 0.5. 298 G4double xs = 0.; 299 G4double x = xmin; 300 301 constexpr G4double re2 = classic_electr_radi 302 G4double gamma2 = gamma * gamma; 303 G4double gmo2 = (gamma - 1.) * (gam 304 G4double gpo2 = (gamma + 1.) * (gam 305 G4double gpo3 = gpo2 * (gamma + 1.) 306 G4double logMEM = std::log(x); 307 G4double pref = twopi * re2 / (gamm 308 // unpolarised XS 309 G4double sigma0 = 0.; 310 sigma0 += -gmo2 * (gamma - 1.) * x * x * x / 311 sigma0 += -(gamma - 1.) * (3. * gamma * (gam 312 sigma0 += (gamma * (gamma * (gamma * (4. * g 313 (3. * (gamma - 1.)); 314 sigma0 /= gpo3; 315 sigma0 += logMEM * (2. - 1. / gpo2); 316 sigma0 += gamma2 / ((gamma2 - 1.) * x); 317 // longitudinal part 318 G4double sigma2 = 0.; 319 sigma2 += logMEM * gamma * (gamma + 1.) * (2 320 sigma2 += gamma * (7. * gamma * (gamma + 1.) 321 sigma2 += -(3. * gamma + 1.) * (gamma2 + gam 322 sigma2 += (gamma - 1.) * gamma * (gamma + 3. 323 sigma2 += -gmo2 * (gamma + 3.) * x * x * x / 324 sigma2 /= gpo3; 325 // transverse part 326 G4double sigma3 = 0.; 327 sigma3 += 0.5 * (gamma + 1.) * (3. * gamma + 328 sigma3 += (gamma * (5. * gamma - 4.) - 13.) 329 sigma3 += 0.5 * (gamma2 + 3.) * x; 330 sigma3 += -2. * (gamma - 1.) * gamma * x * x 331 sigma3 += 2. * gmo2 * x * x * x / 3.; 332 sigma3 /= gpo3; 333 // total cross section 334 xs += pref * (sigma0 + sigma2 * pol0.z() * p 335 sigma3 * (pol0.x() * pol1.x() 336 337 return xs; 338 } 339 340 G4StokesVector G4PolarizedIonisationBhabhaXS:: 341 { 342 // Note, mean polarization can not contain c 343 return G4StokesVector(1. / fPhi0 * fPhi2); 344 } 345 G4StokesVector G4PolarizedIonisationBhabhaXS:: 346 { 347 // Note, mean polarization can not contain c 348 return G4StokesVector(1. / fPhi0 * fPhi3); 349 } 350