Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4UrbanMscModel93 Class Reference

#include <G4UrbanMscModel93.hh>

+ Inheritance diagram for G4UrbanMscModel93:

Public Member Functions

 G4UrbanMscModel93 (const G4String &nam="UrbanMsc93")
 
virtual ~G4UrbanMscModel93 ()
 
void Initialise (const G4ParticleDefinition *, const G4DataVector &)
 
void StartTracking (G4Track *)
 
G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *particle, G4double KineticEnergy, G4double AtomicNumber, G4double AtomicWeight=0., G4double cut=0., G4double emax=DBL_MAX)
 
G4ThreeVectorSampleScattering (const G4DynamicParticle *, G4double safety)
 
G4double ComputeTruePathLengthLimit (const G4Track &track, G4double &currentMinimalStep)
 
G4double ComputeGeomPathLength (G4double truePathLength)
 
G4double ComputeTrueStepLength (G4double geomStepLength)
 
G4double ComputeTheta0 (G4double truePathLength, G4double KineticEnergy)
 
- Public Member Functions inherited from G4VMscModel
 G4VMscModel (const G4String &nam)
 
virtual ~G4VMscModel ()
 
virtual G4double ComputeTruePathLengthLimit (const G4Track &track, G4double &stepLimit)
 
virtual G4double ComputeGeomPathLength (G4double truePathLength)
 
virtual G4double ComputeTrueStepLength (G4double geomPathLength)
 
virtual G4ThreeVectorSampleScattering (const G4DynamicParticle *, G4double safety)
 
virtual void SampleSecondaries (std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double tmax)
 
void SetStepLimitType (G4MscStepLimitType)
 
void SetLateralDisplasmentFlag (G4bool val)
 
void SetRangeFactor (G4double)
 
void SetGeomFactor (G4double)
 
void SetSkin (G4double)
 
void SetSampleZ (G4bool)
 
G4VEnergyLossProcessGetIonisation () const
 
void SetIonisation (G4VEnergyLossProcess *, const G4ParticleDefinition *part)
 
G4double ComputeSafety (const G4ThreeVector &position, G4double limit)
 
G4double ComputeGeomLimit (const G4Track &, G4double &presafety, G4double limit)
 
G4double GetDEDX (const G4ParticleDefinition *part, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
 
G4double GetRange (const G4ParticleDefinition *part, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
 
G4double GetEnergy (const G4ParticleDefinition *part, G4double range, const G4MaterialCutsCouple *couple)
 
G4double GetTransportMeanFreePath (const G4ParticleDefinition *part, G4double kinEnergy)
 
- Public Member Functions inherited from G4VEmModel
 G4VEmModel (const G4String &nam)
 
virtual ~G4VEmModel ()
 
virtual void Initialise (const G4ParticleDefinition *, const G4DataVector &)=0
 
virtual void SampleSecondaries (std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin=0.0, G4double tmax=DBL_MAX)=0
 
virtual G4double ComputeDEDXPerVolume (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
 
virtual G4double CrossSectionPerVolume (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
virtual G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
virtual G4double ChargeSquareRatio (const G4Track &)
 
virtual G4double GetChargeSquareRatio (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
virtual G4double GetParticleCharge (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
virtual void StartTracking (G4Track *)
 
virtual void CorrectionsAlongStep (const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double &eloss, G4double &niel, G4double length)
 
virtual G4double Value (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy)
 
virtual G4double MinPrimaryEnergy (const G4Material *, const G4ParticleDefinition *)
 
virtual void SetupForMaterial (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
 
virtual void DefineForRegion (const G4Region *)
 
void InitialiseElementSelectors (const G4ParticleDefinition *, const G4DataVector &)
 
G4double ComputeDEDX (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
 
G4double CrossSection (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
G4double ComputeMeanFreePath (const G4ParticleDefinition *, G4double kineticEnergy, const G4Material *, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, const G4Element *, G4double kinEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
G4int SelectIsotopeNumber (const G4Element *)
 
const G4ElementSelectRandomAtom (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
const G4ElementSelectRandomAtom (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
void SetParticleChange (G4VParticleChange *, G4VEmFluctuationModel *f=0)
 
void SetCrossSectionTable (G4PhysicsTable *)
 
G4PhysicsTableGetCrossSectionTable ()
 
G4VEmFluctuationModelGetModelOfFluctuations ()
 
G4VEmAngularDistributionGetAngularDistribution ()
 
void SetAngularDistribution (G4VEmAngularDistribution *)
 
G4double HighEnergyLimit () const
 
G4double LowEnergyLimit () const
 
G4double HighEnergyActivationLimit () const
 
G4double LowEnergyActivationLimit () const
 
G4double PolarAngleLimit () const
 
G4double SecondaryThreshold () const
 
G4bool LPMFlag () const
 
G4bool DeexcitationFlag () const
 
G4bool ForceBuildTableFlag () const
 
void SetHighEnergyLimit (G4double)
 
void SetLowEnergyLimit (G4double)
 
void SetActivationHighEnergyLimit (G4double)
 
void SetActivationLowEnergyLimit (G4double)
 
G4bool IsActive (G4double kinEnergy)
 
void SetPolarAngleLimit (G4double)
 
void SetSecondaryThreshold (G4double)
 
void SetLPMFlag (G4bool val)
 
void SetDeexcitationFlag (G4bool val)
 
void ForceBuildTable (G4bool val)
 
G4double MaxSecondaryKinEnergy (const G4DynamicParticle *dynParticle)
 
const G4StringGetName () const
 
void SetCurrentCouple (const G4MaterialCutsCouple *)
 
const G4ElementGetCurrentElement () const
 

Additional Inherited Members

- Protected Member Functions inherited from G4VMscModel
G4ParticleChangeForMSCGetParticleChangeForMSC (const G4ParticleDefinition *p=0)
 
G4double ConvertTrueToGeom (G4double &tLength, G4double &gLength)
 
- Protected Member Functions inherited from G4VEmModel
G4ParticleChangeForLossGetParticleChangeForLoss ()
 
G4ParticleChangeForGammaGetParticleChangeForGamma ()
 
virtual G4double MaxSecondaryEnergy (const G4ParticleDefinition *, G4double kineticEnergy)
 
const G4MaterialCutsCoupleCurrentCouple () const
 
void SetCurrentElement (const G4Element *)
 
- Protected Attributes inherited from G4VMscModel
G4double facrange
 
G4double facgeom
 
G4double facsafety
 
G4double skin
 
G4double dtrl
 
G4double lambdalimit
 
G4double geomMin
 
G4double geomMax
 
G4ThreeVector fDisplacement
 
G4MscStepLimitType steppingAlgorithm
 
G4bool samplez
 
G4bool latDisplasment
 
- Protected Attributes inherited from G4VEmModel
G4VParticleChangepParticleChange
 
G4PhysicsTablexSectionTable
 
const std::vector< G4double > * theDensityFactor
 
const std::vector< G4int > * theDensityIdx
 

Detailed Description

Definition at line 71 of file G4UrbanMscModel93.hh.

Constructor & Destructor Documentation

◆ G4UrbanMscModel93()

G4UrbanMscModel93::G4UrbanMscModel93 ( const G4String nam = "UrbanMsc93")

Definition at line 119 of file G4UrbanMscModel93.cc.

120 : G4VMscModel(nam)
121{
122 masslimite = 0.6*MeV;
123 lambdalimit = 1.*mm;
124 fr = 0.02;
125 taubig = 8.0;
126 tausmall = 1.e-16;
127 taulim = 1.e-6;
128 currentTau = taulim;
129 tlimitminfix = 1.e-6*mm;
130 stepmin = tlimitminfix;
131 smallstep = 1.e10;
132 currentRange = 0. ;
133 rangeinit = 0.;
134 tlimit = 1.e10*mm;
135 tlimitmin = 10.*tlimitminfix;
136 tgeom = 1.e50*mm;
137 geombig = 1.e50*mm;
138 geommin = 1.e-3*mm;
139 geomlimit = geombig;
140 presafety = 0.*mm;
141
142 y = 0.;
143
144 Zold = 0.;
145 Zeff = 1.;
146 Z2 = 1.;
147 Z23 = 1.;
148 lnZ = 0.;
149 coeffth1 = 0.;
150 coeffth2 = 0.;
151 coeffc1 = 0.;
152 coeffc2 = 0.;
153 scr1ini = fine_structure_const*fine_structure_const*
154 electron_mass_c2*electron_mass_c2/(0.885*0.885*4.*pi);
155 scr2ini = 3.76*fine_structure_const*fine_structure_const;
156 scr1 = 0.;
157 scr2 = 0.;
158
159 theta0max = pi/6.;
160 rellossmax = 0.50;
161 third = 1./3.;
162 particle = 0;
163 theManager = G4LossTableManager::Instance();
164 firstStep = true;
165 inside = false;
166 insideskin = false;
167
168 skindepth = skin*stepmin;
169
170 mass = proton_mass_c2;
171 charge = ChargeSquare = 1.0;
172 currentKinEnergy = currentRadLength = lambda0 = lambdaeff = tPathLength
173 = zPathLength = par1 = par2 = par3 = 0;
174
175 currentMaterialIndex = -1;
176 fParticleChange = 0;
177 couple = 0;
178}
static G4LossTableManager * Instance()
G4double skin
Definition: G4VMscModel.hh:179
const G4double pi

◆ ~G4UrbanMscModel93()

G4UrbanMscModel93::~G4UrbanMscModel93 ( )
virtual

Definition at line 182 of file G4UrbanMscModel93.cc.

183{}

Member Function Documentation

◆ ComputeCrossSectionPerAtom()

G4double G4UrbanMscModel93::ComputeCrossSectionPerAtom ( const G4ParticleDefinition particle,
G4double  KineticEnergy,
G4double  AtomicNumber,
G4double  AtomicWeight = 0.,
G4double  cut = 0.,
G4double  emax = DBL_MAX 
)
virtual

Reimplemented from G4VEmModel.

Definition at line 207 of file G4UrbanMscModel93.cc.

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

◆ ComputeGeomPathLength()

G4double G4UrbanMscModel93::ComputeGeomPathLength ( G4double  truePathLength)
virtual

Reimplemented from G4VMscModel.

Definition at line 677 of file G4UrbanMscModel93.cc.

678{
679 firstStep = false;
680 lambdaeff = lambda0;
681 par1 = -1. ;
682 par2 = par3 = 0. ;
683
684 // do the true -> geom transformation
685 zPathLength = tPathLength;
686
687 // z = t for very small tPathLength
688 if(tPathLength < tlimitminfix) return zPathLength;
689
690 // this correction needed to run MSC with eIoni and eBrem inactivated
691 // and makes no harm for a normal run
692 if(tPathLength > currentRange)
693 tPathLength = currentRange ;
694
695 G4double tau = tPathLength/lambda0 ;
696
697 if ((tau <= tausmall) || insideskin) {
698 zPathLength = tPathLength;
699 if(zPathLength > lambda0) zPathLength = lambda0;
700 return zPathLength;
701 }
702
703 G4double zmean = tPathLength;
704 if (tPathLength < currentRange*dtrl) {
705 if(tau < taulim) zmean = tPathLength*(1.-0.5*tau) ;
706 else zmean = lambda0*(1.-exp(-tau));
707 } else if(currentKinEnergy < mass || tPathLength == currentRange) {
708 par1 = 1./currentRange ;
709 par2 = 1./(par1*lambda0) ;
710 par3 = 1.+par2 ;
711 if(tPathLength < currentRange)
712 zmean = (1.-exp(par3*log(1.-tPathLength/currentRange)))/(par1*par3) ;
713 else
714 zmean = 1./(par1*par3) ;
715 } else {
716 G4double T1 = GetEnergy(particle,currentRange-tPathLength,couple);
717 G4double lambda1 = GetTransportMeanFreePath(particle,T1);
718
719 par1 = (lambda0-lambda1)/(lambda0*tPathLength) ;
720 par2 = 1./(par1*lambda0) ;
721 par3 = 1.+par2 ;
722 zmean = (1.-exp(par3*log(lambda1/lambda0)))/(par1*par3) ;
723 }
724
725 zPathLength = zmean ;
726
727 // sample z
728 if(samplez)
729 {
730 const G4double ztmax = 0.99 ;
731 G4double zt = zmean/tPathLength ;
732
733 if (tPathLength > stepmin && zt < ztmax)
734 {
735 G4double u,cz1;
736 if(zt >= third)
737 {
738 G4double cz = 0.5*(3.*zt-1.)/(1.-zt) ;
739 cz1 = 1.+cz ;
740 G4double u0 = cz/cz1 ;
741 G4double grej ;
742 do {
743 u = exp(log(G4UniformRand())/cz1) ;
744 grej = exp(cz*log(u/u0))*(1.-u)/(1.-u0) ;
745 } while (grej < G4UniformRand()) ;
746 }
747 else
748 {
749 cz1 = 1./zt-1.;
750 u = 1.-exp(log(G4UniformRand())/cz1) ;
751 }
752 zPathLength = tPathLength*u ;
753 }
754 }
755
756 if(zPathLength > lambda0) zPathLength = lambda0;
757 //G4cout << "zPathLength= " << zPathLength << " lambda1= " << lambda0 << G4endl;
758 return zPathLength;
759}
#define G4UniformRand()
Definition: Randomize.hh:53
G4double dtrl
Definition: G4VMscModel.hh:180
G4bool samplez
Definition: G4VMscModel.hh:188
G4double GetTransportMeanFreePath(const G4ParticleDefinition *part, G4double kinEnergy)
Definition: G4VMscModel.hh:332
G4double GetEnergy(const G4ParticleDefinition *part, G4double range, const G4MaterialCutsCouple *couple)
Definition: G4VMscModel.hh:304

◆ ComputeTheta0()

G4double G4UrbanMscModel93::ComputeTheta0 ( G4double  truePathLength,
G4double  KineticEnergy 
)

Definition at line 796 of file G4UrbanMscModel93.cc.

798{
799 // for all particles take the width of the central part
800 // from a parametrization similar to the Highland formula
801 // ( Highland formula: Particle Physics Booklet, July 2002, eq. 26.10)
802 const G4double c_highland = 13.6*MeV ;
803 G4double betacp = sqrt(currentKinEnergy*(currentKinEnergy+2.*mass)*
804 KineticEnergy*(KineticEnergy+2.*mass)/
805 ((currentKinEnergy+mass)*(KineticEnergy+mass)));
806 y = trueStepLength/currentRadLength;
807 G4double theta0 = c_highland*std::abs(charge)*sqrt(y)/betacp;
808 y = log(y);
809 // correction factor from e- scattering data
810 G4double corr = coeffth1+coeffth2*y;
811
812 theta0 *= corr ;
813
814 return theta0;
815}

◆ ComputeTruePathLengthLimit()

G4double G4UrbanMscModel93::ComputeTruePathLengthLimit ( const G4Track track,
G4double currentMinimalStep 
)
virtual

Reimplemented from G4VMscModel.

Definition at line 460 of file G4UrbanMscModel93.cc.

463{
464 tPathLength = currentMinimalStep;
465 const G4DynamicParticle* dp = track.GetDynamicParticle();
467 G4StepStatus stepStatus = sp->GetStepStatus();
468 couple = track.GetMaterialCutsCouple();
469 SetCurrentCouple(couple);
470 currentMaterialIndex = couple->GetIndex();
471 currentKinEnergy = dp->GetKineticEnergy();
472 currentRange = GetRange(particle,currentKinEnergy,couple);
473 lambda0 = GetTransportMeanFreePath(particle,currentKinEnergy);
474
475 // stop here if small range particle
476 if(inside || tPathLength < tlimitminfix) {
477 return ConvertTrueToGeom(tPathLength, currentMinimalStep);
478 }
479
480 if(tPathLength > currentRange) { tPathLength = currentRange; }
481
482 presafety = sp->GetSafety();
483
484 // G4cout << "G4Urban2::StepLimit tPathLength= "
485 // <<tPathLength<<" safety= " << presafety
486 // << " range= " <<currentRange<< " lambda= "<<lambda0
487 // << " Alg: " << steppingAlgorithm <<G4endl;
488
489 // far from geometry boundary
490 if(currentRange < presafety)
491 {
492 inside = true;
493 return ConvertTrueToGeom(tPathLength, currentMinimalStep);
494 }
495
496 // standard version
497 //
499 {
500 //compute geomlimit and presafety
501 geomlimit = ComputeGeomLimit(track, presafety, currentRange);
502
503 // is it far from boundary ?
504 if(currentRange < presafety)
505 {
506 inside = true;
507 return ConvertTrueToGeom(tPathLength, currentMinimalStep);
508 }
509
510 smallstep += 1.;
511 insideskin = false;
512
513 if(firstStep || stepStatus == fGeomBoundary)
514 {
515 rangeinit = currentRange;
516 if(firstStep) smallstep = 1.e10;
517 else smallstep = 1.;
518
519 //define stepmin here (it depends on lambda!)
520 //rough estimation of lambda_elastic/lambda_transport
521 G4double rat = currentKinEnergy/MeV ;
522 rat = 1.e-3/(rat*(10.+rat)) ;
523 //stepmin ~ lambda_elastic
524 stepmin = rat*lambda0;
525 skindepth = skin*stepmin;
526 //define tlimitmin
527 tlimitmin = 10.*stepmin;
528 if(tlimitmin < tlimitminfix) tlimitmin = tlimitminfix;
529 //G4cout << "rangeinit= " << rangeinit << " stepmin= " << stepmin
530 // << " tlimitmin= " << tlimitmin << " geomlimit= " << geomlimit <<G4endl;
531 // constraint from the geometry
532 if((geomlimit < geombig) && (geomlimit > geommin))
533 {
534 // geomlimit is a geometrical step length
535 // transform it to true path length (estimation)
536 if((1.-geomlimit/lambda0) > 0.)
537 geomlimit = -lambda0*log(1.-geomlimit/lambda0)+tlimitmin ;
538
539 if(stepStatus == fGeomBoundary)
540 tgeom = geomlimit/facgeom;
541 else
542 tgeom = 2.*geomlimit/facgeom;
543 }
544 else
545 tgeom = geombig;
546 }
547
548
549 //step limit
550 tlimit = facrange*rangeinit;
551 if(tlimit < facsafety*presafety)
552 tlimit = facsafety*presafety;
553
554 //lower limit for tlimit
555 if(tlimit < tlimitmin) tlimit = tlimitmin;
556
557 if(tlimit > tgeom) tlimit = tgeom;
558
559 //G4cout << "tgeom= " << tgeom << " geomlimit= " << geomlimit
560 // << " tlimit= " << tlimit << " presafety= " << presafety << G4endl;
561
562 // shortcut
563 if((tPathLength < tlimit) && (tPathLength < presafety) &&
564 (smallstep >= skin) && (tPathLength < geomlimit-0.999*skindepth))
565 return ConvertTrueToGeom(tPathLength, currentMinimalStep);
566
567 // step reduction near to boundary
568 if(smallstep < skin)
569 {
570 tlimit = stepmin;
571 insideskin = true;
572 }
573 else if(geomlimit < geombig)
574 {
575 if(geomlimit > skindepth)
576 {
577 if(tlimit > geomlimit-0.999*skindepth)
578 tlimit = geomlimit-0.999*skindepth;
579 }
580 else
581 {
582 insideskin = true;
583 if(tlimit > stepmin) tlimit = stepmin;
584 }
585 }
586
587 if(tlimit < stepmin) tlimit = stepmin;
588
589 // randomize 1st step or 1st 'normal' step in volume
590 if(firstStep || ((smallstep == skin) && !insideskin))
591 {
592 G4double temptlimit = tlimit;
593 if(temptlimit > tlimitmin)
594 {
595 do {
596 temptlimit = G4RandGauss::shoot(tlimit,0.3*tlimit);
597 } while ((temptlimit < tlimitmin) ||
598 (temptlimit > 2.*tlimit-tlimitmin));
599 }
600 else
601 temptlimit = tlimitmin;
602 if(tPathLength > temptlimit) tPathLength = temptlimit;
603 }
604 else
605 {
606 if(tPathLength > tlimit) tPathLength = tlimit ;
607 }
608
609 }
610 // for 'normal' simulation with or without magnetic field
611 // there no small step/single scattering at boundaries
612 else if(steppingAlgorithm == fUseSafety)
613 {
614 // compute presafety again if presafety <= 0 and no boundary
615 // i.e. when it is needed for optimization purposes
616 if((stepStatus != fGeomBoundary) && (presafety < tlimitminfix))
617 presafety = ComputeSafety(sp->GetPosition(),tPathLength);
618
619 // is far from boundary
620 if(currentRange < presafety)
621 {
622 inside = true;
623 return ConvertTrueToGeom(tPathLength, currentMinimalStep);
624 }
625
626 if(firstStep || stepStatus == fGeomBoundary)
627 {
628 rangeinit = currentRange;
629 fr = facrange;
630 // 9.1 like stepping for e+/e- only (not for muons,hadrons)
631 if(mass < masslimite)
632 {
633 if(lambda0 > currentRange)
634 rangeinit = lambda0;
635 if(lambda0 > lambdalimit)
636 fr *= 0.75+0.25*lambda0/lambdalimit;
637 }
638
639 //lower limit for tlimit
640 G4double rat = currentKinEnergy/MeV ;
641 rat = 1.e-3/(rat*(10.+rat)) ;
642 tlimitmin = 10.*lambda0*rat;
643 if(tlimitmin < tlimitminfix) tlimitmin = tlimitminfix;
644 }
645 //step limit
646 tlimit = fr*rangeinit;
647
648 if(tlimit < facsafety*presafety)
649 tlimit = facsafety*presafety;
650
651 //lower limit for tlimit
652 if(tlimit < tlimitmin) tlimit = tlimitmin;
653
654 if(tPathLength > tlimit) tPathLength = tlimit;
655
656 }
657
658 // version similar to 7.1 (needed for some experiments)
659 else
660 {
661 if (stepStatus == fGeomBoundary)
662 {
663 if (currentRange > lambda0) tlimit = facrange*currentRange;
664 else tlimit = facrange*lambda0;
665
666 if(tlimit < tlimitmin) tlimit = tlimitmin;
667 if(tPathLength > tlimit) tPathLength = tlimit;
668 }
669 }
670 //G4cout << "tPathLength= " << tPathLength
671 // << " currentMinimalStep= " << currentMinimalStep << G4endl;
672 return ConvertTrueToGeom(tPathLength, currentMinimalStep);
673}
@ fUseSafety
@ fUseDistanceToBoundary
G4StepStatus
Definition: G4StepStatus.hh:51
@ fGeomBoundary
Definition: G4StepStatus.hh:54
G4double GetKineticEnergy() const
G4StepPoint * GetPreStepPoint() const
const G4DynamicParticle * GetDynamicParticle() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
const G4Step * GetStep() const
void SetCurrentCouple(const G4MaterialCutsCouple *)
Definition: G4VEmModel.hh:370
G4double facrange
Definition: G4VMscModel.hh:176
G4double ComputeGeomLimit(const G4Track &, G4double &presafety, G4double limit)
Definition: G4VMscModel.hh:256
G4double GetRange(const G4ParticleDefinition *part, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
Definition: G4VMscModel.hh:288
G4double ComputeSafety(const G4ThreeVector &position, G4double limit)
Definition: G4VMscModel.hh:238
G4MscStepLimitType steppingAlgorithm
Definition: G4VMscModel.hh:186
G4double ConvertTrueToGeom(G4double &tLength, G4double &gLength)
Definition: G4VMscModel.hh:246
G4double facsafety
Definition: G4VMscModel.hh:178
G4double facgeom
Definition: G4VMscModel.hh:177

◆ ComputeTrueStepLength()

G4double G4UrbanMscModel93::ComputeTrueStepLength ( G4double  geomStepLength)
virtual

Reimplemented from G4VMscModel.

Definition at line 763 of file G4UrbanMscModel93.cc.

764{
765 // step defined other than transportation
766 if(geomStepLength == zPathLength && tPathLength <= currentRange)
767 return tPathLength;
768
769 // t = z for very small step
770 zPathLength = geomStepLength;
771 tPathLength = geomStepLength;
772 if(geomStepLength < tlimitminfix) return tPathLength;
773
774 // recalculation
775 if((geomStepLength > lambda0*tausmall) && !insideskin)
776 {
777 if(par1 < 0.)
778 tPathLength = -lambda0*log(1.-geomStepLength/lambda0) ;
779 else
780 {
781 if(par1*par3*geomStepLength < 1.)
782 tPathLength = (1.-exp(log(1.-par1*par3*geomStepLength)/par3))/par1 ;
783 else
784 tPathLength = currentRange;
785 }
786 }
787 if(tPathLength < geomStepLength) tPathLength = geomStepLength;
788
789 //G4cout << "tPathLength= " << tPathLength << " step= " << geomStepLength << G4endl;
790
791 return tPathLength;
792}

◆ Initialise()

void G4UrbanMscModel93::Initialise ( const G4ParticleDefinition p,
const G4DataVector  
)
virtual

Implements G4VEmModel.

Definition at line 187 of file G4UrbanMscModel93.cc.

189{
190 skindepth = skin*stepmin;
191
192 // set values of some data members
193 SetParticle(p);
194
195 if(p->GetPDGMass() > MeV) {
196 G4cout << "### WARNING: G4UrbanMscModel93 model is used for "
197 << p->GetParticleName() << " !!! " << G4endl;
198 G4cout << "### This model should be used only for e+-"
199 << G4endl;
200 }
201
202 fParticleChange = GetParticleChangeForMSC(p);
203}
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
const G4String & GetParticleName() const
G4ParticleChangeForMSC * GetParticleChangeForMSC(const G4ParticleDefinition *p=0)
Definition: G4VMscModel.cc:89

◆ SampleScattering()

G4ThreeVector & G4UrbanMscModel93::SampleScattering ( const G4DynamicParticle dynParticle,
G4double  safety 
)
virtual

Reimplemented from G4VMscModel.

Definition at line 820 of file G4UrbanMscModel93.cc.

822{
823 fDisplacement.set(0.0,0.0,0.0);
824 G4double kineticEnergy = currentKinEnergy;
825 if (tPathLength > currentRange*dtrl) {
826 kineticEnergy = GetEnergy(particle,currentRange-tPathLength,couple);
827 } else {
828 kineticEnergy -= tPathLength*GetDEDX(particle,currentKinEnergy,couple);
829 }
830 if((kineticEnergy <= eV) || (tPathLength <= tlimitminfix) ||
831 (tPathLength/tausmall < lambda0)) { return fDisplacement; }
832
833 G4double cth = SampleCosineTheta(tPathLength,kineticEnergy);
834
835 // protection against 'bad' cth values
836 if(std::fabs(cth) > 1.) { return fDisplacement; }
837
838 // extra protection agaist high energy particles backscattered
839 if(cth < 1.0 - 1000*tPathLength/lambda0 && kineticEnergy > 20*MeV) {
840 //G4cout << "Warning: large scattering E(MeV)= " << kineticEnergy
841 // << " s(mm)= " << tPathLength/mm
842 // << " 1-cosTheta= " << 1.0 - cth << G4endl;
843 // do Gaussian central scattering
844 if(kineticEnergy > GeV && cth < 0.0) {
846 ed << dynParticle->GetDefinition()->GetParticleName()
847 << " E(MeV)= " << kineticEnergy/MeV
848 << " Step(mm)= " << tPathLength/mm
849 << " in " << CurrentCouple()->GetMaterial()->GetName()
850 << " CosTheta= " << cth
851 << " is too big - the angle is resampled" << G4endl;
852 G4Exception("G4UrbanMscModel93::SampleScattering","em0004",
853 JustWarning, ed,"");
854 }
855 do {
856 cth = 1.0 + 2*log(G4UniformRand())*tPathLength/lambda0;
857 } while(cth < -1.0);
858 }
859
860 G4double sth = sqrt((1.0 - cth)*(1.0 + cth));
861 G4double phi = twopi*G4UniformRand();
862 G4double dirx = sth*cos(phi);
863 G4double diry = sth*sin(phi);
864
865 G4ThreeVector oldDirection = dynParticle->GetMomentumDirection();
866 G4ThreeVector newDirection(dirx,diry,cth);
867 newDirection.rotateUz(oldDirection);
868 fParticleChange->ProposeMomentumDirection(newDirection);
869
870 if (latDisplasment && safety > tlimitminfix) {
871
872 G4double r = SampleDisplacement();
873 /*
874 G4cout << "G4UrbanMscModel93::SampleSecondaries: e(MeV)= " << kineticEnergy
875 << " sinTheta= " << sth << " r(mm)= " << r
876 << " trueStep(mm)= " << tPathLength
877 << " geomStep(mm)= " << zPathLength
878 << G4endl;
879 */
880 if(r > 0.)
881 {
882 G4double latcorr = LatCorrelation();
883 if(latcorr > r) latcorr = r;
884
885 // sample direction of lateral displacement
886 // compute it from the lateral correlation
887 G4double Phi = 0.;
888 if(std::abs(r*sth) < latcorr)
889 Phi = twopi*G4UniformRand();
890 else
891 {
892 G4double psi = std::acos(latcorr/(r*sth));
893 if(G4UniformRand() < 0.5)
894 Phi = phi+psi;
895 else
896 Phi = phi-psi;
897 }
898
899 dirx = r*std::cos(Phi);
900 diry = r*std::sin(Phi);
901
902 fDisplacement.set(dirx,diry,0.0);
903 fDisplacement.rotateUz(oldDirection);
904 }
905 }
906 return fDisplacement;
907}
@ JustWarning
void set(double x, double y, double z)
Hep3Vector & rotateUz(const Hep3Vector &)
Definition: ThreeVector.cc:72
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
const G4Material * GetMaterial() const
const G4String & GetName() const
Definition: G4Material.hh:177
void ProposeMomentumDirection(const G4ThreeVector &Pfinal)
const G4MaterialCutsCouple * CurrentCouple() const
Definition: G4VEmModel.hh:377
G4double GetDEDX(const G4ParticleDefinition *part, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
Definition: G4VMscModel.hh:273
G4bool latDisplasment
Definition: G4VMscModel.hh:189
G4ThreeVector fDisplacement
Definition: G4VMscModel.hh:185
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76

◆ StartTracking()

void G4UrbanMscModel93::StartTracking ( G4Track track)
virtual

Reimplemented from G4VEmModel.

Definition at line 449 of file G4UrbanMscModel93.cc.

450{
451 SetParticle(track->GetDynamicParticle()->GetDefinition());
452 firstStep = true;
453 inside = false;
454 insideskin = false;
455 tlimit = geombig;
456}

The documentation for this class was generated from the following files: