34 #include "G4TrackStatus.hh" 35 #include "G4ParticleChange.hh" 85 G4bool IsScatProjToProjCase,
86 G4ParticleChange* fParticleChange)
106 adjointPrimKinEnergy,
108 IsScatProjToProjCase);
117 G4double projectileTotalEnergy = projectileM0+projectileKinEnergy;
118 G4double projectileP2 = projectileTotalEnergy*projectileTotalEnergy - projectileM0*projectileM0;
125 if (IsScatProjToProjCase) {
128 G4double companionTotalEnergy =companionM0+ projectileKinEnergy-adjointPrimKinEnergy;
129 G4double companionP2 = companionTotalEnergy*companionTotalEnergy - companionM0*companionM0;
134 G4double P_parallel = (adjointPrimP*adjointPrimP + projectileP2 - companionP2)/(2.*adjointPrimP);
135 G4double P_perp = std::sqrt( projectileP2 - P_parallel*P_parallel);
139 projectileMomentum.
rotateUz(dir_parallel);
143 if (!IsScatProjToProjCase ){
144 fParticleChange->ProposeTrackStatus(fStopAndKill);
149 fParticleChange->ProposeEnergy(projectileKinEnergy);
150 fParticleChange->ProposeMomentumDirection(projectileMomentum.
unit());
161 G4bool IsScatProjToProjCase,
162 G4ParticleChange* fParticleChange)
179 if (!IsScatProjToProjCase){
181 eEnergy=adjointPrimKinEnergy;
184 if (Emin>=Emax)
return;
187 newCS=newCS*(b-
a)/eEnergy;
195 if (Emin>=Emax)
return;
196 G4double diff1=Emin-adjointPrimKinEnergy;
197 G4double diff2=Emax-adjointPrimKinEnergy;
199 G4double t1=adjointPrimKinEnergy*(1./diff1-1./diff2);
205 newCS=newCS*sum_t/adjointPrimKinEnergy/adjointPrimKinEnergy;
209 projectileKinEnergy =adjointPrimKinEnergy +1./(1./diff1-q);
214 projectileKinEnergy =1./(1./Emin-q);
217 projectileKinEnergy=Emin*std::pow(Emax/Emin,
G4UniformRand());
220 eEnergy=projectileKinEnergy-adjointPrimKinEnergy;
227 G4double diffCS_perAtom_Used=
twopi_mc2_rcl2*mass*adjointPrimKinEnergy/projectileKinEnergy/projectileKinEnergy/eEnergy/eEnergy;
243 w_corr*=diffCS/diffCS_perAtom_Used;
246 G4double new_weight = aTrack.GetWeight()*w_corr;
247 fParticleChange->SetParentWeightByProcess(
false);
248 fParticleChange->SetSecondaryWeightByProcess(
false);
249 fParticleChange->ProposeParentWeight(new_weight);
260 G4double projectileTotalEnergy = projectileM0+projectileKinEnergy;
261 G4double projectileP2 = projectileTotalEnergy*projectileTotalEnergy - projectileM0*projectileM0;
268 if (IsScatProjToProjCase) {
271 G4double companionTotalEnergy =companionM0+ projectileKinEnergy-adjointPrimKinEnergy;
272 G4double companionP2 = companionTotalEnergy*companionTotalEnergy - companionM0*companionM0;
277 G4double P_parallel = (adjointPrimP*adjointPrimP + projectileP2 - companionP2)/(2.*adjointPrimP);
278 G4double P_perp = std::sqrt( projectileP2 - P_parallel*P_parallel);
282 projectileMomentum.
rotateUz(dir_parallel);
286 if (!IsScatProjToProjCase ){
287 fParticleChange->ProposeTrackStatus(fStopAndKill);
292 fParticleChange->ProposeEnergy(projectileKinEnergy);
293 fParticleChange->ProposeMomentumDirection(projectileMomentum.
unit());
320 if (kinEnergyProj>Emin_proj && kinEnergyProj<=Emax_proj){
327 if (kinEnergyProj >2.*
MeV){
337 dSigmadEprod=(sigma1-sigma2)/dE;
338 if (dSigmadEprod>1.) {
341 G4cout<<
"dsigma "<<kinEnergyProj/
MeV<<
'\t'<<kinEnergyProd/
MeV<<
'\t'<<dSigmadEprod<<
G4endl;
354 G4double deltaKinEnergy = kinEnergyProd;
368 G4double etot2 = totEnergy*totEnergy;
369 G4double beta2 = kinEnergyProj*(kinEnergyProj + 2.0*
mass)/etot2;
372 f = 1.0 - beta2*deltaKinEnergy/Tmax;
374 f1 = 0.5*deltaKinEnergy*deltaKinEnergy/etot2;
384 G4cout <<
"### G4BetheBlochModel in Adjoint Sim WARNING: g= " <<
g 407 pname !=
"deuteron" && pname !=
"triton") {
440 G4bool IsScatProjToProjCase)
448 if (!IsScatProjToProjCase ){
452 Cross*=(1./Emin_proj -1./Emax_proj)/primEnergy;
465 G4double diff1=Emin_proj-primEnergy;
466 G4double diff2=Emax_proj-primEnergy;
467 G4double t1=(1./diff1+1./Emin_proj-1./diff2-1./Emax_proj)/primEnergy;
469 G4double t2=2.*std::log(Emax_proj/Emin_proj)/primEnergy/primEnergy;
487 {
return PrimAdjEnergy+Tcut;
G4double one_minus_ratio_2
CLHEP::Hep3Vector G4ThreeVector
G4double GetPostStepWeightCorrection()
G4double SampleAdjSecEnergyFromCSMatrix(size_t MatrixIndex, G4double prim_energy, G4bool IsScatProjToProjCase)
G4ParticleDefinition * theDirectPrimaryPartDef
G4double GetZ13(G4double Z)
G4double GetTotalMomentum() const
virtual G4double GetSecondAdjEnergyMaxForScatProjToProjCase(G4double PrimAdjEnergy)
void RapidSampleSecondaries(const G4Track &aTrack, G4bool IsScatProjToProjCase, G4ParticleChange *fParticleChange)
const G4String & GetParticleType() const
static G4AdjointElectron * AdjointElectron()
G4double CS_biasing_factor
G4Material * currentMaterial
G4ParticleDefinition * theAdjEquivOfDirectPrimPartDef
G4int GetLeptonNumber() const
static G4NistManager * Instance()
virtual G4double GetSecondAdjEnergyMinForScatProjToProjCase(G4double PrimAdjEnergy, G4double Tcut=0)
virtual ~G4AdjointhIonisationModel()
void DefineProjectileProperty()
G4double GetKineticEnergy() const
const G4String & GetParticleName() const
G4VEmModel * theDirectEMModel
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
Hep3Vector & rotateUz(const Hep3Vector &)
G4double GetPDGMagneticMoment() const
static G4Proton * Proton()
G4double GetPDGSpin() const
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)
G4bool UseOnlyOneMatrixForAllElements
G4VEmModel * theBraggDirectEMModel
virtual G4double AdjointCrossSection(const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
G4double mass_ratio_projectile
G4double GetElectronDensity() const
static G4AdjointProton * AdjointProton()
const G4ThreeVector & GetMomentumDirection() const
G4double GetPDGMass() const
virtual void SampleSecondaries(const G4Track &aTrack, G4bool IsScatProjToProjCase, G4ParticleChange *fParticleChange)
G4double one_plus_ratio_2
virtual G4double AdjointCrossSection(const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
static const G4double Emin
static const G4double Emax
G4ParticleDefinition * theAdjEquivOfDirectSecondPartDef
G4double currentTcutForDirectSecond
G4bool UseMatrixPerElement
virtual G4double GetSecondAdjEnergyMinForProdToProjCase(G4double PrimAdjEnergy)
static const double eplus
G4double GetPDGCharge() const
static G4AdjointCSManager * GetAdjointCSManager()
virtual void CorrectPostStepWeight(G4ParticleChange *fParticleChange, G4double old_weight, G4double adjointPrimKinEnergy, G4double projectileKinEnergy, G4bool IsScatProjToProjCase)
virtual G4double DiffCrossSectionPerAtomPrimToSecond(G4double kinEnergyProj, G4double kinEnergyProd, G4double Z, G4double A=0.)
G4AdjointhIonisationModel(G4ParticleDefinition *projectileDefinition)
virtual G4double GetSecondAdjEnergyMaxForProdToProjCase(G4double PrimAdjEnergy)
G4bool second_part_of_same_type