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 #include "globals.hh"
00028 #include "G4ios.hh"
00029 #include "G4SystemOfUnits.hh"
00030 #include "G4XNNTotalLowE.hh"
00031 #include "G4KineticTrack.hh"
00032 #include "G4ParticleDefinition.hh"
00033 #include "G4ParticleDefinition.hh"
00034 #include "G4Proton.hh"
00035 #include "G4Neutron.hh"
00036
00037 const G4int G4XNNTotalLowE::tableSize = 29;
00038
00039 const G4double G4XNNTotalLowE::ss[29]=
00040 {
00041 1877.05, 1879.58, 1882.69, 1884.8, 1886.95, 1891.89, 1895.27, 1899.9, 1904.67, 1913.36, 1921.18, 1933.56, 1949.82, 1990.11, 2025.14, 2059.03, 2101.89, 2166.47, 2201.01, 2236.36, 2289.27, 2377.17, 2426.86, 2500.18, 2602.91, 2733.62, 2925.49, 3002.71
00042 };
00043
00044 const G4double G4XNNTotalLowE::ppTot[29] =
00045 {
00046 2000, 600, 250, 180, 138, 92, 75, 57, 46, 35, 29.5, 25.5, 25, 24, 23.7, 25, 29, 39, 44, 47, 48, 48, 47.5, 47, 45.6, 45, 43.3, 42.9, 42.9
00047 };
00048
00049 const G4double G4XNNTotalLowE::npTot[29] =
00050 {
00051 4250, 1380, 770, 585, 465, 300, 232, 175, 140, 100, 80, 63, 50, 40, 35, 34, 34, 36.5, 37., 37.7, 38, 39, 39.8, 40.5, 40.7, 41, 41.2, 41.5, 41.5
00052 };
00053
00054 G4XNNTotalLowE::G4XNNTotalLowE()
00055 {
00056
00057 G4LowEXsection* pp = new G4LowEXsection();
00058 G4LowEXsection* np = new G4LowEXsection();
00059
00060 G4int i;
00061 for (i=0; i<tableSize; i++)
00062 {
00063 std::pair<double,double> it;
00064 it.first=ss[i];
00065 it.second=ppTot[i]; pp->push_back(it);
00066 it.second=npTot[i]; np->push_back(it);
00067 }
00068 theCrossSections[G4Proton::ProtonDefinition()] = pp;
00069 theCrossSections[G4Neutron::NeutronDefinition()] = np;
00070 }
00071
00072
00073 G4XNNTotalLowE::~G4XNNTotalLowE()
00074 {
00075
00076 delete theCrossSections[G4Proton::ProtonDefinition()];
00077 delete theCrossSections[G4Neutron::NeutronDefinition()];
00078 }
00079
00080 G4double G4XNNTotalLowE::CrossSection(const G4KineticTrack& trk1, const G4KineticTrack& trk2) const
00081 {
00082 G4double result = 0.;
00083 G4double sqrtS = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag();
00084 G4ParticleDefinition * key = FindKeyParticle(trk1,trk2);
00085
00086 if (theCrossSections.find(key)!= theCrossSections.end())
00087 {
00088 LowEMap::const_iterator iter;
00089 for (iter = theCrossSections.begin(); iter != theCrossSections.end(); ++iter)
00090 {
00091 if ((*iter).first == key)
00092 {
00093 result = (*iter).second->CrossSection(sqrtS);
00094 }
00095 }
00096 }
00097 else
00098 {
00099 throw G4HadronicException(__FILE__, __LINE__, "G4XNNTotalLowE: particle key out of range");
00100 }
00101
00102 return result;
00103 }
00104
00105 G4String G4XNNTotalLowE::Name() const
00106 {
00107 G4String name("NNTotalLowE");
00108 return name;
00109 }
00110
00111
00112 G4bool G4XNNTotalLowE::IsValid(G4double e) const
00113 {
00114 G4bool result = e>0&&e<3*GeV;
00115 return result;
00116 }
00117
00118