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 // $Id: $ >> 27 // GEANT4 tag $Name: $ >> 28 // 26 // ------------------------------------------- 29 // ------------------------------------------------------------------- 27 // 30 // 28 // GEANT4 Class file 31 // GEANT4 Class file 29 // 32 // 30 // 33 // 31 // File name: G4UrbanMscModel 34 // File name: G4UrbanMscModel 32 // 35 // 33 // Author: Laszlo Urban 36 // Author: Laszlo Urban 34 // 37 // 35 // Creation date: 19.02.2013 38 // Creation date: 19.02.2013 36 // 39 // 37 // Created from G4UrbanMscModel96 40 // Created from G4UrbanMscModel96 38 // 41 // 39 // New parametrization for theta0 42 // New parametrization for theta0 40 // Correction for very small step length 43 // Correction for very small step length 41 // 44 // 42 // Class Description: 45 // Class Description: 43 // 46 // 44 // Implementation of the model of multiple sca 47 // Implementation of the model of multiple scattering based on 45 // H.W.Lewis Phys Rev 78 (1950) 526 and others 48 // H.W.Lewis Phys Rev 78 (1950) 526 and others 46 49 47 // ------------------------------------------- 50 // ------------------------------------------------------------------- 48 // In its present form the model can be used 51 // In its present form the model can be used for simulation 49 // of the e-/e+ multiple scattering 52 // of the e-/e+ multiple scattering >> 53 // 50 54 51 55 52 //....oooOO0OOooo........oooOO0OOooo........oo 56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 53 //....oooOO0OOooo........oooOO0OOooo........oo 57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 54 58 55 #include "G4UrbanMscModel.hh" 59 #include "G4UrbanMscModel.hh" 56 #include "G4PhysicalConstants.hh" 60 #include "G4PhysicalConstants.hh" 57 #include "G4SystemOfUnits.hh" 61 #include "G4SystemOfUnits.hh" 58 #include "Randomize.hh" 62 #include "Randomize.hh" >> 63 #include "G4Electron.hh" 59 #include "G4Positron.hh" 64 #include "G4Positron.hh" >> 65 #include "G4LossTableManager.hh" 60 #include "G4EmParameters.hh" 66 #include "G4EmParameters.hh" 61 #include "G4ParticleChangeForMSC.hh" 67 #include "G4ParticleChangeForMSC.hh" 62 #include "G4ProductionCutsTable.hh" << 63 68 64 #include "G4Poisson.hh" 69 #include "G4Poisson.hh" 65 #include "G4Pow.hh" 70 #include "G4Pow.hh" >> 71 #include "globals.hh" 66 #include "G4Log.hh" 72 #include "G4Log.hh" 67 #include "G4Exp.hh" 73 #include "G4Exp.hh" 68 #include "G4AutoLock.hh" << 69 74 70 //....oooOO0OOooo........oooOO0OOooo........oo 75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 71 76 72 std::vector<G4UrbanMscModel::mscData*> G4Urban << 77 using namespace std; 73 << 74 namespace << 75 { << 76 G4Mutex theUrbanMutex = G4MUTEX_INITIALIZER; << 77 } << 78 78 79 //....oooOO0OOooo........oooOO0OOooo........oo 79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 80 80 81 G4UrbanMscModel::G4UrbanMscModel(const G4Strin 81 G4UrbanMscModel::G4UrbanMscModel(const G4String& nam) 82 : G4VMscModel(nam) 82 : G4VMscModel(nam) 83 { 83 { 84 masslimite = 0.6*CLHEP::MeV; << 84 masslimite = 0.6*MeV; >> 85 lambdalimit = 1.*mm; 85 fr = 0.02; 86 fr = 0.02; 86 taubig = 8.0; 87 taubig = 8.0; 87 tausmall = 1.e-16; 88 tausmall = 1.e-16; 88 taulim = 1.e-6; 89 taulim = 1.e-6; 89 currentTau = taulim; 90 currentTau = taulim; 90 tlimitminfix = 0.01*CLHEP::nm; << 91 tlimitminfix = 0.01*nm; 91 tlimitminfix2 = 1.*CLHEP::nm; << 92 tlimitminfix2 = 1.*nm; 92 stepmin = tlimitminfix; 93 stepmin = tlimitminfix; 93 smallstep = 1.e10; 94 smallstep = 1.e10; 94 currentRange = 0.; << 95 currentRange = 0. ; 95 rangeinit = 0.; 96 rangeinit = 0.; 96 tlimit = 1.e10*CLHEP::mm; << 97 tlimit = 1.e10*mm; 97 tlimitmin = 10.*tlimitminfix; 98 tlimitmin = 10.*tlimitminfix; 98 tgeom = 1.e50*CLHEP::mm; << 99 tgeom = 1.e50*mm; 99 geombig = tgeom; << 100 geombig = 1.e50*mm; 100 geommin = 1.e-3*CLHEP::mm; << 101 geommin = 1.e-3*mm; 101 geomlimit = geombig; 102 geomlimit = geombig; 102 presafety = 0.; << 103 presafety = 0.*mm; >> 104 >> 105 facsafety = 0.6; >> 106 >> 107 Zold = 0.; >> 108 Zeff = 1.; >> 109 Z2 = 1.; >> 110 Z23 = 1.; >> 111 lnZ = 0.; >> 112 coeffth1 = 0.; >> 113 coeffth2 = 0.; >> 114 coeffc1 = 0.; >> 115 coeffc2 = 0.; >> 116 coeffc3 = 0.; >> 117 coeffc4 = 0.; >> 118 particle = 0; 103 119 104 positron = G4Positron::Positron(); 120 positron = G4Positron::Positron(); >> 121 theManager = G4LossTableManager::Instance(); 105 rndmEngineMod = G4Random::getTheEngine(); 122 rndmEngineMod = G4Random::getTheEngine(); 106 123 107 drr = 0.35; << 124 firstStep = true; 108 finalr = 10.*CLHEP::um; << 125 insideskin = false; 109 << 126 latDisplasmentbackup = false; 110 tlow = 5.*CLHEP::keV; << 127 dispAlg96 = true; 111 invmev = 1.0/CLHEP::MeV; << 128 >> 129 rangecut = geombig; >> 130 drr = 0.35 ; >> 131 finalr = 10.*um ; 112 132 113 skindepth = skin*stepmin; 133 skindepth = skin*stepmin; 114 134 115 mass = CLHEP::proton_mass_c2; << 135 mass = proton_mass_c2; 116 charge = chargeSquare = 1.0; << 136 charge = ChargeSquare = 1.0; 117 currentKinEnergy = currentRadLength = lambda 137 currentKinEnergy = currentRadLength = lambda0 = lambdaeff = tPathLength 118 = zPathLength = par1 = par2 = par3 = rndma << 138 = zPathLength = par1 = par2 = par3 = 0; 119 currentLogKinEnergy = LOG_EKIN_MIN; << 139 >> 140 currentMaterialIndex = -1; >> 141 fParticleChange = nullptr; >> 142 couple = nullptr; 120 } 143 } 121 144 122 //....oooOO0OOooo........oooOO0OOooo........oo 145 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 123 146 124 G4UrbanMscModel::~G4UrbanMscModel() 147 G4UrbanMscModel::~G4UrbanMscModel() 125 { << 148 {} 126 if(isFirstInstance) { << 127 for(auto const & ptr : msc) { delete ptr; << 128 msc.clear(); << 129 } << 130 } << 131 149 132 //....oooOO0OOooo........oooOO0OOooo........oo 150 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 133 151 134 void G4UrbanMscModel::Initialise(const G4Parti 152 void G4UrbanMscModel::Initialise(const G4ParticleDefinition* p, 135 const G4DataV 153 const G4DataVector&) 136 { 154 { 137 // set values of some data members 155 // set values of some data members 138 SetParticle(p); 156 SetParticle(p); 139 fParticleChange = GetParticleChangeForMSC(p) 157 fParticleChange = GetParticleChangeForMSC(p); 140 InitialiseParameters(p); << 141 158 142 latDisplasmentbackup = latDisplasment; 159 latDisplasmentbackup = latDisplasment; >> 160 dispAlg96 = (G4EmParameters::Instance()->LateralDisplacementAlg96()); 143 161 144 // if model is locked parameters should be d << 162 //G4cout << "### G4UrbanMscModel::Initialise done for " 145 if(!IsLocked()) { << 163 // << p->GetParticleName() << G4endl; 146 dispAlg96 = G4EmParameters::Instance()->La << 147 fPosiCorrection = G4EmParameters::Instance << 148 } << 149 << 150 // initialise cache only once << 151 if(0 == msc.size()) { << 152 G4AutoLock l(&theUrbanMutex); << 153 if(0 == msc.size()) { << 154 isFirstInstance = true; << 155 msc.resize(1, nullptr); << 156 } << 157 l.unlock(); << 158 } << 159 // initialise cache for each new run << 160 if(isFirstInstance) { InitialiseModelCache() << 161 << 162 /* << 163 G4cout << "### G4UrbanMscModel::Initialise d << 164 << p->GetParticleName() << " type= " << ste << 165 G4cout << " RangeFact= " << facrange << " << 166 << " SafetyFact= " << facsafety << " Lambda << 167 << G4endl; << 168 */ << 169 } 164 } 170 165 171 //....oooOO0OOooo........oooOO0OOooo........oo 166 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 172 167 173 G4double G4UrbanMscModel::ComputeCrossSectionP 168 G4double G4UrbanMscModel::ComputeCrossSectionPerAtom( 174 const G4ParticleD 169 const G4ParticleDefinition* part, 175 G4double ki << 170 G4double KineticEnergy, 176 G4double at << 171 G4double AtomicNumber,G4double, 177 G4double, G 172 G4double, G4double) 178 { 173 { 179 static const G4double epsmin = 1.e-4 , epsma 174 static const G4double epsmin = 1.e-4 , epsmax = 1.e10; 180 175 181 static const G4double Zdat[15] = { 4., 6., 176 static const G4double Zdat[15] = { 4., 6., 13., 20., 26., 29., 32., 38.,47., 182 50., 56., 177 50., 56., 64., 74., 79., 82. }; 183 178 184 // corr. factors for e-/e+ lambda for T <= T 179 // corr. factors for e-/e+ lambda for T <= Tlim 185 static const G4double celectron[15][22] = 180 static const G4double celectron[15][22] = 186 {{1.125,1.072,1.051,1.047,1.047,1.05 181 {{1.125,1.072,1.051,1.047,1.047,1.050,1.052,1.054, 187 1.054,1.057,1.062,1.069,1.075,1.09 182 1.054,1.057,1.062,1.069,1.075,1.090,1.105,1.111, 188 1.112,1.108,1.100,1.093,1.089,1.08 183 1.112,1.108,1.100,1.093,1.089,1.087 }, 189 {1.408,1.246,1.143,1.096,1.077,1.05 184 {1.408,1.246,1.143,1.096,1.077,1.059,1.053,1.051, 190 1.052,1.053,1.058,1.065,1.072,1.08 185 1.052,1.053,1.058,1.065,1.072,1.087,1.101,1.108, 191 1.109,1.105,1.097,1.090,1.086,1.08 186 1.109,1.105,1.097,1.090,1.086,1.082 }, 192 {2.833,2.268,1.861,1.612,1.486,1.30 187 {2.833,2.268,1.861,1.612,1.486,1.309,1.204,1.156, 193 1.136,1.114,1.106,1.106,1.109,1.11 188 1.136,1.114,1.106,1.106,1.109,1.119,1.129,1.132, 194 1.131,1.124,1.113,1.104,1.099,1.09 189 1.131,1.124,1.113,1.104,1.099,1.098 }, 195 {3.879,3.016,2.380,2.007,1.818,1.53 190 {3.879,3.016,2.380,2.007,1.818,1.535,1.340,1.236, 196 1.190,1.133,1.107,1.099,1.098,1.10 191 1.190,1.133,1.107,1.099,1.098,1.103,1.110,1.113, 197 1.112,1.105,1.096,1.089,1.085,1.09 192 1.112,1.105,1.096,1.089,1.085,1.098 }, 198 {6.937,4.330,2.886,2.256,1.987,1.62 193 {6.937,4.330,2.886,2.256,1.987,1.628,1.395,1.265, 199 1.203,1.122,1.080,1.065,1.061,1.06 194 1.203,1.122,1.080,1.065,1.061,1.063,1.070,1.073, 200 1.073,1.070,1.064,1.059,1.056,1.05 195 1.073,1.070,1.064,1.059,1.056,1.056 }, 201 {9.616,5.708,3.424,2.551,2.204,1.76 196 {9.616,5.708,3.424,2.551,2.204,1.762,1.485,1.330, 202 1.256,1.155,1.099,1.077,1.070,1.06 197 1.256,1.155,1.099,1.077,1.070,1.068,1.072,1.074, 203 1.074,1.070,1.063,1.059,1.056,1.05 198 1.074,1.070,1.063,1.059,1.056,1.052 }, 204 {11.72,6.364,3.811,2.806,2.401,1.88 199 {11.72,6.364,3.811,2.806,2.401,1.884,1.564,1.386, 205 1.300,1.180,1.112,1.082,1.073,1.06 200 1.300,1.180,1.112,1.082,1.073,1.066,1.068,1.069, 206 1.068,1.064,1.059,1.054,1.051,1.05 201 1.068,1.064,1.059,1.054,1.051,1.050 }, 207 {18.08,8.601,4.569,3.183,2.662,2.02 202 {18.08,8.601,4.569,3.183,2.662,2.025,1.646,1.439, 208 1.339,1.195,1.108,1.068,1.053,1.04 203 1.339,1.195,1.108,1.068,1.053,1.040,1.039,1.039, 209 1.039,1.037,1.034,1.031,1.030,1.03 204 1.039,1.037,1.034,1.031,1.030,1.036 }, 210 {18.22,10.48,5.333,3.713,3.115,2.36 205 {18.22,10.48,5.333,3.713,3.115,2.367,1.898,1.631, 211 1.498,1.301,1.171,1.105,1.077,1.04 206 1.498,1.301,1.171,1.105,1.077,1.048,1.036,1.033, 212 1.031,1.028,1.024,1.022,1.021,1.02 207 1.031,1.028,1.024,1.022,1.021,1.024 }, 213 {14.14,10.65,5.710,3.929,3.266,2.45 208 {14.14,10.65,5.710,3.929,3.266,2.453,1.951,1.669, 214 1.528,1.319,1.178,1.106,1.075,1.04 209 1.528,1.319,1.178,1.106,1.075,1.040,1.027,1.022, 215 1.020,1.017,1.015,1.013,1.013,1.02 210 1.020,1.017,1.015,1.013,1.013,1.020 }, 216 {14.11,11.73,6.312,4.240,3.478,2.56 211 {14.11,11.73,6.312,4.240,3.478,2.566,2.022,1.720, 217 1.569,1.342,1.186,1.102,1.065,1.02 212 1.569,1.342,1.186,1.102,1.065,1.022,1.003,0.997, 218 0.995,0.993,0.993,0.993,0.993,1.01 213 0.995,0.993,0.993,0.993,0.993,1.011 }, 219 {22.76,20.01,8.835,5.287,4.144,2.90 214 {22.76,20.01,8.835,5.287,4.144,2.901,2.219,1.855, 220 1.677,1.410,1.224,1.121,1.073,1.01 215 1.677,1.410,1.224,1.121,1.073,1.014,0.986,0.976, 221 0.974,0.972,0.973,0.974,0.975,0.98 216 0.974,0.972,0.973,0.974,0.975,0.987 }, 222 {50.77,40.85,14.13,7.184,5.284,3.43 217 {50.77,40.85,14.13,7.184,5.284,3.435,2.520,2.059, 223 1.837,1.512,1.283,1.153,1.091,1.01 218 1.837,1.512,1.283,1.153,1.091,1.010,0.969,0.954, 224 0.950,0.947,0.949,0.952,0.954,0.96 219 0.950,0.947,0.949,0.952,0.954,0.963 }, 225 {65.87,59.06,15.87,7.570,5.567,3.65 220 {65.87,59.06,15.87,7.570,5.567,3.650,2.682,2.182, 226 1.939,1.579,1.325,1.178,1.108,1.01 221 1.939,1.579,1.325,1.178,1.108,1.014,0.965,0.947, 227 0.941,0.938,0.940,0.944,0.946,0.95 222 0.941,0.938,0.940,0.944,0.946,0.954 }, 228 {55.60,47.34,15.92,7.810,5.755,3.76 223 {55.60,47.34,15.92,7.810,5.755,3.767,2.760,2.239, 229 1.985,1.609,1.343,1.188,1.113,1.01 224 1.985,1.609,1.343,1.188,1.113,1.013,0.960,0.939, 230 0.933,0.930,0.933,0.936,0.939,0.94 225 0.933,0.930,0.933,0.936,0.939,0.949 }}; 231 226 232 static const G4double cpositron[15][22] = { 227 static const G4double cpositron[15][22] = { 233 {2.589,2.044,1.658,1.446,1.347,1.21 228 {2.589,2.044,1.658,1.446,1.347,1.217,1.144,1.110, 234 1.097,1.083,1.080,1.086,1.092,1.10 229 1.097,1.083,1.080,1.086,1.092,1.108,1.123,1.131, 235 1.131,1.126,1.117,1.108,1.103,1.10 230 1.131,1.126,1.117,1.108,1.103,1.100 }, 236 {3.904,2.794,2.079,1.710,1.543,1.32 231 {3.904,2.794,2.079,1.710,1.543,1.325,1.202,1.145, 237 1.122,1.096,1.089,1.092,1.098,1.11 232 1.122,1.096,1.089,1.092,1.098,1.114,1.130,1.137, 238 1.138,1.132,1.122,1.113,1.108,1.10 233 1.138,1.132,1.122,1.113,1.108,1.102 }, 239 {7.970,6.080,4.442,3.398,2.872,2.12 234 {7.970,6.080,4.442,3.398,2.872,2.127,1.672,1.451, 240 1.357,1.246,1.194,1.179,1.178,1.18 235 1.357,1.246,1.194,1.179,1.178,1.188,1.201,1.205, 241 1.203,1.190,1.173,1.159,1.151,1.14 236 1.203,1.190,1.173,1.159,1.151,1.145 }, 242 {9.714,7.607,5.747,4.493,3.815,2.77 237 {9.714,7.607,5.747,4.493,3.815,2.777,2.079,1.715, 243 1.553,1.353,1.253,1.219,1.211,1.21 238 1.553,1.353,1.253,1.219,1.211,1.214,1.225,1.228, 244 1.225,1.210,1.191,1.175,1.166,1.17 239 1.225,1.210,1.191,1.175,1.166,1.174 }, 245 {17.97,12.95,8.628,6.065,4.849,3.22 240 {17.97,12.95,8.628,6.065,4.849,3.222,2.275,1.820, 246 1.624,1.382,1.259,1.214,1.202,1.20 241 1.624,1.382,1.259,1.214,1.202,1.202,1.214,1.219, 247 1.217,1.203,1.184,1.169,1.160,1.15 242 1.217,1.203,1.184,1.169,1.160,1.151 }, 248 {24.83,17.06,10.84,7.355,5.767,3.70 243 {24.83,17.06,10.84,7.355,5.767,3.707,2.546,1.996, 249 1.759,1.465,1.311,1.252,1.234,1.22 244 1.759,1.465,1.311,1.252,1.234,1.228,1.238,1.241, 250 1.237,1.222,1.201,1.184,1.174,1.15 245 1.237,1.222,1.201,1.184,1.174,1.159 }, 251 {23.26,17.15,11.52,8.049,6.375,4.11 246 {23.26,17.15,11.52,8.049,6.375,4.114,2.792,2.155, 252 1.880,1.535,1.353,1.281,1.258,1.24 247 1.880,1.535,1.353,1.281,1.258,1.247,1.254,1.256, 253 1.252,1.234,1.212,1.194,1.183,1.17 248 1.252,1.234,1.212,1.194,1.183,1.170 }, 254 {22.33,18.01,12.86,9.212,7.336,4.70 249 {22.33,18.01,12.86,9.212,7.336,4.702,3.117,2.348, 255 2.015,1.602,1.385,1.297,1.268,1.25 250 2.015,1.602,1.385,1.297,1.268,1.251,1.256,1.258, 256 1.254,1.237,1.214,1.195,1.185,1.17 251 1.254,1.237,1.214,1.195,1.185,1.179 }, 257 {33.91,24.13,15.71,10.80,8.507,5.46 252 {33.91,24.13,15.71,10.80,8.507,5.467,3.692,2.808, 258 2.407,1.873,1.564,1.425,1.374,1.33 253 2.407,1.873,1.564,1.425,1.374,1.330,1.324,1.320, 259 1.312,1.288,1.258,1.235,1.221,1.20 254 1.312,1.288,1.258,1.235,1.221,1.205 }, 260 {32.14,24.11,16.30,11.40,9.015,5.78 255 {32.14,24.11,16.30,11.40,9.015,5.782,3.868,2.917, 261 2.490,1.925,1.596,1.447,1.391,1.34 256 2.490,1.925,1.596,1.447,1.391,1.342,1.332,1.327, 262 1.320,1.294,1.264,1.240,1.226,1.21 257 1.320,1.294,1.264,1.240,1.226,1.214 }, 263 {29.51,24.07,17.19,12.28,9.766,6.23 258 {29.51,24.07,17.19,12.28,9.766,6.238,4.112,3.066, 264 2.602,1.995,1.641,1.477,1.414,1.35 259 2.602,1.995,1.641,1.477,1.414,1.356,1.342,1.336, 265 1.328,1.302,1.270,1.245,1.231,1.23 260 1.328,1.302,1.270,1.245,1.231,1.233 }, 266 {38.19,30.85,21.76,15.35,12.07,7.52 261 {38.19,30.85,21.76,15.35,12.07,7.521,4.812,3.498, 267 2.926,2.188,1.763,1.563,1.484,1.40 262 2.926,2.188,1.763,1.563,1.484,1.405,1.382,1.371, 268 1.361,1.330,1.294,1.267,1.251,1.23 263 1.361,1.330,1.294,1.267,1.251,1.239 }, 269 {49.71,39.80,27.96,19.63,15.36,9.40 264 {49.71,39.80,27.96,19.63,15.36,9.407,5.863,4.155, 270 3.417,2.478,1.944,1.692,1.589,1.48 265 3.417,2.478,1.944,1.692,1.589,1.480,1.441,1.423, 271 1.409,1.372,1.330,1.298,1.280,1.25 266 1.409,1.372,1.330,1.298,1.280,1.258 }, 272 {59.25,45.08,30.36,20.83,16.15,9.83 267 {59.25,45.08,30.36,20.83,16.15,9.834,6.166,4.407, 273 3.641,2.648,2.064,1.779,1.661,1.53 268 3.641,2.648,2.064,1.779,1.661,1.531,1.482,1.459, 274 1.442,1.400,1.354,1.319,1.299,1.27 269 1.442,1.400,1.354,1.319,1.299,1.272 }, 275 {56.38,44.29,30.50,21.18,16.51,10.1 270 {56.38,44.29,30.50,21.18,16.51,10.11,6.354,4.542, 276 3.752,2.724,2.116,1.817,1.692,1.55 271 3.752,2.724,2.116,1.817,1.692,1.554,1.499,1.474, 277 1.456,1.412,1.364,1.328,1.307,1.28 272 1.456,1.412,1.364,1.328,1.307,1.282 }}; 278 273 279 //data/corrections for T > Tlim 274 //data/corrections for T > Tlim 280 275 281 static const G4double hecorr[15] = { 276 static const G4double hecorr[15] = { 282 120.70, 117.50, 105.00, 92.92, 79.23, 74. 277 120.70, 117.50, 105.00, 92.92, 79.23, 74.510, 68.29, 283 57.39, 41.97, 36.14, 24.53, 10.21, -7.8 278 57.39, 41.97, 36.14, 24.53, 10.21, -7.855, -16.84, 284 -22.30}; 279 -22.30}; 285 280 286 G4double sigma; 281 G4double sigma; 287 SetParticle(part); 282 SetParticle(part); 288 283 289 G4double Z23 = G4Pow::GetInstance()->Z23(G4l << 284 Z23 = G4Pow::GetInstance()->Z23(G4lrint(AtomicNumber)); 290 285 291 // correction if particle .ne. e-/e+ 286 // correction if particle .ne. e-/e+ 292 // compute equivalent kinetic energy 287 // compute equivalent kinetic energy 293 // lambda depends on p*beta .... 288 // lambda depends on p*beta .... 294 289 295 G4double eKineticEnergy = kinEnergy; << 290 G4double eKineticEnergy = KineticEnergy; 296 291 297 if(mass > CLHEP::electron_mass_c2) << 292 if(mass > electron_mass_c2) 298 { 293 { 299 G4double TAU = kinEnergy/mass ; << 294 G4double TAU = KineticEnergy/mass ; 300 G4double c = mass*TAU*(TAU+2.)/(CLHEP::el << 295 G4double c = mass*TAU*(TAU+2.)/(electron_mass_c2*(TAU+1.)) ; 301 G4double w = c-2.; << 296 G4double w = c-2. ; 302 G4double tau = 0.5*(w+std::sqrt(w*w+4.*c) << 297 G4double tau = 0.5*(w+sqrt(w*w+4.*c)) ; 303 eKineticEnergy = CLHEP::electron_mass_c2* << 298 eKineticEnergy = electron_mass_c2*tau ; 304 } 299 } 305 300 306 G4double eTotalEnergy = eKineticEnergy + CLH << 301 G4double eTotalEnergy = eKineticEnergy + electron_mass_c2 ; 307 G4double beta2 = eKineticEnergy*(eTotalEnerg << 302 G4double beta2 = eKineticEnergy*(eTotalEnergy+electron_mass_c2) 308 /(eTotalEnerg 303 /(eTotalEnergy*eTotalEnergy); 309 G4double bg2 = eKineticEnergy*(eTotalEnerg << 304 G4double bg2 = eKineticEnergy*(eTotalEnergy+electron_mass_c2) 310 /(CLHEP::elec << 305 /(electron_mass_c2*electron_mass_c2); 311 306 312 static const G4double epsfactor = 2.*CLHEP:: 307 static const G4double epsfactor = 2.*CLHEP::electron_mass_c2* 313 CLHEP::electron_mass_c2*CLHEP::Bohr_radius 308 CLHEP::electron_mass_c2*CLHEP::Bohr_radius*CLHEP::Bohr_radius 314 /(CLHEP::hbarc*CLHEP::hbarc); 309 /(CLHEP::hbarc*CLHEP::hbarc); 315 G4double eps = epsfactor*bg2/Z23; 310 G4double eps = epsfactor*bg2/Z23; 316 311 317 if (eps<epsmin) sigma = 2.*eps*eps; 312 if (eps<epsmin) sigma = 2.*eps*eps; 318 else if(eps<epsmax) sigma = G4Log(1.+2.*eps 313 else if(eps<epsmax) sigma = G4Log(1.+2.*eps)-2.*eps/(1.+2.*eps); 319 else sigma = G4Log(2.*eps)-1 314 else sigma = G4Log(2.*eps)-1.+1./eps; 320 315 321 sigma *= chargeSquare*atomicNumber*atomicNum << 316 sigma *= ChargeSquare*AtomicNumber*AtomicNumber/(beta2*bg2); 322 317 323 // interpolate in AtomicNumber and beta2 318 // interpolate in AtomicNumber and beta2 324 G4double c1,c2,cc1; << 319 G4double c1,c2,cc1,cc2,corr; 325 320 326 // get bin number in Z 321 // get bin number in Z 327 G4int iZ = 14; 322 G4int iZ = 14; 328 // Loop checking, 03-Aug-2015, Vladimir Ivan 323 // Loop checking, 03-Aug-2015, Vladimir Ivanchenko 329 while ((iZ>=0)&&(Zdat[iZ]>=atomicNumber)) { << 324 while ((iZ>=0)&&(Zdat[iZ]>=AtomicNumber)) iZ -= 1; 330 << 325 if (iZ==14) iZ = 13; 331 iZ = std::min(std::max(iZ, 0), 13); << 326 if (iZ==-1) iZ = 0 ; 332 327 333 G4double ZZ1 = Zdat[iZ]; 328 G4double ZZ1 = Zdat[iZ]; 334 G4double ZZ2 = Zdat[iZ+1]; 329 G4double ZZ2 = Zdat[iZ+1]; 335 G4double ratZ = (atomicNumber-ZZ1)*(atomicNu << 330 G4double ratZ = (AtomicNumber-ZZ1)*(AtomicNumber+ZZ1)/ 336 ((ZZ2-ZZ1)*(ZZ2+ZZ1)); 331 ((ZZ2-ZZ1)*(ZZ2+ZZ1)); 337 332 338 static const G4double Tlim = 10.*CLHEP::MeV; 333 static const G4double Tlim = 10.*CLHEP::MeV; 339 static const G4double sigmafactor = 334 static const G4double sigmafactor = 340 CLHEP::twopi*CLHEP::classic_electr_radius* 335 CLHEP::twopi*CLHEP::classic_electr_radius*CLHEP::classic_electr_radius; 341 static const G4double beta2lim = Tlim*(Tlim+ 336 static const G4double beta2lim = Tlim*(Tlim+2.*CLHEP::electron_mass_c2)/ 342 ((Tlim+CLHEP::electron_mass_c2)*(Tlim+CLHE 337 ((Tlim+CLHEP::electron_mass_c2)*(Tlim+CLHEP::electron_mass_c2)); 343 static const G4double bg2lim = Tlim*(Tlim+ 338 static const G4double bg2lim = Tlim*(Tlim+2.*CLHEP::electron_mass_c2)/ 344 (CLHEP::electron_mass_c2*CLHEP::electron_m 339 (CLHEP::electron_mass_c2*CLHEP::electron_mass_c2); 345 340 346 static const G4double sig0[15] = { 341 static const G4double sig0[15] = { 347 0.2672*CLHEP::barn, 0.5922*CLHEP::barn, 342 0.2672*CLHEP::barn, 0.5922*CLHEP::barn, 2.653*CLHEP::barn, 6.235*CLHEP::barn, 348 11.69*CLHEP::barn , 13.24*CLHEP::barn , 343 11.69*CLHEP::barn , 13.24*CLHEP::barn , 16.12*CLHEP::barn, 23.00*CLHEP::barn, 349 35.13*CLHEP::barn , 39.95*CLHEP::barn , 344 35.13*CLHEP::barn , 39.95*CLHEP::barn , 50.85*CLHEP::barn, 67.19*CLHEP::barn, 350 91.15*CLHEP::barn , 104.4*CLHEP::barn , 345 91.15*CLHEP::barn , 104.4*CLHEP::barn , 113.1*CLHEP::barn}; 351 346 352 static const G4double Tdat[22] = { 347 static const G4double Tdat[22] = { 353 100*CLHEP::eV, 200*CLHEP::eV, 400*CLHEP: 348 100*CLHEP::eV, 200*CLHEP::eV, 400*CLHEP::eV, 700*CLHEP::eV, 354 1*CLHEP::keV, 2*CLHEP::keV, 4*CLHEP::k 349 1*CLHEP::keV, 2*CLHEP::keV, 4*CLHEP::keV, 7*CLHEP::keV, 355 10*CLHEP::keV, 20*CLHEP::keV, 40*CLHEP:: 350 10*CLHEP::keV, 20*CLHEP::keV, 40*CLHEP::keV, 70*CLHEP::keV, 356 100*CLHEP::keV, 200*CLHEP::keV, 400*CLHEP: 351 100*CLHEP::keV, 200*CLHEP::keV, 400*CLHEP::keV, 700*CLHEP::keV, 357 1*CLHEP::MeV, 2*CLHEP::MeV, 4*CLHEP::M 352 1*CLHEP::MeV, 2*CLHEP::MeV, 4*CLHEP::MeV, 7*CLHEP::MeV, 358 10*CLHEP::MeV, 20*CLHEP::MeV}; 353 10*CLHEP::MeV, 20*CLHEP::MeV}; 359 354 360 if(eKineticEnergy <= Tlim) 355 if(eKineticEnergy <= Tlim) 361 { 356 { 362 // get bin number in T (beta2) 357 // get bin number in T (beta2) 363 G4int iT = 21; 358 G4int iT = 21; 364 // Loop checking, 03-Aug-2015, Vladimir Iv 359 // Loop checking, 03-Aug-2015, Vladimir Ivanchenko 365 while ((iT>=0)&&(Tdat[iT]>=eKineticEnergy) 360 while ((iT>=0)&&(Tdat[iT]>=eKineticEnergy)) iT -= 1; 366 << 361 if(iT==21) iT = 20; 367 iT = std::min(std::max(iT, 0), 20); << 362 if(iT==-1) iT = 0 ; 368 363 369 // calculate betasquare values 364 // calculate betasquare values 370 G4double T = Tdat[iT]; << 365 G4double T = Tdat[iT], E = T + electron_mass_c2; 371 G4double E = T + CLHEP::electron_mass_c2; << 366 G4double b2small = T*(E+electron_mass_c2)/(E*E); 372 G4double b2small = T*(E+CLHEP::electron_ma << 367 373 << 368 T = Tdat[iT+1]; E = T + electron_mass_c2; 374 T = Tdat[iT+1]; << 369 G4double b2big = T*(E+electron_mass_c2)/(E*E); 375 E = T + CLHEP::electron_mass_c2; << 376 G4double b2big = T*(E+CLHEP::electron_mass << 377 G4double ratb2 = (beta2-b2small)/(b2big-b2 370 G4double ratb2 = (beta2-b2small)/(b2big-b2small); 378 371 379 if (charge < 0.) 372 if (charge < 0.) 380 { 373 { 381 c1 = celectron[iZ][iT]; 374 c1 = celectron[iZ][iT]; 382 c2 = celectron[iZ+1][iT]; 375 c2 = celectron[iZ+1][iT]; 383 cc1 = c1+ratZ*(c2-c1); 376 cc1 = c1+ratZ*(c2-c1); 384 377 385 c1 = celectron[iZ][iT+1]; 378 c1 = celectron[iZ][iT+1]; 386 c2 = celectron[iZ+1][iT+1]; 379 c2 = celectron[iZ+1][iT+1]; >> 380 cc2 = c1+ratZ*(c2-c1); >> 381 >> 382 corr = cc1+ratb2*(cc2-cc1); >> 383 >> 384 sigma *= sigmafactor/corr; 387 } 385 } 388 else 386 else 389 { 387 { 390 c1 = cpositron[iZ][iT]; 388 c1 = cpositron[iZ][iT]; 391 c2 = cpositron[iZ+1][iT]; 389 c2 = cpositron[iZ+1][iT]; 392 cc1 = c1+ratZ*(c2-c1); 390 cc1 = c1+ratZ*(c2-c1); 393 391 394 c1 = cpositron[iZ][iT+1]; 392 c1 = cpositron[iZ][iT+1]; 395 c2 = cpositron[iZ+1][iT+1]; 393 c2 = cpositron[iZ+1][iT+1]; >> 394 cc2 = c1+ratZ*(c2-c1); >> 395 >> 396 corr = cc1+ratb2*(cc2-cc1); >> 397 >> 398 sigma *= sigmafactor/corr; 396 } 399 } 397 G4double cc2 = c1+ratZ*(c2-c1); << 398 sigma *= sigmafactor/(cc1+ratb2*(cc2-cc1)) << 399 } 400 } 400 else 401 else 401 { 402 { 402 c1 = bg2lim*sig0[iZ]*(1.+hecorr[iZ]*(beta2 403 c1 = bg2lim*sig0[iZ]*(1.+hecorr[iZ]*(beta2-beta2lim))/bg2; 403 c2 = bg2lim*sig0[iZ+1]*(1.+hecorr[iZ+1]*(b 404 c2 = bg2lim*sig0[iZ+1]*(1.+hecorr[iZ+1]*(beta2-beta2lim))/bg2; 404 if((atomicNumber >= ZZ1) && (atomicNumber << 405 if((AtomicNumber >= ZZ1) && (AtomicNumber <= ZZ2)) 405 sigma = c1+ratZ*(c2-c1) ; 406 sigma = c1+ratZ*(c2-c1) ; 406 else if(atomicNumber < ZZ1) << 407 else if(AtomicNumber < ZZ1) 407 sigma = atomicNumber*atomicNumber*c1/(ZZ << 408 sigma = AtomicNumber*AtomicNumber*c1/(ZZ1*ZZ1); 408 else if(atomicNumber > ZZ2) << 409 else if(AtomicNumber > ZZ2) 409 sigma = atomicNumber*atomicNumber*c2/(ZZ << 410 sigma = AtomicNumber*AtomicNumber*c2/(ZZ2*ZZ2); 410 } 411 } 411 // low energy correction based on theory << 412 sigma *= (1.+0.30/(1.+std::sqrt(1000.*eKinet << 413 << 414 return sigma; 412 return sigma; >> 413 415 } 414 } 416 415 417 //....oooOO0OOooo........oooOO0OOooo........oo 416 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 418 417 419 void G4UrbanMscModel::StartTracking(G4Track* t 418 void G4UrbanMscModel::StartTracking(G4Track* track) 420 { 419 { 421 SetParticle(track->GetDynamicParticle()->Get 420 SetParticle(track->GetDynamicParticle()->GetDefinition()); 422 firstStep = true; 421 firstStep = true; 423 insideskin = false; 422 insideskin = false; 424 fr = facrange; 423 fr = facrange; 425 tlimit = tgeom = rangeinit = geombig; << 424 tlimit = tgeom = rangeinit = rangecut = geombig; 426 smallstep = 1.e10; 425 smallstep = 1.e10; 427 stepmin = tlimitminfix; 426 stepmin = tlimitminfix; 428 tlimitmin = 10.*tlimitminfix; 427 tlimitmin = 10.*tlimitminfix; 429 rndmEngineMod = G4Random::getTheEngine(); 428 rndmEngineMod = G4Random::getTheEngine(); 430 } 429 } 431 430 432 //....oooOO0OOooo........oooOO0OOooo........oo 431 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 433 432 434 G4double G4UrbanMscModel::ComputeTruePathLengt 433 G4double G4UrbanMscModel::ComputeTruePathLengthLimit( 435 const G4Track& tr 434 const G4Track& track, 436 G4double& current 435 G4double& currentMinimalStep) 437 { 436 { 438 tPathLength = currentMinimalStep; 437 tPathLength = currentMinimalStep; 439 const G4DynamicParticle* dp = track.GetDynam 438 const G4DynamicParticle* dp = track.GetDynamicParticle(); 440 439 441 G4StepPoint* sp = track.GetStep()->GetPreSte 440 G4StepPoint* sp = track.GetStep()->GetPreStepPoint(); 442 G4StepStatus stepStatus = sp->GetStepStatus( 441 G4StepStatus stepStatus = sp->GetStepStatus(); 443 couple = track.GetMaterialCutsCouple(); 442 couple = track.GetMaterialCutsCouple(); 444 SetCurrentCouple(couple); 443 SetCurrentCouple(couple); 445 idx = couple->GetIndex(); << 444 currentMaterialIndex = couple->GetIndex(); 446 currentKinEnergy = dp->GetKineticEnergy(); 445 currentKinEnergy = dp->GetKineticEnergy(); 447 currentLogKinEnergy = dp->GetLogKineticEnerg << 446 currentRange = GetRange(particle,currentKinEnergy,couple); 448 currentRange = GetRange(particle,currentKinE << 447 lambda0 = GetTransportMeanFreePath(particle,currentKinEnergy); 449 lambda0 = GetTransportMeanFreePath(particle, << 448 tPathLength = min(tPathLength,currentRange); 450 << 449 /* 451 tPathLength = std::min(tPathLength,currentRa << 452 /* << 453 G4cout << "G4Urban::StepLimit tPathLength= " 450 G4cout << "G4Urban::StepLimit tPathLength= " << tPathLength 454 << " range= " <<currentRange<< " lambda= "<< 451 << " range= " <<currentRange<< " lambda= "<<lambda0 455 <<G4endl; 452 <<G4endl; 456 */ 453 */ 457 // extreme small step << 454 // set flag to default values 458 if(tPathLength < tlimitminfix) { << 455 Zeff = couple->GetMaterial()->GetIonisation()->GetZeffective(); 459 latDisplasment = false; << 456 // couple->GetMaterial()->GetTotNbOfAtomsPerVolume(); 460 return ConvertTrueToGeom(tPathLength, curr << 461 } << 462 457 463 presafety = (stepStatus == fGeomBoundary) ? << 458 if(Zold != Zeff) 464 : ComputeSafety(sp->GetPosition( << 459 UpdateCache(); 465 460 466 // stop here if small step or range is less << 461 // stop here if small step 467 if((tPathLength == currentRange && tPathLeng << 462 if(tPathLength < tlimitminfix) { 468 tPathLength < tlimitminfix) { << 469 latDisplasment = false; 463 latDisplasment = false; 470 return ConvertTrueToGeom(tPathLength, curr 464 return ConvertTrueToGeom(tPathLength, currentMinimalStep); 471 } 465 } 472 466 473 // upper limit for the straight line distanc 467 // upper limit for the straight line distance the particle can travel 474 // for electrons and positrons 468 // for electrons and positrons 475 G4double distance = (mass < masslimite) << 469 G4double distance = currentRange; 476 ? currentRange*msc[idx]->doverra << 470 // for muons, hadrons 477 // for muons, hadrons << 471 if(mass > masslimite) { 478 : currentRange*msc[idx]->doverrb; << 472 distance *= (1.15-9.76e-4*Zeff); 479 << 473 } else { >> 474 distance *= (1.20-Zeff*(1.62e-2-9.22e-5*Zeff)); >> 475 } >> 476 presafety = sp->GetSafety(); 480 /* 477 /* 481 G4cout << "G4Urban::StepLimit tPathLength= " 478 G4cout << "G4Urban::StepLimit tPathLength= " 482 <<tPathLength<<" safety= " << pres 479 <<tPathLength<<" safety= " << presafety 483 << " range= " <<currentRange<< " lam 480 << " range= " <<currentRange<< " lambda= "<<lambda0 484 << " Alg: " << steppingAlgorithm < 481 << " Alg: " << steppingAlgorithm <<G4endl; 485 */ 482 */ 486 // far from geometry boundary 483 // far from geometry boundary 487 if(distance < presafety) 484 if(distance < presafety) 488 { 485 { 489 latDisplasment = false; 486 latDisplasment = false; 490 return ConvertTrueToGeom(tPathLength, cu 487 return ConvertTrueToGeom(tPathLength, currentMinimalStep); 491 } 488 } 492 489 493 latDisplasment = latDisplasmentbackup; 490 latDisplasment = latDisplasmentbackup; 494 // ----------------------------------------- << 491 static const G4double invmev = 1.0/CLHEP::MeV; 495 // distance to boundary << 492 // standard version >> 493 // 496 if (steppingAlgorithm == fUseDistanceToBound 494 if (steppingAlgorithm == fUseDistanceToBoundary) 497 { 495 { 498 //compute geomlimit and presafety 496 //compute geomlimit and presafety 499 geomlimit = ComputeGeomLimit(track, pres 497 geomlimit = ComputeGeomLimit(track, presafety, currentRange); 500 /* 498 /* 501 G4cout << "G4Urban::Distance to bounda 499 G4cout << "G4Urban::Distance to boundary geomlimit= " 502 <<geomlimit<<" safety= " << presaf 500 <<geomlimit<<" safety= " << presafety<<G4endl; 503 */ 501 */ 504 502 >> 503 // is it far from boundary ? >> 504 if(distance < presafety) >> 505 { >> 506 latDisplasment = false; >> 507 return ConvertTrueToGeom(tPathLength, currentMinimalStep); >> 508 } >> 509 505 smallstep += 1.; 510 smallstep += 1.; 506 insideskin = false; 511 insideskin = false; 507 tgeom = geombig; << 508 512 509 // initialisation at first step and at t << 513 // initialisation at firs step and at the boundary 510 if(firstStep || (stepStatus == fGeomBoun 514 if(firstStep || (stepStatus == fGeomBoundary)) 511 { 515 { 512 rangeinit = currentRange; 516 rangeinit = currentRange; 513 if(!firstStep) { smallstep = 1.; } 517 if(!firstStep) { smallstep = 1.; } 514 518 >> 519 //define stepmin here (it depends on lambda!) >> 520 //rough estimation of lambda_elastic/lambda_transport >> 521 G4double rat = currentKinEnergy*invmev; >> 522 rat = 1.e-3/(rat*(10.+rat)) ; 515 //stepmin ~ lambda_elastic 523 //stepmin ~ lambda_elastic 516 stepmin = ComputeStepmin(); << 524 stepmin = rat*lambda0; 517 skindepth = skin*stepmin; 525 skindepth = skin*stepmin; 518 tlimitmin = ComputeTlimitmin(); << 526 tlimitmin = max(10*stepmin,tlimitminfix); 519 /* 527 /* 520 G4cout << "rangeinit= " << rangeinit 528 G4cout << "rangeinit= " << rangeinit << " stepmin= " << stepmin 521 << " tlimitmin= " << tlimitmi 529 << " tlimitmin= " << tlimitmin << " geomlimit= " 522 << geomlimit <<G4endl; 530 << geomlimit <<G4endl; 523 */ 531 */ 524 } << 532 // constraint from the geometry 525 // constraint from the geometry << 533 526 if((geomlimit < geombig) && (geomlimit > << 534 if((geomlimit < geombig) && (geomlimit > geommin)) 527 { << 535 { 528 // geomlimit is a geometrical step l << 536 // geomlimit is a geometrical step length 529 // transform it to true path length << 537 // transform it to true path length (estimation) 530 if(lambda0 > geomlimit) { << 538 if((1.-geomlimit/lambda0) > 0.) 531 geomlimit = -lambda0*G4Log(1.-geom << 539 geomlimit = -lambda0*G4Log(1.-geomlimit/lambda0)+tlimitmin ; 532 } << 540 533 tgeom = (stepStatus == fGeomBoundary << 541 if(stepStatus == fGeomBoundary) 534 : facrange*rangeinit + stepmin; << 542 tgeom = geomlimit/facgeom; >> 543 else >> 544 tgeom = 2.*geomlimit/facgeom; >> 545 } >> 546 else >> 547 tgeom = geombig; 535 } 548 } 536 549 537 //step limit 550 //step limit 538 tlimit = (currentRange > presafety) ? << 551 tlimit = facrange*rangeinit; 539 std::max(facrange*rangeinit, facsafety << 540 552 541 //lower limit for tlimit 553 //lower limit for tlimit 542 tlimit = std::min(std::max(tlimit,tlimit << 554 tlimit = max(tlimit,tlimitmin); >> 555 tlimit = min(tlimit,tgeom); 543 /* 556 /* 544 G4cout << "tgeom= " << tgeom << " geomli 557 G4cout << "tgeom= " << tgeom << " geomlimit= " << geomlimit 545 << " tlimit= " << tlimit << " pres 558 << " tlimit= " << tlimit << " presafety= " << presafety << G4endl; 546 */ 559 */ 547 // shortcut 560 // shortcut 548 if((tPathLength < tlimit) && (tPathLengt 561 if((tPathLength < tlimit) && (tPathLength < presafety) && 549 (smallstep > skin) && (tPathLength < 562 (smallstep > skin) && (tPathLength < geomlimit-0.999*skindepth)) 550 { 563 { 551 return ConvertTrueToGeom(tPathLength, 564 return ConvertTrueToGeom(tPathLength, currentMinimalStep); 552 } 565 } 553 566 554 // step reduction near to boundary 567 // step reduction near to boundary 555 if(smallstep <= skin) 568 if(smallstep <= skin) 556 { 569 { 557 tlimit = stepmin; 570 tlimit = stepmin; 558 insideskin = true; 571 insideskin = true; 559 } 572 } 560 else if(geomlimit < geombig) 573 else if(geomlimit < geombig) 561 { 574 { 562 if(geomlimit > skindepth) 575 if(geomlimit > skindepth) 563 { 576 { 564 tlimit = std::min(tlimit, geomli << 577 tlimit = min(tlimit, geomlimit-0.999*skindepth); 565 } 578 } 566 else 579 else 567 { 580 { 568 insideskin = true; 581 insideskin = true; 569 tlimit = std::min(tlimit, stepmi << 582 tlimit = min(tlimit, stepmin); 570 } 583 } 571 } 584 } 572 585 573 tlimit = std::max(tlimit, stepmin); << 586 tlimit = max(tlimit, stepmin); 574 587 575 // randomise if not 'small' step and ste 588 // randomise if not 'small' step and step determined by msc 576 tPathLength = (tlimit < tPathLength && s << 589 if((tlimit < tPathLength) && (smallstep > skin) && !insideskin) 577 ? std::min(tPathLength, Randomizetlimi << 590 { 578 : std::min(tPathLength, tlimit); << 591 tPathLength = min(tPathLength, Randomizetlimit()); 579 } << 592 } 580 // ----------------------------------------- << 593 else 581 // for simulation with or without magnetic f << 594 { 582 // there no small step/single scattering at << 595 tPathLength = min(tPathLength, tlimit); >> 596 } >> 597 >> 598 } >> 599 // for 'normal' simulation with or without magnetic field >> 600 // there no small step/single scattering at boundaries 583 else if(steppingAlgorithm == fUseSafety) 601 else if(steppingAlgorithm == fUseSafety) 584 { 602 { >> 603 if(stepStatus != fGeomBoundary) { >> 604 presafety = ComputeSafety(sp->GetPosition(),tPathLength); >> 605 } >> 606 /* >> 607 G4cout << "presafety= " << presafety >> 608 << " firstStep= " << firstStep >> 609 << " stepStatus= " << stepStatus >> 610 << G4endl; >> 611 */ >> 612 // is far from boundary >> 613 if(distance < presafety) >> 614 { >> 615 latDisplasment = false; >> 616 return ConvertTrueToGeom(tPathLength, currentMinimalStep); >> 617 } >> 618 585 if(firstStep || (stepStatus == fGeomBoun 619 if(firstStep || (stepStatus == fGeomBoundary)) { 586 rangeinit = currentRange; 620 rangeinit = currentRange; 587 fr = facrange; 621 fr = facrange; 588 // stepping for e+/e- only (not for mu << 622 // 9.1 like stepping for e+/e- only (not for muons,hadrons) 589 if(mass < masslimite) 623 if(mass < masslimite) 590 { 624 { 591 rangeinit = std::max(rangeinit, la << 625 rangeinit = max(rangeinit, lambda0); 592 if(lambda0 > lambdalimit) { 626 if(lambda0 > lambdalimit) { 593 fr *= (0.75+0.25*lambda0/lambdal 627 fr *= (0.75+0.25*lambda0/lambdalimit); 594 } 628 } 595 } 629 } 596 //lower limit for tlimit 630 //lower limit for tlimit 597 stepmin = ComputeStepmin(); << 631 G4double rat = currentKinEnergy*invmev; 598 tlimitmin = ComputeTlimitmin(); << 632 rat = 1.e-3/(rat*(10 + rat)) ; >> 633 stepmin = lambda0*rat; >> 634 tlimitmin = max(10*stepmin, tlimitminfix); 599 } 635 } 600 636 601 //step limit 637 //step limit 602 tlimit = (currentRange > presafety) ? << 638 tlimit = max(fr*rangeinit, facsafety*presafety); 603 std::max(fr*rangeinit, facsafety*presa << 604 639 605 //lower limit for tlimit 640 //lower limit for tlimit 606 tlimit = std::max(tlimit, tlimitmin); << 641 tlimit = max(tlimit, tlimitmin); 607 642 608 // randomise if step determined by msc 643 // randomise if step determined by msc 609 tPathLength = (tlimit < tPathLength) ? << 644 if(tlimit < tPathLength) 610 std::min(tPathLength, Randomizetlimit( << 645 { >> 646 tPathLength = min(tPathLength, Randomizetlimit()); >> 647 } >> 648 else { tPathLength = min(tPathLength, tlimit); } 611 } 649 } 612 // ----------------------------------------- << 650 // new stepping mode UseSafetyPlus 613 // for simulation with or without magnetic f << 614 // there is small step/single scattering at << 615 else if(steppingAlgorithm == fUseSafetyPlus) 651 else if(steppingAlgorithm == fUseSafetyPlus) 616 { 652 { >> 653 if(stepStatus != fGeomBoundary) { >> 654 presafety = ComputeSafety(sp->GetPosition(),tPathLength); >> 655 } >> 656 /* >> 657 G4cout << "presafety= " << presafety >> 658 << " firstStep= " << firstStep >> 659 << " stepStatus= " << stepStatus >> 660 << G4endl; >> 661 */ >> 662 // is far from boundary >> 663 if(distance < presafety) >> 664 { >> 665 latDisplasment = false; >> 666 return ConvertTrueToGeom(tPathLength, currentMinimalStep); >> 667 } >> 668 617 if(firstStep || (stepStatus == fGeomBoun 669 if(firstStep || (stepStatus == fGeomBoundary)) { 618 rangeinit = currentRange; 670 rangeinit = currentRange; 619 fr = facrange; 671 fr = facrange; >> 672 rangecut = geombig; 620 if(mass < masslimite) 673 if(mass < masslimite) 621 { 674 { >> 675 G4int index = 1; >> 676 if(charge > 0.) index = 2; >> 677 rangecut = couple->GetProductionCuts()->GetProductionCut(index); 622 if(lambda0 > lambdalimit) { 678 if(lambda0 > lambdalimit) { 623 fr *= (0.84+0.16*lambda0/lambdal 679 fr *= (0.84+0.16*lambda0/lambdalimit); 624 } 680 } 625 } 681 } 626 //lower limit for tlimit 682 //lower limit for tlimit 627 stepmin = ComputeStepmin(); << 683 G4double rat = currentKinEnergy*invmev; 628 tlimitmin = ComputeTlimitmin(); << 684 rat = 1.e-3/(rat*(10 + rat)) ; >> 685 stepmin = lambda0*rat; >> 686 tlimitmin = max(10*stepmin, tlimitminfix); 629 } 687 } 630 //step limit 688 //step limit 631 tlimit = (currentRange > presafety) ? << 689 tlimit = max(fr*rangeinit, facsafety*presafety); 632 std::max(fr*rangeinit, facsafety*presafety) << 633 690 634 //lower limit for tlimit 691 //lower limit for tlimit 635 tlimit = std::max(tlimit, tlimitmin); << 692 tlimit = max(tlimit, tlimitmin); 636 693 637 // condition for tPathLength from drr an 694 // condition for tPathLength from drr and finalr 638 if(currentRange > finalr) { 695 if(currentRange > finalr) { 639 G4double tmax = drr*currentRange+ 696 G4double tmax = drr*currentRange+ 640 finalr*(1.-drr)*(2.-fi 697 finalr*(1.-drr)*(2.-finalr/currentRange); 641 tPathLength = std::min(tPathLength,tma << 698 tPathLength = min(tPathLength,tmax); >> 699 } >> 700 >> 701 // condition safety >> 702 if(currentRange > rangecut) { >> 703 if(firstStep) { >> 704 tPathLength = min(tPathLength,facsafety*presafety); >> 705 } else if(stepStatus != fGeomBoundary && presafety > stepmin) { >> 706 tPathLength = min(tPathLength,presafety); >> 707 } 642 } 708 } 643 709 644 // randomise if step determined by msc 710 // randomise if step determined by msc 645 tPathLength = (tlimit < tPathLength) ? << 711 if(tPathLength < tlimit) 646 std::min(tPathLength, Randomizetlimit( << 712 { >> 713 tPathLength = min(tPathLength, Randomizetlimit()); >> 714 } >> 715 else { tPathLength = min(tPathLength, tlimit); } 647 } 716 } 648 717 649 // ----------------------------------------- << 718 // version similar to 7.1 (needed for some experiments) 650 // simple step limitation << 651 else 719 else 652 { 720 { 653 if (stepStatus == fGeomBoundary) 721 if (stepStatus == fGeomBoundary) 654 { 722 { 655 tlimit = (currentRange > lambda0) << 723 if (currentRange > lambda0) { tlimit = facrange*currentRange; } 656 ? facrange*currentRange : facrange*lambd << 724 else { tlimit = facrange*lambda0; } 657 tlimit = std::max(tlimit, tlimitmin) << 725 >> 726 tlimit = max(tlimit, tlimitmin); 658 } 727 } 659 // randomise if step determined by msc 728 // randomise if step determined by msc 660 tPathLength = (tlimit < tPathLength) ? << 729 if(tlimit < tPathLength) 661 std::min(tPathLength, Randomizetlimit( << 730 { >> 731 tPathLength = min(tPathLength, Randomizetlimit()); >> 732 } >> 733 else { tPathLength = min(tPathLength, tlimit); } 662 } 734 } 663 << 664 // ----------------------------------------- << 665 firstStep = false; 735 firstStep = false; 666 return ConvertTrueToGeom(tPathLength, curren 736 return ConvertTrueToGeom(tPathLength, currentMinimalStep); 667 } 737 } 668 738 669 //....oooOO0OOooo........oooOO0OOooo........oo 739 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 670 740 671 G4double G4UrbanMscModel::ComputeGeomPathLengt 741 G4double G4UrbanMscModel::ComputeGeomPathLength(G4double) 672 { 742 { 673 lambdaeff = lambda0; 743 lambdaeff = lambda0; 674 par1 = -1. ; 744 par1 = -1. ; 675 par2 = par3 = 0. ; 745 par2 = par3 = 0. ; 676 746 677 // this correction needed to run MSC with eI 747 // this correction needed to run MSC with eIoni and eBrem inactivated 678 // and makes no harm for a normal run 748 // and makes no harm for a normal run 679 tPathLength = std::min(tPathLength,currentRa 749 tPathLength = std::min(tPathLength,currentRange); 680 750 681 // do the true -> geom transformation 751 // do the true -> geom transformation 682 zPathLength = tPathLength; 752 zPathLength = tPathLength; 683 753 684 // z = t for very small tPathLength 754 // z = t for very small tPathLength 685 if(tPathLength < tlimitminfix2) return zPath 755 if(tPathLength < tlimitminfix2) return zPathLength; 686 756 >> 757 // VI: it is already checked >> 758 // if(tPathLength > currentRange) >> 759 // tPathLength = currentRange ; 687 /* 760 /* 688 G4cout << "ComputeGeomPathLength: tpl= " << 761 G4cout << "ComputeGeomPathLength: tpl= " << tPathLength 689 << " R= " << currentRange << " L0= " 762 << " R= " << currentRange << " L0= " << lambda0 690 << " E= " << currentKinEnergy << " " 763 << " E= " << currentKinEnergy << " " 691 << particle->GetParticleName() << G4e 764 << particle->GetParticleName() << G4endl; 692 */ 765 */ 693 G4double tau = tPathLength/lambda0 ; 766 G4double tau = tPathLength/lambda0 ; 694 767 695 if ((tau <= tausmall) || insideskin) { 768 if ((tau <= tausmall) || insideskin) { 696 zPathLength = std::min(tPathLength, lambda << 769 zPathLength = min(tPathLength, lambda0); 697 770 698 } else if (tPathLength < currentRange*dtrl) << 771 } else if (tPathLength < currentRange*dtrl) { 699 zPathLength = (tau < taulim) ? tPathLength << 772 if(tau < taulim) zPathLength = tPathLength*(1.-0.5*tau) ; 700 : lambda0*(1.-G4Exp(-tau)); << 773 else zPathLength = lambda0*(1.-G4Exp(-tau)); 701 774 702 } else if(currentKinEnergy < mass || tPathLe 775 } else if(currentKinEnergy < mass || tPathLength == currentRange) { 703 par1 = 1./currentRange; << 776 par1 = 1./currentRange ; 704 par2 = currentRange/lambda0; << 777 par2 = 1./(par1*lambda0) ; 705 par3 = 1.+par2; << 778 par3 = 1.+par2 ; 706 if(tPathLength < currentRange) { 779 if(tPathLength < currentRange) { 707 zPathLength = 780 zPathLength = 708 (1.-G4Exp(par3*G4Log(1.-tPathLength/cu 781 (1.-G4Exp(par3*G4Log(1.-tPathLength/currentRange)))/(par1*par3); 709 } else { 782 } else { 710 zPathLength = 1./(par1*par3); 783 zPathLength = 1./(par1*par3); 711 } 784 } 712 785 713 } else { 786 } else { 714 G4double rfin = std::max(currentRange-tPat << 787 G4double rfin = max(currentRange-tPathLength, 0.01*currentRange); 715 G4double T1 = GetEnergy(particle,rfin,coup 788 G4double T1 = GetEnergy(particle,rfin,couple); 716 G4double lambda1 = GetTransportMeanFreePat 789 G4double lambda1 = GetTransportMeanFreePath(particle,T1); 717 790 718 par1 = (lambda0-lambda1)/(lambda0*tPathLen 791 par1 = (lambda0-lambda1)/(lambda0*tPathLength); 719 //G4cout << "par1= " << par1 << " L1= " << 792 //G4cout << "par1= " << par1 << " L1= " << lambda1 << G4endl; 720 par2 = 1./(par1*lambda0); 793 par2 = 1./(par1*lambda0); 721 par3 = 1.+par2; << 794 par3 = 1.+par2 ; 722 zPathLength = (1.-G4Exp(par3*G4Log(lambda1 795 zPathLength = (1.-G4Exp(par3*G4Log(lambda1/lambda0)))/(par1*par3); 723 } 796 } 724 797 725 zPathLength = std::min(zPathLength, lambda0) << 798 zPathLength = min(zPathLength, lambda0); 726 //G4cout<< "zPathLength= "<< zPathLength<< " 799 //G4cout<< "zPathLength= "<< zPathLength<< " L0= " << lambda0 << G4endl; 727 return zPathLength; 800 return zPathLength; 728 } 801 } 729 802 730 //....oooOO0OOooo........oooOO0OOooo........oo 803 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 731 804 732 G4double G4UrbanMscModel::ComputeTrueStepLengt 805 G4double G4UrbanMscModel::ComputeTrueStepLength(G4double geomStepLength) 733 { 806 { 734 // step defined other than transportation 807 // step defined other than transportation 735 if(geomStepLength == zPathLength) { 808 if(geomStepLength == zPathLength) { 736 //G4cout << "Urban::ComputeTrueLength: tPa 809 //G4cout << "Urban::ComputeTrueLength: tPathLength= " << tPathLength 737 // << " step= " << geomStepLengt 810 // << " step= " << geomStepLength << " *** " << G4endl; 738 return tPathLength; 811 return tPathLength; 739 } 812 } 740 813 741 zPathLength = geomStepLength; 814 zPathLength = geomStepLength; 742 815 743 // t = z for very small step 816 // t = z for very small step 744 if(geomStepLength < tlimitminfix2) { 817 if(geomStepLength < tlimitminfix2) { 745 tPathLength = geomStepLength; 818 tPathLength = geomStepLength; 746 819 747 // recalculation 820 // recalculation 748 } else { 821 } else { 749 822 750 G4double tlength = geomStepLength; 823 G4double tlength = geomStepLength; 751 if((geomStepLength > lambda0*tausmall) && 824 if((geomStepLength > lambda0*tausmall) && !insideskin) { 752 825 753 if(par1 < 0.) { 826 if(par1 < 0.) { 754 tlength = -lambda0*G4Log(1.-geomStepLe 827 tlength = -lambda0*G4Log(1.-geomStepLength/lambda0) ; 755 } else { 828 } else { 756 const G4double par4 = par1*par3; << 829 if(par1*par3*geomStepLength < 1.) { 757 if(par4*geomStepLength < 1.) { << 830 tlength = (1.-G4Exp(G4Log(1.-par1*par3*geomStepLength)/par3))/par1 ; 758 tlength = (1.-G4Exp(G4Log(1.-par4*ge << 759 } else { 831 } else { 760 tlength = currentRange; 832 tlength = currentRange; 761 } 833 } 762 } 834 } 763 835 764 if(tlength < geomStepLength) { tlength 836 if(tlength < geomStepLength) { tlength = geomStepLength; } 765 else if(tlength > tPathLength) { tlength 837 else if(tlength > tPathLength) { tlength = tPathLength; } 766 } 838 } 767 tPathLength = tlength; 839 tPathLength = tlength; 768 } 840 } 769 //G4cout << "Urban::ComputeTrueLength: tPath 841 //G4cout << "Urban::ComputeTrueLength: tPathLength= " << tPathLength 770 // << " step= " << geomStepLength << 842 // << " step= " << geomStepLength << " &&& " << G4endl; 771 843 772 return tPathLength; 844 return tPathLength; 773 } 845 } 774 846 775 //....oooOO0OOooo........oooOO0OOooo........oo 847 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 776 848 777 G4ThreeVector& 849 G4ThreeVector& 778 G4UrbanMscModel::SampleScattering(const G4Thre 850 G4UrbanMscModel::SampleScattering(const G4ThreeVector& oldDirection, 779 G4double /*s 851 G4double /*safety*/) 780 { 852 { 781 fDisplacement.set(0.0,0.0,0.0); 853 fDisplacement.set(0.0,0.0,0.0); 782 if(tPathLength >= currentRange) { return fDi << 854 G4double kineticEnergy = currentKinEnergy; 783 << 784 G4double kinEnergy = currentKinEnergy; << 785 if (tPathLength > currentRange*dtrl) { 855 if (tPathLength > currentRange*dtrl) { 786 kinEnergy = GetEnergy(particle,currentRang << 856 kineticEnergy = GetEnergy(particle,currentRange-tPathLength,couple); 787 } else if(tPathLength > currentRange*0.01) { << 857 } else { 788 kinEnergy -= tPathLength*GetDEDX(particle, << 858 kineticEnergy -= tPathLength*GetDEDX(particle,currentKinEnergy,couple); 789 currentLo << 790 } 859 } 791 860 792 if((tPathLength <= tlimitminfix) || (tPathLe << 861 if((kineticEnergy <= eV) || (tPathLength <= tlimitminfix) || 793 (kinEnergy <= CLHEP::eV)) { return fDispl << 862 (tPathLength < tausmall*lambda0)) { return fDisplacement; } 794 863 795 G4double cth = SampleCosineTheta(tPathLength << 864 G4double cth = SampleCosineTheta(tPathLength,kineticEnergy); 796 865 797 // protection against 'bad' cth values 866 // protection against 'bad' cth values 798 if(std::abs(cth) >= 1.0) { return fDisplacem 867 if(std::abs(cth) >= 1.0) { return fDisplacement; } 799 868 800 G4double sth = std::sqrt((1.0 - cth)*(1.0 + << 869 /* 801 G4double phi = CLHEP::twopi*rndmEngineMod->f << 870 if(cth < 1.0 - 1000*tPathLength/lambda0 && cth < 0.5 && 802 G4ThreeVector newDirection(sth*std::cos(phi) << 871 kineticEnergy > 20*MeV) { >> 872 G4cout << "### G4UrbanMscModel::SampleScattering for " >> 873 << particle->GetParticleName() >> 874 << " E(MeV)= " << kineticEnergy/MeV >> 875 << " Step(mm)= " << tPathLength/mm >> 876 << " in " << CurrentCouple()->GetMaterial()->GetName() >> 877 << " CosTheta= " << cth << G4endl; >> 878 } >> 879 */ >> 880 G4double sth = sqrt((1.0 - cth)*(1.0 + cth)); >> 881 G4double phi = twopi*rndmEngineMod->flat(); >> 882 G4double dirx = sth*cos(phi); >> 883 G4double diry = sth*sin(phi); >> 884 >> 885 G4ThreeVector newDirection(dirx,diry,cth); 803 newDirection.rotateUz(oldDirection); 886 newDirection.rotateUz(oldDirection); 804 887 805 fParticleChange->ProposeMomentumDirection(ne 888 fParticleChange->ProposeMomentumDirection(newDirection); 806 /* 889 /* 807 G4cout << "G4UrbanMscModel::SampleSecondarie 890 G4cout << "G4UrbanMscModel::SampleSecondaries: e(MeV)= " << kineticEnergy 808 << " sinTheta= " << sth << " safety(m 891 << " sinTheta= " << sth << " safety(mm)= " << safety 809 << " trueStep(mm)= " << tPathLength 892 << " trueStep(mm)= " << tPathLength 810 << " geomStep(mm)= " << zPathLength 893 << " geomStep(mm)= " << zPathLength 811 << G4endl; 894 << G4endl; 812 */ 895 */ 813 896 814 if (latDisplasment && currentTau >= tausmall 897 if (latDisplasment && currentTau >= tausmall) { 815 if(dispAlg96) { SampleDisplacement(sth, ph 898 if(dispAlg96) { SampleDisplacement(sth, phi); } 816 else { SampleDisplacementNew(cth, 899 else { SampleDisplacementNew(cth, phi); } 817 fDisplacement.rotateUz(oldDirection); 900 fDisplacement.rotateUz(oldDirection); 818 } 901 } 819 return fDisplacement; 902 return fDisplacement; 820 } 903 } 821 904 822 //....oooOO0OOooo........oooOO0OOooo........oo 905 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 823 906 824 G4double G4UrbanMscModel::SampleCosineTheta(G4 907 G4double G4UrbanMscModel::SampleCosineTheta(G4double trueStepLength, 825 G4 << 908 G4double KineticEnergy) 826 { 909 { 827 G4double cth = 1.0; << 910 G4double cth = 1. ; 828 G4double tau = trueStepLength/lambda0; 911 G4double tau = trueStepLength/lambda0; >> 912 currentTau = tau; >> 913 lambdaeff = lambda0; 829 914 830 // mean tau value << 915 G4double lambda1 = GetTransportMeanFreePath(particle,KineticEnergy); 831 if(currentKinEnergy != kinEnergy) { << 916 if(std::abs(lambda1 - lambda0) > lambda0*0.01 && lambda1 > 0.) 832 G4double lambda1 = GetTransportMeanFreePat << 917 { 833 if(std::abs(lambda1 - lambda0) > lambda0*0 << 918 // mean tau value 834 tau = trueStepLength*G4Log(lambda0/lambd << 919 tau = trueStepLength*G4Log(lambda0/lambda1)/(lambda0-lambda1); 835 } << 836 } 920 } 837 921 838 currentTau = tau; << 922 currentTau = tau ; 839 lambdaeff = trueStepLength/currentTau; 923 lambdaeff = trueStepLength/currentTau; 840 currentRadLength = couple->GetMaterial()->Ge 924 currentRadLength = couple->GetMaterial()->GetRadlen(); 841 925 842 if (tau >= taubig) { cth = -1.+2.*rndmEngine 926 if (tau >= taubig) { cth = -1.+2.*rndmEngineMod->flat(); } 843 else if (tau >= tausmall) { 927 else if (tau >= tausmall) { 844 static const G4double numlim = 0.01; 928 static const G4double numlim = 0.01; 845 static const G4double onethird = 1./3.; << 929 G4double xmeanth, x2meanth; 846 if(tau < numlim) { 930 if(tau < numlim) { 847 xmeanth = 1.0 - tau*(1.0 - 0.5*tau); 931 xmeanth = 1.0 - tau*(1.0 - 0.5*tau); 848 x2meanth= 1.0 - tau*(5.0 - 6.25*tau)*one << 932 x2meanth= 1.0 - tau*(5.0 - 6.25*tau)/3.; 849 } else { 933 } else { 850 xmeanth = G4Exp(-tau); 934 xmeanth = G4Exp(-tau); 851 x2meanth = (1.+2.*G4Exp(-2.5*tau))*oneth << 935 x2meanth = (1.+2.*G4Exp(-2.5*tau))/3.; 852 } 936 } 853 937 854 // too large step of low-energy particle 938 // too large step of low-energy particle 855 G4double relloss = 1. - kinEnergy/currentK << 939 G4double relloss = 1. - KineticEnergy/currentKinEnergy; 856 static const G4double rellossmax= 0.50; 940 static const G4double rellossmax= 0.50; 857 if(relloss > rellossmax) { 941 if(relloss > rellossmax) { 858 return SimpleScattering(); << 942 return SimpleScattering(xmeanth,x2meanth); 859 } 943 } 860 // is step extreme small ? 944 // is step extreme small ? 861 G4bool extremesmallstep = false; << 945 G4bool extremesmallstep = false ; 862 G4double tsmall = std::min(tlimitmin,lambd 946 G4double tsmall = std::min(tlimitmin,lambdalimit); 863 << 947 G4double theta0 = 0.; 864 G4double theta0; << 865 if(trueStepLength > tsmall) { 948 if(trueStepLength > tsmall) { 866 theta0 = ComputeTheta0(trueStepLength,ki << 949 theta0 = ComputeTheta0(trueStepLength,KineticEnergy); 867 } else { 950 } else { 868 theta0 = std::sqrt(trueStepLength/tsmall << 951 theta0 = sqrt(trueStepLength/tsmall)*ComputeTheta0(tsmall,KineticEnergy); 869 *ComputeTheta0(tsmall,kinEnergy); << 952 extremesmallstep = true ; 870 extremesmallstep = true; << 871 } 953 } 872 954 873 static const G4double onesixth = 1./6.; << 955 static const G4double theta0max = CLHEP::pi/6.; 874 static const G4double one12th = 1./12.; << 956 //G4cout << "Theta0= " << theta0 << " theta0max= " << theta0max 875 static const G4double theta0max = CLHEP::p << 957 // << " sqrt(tausmall)= " << sqrt(tausmall) << G4endl; 876 958 877 // protection for very small angles 959 // protection for very small angles 878 G4double theta2 = theta0*theta0; 960 G4double theta2 = theta0*theta0; 879 961 880 if(theta2 < tausmall) { return cth; } 962 if(theta2 < tausmall) { return cth; } 881 if(theta0 > theta0max) { return SimpleScat << 963 >> 964 if(theta0 > theta0max) { >> 965 return SimpleScattering(xmeanth,x2meanth); >> 966 } 882 967 883 G4double x = theta2*(1.0 - theta2*one12th) << 968 G4double x = theta2*(1.0 - theta2/12.); 884 if(theta2 > numlim) { 969 if(theta2 > numlim) { 885 G4double sth = 2*std::sin(0.5*theta0); << 970 G4double sth = 2*sin(0.5*theta0); 886 x = sth*sth; 971 x = sth*sth; 887 } 972 } 888 973 889 // parameter for tail 974 // parameter for tail 890 G4double ltau = G4Log(tau); << 975 G4double ltau= G4Log(tau); 891 G4double u = !extremesmallstep ? G4Exp(lta << 976 G4double u = G4Exp(ltau/6.); 892 : G4Exp(G4Log(tsmall/lambda0)*onesixth); << 977 if(extremesmallstep) { u = G4Exp(G4Log(tsmall/lambda0)/6.); } 893 << 894 G4double xx = G4Log(lambdaeff/currentRadL 978 G4double xx = G4Log(lambdaeff/currentRadLength); 895 G4double xsi = msc[idx]->coeffc1 + << 979 G4double xsi = coeffc1+u*(coeffc2+coeffc3*u)+coeffc4*xx; 896 u*(msc[idx]->coeffc2+msc[idx]->coeffc3*u << 897 980 898 // tail should not be too big 981 // tail should not be too big 899 xsi = std::max(xsi, 1.9); << 982 if(xsi < 1.9) { 900 /* 983 /* 901 if(KineticEnergy > 20*MeV && xsi < 1.6) 984 if(KineticEnergy > 20*MeV && xsi < 1.6) { 902 G4cout << "G4UrbanMscModel::SampleCosi 985 G4cout << "G4UrbanMscModel::SampleCosineTheta: E(GeV)= " 903 << KineticEnergy/GeV 986 << KineticEnergy/GeV 904 << " !!** c= " << xsi 987 << " !!** c= " << xsi 905 << " **!! length(mm)= " << true 988 << " **!! length(mm)= " << trueStepLength << " Zeff= " << Zeff 906 << " " << couple->GetMaterial() 989 << " " << couple->GetMaterial()->GetName() 907 << " tau= " << tau << G4endl; 990 << " tau= " << tau << G4endl; 908 } 991 } 909 */ 992 */ >> 993 xsi = 1.9; >> 994 } 910 995 911 G4double c = xsi; 996 G4double c = xsi; 912 997 913 if(std::abs(c-3.) < 0.001) { c = 3.00 998 if(std::abs(c-3.) < 0.001) { c = 3.001; } 914 else if(std::abs(c-2.) < 0.001) { c = 2.00 999 else if(std::abs(c-2.) < 0.001) { c = 2.001; } 915 1000 916 G4double c1 = c-1.; 1001 G4double c1 = c-1.; >> 1002 917 G4double ea = G4Exp(-xsi); 1003 G4double ea = G4Exp(-xsi); 918 G4double eaa = 1.-ea ; 1004 G4double eaa = 1.-ea ; 919 G4double xmean1 = 1.-(1.-(1.+xsi)*ea)*x/ea 1005 G4double xmean1 = 1.-(1.-(1.+xsi)*ea)*x/eaa; 920 G4double x0 = 1. - xsi*x; 1006 G4double x0 = 1. - xsi*x; 921 1007 922 // G4cout << " xmean1= " << xmean1 << " x 1008 // G4cout << " xmean1= " << xmean1 << " xmeanth= " << xmeanth << G4endl; 923 1009 924 if(xmean1 <= 0.999*xmeanth) { return Simpl << 1010 if(xmean1 <= 0.999*xmeanth) { 925 << 1011 return SimpleScattering(xmeanth,x2meanth); >> 1012 } 926 //from continuity of derivatives 1013 //from continuity of derivatives 927 G4double b = 1.+(c-xsi)*x; 1014 G4double b = 1.+(c-xsi)*x; 928 1015 929 G4double b1 = b+1.; 1016 G4double b1 = b+1.; 930 G4double bx = c*x; 1017 G4double bx = c*x; 931 1018 932 G4double eb1 = G4Exp(G4Log(b1)*c1); 1019 G4double eb1 = G4Exp(G4Log(b1)*c1); 933 G4double ebx = G4Exp(G4Log(bx)*c1); 1020 G4double ebx = G4Exp(G4Log(bx)*c1); 934 G4double d = ebx/eb1; 1021 G4double d = ebx/eb1; 935 1022 936 G4double xmean2 = (x0 + d - (bx - b1*d)/(c 1023 G4double xmean2 = (x0 + d - (bx - b1*d)/(c-2.))/(1. - d); 937 1024 938 G4double f1x0 = ea/eaa; 1025 G4double f1x0 = ea/eaa; 939 G4double f2x0 = c1/(c*(1. - d)); 1026 G4double f2x0 = c1/(c*(1. - d)); 940 G4double prob = f2x0/(f1x0+f2x0); 1027 G4double prob = f2x0/(f1x0+f2x0); 941 1028 942 G4double qprob = xmeanth/(prob*xmean1+(1.- 1029 G4double qprob = xmeanth/(prob*xmean1+(1.-prob)*xmean2); 943 1030 944 // sampling of costheta 1031 // sampling of costheta 945 //G4cout << "c= " << c << " qprob= " << qp 1032 //G4cout << "c= " << c << " qprob= " << qprob << " eb1= " << eb1 946 // << " c1= " << c1 << " b1= " << b1 << " 1033 // << " c1= " << c1 << " b1= " << b1 << " bx= " << bx << " eb1= " << eb1 947 // << G4endl; 1034 // << G4endl; 948 rndmEngineMod->flatArray(2, rndmarray); << 1035 if(rndmEngineMod->flat() < qprob) 949 if(rndmarray[0] < qprob) << 950 { 1036 { 951 G4double var = 0; 1037 G4double var = 0; 952 if(rndmarray[1] < prob) { << 1038 if(rndmEngineMod->flat() < prob) { 953 cth = 1.+G4Log(ea+rndmEngineMod->flat( 1039 cth = 1.+G4Log(ea+rndmEngineMod->flat()*eaa)*x; 954 } else { 1040 } else { 955 var = (1.0 - d)*rndmEngineMod->flat(); 1041 var = (1.0 - d)*rndmEngineMod->flat(); 956 if(var < numlim*d) { 1042 if(var < numlim*d) { 957 var /= (d*c1); 1043 var /= (d*c1); 958 cth = -1.0 + var*(1.0 - 0.5*var*c)*( 1044 cth = -1.0 + var*(1.0 - 0.5*var*c)*(2. + (c - xsi)*x); 959 } else { 1045 } else { 960 cth = 1. + x*(c - xsi - c*G4Exp(-G4L 1046 cth = 1. + x*(c - xsi - c*G4Exp(-G4Log(var + d)/c1)); 961 } 1047 } 962 } 1048 } 963 } else { << 1049 /* 964 cth = -1.+2.*rndmarray[1]; << 1050 if(KineticEnergy > 5*GeV && cth < 0.9) { >> 1051 G4cout << "G4UrbanMscModel::SampleCosineTheta: E(GeV)= " >> 1052 << KineticEnergy/GeV >> 1053 << " 1-cosT= " << 1 - cth >> 1054 << " length(mm)= " << trueStepLength << " Zeff= " << Zeff >> 1055 << " tau= " << tau >> 1056 << " prob= " << prob << " var= " << var << G4endl; >> 1057 G4cout << " c= " << c << " qprob= " << qprob << " eb1= " << eb1 >> 1058 << " ebx= " << ebx >> 1059 << " c1= " << c1 << " b= " << b << " b1= " << b1 >> 1060 << " bx= " << bx << " d= " << d >> 1061 << " ea= " << ea << " eaa= " << eaa << G4endl; >> 1062 } >> 1063 */ >> 1064 } >> 1065 else { >> 1066 cth = -1.+2.*rndmEngineMod->flat(); >> 1067 /* >> 1068 if(KineticEnergy > 5*GeV) { >> 1069 G4cout << "G4UrbanMscModel::SampleCosineTheta: E(GeV)= " >> 1070 << KineticEnergy/GeV >> 1071 << " length(mm)= " << trueStepLength << " Zeff= " << Zeff >> 1072 << " qprob= " << qprob << G4endl; >> 1073 } >> 1074 */ 965 } 1075 } 966 } 1076 } 967 return cth; << 1077 return cth ; 968 } 1078 } 969 1079 970 //....oooOO0OOooo........oooOO0OOooo........oo 1080 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 971 1081 972 G4double G4UrbanMscModel::ComputeTheta0(G4doub 1082 G4double G4UrbanMscModel::ComputeTheta0(G4double trueStepLength, 973 G4doub << 1083 G4double KineticEnergy) 974 { 1084 { 975 // for all particles take the width of the c 1085 // for all particles take the width of the central part 976 // from a parametrization similar to the H 1086 // from a parametrization similar to the Highland formula 977 // ( Highland formula: Particle Physics Book 1087 // ( Highland formula: Particle Physics Booklet, July 2002, eq. 26.10) 978 G4double invbetacp = (kinEnergy+mass)/(kinEn << 1088 G4double invbetacp = std::sqrt((currentKinEnergy+mass)*(KineticEnergy+mass)/ 979 if(currentKinEnergy != kinEnergy) { << 1089 (currentKinEnergy*(currentKinEnergy+2.*mass)* 980 invbetacp = std::sqrt(invbetacp*(currentKi << 1090 KineticEnergy*(KineticEnergy+2.*mass))); 981 (currentKinEnergy*(currentKinEnergy+2. << 982 } << 983 G4double y = trueStepLength/currentRadLength 1091 G4double y = trueStepLength/currentRadLength; 984 1092 985 if(fPosiCorrection && particle == positron) << 1093 if(particle == positron) 986 { 1094 { 987 static const G4double xl= 0.6; 1095 static const G4double xl= 0.6; 988 static const G4double xh= 0.9; 1096 static const G4double xh= 0.9; 989 static const G4double e = 113.0; 1097 static const G4double e = 113.0; 990 G4double corr; 1098 G4double corr; 991 1099 992 G4double tau = std::sqrt(currentKinEnergy* << 1100 G4double tau = std::sqrt(currentKinEnergy*KineticEnergy)/mass; 993 G4double x = std::sqrt(tau*(tau+2.)/((tau+ 1101 G4double x = std::sqrt(tau*(tau+2.)/((tau+1.)*(tau+1.))); 994 G4double a = msc[idx]->posa; << 1102 G4double a = 0.994-4.08e-3*Zeff; 995 G4double b = msc[idx]->posb; << 1103 G4double b = 7.16+(52.6+365./Zeff)/Zeff; 996 G4double c = msc[idx]->posc; << 1104 G4double c = 1.000-4.47e-3*Zeff; 997 G4double d = msc[idx]->posd; << 1105 G4double d = 1.21e-3*Zeff; 998 if(x < xl) { 1106 if(x < xl) { 999 corr = a*(1.-G4Exp(-b*x)); 1107 corr = a*(1.-G4Exp(-b*x)); 1000 } else if(x > xh) { 1108 } else if(x > xh) { 1001 corr = c+d*G4Exp(e*(x-1.)); 1109 corr = c+d*G4Exp(e*(x-1.)); 1002 } else { 1110 } else { 1003 G4double yl = a*(1.-G4Exp(-b*xl)); 1111 G4double yl = a*(1.-G4Exp(-b*xl)); 1004 G4double yh = c+d*G4Exp(e*(xh-1.)); 1112 G4double yh = c+d*G4Exp(e*(xh-1.)); 1005 G4double y0 = (yh-yl)/(xh-xl); 1113 G4double y0 = (yh-yl)/(xh-xl); 1006 G4double y1 = yl-y0*xl; 1114 G4double y1 = yl-y0*xl; 1007 corr = y0*x+y1; 1115 corr = y0*x+y1; 1008 } 1116 } 1009 //======================================= 1117 //================================================================== 1010 y *= corr*msc[idx]->pose; << 1118 y *= corr*(1.+Zeff*(1.84035e-4*Zeff-1.86427e-2)+0.41125); 1011 } 1119 } 1012 1120 1013 static const G4double c_highland = 13.6*CLH 1121 static const G4double c_highland = 13.6*CLHEP::MeV; 1014 G4double theta0 = c_highland*std::abs(charg 1122 G4double theta0 = c_highland*std::abs(charge)*std::sqrt(y)*invbetacp; 1015 1123 1016 // correction factor from e- scattering dat 1124 // correction factor from e- scattering data 1017 theta0 *= (msc[idx]->coeffth1+msc[idx]->coe << 1125 theta0 *= (coeffth1+coeffth2*G4Log(y)); 1018 return theta0; 1126 return theta0; 1019 } 1127 } 1020 1128 1021 //....oooOO0OOooo........oooOO0OOooo........o 1129 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 1022 1130 1023 void G4UrbanMscModel::SampleDisplacement(G4do << 1131 void G4UrbanMscModel::SampleDisplacement(G4double sth, G4double phi) 1024 { << 1132 { 1025 // simple and fast sampling << 1133 G4double rmax = sqrt((tPathLength-zPathLength)*(tPathLength+zPathLength)); 1026 // based on single scattering results << 1027 // u = r/rmax : mean value << 1028 1134 1029 G4double rmax = std::sqrt((tPathLength-zPat << 1135 static const G4double third = 1./3.; 1030 if(rmax > 0.) << 1136 G4double r = rmax*G4Exp(G4Log(rndmEngineMod->flat())*third); 1031 { << 1137 /* 1032 G4double r = 0.73*rmax; << 1138 G4cout << "G4UrbanMscModel::SampleSecondaries: e(MeV)= " << kineticEnergy >> 1139 << " sinTheta= " << sth << " r(mm)= " << r >> 1140 << " trueStep(mm)= " << tPathLength >> 1141 << " geomStep(mm)= " << zPathLength >> 1142 << G4endl; >> 1143 */ >> 1144 >> 1145 if(r > 0.) { >> 1146 static const G4double kappa = 2.5; >> 1147 static const G4double kappami1 = 1.5; >> 1148 >> 1149 G4double latcorr = 0.; >> 1150 if((currentTau >= tausmall) && !insideskin) { >> 1151 if(currentTau < taulim) { >> 1152 latcorr = lambdaeff*kappa*currentTau*currentTau* >> 1153 (1.-(kappa+1.)*currentTau*third)*third; >> 1154 >> 1155 } else { >> 1156 G4double etau = (currentTau < taubig) ? G4Exp(-currentTau) : 0.; >> 1157 latcorr = -kappa*currentTau; >> 1158 latcorr = G4Exp(latcorr)/kappami1; >> 1159 latcorr += 1.-kappa*etau/kappami1 ; >> 1160 latcorr *= 2.*lambdaeff*third; >> 1161 } >> 1162 } >> 1163 latcorr = std::min(latcorr, r); >> 1164 >> 1165 // sample direction of lateral displacement >> 1166 // compute it from the lateral correlation >> 1167 G4double Phi; >> 1168 if(std::abs(r*sth) < latcorr) { >> 1169 Phi = twopi*rndmEngineMod->flat(); 1033 1170 1034 // simple distribution for v=Phi-phi=psi << 1171 } else { 1035 // beta determined from the requirement t << 1172 //G4cout << "latcorr= " << latcorr << " r*sth= " << r*sth 1036 // the same mean value than that obtained << 1173 // << " ratio= " << latcorr/(r*sth) << G4endl; 1037 << 1174 G4double psi = std::acos(latcorr/(r*sth)); 1038 static const G4double cbeta = 2.160; << 1175 G4double rdm = rndmEngineMod->flat(); 1039 static const G4double cbeta1 = 1. - G4Exp << 1176 Phi = (rdm < 0.5) ? phi+psi : phi-psi; 1040 rndmEngineMod->flatArray(2, rndmarray); << 1177 } 1041 G4double psi = -G4Log(1. - rndmarray[0]*c << 1042 G4double Phi = (rndmarray[1] < 0.5) ? phi << 1043 fDisplacement.set(r*std::cos(Phi),r*std:: 1178 fDisplacement.set(r*std::cos(Phi),r*std::sin(Phi),0.0); 1044 } 1179 } 1045 } 1180 } 1046 1181 1047 //....oooOO0OOooo........oooOO0OOooo........o 1182 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 1048 1183 1049 void G4UrbanMscModel::SampleDisplacementNew(G << 1184 void G4UrbanMscModel::SampleDisplacementNew(G4double , G4double phi) 1050 { 1185 { 1051 // simple and fast sampling << 1186 //sample displacement r 1052 // based on single scattering results << 1053 // u = (r/rmax)**2 : distribution from ss s << 1054 const G4double eps = 1.e-3; << 1055 const G4double rmax = << 1056 std::sqrt((tPathLength-zPathLength)*(tPat << 1057 << 1058 if(rmax > 0.) << 1059 { << 1060 const G4double x0 = 0.73 ; << 1061 const G4double alpha = G4Log(7.33)/x0 ; << 1062 const G4double a1 = 1.-x0 ; << 1063 const G4double a2 = 1.-G4Exp(-alpha*x0) ; << 1064 const G4double a3 = G4Exp(alpha*x0)-1. ; << 1065 const G4double w1 = 2.*a2/(alpha*a1+2.*a2 << 1066 1187 1067 G4double r, sqx; << 1188 G4double rmax = sqrt((tPathLength-zPathLength)*(tPathLength+zPathLength)); 1068 if (rmax/currentRange < eps) << 1189 // u = (r/rmax)**2 , v=1-u 1069 { << 1190 // paramerization from ss simulation 1070 r = 0.73*rmax ; << 1191 // f(u) = p0*exp(p1*log(v)-p2*v)+v*(p3+p4*v) 1071 sqx = 1.; << 1192 G4double u ,v , rej; 1072 } << 1193 G4int count = 0; 1073 else << 1194 1074 { << 1195 static const G4double reps = 1.e-6; 1075 rndmEngineMod->flatArray(2,rndmarray); << 1196 static const G4double rp0 = 2.2747e+4; 1076 const G4double x = (rndmarray[0] < w1) << 1197 static const G4double rp1 = 4.5980e+0; 1077 1. - a1*std::sqrt(1.-rndmarray[1]); << 1198 static const G4double rp2 = 1.5580e+1; 1078 << 1199 static const G4double rp3 = 7.1287e-1; 1079 sqx = std::sqrt(x); << 1200 static const G4double rp4 =-5.7069e-1; 1080 r = sqx*rmax; << 1201 1081 } << 1202 do { 1082 // Gaussian distribution for Phi-phi=psi << 1203 u = reps+(1.-2.*reps)*rndmEngineMod->flat(); 1083 const G4double sigma = 0.1+0.9*sqx; << 1204 v = 1.-u ; 1084 const G4double psi = G4RandGauss::shoot(0 << 1205 rej = rp0*G4Exp(rp1*G4Log(v)-rp2*v) + v*(rp3+rp4*v); 1085 const G4double Phi = phi+psi; << 1086 fDisplacement.set(r*std::cos(Phi), r*std: << 1087 } 1206 } 1088 } << 1207 // Loop checking, 15-Sept-2015, Vladimir Ivanchenko >> 1208 while (rndmEngineMod->flat() > rej && ++count < 1000); >> 1209 G4double r = rmax*sqrt(u); 1089 1210 1090 //....oooOO0OOooo........oooOO0OOooo........o << 1211 if(r > 0.) >> 1212 { >> 1213 // sample Phi using lateral correlation >> 1214 // v = Phi-phi = acos(latcorr/(r*sth)) >> 1215 // v has a universal distribution which can be parametrized from ss >> 1216 // simulation as >> 1217 // f(v) = 1.49e-2*exp(-v**2/(2*0.320))+2.50e-2*exp(-31.0*log(1.+6.30e-2*v))+ >> 1218 // 1.96e-5*exp(8.42e-1*log(1.+1.45e1*v)) >> 1219 static const G4double probv1 = 0.305533; >> 1220 static const G4double probv2 = 0.955176; >> 1221 static const G4double vhigh = 3.15; >> 1222 static const G4double w2v = 1./G4Exp(30.*G4Log(1. + 6.30e-2*vhigh)); >> 1223 static const G4double w3v = 1./G4Exp(-1.842*G4Log(1. + 1.45e1*vhigh)); >> 1224 >> 1225 G4double Phi; >> 1226 G4double random = rndmEngineMod->flat(); >> 1227 if(random < probv1) { >> 1228 do { >> 1229 v = G4RandGauss::shoot(rndmEngineMod,0.,0.320); >> 1230 } >> 1231 // Loop checking, 15-Sept-2015, Vladimir Ivanchenko >> 1232 while (std::abs(v) >= vhigh); >> 1233 Phi = phi + v; 1091 1234 1092 void G4UrbanMscModel::InitialiseModelCache() << 1235 } else { 1093 { << 1094 // it is assumed, that for the second run o << 1095 // of a new G4MaterialCutsCouple is possibl << 1096 auto theCoupleTable = G4ProductionCutsTable << 1097 std::size_t numOfCouples = theCoupleTable-> << 1098 if(numOfCouples != msc.size()) { msc.resize << 1099 << 1100 for(G4int j=0; j<(G4int)numOfCouples; ++j) << 1101 auto aCouple = theCoupleTable->GetMateria << 1102 1236 1103 // new couple << 1237 G4double rnd = rndmEngineMod->flat(); 1104 msc[j] = new mscData(); << 1238 v = (random < probv2) 1105 G4double Zeff = aCouple->GetMaterial()->G << 1239 ? (-1.+1./G4Exp(G4Log(1.-rnd*(1.-w2v))/30.))/6.30e-2 1106 G4double sqrz = std::sqrt(Zeff); << 1240 : (-1.+1./G4Exp(G4Log(1.-rnd*(1.-w3v))/-1.842))/1.45e1; 1107 msc[j]->sqrtZ = sqrz; << 1241 1108 // parameterisation of step limitation << 1242 rnd = rndmEngineMod->flat(); 1109 msc[j]->factmin = dispAlg96 ? 0.001 : 0.0 << 1243 Phi = (rnd < 0.5) ? phi+v : phi-v; 1110 G4double lnZ = G4Log(Zeff); << 1244 } 1111 // correction in theta0 formula << 1245 fDisplacement.set(r*std::cos(Phi),r*std::sin(Phi),0.0); 1112 G4double w = G4Exp(lnZ/6.); << 1113 G4double facz = 0.990395+w*(-0.168386+w*0 << 1114 msc[j]->coeffth1 = facz*(1. - 8.7780e-2/Z << 1115 msc[j]->coeffth2 = facz*(4.0780e-2 + 1.73 << 1116 << 1117 // tail parameters << 1118 G4double Z13 = w*w; << 1119 msc[j]->coeffc1 = 2.3785 - Z13*(4.1981 << 1120 msc[j]->coeffc2 = 4.7526e-1 + Z13*(1.7694 << 1121 msc[j]->coeffc3 = 2.3683e-1 - Z13*(1.8111 << 1122 msc[j]->coeffc4 = 1.7888e-2 + Z13*(1.9659 << 1123 << 1124 msc[j]->Z23 = Z13*Z13; << 1125 << 1126 msc[j]->stepmina = 27.725/(1.+0.203*Zeff) << 1127 msc[j]->stepminb = 6.152/(1.+0.111*Zeff) << 1128 << 1129 // 21.07.2020 << 1130 msc[j]->doverra = 9.6280e-1 - 8.4848e-2*m << 1131 << 1132 // 06.10.2020 << 1133 // msc[j]->doverra = 7.7024e-1 - 6.7878e- << 1134 msc[j]->doverrb = 1.15 - 9.76e-4*Zeff; << 1135 << 1136 // corrections for e+ << 1137 msc[j]->posa = 0.994-4.08e-3*Zeff; << 1138 msc[j]->posb = 7.16+(52.6+365./Zeff)/Zeff << 1139 msc[j]->posc = 1.000-4.47e-3*Zeff; << 1140 msc[j]->posd = 1.21e-3*Zeff; << 1141 msc[j]->pose = 1.+Zeff*(1.84035e-4*Zeff-1 << 1142 } 1246 } 1143 } 1247 } 1144 1248 1145 //....oooOO0OOooo........oooOO0OOooo........o 1249 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 1146 1250