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