33 #include "G4TrackStatus.hh" 34 #include "G4ParticleChange.hh" 66 G4bool IsScatProjToProjCase,
67 G4ParticleChange* fParticleChange)
92 IsScatProjToProjCase);
97 if (IsScatProjToProjCase) {
105 projectileKinEnergy = Emin*std::pow(Emax/Emin,
G4UniformRand());
112 G4double new_weight=aTrack.GetWeight();
113 G4double used_diffCS=
lastCS*std::log(Emax/Emin)/projectileKinEnergy;
114 G4double needed_diffCS=adjointPrimKinEnergy/projectileKinEnergy;
117 new_weight*=needed_diffCS/used_diffCS;
118 fParticleChange->SetParentWeightByProcess(
false);
119 fParticleChange->SetSecondaryWeightByProcess(
false);
120 fParticleChange->ProposeParentWeight(new_weight);
133 G4double projectileTotalEnergy = projectileM0+projectileKinEnergy;
134 G4double projectileP2 = projectileTotalEnergy*projectileTotalEnergy - projectileM0*projectileM0;
141 if (IsScatProjToProjCase) {
144 G4double companionTotalEnergy =companionM0+ projectileKinEnergy-adjointPrimKinEnergy;
145 G4double companionP2 = companionTotalEnergy*companionTotalEnergy - companionM0*companionM0;
150 G4double P_parallel = (adjointPrimP*adjointPrimP + projectileP2 - companionP2)/(2.*adjointPrimP);
151 G4double P_perp = std::sqrt( projectileP2 - P_parallel*P_parallel);
155 projectileMomentum.
rotateUz(dir_parallel);
159 if (!IsScatProjToProjCase ){
160 fParticleChange->ProposeTrackStatus(fStopAndKill);
165 fParticleChange->ProposeEnergy(projectileKinEnergy);
166 fParticleChange->ProposeMomentumDirection(projectileMomentum.
unit());
187 if (kinEnergyProj>Emin_proj && kinEnergyProj<=Emax_proj){
201 G4double x = kinEnergyProd/kinEnergyProj;
206 G4double gg = (2.0*gam - 1.0)/gamma2;
209 G4double dCS = fac*( 1.-gg + ((1.0 - gg*
x)/(x*x))
210 + ((1.0 - gg*y)/(y*
y)))/(beta2*(gam-1));
211 return dCS/kinEnergyProj;
virtual void SampleSecondaries(const G4Track &aTrack, G4bool IsScatProjToProjCase, G4ParticleChange *fParticleChange)
virtual ~G4AdjointeIonisationModel()
virtual G4double DiffCrossSectionPerVolumePrimToSecond(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyProd)
virtual G4double GetSecondAdjEnergyMaxForProdToProjCase(G4double PrimAdjEnergy)
G4double lastAdjointCSForScatProjToProjCase
CLHEP::Hep3Vector G4ThreeVector
G4double SampleAdjSecEnergyFromCSMatrix(size_t MatrixIndex, G4double prim_energy, G4bool IsScatProjToProjCase)
G4ParticleDefinition * theDirectPrimaryPartDef
G4double GetTotalMomentum() const
virtual G4double DiffCrossSectionPerVolumePrimToScatPrim(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyScatProj)
static G4AdjointElectron * AdjointElectron()
G4double CS_biasing_factor
G4Material * currentMaterial
G4ParticleDefinition * theAdjEquivOfDirectPrimPartDef
virtual G4double GetSecondAdjEnergyMaxForScatProjToProjCase(G4double PrimAdjEnergy)
virtual G4double DiffCrossSectionPerAtomPrimToSecond(G4double kinEnergyProj, G4double kinEnergyProd, G4double Z, G4double A=0.)
G4double GetKineticEnergy() const
virtual G4double GetSecondAdjEnergyMinForProdToProjCase(G4double PrimAdjEnergy)
Hep3Vector & rotateUz(const Hep3Vector &)
G4bool UseOnlyOneMatrixForAllElements
const G4ThreeVector & GetMomentumDirection() const
virtual G4double GetSecondAdjEnergyMinForScatProjToProjCase(G4double PrimAdjEnergy, G4double Tcut=0)
G4double GetPDGMass() const
static const G4double Emin
static G4Electron * Electron()
static const G4double fac
static const G4double Emax
G4ParticleDefinition * theAdjEquivOfDirectSecondPartDef
G4double currentTcutForDirectSecond
G4double lastAdjointCSForProdToProjCase
G4bool UseMatrixPerElement
G4AdjointeIonisationModel()
G4double DiffCrossSectionMoller(G4double kinEnergyProj, G4double kinEnergyProd)
virtual void CorrectPostStepWeight(G4ParticleChange *fParticleChange, G4double old_weight, G4double adjointPrimKinEnergy, G4double projectileKinEnergy, G4bool IsScatProjToProjCase)
G4bool second_part_of_same_type