Geant4 Cross Reference |
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 // 28 // Geant4 Class file 29 // 30 // File name: G4PolarizedGammaConversionXS 31 // 32 // Author: Andreas Schaelicke on the base of Karim Laihems code 33 34 #include "G4PolarizedGammaConversionXS.hh" 35 36 G4double G4PolarizedGammaConversionXS::SCRN[2][19] = { 37 { 0.5, 1.0, 2.0, 4.0, 8.0, 15.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0, 38 60.0, 70.0, 80.0, 90.0, 100.0, 120.0 }, 39 { 0.0145, 0.0490, 0.1400, 0.3312, 0.6758, 1.126, 1.367, 1.564, 1.731, 1.875, 40 2.001, 2.114, 2.216, 2.393, 2.545, 2.676, 2.793, 2.897, 3.078 } 41 }; 42 43 G4PolarizedGammaConversionXS::G4PolarizedGammaConversionXS() 44 { 45 fFinalElectronPolarization = G4StokesVector::ZERO; 46 fFinalPositronPolarization = G4StokesVector::ZERO; 47 } 48 49 G4PolarizedGammaConversionXS::~G4PolarizedGammaConversionXS() {} 50 51 void G4PolarizedGammaConversionXS::Initialize( 52 G4double aGammaE, G4double aLept0E, G4double sintheta, 53 const G4StokesVector& beamPol, const G4StokesVector& /*p1*/, G4int /*flag*/) 54 { 55 G4double aLept1E = aGammaE - aLept0E; 56 57 G4double Stokes_P3 = beamPol.z(); 58 59 G4double Lept0E = aLept0E / CLHEP::electron_mass_c2 + 1.; 60 G4double Lept0E2 = Lept0E * Lept0E; 61 G4double GammaE = aGammaE / CLHEP::electron_mass_c2; 62 G4double Lept1E = aLept1E / CLHEP::electron_mass_c2 - 1.; 63 G4double Lept1E2 = Lept1E * Lept1E; 64 65 // ******* Gamma Transvers Momentum 66 G4double TMom = std::sqrt(Lept0E2 - 1.) * sintheta; 67 G4double u = TMom; 68 G4double u2 = u * u; 69 G4double Xsi = 1. / (1. + u2); 70 G4double Xsi2 = Xsi * Xsi; 71 72 G4double delta = 73 12. * std::pow(fZ, 1. / 3.) * Lept0E * Lept1E * Xsi / (121. * GammaE); 74 G4double GG = 0.; 75 76 if(delta < 0.5) 77 { 78 GG = std::log(2. * Lept0E * Lept1E / GammaE) - 2. - fCoul; 79 } 80 else if(delta < 120.) 81 { 82 for(G4int j = 1; j < 19; ++j) 83 { 84 if(SCRN[0][j] >= delta) 85 { 86 GG = std::log(2. * Lept0E * Lept1E / GammaE) - 2. - fCoul - 87 (SCRN[1][j - 1] + (delta - SCRN[0][j - 1]) * 88 (SCRN[1][j] - SCRN[1][j - 1]) / 89 (SCRN[0][j] - SCRN[0][j - 1])); 90 break; 91 } 92 } 93 } 94 else 95 { 96 G4double alpha_sc = (111. * std::pow(fZ, -1. / 3.)) / Xsi; 97 GG = std::log(alpha_sc) - 2. - fCoul; 98 } 99 100 if(GG < -1.) 101 GG = -1.; 102 103 G4double I_Lepton = (Lept0E2 + Lept1E2) * (3 + 2 * GG) + 104 2. * Lept0E * Lept1E * (1. + 4. * u2 * Xsi2 * GG); 105 106 G4double L_Lepton1 = GammaE * 107 ((Lept0E - Lept1E) * (3. + 2. * GG) + 108 2 * Lept1E * (1. + 4. * u2 * Xsi2 * GG)) / 109 I_Lepton; 110 111 G4double T_Lepton1 = 112 4. * GammaE * Lept1E * Xsi * u * (1. - 2. * Xsi) * GG / I_Lepton; 113 114 G4double Stokes_S1 = (Stokes_P3 * T_Lepton1); 115 G4double Stokes_S2 = 0.; 116 G4double Stokes_S3 = (Stokes_P3 * L_Lepton1); 117 118 fFinalElectronPolarization.setX(Stokes_S1); 119 fFinalElectronPolarization.setY(Stokes_S2); 120 fFinalElectronPolarization.setZ(Stokes_S3); 121 122 if(fFinalElectronPolarization.mag2() > 1.) 123 { 124 G4ExceptionDescription ed; 125 ed << "\t" << fFinalElectronPolarization << "\t GG\t" << GG << "\t delta\t" 126 << delta << "\n"; 127 G4Exception("G4PolarizedGammaConversionXS::Initialize", "pol022", 128 JustWarning, ed); 129 fFinalElectronPolarization.setX(0.); 130 fFinalElectronPolarization.setY(0.); 131 fFinalElectronPolarization.setZ(Stokes_S3); 132 if(Stokes_S3 > 1.) 133 fFinalElectronPolarization.setZ(1.); 134 } 135 136 G4double L_Lepton2 = GammaE * 137 ((Lept1E - Lept0E) * (3. + 2. * GG) + 138 2 * Lept0E * (1. + 4. * u2 * Xsi2 * GG)) / 139 I_Lepton; 140 141 G4double T_Lepton2 = 142 4. * GammaE * Lept0E * Xsi * u * (1. - 2. * Xsi) * GG / I_Lepton; 143 144 G4double Stokes_SS1 = (Stokes_P3 * T_Lepton2); 145 G4double Stokes_SS2 = 0.; 146 G4double Stokes_SS3 = (Stokes_P3 * L_Lepton2); 147 148 fFinalPositronPolarization.SetPhoton(); 149 150 fFinalPositronPolarization.setX(Stokes_SS1); 151 fFinalPositronPolarization.setY(Stokes_SS2); 152 fFinalPositronPolarization.setZ(Stokes_SS3); 153 154 if(fFinalPositronPolarization.mag2() > 1.) 155 { 156 G4ExceptionDescription ed; 157 ed << "\t" << fFinalPositronPolarization << "\t GG\t" << GG << "\t delta\t" 158 << delta << "\n"; 159 G4Exception("G4PolarizedGammaConversionXS::Initialize", "pol023", 160 JustWarning, ed); 161 } 162 } 163 164 G4double G4PolarizedGammaConversionXS::XSection(const G4StokesVector& /*pol2*/, 165 const G4StokesVector& /*pol3*/) 166 { 167 G4ExceptionDescription ed; 168 ed << "ERROR dummy routine G4PolarizedGammaConversionXS::XSection " 169 "called \n"; 170 G4Exception("G4PolarizedGammaConversionXS::Initialize", "pol024", 171 FatalException, ed); 172 return 0.; 173 } 174 175 // return expected mean polarisation 176 G4StokesVector G4PolarizedGammaConversionXS::GetPol2() 177 { 178 // electron/positron 179 return fFinalElectronPolarization; 180 } 181 182 G4StokesVector G4PolarizedGammaConversionXS::GetPol3() 183 { 184 // photon 185 return fFinalPositronPolarization; 186 } 187