220 if (!IsScatProjToProjCase){
221 gammaEnergy=adjointPrimKinEnergy;
224 if (Emin>=Emax)
return;
225 projectileKinEnergy=Emin*std::pow(Emax/Emin,
G4UniformRand());
231 if (Emin>=Emax)
return;
233 G4double f2=(Emax-adjointPrimKinEnergy)/Emax/f1;
235 projectileKinEnergy=adjointPrimKinEnergy/(1.-f1*std::pow(f2,
G4UniformRand()));
236 gammaEnergy=projectileKinEnergy-adjointPrimKinEnergy;
237 diffCSUsed=
lastCZ*adjointPrimKinEnergy/projectileKinEnergy/gammaEnergy;
254 w_corr*=diffCS/diffCSUsed;
256 G4double new_weight = aTrack.GetWeight()*w_corr;
257 fParticleChange->SetParentWeightByProcess(
false);
258 fParticleChange->SetSecondaryWeightByProcess(
false);
259 fParticleChange->ProposeParentWeight(new_weight);
264 G4double projectileTotalEnergy = projectileM0+projectileKinEnergy;
265 G4double projectileP2 = projectileTotalEnergy*projectileTotalEnergy - projectileM0*projectileM0;
266 G4double projectileP = std::sqrt(projectileP2);
285 projectileMomentum=
G4ThreeVector(std::cos(phi)*sint,std::sin(phi)*sint,cost)*projectileP;
286 if (IsScatProjToProjCase) {
289 G4double cost1 = std::cos(dirProd.
angle(projectileMomentum));
290 G4double sint1 = std::sqrt(1.-cost1*cost1);
291 projectileMomentum=
G4ThreeVector(std::cos(phi)*sint1,std::sin(phi)*sint1,cost1)*projectileP;
299 if (!IsScatProjToProjCase ){
300 fParticleChange->ProposeTrackStatus(fStopAndKill);
304 fParticleChange->ProposeEnergy(projectileKinEnergy);
305 fParticleChange->ProposeMomentumDirection(projectileMomentum.
unit());
virtual G4double GetSecondAdjEnergyMaxForProdToProjCase(G4double PrimAdjEnergy)
CLHEP::Hep3Vector G4ThreeVector
G4double GetPostStepWeightCorrection()
G4double CS_biasing_factor
G4Material * currentMaterial
G4ParticleDefinition * theAdjEquivOfDirectPrimPartDef
G4double GetTotalEnergy() const
virtual G4double GetSecondAdjEnergyMaxForScatProjToProjCase(G4double PrimAdjEnergy)
double angle(const Hep3Vector &) const
G4double GetKineticEnergy() const
virtual G4double DiffCrossSectionPerVolumePrimToSecond(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyProd)
virtual G4double GetSecondAdjEnergyMinForProdToProjCase(G4double PrimAdjEnergy)
Hep3Vector & rotateUz(const Hep3Vector &)
static const double twopi
void DefineCurrentMaterial(const G4MaterialCutsCouple *couple)
const G4ThreeVector & GetMomentumDirection() const
virtual G4double GetSecondAdjEnergyMinForScatProjToProjCase(G4double PrimAdjEnergy, G4double Tcut=0)
G4double GetPDGMass() const
static const G4double Emin
static const G4double Emax
G4double currentTcutForDirectSecond
static G4AdjointCSManager * GetAdjointCSManager()