72 if(!fWithRapidSampling)
79 adjointPrimKinEnergy, projectileKinEnergy,
96 projectileKinEnergy = Emin * std::pow(Emax / Emin,
G4UniformRand());
104 fLastCS * std::log(Emax / Emin) / projectileKinEnergy;
105 G4double needed_diffCS = adjointPrimKinEnergy / projectileKinEnergy;
106 if(!IsScatProjToProj)
112 new_weight *= needed_diffCS / used_diffCS;
122 G4double projectileTotalEnergy = projectileM0 + projectileKinEnergy;
124 projectileTotalEnergy * projectileTotalEnergy - projectileM0 * projectileM0;
133 companionM0 + projectileKinEnergy - adjointPrimKinEnergy;
135 companionTotalEnergy * companionTotalEnergy - companionM0 * companionM0;
139 (adjointPrimP * adjointPrimP + projectileP2 - companionP2) /
141 G4double P_perp = std::sqrt(projectileP2 - P_parallel * P_parallel);
145 G4ThreeVector(P_perp * std::cos(phi), P_perp * std::sin(phi), P_parallel);
146 projectileMomentum.
rotateUz(dir_parallel);
148 if(!IsScatProjToProj)
173 if(kinEnergyProj > Emin_proj && kinEnergyProj <= Emax_proj)
175 dSigmadEprod =
Z * DiffCrossSectionMoller(kinEnergyProj, kinEnergyProd);
181G4double G4AdjointeIonisationModel::DiffCrossSectionMoller(
185 G4double x = kinEnergyProd / kinEnergyProj;
186 G4double gam = (kinEnergyProj + electron_mass_c2) / electron_mass_c2;
188 G4double beta2 = 1.0 - 1.0 / gamma2;
190 G4double gg = (2.0 * gam - 1.0) / gamma2;
192 G4double fac = twopi_mc2_rcl2 / electron_mass_c2;
194 fac * (1. - gg + ((1.0 - gg * x) / (x * x)) + ((1.0 - gg * y) / (y * y))) /
195 (beta2 * (gam - 1.));
196 return dCS / kinEnergyProj;
CLHEP::Hep3Vector G4ThreeVector
Hep3Vector & rotateUz(const Hep3Vector &)
static G4AdjointElectron * AdjointElectron()
G4double DiffCrossSectionPerAtomPrimToSecond(G4double kinEnergyProj, G4double kinEnergyProd, G4double Z, G4double A=0.) override
~G4AdjointeIonisationModel() override
void SampleSecondaries(const G4Track &aTrack, G4bool isScatProjToProj, G4ParticleChange *fParticleChange) override
G4AdjointeIonisationModel()
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
G4double GetTotalMomentum() const
static G4Electron * Electron()
void AddSecondary(G4Track *aSecondary)
void ProposeEnergy(G4double finalEnergy)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
G4double GetPDGMass() const
G4double GetWeight() const
const G4DynamicParticle * GetDynamicParticle() const
virtual G4double GetSecondAdjEnergyMaxForProdToProj(G4double primAdjEnergy)
G4double fLastAdjointCSForScatProjToProj
G4bool fSecondPartSameType
G4ParticleDefinition * fAdjEquivDirectSecondPart
virtual G4double DiffCrossSectionPerVolumePrimToScatPrim(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyScatProj)
virtual G4double GetSecondAdjEnergyMinForScatProjToProj(G4double primAdjEnergy, G4double tcut=0.)
G4ParticleDefinition * fAdjEquivDirectPrimPart
virtual G4double GetSecondAdjEnergyMaxForScatProjToProj(G4double primAdjEnergy)
G4Material * fCurrentMaterial
virtual G4double DiffCrossSectionPerVolumePrimToSecond(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyProd)
virtual void CorrectPostStepWeight(G4ParticleChange *fParticleChange, G4double old_weight, G4double adjointPrimKinEnergy, G4double projectileKinEnergy, G4bool isScatProjToProj)
G4bool fUseMatrixPerElement
virtual G4double GetSecondAdjEnergyMinForProdToProj(G4double primAdjEnergy)
G4ParticleDefinition * fDirectPrimaryPart
G4bool fOneMatrixForAllElements
G4double SampleAdjSecEnergyFromCSMatrix(std::size_t MatrixIndex, G4double prim_energy, G4bool isScatProjToProj)
G4double GetHighEnergyLimit()
G4double fLastAdjointCSForProdToProj
void ProposeTrackStatus(G4TrackStatus status)
void SetSecondaryWeightByProcess(G4bool)
void SetParentWeightByProcess(G4bool)
void ProposeParentWeight(G4double finalWeight)