54 #ifndef G4UrbanMscModel_h
55 #define G4UrbanMscModel_h 1
70 static const G4double c_highland = 13.6*CLHEP::MeV ;
112 inline void UpdateCache();
114 inline G4double SampleDisplacement();
140 G4double tlimitminfix,tlimitminfix2;
167 G4int currentMaterialIndex;
173 G4double coeffc1,coeffc2,coeffc3,coeffc4;
190 ChargeSquare = charge*charge;
197 void G4UrbanMscModel::UpdateCache()
202 G4double facz = 0.990395+w*(-0.168386+w*0.093286) ;
203 coeffth1 = facz*(1. - 8.7780e-2/Zeff);
204 coeffth2 = facz*(4.0780e-2 + 1.7315e-4*Zeff);
208 coeffc1 = 2.3785 - Z13*(4.1981e-1 - Z13*6.3100e-2);
209 coeffc2 = 4.7526e-1 + Z13*(1.7694 - Z13*3.3885e-1);
210 coeffc3 = 2.3683e-1 - Z13*(1.8111 - Z13*3.2774e-1);
211 coeffc4 = 1.7888e-2 + Z13*(1.9659e-2 - Z13*2.6664e-3);
228 G4double invbetacp = sqrt((currentKinEnergy+mass)*(KineticEnergy+mass)/
229 (currentKinEnergy*(currentKinEnergy+2.*mass)*
230 KineticEnergy*(KineticEnergy+2.*mass)));
231 y = trueStepLength/currentRadLength;
232 G4double theta0 = c_highland*std::abs(charge)*sqrt(y)*invbetacp;
235 theta0 *= (coeffth1+coeffth2*y);
246 G4double a = (2.*xmeanth+9.*x2meanth-3.)/(2.*xmeanth-3.*x2meanth+1.);
262 G4double G4UrbanMscModel::SampleDisplacement()
265 if ((currentTau >= tausmall) && !insideskin) {
266 G4double rmax = sqrt((tPathLength-zPathLength)*(tPathLength+zPathLength));
275 G4double G4UrbanMscModel::LatCorrelation()
278 static const G4double kappami1 = 1.5;
281 if((currentTau >= tausmall) && !insideskin)
283 if(currentTau < taulim)
284 latcorr = lambdaeff*kappa*currentTau*currentTau*
285 (1.-(kappa+1.)*currentTau*third)*third;
289 if(currentTau < taubig) { etau =
G4Exp(-currentTau); }
290 latcorr = -kappa*currentTau;
291 latcorr =
G4Exp(latcorr)/kappami1;
292 latcorr += 1.-kappa*etau/kappami1 ;
293 latcorr *= 2.*lambdaeff*third;
G4UrbanMscModel(const G4String &nam="UrbanMsc")
virtual ~G4UrbanMscModel()
G4ThreeVector & SampleScattering(const G4ThreeVector &, G4double safety)
G4double ComputeGeomPathLength(G4double truePathLength)
G4double ComputeTrueStepLength(G4double geomStepLength)
G4double G4Log(G4double x)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
void Initialise(const G4ParticleDefinition *, const G4DataVector &)
G4double GetPDGMass() const
G4double ComputeTheta0(G4double truePathLength, G4double KineticEnergy)
G4double GetPDGCharge() const
void StartTracking(G4Track *)
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *particle, G4double KineticEnergy, G4double AtomicNumber, G4double AtomicWeight=0., G4double cut=0., G4double emax=DBL_MAX)
G4double ComputeTruePathLengthLimit(const G4Track &track, G4double ¤tMinimalStep)