#include <G4RPGNeutronInelastic.hh>
Inheritance diagram for G4RPGNeutronInelastic:
Public Member Functions | |
G4RPGNeutronInelastic () | |
~G4RPGNeutronInelastic () | |
G4HadFinalState * | ApplyYourself (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus) |
Definition at line 43 of file G4RPGNeutronInelastic.hh.
G4RPGNeutronInelastic::G4RPGNeutronInelastic | ( | ) | [inline] |
Definition at line 47 of file G4RPGNeutronInelastic.hh.
00047 : G4RPGNucleonInelastic("RPGNeutronInelastic") 00048 {}
G4RPGNeutronInelastic::~G4RPGNeutronInelastic | ( | ) | [inline] |
G4HadFinalState * G4RPGNeutronInelastic::ApplyYourself | ( | const G4HadProjectile & | aTrack, | |
G4Nucleus & | targetNucleus | |||
) | [virtual] |
Implements G4HadronicInteraction.
Definition at line 35 of file G4RPGNeutronInelastic.cc.
References G4RPGInelastic::CalculateMomenta(), G4Nucleus::Cinema(), G4HadFinalState::Clear(), G4Nucleus::EvaporationEffects(), G4UniformRand, G4HadProjectile::GetDefinition(), G4ReactionProduct::GetKineticEnergy(), G4HadProjectile::GetKineticEnergy(), G4ReactionProduct::GetMomentum(), G4ParticleDefinition::GetPDGMass(), G4FastVector< Type, N >::Initialize(), G4InuclParticleNames::pp, G4Nucleus::ReturnTargetParticle(), G4ReactionProduct::SetKineticEnergy(), G4ReactionProduct::SetMomentum(), G4ReactionProduct::SetSide(), G4RPGInelastic::SetUpChange(), and G4HadronicInteraction::theParticleChange.
00037 { 00038 theParticleChange.Clear(); 00039 const G4HadProjectile* originalIncident = &aTrack; 00040 00041 // create the target particle 00042 G4DynamicParticle* originalTarget = targetNucleus.ReturnTargetParticle(); 00043 00044 G4ReactionProduct modifiedOriginal; 00045 modifiedOriginal = *originalIncident; 00046 G4ReactionProduct targetParticle; 00047 targetParticle = *originalTarget; 00048 if( originalIncident->GetKineticEnergy()/GeV < 0.01 + 2.*G4UniformRand()/9. ) 00049 { 00050 SlowNeutron(originalIncident,modifiedOriginal,targetParticle,targetNucleus ); 00051 delete originalTarget; 00052 return &theParticleChange; 00053 } 00054 00055 // Fermi motion and evaporation 00056 // As of Geant3, the Fermi energy calculation had not been Done 00057 G4double ek = originalIncident->GetKineticEnergy()/MeV; 00058 G4double amas = originalIncident->GetDefinition()->GetPDGMass()/MeV; 00059 00060 G4double tkin = targetNucleus.Cinema( ek ); 00061 ek += tkin; 00062 modifiedOriginal.SetKineticEnergy( ek*MeV ); 00063 G4double et = ek + amas; 00064 G4double p = std::sqrt( std::abs((et-amas)*(et+amas)) ); 00065 G4double pp = modifiedOriginal.GetMomentum().mag()/MeV; 00066 if( pp > 0.0 ) 00067 { 00068 G4ThreeVector momentum = modifiedOriginal.GetMomentum(); 00069 modifiedOriginal.SetMomentum( momentum * (p/pp) ); 00070 } 00071 // 00072 // calculate black track energies 00073 // 00074 tkin = targetNucleus.EvaporationEffects( ek ); 00075 ek -= tkin; 00076 modifiedOriginal.SetKineticEnergy(ek); 00077 et = ek + amas; 00078 p = std::sqrt( std::abs((et-amas)*(et+amas)) ); 00079 pp = modifiedOriginal.GetMomentum().mag(); 00080 if( pp > 0.0 ) 00081 { 00082 G4ThreeVector momentum = modifiedOriginal.GetMomentum(); 00083 modifiedOriginal.SetMomentum( momentum * (p/pp) ); 00084 } 00085 const G4double cutOff = 0.1; 00086 if( modifiedOriginal.GetKineticEnergy()/MeV <= cutOff ) 00087 { 00088 SlowNeutron( originalIncident, modifiedOriginal, targetParticle, targetNucleus ); 00089 delete originalTarget; 00090 return &theParticleChange; 00091 } 00092 00093 G4ReactionProduct currentParticle = modifiedOriginal; 00094 currentParticle.SetSide( 1 ); // incident always goes in forward hemisphere 00095 targetParticle.SetSide( -1 ); // target always goes in backward hemisphere 00096 G4bool incidentHasChanged = false; 00097 G4bool targetHasChanged = false; 00098 G4bool quasiElastic = false; 00099 G4FastVector<G4ReactionProduct,256> vec; // vec will contain sec. particles 00100 G4int vecLen = 0; 00101 vec.Initialize( 0 ); 00102 00103 InitialCollision(vec, vecLen, currentParticle, targetParticle, 00104 incidentHasChanged, targetHasChanged); 00105 00106 CalculateMomenta(vec, vecLen, 00107 originalIncident, originalTarget, modifiedOriginal, 00108 targetNucleus, currentParticle, targetParticle, 00109 incidentHasChanged, targetHasChanged, quasiElastic); 00110 00111 SetUpChange(vec, vecLen, 00112 currentParticle, targetParticle, 00113 incidentHasChanged); 00114 00115 delete originalTarget; 00116 return &theParticleChange; 00117 }