453 lambda0 = beta2*(1.+scrA)*mctoScrA/bc/scpCor;
454 g1 = 2.0*scrA*((1.0+scrA)*
G4Log(1.0/scrA+1.0)-1.0);
455 lambda1 = lambda0/g1;
511 distance *= (1.20-
fZeff*(1.62e-2-9.22e-5*
fZeff));
762 if (cost<-1.) cost = -1.;
763 if (cost> 1.) cost = 1.;
766 G4double sint = std::sqrt(dum*(2.-dum));
868 tlength = geomStepLength;
945 G4double kineticEnergy0 = kineticEnergy;
947 kineticEnergy -= 0.5*eloss;
951 eps0 = eloss/kineticEnergy0;
952 epsm = eloss/kineticEnergy;
954 efEnergy = kineticEnergy * (1.-epsm*epsm*(6.+10.*tau+5.*tau2)/(24.*tau2+48.*tau+72.));
955 G4double dum = 0.166666*(4.+tau*(6.+tau*(7.+tau*(4.+tau))))*(epsm/((tau+1.)*(tau+2.)))*(epsm/((tau+1.)*(tau+2.)));
958 kineticEnergy -= 0.5*eloss;
959 efEnergy = kineticEnergy;
960 G4double factor = 1./(1.+0.9784671*kineticEnergy);
961 eps0 = eloss/kineticEnergy0;
962 epsm = eps0/(1.-0.5*eps0);
963 G4double temp = 0.3*(1 -factor*(1.-0.333333*factor))*eps0*eps0;
975 if (lambdan<=1.0e-12) {
986 G4double cosTheta1 = 1.0, sinTheta1 = 0.0, cosTheta2 = 1.0, sinTheta2 = 0.0;
987 G4double cosPhi1 = 1.0, sinPhi1 = 0.0, cosPhi2 = 1.0, sinPhi2 = 0.0;
988 G4double uss = 0.0, vss = 0.0, wss = 1.0;
989 G4double x_coord = 0.0, y_coord = 0.0, z_coord = 1.0;
995 sinTheta1 = std::sqrt((1.-cosTheta1)*(1.+cosTheta1));
997 sinTheta2 = std::sqrt((1.-cosTheta2)*(1.+cosTheta2));
1006 G4int mcEkinIdx = -1;
1007 G4int mcDeltIdx = -1;
1014 if (cosTheta1+cosTheta2==2.) {
1023 sinPhi1 = std::sin(phi1);
1024 cosPhi1 = std::cos(phi1);
1026 sinPhi2 = std::sin(phi2);
1027 cosPhi2 = std::cos(phi2);
1030 u2 = sinTheta2*cosPhi2;
1031 v2 = sinTheta2*sinPhi2;
1032 G4double u2p = cosTheta1*u2 + sinTheta1*cosTheta2;
1033 uss = u2p*cosPhi1 - v2*sinPhi1;
1034 vss = u2p*sinPhi1 + v2*cosPhi1;
1035 wss = cosTheta1*cosTheta2 - sinTheta1*u2;
1055 if(Qn1<0.7) par = 1.;
1056 else if (Qn1<7.0) par = -0.031376*Qn1+1.01356;
1072 G4double delta = 0.9082483-(0.1020621-0.0263747*gamma)*Qn1;
1076 G4double temp = (2.0+tau*temp1)/((tau+1.0)*temp1);
1078 temp = temp - (tau+1.0)/((tau+2.0)*(loga*(1.0+
fScrA)-1.0));
1081 delta = delta + 0.40824829*(eps0*(tau+1.0)/((tau+2.0)*
1082 (loga*(1.0+
fScrA)-1.0)*(loga*(1.0+2.0*
fScrA)-2.0)) - 0.25*temp*temp);
1089 G4double ut = b*sinTheta1*cosPhi1 + c*(cosPhi1*u2 - sinPhi1*w1v2) + eta1*uss*temp1;
1090 G4double vt = b*sinTheta1*sinPhi1 + c*(sinPhi1*u2 + cosPhi1*w1v2) + eta1*vss*temp1;
1091 G4double wt = eta1*(1+temp) + b*cosTheta1 + c*cosTheta2 + eta1*wss*temp1;
1108 G4double transportDistance = std::sqrt(x_coord*x_coord+y_coord*y_coord+z_coord*z_coord);
1127 zz = 1.0 - Qn1*(0.5 - Qn1*(0.166666667 - 0.041666667*Qn1));
1129 zz = (1.-
G4Exp(-Qn1))/Qn1;
1137 G4double rr = (1.-zz*zz)/(1.-wss*wss);
1138 if(rr >= 0.25) rr = 0.25;
1140 x_coord = rperp*uss;
1141 y_coord = rperp*vss;
1145 G4double transportDistance = std::sqrt(x_coord*x_coord + y_coord*y_coord + z_coord*z_coord);
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
static constexpr double nm
static constexpr double mm
void set(double x, double y, double z)
Hep3Vector & rotateUz(const Hep3Vector &)
G4double GetLogKineticEnergy() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4EmParameters * Instance()
void GetPWACorrectionFactors(G4double logekin, G4double beta2, G4int matindx, G4double &corToScr, G4double &corToQ1, G4double &corToG2PerG1)
G4double ComputeTruePathLengthLimit(const G4Track &track, G4double ¤tMinimalStep) override
G4ThreeVector & SampleScattering(const G4ThreeVector &, G4double safety) override
G4double ComputeGeomPathLength(G4double truePathLength) override
G4bool fIsEndedUpOnBoundary
void StartTracking(G4Track *) override
G4bool fIsMultipleSacettring
const G4MaterialCutsCouple * currentCouple
G4GSPWACorrections * GetPWACorrection()
G4bool fIsUsePWACorrection
G4GoudsmitSaundersonMscModel(const G4String &nam="GoudsmitSaunderson")
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
G4double fTheTrueStepLenght
G4GoudsmitSaundersonTable * fGSTable
G4ThreeVector fTheDisplacementVector
G4ParticleChangeForMSC * fParticleChange
CLHEP::HepRandomEngine * rndmEngineMod
G4bool fIsSingleScattering
void SetParticle(const G4ParticleDefinition *p)
G4GoudsmitSaundersonTable * GetGSTable()
static G4bool gIsUseAccurate
~G4GoudsmitSaundersonMscModel() override
G4double GetTransportMeanFreePathOnly(const G4ParticleDefinition *, G4double)
G4double Randomizetlimit()
G4double ComputeTrueStepLength(G4double geomStepLength) override
const G4ParticleDefinition * particle
G4bool GetOptionMottCorrection() const
G4bool GetOptionPWACorrection() const
void InitialiseLocal(const G4ParticleDefinition *p, G4VEmModel *masterModel) override
G4bool fIsEverythingWasDone
G4bool fIsUseMottCorrection
G4int currentMaterialIndex
G4double GetTransportMeanFreePath(const G4ParticleDefinition *, G4double)
G4bool fIsNoScatteringInMSC
G4double currentKinEnergy
G4ThreeVector fTheNewDirection
static G4bool gIsOptimizationOn
G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX) override
G4GSPWACorrections * fPWACorrection
G4LossTableManager * theManager
G4double fTheTransportDistance
G4double ComputeScatteringPowerCorrection(const G4MaterialCutsCouple *matcut, G4double ekin)
void GetMottCorrectionFactors(G4double logekin, G4double beta2, G4int matindx, G4double &mcToScr, G4double &mcToQ1, G4double &mcToG2PerG1)
G4double SingleScattering(G4double lambdaval, G4double scra, G4double lekin, G4double beta2, G4int matindx)
G4bool Sampling(G4double lambdaval, G4double qval, G4double scra, G4double &cost, G4double &sint, G4double lekin, G4double beta2, G4int matindx, GSMSCAngularDtr **gsDtr, G4int &mcekini, G4int &mcdelti, G4double &transfPar, G4bool isfirst)
void SetOptionPWACorrection(G4bool val)
G4double GetMoliereBc(G4int matindx)
void Initialise(G4double lownergylimit, G4double highenergylimit)
G4double GetMoliereXc2(G4int matindx)
void SetOptionMottCorrection(G4bool val)
G4double GetZeffective() const
static G4LossTableManager * Instance()
const G4Material * GetMaterial() const
G4IonisParamMat * GetIonisation() const
void ProposeMomentumDirection(const G4ThreeVector &Pfinal)
G4double GetPDGCharge() const
static G4Pow * GetInstance()
G4double powA(G4double A, G4double y) const
G4StepPoint * GetPreStepPoint() const
const G4DynamicParticle * GetDynamicParticle() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
const G4Step * GetStep() const
G4double LowEnergyLimit() const
void SetCurrentCouple(const G4MaterialCutsCouple *)
G4double HighEnergyLimit() const
G4double ComputeGeomLimit(const G4Track &, G4double &presafety, G4double limit)
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)
void InitialiseParameters(const G4ParticleDefinition *)
static constexpr double electron_mass_c2
static constexpr double twopi
static constexpr double eV
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
G4bool isElectron(G4int ityp)