134 mass = proton_mass_c2;
179 static const G4double epsmin = 1.e-4 , epsmax = 1.e10;
181 static const G4double Zdat[15] = { 4., 6., 13., 20., 26., 29., 32., 38.,47.,
182 50., 56., 64., 74., 79., 82. };
185 static const G4double celectron[15][22] =
186 {{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.090,1.105,1.111,
188 1.112,1.108,1.100,1.093,1.089,1.087 },
189 {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.087,1.101,1.108,
191 1.109,1.105,1.097,1.090,1.086,1.082 },
192 {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.119,1.129,1.132,
194 1.131,1.124,1.113,1.104,1.099,1.098 },
195 {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.103,1.110,1.113,
197 1.112,1.105,1.096,1.089,1.085,1.098 },
198 {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.063,1.070,1.073,
200 1.073,1.070,1.064,1.059,1.056,1.056 },
201 {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.068,1.072,1.074,
203 1.074,1.070,1.063,1.059,1.056,1.052 },
204 {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.066,1.068,1.069,
206 1.068,1.064,1.059,1.054,1.051,1.050 },
207 {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.040,1.039,1.039,
209 1.039,1.037,1.034,1.031,1.030,1.036 },
210 {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.048,1.036,1.033,
212 1.031,1.028,1.024,1.022,1.021,1.024 },
213 {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.040,1.027,1.022,
215 1.020,1.017,1.015,1.013,1.013,1.020 },
216 {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.022,1.003,0.997,
218 0.995,0.993,0.993,0.993,0.993,1.011 },
219 {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.014,0.986,0.976,
221 0.974,0.972,0.973,0.974,0.975,0.987 },
222 {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.010,0.969,0.954,
224 0.950,0.947,0.949,0.952,0.954,0.963 },
225 {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.014,0.965,0.947,
227 0.941,0.938,0.940,0.944,0.946,0.954 },
228 {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.013,0.960,0.939,
230 0.933,0.930,0.933,0.936,0.939,0.949 }};
232 static const G4double cpositron[15][22] = {
233 {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.108,1.123,1.131,
235 1.131,1.126,1.117,1.108,1.103,1.100 },
236 {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.114,1.130,1.137,
238 1.138,1.132,1.122,1.113,1.108,1.102 },
239 {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.188,1.201,1.205,
241 1.203,1.190,1.173,1.159,1.151,1.145 },
242 {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.214,1.225,1.228,
244 1.225,1.210,1.191,1.175,1.166,1.174 },
245 {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.202,1.214,1.219,
247 1.217,1.203,1.184,1.169,1.160,1.151 },
248 {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.228,1.238,1.241,
250 1.237,1.222,1.201,1.184,1.174,1.159 },
251 {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.247,1.254,1.256,
253 1.252,1.234,1.212,1.194,1.183,1.170 },
254 {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.251,1.256,1.258,
256 1.254,1.237,1.214,1.195,1.185,1.179 },
257 {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.330,1.324,1.320,
259 1.312,1.288,1.258,1.235,1.221,1.205 },
260 {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.342,1.332,1.327,
262 1.320,1.294,1.264,1.240,1.226,1.214 },
263 {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.356,1.342,1.336,
265 1.328,1.302,1.270,1.245,1.231,1.233 },
266 {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.405,1.382,1.371,
268 1.361,1.330,1.294,1.267,1.251,1.239 },
269 {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.480,1.441,1.423,
271 1.409,1.372,1.330,1.298,1.280,1.258 },
272 {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.531,1.482,1.459,
274 1.442,1.400,1.354,1.319,1.299,1.272 },
275 {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.554,1.499,1.474,
277 1.456,1.412,1.364,1.328,1.307,1.282 }};
281 static const G4double hecorr[15] = {
282 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.855, -16.84,
295 G4double eKineticEnergy = KineticEnergy;
297 if(
mass > electron_mass_c2)
300 G4double c =
mass*TAU*(TAU+2.)/(electron_mass_c2*(TAU+1.)) ;
302 G4double tau = 0.5*(w+sqrt(w*w+4.*c)) ;
303 eKineticEnergy = electron_mass_c2*tau ;
306 G4double eTotalEnergy = eKineticEnergy + electron_mass_c2 ;
307 G4double beta2 = eKineticEnergy*(eTotalEnergy+electron_mass_c2)
308 /(eTotalEnergy*eTotalEnergy);
309 G4double bg2 = eKineticEnergy*(eTotalEnergy+electron_mass_c2)
310 /(electron_mass_c2*electron_mass_c2);
312 static const G4double epsfactor = 2.*CLHEP::electron_mass_c2*
313 CLHEP::electron_mass_c2*CLHEP::Bohr_radius*CLHEP::Bohr_radius
314 /(CLHEP::hbarc*CLHEP::hbarc);
317 if (eps<epsmin) sigma = 2.*eps*
eps;
318 else if(eps<epsmax) sigma =
G4Log(1.+2.*eps)-2.*eps/(1.+2.*
eps);
319 else sigma =
G4Log(2.*eps)-1.+1./
eps;
321 sigma *=
ChargeSquare*AtomicNumber*AtomicNumber/(beta2*bg2);
329 while ((iZ>=0)&&(Zdat[iZ]>=AtomicNumber)) iZ -= 1;
335 G4double ratZ = (AtomicNumber-ZZ1)*(AtomicNumber+ZZ1)/
336 ((ZZ2-ZZ1)*(ZZ2+ZZ1));
340 CLHEP::twopi*CLHEP::classic_electr_radius*CLHEP::classic_electr_radius;
341 static const G4double beta2lim = Tlim*(Tlim+2.*CLHEP::electron_mass_c2)/
342 ((Tlim+CLHEP::electron_mass_c2)*(Tlim+CLHEP::electron_mass_c2));
343 static const G4double bg2lim = Tlim*(Tlim+2.*CLHEP::electron_mass_c2)/
344 (CLHEP::electron_mass_c2*CLHEP::electron_mass_c2);
360 if(eKineticEnergy <= Tlim)
365 while ((iT>=0)&&(Tdat[iT]>=eKineticEnergy)) iT -= 1;
370 G4double T = Tdat[iT], E = T + electron_mass_c2;
371 G4double b2small = T*(E+electron_mass_c2)/(E*E);
373 T = Tdat[iT+1]; E = T + electron_mass_c2;
374 G4double b2big = T*(E+electron_mass_c2)/(E*E);
375 G4double ratb2 = (beta2-b2small)/(b2big-b2small);
379 c1 = celectron[iZ][iT];
380 c2 = celectron[iZ+1][iT];
381 cc1 = c1+ratZ*(c2-c1);
383 c1 = celectron[iZ][iT+1];
384 c2 = celectron[iZ+1][iT+1];
385 cc2 = c1+ratZ*(c2-c1);
387 corr = cc1+ratb2*(cc2-cc1);
389 sigma *= sigmafactor/corr;
393 c1 = cpositron[iZ][iT];
394 c2 = cpositron[iZ+1][iT];
395 cc1 = c1+ratZ*(c2-c1);
397 c1 = cpositron[iZ][iT+1];
398 c2 = cpositron[iZ+1][iT+1];
399 cc2 = c1+ratZ*(c2-c1);
401 corr = cc1+ratb2*(cc2-cc1);
403 sigma *= sigmafactor/corr;
408 c1 = bg2lim*sig0[iZ]*(1.+hecorr[iZ]*(beta2-beta2lim))/bg2;
409 c2 = bg2lim*sig0[iZ+1]*(1.+hecorr[iZ+1]*(beta2-beta2lim))/bg2;
410 if((AtomicNumber >= ZZ1) && (AtomicNumber <= ZZ2))
411 sigma = c1+ratZ*(c2-c1) ;
412 else if(AtomicNumber < ZZ1)
413 sigma = AtomicNumber*AtomicNumber*c1/(ZZ1*ZZ1);
414 else if(AtomicNumber > ZZ2)
415 sigma = AtomicNumber*AtomicNumber*c2/(ZZ2*ZZ2);
477 distance *= (1.15-9.76e-4*
Zeff);
479 distance *= (1.20-
Zeff*(1.62e-2-9.22e-5*
Zeff));
527 rat = 1.e-3/(rat*(10.+rat)) ;
637 rat = 1.e-3/(rat*(10 + rat)) ;
681 if(
charge > 0.) index = 2;
689 rat = 1.e-3/(rat*(10 + rat)) ;
841 if(tlength < geomStepLength) { tlength = geomStepLength; }
885 G4double sth = sqrt((1.0 - cth)*(1.0 + cth));
891 newDirection.rotateUz(oldDirection);
934 static const G4double numlim = 0.01;
937 xmeanth = 1.0 - tau*(1.0 - 0.5*tau);
938 x2meanth= 1.0 - tau*(5.0 - 6.25*tau)/3.;
940 xmeanth =
G4Exp(-tau);
941 x2meanth = (1.+2.*
G4Exp(-2.5*tau))/3.;
946 static const G4double rellossmax= 0.50;
947 if(relloss > rellossmax) {
951 G4bool extremesmallstep = false ;
954 if(trueStepLength > tsmall) {
957 theta0 = sqrt(trueStepLength/tsmall)*
ComputeTheta0(tsmall,KineticEnergy);
958 extremesmallstep = true ;
968 if(theta2 <
tausmall) {
return cth; }
970 if(theta0 > theta0max) {
974 G4double x = theta2*(1.0 - theta2/12.);
975 if(theta2 > numlim) {
1004 if(std::abs(c-3.) < 0.001) { c = 3.001; }
1005 else if(std::abs(c-2.) < 0.001) { c = 2.001; }
1011 G4double xmean1 = 1.-(1.-(1.+xsi)*ea)*x/eaa;
1016 if(xmean1 <= 0.999*xmeanth) {
1029 G4double xmean2 = (x0 + d - (bx - b1*d)/(c-2.))/(1. - d);
1035 G4double qprob = xmeanth/(prob*xmean1+(1.-prob)*xmean2);
1048 if(var < numlim*d) {
1050 cth = -1.0 + var*(1.0 - 0.5*var*c)*(2. + (c - xsi)*x);
1052 cth = 1. + x*(c - xsi - c*
G4Exp(-
G4Log(var + d)/c1));
1096 KineticEnergy*(KineticEnergy+2.*
mass)));
1107 G4double x = std::sqrt(tau*(tau+2.)/((tau+1.)*(tau+1.)));
1113 corr = a*(1.-
G4Exp(-b*x));
1115 corr = c+d*
G4Exp(e*(x-1.));
1124 y *= corr*(1.+
Zeff*(1.84035e-4*
Zeff-1.86427e-2)+0.41125);
1128 G4double theta0 = c_highland*std::abs(
charge)*std::sqrt(y)*invbetacp;
1141 static const G4double third = 1./3.;
1153 static const G4double kappami1 = 1.5;
1165 latcorr =
G4Exp(latcorr)/kappami1;
1166 latcorr += 1.-kappa*etau/kappami1 ;
1175 if(std::abs(r*sth) < latcorr) {
1181 G4double psi = std::acos(latcorr/(r*sth));
1205 static const G4double reps = 1.e-6;
1206 static const G4double rp0 = 2.2747e+4;
1207 static const G4double rp1 = 4.5980e+0;
1208 static const G4double rp2 = 1.5580e+1;
1209 static const G4double rp3 = 7.1287e-1;
1210 static const G4double rp4 =-5.7069e-1;
1215 rej = rp0*
G4Exp(rp1*
G4Log(v)-rp2*v) + v*(rp3+rp4*v);
1229 static const G4double probv1 = 0.305533;
1230 static const G4double probv2 = 0.955176;
1231 static const G4double vhigh = 3.15;
1237 if(random < probv1) {
1242 while (std::abs(v) >= vhigh);
1247 if(random < probv2) {
1254 if(random < 0.5) { Phi = phi+v; }
1255 else { Phi = phi-v; }
G4ParticleChangeForMSC * fParticleChange
static G4Pow * GetInstance()
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
ThreeVector shoot(const G4int Ap, const G4int Af)
G4IonisParamMat * GetIonisation() const
static c2_factory< G4double > c2
CLHEP::HepRandomEngine * rndmEngineMod
virtual G4ThreeVector & SampleScattering(const G4ThreeVector &, G4double safety) override
static G4LossTableManager * Instance()
G4UrbanMscModel(const G4String &nam="UrbanMsc")
static constexpr double mm
G4double GetKineticEnergy() const
CLHEP::Hep3Vector G4ThreeVector
virtual G4double ComputeGeomPathLength(G4double truePathLength) override
const G4DynamicParticle * GetDynamicParticle() const
virtual ~G4UrbanMscModel()
std::vector< ExP01TrackerHit * > a
G4bool latDisplasmentbackup
G4double GetProductionCut(G4int index) const
G4StepStatus GetStepStatus() const
G4double ConvertTrueToGeom(G4double &tLength, G4double &gLength)
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
static const G4double eps
G4ParticleDefinition * GetDefinition() const
const G4ParticleDefinition * particle
G4double currentRadLength
const G4Step * GetStep() const
G4double ComputeSafety(const G4ThreeVector &position, G4double limit=DBL_MAX)
G4int currentMaterialIndex
G4double SampleCosineTheta(G4double trueStepLength, G4double KineticEnergy)
G4double GetZeffective() const
static constexpr double twopi
const G4ParticleDefinition * positron
G4StepPoint * GetPreStepPoint() const
G4double GetEnergy(const G4ParticleDefinition *part, G4double range, const G4MaterialCutsCouple *couple)
static constexpr double um
void SampleDisplacementNew(G4double sinTheta, G4double phi)
const G4ThreeVector & GetPosition() const
G4double GetRange(const G4ParticleDefinition *part, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
G4double Randomizetlimit()
static constexpr double eV
const G4MaterialCutsCouple * couple
G4double ComputeGeomLimit(const G4Track &, G4double &presafety, G4double limit)
G4ThreeVector fDisplacement
G4double GetTransportMeanFreePath(const G4ParticleDefinition *part, G4double kinEnergy)
G4double GetRadlen() const
G4double G4Log(G4double x)
virtual G4double ComputeTrueStepLength(G4double geomStepLength) override
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
void SetParticle(const G4ParticleDefinition *)
virtual G4double ComputeTruePathLengthLimit(const G4Track &track, G4double ¤tMinimalStep) override
G4ParticleChangeForMSC * GetParticleChangeForMSC(const G4ParticleDefinition *p=nullptr)
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *particle, G4double KineticEnergy, G4double AtomicNumber, G4double AtomicWeight=0., G4double cut=0., G4double emax=DBL_MAX) override
void ProposeMomentumDirection(const G4ThreeVector &Pfinal)
static G4Positron * Positron()
G4LossTableManager * theManager
T max(const T t1, const T t2)
brief Return the largest of the two arguments
static constexpr double nm
G4double GetDEDX(const G4ParticleDefinition *part, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
void SampleDisplacement(G4double sinTheta, G4double phi)
void SetCurrentCouple(const G4MaterialCutsCouple *)
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4double GetSafety() const
G4double Z23(G4int Z) const
G4MscStepLimitType steppingAlgorithm
static constexpr double MeV
static constexpr double pi
G4double currentKinEnergy
G4double ComputeTheta0(G4double truePathLength, G4double KineticEnergy)
static constexpr double barn
virtual void StartTracking(G4Track *) override
G4ProductionCuts * GetProductionCuts() const
static constexpr double keV
G4double SimpleScattering(G4double xmeanth, G4double x2meanth)
const G4Material * GetMaterial() const