66 masslimite = 0.6 * MeV;
67 lambdalimit = 1. * mm;
73 tlimitminfix = 0.01 * nm;
74 tlimitminfix2 = 1. * nm;
75 stepmin = tlimitminfix;
80 tlimitmin = 10. * tlimitminfix;
104 rndmEngineMod = G4Random::getTheEngine();
108 latDisplasmentbackup =
false;
109 displacementFlag =
true;
115 skindepth =
skin * stepmin;
117 mass = proton_mass_c2;
118 charge = ChargeSquare = 1.0;
119 currentKinEnergy = currentRadLength = lambda0 = lambdaeff = tPathLength =
120 zPathLength = par1 = par2 = par3 = 0.;
122 currentMaterialIndex = -1;
123 fParticleChange =
nullptr;
152 static constexpr G4double epsmin = 1.e-4;
153 static constexpr G4double epsmax = 1.e10;
155 static constexpr G4double Zdat[15] = { 4., 6., 13., 20., 26., 29., 32., 38.,
156 47., 50., 56., 64., 74., 79., 82. };
159 static constexpr G4double celectron[15][22] = {
160 { 1.125, 1.072, 1.051, 1.047, 1.047, 1.050, 1.052, 1.054,
161 1.054, 1.057, 1.062, 1.069, 1.075, 1.090, 1.105, 1.111,
162 1.112, 1.108, 1.100, 1.093, 1.089, 1.087 },
163 { 1.408, 1.246, 1.143, 1.096, 1.077, 1.059, 1.053, 1.051,
164 1.052, 1.053, 1.058, 1.065, 1.072, 1.087, 1.101, 1.108,
165 1.109, 1.105, 1.097, 1.090, 1.086, 1.082 },
166 { 2.833, 2.268, 1.861, 1.612, 1.486, 1.309, 1.204, 1.156,
167 1.136, 1.114, 1.106, 1.106, 1.109, 1.119, 1.129, 1.132,
168 1.131, 1.124, 1.113, 1.104, 1.099, 1.098 },
169 { 3.879, 3.016, 2.380, 2.007, 1.818, 1.535, 1.340, 1.236,
170 1.190, 1.133, 1.107, 1.099, 1.098, 1.103, 1.110, 1.113,
171 1.112, 1.105, 1.096, 1.089, 1.085, 1.098 },
172 { 6.937, 4.330, 2.886, 2.256, 1.987, 1.628, 1.395, 1.265,
173 1.203, 1.122, 1.080, 1.065, 1.061, 1.063, 1.070, 1.073,
174 1.073, 1.070, 1.064, 1.059, 1.056, 1.056 },
175 { 9.616, 5.708, 3.424, 2.551, 2.204, 1.762, 1.485, 1.330,
176 1.256, 1.155, 1.099, 1.077, 1.070, 1.068, 1.072, 1.074,
177 1.074, 1.070, 1.063, 1.059, 1.056, 1.052 },
178 { 11.72, 6.364, 3.811, 2.806, 2.401, 1.884, 1.564, 1.386,
179 1.300, 1.180, 1.112, 1.082, 1.073, 1.066, 1.068, 1.069,
180 1.068, 1.064, 1.059, 1.054, 1.051, 1.050 },
181 { 18.08, 8.601, 4.569, 3.183, 2.662, 2.025, 1.646, 1.439,
182 1.339, 1.195, 1.108, 1.068, 1.053, 1.040, 1.039, 1.039,
183 1.039, 1.037, 1.034, 1.031, 1.030, 1.036 },
184 { 18.22, 10.48, 5.333, 3.713, 3.115, 2.367, 1.898, 1.631,
185 1.498, 1.301, 1.171, 1.105, 1.077, 1.048, 1.036, 1.033,
186 1.031, 1.028, 1.024, 1.022, 1.021, 1.024 },
187 { 14.14, 10.65, 5.710, 3.929, 3.266, 2.453, 1.951, 1.669,
188 1.528, 1.319, 1.178, 1.106, 1.075, 1.040, 1.027, 1.022,
189 1.020, 1.017, 1.015, 1.013, 1.013, 1.020 },
190 { 14.11, 11.73, 6.312, 4.240, 3.478, 2.566, 2.022, 1.720,
191 1.569, 1.342, 1.186, 1.102, 1.065, 1.022, 1.003, 0.997,
192 0.995, 0.993, 0.993, 0.993, 0.993, 1.011 },
193 { 22.76, 20.01, 8.835, 5.287, 4.144, 2.901, 2.219, 1.855,
194 1.677, 1.410, 1.224, 1.121, 1.073, 1.014, 0.986, 0.976,
195 0.974, 0.972, 0.973, 0.974, 0.975, 0.987 },
196 { 50.77, 40.85, 14.13, 7.184, 5.284, 3.435, 2.520, 2.059,
197 1.837, 1.512, 1.283, 1.153, 1.091, 1.010, 0.969, 0.954,
198 0.950, 0.947, 0.949, 0.952, 0.954, 0.963 },
199 { 65.87, 59.06, 15.87, 7.570, 5.567, 3.650, 2.682, 2.182,
200 1.939, 1.579, 1.325, 1.178, 1.108, 1.014, 0.965, 0.947,
201 0.941, 0.938, 0.940, 0.944, 0.946, 0.954 },
202 { 55.60, 47.34, 15.92, 7.810, 5.755, 3.767, 2.760, 2.239,
203 1.985, 1.609, 1.343, 1.188, 1.113, 1.013, 0.960, 0.939,
204 0.933, 0.930, 0.933, 0.936, 0.939, 0.949 }
207 static constexpr G4double cpositron[15][22] = {
208 { 2.589, 2.044, 1.658, 1.446, 1.347, 1.217, 1.144, 1.110,
209 1.097, 1.083, 1.080, 1.086, 1.092, 1.108, 1.123, 1.131,
210 1.131, 1.126, 1.117, 1.108, 1.103, 1.100 },
211 { 3.904, 2.794, 2.079, 1.710, 1.543, 1.325, 1.202, 1.145,
212 1.122, 1.096, 1.089, 1.092, 1.098, 1.114, 1.130, 1.137,
213 1.138, 1.132, 1.122, 1.113, 1.108, 1.102 },
214 { 7.970, 6.080, 4.442, 3.398, 2.872, 2.127, 1.672, 1.451,
215 1.357, 1.246, 1.194, 1.179, 1.178, 1.188, 1.201, 1.205,
216 1.203, 1.190, 1.173, 1.159, 1.151, 1.145 },
217 { 9.714, 7.607, 5.747, 4.493, 3.815, 2.777, 2.079, 1.715,
218 1.553, 1.353, 1.253, 1.219, 1.211, 1.214, 1.225, 1.228,
219 1.225, 1.210, 1.191, 1.175, 1.166, 1.174 },
220 { 17.97, 12.95, 8.628, 6.065, 4.849, 3.222, 2.275, 1.820,
221 1.624, 1.382, 1.259, 1.214, 1.202, 1.202, 1.214, 1.219,
222 1.217, 1.203, 1.184, 1.169, 1.160, 1.151 },
223 { 24.83, 17.06, 10.84, 7.355, 5.767, 3.707, 2.546, 1.996,
224 1.759, 1.465, 1.311, 1.252, 1.234, 1.228, 1.238, 1.241,
225 1.237, 1.222, 1.201, 1.184, 1.174, 1.159 },
226 { 23.26, 17.15, 11.52, 8.049, 6.375, 4.114, 2.792, 2.155,
227 1.880, 1.535, 1.353, 1.281, 1.258, 1.247, 1.254, 1.256,
228 1.252, 1.234, 1.212, 1.194, 1.183, 1.170 },
229 { 22.33, 18.01, 12.86, 9.212, 7.336, 4.702, 3.117, 2.348,
230 2.015, 1.602, 1.385, 1.297, 1.268, 1.251, 1.256, 1.258,
231 1.254, 1.237, 1.214, 1.195, 1.185, 1.179 },
232 { 33.91, 24.13, 15.71, 10.80, 8.507, 5.467, 3.692, 2.808,
233 2.407, 1.873, 1.564, 1.425, 1.374, 1.330, 1.324, 1.320,
234 1.312, 1.288, 1.258, 1.235, 1.221, 1.205 },
235 { 32.14, 24.11, 16.30, 11.40, 9.015, 5.782, 3.868, 2.917,
236 2.490, 1.925, 1.596, 1.447, 1.391, 1.342, 1.332, 1.327,
237 1.320, 1.294, 1.264, 1.240, 1.226, 1.214 },
238 { 29.51, 24.07, 17.19, 12.28, 9.766, 6.238, 4.112, 3.066,
239 2.602, 1.995, 1.641, 1.477, 1.414, 1.356, 1.342, 1.336,
240 1.328, 1.302, 1.270, 1.245, 1.231, 1.233 },
241 { 38.19, 30.85, 21.76, 15.35, 12.07, 7.521, 4.812, 3.498,
242 2.926, 2.188, 1.763, 1.563, 1.484, 1.405, 1.382, 1.371,
243 1.361, 1.330, 1.294, 1.267, 1.251, 1.239 },
244 { 49.71, 39.80, 27.96, 19.63, 15.36, 9.407, 5.863, 4.155,
245 3.417, 2.478, 1.944, 1.692, 1.589, 1.480, 1.441, 1.423,
246 1.409, 1.372, 1.330, 1.298, 1.280, 1.258 },
247 { 59.25, 45.08, 30.36, 20.83, 16.15, 9.834, 6.166, 4.407,
248 3.641, 2.648, 2.064, 1.779, 1.661, 1.531, 1.482, 1.459,
249 1.442, 1.400, 1.354, 1.319, 1.299, 1.272 },
250 { 56.38, 44.29, 30.50, 21.18, 16.51, 10.11, 6.354, 4.542,
251 3.752, 2.724, 2.116, 1.817, 1.692, 1.554, 1.499, 1.474,
252 1.456, 1.412, 1.364, 1.328, 1.307, 1.282 }
256 static constexpr G4double hecorr[15] = { 120.70, 117.50, 105.00, 92.92,
257 79.23, 74.510, 68.29, 57.39,
258 41.97, 36.14, 24.53, 10.21,
259 -7.855, -16.84, -22.30 };
270 G4double eKineticEnergy = KineticEnergy;
272 if(mass > electron_mass_c2)
274 G4double tau1 = KineticEnergy / mass;
275 G4double c = mass * tau1 * (tau1 + 2.) / (electron_mass_c2 * (tau1 + 1.));
277 G4double tau = 0.5 * (w + sqrt(w * w + 4. * c));
278 eKineticEnergy = electron_mass_c2 * tau;
281 G4double eTotalEnergy = eKineticEnergy + electron_mass_c2;
282 G4double beta2 = eKineticEnergy * (eTotalEnergy + electron_mass_c2) /
283 (eTotalEnergy * eTotalEnergy);
284 G4double bg2 = eKineticEnergy * (eTotalEnergy + electron_mass_c2) /
285 (electron_mass_c2 * electron_mass_c2);
287 static constexpr G4double epsfactor =
288 2. * CLHEP::electron_mass_c2 * CLHEP::electron_mass_c2 *
289 CLHEP::Bohr_radius * CLHEP::Bohr_radius / (CLHEP::hbarc * CLHEP::hbarc);
290 G4double eps = epsfactor * bg2 / Z23;
293 sigma = 2. * eps * eps;
294 else if(eps < epsmax)
295 sigma =
G4Log(1. + 2. * eps) - 2. * eps / (1. + 2. * eps);
297 sigma =
G4Log(2. * eps) - 1. + 1. / eps;
299 sigma *= ChargeSquare * AtomicNumber * AtomicNumber / (beta2 * bg2);
306 while((iZ >= 0) && (Zdat[iZ] >= AtomicNumber))
316 (AtomicNumber - ZZ1) * (AtomicNumber + ZZ1) / ((ZZ2 - ZZ1) * (ZZ2 + ZZ1));
318 static constexpr G4double Tlim = 10. * CLHEP::MeV;
319 static constexpr G4double sigmafactor =
320 CLHEP::twopi * CLHEP::classic_electr_radius * CLHEP::classic_electr_radius;
322 Tlim * (Tlim + 2. * CLHEP::electron_mass_c2) /
323 ((Tlim + CLHEP::electron_mass_c2) * (Tlim + CLHEP::electron_mass_c2));
325 Tlim * (Tlim + 2. * CLHEP::electron_mass_c2) /
326 (CLHEP::electron_mass_c2 * CLHEP::electron_mass_c2);
328 static constexpr G4double sig0[15] = {
329 0.2672 * CLHEP::barn, 0.5922 * CLHEP::barn, 2.653 * CLHEP::barn,
330 6.235 * CLHEP::barn, 11.69 * CLHEP::barn, 13.24 * CLHEP::barn,
331 16.12 * CLHEP::barn, 23.00 * CLHEP::barn, 35.13 * CLHEP::barn,
332 39.95 * CLHEP::barn, 50.85 * CLHEP::barn, 67.19 * CLHEP::barn,
333 91.15 * CLHEP::barn, 104.4 * CLHEP::barn, 113.1 * CLHEP::barn
336 static constexpr G4double Tdat[22] = {
337 100 * CLHEP::eV, 200 * CLHEP::eV, 400 * CLHEP::eV, 700 * CLHEP::eV,
338 1 * CLHEP::keV, 2 * CLHEP::keV, 4 * CLHEP::keV, 7 * CLHEP::keV,
339 10 * CLHEP::keV, 20 * CLHEP::keV, 40 * CLHEP::keV, 70 * CLHEP::keV,
340 100 * CLHEP::keV, 200 * CLHEP::keV, 400 * CLHEP::keV, 700 * CLHEP::keV,
341 1 * CLHEP::MeV, 2 * CLHEP::MeV, 4 * CLHEP::MeV, 7 * CLHEP::MeV,
342 10 * CLHEP::MeV, 20 * CLHEP::MeV
345 if(eKineticEnergy <= Tlim)
349 while((iT >= 0) && (Tdat[iT] >= eKineticEnergy))
357 G4double T = Tdat[iT], E = T + electron_mass_c2;
358 G4double b2small = T * (E + electron_mass_c2) / (E * E);
361 E = T + electron_mass_c2;
362 G4double b2big = T * (E + electron_mass_c2) / (E * E);
363 G4double ratb2 = (beta2 - b2small) / (b2big - b2small);
367 c1 = celectron[iZ][iT];
368 c2 = celectron[iZ + 1][iT];
369 cc1 = c1 + ratZ * (c2 - c1);
371 c1 = celectron[iZ][iT + 1];
372 c2 = celectron[iZ + 1][iT + 1];
373 cc2 = c1 + ratZ * (c2 - c1);
375 corr = cc1 + ratb2 * (cc2 - cc1);
377 sigma *= sigmafactor / corr;
381 c1 = cpositron[iZ][iT];
382 c2 = cpositron[iZ + 1][iT];
383 cc1 = c1 + ratZ * (c2 - c1);
385 c1 = cpositron[iZ][iT + 1];
386 c2 = cpositron[iZ + 1][iT + 1];
387 cc2 = c1 + ratZ * (c2 - c1);
389 corr = cc1 + ratb2 * (cc2 - cc1);
391 sigma *= sigmafactor / corr;
396 c1 = bg2lim * sig0[iZ] * (1. + hecorr[iZ] * (beta2 - beta2lim)) / bg2;
398 bg2lim * sig0[iZ + 1] * (1. + hecorr[iZ + 1] * (beta2 - beta2lim)) / bg2;
399 if((AtomicNumber >= ZZ1) && (AtomicNumber <= ZZ2))
400 sigma = c1 + ratZ * (c2 - c1);
401 else if(AtomicNumber < ZZ1)
402 sigma = AtomicNumber * AtomicNumber * c1 / (ZZ1 * ZZ1);
403 else if(AtomicNumber > ZZ2)
404 sigma = AtomicNumber * AtomicNumber * c2 / (ZZ2 * ZZ2);
416 tlimit = tgeom = rangeinit = rangecut = geombig;
418 stepmin = tlimitminfix;
419 tlimitmin = 10. * tlimitminfix;
420 rndmEngineMod = G4Random::getTheEngine();
427 tPathLength = currentMinimalStep;
434 currentMaterialIndex = couple->
GetIndex();
437 currentRange =
GetRange(particle, currentKinEnergy, couple);
439 tPathLength = min(tPathLength, currentRange);
448 if(tPathLength < tlimitminfix)
458 if(mass > masslimite)
460 distance *= (1.15 - 9.76e-4 * Zeff);
464 distance *= (1.20 - Zeff * (1.62e-2 - 9.22e-5 * Zeff));
466 presafety = sp->GetSafety();
469 if(distance < presafety)
476 static constexpr G4double invmev = 1.0 / CLHEP::MeV;
485 if(distance < presafety)
497 rangeinit = currentRange;
505 G4double rat = currentKinEnergy * invmev;
506 rat = 1.e-3 / (rat * (10. + rat));
508 stepmin = rat * lambda0;
509 skindepth =
skin * stepmin;
510 tlimitmin = max(10 * stepmin, tlimitminfix);
513 if((geomlimit < geombig) && (geomlimit > geommin))
517 if((1. - geomlimit / lambda0) > 0.)
518 geomlimit = -lambda0 *
G4Log(1. - geomlimit / lambda0) + tlimitmin;
523 tgeom = 2. * geomlimit /
facgeom;
533 tlimit = max(tlimit, tlimitmin);
534 tlimit = min(tlimit, tgeom);
537 if((tPathLength < tlimit) && (tPathLength < presafety) &&
538 (smallstep >
skin) && (tPathLength < geomlimit - 0.999 * skindepth))
544 if(smallstep <=
skin)
549 else if(geomlimit < geombig)
551 if(geomlimit > skindepth)
553 tlimit = min(tlimit, geomlimit - 0.999 * skindepth);
558 tlimit = min(tlimit, stepmin);
562 tlimit = max(tlimit, stepmin);
565 if((tlimit < tPathLength) && (smallstep >
skin) && !insideskin)
567 tPathLength = min(tPathLength, Randomizetlimit());
571 tPathLength = min(tPathLength, tlimit);
583 if(distance < presafety)
591 rangeinit = currentRange;
594 if(mass < masslimite)
596 rangeinit = max(rangeinit, lambda0);
597 if(lambda0 > lambdalimit)
599 fr *= (0.75 + 0.25 * lambda0 / lambdalimit);
603 G4double rat = currentKinEnergy * invmev;
604 rat = 1.e-3 / (rat * (10 + rat));
605 stepmin = lambda0 * rat;
606 tlimitmin = max(10 * stepmin, tlimitminfix);
610 tlimit = max(fr * rangeinit,
facsafety * presafety);
613 tlimit = max(tlimit, tlimitmin);
616 if(tlimit < tPathLength)
618 tPathLength = min(tPathLength, Randomizetlimit());
622 tPathLength = min(tPathLength, tlimit);
634 if(distance < presafety)
642 rangeinit = currentRange;
645 if(mass < masslimite)
651 if(lambda0 > lambdalimit)
653 fr *= (0.84 + 0.16 * lambda0 / lambdalimit);
657 G4double rat = currentKinEnergy * invmev;
658 rat = 1.e-3 / (rat * (10 + rat));
659 stepmin = lambda0 * rat;
660 tlimitmin = max(10 * stepmin, tlimitminfix);
663 tlimit = max(fr * rangeinit,
facsafety * presafety);
666 tlimit = max(tlimit, tlimitmin);
669 if(currentRange > finalr)
672 drr * currentRange + finalr * (1. - drr) * (2. - finalr / currentRange);
673 tPathLength = min(tPathLength, tmax);
677 if(currentRange > rangecut)
681 tPathLength = min(tPathLength,
facsafety * presafety);
685 tPathLength = min(tPathLength, presafety);
690 if(tPathLength < tlimit)
692 tPathLength = min(tPathLength, Randomizetlimit());
696 tPathLength = min(tPathLength, tlimit);
705 if(currentRange > lambda0)
714 tlimit = max(tlimit, tlimitmin);
717 if(tlimit < tPathLength)
719 tPathLength = min(tPathLength, Randomizetlimit());
723 tPathLength = min(tPathLength, tlimit);
739 tPathLength = std::min(tPathLength, currentRange);
742 zPathLength = tPathLength;
745 if(tPathLength < tlimitminfix2)
748 G4double tau = tPathLength / lambda0;
750 if((tau <= tausmall) || insideskin)
752 zPathLength = min(tPathLength, lambda0);
754 else if(tPathLength < currentRange *
dtrl)
757 zPathLength = tPathLength * (1. - 0.5 * tau);
759 zPathLength = lambda0 * (1. -
G4Exp(-tau));
761 else if(currentKinEnergy < mass || tPathLength == currentRange)
763 par1 = 1. / currentRange;
764 par2 = 1. / (par1 * lambda0);
766 if(tPathLength < currentRange)
769 (1. -
G4Exp(par3 *
G4Log(1. - tPathLength / currentRange))) /
774 zPathLength = 1. / (par1 * par3);
779 G4double rfin = max(currentRange - tPathLength, 0.01 * currentRange);
783 par1 = (lambda0 - lambda1) / (lambda0 * tPathLength);
784 par2 = 1. / (par1 * lambda0);
786 zPathLength = (1. -
G4Exp(par3 *
G4Log(lambda1 / lambda0))) / (par1 * par3);
789 zPathLength = min(zPathLength, lambda0);
797 if(geomStepLength == zPathLength)
802 zPathLength = geomStepLength;
805 if(geomStepLength < tlimitminfix2)
807 tPathLength = geomStepLength;
814 if((geomStepLength > lambda0 * tausmall) && !insideskin)
818 tlength = -lambda0 *
G4Log(1. - geomStepLength / lambda0);
822 if(par1 * par3 * geomStepLength < 1.)
825 (1. -
G4Exp(
G4Log(1. - par1 * par3 * geomStepLength) / par3)) /
830 tlength = currentRange;
834 if(tlength < geomStepLength)
836 tlength = geomStepLength;
838 else if(tlength > tPathLength)
840 tlength = tPathLength;
843 tPathLength = tlength;
854 G4double kineticEnergy = currentKinEnergy;
855 if(tPathLength > currentRange *
dtrl)
857 kineticEnergy =
GetEnergy(particle, currentRange - tPathLength, couple);
861 kineticEnergy -= tPathLength *
GetDEDX(particle, currentKinEnergy, couple);
864 if((kineticEnergy <= eV) || (tPathLength <= tlimitminfix) ||
865 (tPathLength < tausmall * lambda0))
870 G4double cth = SampleCosineTheta(tPathLength, kineticEnergy);
873 if(std::fabs(cth) >= 1.0)
878 G4double sth = sqrt((1.0 - cth) * (1.0 + cth));
884 newDirection.
rotateUz(oldDirection);
892 SampleDisplacementNew(cth, phi);
896 SampleDisplacement(sth, phi);
908 G4double tau = trueStepLength / lambda0;
913 if(std::fabs(lambda1 - lambda0) > lambda0 * 0.01 && lambda1 > 0.)
916 tau = trueStepLength *
G4Log(lambda0 / lambda1) / (lambda0 - lambda1);
920 lambdaeff = trueStepLength / currentTau;
925 cth = -1. + 2. * rndmEngineMod->
flat();
927 else if(tau >= tausmall)
929 static const G4double numlim = 0.01;
933 xmeanth = 1.0 - tau * (1.0 - 0.5 * tau);
934 x2meanth = 1.0 - tau * (5.0 - 6.25 * tau) / 3.;
938 xmeanth =
G4Exp(-tau);
939 x2meanth = (1. + 2. *
G4Exp(-2.5 * tau)) / 3.;
944 static const G4double rellossmax = 0.50;
945 if(relloss > rellossmax)
947 return SimpleScattering(xmeanth, x2meanth);
950 G4bool extremesmallstep =
false;
951 G4double tsmall = std::min(tlimitmin, lambdalimit);
953 if(trueStepLength > tsmall)
960 sqrt(trueStepLength / tsmall) *
ComputeTheta0(tsmall, KineticEnergy);
961 extremesmallstep =
true;
964 static constexpr G4double theta0max = CLHEP::pi / 6.;
969 if(theta2 < tausmall)
974 if(theta0 > theta0max)
976 return SimpleScattering(xmeanth, x2meanth);
979 G4double x = theta2 * (1.0 - theta2 / 12.);
982 G4double sth = 2 * sin(0.5 * theta0);
992 G4double xsi = coeffc1 + u * (coeffc2 + coeffc3 * u) + coeffc4 * xx;
1002 if(std::abs(c - 3.) < 0.001)
1006 else if(std::abs(c - 2.) < 0.001)
1015 G4double xmean1 = 1. - (1. - (1. + xsi) * ea) * x / eaa;
1018 if(xmean1 <= 0.999 * xmeanth)
1020 return SimpleScattering(xmeanth, x2meanth);
1032 G4double xmean2 = (x0 + d - (bx - b1 * d) / (c - 2.)) / (1. - d);
1035 G4double f2x0 = c1 / (c * (1. - d));
1036 G4double prob = f2x0 / (f1x0 + f2x0);
1038 G4double qprob = xmeanth / (prob * xmean1 + (1. - prob) * xmean2);
1040 if(rndmEngineMod->
flat() < qprob)
1043 if(rndmEngineMod->
flat() < prob)
1045 cth = 1. +
G4Log(ea + rndmEngineMod->
flat() * eaa) * x;
1049 var = (1.0 - d) * rndmEngineMod->
flat();
1050 if(var < numlim * d)
1053 cth = -1.0 + var * (1.0 - 0.5 * var * c) * (2. + (c - xsi) * x);
1057 cth = 1. + x * (c - xsi - c *
G4Exp(-
G4Log(var + d) / c1));
1063 cth = -1. + 2. * rndmEngineMod->
flat();
1077 std::sqrt((currentKinEnergy + mass) * (KineticEnergy + mass) /
1078 (currentKinEnergy * (currentKinEnergy + 2. * mass) *
1079 KineticEnergy * (KineticEnergy + 2. * mass)));
1080 G4double y = trueStepLength / currentRadLength;
1082 if(particle == positron)
1084 static constexpr G4double xl = 0.6;
1085 static constexpr G4double xh = 0.9;
1086 static constexpr G4double e = 113.0;
1089 G4double tau = std::sqrt(currentKinEnergy * KineticEnergy) / mass;
1090 G4double x = std::sqrt(tau * (tau + 2.) / ((tau + 1.) * (tau + 1.)));
1091 G4double a = 0.994 - 4.08e-3 * Zeff;
1092 G4double b = 7.16 + (52.6 + 365. / Zeff) / Zeff;
1093 G4double c = 1.000 - 4.47e-3 * Zeff;
1097 corr = a * (1. -
G4Exp(-b * x));
1101 corr = c + d *
G4Exp(e * (x - 1.));
1107 G4double y0 = (yh - yl) / (xh - xl);
1111 y *= corr * (1. + Zeff * (1.84035e-4 * Zeff - 1.86427e-2) + 0.41125);
1114 static constexpr G4double c_highland = 13.6 * CLHEP::MeV;
1115 G4double theta0 = c_highland * std::abs(charge) * std::sqrt(y) * invbetacp;
1118 theta0 *= (coeffth1 + coeffth2 *
G4Log(y));
1126 sqrt((tPathLength - zPathLength) * (tPathLength + zPathLength));
1128 static constexpr G4double third = 1. / 3.;
1133 static constexpr G4double kappa = 2.5;
1134 static constexpr G4double kappami1 = 1.5;
1137 if((currentTau >= tausmall) && !insideskin)
1139 if(currentTau < taulim)
1141 latcorr = lambdaeff * kappa * currentTau * currentTau *
1142 (1. - (kappa + 1.) * currentTau * third) * third;
1147 if(currentTau < taubig)
1149 etau =
G4Exp(-currentTau);
1151 latcorr = -kappa * currentTau;
1152 latcorr =
G4Exp(latcorr) / kappami1;
1153 latcorr += 1. - kappa * etau / kappami1;
1154 latcorr *= 2. * lambdaeff * third;
1157 latcorr = std::min(latcorr, r);
1162 if(std::abs(r * sth) < latcorr)
1164 Phi = twopi * rndmEngineMod->
flat();
1168 G4double psi = std::acos(latcorr / (r * sth));
1169 if(rndmEngineMod->
flat() < 0.5)
1188 sqrt((tPathLength - zPathLength) * (tPathLength + zPathLength));
1195 static constexpr G4double reps = 1.e-6;
1196 static constexpr G4double rp0 = 2.2747e+4;
1197 static constexpr G4double rp1 = 4.5980e+0;
1198 static constexpr G4double rp2 = 1.5580e+1;
1199 static constexpr G4double rp3 = 7.1287e-1;
1200 static constexpr G4double rp4 = -5.7069e-1;
1204 u = reps + (1. - 2. * reps) * rndmEngineMod->
flat();
1206 rej = rp0 *
G4Exp(rp1 *
G4Log(v) - rp2 * v) + v * (rp3 + rp4 * v);
1207 }
while(rndmEngineMod->
flat() > rej && ++count < 1000);
1218 static constexpr G4double probv1 = 0.305533;
1219 static constexpr G4double probv2 = 0.955176;
1220 static constexpr G4double vhigh = 3.15;
1230 v = G4RandGauss::shoot(rndmEngineMod, 0., 0.320);
1231 }
while(std::abs(v) >= vhigh);
1239 1. /
G4Exp(
G4Log(1. - rndmEngineMod->
flat() * (1. - w2v)) / 30.)) /
1244 v = (-1. + 1. /
G4Exp(
G4Log(1. - rndmEngineMod->
flat() * (1. - w3v)) /
1249 random = rndmEngineMod->
flat();
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
void set(double x, double y, double z)
Hep3Vector & rotateUz(const Hep3Vector &)
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
G4double GetZeffective() const
static G4LossTableManager * Instance()
const G4Material * GetMaterial() const
G4ProductionCuts * GetProductionCuts() const
G4IonisParamMat * GetIonisation() const
G4double GetRadlen() const
void ProposeMomentumDirection(const G4ThreeVector &Pfinal)
const G4String & GetParticleName() const
static G4Positron * Positron()
static G4Pow * GetInstance()
G4double Z23(G4int Z) const
G4double GetProductionCut(G4int index) const
G4StepPoint * GetPreStepPoint() const
const G4DynamicParticle * GetDynamicParticle() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
const G4Step * GetStep() const
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *particle, G4double KineticEnergy, G4double AtomicNumber, G4double AtomicWeight=0., G4double cut=0., G4double emax=DBL_MAX) override
G4UrbanAdjointMscModel(const G4String &nam="UrbanMsc")
G4double ComputeTrueStepLength(G4double geomStepLength) override
~G4UrbanAdjointMscModel() override
void StartTracking(G4Track *) override
G4double ComputeTheta0(G4double truePathLength, G4double KineticEnergy)
G4double ComputeGeomPathLength(G4double truePathLength) override
G4ThreeVector & SampleScattering(const G4ThreeVector &, G4double safety) override
G4double ComputeTruePathLengthLimit(const G4Track &track, G4double ¤tMinimalStep) override
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
void SetCurrentCouple(const G4MaterialCutsCouple *)
G4double GetDEDX(const G4ParticleDefinition *part, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
G4double ComputeGeomLimit(const G4Track &, G4double &presafety, G4double limit)
G4double GetTransportMeanFreePath(const G4ParticleDefinition *part, G4double kinEnergy)
G4ParticleChangeForMSC * GetParticleChangeForMSC(const G4ParticleDefinition *p=nullptr)
G4double GetEnergy(const G4ParticleDefinition *part, G4double range, const G4MaterialCutsCouple *couple)
G4double GetRange(const G4ParticleDefinition *part, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
G4MscStepLimitType steppingAlgorithm
G4double ConvertTrueToGeom(G4double &tLength, G4double &gLength)
G4double ComputeSafety(const G4ThreeVector &position, G4double limit=DBL_MAX)
G4ThreeVector fDisplacement