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;
277 G4double tau = 0.5 * (w + sqrt(w * w + 4. * c));
283 (eTotalEnergy * eTotalEnergy);
287 static constexpr G4double epsfactor =
294 else if(
eps < epsmax)
299 sigma *=
ChargeSquare * AtomicNumber * AtomicNumber / (beta2 * bg2);
306 while((iZ >= 0) && (Zdat[iZ] >= AtomicNumber))
316 (AtomicNumber - ZZ1) * (AtomicNumber + ZZ1) / ((ZZ2 - ZZ1) * (ZZ2 + ZZ1));
319 static constexpr G4double sigmafactor =
328 static constexpr G4double sig0[15] = {
336 static constexpr G4double Tdat[22] = {
345 if(eKineticEnergy <= Tlim)
349 while((iT >= 0) && (Tdat[iT] >= eKineticEnergy))
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);
460 distance *= (1.15 - 9.76e-4 *
Zeff);
464 distance *= (1.20 -
Zeff * (1.62e-2 - 9.22e-5 *
Zeff));
506 rat = 1.e-3 / (rat * (10. + rat));
604 rat = 1.e-3 / (rat * (10 + rat));
658 rat = 1.e-3 / (rat * (10 + rat));
822 if(
par1 *
par3 * geomStepLength < 1.)
834 if(tlength < geomStepLength)
836 tlength = geomStepLength;
873 if(std::fabs(cth) >= 1.0)
878 G4double sth = sqrt((1.0 - cth) * (1.0 + cth));
884 newDirection.
rotateUz(oldDirection);
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)
950 G4bool extremesmallstep =
false;
953 if(trueStepLength > tsmall)
960 sqrt(trueStepLength / tsmall) *
ComputeTheta0(tsmall, KineticEnergy);
961 extremesmallstep =
true;
974 if(theta0 > theta0max)
979 G4double x = theta2 * (1.0 - theta2 / 12.);
982 G4double sth = 2 * sin(0.5 * theta0);
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)
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);
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));
1079 KineticEnergy * (KineticEnergy + 2. *
mass)));
1085 static constexpr G4double xh = 0.9;
1086 static constexpr G4double e = 113.0;
1090 G4double x = std::sqrt(tau * (tau + 2.) / ((tau + 1.) * (tau + 1.)));
1097 corr = a * (1. -
G4Exp(-b * x));
1101 corr = c + d *
G4Exp(e * (x - 1.));
1111 y *= corr * (1. +
Zeff * (1.84035e-4 *
Zeff - 1.86427e-2) + 0.41125);
1115 G4double theta0 = c_highland * std::abs(
charge) * std::sqrt(y) * invbetacp;
1133 static constexpr G4double kappa = 2.5;
1134 static constexpr G4double kappami1 = 1.5;
1152 latcorr =
G4Exp(latcorr) / kappami1;
1153 latcorr += 1. - kappa * etau / kappami1;
1162 if(std::abs(r * sth) < latcorr)
1168 G4double psi = std::acos(latcorr / (r * sth));
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;
1206 rej = rp0 *
G4Exp(rp1 *
G4Log(v) - rp2 * v) + v * (rp3 + rp4 * v);
1218 static constexpr G4double probv1 = 0.305533;
1219 static constexpr G4double probv2 = 0.955176;
1220 static constexpr G4double vhigh = 3.15;
1231 }
while(std::abs(v) >= vhigh);
static const G4double eps
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
static constexpr double twopi
static constexpr double nm
static constexpr double mm
static constexpr double eV
static constexpr double um
static constexpr double MeV
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
CLHEP::HepRandomEngine * rndmEngineMod
G4double Randomizetlimit()
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *particle, G4double KineticEnergy, G4double AtomicNumber, G4double AtomicWeight=0., G4double cut=0., G4double emax=DBL_MAX) override
G4bool latDisplasmentbackup
G4UrbanAdjointMscModel(const G4String &nam="UrbanMsc")
void SampleDisplacement(G4double sinTheta, G4double phi)
G4double currentKinEnergy
G4ParticleChangeForMSC * fParticleChange
G4double ComputeTrueStepLength(G4double geomStepLength) override
const G4ParticleDefinition * positron
~G4UrbanAdjointMscModel() override
void StartTracking(G4Track *) override
G4double currentRadLength
const G4ParticleDefinition * particle
G4double ComputeTheta0(G4double truePathLength, G4double KineticEnergy)
G4LossTableManager * theManager
G4double SimpleScattering(G4double xmeanth, G4double x2meanth)
G4double SampleCosineTheta(G4double trueStepLength, G4double KineticEnergy)
void SampleDisplacementNew(G4double sinTheta, G4double phi)
G4double ComputeGeomPathLength(G4double truePathLength) override
G4ThreeVector & SampleScattering(const G4ThreeVector &, G4double safety) override
G4double ComputeTruePathLengthLimit(const G4Track &track, G4double ¤tMinimalStep) override
G4int currentMaterialIndex
const G4MaterialCutsCouple * couple
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
void SetParticle(const G4ParticleDefinition *)
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
static constexpr double electron_mass_c2
static constexpr double barn
static constexpr double keV
static constexpr double twopi
static constexpr double MeV
static constexpr double Bohr_radius
static constexpr double classic_electr_radius
static constexpr double eV
static constexpr double hbarc
static constexpr double pi
ThreeVector shoot(const G4int Ap, const G4int Af)
T max(const T t1, const T t2)
brief Return the largest of the two arguments
T min(const T t1, const T t2)
brief Return the smallest of the two arguments