00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef G4NeutronHPThermalBoost_h
00029 #define G4NeutronHPThermalBoost_h
00030
00031 #include "G4HadProjectile.hh"
00032 #include "G4Element.hh"
00033 #include "G4ReactionProduct.hh"
00034 #include "G4Nucleus.hh"
00035 #include "G4NucleiProperties.hh"
00036 #include "G4Electron.hh"
00037 #include "G4Neutron.hh"
00038
00039 class G4NeutronHPThermalBoost
00040 {
00041 public:
00042 G4double GetThermalEnergy(const G4HadProjectile & aP,
00043 const G4Element * anE,
00044 G4double aT)
00045 {
00046 G4double theA = anE->GetN();
00047 G4double theZ = anE->GetZ();
00048 return GetThermalEnergy(aP, theA ,theZ, aT);
00049 }
00050
00051 G4double GetThermalEnergy(const G4HadProjectile & aP,
00052 G4double theA, G4double theZ,
00053 G4double aT)
00054 {
00055
00056 G4double eKinetic = aP.GetKineticEnergy();
00057 G4ReactionProduct theNeutron( const_cast<G4ParticleDefinition *>(aP.GetDefinition()) );
00058 theNeutron.SetMomentum( aP.Get4Momentum().vect() );
00059 theNeutron.SetKineticEnergy( eKinetic );
00060 G4ThreeVector neuVelo = (1./aP.GetDefinition()->GetPDGMass())*theNeutron.GetMomentum();
00061
00062
00063 G4Nucleus aNuc;
00064 G4double eps = 0.0001;
00065 G4double eleMass;
00066 eleMass = ( G4NucleiProperties::GetNuclearMass( static_cast<G4int>(theA+eps) , static_cast<G4int>(theZ+eps) ) ) / G4Neutron::Neutron()->GetPDGMass();
00067
00068 G4ReactionProduct aThermalNuc = aNuc.GetBiasedThermalNucleus(eleMass, neuVelo, aT);
00069
00070
00071 G4ReactionProduct boosted;
00072 boosted.Lorentz(theNeutron, aThermalNuc);
00073 return boosted.GetKineticEnergy();
00074 }
00075 };
00076 #endif