CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
UrbanMscModel93 Class Reference

#include <UrbanMscModel93.h>

Inheritance diagram for UrbanMscModel93:

Public Member Functions

G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *particle, G4double KineticEnergy, G4double AtomicNumber, G4double AtomicWeight=0., G4double cut=0., G4double emax=DBL_MAX) override
 
G4double ComputeGeomPathLength (G4double truePathLength) override
 
G4double ComputeTheta0 (G4double truePathLength, G4double KineticEnergy)
 
G4double ComputeTruePathLengthLimit (const G4Track &track, G4double &currentMinimalStep) override
 
G4double ComputeTrueStepLength (G4double geomStepLength) override
 
void Initialise (const G4ParticleDefinition *, const G4DataVector &) override
 
G4ThreeVector & SampleScattering (const G4ThreeVector &, G4double safety) override
 
void StartTracking (G4Track *) override
 
 UrbanMscModel93 (const G4String &nam="UrbanMsc93")
 
 ~UrbanMscModel93 () override
 

Private Member Functions

G4double LatCorrelation ()
 
UrbanMscModel93operator= (const UrbanMscModel93 &right)=delete
 
G4double SampleCosineTheta (G4double trueStepLength, G4double KineticEnergy)
 
G4double SampleDisplacement ()
 
void SetParticle (const G4ParticleDefinition *)
 
G4double SimpleScattering (G4double xmeanth, G4double x2meanth)
 
void UpdateCache ()
 
 UrbanMscModel93 (const UrbanMscModel93 &)=delete
 

Private Attributes

G4double charge
 
G4double ChargeSquare
 
G4double coeffc1
 
G4double coeffc2
 
G4double coeffth1
 
G4double coeffth2
 
const G4MaterialCutsCouple * couple
 
G4double currentKinEnergy
 
G4int currentMaterialIndex
 
G4double currentRadLength
 
G4double currentRange
 
G4double currentTau
 
G4double ea
 
G4double eaa
 
G4bool firstStep
 
G4ParticleChangeForMSC * fParticleChange
 
G4double fr
 
G4double geombig
 
G4double geomlimit
 
G4double geommin
 
G4bool inside
 
G4bool insideskin
 
G4double lambda0
 
G4double lambdaeff
 
G4double lambdalimit
 
G4double lnZ
 
G4double mass
 
G4double masslimite
 
G4double numlim
 
G4double par1
 
G4double par2
 
G4double par3
 
const G4ParticleDefinition * particle
 
G4double presafety
 
G4double rangeinit
 
G4double rellossmax
 
G4double scr1
 
G4double scr1ini
 
G4double scr2
 
G4double scr2ini
 
G4double skindepth
 
G4double smallstep
 
G4double stepmin
 
G4double taubig
 
G4double taulim
 
G4double tausmall
 
G4double tgeom
 
G4LossTableManager * theManager
 
G4double theta0max
 
G4double third
 
G4double tlimit
 
G4double tlimitmin
 
G4double tlimitminfix
 
G4double tPathLength
 
G4double xsi
 
G4double y
 
G4double Z2
 
G4double Z23
 
G4double Zeff
 
G4double Zold
 
G4double zPathLength
 

Detailed Description

Definition at line 59 of file UrbanMscModel93.h.

Constructor & Destructor Documentation

UrbanMscModel93::UrbanMscModel93 ( const G4String &  nam = "UrbanMsc93")

Definition at line 39 of file UrbanMscModel93.cc.

References charge, ChargeSquare, coeffc1, coeffc2, coeffth1, coeffth2, couple, currentKinEnergy, currentMaterialIndex, currentRadLength, currentRange, currentTau, ea, eaa, firstStep, fParticleChange, fr, geombig, geomlimit, geommin, inside, insideskin, lambda0, lambdaeff, lambdalimit, lnZ, mass, masslimite, MeV, numlim, par1, par2, par3, particle, pi, presafety, rangeinit, rellossmax, scr1, scr1ini, scr2, scr2ini, skindepth, smallstep, stepmin, taubig, taulim, tausmall, tgeom, theManager, theta0max, third, tlimit, tlimitmin, tlimitminfix, tPathLength, xsi, y, Z2, Z23, Zeff, Zold, and zPathLength.

40  : G4VMscModel(nam)
41 {
42  masslimite = 0.6*MeV;
43  lambdalimit = 1.*mm;
44  fr = 0.02;
45  taubig = 8.0;
46  tausmall = 1.e-16;
47  taulim = 1.e-6;
49  tlimitminfix = 1.e-6*mm;
51  smallstep = 1.e10;
52  currentRange = 0. ;
53  rangeinit = 0.;
54  tlimit = 1.e10*mm;
55  tlimitmin = 10.*tlimitminfix;
56  tgeom = 1.e50*mm;
57  geombig = 1.e50*mm;
58  geommin = 1.e-3*mm;
60  presafety = 0.*mm;
61 
62  y = 0.;
63 
64  Zold = 0.;
65  Zeff = 1.;
66  Z2 = 1.;
67  Z23 = 1.;
68  lnZ = 0.;
69  coeffth1 = 0.;
70  coeffth2 = 0.;
71  coeffc1 = 0.;
72  coeffc2 = 0.;
73  scr1ini = fine_structure_const*fine_structure_const*
74  electron_mass_c2*electron_mass_c2/(0.885*0.885*4.*pi);
75  scr2ini = 3.76*fine_structure_const*fine_structure_const;
76  scr1 = 0.;
77  scr2 = 0.;
78 
79  theta0max = pi/6.;
80  rellossmax = 0.50;
81  third = 1./3.;
82  particle = nullptr;
83  theManager = G4LossTableManager::Instance();
84  firstStep = true;
85  inside = false;
86  insideskin = false;
87 
88  numlim = 0.01;
89  xsi = 3.;
90  ea = G4Exp(-xsi);
91  eaa = 1.-ea ;
92 
93  skindepth = skin*stepmin;
94 
95  mass = proton_mass_c2;
96  charge = ChargeSquare = 1.0;
98  = zPathLength = par1 = par2 = par3 = 0;
99 
101  fParticleChange = nullptr;
102  couple = nullptr;
103  SetSampleZ(false);
104 }
const G4ParticleDefinition * particle
const G4MaterialCutsCouple * couple
G4ParticleChangeForMSC * fParticleChange
G4double currentRadLength
const Double_t pi
const double MeV
G4LossTableManager * theManager
G4double currentKinEnergy
UrbanMscModel93::~UrbanMscModel93 ( )
override

Definition at line 108 of file UrbanMscModel93.cc.

109 {}
UrbanMscModel93::UrbanMscModel93 ( const UrbanMscModel93 )
privatedelete

Member Function Documentation

G4double UrbanMscModel93::ComputeCrossSectionPerAtom ( const G4ParticleDefinition *  particle,
G4double  KineticEnergy,
G4double  AtomicNumber,
G4double  AtomicWeight = 0.,
G4double  cut = 0.,
G4double  emax = DBL_MAX 
)
override

Definition at line 133 of file UrbanMscModel93.cc.

References EnergyCorrector::c, alignmentValidation::c1, charge, ChargeSquare, corr, hbarc, mass, MeV, funct::pow(), SetParticle(), mathSSE::sqrt(), pat::TAU, metsig::tau, w, and Z23.

138 {
139  static const G4double sigmafactor =
140  twopi*classic_electr_radius*classic_electr_radius;
141  static const G4double epsfactor = 2.*electron_mass_c2*electron_mass_c2*
142  Bohr_radius*Bohr_radius/(hbarc*hbarc);
143  static const G4double epsmin = 1.e-4 , epsmax = 1.e10;
144 
145  static const G4double Zdat[15] = { 4., 6., 13., 20., 26., 29., 32., 38., 47.,
146  50., 56., 64., 74., 79., 82. };
147 
148  static const G4double Tdat[22] = { 100*eV, 200*eV, 400*eV, 700*eV,
149  1*keV, 2*keV, 4*keV, 7*keV,
150  10*keV, 20*keV, 40*keV, 70*keV,
151  100*keV, 200*keV, 400*keV, 700*keV,
152  1*MeV, 2*MeV, 4*MeV, 7*MeV,
153  10*MeV, 20*MeV};
154 
155  // corr. factors for e-/e+ lambda for T <= Tlim
156  static const G4double celectron[15][22] =
157  {{1.125,1.072,1.051,1.047,1.047,1.050,1.052,1.054,
158  1.054,1.057,1.062,1.069,1.075,1.090,1.105,1.111,
159  1.112,1.108,1.100,1.093,1.089,1.087 },
160  {1.408,1.246,1.143,1.096,1.077,1.059,1.053,1.051,
161  1.052,1.053,1.058,1.065,1.072,1.087,1.101,1.108,
162  1.109,1.105,1.097,1.090,1.086,1.082 },
163  {2.833,2.268,1.861,1.612,1.486,1.309,1.204,1.156,
164  1.136,1.114,1.106,1.106,1.109,1.119,1.129,1.132,
165  1.131,1.124,1.113,1.104,1.099,1.098 },
166  {3.879,3.016,2.380,2.007,1.818,1.535,1.340,1.236,
167  1.190,1.133,1.107,1.099,1.098,1.103,1.110,1.113,
168  1.112,1.105,1.096,1.089,1.085,1.098 },
169  {6.937,4.330,2.886,2.256,1.987,1.628,1.395,1.265,
170  1.203,1.122,1.080,1.065,1.061,1.063,1.070,1.073,
171  1.073,1.070,1.064,1.059,1.056,1.056 },
172  {9.616,5.708,3.424,2.551,2.204,1.762,1.485,1.330,
173  1.256,1.155,1.099,1.077,1.070,1.068,1.072,1.074,
174  1.074,1.070,1.063,1.059,1.056,1.052 },
175  {11.72,6.364,3.811,2.806,2.401,1.884,1.564,1.386,
176  1.300,1.180,1.112,1.082,1.073,1.066,1.068,1.069,
177  1.068,1.064,1.059,1.054,1.051,1.050 },
178  {18.08,8.601,4.569,3.183,2.662,2.025,1.646,1.439,
179  1.339,1.195,1.108,1.068,1.053,1.040,1.039,1.039,
180  1.039,1.037,1.034,1.031,1.030,1.036 },
181  {18.22,10.48,5.333,3.713,3.115,2.367,1.898,1.631,
182  1.498,1.301,1.171,1.105,1.077,1.048,1.036,1.033,
183  1.031,1.028,1.024,1.022,1.021,1.024 },
184  {14.14,10.65,5.710,3.929,3.266,2.453,1.951,1.669,
185  1.528,1.319,1.178,1.106,1.075,1.040,1.027,1.022,
186  1.020,1.017,1.015,1.013,1.013,1.020 },
187  {14.11,11.73,6.312,4.240,3.478,2.566,2.022,1.720,
188  1.569,1.342,1.186,1.102,1.065,1.022,1.003,0.997,
189  0.995,0.993,0.993,0.993,0.993,1.011 },
190  {22.76,20.01,8.835,5.287,4.144,2.901,2.219,1.855,
191  1.677,1.410,1.224,1.121,1.073,1.014,0.986,0.976,
192  0.974,0.972,0.973,0.974,0.975,0.987 },
193  {50.77,40.85,14.13,7.184,5.284,3.435,2.520,2.059,
194  1.837,1.512,1.283,1.153,1.091,1.010,0.969,0.954,
195  0.950,0.947,0.949,0.952,0.954,0.963 },
196  {65.87,59.06,15.87,7.570,5.567,3.650,2.682,2.182,
197  1.939,1.579,1.325,1.178,1.108,1.014,0.965,0.947,
198  0.941,0.938,0.940,0.944,0.946,0.954 },
199  {55.60,47.34,15.92,7.810,5.755,3.767,2.760,2.239,
200  1.985,1.609,1.343,1.188,1.113,1.013,0.960,0.939,
201  0.933,0.930,0.933,0.936,0.939,0.949 }};
202 
203  static const G4double cpositron[15][22] = {
204  {2.589,2.044,1.658,1.446,1.347,1.217,1.144,1.110,
205  1.097,1.083,1.080,1.086,1.092,1.108,1.123,1.131,
206  1.131,1.126,1.117,1.108,1.103,1.100 },
207  {3.904,2.794,2.079,1.710,1.543,1.325,1.202,1.145,
208  1.122,1.096,1.089,1.092,1.098,1.114,1.130,1.137,
209  1.138,1.132,1.122,1.113,1.108,1.102 },
210  {7.970,6.080,4.442,3.398,2.872,2.127,1.672,1.451,
211  1.357,1.246,1.194,1.179,1.178,1.188,1.201,1.205,
212  1.203,1.190,1.173,1.159,1.151,1.145 },
213  {9.714,7.607,5.747,4.493,3.815,2.777,2.079,1.715,
214  1.553,1.353,1.253,1.219,1.211,1.214,1.225,1.228,
215  1.225,1.210,1.191,1.175,1.166,1.174 },
216  {17.97,12.95,8.628,6.065,4.849,3.222,2.275,1.820,
217  1.624,1.382,1.259,1.214,1.202,1.202,1.214,1.219,
218  1.217,1.203,1.184,1.169,1.160,1.151 },
219  {24.83,17.06,10.84,7.355,5.767,3.707,2.546,1.996,
220  1.759,1.465,1.311,1.252,1.234,1.228,1.238,1.241,
221  1.237,1.222,1.201,1.184,1.174,1.159 },
222  {23.26,17.15,11.52,8.049,6.375,4.114,2.792,2.155,
223  1.880,1.535,1.353,1.281,1.258,1.247,1.254,1.256,
224  1.252,1.234,1.212,1.194,1.183,1.170 },
225  {22.33,18.01,12.86,9.212,7.336,4.702,3.117,2.348,
226  2.015,1.602,1.385,1.297,1.268,1.251,1.256,1.258,
227  1.254,1.237,1.214,1.195,1.185,1.179 },
228  {33.91,24.13,15.71,10.80,8.507,5.467,3.692,2.808,
229  2.407,1.873,1.564,1.425,1.374,1.330,1.324,1.320,
230  1.312,1.288,1.258,1.235,1.221,1.205 },
231  {32.14,24.11,16.30,11.40,9.015,5.782,3.868,2.917,
232  2.490,1.925,1.596,1.447,1.391,1.342,1.332,1.327,
233  1.320,1.294,1.264,1.240,1.226,1.214 },
234  {29.51,24.07,17.19,12.28,9.766,6.238,4.112,3.066,
235  2.602,1.995,1.641,1.477,1.414,1.356,1.342,1.336,
236  1.328,1.302,1.270,1.245,1.231,1.233 },
237  {38.19,30.85,21.76,15.35,12.07,7.521,4.812,3.498,
238  2.926,2.188,1.763,1.563,1.484,1.405,1.382,1.371,
239  1.361,1.330,1.294,1.267,1.251,1.239 },
240  {49.71,39.80,27.96,19.63,15.36,9.407,5.863,4.155,
241  3.417,2.478,1.944,1.692,1.589,1.480,1.441,1.423,
242  1.409,1.372,1.330,1.298,1.280,1.258 },
243  {59.25,45.08,30.36,20.83,16.15,9.834,6.166,4.407,
244  3.641,2.648,2.064,1.779,1.661,1.531,1.482,1.459,
245  1.442,1.400,1.354,1.319,1.299,1.272 },
246  {56.38,44.29,30.50,21.18,16.51,10.11,6.354,4.542,
247  3.752,2.724,2.116,1.817,1.692,1.554,1.499,1.474,
248  1.456,1.412,1.364,1.328,1.307,1.282 }};
249 
250  //data/corrections for T > Tlim
251  static const G4double Tlim = 10.*MeV;
252  static const G4double beta2lim = Tlim*(Tlim+2.*electron_mass_c2)/
253  ((Tlim+electron_mass_c2)*(Tlim+electron_mass_c2));
254  static const G4double bg2lim = Tlim*(Tlim+2.*electron_mass_c2)/
255  (electron_mass_c2*electron_mass_c2);
256 
257  static const G4double sig0[15] = {
258  0.2672*barn, 0.5922*barn, 2.653*barn, 6.235*barn,
259  11.69*barn , 13.24*barn , 16.12*barn, 23.00*barn ,
260  35.13*barn , 39.95*barn , 50.85*barn, 67.19*barn ,
261  91.15*barn , 104.4*barn , 113.1*barn};
262 
263  static const G4double hecorr[15] = {
264  120.70, 117.50, 105.00, 92.92, 79.23, 74.510, 68.29,
265  57.39, 41.97, 36.14, 24.53, 10.21, -7.855, -16.84,
266  -22.30};
267 
268  G4double sigma;
269  SetParticle(part);
270 
271  Z23 = pow(AtomicNumber,2./3.);
272 
273  // correction if particle .ne. e-/e+
274  // compute equivalent kinetic energy
275  // lambda depends on p*beta ....
276 
277  G4double eKineticEnergy = KineticEnergy;
278 
279  if(mass > electron_mass_c2)
280  {
281  G4double TAU = KineticEnergy/mass ;
282  G4double c = mass*TAU*(TAU+2.)/(electron_mass_c2*(TAU+1.)) ;
283  G4double w = c-2. ;
284  G4double tau = 0.5*(w+sqrt(w*w+4.*c)) ;
285  eKineticEnergy = electron_mass_c2*tau ;
286  }
287 
288  G4double eTotalEnergy = eKineticEnergy + electron_mass_c2 ;
289  G4double beta2 = eKineticEnergy*(eTotalEnergy+electron_mass_c2)
290  /(eTotalEnergy*eTotalEnergy);
291  G4double bg2 = eKineticEnergy*(eTotalEnergy+electron_mass_c2)
292  /(electron_mass_c2*electron_mass_c2);
293 
294  G4double eps = epsfactor*bg2/Z23;
295 
296  if (eps<epsmin) sigma = 2.*eps*eps;
297  else if(eps<epsmax) sigma = G4Log(1.+2.*eps)-2.*eps/(1.+2.*eps);
298  else sigma = G4Log(2.*eps)-1.+1./eps;
299 
300  sigma *= ChargeSquare*AtomicNumber*AtomicNumber/(beta2*bg2);
301 
302  // interpolate in AtomicNumber and beta2
303  G4double c1,c2,cc1,cc2,corr;
304 
305  // get bin number in Z
306  G4int iZ = 14;
307  while ((iZ>=0)&&(Zdat[iZ]>=AtomicNumber)) iZ -= 1;
308  if (iZ==14) iZ = 13;
309  if (iZ==-1) iZ = 0 ;
310 
311  G4double ZZ1 = Zdat[iZ];
312  G4double ZZ2 = Zdat[iZ+1];
313  G4double ratZ = (AtomicNumber-ZZ1)*(AtomicNumber+ZZ1)/
314  ((ZZ2-ZZ1)*(ZZ2+ZZ1));
315 
316  if(eKineticEnergy <= Tlim)
317  {
318  // get bin number in T (beta2)
319  G4int iT = 21;
320  while ((iT>=0)&&(Tdat[iT]>=eKineticEnergy)) iT -= 1;
321  if(iT==21) iT = 20;
322  if(iT==-1) iT = 0 ;
323 
324  // calculate betasquare values
325  G4double T = Tdat[iT], E = T + electron_mass_c2;
326  G4double b2small = T*(E+electron_mass_c2)/(E*E);
327 
328  T = Tdat[iT+1]; E = T + electron_mass_c2;
329  G4double b2big = T*(E+electron_mass_c2)/(E*E);
330  G4double ratb2 = (beta2-b2small)/(b2big-b2small);
331 
332  if (charge < 0.)
333  {
334  c1 = celectron[iZ][iT];
335  c2 = celectron[iZ+1][iT];
336  cc1 = c1+ratZ*(c2-c1);
337 
338  c1 = celectron[iZ][iT+1];
339  c2 = celectron[iZ+1][iT+1];
340  cc2 = c1+ratZ*(c2-c1);
341 
342  corr = cc1+ratb2*(cc2-cc1);
343 
344  sigma *= sigmafactor/corr;
345  }
346  else
347  {
348  c1 = cpositron[iZ][iT];
349  c2 = cpositron[iZ+1][iT];
350  cc1 = c1+ratZ*(c2-c1);
351 
352  c1 = cpositron[iZ][iT+1];
353  c2 = cpositron[iZ+1][iT+1];
354  cc2 = c1+ratZ*(c2-c1);
355 
356  corr = cc1+ratb2*(cc2-cc1);
357 
358  sigma *= sigmafactor/corr;
359  }
360  }
361  else
362  {
363  c1 = bg2lim*sig0[iZ]*(1.+hecorr[iZ]*(beta2-beta2lim))/bg2;
364  c2 = bg2lim*sig0[iZ+1]*(1.+hecorr[iZ+1]*(beta2-beta2lim))/bg2;
365  if((AtomicNumber >= ZZ1) && (AtomicNumber <= ZZ2))
366  sigma = c1+ratZ*(c2-c1) ;
367  else if(AtomicNumber < ZZ1)
368  sigma = AtomicNumber*AtomicNumber*c1/(ZZ1*ZZ1);
369  else if(AtomicNumber > ZZ2)
370  sigma = AtomicNumber*AtomicNumber*c2/(ZZ2*ZZ2);
371  }
372  return sigma;
373 
374 }
const double hbarc
Definition: MathUtil.h:18
const double w
Definition: UKUtility.cc:23
void SetParticle(const G4ParticleDefinition *)
const double MeV
T sqrt(T t)
Definition: SSEVec.h:18
JetCorrectorParameters corr
Definition: classes.h:5
part
Definition: HCALResponse.h:20
long double T
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
G4double UrbanMscModel93::ComputeGeomPathLength ( G4double  truePathLength)
override

Definition at line 608 of file UrbanMscModel93.cc.

References couple, currentKinEnergy, currentRange, firstStep, insideskin, lambda0, lambdaeff, mass, par1, par2, par3, particle, stepmin, metsig::tau, taulim, tausmall, third, tlimitminfix, tPathLength, and zPathLength.

609 {
610  firstStep = false;
611  lambdaeff = lambda0;
612  par1 = -1. ;
613  par2 = par3 = 0. ;
614 
615  // do the true -> geom transformation
617 
618  // z = t for very small tPathLength
619  if(tPathLength < tlimitminfix) return zPathLength;
620 
621  // this correction needed to run MSC with eIoni and eBrem inactivated
622  // and makes no harm for a normal run
625 
626  G4double tau = tPathLength/lambda0 ;
627 
628  if ((tau <= tausmall) || insideskin) {
631  return zPathLength;
632  }
633 
634  G4double zmean;
635  if (tPathLength < currentRange*dtrl) {
636  if(tau < taulim) zmean = tPathLength*(1.-0.5*tau) ;
637  else zmean = lambda0*(1.-G4Exp(-tau));
638  } else if(currentKinEnergy < mass || tPathLength == currentRange) {
639  par1 = 1./currentRange ;
640  par2 = 1./(par1*lambda0) ;
641  par3 = 1.+par2 ;
643  zmean = (1.-G4Exp(par3*G4Log(1.-tPathLength/currentRange)))/(par1*par3) ;
644  else
645  zmean = 1./(par1*par3) ;
646  } else {
647  G4double T1 = GetEnergy(particle,currentRange-tPathLength,couple);
648  G4double lambda1 = GetTransportMeanFreePath(particle,T1);
649 
650  par1 = (lambda0-lambda1)/(lambda0*tPathLength) ;
651  par2 = 1./(par1*lambda0) ;
652  par3 = 1.+par2 ;
653  zmean = (1.-G4Exp(par3*G4Log(lambda1/lambda0)))/(par1*par3) ;
654  }
655 
656  zPathLength = zmean ;
657 
658  // sample z
659  if(samplez)
660  {
661  const G4double ztmax = 0.99 ;
662  G4double zt = zmean/tPathLength ;
663 
664  if (tPathLength > stepmin && zt < ztmax)
665  {
666  G4double u,cz1;
667  if(zt >= third)
668  {
669  G4double cz = 0.5*(3.*zt-1.)/(1.-zt) ;
670  cz1 = 1.+cz ;
671  G4double u0 = cz/cz1 ;
672  G4double grej ;
673  do {
674  u = G4Exp(G4Log(G4UniformRand())/cz1) ;
675  grej = G4Exp(cz*G4Log(u/u0))*(1.-u)/(1.-u0) ;
676  } while (grej < G4UniformRand()) ;
677  }
678  else
679  {
680  cz1 = 1./zt-1.;
681  u = 1.-G4Exp(G4Log(G4UniformRand())/cz1) ;
682  }
683  zPathLength = tPathLength*u ;
684  }
685  }
686 
688  //G4cout << "zPathLength= " << zPathLength << " lambda1= " << lambda0 << G4endl;
689  return zPathLength;
690 }
const G4ParticleDefinition * particle
const G4MaterialCutsCouple * couple
G4double currentKinEnergy
G4double UrbanMscModel93::ComputeTheta0 ( G4double  truePathLength,
G4double  KineticEnergy 
)
inline

Definition at line 207 of file UrbanMscModel93.h.

References funct::abs(), charge, coeffth1, coeffth2, currentKinEnergy, currentRadLength, mass, MeV, mathSSE::sqrt(), and y.

Referenced by SampleCosineTheta().

209 {
210  // for all particles take the width of the central part
211  // from a parametrization similar to the Highland formula
212  // ( Highland formula: Particle Physics Booklet, July 2002, eq. 26.10)
213  static const G4double c_highland = 13.6*CLHEP::MeV;
214  G4double invbetacp = sqrt((currentKinEnergy+mass)*(KineticEnergy+mass)/
216  KineticEnergy*(KineticEnergy+2.*mass)));
217  y = trueStepLength/currentRadLength;
218  G4double theta0 = c_highland*std::abs(charge)*sqrt(y)*invbetacp;
219  // correction factor from e- scattering data
220  theta0 *= (coeffth1+coeffth2*G4Log(y));
221 
222  return theta0;
223 }
G4double currentRadLength
const double MeV
T sqrt(T t)
Definition: SSEVec.h:18
G4double currentKinEnergy
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
G4double UrbanMscModel93::ComputeTruePathLengthLimit ( const G4Track &  track,
G4double &  currentMinimalStep 
)
override

Definition at line 391 of file UrbanMscModel93.cc.

References couple, currentKinEnergy, currentMaterialIndex, currentRange, firstStep, fr, geombig, geomlimit, geommin, inside, insideskin, lambda0, lambdalimit, mass, masslimite, MeV, particle, presafety, rangeinit, skindepth, smallstep, stepmin, tgeom, tlimit, tlimitmin, tlimitminfix, and tPathLength.

394 {
395  tPathLength = currentMinimalStep;
396  const G4DynamicParticle* dp = track.GetDynamicParticle();
397  G4StepPoint* sp = track.GetStep()->GetPreStepPoint();
398  G4StepStatus stepStatus = sp->GetStepStatus();
399  couple = track.GetMaterialCutsCouple();
400  SetCurrentCouple(couple);
401  currentMaterialIndex = couple->GetIndex();
402  currentKinEnergy = dp->GetKineticEnergy();
404  lambda0 = GetTransportMeanFreePath(particle,currentKinEnergy);
405 
406  // stop here if small range particle
407  if(inside || tPathLength < tlimitminfix) {
408  return ConvertTrueToGeom(tPathLength, currentMinimalStep);
409  }
410 
412 
413  presafety = sp->GetSafety();
414 
415  // G4cout << "Urban2::StepLimit tPathLength= "
416  // <<tPathLength<<" safety= " << presafety
417  // << " range= " <<currentRange<< " lambda= "<<lambda0
418  // << " Alg: " << steppingAlgorithm <<G4endl;
419 
420  // far from geometry boundary
421  if(currentRange < presafety)
422  {
423  inside = true;
424  return ConvertTrueToGeom(tPathLength, currentMinimalStep);
425  }
426 
427  // standard version
428  //
429  if (steppingAlgorithm == fUseDistanceToBoundary)
430  {
431  //compute geomlimit and presafety
432  geomlimit = ComputeGeomLimit(track, presafety, currentRange);
433 
434  // is it far from boundary ?
435  if(currentRange < presafety)
436  {
437  inside = true;
438  return ConvertTrueToGeom(tPathLength, currentMinimalStep);
439  }
440 
441  smallstep += 1.;
442  insideskin = false;
443 
444  if(firstStep || stepStatus == fGeomBoundary)
445  {
447  if(firstStep) smallstep = 1.e10;
448  else smallstep = 1.;
449 
450  //define stepmin here (it depends on lambda!)
451  //rough estimation of lambda_elastic/lambda_transport
452  G4double rat = currentKinEnergy/MeV ;
453  rat = 1.e-3/(rat*(10.+rat)) ;
454  //stepmin ~ lambda_elastic
455  stepmin = rat*lambda0;
456  skindepth = skin*stepmin;
457  //define tlimitmin
458  tlimitmin = 10.*stepmin;
460  //G4cout << "rangeinit= " << rangeinit << " stepmin= " << stepmin
461  // << " tlimitmin= " << tlimitmin << " geomlimit= " << geomlimit <<G4endl;
462  // constraint from the geometry
463  if((geomlimit < geombig) && (geomlimit > geommin))
464  {
465  // geomlimit is a geometrical step length
466  // transform it to true path length (estimation)
467  if((1.-geomlimit/lambda0) > 0.)
468  geomlimit = -lambda0*G4Log(1.-geomlimit/lambda0)+tlimitmin ;
469 
470  if(stepStatus == fGeomBoundary)
471  tgeom = geomlimit/facgeom;
472  else
473  tgeom = 2.*geomlimit/facgeom;
474  }
475  else
476  tgeom = geombig;
477  }
478 
479 
480  //step limit
481  tlimit = facrange*rangeinit;
482  if(tlimit < facsafety*presafety)
483  tlimit = facsafety*presafety;
484 
485  //lower limit for tlimit
487 
488  if(tlimit > tgeom) tlimit = tgeom;
489 
490  //G4cout << "tgeom= " << tgeom << " geomlimit= " << geomlimit
491  // << " tlimit= " << tlimit << " presafety= " << presafety << G4endl;
492 
493  // shortcut
494  if((tPathLength < tlimit) && (tPathLength < presafety) &&
495  (smallstep >= skin) && (tPathLength < geomlimit-0.999*skindepth))
496  return ConvertTrueToGeom(tPathLength, currentMinimalStep);
497 
498  // step reduction near to boundary
499  if(smallstep < skin)
500  {
501  tlimit = stepmin;
502  insideskin = true;
503  }
504  else if(geomlimit < geombig)
505  {
506  if(geomlimit > skindepth)
507  {
508  if(tlimit > geomlimit-0.999*skindepth)
509  tlimit = geomlimit-0.999*skindepth;
510  }
511  else
512  {
513  insideskin = true;
514  if(tlimit > stepmin) tlimit = stepmin;
515  }
516  }
517 
518  if(tlimit < stepmin) tlimit = stepmin;
519 
520  // randomize 1st step or 1st 'normal' step in volume
521  if(firstStep || ((smallstep == skin) && !insideskin))
522  {
523  G4double temptlimit = tlimit;
524  if(temptlimit > tlimitmin)
525  {
526  do {
527  temptlimit = G4RandGauss::shoot(tlimit,0.3*tlimit);
528  } while ((temptlimit < tlimitmin) ||
529  (temptlimit > 2.*tlimit-tlimitmin));
530  }
531  else
532  temptlimit = tlimitmin;
533  if(tPathLength > temptlimit) tPathLength = temptlimit;
534  }
535  else
536  {
538  }
539 
540  }
541  // for 'normal' simulation with or without magnetic field
542  // there no small step/single scattering at boundaries
543  else if(steppingAlgorithm == fUseSafety)
544  {
545  // compute presafety again if presafety <= 0 and no boundary
546  // i.e. when it is needed for optimization purposes
547  if((stepStatus != fGeomBoundary) && (presafety < tlimitminfix))
548  presafety = ComputeSafety(sp->GetPosition(),tPathLength);
549 
550  // is far from boundary
551  if(currentRange < presafety)
552  {
553  inside = true;
554  return ConvertTrueToGeom(tPathLength, currentMinimalStep);
555  }
556 
557  if(firstStep || stepStatus == fGeomBoundary)
558  {
559  rangeinit = currentRange;
560  fr = facrange;
561  // 9.1 like stepping for e+/e- only (not for muons,hadrons)
562  if(mass < masslimite)
563  {
564  if(lambda0 > currentRange)
565  rangeinit = lambda0;
566  if(lambda0 > lambdalimit)
567  fr *= 0.75+0.25*lambda0/lambdalimit;
568  }
569 
570  //lower limit for tlimit
571  G4double rat = currentKinEnergy/MeV ;
572  rat = 1.e-3/(rat*(10.+rat)) ;
573  tlimitmin = 10.*lambda0*rat;
575  }
576  //step limit
577  tlimit = fr*rangeinit;
578 
579  if(tlimit < facsafety*presafety)
580  tlimit = facsafety*presafety;
581 
582  //lower limit for tlimit
584 
586 
587  }
588 
589  // version similar to 7.1 (needed for some experiments)
590  else
591  {
592  if (stepStatus == fGeomBoundary)
593  {
594  if (currentRange > lambda0) tlimit = facrange*currentRange;
595  else tlimit = facrange*lambda0;
596 
599  }
600  }
601  //G4cout << "tPathLength= " << tPathLength
602  // << " currentMinimalStep= " << currentMinimalStep << G4endl;
603  return ConvertTrueToGeom(tPathLength, currentMinimalStep);
604 }
const G4ParticleDefinition * particle
const G4MaterialCutsCouple * couple
const double MeV
G4double currentKinEnergy
G4double UrbanMscModel93::ComputeTrueStepLength ( G4double  geomStepLength)
override

Definition at line 694 of file UrbanMscModel93.cc.

References currentRange, insideskin, lambda0, par1, par3, tausmall, tlimitminfix, tPathLength, and zPathLength.

695 {
696  // step defined other than transportation
697  if(geomStepLength == zPathLength && tPathLength <= currentRange)
698  return tPathLength;
699 
700  // t = z for very small step
701  zPathLength = geomStepLength;
702  tPathLength = geomStepLength;
703  if(geomStepLength < tlimitminfix) return tPathLength;
704 
705  // recalculation
706  if((geomStepLength > lambda0*tausmall) && !insideskin)
707  {
708  if(par1 < 0.)
709  tPathLength = -lambda0*G4Log(1.-geomStepLength/lambda0) ;
710  else
711  {
712  if(par1*par3*geomStepLength < 1.)
713  tPathLength = (1.-G4Exp(G4Log(1.-par1*par3*geomStepLength)/par3))/par1 ;
714  else
716  }
717  }
718  if(tPathLength < geomStepLength) tPathLength = geomStepLength;
719 
720  //G4cout << "tPathLength= " << tPathLength << " step= " << geomStepLength << G4endl;
721 
722  return tPathLength;
723 }
void UrbanMscModel93::Initialise ( const G4ParticleDefinition *  p,
const G4DataVector &   
)
override

Definition at line 113 of file UrbanMscModel93.cc.

References fParticleChange, ecalTB2006H4_GenSimDigiReco_cfg::G4cout, MeV, SetParticle(), skindepth, and stepmin.

115 {
116  skindepth = skin*stepmin;
117 
118  // set values of some data members
119  SetParticle(p);
120 
121  if(p->GetPDGMass() > MeV) {
122  G4cout << "### WARNING: UrbanMscModel93 model is used for "
123  << p->GetParticleName() << " !!! " << G4endl;
124  G4cout << "### This model should be used only for e+-"
125  << G4endl;
126  }
127 
128  fParticleChange = GetParticleChangeForMSC(p);
129 }
G4ParticleChangeForMSC * fParticleChange
void SetParticle(const G4ParticleDefinition *)
const double MeV
G4double UrbanMscModel93::LatCorrelation ( )
private

Definition at line 1065 of file UrbanMscModel93.cc.

References currentTau, insideskin, kappa, kappami1, kappapl1, lambdaeff, taubig, taulim, tausmall, and third.

Referenced by SampleScattering().

1066 {
1067  G4double latcorr = 0.;
1068  if((currentTau >= tausmall) && !insideskin)
1069  {
1070  if(currentTau < taulim)
1073  else
1074  {
1075  G4double etau = 0.;
1076  if(currentTau < taubig) etau = G4Exp(-currentTau);
1077  latcorr = -kappa*currentTau;
1078  latcorr = G4Exp(latcorr)/kappami1;
1079  latcorr += 1.-kappa*etau/kappami1 ;
1080  latcorr *= 2.*lambdaeff*third ;
1081  }
1082  }
1083 
1084  return latcorr;
1085 }
static const G4double kappami1
static const G4double kappapl1
static const G4double kappa
UrbanMscModel93& UrbanMscModel93::operator= ( const UrbanMscModel93 right)
privatedelete
G4double UrbanMscModel93::SampleCosineTheta ( G4double  trueStepLength,
G4double  KineticEnergy 
)
private

Definition at line 819 of file UrbanMscModel93.cc.

References b, EnergyCorrector::c, alignmentValidation::c1, coeffc1, coeffc2, ComputeTheta0(), funct::cos(), couple, currentKinEnergy, currentRadLength, currentRange, currentTau, edmIntegrityCheck::d, ea, eaa, ecalTB2006H4_GenSimDigiReco_cfg::G4cout, GeV, mps_fire::i, insideskin, lambda0, lambdaeff, mass, SiStripPI::mean, gen::n, numlim, par1, par2, phi, funct::pow(), TtFullHadEvtBuilder_cfi::prob, rellossmax, scr1, scr2, SimpleScattering(), funct::sin(), mathSSE::sqrt(), stepmin, fftjetcommon_cfi::sx, fftjetcommon_cfi::sy, metsig::tau, taubig, taulim, tausmall, theta0max, third, UpdateCache(), JetChargeProducer_cfi::var, x, xsi, y, Zeff, and Zold.

Referenced by SampleScattering().

821 {
822  G4double cth = 1. ;
823  G4double tau = trueStepLength/lambda0 ;
824 
825  Zeff = couple->GetMaterial()->GetTotNbOfElectPerVolume()/
826  couple->GetMaterial()->GetTotNbOfAtomsPerVolume() ;
827 
828  if(Zold != Zeff)
829  UpdateCache();
830 
831  if(insideskin)
832  {
833  //no scattering, single or plural scattering
834  G4double mean = trueStepLength/stepmin ;
835 
836  G4int n = G4Poisson(mean);
837  if(n > 0)
838  {
839  //screening (Moliere-Bethe)
840  G4double mom2 = KineticEnergy*(2.*mass+KineticEnergy);
841  G4double beta2 = mom2/((KineticEnergy+mass)*(KineticEnergy+mass));
842  G4double ascr = scr1/mom2;
843  ascr *= 1.13+scr2/beta2;
844  G4double ascr1 = 1.+2.*ascr;
845  G4double bp1=ascr1+1.;
846  G4double bm1=ascr1-1.;
847 
848  // single scattering from screened Rutherford x-section
849  G4double ct,st,phi;
850  G4double sx=0.,sy=0.,sz=0.;
851  for(G4int i=1; i<=n; i++)
852  {
853  ct = ascr1-bp1*bm1/(2.*G4UniformRand()+bm1);
854  if(ct < -1.) ct = -1.;
855  if(ct > 1.) ct = 1.;
856  st = sqrt(1.-ct*ct);
857  phi = twopi*G4UniformRand();
858  sx += st*cos(phi);
859  sy += st*sin(phi);
860  sz += ct;
861  }
862  cth = sz/sqrt(sx*sx+sy*sy+sz*sz);
863  }
864  }
865  else
866  {
867  if(trueStepLength >= currentRange*dtrl)
868  {
869  if(par1*trueStepLength < 1.)
870  tau = -par2*G4Log(1.-par1*trueStepLength) ;
871  // for the case if ioni/brems are inactivated
872  // see the corresponding condition in ComputeGeomPathLength
873  else if(1.-KineticEnergy/currentKinEnergy > taulim)
874  tau = taubig ;
875  }
876  currentTau = tau ;
877  lambdaeff = trueStepLength/currentTau;
878  currentRadLength = couple->GetMaterial()->GetRadlen();
879 
880  if (tau >= taubig) cth = -1.+2.*G4UniformRand();
881  else if (tau >= tausmall)
882  {
883  G4double xmeanth, x2meanth;
884  if(tau < numlim) {
885  xmeanth = 1.0 - tau*(1.0 - 0.5*tau);
886  x2meanth= 1.0 - tau*(5.0 - 6.25*tau)*third;
887  } else {
888  xmeanth = G4Exp(-tau);
889  x2meanth = (1.+2.*G4Exp(-2.5*tau))*third;
890  }
891  G4double relloss = 1.-KineticEnergy/currentKinEnergy;
892 
893  if(relloss > rellossmax)
894  return SimpleScattering(xmeanth,x2meanth);
895 
896  G4double theta0 = ComputeTheta0(trueStepLength,KineticEnergy);
897 
898  //G4cout << "Theta0= " << theta0 << " theta0max= " << theta0max
899  // << " sqrt(tausmall)= " << sqrt(tausmall) << G4endl;
900 
901  // protection for very small angles
902  G4double theta2 = theta0*theta0;
903 
904  if(theta2 < tausmall) { return cth; }
905 
906  if(theta0 > theta0max) {
907  return SimpleScattering(xmeanth,x2meanth);
908  }
909 
910  G4double x = theta2*(1.0 - theta2/12.);
911  if(theta2 > numlim) {
912  G4double sth = 2.*sin(0.5*theta0);
913  x = sth*sth;
914  }
915 
916  G4double xmean1 = 1.-(1.-(1.+xsi)*ea)*x/eaa;
917  G4double x0 = 1. - xsi*x;
918 
919  // G4cout << " xmean1= " << xmean1 << " xmeanth= " << xmeanth << G4endl;
920 
921  if(xmean1 <= 0.999*xmeanth) {
922  return SimpleScattering(xmeanth,x2meanth);
923  }
924  // from e- and muon scattering data
925  G4double c = coeffc1+coeffc2*y;
926 
927  // tail should not be too big
928  if(c < 1.9) {
929  /*
930  if(KineticEnergy > 200*MeV && c < 1.6) {
931  G4cout << "UrbanMscModel93::SampleCosineTheta: E(GeV)= "
932  << KineticEnergy/GeV
933  << " !!** c= " << c
934  << " **!! length(mm)= " << trueStepLength << " Zeff= " << Zeff
935  << " " << couple->GetMaterial()->GetName()
936  << " tau= " << tau << G4endl;
937  }
938  */
939  c = 1.9;
940  }
941 
942  if(fabs(c-3.) < 0.001) { c = 3.001; }
943  else if(fabs(c-2.) < 0.001) { c = 2.001; }
944 
945  G4double c1 = c-1.;
946 
947  //from continuity of derivatives
948  G4double b = 1.+(c-xsi)*x;
949 
950  G4double b1 = b+1.;
951  G4double bx = c*x;
952 
953  G4double eb1 = pow(b1,c1);
954  G4double ebx = pow(bx,c1);
955  G4double d = ebx/eb1;
956 
957  // G4double xmean2 = (x0*eb1+ebx-(eb1*bx-b1*ebx)/(c-2.))/(eb1-ebx);
958  G4double xmean2 = (x0 + d - (bx - b1*d)/(c-2.))/(1. - d);
959 
960  G4double f1x0 = ea/eaa;
961  G4double f2x0 = c1/(c*(1. - d));
962  G4double prob = f2x0/(f1x0+f2x0);
963 
964  G4double qprob = xmeanth/(prob*xmean1+(1.-prob)*xmean2);
965 
966  // sampling of costheta
967  //G4cout << "c= " << c << " qprob= " << qprob << " eb1= " << eb1
968  // << " c1= " << c1 << " b1= " << b1 << " bx= " << bx << " eb1= " << eb1
969  // << G4endl;
970  if(G4UniformRand() < qprob)
971  {
972  G4double var = 0;
973  if(G4UniformRand() < prob) {
974  cth = 1.+G4Log(ea+G4UniformRand()*eaa)*x;
975  } else {
976  var = (1.0 - d)*G4UniformRand();
977  if(var < numlim*d) {
978  var /= (d*c1);
979  cth = -1.0 + var*(1.0 - 0.5*var*c)*(2. + (c - xsi)*x);
980  } else {
981  cth = 1. + x*(c - xsi - c*pow(var + d, -1.0/c1));
982  //b-b1*bx/G4Exp(log(ebx+(eb1-ebx)*G4UniformRand())/c1) ;
983  }
984  }
985  if(KineticEnergy > 5*GeV && cth < 0.9) {
986  G4cout << "UrbanMscModel93::SampleCosineTheta: E(GeV)= "
987  << KineticEnergy/GeV
988  << " 1-cosT= " << 1 - cth
989  << " length(mm)= " << trueStepLength << " Zeff= " << Zeff
990  << " tau= " << tau
991  << " prob= " << prob << " var= " << var << G4endl;
992  G4cout << " c= " << c << " qprob= " << qprob << " eb1= " << eb1
993  << " ebx= " << ebx
994  << " c1= " << c1 << " b= " << b << " b1= " << b1
995  << " bx= " << bx << " d= " << d
996  << " ea= " << ea << " eaa= " << eaa << G4endl;
997  }
998  }
999  else {
1000  cth = -1.+2.*G4UniformRand();
1001  if(KineticEnergy > 5*GeV) {
1002  G4cout << "UrbanMscModel93::SampleCosineTheta: E(GeV)= "
1003  << KineticEnergy/GeV
1004  << " length(mm)= " << trueStepLength << " Zeff= " << Zeff
1005  << " qprob= " << qprob << G4endl;
1006  }
1007  }
1008  }
1009  }
1010  return cth ;
1011 }
const G4MaterialCutsCouple * couple
const double GeV
Definition: MathUtil.h:16
G4double ComputeTheta0(G4double truePathLength, G4double KineticEnergy)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
G4double currentRadLength
T sqrt(T t)
Definition: SSEVec.h:18
G4double currentKinEnergy
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
G4double SimpleScattering(G4double xmeanth, G4double x2meanth)
double b
Definition: hdecay.h:120
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
G4double UrbanMscModel93::SampleDisplacement ( )
private

Definition at line 1015 of file UrbanMscModel93.cc.

References currentTau, insideskin, kappa, kappami1, kappapl1, lambdaeff, mathSSE::sqrt(), taubig, taulim, tausmall, third, tPathLength, and zPathLength.

Referenced by SampleScattering().

1016 {
1017  // Compute rmean = sqrt(<r**2>) from theory
1018  G4double rmean = 0.0;
1019  if ((currentTau >= tausmall) && !insideskin) {
1020  if (currentTau < taulim) {
1022  (1.-kappapl1*currentTau*0.25)/6. ;
1023 
1024  } else {
1025  G4double etau = 0.0;
1026  if (currentTau<taubig) etau = G4Exp(-currentTau);
1027  rmean = -kappa*currentTau;
1028  rmean = -G4Exp(rmean)/(kappa*kappami1);
1029  rmean += currentTau-kappapl1/kappa+kappa*etau/kappami1;
1030  }
1031  if (rmean>0.) rmean = 2.*lambdaeff*sqrt(rmean*third);
1032  else rmean = 0.;
1033  }
1034 
1035  if(rmean == 0.) return rmean;
1036 
1037  // protection against z > t ...........................
1038  G4double rmax = (tPathLength-zPathLength)*(tPathLength+zPathLength);
1039  if(rmax <= 0.)
1040  rmax = 0.;
1041  else
1042  rmax = sqrt(rmax);
1043 
1044  if(rmean >= rmax) return rmax;
1045 
1046  return rmean;
1047  // VI comment out for the time being
1048  /*
1049  //sample r (Gaussian distribution with a mean of rmean )
1050  G4double r = 0.;
1051  G4double sigma = min(rmean,rmax-rmean);
1052  sigma /= 3.;
1053  G4double rlow = rmean-3.*sigma;
1054  G4double rhigh = rmean+3.*sigma;
1055  do {
1056  r = G4RandGauss::shoot(rmean,sigma);
1057  } while ((r < rlow) || (r > rhigh));
1058 
1059  return r;
1060  */
1061 }
static const G4double kappami1
T sqrt(T t)
Definition: SSEVec.h:18
static const G4double kappapl1
static const G4double kappa
G4ThreeVector & UrbanMscModel93::SampleScattering ( const G4ThreeVector &  oldDirection,
G4double  safety 
)
override

Definition at line 728 of file UrbanMscModel93.cc.

References funct::abs(), funct::cos(), couple, currentKinEnergy, currentRange, fParticleChange, lambda0, LatCorrelation(), particle, phi, colinearityKinematic::Phi, alignCSCRings::r, SampleCosineTheta(), SampleDisplacement(), funct::sin(), mathSSE::sqrt(), tausmall, tlimitminfix, and tPathLength.

730 {
731  fDisplacement.set(0.0,0.0,0.0);
732  G4double kineticEnergy = currentKinEnergy;
733  if (tPathLength > currentRange*dtrl) {
734  kineticEnergy = GetEnergy(particle,currentRange-tPathLength,couple);
735  } else {
736  kineticEnergy -= tPathLength*GetDEDX(particle,currentKinEnergy,couple);
737  }
738  if((kineticEnergy <= eV) || (tPathLength <= tlimitminfix) ||
739  (tPathLength/tausmall < lambda0)) { return fDisplacement; }
740 
741  G4double cth = SampleCosineTheta(tPathLength,kineticEnergy);
742 
743  // protection against 'bad' cth values
744  if(std::fabs(cth) > 1.) { return fDisplacement; }
745 
746  // extra protection agaist high energy particles backscattered
747  // if(cth < 1.0 - 1000*tPathLength/lambda0 && kineticEnergy > 20*MeV) {
748  //G4cout << "Warning: large scattering E(MeV)= " << kineticEnergy
749  // << " s(mm)= " << tPathLength/mm
750  // << " 1-cosTheta= " << 1.0 - cth << G4endl;
751  // do Gaussian central scattering
752  // if(kineticEnergy > 0.5*GeV && cth < 0.9) {
753  /*
754  if(cth < 1.0 - 1000*tPathLength/lambda0 &&
755  cth < 0.9 && kineticEnergy > 500*MeV) {
756  G4ExceptionDescription ed;
757  ed << particle->GetParticleName()
758  << " E(MeV)= " << kineticEnergy/MeV
759  << " Step(mm)= " << tPathLength/mm
760  << " tau= " << tPathLength/lambda0
761  << " in " << CurrentCouple()->GetMaterial()->GetName()
762  << " CosTheta= " << cth
763  << " is too big";
764  G4Exception("UrbanMscModel93::SampleScattering","em0004",
765  JustWarning, ed,"");
766  }
767  */
768 
769  G4double sth = sqrt((1.0 - cth)*(1.0 + cth));
770  G4double phi = twopi*G4UniformRand();
771  G4double dirx = sth*cos(phi);
772  G4double diry = sth*sin(phi);
773 
774  G4ThreeVector newDirection(dirx,diry,cth);
775  newDirection.rotateUz(oldDirection);
776  fParticleChange->ProposeMomentumDirection(newDirection);
777 
778  if (latDisplasment && safety > tlimitminfix) {
779 
780  G4double r = SampleDisplacement();
781  /*
782  G4cout << "UrbanMscModel93::SampleSecondaries: e(MeV)= " << kineticEnergy
783  << " sinTheta= " << sth << " r(mm)= " << r
784  << " trueStep(mm)= " << tPathLength
785  << " geomStep(mm)= " << zPathLength
786  << G4endl;
787  */
788  if(r > 0.)
789  {
790  G4double latcorr = LatCorrelation();
791  if(latcorr > r) latcorr = r;
792 
793  // sample direction of lateral displacement
794  // compute it from the lateral correlation
795  G4double Phi = 0.;
796  if(std::abs(r*sth) < latcorr)
797  Phi = twopi*G4UniformRand();
798  else
799  {
800  G4double psi = std::acos(latcorr/(r*sth));
801  if(G4UniformRand() < 0.5)
802  Phi = phi+psi;
803  else
804  Phi = phi-psi;
805  }
806 
807  dirx = r*std::cos(Phi);
808  diry = r*std::sin(Phi);
809 
810  fDisplacement.set(dirx,diry,0.0);
811  fDisplacement.rotateUz(oldDirection);
812  }
813  }
814  return fDisplacement;
815 }
const G4ParticleDefinition * particle
const G4MaterialCutsCouple * couple
G4ParticleChangeForMSC * fParticleChange
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
std::map< std::string, int, std::less< std::string > > psi
G4double LatCorrelation()
T sqrt(T t)
Definition: SSEVec.h:18
G4double currentKinEnergy
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
G4double SampleDisplacement()
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
G4double SampleCosineTheta(G4double trueStepLength, G4double KineticEnergy)
void UrbanMscModel93::SetParticle ( const G4ParticleDefinition *  p)
inlineprivate

Definition at line 172 of file UrbanMscModel93.h.

References charge, ChargeSquare, mass, AlCaHLTBitMon_ParallelJobs::p, and particle.

Referenced by ComputeCrossSectionPerAtom(), Initialise(), and StartTracking().

173 {
174  if (p != particle) {
175  particle = p;
176  mass = p->GetPDGMass();
177  charge = p->GetPDGCharge()/CLHEP::eplus;
179  }
180 }
const G4ParticleDefinition * particle
G4double UrbanMscModel93::SimpleScattering ( G4double  xmeanth,
G4double  x2meanth 
)
inlineprivate

Definition at line 228 of file UrbanMscModel93.h.

References a, and TtFullHadEvtBuilder_cfi::prob.

Referenced by SampleCosineTheta().

229 {
230  // 'large angle scattering'
231  // 2 model functions with correct xmean and x2mean
232  G4double a = (2.*xmeanth+9.*x2meanth-3.)/(2.*xmeanth-3.*x2meanth+1.);
233  G4double prob = (a+2.)*xmeanth/a;
234 
235  // sampling
236  G4double cth = 1.;
237  if(G4UniformRand() < prob) {
238  cth = -1.+2.*G4Exp(G4Log(G4UniformRand())/(a+1.));
239  } else {
240  cth = -1.+2.*G4UniformRand();
241  }
242  return cth;
243 }
double a
Definition: hdecay.h:121
void UrbanMscModel93::StartTracking ( G4Track *  track)
override

Definition at line 378 of file UrbanMscModel93.cc.

References firstStep, geombig, inside, insideskin, SetParticle(), stepmin, tlimit, tlimitmin, and tlimitminfix.

379 {
380  SetParticle(track->GetDynamicParticle()->GetDefinition());
381  firstStep = true;
382  inside = false;
383  insideskin = false;
384  tlimit = geombig;
386  tlimitmin = 10.*stepmin ;
387 }
void SetParticle(const G4ParticleDefinition *)
void UrbanMscModel93::UpdateCache ( )
inlineprivate

Definition at line 185 of file UrbanMscModel93.h.

References ChargeSquare, coeffc1, coeffc2, coeffth1, coeffth2, lnZ, scr1, scr1ini, scr2, scr2ini, Z2, Z23, Zeff, and Zold.

Referenced by SampleCosineTheta().

186 {
187  lnZ = G4Log(Zeff);
188  //new correction in theta0 formula
189  coeffth1 = (1.-8.7780e-2/Zeff)*(0.87+0.03*lnZ);
190  coeffth2 = (4.0780e-2+1.7315e-4*Zeff)*(0.87+0.03*lnZ);
191  // tail parameters
192  G4double lnZ1 = G4Log(Zeff+1.);
193  coeffc1 = 2.943-0.197*lnZ1;
194  coeffc2 = 0.0987-0.0143*lnZ1;
195  // for single scattering
196  Z2 = Zeff*Zeff;
197  Z23 = G4Exp(2.*lnZ/3.);
198  scr1 = scr1ini*Z23;
200 
201  Zold = Zeff;
202 }

Member Data Documentation

G4double UrbanMscModel93::charge
private
G4double UrbanMscModel93::ChargeSquare
private
G4double UrbanMscModel93::coeffc1
private

Definition at line 160 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::coeffc2
private

Definition at line 160 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::coeffth1
private

Definition at line 159 of file UrbanMscModel93.h.

Referenced by ComputeTheta0(), UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::coeffth2
private

Definition at line 159 of file UrbanMscModel93.h.

Referenced by ComputeTheta0(), UpdateCache(), and UrbanMscModel93().

const G4MaterialCutsCouple* UrbanMscModel93::couple
private
G4double UrbanMscModel93::currentKinEnergy
private
G4int UrbanMscModel93::currentMaterialIndex
private

Definition at line 154 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), and UrbanMscModel93().

G4double UrbanMscModel93::currentRadLength
private

Definition at line 147 of file UrbanMscModel93.h.

Referenced by ComputeTheta0(), SampleCosineTheta(), and UrbanMscModel93().

G4double UrbanMscModel93::currentRange
private
G4double UrbanMscModel93::currentTau
private
G4double UrbanMscModel93::ea
private

Definition at line 149 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), and UrbanMscModel93().

G4double UrbanMscModel93::eaa
private

Definition at line 149 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), and UrbanMscModel93().

G4bool UrbanMscModel93::firstStep
private
G4ParticleChangeForMSC* UrbanMscModel93::fParticleChange
private

Definition at line 110 of file UrbanMscModel93.h.

Referenced by Initialise(), SampleScattering(), and UrbanMscModel93().

G4double UrbanMscModel93::fr
private

Definition at line 117 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), and UrbanMscModel93().

G4double UrbanMscModel93::geombig
private

Definition at line 128 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), StartTracking(), and UrbanMscModel93().

G4double UrbanMscModel93::geomlimit
private

Definition at line 130 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), and UrbanMscModel93().

G4double UrbanMscModel93::geommin
private

Definition at line 129 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), and UrbanMscModel93().

G4bool UrbanMscModel93::inside
private

Definition at line 164 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), StartTracking(), and UrbanMscModel93().

G4bool UrbanMscModel93::insideskin
private
G4double UrbanMscModel93::lambda0
private
G4double UrbanMscModel93::lambdaeff
private
G4double UrbanMscModel93::lambdalimit
private

Definition at line 117 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), and UrbanMscModel93().

G4double UrbanMscModel93::lnZ
private

Definition at line 158 of file UrbanMscModel93.h.

Referenced by UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::mass
private
G4double UrbanMscModel93::masslimite
private

Definition at line 117 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), and UrbanMscModel93().

G4double UrbanMscModel93::numlim
private

Definition at line 149 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), and UrbanMscModel93().

G4double UrbanMscModel93::par1
private
G4double UrbanMscModel93::par2
private

Definition at line 140 of file UrbanMscModel93.h.

Referenced by ComputeGeomPathLength(), SampleCosineTheta(), and UrbanMscModel93().

G4double UrbanMscModel93::par3
private
const G4ParticleDefinition* UrbanMscModel93::particle
private
G4double UrbanMscModel93::presafety
private

Definition at line 134 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), and UrbanMscModel93().

G4double UrbanMscModel93::rangeinit
private

Definition at line 146 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), and UrbanMscModel93().

G4double UrbanMscModel93::rellossmax
private

Definition at line 151 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), and UrbanMscModel93().

G4double UrbanMscModel93::scr1
private

Definition at line 161 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::scr1ini
private

Definition at line 161 of file UrbanMscModel93.h.

Referenced by UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::scr2
private

Definition at line 161 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::scr2ini
private

Definition at line 161 of file UrbanMscModel93.h.

Referenced by UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::skindepth
private

Definition at line 131 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), Initialise(), and UrbanMscModel93().

G4double UrbanMscModel93::smallstep
private

Definition at line 132 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), and UrbanMscModel93().

G4double UrbanMscModel93::stepmin
private
G4double UrbanMscModel93::taubig
private
G4double UrbanMscModel93::taulim
private
G4double UrbanMscModel93::tausmall
private
G4double UrbanMscModel93::tgeom
private

Definition at line 126 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), and UrbanMscModel93().

G4LossTableManager* UrbanMscModel93::theManager
private

Definition at line 113 of file UrbanMscModel93.h.

Referenced by UrbanMscModel93().

G4double UrbanMscModel93::theta0max
private

Definition at line 151 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), and UrbanMscModel93().

G4double UrbanMscModel93::third
private
G4double UrbanMscModel93::tlimit
private

Definition at line 123 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), StartTracking(), and UrbanMscModel93().

G4double UrbanMscModel93::tlimitmin
private

Definition at line 124 of file UrbanMscModel93.h.

Referenced by ComputeTruePathLengthLimit(), StartTracking(), and UrbanMscModel93().

G4double UrbanMscModel93::tlimitminfix
private
G4double UrbanMscModel93::tPathLength
private
G4double UrbanMscModel93::xsi
private

Definition at line 149 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), and UrbanMscModel93().

G4double UrbanMscModel93::y
private
G4double UrbanMscModel93::Z2
private

Definition at line 158 of file UrbanMscModel93.h.

Referenced by UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::Z23
private

Definition at line 158 of file UrbanMscModel93.h.

Referenced by ComputeCrossSectionPerAtom(), UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::Zeff
private

Definition at line 158 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::Zold
private

Definition at line 157 of file UrbanMscModel93.h.

Referenced by SampleCosineTheta(), UpdateCache(), and UrbanMscModel93().

G4double UrbanMscModel93::zPathLength
private