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