35 #include "G4TrackStatus.hh" 36 #include "G4ParticleChange.hh" 124 G4bool IsScatProjToProjCase,
125 G4ParticleChange* fParticleChange)
141 IsScatProjToProjCase);
146 adjointPrimKinEnergy,
148 IsScatProjToProjCase);
154 G4double projectileTotalEnergy = projectileM0+projectileKinEnergy;
155 G4double projectileP2 = projectileTotalEnergy*projectileTotalEnergy - projectileM0*projectileM0;
156 G4double projectileP = std::sqrt(projectileP2);
175 projectileMomentum=
G4ThreeVector(std::cos(phi)*sint,std::sin(phi)*sint,cost)*projectileP;
176 if (IsScatProjToProjCase) {
179 G4double cost1 = std::cos(dirProd.
angle(projectileMomentum));
180 G4double sint1 = std::sqrt(1.-cost1*cost1);
181 projectileMomentum=
G4ThreeVector(std::cos(phi)*sint1,std::sin(phi)*sint1,cost1)*projectileP;
189 if (!IsScatProjToProjCase ){
190 fParticleChange->ProposeTrackStatus(fStopAndKill);
194 fParticleChange->ProposeEnergy(projectileKinEnergy);
195 fParticleChange->ProposeMomentumDirection(projectileMomentum.
unit());
202 G4bool IsScatProjToProjCase,
203 G4ParticleChange* fParticleChange)
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());
349 if (kinEnergyProj>Emin_proj && kinEnergyProj<=Emax_proj){
351 dCrossEprod=sigma/kinEnergyProd/std::log(kinEnergyProj/
keV);
373 G4double E1=kinEnergyProd,E2=kinEnergyProd*1.001;
378 dCrossEprod += theAtomNumDensityVector[i] * (C1-
C2)/dE;
402 G4bool IsScatProjToProjCase)
412 if (!IsScatProjToProjCase ){
420 if (Emax_proj>Emin_proj) Cross=
lastCZ*std::log((Emax_proj-primEnergy)*Emin_proj/Emax_proj/(Emin_proj-primEnergy));
428 G4bool IsScatProjToProjCase)
static G4AdjointGamma * AdjointGamma()
virtual G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
G4VEmModel * theDirectStdBremModel
virtual G4double GetSecondAdjEnergyMaxForProdToProjCase(G4double PrimAdjEnergy)
G4EmModelManager * theEmModelManagerForFwdModels
std::vector< G4Element * > G4ElementVector
virtual void SampleSecondaries(const G4Track &aTrack, G4bool IsScatProjToProjCase, G4ParticleChange *fParticleChange)
~G4AdjointBremsstrahlungModel()
virtual G4double AdjointCrossSection(const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
const G4Material * GetMaterial() const
CLHEP::Hep3Vector G4ThreeVector
G4double GetPostStepWeightCorrection()
G4double SampleAdjSecEnergyFromCSMatrix(size_t MatrixIndex, G4double prim_energy, G4bool IsScatProjToProjCase)
G4ParticleDefinition * theDirectPrimaryPartDef
G4bool isDirectModelInitialised
virtual G4double GetAdjointCrossSection(const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
void AddEmModel(G4int, G4VEmModel *, G4VEmFluctuationModel *, const G4Region *)
static G4AdjointElectron * AdjointElectron()
G4double CS_biasing_factor
G4Material * currentMaterial
G4ParticleDefinition * theAdjEquivOfDirectPrimPartDef
G4double GetTotalEnergy() const
virtual G4double GetSecondAdjEnergyMaxForScatProjToProjCase(G4double PrimAdjEnergy)
double angle(const Hep3Vector &) const
virtual G4double GetAdjointCrossSection(const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
void SetUseMatrixPerElement(G4bool aBool)
G4double GetKineticEnergy() const
virtual G4double DiffCrossSectionPerVolumePrimToSecond(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyProd)
const G4double * GetAtomicNumDensityVector() const
G4VEmModel * theDirectEMModel
virtual G4double GetSecondAdjEnergyMinForProdToProjCase(G4double PrimAdjEnergy)
Hep3Vector & rotateUz(const Hep3Vector &)
static const double twopi
void RapidSampleSecondaries(const G4Track &aTrack, G4bool IsScatProjToProjCase, G4ParticleChange *fParticleChange)
G4AdjointBremsstrahlungModel()
void SetUseMatrix(G4bool aBool)
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void DefineCurrentMaterial(const G4MaterialCutsCouple *couple)
const G4DataVector * Initialise(const G4ParticleDefinition *part, const G4ParticleDefinition *secPart, G4double minSubRange, G4int verb)
virtual G4double AdjointCrossSection(const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
G4double DiffCrossSectionPerVolumePrimToSecondApproximated2(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyProd)
const G4ThreeVector & GetMomentumDirection() const
virtual G4double GetSecondAdjEnergyMinForScatProjToProjCase(G4double PrimAdjEnergy, G4double Tcut=0)
G4double GetPDGMass() const
size_t GetNumberOfElements() const
static const G4double Emin
G4double DiffCrossSectionPerVolumePrimToSecondApproximated1(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyProd)
static G4Electron * Electron()
static const G4double Emax
G4ParticleDefinition * theAdjEquivOfDirectSecondPartDef
G4double currentTcutForDirectSecond
const G4ElementVector * GetElementVector() const
void SetApplyCutInRange(G4bool aBool)
static G4AdjointCSManager * GetAdjointCSManager()
virtual void CorrectPostStepWeight(G4ParticleChange *fParticleChange, G4double old_weight, G4double adjointPrimKinEnergy, G4double projectileKinEnergy, G4bool IsScatProjToProjCase)
G4bool second_part_of_same_type