Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // >> 26 // >> 27 // 26 // ------------------------------------------- 28 // -------------------------------------------------------------- 27 // GEANT 4 class implementation file 29 // GEANT 4 class implementation file >> 30 // CERN Geneva Switzerland 28 // 31 // 29 // History: first implementation, 32 // History: first implementation, 30 // 21-5-98 V.Grichine 33 // 21-5-98 V.Grichine 31 // 28-05-01, V.Ivanchenko minor changes t 34 // 28-05-01, V.Ivanchenko minor changes to provide ANSI -wall compilation 32 // 04.03.05, V.Grichine: get local field 35 // 04.03.05, V.Grichine: get local field interface 33 // 19-05-06, V.Ivanchenko rename from G4S 36 // 19-05-06, V.Ivanchenko rename from G4SynchrotronRadiation 34 // 37 // >> 38 // 35 ////////////////////////////////////////////// 39 /////////////////////////////////////////////////////////////////////////// 36 40 37 #include "G4SynchrotronRadiationInMat.hh" 41 #include "G4SynchrotronRadiationInMat.hh" 38 << 39 #include "G4EmProcessSubType.hh" << 40 #include "G4Field.hh" << 41 #include "G4FieldManager.hh" << 42 #include "G4Integrator.hh" << 43 #include "G4PhysicalConstants.hh" 42 #include "G4PhysicalConstants.hh" 44 #include "G4PropagatorInField.hh" << 45 #include "G4SystemOfUnits.hh" 43 #include "G4SystemOfUnits.hh" 46 #include "G4PhysicsModelCatalog.hh" << 44 #include "G4Integrator.hh" >> 45 #include "G4EmProcessSubType.hh" 47 46 48 const G4double G4SynchrotronRadiationInMat::fI << 47 //////////////////////////////////////////////////////////////////// 49 1.000000e+00, 9.428859e-01, 9.094095e-01, 8. << 48 // 50 8.337008e-01, 8.124961e-01, 7.925217e-01, 7. << 49 // Constant for calculation of mean free path 51 7.381233e-01, 7.214521e-01, 7.053634e-01, 6. << 50 // 52 6.600922e-01, 6.458793e-01, 6.320533e-01, 6. << 51 53 5.926459e-01, 5.801347e-01, 5.679103e-01, 5. << 52 const G4double 54 5.328395e-01, 5.216482e-01, 5.106904e-01, 4. << 53 G4SynchrotronRadiationInMat::fLambdaConst = std::sqrt(3.0)*electron_mass_c2/ 55 4.791351e-01, 4.690316e-01, 4.591249e-01, 4. << 54 (2.5*fine_structure_const*eplus*c_light) ; 56 4.305320e-01, 4.213608e-01, 4.123623e-01, 4. << 55 57 3.863639e-01, 3.780179e-01, 3.698262e-01, 3. << 56 ///////////////////////////////////////////////////////////////////// 58 3.461460e-01, 3.385411e-01, 3.310757e-01, 3. << 57 // 59 3.094921e-01, 3.025605e-01, 2.957566e-01, 2. << 58 // Constant for calculation of characterictic energy 60 2.760907e-01, 2.697773e-01, 2.635817e-01, 2. << 59 // 61 2.456834e-01, 2.399409e-01, 2.343074e-01, 2. << 62 2.180442e-01, 2.128303e-01, 2.077174e-01, 2. << 63 1.929696e-01, 1.882457e-01, 1.836155e-01, 1. << 64 1.702730e-01, 1.660036e-01, 1.618212e-01, 1. << 65 1.497822e-01, 1.459344e-01, 1.421671e-01, 1. << 66 1.313360e-01, 1.278785e-01, 1.244956e-01, 1. << 67 1.147818e-01, 1.116850e-01, 1.086570e-01, 1. << 68 9.997405e-02, 9.720975e-02, 9.450865e-02, 9. << 69 8.677391e-02, 8.431501e-02, 8.191406e-02, 7. << 70 7.504872e-02, 7.286944e-02, 7.074311e-02, 6. << 71 6.467208e-02, 6.274790e-02, 6.087191e-02, 5. << 72 5.552387e-02, 5.383150e-02, 5.218282e-02, 5. << 73 4.749020e-02, 4.600763e-02, 4.456450e-02, 4. << 74 4.046353e-02, 3.917002e-02, 3.791195e-02, 3. << 75 3.434274e-02, 3.321884e-02, 3.212665e-02, 3. << 76 2.903319e-02, 2.806076e-02, 2.711656e-02, 2. << 77 2.444677e-02, 2.360897e-02, 2.279620e-02, 2. << 78 2.050194e-02, 1.978324e-02, 1.908662e-02, 1. << 79 1.712363e-02, 1.650979e-02, 1.591533e-02, 1. << 80 1.424314e-02, 1.372117e-02, 1.321613e-02, 1. << 81 1.179798e-02, 1.135611e-02, 1.092896e-02, 1. << 82 9.731635e-03, 9.359254e-03, 8.999595e-03, 8. << 83 7.993280e-03, 7.680879e-03, 7.379426e-03, 7. << 84 6.537491e-03, 6.276605e-03, 6.025092e-03, 5. << 85 5.323912e-03, 5.107045e-03, 4.898164e-03, 4. << 86 4.316896e-03, 4.137454e-03, 3.964780e-03, 3. << 87 3.485150e-03, 3.337364e-03, 3.195284e-03, 3. << 88 2.801361e-03, 2.680213e-03, 2.563852e-03, 2. << 89 }; << 90 60 91 ////////////////////////////////////////////// << 61 const G4double >> 62 G4SynchrotronRadiationInMat::fEnergyConst = 1.5*c_light*c_light*eplus*hbar_Planck/ >> 63 electron_mass_c2 ; >> 64 >> 65 //////////////////////////////////////////////////////////////////// >> 66 // >> 67 // Array of integral probability of synchrotron photons: >> 68 // >> 69 // the corresponding energy = 0.0001*i*i*(characteristic energy) >> 70 // >> 71 >> 72 const G4double >> 73 G4SynchrotronRadiationInMat::fIntegralProbabilityOfSR[200] = >> 74 { >> 75 1.000000e+00, 9.428859e-01, 9.094095e-01, 8.813971e-01, 8.565154e-01, >> 76 8.337008e-01, 8.124961e-01, 7.925217e-01, 7.735517e-01, 7.554561e-01, >> 77 7.381233e-01, 7.214521e-01, 7.053634e-01, 6.898006e-01, 6.747219e-01, >> 78 6.600922e-01, 6.458793e-01, 6.320533e-01, 6.185872e-01, 6.054579e-01, >> 79 5.926459e-01, 5.801347e-01, 5.679103e-01, 5.559604e-01, 5.442736e-01, >> 80 5.328395e-01, 5.216482e-01, 5.106904e-01, 4.999575e-01, 4.894415e-01, >> 81 4.791351e-01, 4.690316e-01, 4.591249e-01, 4.494094e-01, 4.398800e-01, >> 82 4.305320e-01, 4.213608e-01, 4.123623e-01, 4.035325e-01, 3.948676e-01, >> 83 3.863639e-01, 3.780179e-01, 3.698262e-01, 3.617858e-01, 3.538933e-01, >> 84 3.461460e-01, 3.385411e-01, 3.310757e-01, 3.237474e-01, 3.165536e-01, >> 85 3.094921e-01, 3.025605e-01, 2.957566e-01, 2.890784e-01, 2.825237e-01, >> 86 2.760907e-01, 2.697773e-01, 2.635817e-01, 2.575020e-01, 2.515365e-01, >> 87 2.456834e-01, 2.399409e-01, 2.343074e-01, 2.287812e-01, 2.233607e-01, >> 88 2.180442e-01, 2.128303e-01, 2.077174e-01, 2.027040e-01, 1.977885e-01, >> 89 1.929696e-01, 1.882457e-01, 1.836155e-01, 1.790775e-01, 1.746305e-01, >> 90 1.702730e-01, 1.660036e-01, 1.618212e-01, 1.577243e-01, 1.537117e-01, >> 91 1.497822e-01, 1.459344e-01, 1.421671e-01, 1.384791e-01, 1.348691e-01, >> 92 1.313360e-01, 1.278785e-01, 1.244956e-01, 1.211859e-01, 1.179483e-01, >> 93 1.147818e-01, 1.116850e-01, 1.086570e-01, 1.056966e-01, 1.028026e-01, >> 94 9.997405e-02, 9.720975e-02, 9.450865e-02, 9.186969e-02, 8.929179e-02, >> 95 8.677391e-02, 8.431501e-02, 8.191406e-02, 7.957003e-02, 7.728192e-02, >> 96 7.504872e-02, 7.286944e-02, 7.074311e-02, 6.866874e-02, 6.664538e-02, >> 97 6.467208e-02, 6.274790e-02, 6.087191e-02, 5.904317e-02, 5.726079e-02, >> 98 5.552387e-02, 5.383150e-02, 5.218282e-02, 5.057695e-02, 4.901302e-02, >> 99 4.749020e-02, 4.600763e-02, 4.456450e-02, 4.315997e-02, 4.179325e-02, >> 100 4.046353e-02, 3.917002e-02, 3.791195e-02, 3.668855e-02, 3.549906e-02, >> 101 3.434274e-02, 3.321884e-02, 3.212665e-02, 3.106544e-02, 3.003452e-02, >> 102 2.903319e-02, 2.806076e-02, 2.711656e-02, 2.619993e-02, 2.531021e-02, >> 103 2.444677e-02, 2.360897e-02, 2.279620e-02, 2.200783e-02, 2.124327e-02, >> 104 2.050194e-02, 1.978324e-02, 1.908662e-02, 1.841151e-02, 1.775735e-02, >> 105 1.712363e-02, 1.650979e-02, 1.591533e-02, 1.533973e-02, 1.478250e-02, >> 106 1.424314e-02, 1.372117e-02, 1.321613e-02, 1.272755e-02, 1.225498e-02, >> 107 1.179798e-02, 1.135611e-02, 1.092896e-02, 1.051609e-02, 1.011712e-02, >> 108 9.731635e-03, 9.359254e-03, 8.999595e-03, 8.652287e-03, 8.316967e-03, >> 109 7.993280e-03, 7.680879e-03, 7.379426e-03, 7.088591e-03, 6.808051e-03, >> 110 6.537491e-03, 6.276605e-03, 6.025092e-03, 5.782661e-03, 5.549027e-03, >> 111 5.323912e-03, 5.107045e-03, 4.898164e-03, 4.697011e-03, 4.503336e-03, >> 112 4.316896e-03, 4.137454e-03, 3.964780e-03, 3.798649e-03, 3.638843e-03, >> 113 3.485150e-03, 3.337364e-03, 3.195284e-03, 3.058715e-03, 2.927469e-03, >> 114 2.801361e-03, 2.680213e-03, 2.563852e-03, 2.452110e-03, 2.344824e-03 >> 115 }; >> 116 >> 117 /////////////////////////////////////////////////////////////////////// >> 118 // 92 // Constructor 119 // Constructor 93 G4SynchrotronRadiationInMat::G4SynchrotronRadi << 120 // 94 const G4String& processName, G4ProcessType t << 121 95 : G4VDiscreteProcess(processName, type) << 122 G4SynchrotronRadiationInMat::G4SynchrotronRadiationInMat(const G4String& processName, 96 , theGamma(G4Gamma::Gamma()) << 123 G4ProcessType type):G4VDiscreteProcess (processName, type), 97 , theElectron(G4Electron::Electron()) << 124 LowestKineticEnergy (10.*keV), 98 , thePositron(G4Positron::Positron()) << 125 theGamma (G4Gamma::Gamma() ), 99 , LowestKineticEnergy(10. * keV) << 126 theElectron ( G4Electron::Electron() ), 100 , fAlpha(0.0) << 127 thePositron ( G4Positron::Positron() ), 101 , fRootNumber(80) << 128 fAlpha(0.0), fRootNumber(80), 102 , fVerboseLevel(verboseLevel) << 129 fVerboseLevel( verboseLevel ) 103 { 130 { 104 G4TransportationManager* transportMgr = << 131 G4TransportationManager* transportMgr = G4TransportationManager::GetTransportationManager(); 105 G4TransportationManager::GetTransportation << 106 132 107 fFieldPropagator = transportMgr->GetPropagat 133 fFieldPropagator = transportMgr->GetPropagatorInField(); 108 secID = G4PhysicsModelCatalog::GetModelID("m << 109 SetProcessSubType(fSynchrotronRadiation); 134 SetProcessSubType(fSynchrotronRadiation); 110 CutInRange = GammaCutInKineticEnergyNow = El << 135 CutInRange = GammaCutInKineticEnergyNow = ElectronCutInKineticEnergyNow = 111 PositronCutInKineticEnergyNow = ParticleCu << 136 PositronCutInKineticEnergyNow = ParticleCutInKineticEnergyNow = fKsi = 112 fPsiGamma = fEta = fOrderAngleK = 0.0; << 137 fPsiGamma = fEta = fOrderAngleK = 0.0; 113 } 138 } 114 << 139 115 ////////////////////////////////////////////// 140 ///////////////////////////////////////////////////////////////////////// >> 141 // 116 // Destructor 142 // Destructor 117 G4SynchrotronRadiationInMat::~G4SynchrotronRad << 143 // >> 144 >> 145 G4SynchrotronRadiationInMat::~G4SynchrotronRadiationInMat() >> 146 {} >> 147 118 148 119 G4bool G4SynchrotronRadiationInMat::IsApplicab << 149 G4bool 120 const G4ParticleDefinition& particle) << 150 G4SynchrotronRadiationInMat::IsApplicable( const G4ParticleDefinition& particle ) 121 { 151 { 122 return ((&particle == (const G4ParticleDefin << 152 return ( ( &particle == (const G4ParticleDefinition *)theElectron ) || 123 (&particle == (const G4ParticleDefin << 153 ( &particle == (const G4ParticleDefinition *)thePositron )); 124 } 154 } 125 155 126 G4double G4SynchrotronRadiationInMat::GetLambd << 156 G4double G4SynchrotronRadiationInMat::GetLambdaConst() 127 << 157 { 128 G4double G4SynchrotronRadiationInMat::GetEnerg << 158 return fLambdaConst; >> 159 } 129 160 >> 161 G4double G4SynchrotronRadiationInMat::GetEnergyConst() >> 162 { >> 163 return fEnergyConst; >> 164 } >> 165 >> 166 /////////////////////////////// METHODS ///////////////////////////////// >> 167 // >> 168 // 130 // Production of synchrotron X-ray photon 169 // Production of synchrotron X-ray photon 131 // Geant4 internal units. << 170 // GEANT4 internal units. 132 G4double G4SynchrotronRadiationInMat::GetMeanF << 171 // 133 const G4Track& trackData, G4double, G4ForceC << 172 >> 173 >> 174 G4double >> 175 G4SynchrotronRadiationInMat::GetMeanFreePath( const G4Track& trackData, >> 176 G4double, >> 177 G4ForceCondition* condition) 134 { 178 { 135 // gives the MeanFreePath in GEANT4 internal 179 // gives the MeanFreePath in GEANT4 internal units 136 G4double MeanFreePath; 180 G4double MeanFreePath; 137 181 138 const G4DynamicParticle* aDynamicParticle = 182 const G4DynamicParticle* aDynamicParticle = trackData.GetDynamicParticle(); >> 183 // G4Material* aMaterial = trackData.GetMaterial(); 139 184 140 *condition = NotForced; << 185 //G4bool isOutRange ; >> 186 >> 187 *condition = NotForced ; 141 188 142 G4double gamma = << 189 G4double gamma = aDynamicParticle->GetTotalEnergy()/ 143 aDynamicParticle->GetTotalEnergy() / aDyna << 190 aDynamicParticle->GetMass(); 144 191 145 G4double particleCharge = aDynamicParticle-> 192 G4double particleCharge = aDynamicParticle->GetDefinition()->GetPDGCharge(); 146 193 147 G4double KineticEnergy = aDynamicParticle->G 194 G4double KineticEnergy = aDynamicParticle->GetKineticEnergy(); 148 195 149 if(KineticEnergy < LowestKineticEnergy || ga << 196 if ( KineticEnergy < LowestKineticEnergy || gamma < 1.0e3 ) MeanFreePath = DBL_MAX; 150 MeanFreePath = DBL_MAX; << 151 else 197 else 152 { 198 { 153 G4ThreeVector FieldValue; << 154 const G4Field* pField = nullptr; << 155 199 156 G4FieldManager* fieldMgr = nullptr; << 200 G4ThreeVector FieldValue; 157 G4bool fieldExertsForce = false; << 201 const G4Field* pField = nullptr; >> 202 >> 203 G4FieldManager* fieldMgr=nullptr; >> 204 G4bool fieldExertsForce = false; 158 205 159 if((particleCharge != 0.0)) << 206 if( (particleCharge != 0.0) ) 160 { 207 { 161 fieldMgr = << 208 fieldMgr = fFieldPropagator->FindAndSetFieldManager( trackData.GetVolume() ); 162 fFieldPropagator->FindAndSetFieldManag << 163 209 164 if(fieldMgr != nullptr) << 210 if ( fieldMgr != nullptr ) 165 { 211 { 166 // If the field manager has no field, 212 // If the field manager has no field, there is no field ! 167 fieldExertsForce = (fieldMgr->GetDetec << 213 >> 214 fieldExertsForce = ( fieldMgr->GetDetectorField() != nullptr ); 168 } 215 } 169 } 216 } 170 if(fieldExertsForce) << 217 if ( fieldExertsForce ) 171 { << 218 { 172 pField = fieldMgr->G << 219 pField = fieldMgr->GetDetectorField() ; 173 G4ThreeVector globPosition = trackData.G << 220 G4ThreeVector globPosition = trackData.GetPosition(); 174 221 175 G4double globPosVec[4], FieldValueVec[6] << 222 G4double globPosVec[4], FieldValueVec[6]; 176 223 177 globPosVec[0] = globPosition.x(); 224 globPosVec[0] = globPosition.x(); 178 globPosVec[1] = globPosition.y(); 225 globPosVec[1] = globPosition.y(); 179 globPosVec[2] = globPosition.z(); 226 globPosVec[2] = globPosition.z(); 180 globPosVec[3] = trackData.GetGlobalTime( 227 globPosVec[3] = trackData.GetGlobalTime(); 181 228 182 pField->GetFieldValue(globPosVec, FieldV << 229 pField->GetFieldValue( globPosVec, FieldValueVec ); 183 230 184 FieldValue = << 231 FieldValue = G4ThreeVector( FieldValueVec[0], 185 G4ThreeVector(FieldValueVec[0], FieldV << 232 FieldValueVec[1], >> 233 FieldValueVec[2] ); >> 234 >> 235 >> 236 >> 237 G4ThreeVector unitMomentum = aDynamicParticle->GetMomentumDirection(); >> 238 G4ThreeVector unitMcrossB = FieldValue.cross(unitMomentum) ; >> 239 G4double perpB = unitMcrossB.mag() ; >> 240 G4double beta = aDynamicParticle->GetTotalMomentum()/ >> 241 (aDynamicParticle->GetTotalEnergy() ); 186 242 187 G4ThreeVector unitMomentum = aDynamicPar << 243 if( perpB > 0.0 ) MeanFreePath = fLambdaConst*beta/perpB; 188 G4ThreeVector unitMcrossB = FieldValue. << 244 else MeanFreePath = DBL_MAX; 189 G4double perpB = unitMcrossB << 190 G4double beta = aDynamicPar << 191 (aDynamicParticle->GetTo << 192 << 193 if(perpB > 0.0) << 194 MeanFreePath = fLambdaConst * beta / p << 195 else << 196 MeanFreePath = DBL_MAX; << 197 } 245 } 198 else << 246 else MeanFreePath = DBL_MAX; 199 MeanFreePath = DBL_MAX; << 200 } 247 } 201 if(fVerboseLevel > 0) 248 if(fVerboseLevel > 0) 202 { 249 { 203 G4cout << "G4SynchrotronRadiationInMat::Me << 250 G4cout<<"G4SynchrotronRadiationInMat::MeanFreePath = "<<MeanFreePath/m<<" m"<<G4endl; 204 << " m" << G4endl; << 205 } 251 } 206 return MeanFreePath; << 252 return MeanFreePath; 207 } << 253 } 208 254 209 ////////////////////////////////////////////// 255 //////////////////////////////////////////////////////////////////////////////// 210 G4VParticleChange* G4SynchrotronRadiationInMat << 256 // 211 const G4Track& trackData, const G4Step& step << 257 // >> 258 >> 259 G4VParticleChange* >> 260 G4SynchrotronRadiationInMat::PostStepDoIt(const G4Track& trackData, >> 261 const G4Step& stepData ) 212 262 213 { 263 { 214 aParticleChange.Initialize(trackData); 264 aParticleChange.Initialize(trackData); 215 265 216 const G4DynamicParticle* aDynamicParticle = << 266 const G4DynamicParticle* aDynamicParticle=trackData.GetDynamicParticle(); 217 267 218 G4double gamma = << 268 G4double gamma = aDynamicParticle->GetTotalEnergy()/ 219 aDynamicParticle->GetTotalEnergy() / (aDyn << 269 (aDynamicParticle->GetMass() ); 220 270 221 if(gamma <= 1.0e3) << 271 if(gamma <= 1.0e3 ) 222 { 272 { 223 return G4VDiscreteProcess::PostStepDoIt(tr << 273 return G4VDiscreteProcess::PostStepDoIt(trackData,stepData); 224 } 274 } 225 G4double particleCharge = aDynamicParticle-> 275 G4double particleCharge = aDynamicParticle->GetDefinition()->GetPDGCharge(); 226 276 227 G4ThreeVector FieldValue; << 277 G4ThreeVector FieldValue; 228 const G4Field* pField = nullptr; << 278 const G4Field* pField = nullptr ; 229 279 230 G4FieldManager* fieldMgr = nullptr; << 280 G4FieldManager* fieldMgr=nullptr; 231 G4bool fieldExertsForce = false; << 281 G4bool fieldExertsForce = false; 232 282 233 if((particleCharge != 0.0)) << 283 if( (particleCharge != 0.0) ) 234 { 284 { 235 fieldMgr = fFieldPropagator->FindAndSetFie << 285 fieldMgr = fFieldPropagator->FindAndSetFieldManager( trackData.GetVolume() ); 236 if(fieldMgr != nullptr) << 286 if ( fieldMgr != nullptr ) 237 { 287 { 238 // If the field manager has no field, th 288 // If the field manager has no field, there is no field ! 239 fieldExertsForce = (fieldMgr->GetDetecto << 289 >> 290 fieldExertsForce = ( fieldMgr->GetDetectorField() != nullptr ); 240 } 291 } 241 } 292 } 242 if(fieldExertsForce) << 293 if ( fieldExertsForce ) 243 { 294 { 244 pField = fieldMgr->Get << 295 pField = fieldMgr->GetDetectorField() ; 245 G4ThreeVector globPosition = trackData.Get << 296 G4ThreeVector globPosition = trackData.GetPosition() ; 246 G4double globPosVec[4], FieldValueVec[6]; << 297 G4double globPosVec[4], FieldValueVec[6] ; 247 globPosVec[0] = globPosition.x(); << 298 globPosVec[0] = globPosition.x() ; 248 globPosVec[1] = globPosition.y(); << 299 globPosVec[1] = globPosition.y() ; 249 globPosVec[2] = globPosition.z(); << 300 globPosVec[2] = globPosition.z() ; 250 globPosVec[3] = trackData.GetGlobalTime(); 301 globPosVec[3] = trackData.GetGlobalTime(); 251 302 252 pField->GetFieldValue(globPosVec, FieldVal << 303 pField->GetFieldValue( globPosVec, FieldValueVec ) ; 253 FieldValue = << 304 FieldValue = G4ThreeVector( FieldValueVec[0], 254 G4ThreeVector(FieldValueVec[0], FieldVal << 305 FieldValueVec[1], 255 << 306 FieldValueVec[2] ); 256 G4ThreeVector unitMomentum = aDynamicParti << 307 257 G4ThreeVector unitMcrossB = FieldValue.cr << 308 G4ThreeVector unitMomentum = aDynamicParticle->GetMomentumDirection(); 258 G4double perpB = unitMcrossB.m << 309 G4ThreeVector unitMcrossB = FieldValue.cross(unitMomentum); >> 310 G4double perpB = unitMcrossB.mag() ; 259 if(perpB > 0.0) 311 if(perpB > 0.0) 260 { 312 { 261 // M-C of synchrotron photon energy 313 // M-C of synchrotron photon energy 262 G4double energyOfSR = GetRandomEnergySR( << 314 >> 315 G4double energyOfSR = GetRandomEnergySR(gamma,perpB); 263 316 264 if(fVerboseLevel > 0) 317 if(fVerboseLevel > 0) 265 { 318 { 266 G4cout << "SR photon energy = " << ene << 319 G4cout<<"SR photon energy = "<<energyOfSR/keV<<" keV"<<G4endl; 267 } 320 } 268 << 269 // check against insufficient energy 321 // check against insufficient energy 270 if(energyOfSR <= 0.0) << 322 >> 323 if( energyOfSR <= 0.0 ) 271 { 324 { 272 return G4VDiscreteProcess::PostStepDoI << 325 return G4VDiscreteProcess::PostStepDoIt(trackData,stepData); 273 } 326 } 274 G4double kineticEnergy = aDynamicParticl 327 G4double kineticEnergy = aDynamicParticle->GetKineticEnergy(); 275 G4ParticleMomentum particleDirection = << 328 G4ParticleMomentum 276 aDynamicParticle->GetMomentumDirection << 329 particleDirection = aDynamicParticle->GetMomentumDirection(); 277 330 278 // M-C of its direction, simplified dipo 331 // M-C of its direction, simplified dipole busted approach 279 G4double cosTheta, sinTheta, fcos, beta; << 332 >> 333 // G4double Teta = G4UniformRand()/gamma ; // Very roughly 280 334 281 do << 335 G4double cosTheta, sinTheta, fcos, beta; 282 { << 283 cosTheta = 1. - 2. * G4UniformRand(); << 284 fcos = (1 + cosTheta * cosTheta) * << 285 } << 286 // Loop checking, 07-Aug-2015, Vladimir << 287 while(fcos < G4UniformRand()); << 288 336 289 beta = std::sqrt(1. - 1. / (gamma * gamm << 337 do >> 338 { >> 339 cosTheta = 1. - 2.*G4UniformRand(); >> 340 fcos = (1 + cosTheta*cosTheta)*0.5; >> 341 } >> 342 // Loop checking, 07-Aug-2015, Vladimir Ivanchenko >> 343 while( fcos < G4UniformRand() ); 290 344 291 cosTheta = (cosTheta + beta) / (1. + bet << 345 beta = std::sqrt(1. - 1./(gamma*gamma)); 292 346 293 if(cosTheta > 1.) << 347 cosTheta = (cosTheta + beta)/(1. + beta*cosTheta); 294 cosTheta = 1.; << 295 if(cosTheta < -1.) << 296 cosTheta = -1.; << 297 348 298 sinTheta = std::sqrt(1. - cosTheta * cos << 349 if( cosTheta > 1. ) cosTheta = 1.; >> 350 if( cosTheta < -1. ) cosTheta = -1.; 299 351 300 G4double Phi = twopi * G4UniformRand(); << 352 sinTheta = std::sqrt(1. - cosTheta*cosTheta ); 301 353 302 G4double dirx = sinTheta * std::cos(Phi) << 354 G4double Phi = twopi * G4UniformRand() ; 303 G4double diry = sinTheta * std::sin(Phi) << 304 G4double dirz = cosTheta; << 305 355 306 G4ThreeVector gammaDirection(dirx, diry, << 356 G4double dirx = sinTheta*std::cos(Phi) , 307 gammaDirection.rotateUz(particleDirectio << 357 diry = sinTheta*std::sin(Phi) , >> 358 dirz = cosTheta; 308 359 >> 360 G4ThreeVector gammaDirection ( dirx, diry, dirz); >> 361 gammaDirection.rotateUz(particleDirection); >> 362 309 // polarization of new gamma 363 // polarization of new gamma >> 364 >> 365 // G4double sx = std::cos(Teta)*std::cos(Phi); >> 366 // G4double sy = std::cos(Teta)*std::sin(Phi); >> 367 // G4double sz = -std::sin(Teta); >> 368 310 G4ThreeVector gammaPolarization = FieldV 369 G4ThreeVector gammaPolarization = FieldValue.cross(gammaDirection); 311 gammaPolarization = gammaP << 370 gammaPolarization = gammaPolarization.unit(); >> 371 >> 372 // (sx, sy, sz); >> 373 // gammaPolarization.rotateUz(particleDirection); 312 374 313 // create G4DynamicParticle object for t 375 // create G4DynamicParticle object for the SR photon 314 auto aGamma = << 376 315 new G4DynamicParticle(G4Gamma::Gamma() << 377 G4DynamicParticle* aGamma= new G4DynamicParticle ( G4Gamma::Gamma(), 316 aGamma->SetPolarization(gammaPolarizatio << 378 gammaDirection, 317 gammaPolarizatio << 379 energyOfSR ); >> 380 aGamma->SetPolarization( gammaPolarization.x(), >> 381 gammaPolarization.y(), >> 382 gammaPolarization.z() ); 318 383 319 aParticleChange.SetNumberOfSecondaries(1 << 320 384 321 // Update the incident particle << 385 aParticleChange.SetNumberOfSecondaries(1); 322 G4double newKinEnergy = kineticEnergy - << 386 aParticleChange.AddSecondary(aGamma); 323 387 324 if(newKinEnergy > 0.) << 388 // Update the incident particle >> 389 >> 390 G4double newKinEnergy = kineticEnergy - energyOfSR ; >> 391 >> 392 if (newKinEnergy > 0.) 325 { 393 { 326 aParticleChange.ProposeMomentumDirecti << 394 aParticleChange.ProposeMomentumDirection( particleDirection ); 327 aParticleChange.ProposeEnergy(newKinEn << 395 aParticleChange.ProposeEnergy( newKinEnergy ); 328 aParticleChange.ProposeLocalEnergyDepo << 396 aParticleChange.ProposeLocalEnergyDeposit (0.); 329 } << 397 } 330 else 398 else 331 { << 399 { 332 aParticleChange.ProposeEnergy(0.); << 400 aParticleChange.ProposeEnergy( 0. ); 333 aParticleChange.ProposeLocalEnergyDepo << 401 aParticleChange.ProposeLocalEnergyDeposit (0.); 334 G4double charge = aDynamicParticle->Ge << 402 G4double charge = aDynamicParticle->GetDefinition()->GetPDGCharge(); 335 if(charge < 0.) << 403 if (charge<0.) 336 { 404 { 337 aParticleChange.ProposeTrackStatus(f << 405 aParticleChange.ProposeTrackStatus(fStopAndKill) ; 338 } << 406 } 339 else << 407 else 340 { 408 { 341 aParticleChange.ProposeTrackStatus(f << 409 aParticleChange.ProposeTrackStatus(fStopButAlive) ; 342 } << 410 } 343 } << 411 } 344 << 412 } 345 // Create the G4Track << 346 G4Track* aSecondaryTrack = new G4Track(a << 347 aSecondaryTrack->SetTouchableHandle(step << 348 aSecondaryTrack->SetParentID(trackData.G << 349 aSecondaryTrack->SetCreatorModelID(secID << 350 aParticleChange.AddSecondary(aSecondaryT << 351 } << 352 else 413 else 353 { 414 { 354 return G4VDiscreteProcess::PostStepDoIt( << 415 return G4VDiscreteProcess::PostStepDoIt(trackData,stepData); 355 } 416 } 356 } << 417 } 357 return G4VDiscreteProcess::PostStepDoIt(trac << 418 return G4VDiscreteProcess::PostStepDoIt(trackData,stepData); 358 } 419 } 359 420 360 G4double G4SynchrotronRadiationInMat::GetPhoto << 421 361 << 422 G4double >> 423 G4SynchrotronRadiationInMat::GetPhotonEnergy( const G4Track& trackData, >> 424 const G4Step& ) >> 425 362 { 426 { 363 G4int i; << 427 G4int i ; 364 G4double energyOfSR = -1.0; << 428 G4double energyOfSR = -1.0 ; >> 429 //G4Material* aMaterial=trackData.GetMaterial() ; 365 430 366 const G4DynamicParticle* aDynamicParticle = << 431 const G4DynamicParticle* aDynamicParticle=trackData.GetDynamicParticle(); 367 432 368 G4double gamma = << 433 G4double gamma = aDynamicParticle->GetTotalEnergy()/ 369 aDynamicParticle->GetTotalEnergy() / (aDyn << 434 (aDynamicParticle->GetMass() ) ; 370 435 371 G4double particleCharge = aDynamicParticle-> 436 G4double particleCharge = aDynamicParticle->GetDefinition()->GetPDGCharge(); 372 437 373 G4ThreeVector FieldValue; << 438 G4ThreeVector FieldValue; 374 const G4Field* pField = nullptr; << 439 const G4Field* pField = nullptr ; 375 440 376 G4FieldManager* fieldMgr = nullptr; << 441 G4FieldManager* fieldMgr=nullptr; 377 G4bool fieldExertsForce = false; << 442 G4bool fieldExertsForce = false; 378 443 379 if((particleCharge != 0.0)) << 444 if( (particleCharge != 0.0) ) 380 { 445 { 381 fieldMgr = fFieldPropagator->FindAndSetFie << 446 fieldMgr = fFieldPropagator->FindAndSetFieldManager( trackData.GetVolume() ); 382 if(fieldMgr != nullptr) << 447 if ( fieldMgr != nullptr ) 383 { 448 { 384 // If the field manager has no field, th 449 // If the field manager has no field, there is no field ! 385 fieldExertsForce = (fieldMgr->GetDetecto << 450 >> 451 fieldExertsForce = ( fieldMgr->GetDetectorField() != 0 ); 386 } 452 } 387 } 453 } 388 if(fieldExertsForce) << 454 if ( fieldExertsForce ) 389 { << 455 { 390 pField = fieldMgr->Get << 456 pField = fieldMgr->GetDetectorField(); 391 G4ThreeVector globPosition = trackData.Get << 457 G4ThreeVector globPosition = trackData.GetPosition(); 392 G4double globPosVec[3], FieldValueVec[3]; << 458 G4double globPosVec[3], FieldValueVec[3]; 393 459 394 globPosVec[0] = globPosition.x(); 460 globPosVec[0] = globPosition.x(); 395 globPosVec[1] = globPosition.y(); 461 globPosVec[1] = globPosition.y(); 396 globPosVec[2] = globPosition.z(); 462 globPosVec[2] = globPosition.z(); 397 463 398 pField->GetFieldValue(globPosVec, FieldVal << 464 pField->GetFieldValue( globPosVec, FieldValueVec ); 399 FieldValue = << 465 FieldValue = G4ThreeVector( FieldValueVec[0], 400 G4ThreeVector(FieldValueVec[0], FieldVal << 466 FieldValueVec[1], 401 << 467 FieldValueVec[2] ); 402 G4ThreeVector unitMomentum = aDynamicParti << 468 403 G4ThreeVector unitMcrossB = FieldValue.cr << 469 G4ThreeVector unitMomentum = aDynamicParticle->GetMomentumDirection(); >> 470 G4ThreeVector unitMcrossB = FieldValue.cross(unitMomentum) ; 404 G4double perpB = unitMcrossB.m 471 G4double perpB = unitMcrossB.mag(); 405 if(perpB > 0.0) << 472 if( perpB > 0.0 ) 406 { 473 { 407 // M-C of synchrotron photon energy 474 // M-C of synchrotron photon energy 408 G4double random = G4UniformRand(); << 475 409 for(i = 0; i < 200; ++i) << 476 G4double random = G4UniformRand() ; >> 477 for(i=0;i<200;i++) 410 { 478 { 411 if(random >= fIntegralProbabilityOfSR[ << 479 if(random >= fIntegralProbabilityOfSR[i]) break ; 412 break; << 413 } 480 } 414 energyOfSR = 0.0001 * i * i * fEnergyCon << 481 energyOfSR = 0.0001*i*i*fEnergyConst*gamma*gamma*perpB ; 415 482 416 // check against insufficient energy 483 // check against insufficient energy >> 484 417 if(energyOfSR <= 0.0) 485 if(energyOfSR <= 0.0) 418 { 486 { 419 return -1.0; << 487 return -1.0 ; 420 } 488 } 421 } << 489 //G4double kineticEnergy = aDynamicParticle->GetKineticEnergy(); >> 490 //G4ParticleMomentum >> 491 //particleDirection = aDynamicParticle->GetMomentumDirection(); >> 492 >> 493 // Gamma production cut in this material >> 494 //G4double >> 495 //gammaEnergyCut = (G4Gamma::GetCutsInEnergy())[aMaterial->GetIndex()]; >> 496 >> 497 // SR photon has energy more than the current material cut >> 498 // M-C of its direction >> 499 >> 500 //G4double Teta = G4UniformRand()/gamma ; // Very roughly >> 501 >> 502 //G4double Phi = twopi * G4UniformRand() ; >> 503 } 422 else 504 else 423 { 505 { 424 return -1.0; << 506 return -1.0 ; 425 } 507 } 426 } << 508 } 427 return energyOfSR; << 509 return energyOfSR ; 428 } 510 } 429 511 430 ////////////////////////////////////////////// 512 ///////////////////////////////////////////////////////////////////////////////// 431 G4double G4SynchrotronRadiationInMat::GetRando << 513 // 432 << 514 // >> 515 >> 516 G4double G4SynchrotronRadiationInMat::GetRandomEnergySR(G4double gamma, G4double perpB) 433 { 517 { 434 G4int i; << 518 G4int i, iMax; 435 static constexpr G4int iMax = 200; << 436 G4double energySR, random, position; 519 G4double energySR, random, position; 437 520 >> 521 iMax = 200; 438 random = G4UniformRand(); 522 random = G4UniformRand(); 439 523 440 for(i = 0; i < iMax; ++i) << 524 for( i = 0; i < iMax; i++ ) 441 { 525 { 442 if(random >= fIntegralProbabilityOfSR[i]) << 526 if( random >= fIntegralProbabilityOfSR[i] ) break; 443 break; << 444 } 527 } 445 if(i <= 0) << 528 if(i <= 0 ) position = G4UniformRand(); // 0. 446 position = G4UniformRand(); << 529 else if( i>= iMax) position = G4double(iMax); 447 else if(i >= iMax) << 530 else position = i + G4UniformRand(); // -1 448 position = G4double(iMax); << 531 // 449 else << 532 // it was in initial implementation: 450 position = i + G4UniformRand(); << 533 // energyOfSR = 0.0001*i*i*fEnergyConst*gamma*gamma*perpB ; 451 534 452 energySR = << 535 energySR = 0.0001*position*position*fEnergyConst*gamma*gamma*perpB; 453 0.0001 * position * position * fEnergyCons << 454 536 455 if(energySR < 0.) << 537 if( energySR < 0. ) energySR = 0.; 456 energySR = 0.; << 457 538 458 return energySR; 539 return energySR; 459 } 540 } 460 541 461 ////////////////////////////////////////////// 542 ///////////////////////////////////////////////////////////////////////// 462 G4double G4SynchrotronRadiationInMat::GetProbS << 543 // >> 544 // return >> 545 >> 546 G4double G4SynchrotronRadiationInMat::GetProbSpectrumSRforInt( G4double t) 463 { 547 { 464 G4double result, hypCos2, hypCos = std::cosh << 548 G4double result, hypCos2, hypCos=std::cosh(t); 465 549 466 hypCos2 = hypCos * hypCos; << 550 hypCos2 = hypCos*hypCos; 467 result = std::cosh(5. * t / 3.) * std::exp(t << 551 result = std::cosh(5.*t/3.)*std::exp(t-fKsi*hypCos); // fKsi > 0. ! 468 result /= hypCos2; 552 result /= hypCos2; 469 return result; 553 return result; 470 } 554 } 471 555 472 ////////////////////////////////////////////// 556 /////////////////////////////////////////////////////////////////////////// >> 557 // 473 // return the probability to emit SR photon wi 558 // return the probability to emit SR photon with relative energy 474 // energy/energy_c >= ksi 559 // energy/energy_c >= ksi 475 // for ksi <= 0. P = 1., however the method wo 560 // for ksi <= 0. P = 1., however the method works for ksi > 0 only! 476 G4double G4SynchrotronRadiationInMat::GetIntPr << 561 >> 562 G4double G4SynchrotronRadiationInMat::GetIntProbSR( G4double ksi) 477 { 563 { 478 if(ksi <= 0.) << 564 if (ksi <= 0.) return 1.0; 479 return 1.0; << 565 fKsi = ksi; // should be > 0. ! 480 fKsi = ksi; // should be > 0. ! << 481 G4int n; 566 G4int n; 482 G4double result, a; 567 G4double result, a; 483 568 484 a = fAlpha; // always = 0. << 569 a = fAlpha; // always = 0. 485 n = fRootNumber; // around default = 80 << 570 n = fRootNumber; // around default = 80 486 571 487 G4Integrator<G4SynchrotronRadiationInMat, << 572 G4Integrator<G4SynchrotronRadiationInMat, G4double(G4SynchrotronRadiationInMat::*)(G4double)> integral; 488 G4double (G4SynchrotronRadiatio << 489 integral; << 490 573 491 result = integral.Laguerre( << 574 result = integral.Laguerre(this, 492 this, &G4SynchrotronRadiationInMat::GetPro << 575 &G4SynchrotronRadiationInMat::GetProbSpectrumSRforInt, a, n); 493 576 494 result *= 3. / 5. / pi; << 577 result *= 3./5./pi; 495 578 496 return result; 579 return result; 497 } 580 } 498 581 499 ////////////////////////////////////////////// 582 ///////////////////////////////////////////////////////////////////////// >> 583 // 500 // return an auxiliary function for K_5/3 inte 584 // return an auxiliary function for K_5/3 integral representation 501 G4double G4SynchrotronRadiationInMat::GetProbS << 502 { << 503 G4double result, hypCos = std::cosh(t); << 504 585 505 result = std::cosh(5. * t / 3.) * std::exp(t << 586 G4double G4SynchrotronRadiationInMat::GetProbSpectrumSRforEnergy( G4double t) >> 587 { >> 588 G4double result, hypCos=std::cosh(t); >> 589 >> 590 result = std::cosh(5.*t/3.)*std::exp(t - fKsi*hypCos); // fKsi > 0. ! 506 result /= hypCos; 591 result /= hypCos; 507 return result; 592 return result; 508 } 593 } 509 594 510 ////////////////////////////////////////////// 595 /////////////////////////////////////////////////////////////////////////// >> 596 // 511 // return the probability to emit SR photon en 597 // return the probability to emit SR photon energy with relative energy 512 // energy/energy_c >= ksi 598 // energy/energy_c >= ksi 513 // for ksi <= 0. P = 1., however the method wo 599 // for ksi <= 0. P = 1., however the method works for ksi > 0 only! 514 G4double G4SynchrotronRadiationInMat::GetEnerg << 600 >> 601 G4double G4SynchrotronRadiationInMat::GetEnergyProbSR( G4double ksi) 515 { 602 { 516 if(ksi <= 0.) << 603 if (ksi <= 0.) return 1.0; 517 return 1.0; << 604 fKsi = ksi; // should be > 0. ! 518 fKsi = ksi; // should be > 0. ! << 519 G4int n; 605 G4int n; 520 G4double result, a; 606 G4double result, a; 521 607 522 a = fAlpha; // always = 0. << 608 a = fAlpha; // always = 0. 523 n = fRootNumber; // around default = 80 << 609 n = fRootNumber; // around default = 80 524 610 525 G4Integrator<G4SynchrotronRadiationInMat, << 611 G4Integrator<G4SynchrotronRadiationInMat, G4double(G4SynchrotronRadiationInMat::*)(G4double)> integral; 526 G4double (G4SynchrotronRadiatio << 527 integral; << 528 612 529 result = integral.Laguerre( << 613 result = integral.Laguerre(this, 530 this, &G4SynchrotronRadiationInMat::GetPro << 614 &G4SynchrotronRadiationInMat::GetProbSpectrumSRforEnergy, a, n); 531 615 532 result *= 9. * std::sqrt(3.) * ksi / 8. / pi << 616 result *= 9.*std::sqrt(3.)*ksi/8./pi; 533 617 534 return result; 618 return result; 535 } 619 } 536 620 537 ////////////////////////////////////////////// 621 ///////////////////////////////////////////////////////////////////////////// 538 G4double G4SynchrotronRadiationInMat::GetInteg << 622 // 539 { << 623 // 540 G4double result, hypCos = std::cosh(t); << 541 624 542 result = << 625 G4double G4SynchrotronRadiationInMat::GetIntegrandForAngleK( G4double t) 543 std::cosh(fOrderAngleK * t) * std::exp(t - << 626 { >> 627 G4double result, hypCos=std::cosh(t); >> 628 >> 629 result = std::cosh(fOrderAngleK*t)*std::exp(t - fEta*hypCos); // fEta > 0. ! 544 result /= hypCos; 630 result /= hypCos; 545 return result; 631 return result; 546 } 632 } 547 633 548 ////////////////////////////////////////////// 634 ////////////////////////////////////////////////////////////////////////// >> 635 // 549 // Return K 1/3 or 2/3 for angular distributio 636 // Return K 1/3 or 2/3 for angular distribution 550 G4double G4SynchrotronRadiationInMat::GetAngle << 637 >> 638 G4double G4SynchrotronRadiationInMat::GetAngleK( G4double eta) 551 { 639 { 552 fEta = eta; // should be > 0. ! << 640 fEta = eta; // should be > 0. ! 553 G4int n; 641 G4int n; 554 G4double result, a; 642 G4double result, a; 555 643 556 a = fAlpha; // always = 0. << 644 a = fAlpha; // always = 0. 557 n = fRootNumber; // around default = 80 << 645 n = fRootNumber; // around default = 80 558 646 559 G4Integrator<G4SynchrotronRadiationInMat, << 647 G4Integrator<G4SynchrotronRadiationInMat, G4double(G4SynchrotronRadiationInMat::*)(G4double)> integral; 560 G4double (G4SynchrotronRadiatio << 561 integral; << 562 648 563 result = integral.Laguerre( << 649 result = integral.Laguerre(this, 564 this, &G4SynchrotronRadiationInMat::GetInt << 650 &G4SynchrotronRadiationInMat::GetIntegrandForAngleK, a, n); 565 651 566 return result; 652 return result; 567 } 653 } 568 654 569 ////////////////////////////////////////////// 655 ///////////////////////////////////////////////////////////////////////// >> 656 // 570 // Relative angle diff distribution for given 657 // Relative angle diff distribution for given fKsi, which is set externally 571 G4double G4SynchrotronRadiationInMat::GetAngle << 572 { << 573 G4double result, funK, funK2, gpsi2 = gpsi * << 574 << 575 fPsiGamma = gpsi; << 576 fEta = 0.5 * fKsi * (1. + gpsi2) * std: << 577 658 578 fOrderAngleK = 1. / 3.; << 659 G4double G4SynchrotronRadiationInMat::GetAngleNumberAtGammaKsi( G4double gpsi) 579 funK = GetAngleK(fEta); << 660 { 580 funK2 = funK * funK; << 661 G4double result, funK, funK2, gpsi2 = gpsi*gpsi; 581 662 582 result = gpsi2 * funK2 / (1. + gpsi2); << 663 fPsiGamma = gpsi; >> 664 fEta = 0.5*fKsi*(1. + gpsi2)*std::sqrt(1. + gpsi2); >> 665 >> 666 fOrderAngleK = 1./3.; >> 667 funK = GetAngleK(fEta); >> 668 funK2 = funK*funK; >> 669 >> 670 result = gpsi2*funK2/(1. + gpsi2); >> 671 >> 672 fOrderAngleK = 2./3.; >> 673 funK = GetAngleK(fEta); >> 674 funK2 = funK*funK; >> 675 >> 676 result += funK2; >> 677 result *= (1. + gpsi2)*fKsi; >> 678 >> 679 return result; >> 680 } 583 681 584 fOrderAngleK = 2. / 3.; << 585 funK = GetAngleK(fEta); << 586 funK2 = funK * funK; << 587 682 588 result += funK2; << 683 ///////////////////// end of G4SynchrotronRadiationInMat.cc 589 result *= (1. + gpsi2) * fKsi; << 590 684 591 return result; << 592 } << 593 685