Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // ------------------------------------------- 27 // 28 // GEANT4 Class file 29 // 30 // 31 // File name: G4BGGNucleonElasticXS 32 // 33 // Author: Vladimir Ivanchenko 34 // 35 // Creation date: 13.03.2007 36 // 37 // ------------------------------------------- 38 // 39 40 #include "G4BGGNucleonElasticXS.hh" 41 #include "G4SystemOfUnits.hh" 42 #include "G4ComponentGGHadronNucleusXsc.hh" 43 #include "G4NucleonNuclearCrossSection.hh" 44 #include "G4HadronNucleonXsc.hh" 45 #include "G4NuclearRadii.hh" 46 #include "G4Proton.hh" 47 #include "G4Neutron.hh" 48 #include "G4NistManager.hh" 49 #include "G4NuclearRadii.hh" 50 51 #include "G4CrossSectionDataSetRegistry.hh" 52 53 G4double G4BGGNucleonElasticXS::theGlauberFacP 54 G4double G4BGGNucleonElasticXS::theCoulombFacP 55 G4double G4BGGNucleonElasticXS::theGlauberFacN 56 G4double G4BGGNucleonElasticXS::theCoulombFacN 57 G4int G4BGGNucleonElasticXS::theA[93] = {0}; 58 59 G4BGGNucleonElasticXS::G4BGGNucleonElasticXS(c 60 : G4VCrossSectionDataSet("BarashenkovGlauberG 61 { 62 verboseLevel = 0; 63 fGlauberEnergy = 91.*GeV; 64 fLowEnergy = 14.0*MeV; 65 fNucleon = new G4NucleonNuclearCrossSection( 66 fGlauber = new G4ComponentGGHadronNucleusXsc 67 fHadron = new G4HadronNucleonXsc(); 68 69 theProton = G4Proton::Proton(); 70 isProton = (theProton == p); 71 SetForAllAtomsAndEnergies(true); 72 73 if (0 == theA[0]) { Initialise(); } 74 } 75 76 //....oooOO0OOooo........oooOO0OOooo........oo 77 78 G4BGGNucleonElasticXS::~G4BGGNucleonElasticXS( 79 { 80 delete fHadron; 81 } 82 83 //....oooOO0OOooo........oooOO0OOooo........oo 84 85 G4bool 86 G4BGGNucleonElasticXS::IsElementApplicable(con 87 con 88 { 89 return true; 90 } 91 92 //....oooOO0OOooo........oooOO0OOooo........oo 93 94 G4bool G4BGGNucleonElasticXS::IsIsoApplicable( 95 96 97 98 { 99 return (1 == Z); 100 } 101 102 //....oooOO0OOooo........oooOO0OOooo........oo 103 104 G4double 105 G4BGGNucleonElasticXS::GetElementCrossSection( 106 107 { 108 // this method should be called only for Z > 109 110 G4double cross = 0.0; 111 G4int Z = std::min(ZZ, 92); 112 G4double ekin = dp->GetKineticEnergy(); 113 if(1 == Z) { 114 cross = 1.0115*GetIsoCrossSection(dp,1,1); 115 } else { 116 if(ekin <= fLowEnergy) { 117 cross = (isProton) ? theCoulombFacP[Z] : 118 cross *= CoulombFactor(ekin, Z); 119 } else if(ekin > fGlauberEnergy) { 120 cross = (isProton) ? theGlauberFacP[Z] : 121 cross *= fGlauber->GetElasticGlauberGrib 122 } else { 123 cross = fNucleon->GetElasticCrossSection 124 } 125 } 126 #ifdef G4VERBOSE 127 if (verboseLevel > 1) { 128 G4cout << "G4BGGNucleonElasticXS::GetEleme 129 << dp->GetDefinition()->GetParticle 130 << " Ekin(GeV)= " << dp->GetKineti 131 << " in nucleus Z= " << Z << " A= 132 << " XS(b)= " << cross/barn 133 << G4endl; 134 } 135 #endif 136 return cross; 137 } 138 139 //....oooOO0OOooo........oooOO0OOooo........oo 140 141 G4double 142 G4BGGNucleonElasticXS::GetIsoCrossSection(cons 143 G4in 144 cons 145 cons 146 cons 147 { 148 // this method should be called only for Z = 149 fHadron->HadronNucleonXscNS(dp->GetDefinitio 150 dp->GetKineticEn 151 G4double cross = A*fHadron->GetElasticHadron 152 153 #ifdef G4VERBOSE 154 if (verboseLevel > 1) { 155 G4cout << "G4BGGNucleonElasticXS::GetIsoCr 156 << dp->GetDefinition()->GetParticle 157 << " Ekin(GeV)= " << dp->GetKineti 158 << " in nucleus Z=1 A=" << A 159 << " XS(b)= " << cross/barn 160 << G4endl; 161 } 162 #endif 163 return cross; 164 } 165 166 //....oooOO0OOooo........oooOO0OOooo........oo 167 168 void G4BGGNucleonElasticXS::BuildPhysicsTable( 169 { 170 if(&p == theProton || &p == G4Neutron::Neutr 171 isProton = (theProton == &p); 172 173 } else { 174 G4ExceptionDescription ed; 175 ed << "This BGG cross section is applicabl 176 << p.GetParticleName() << G4endl; 177 G4Exception("G4BGGNucleonElasticXS::BuildP 178 FatalException, ed); 179 } 180 } 181 182 //....oooOO0OOooo........oooOO0OOooo........oo 183 184 void G4BGGNucleonElasticXS::Initialise() 185 { 186 theA[0] = theA[1] = 1; 187 G4ThreeVector mom(0.0,0.0,1.0); 188 G4DynamicParticle dp(theProton, mom, fGlaube 189 190 G4NistManager* nist = G4NistManager::Instanc 191 G4double csup, csdn; 192 193 for (G4int iz=2; iz<93; ++iz) { 194 G4int A = G4lrint(nist->GetAtomicMassAmu(i 195 theA[iz] = A; 196 197 csup = fGlauber->GetElasticGlauberGribov(& 198 csdn = fNucleon->GetElasticCrossSection(&d 199 theGlauberFacP[iz] = csdn/csup; 200 } 201 202 dp.SetDefinition(G4Neutron::Neutron()); 203 for (G4int iz=2; iz<93; ++iz) { 204 csup = fGlauber->GetElasticGlauberGribov(& 205 csdn = fNucleon->GetElasticCrossSection(&d 206 theGlauberFacN[iz] = csdn/csup; 207 208 if (verboseLevel > 1) { 209 G4cout << "G4BGGNucleonElasticXS::Init 210 << " GFactorP=" << theGlauberFa 211 << " GFactorN=" << theGlauberFa 212 } 213 } 214 215 theCoulombFacP[0] = theCoulombFacP[1] = 216 theCoulombFacN[0] = theCoulombFacN[1] = 1. 217 dp.SetDefinition(theProton); 218 dp.SetKineticEnergy(fLowEnergy); 219 for (G4int iz=2; iz<93; ++iz) { 220 theCoulombFacP[iz] = fNucleon->GetElasticC 221 /CoulombFactor(fLowEnergy, iz); 222 } 223 dp.SetDefinition(G4Neutron::Neutron()); 224 for(G4int iz=2; iz<93; ++iz) { 225 theCoulombFacN[iz] = fNucleon->GetElasticC 226 /CoulombFactor(fLowEnergy, iz); 227 228 if (verboseLevel > 1) { 229 G4cout << "G4BGGNucleonElasticXS::Initia 230 << " CFactorP=" << theCoulombFacP[iz] 231 << " CFactorN=" << theCoulombFacN[iz] < 232 } 233 } 234 } 235 236 //....oooOO0OOooo........oooOO0OOooo........oo 237 238 G4double G4BGGNucleonElasticXS::CoulombFactor( 239 { 240 return (isProton) ? 241 G4NuclearRadii::CoulombFactor(Z, theA[Z], 242 } 243 244 //....oooOO0OOooo........oooOO0OOooo........oo 245 246 void G4BGGNucleonElasticXS::CrossSectionDescri 247 { 248 outFile << "The Barashenkov-Glauber-Gribov c 249 << "scattering of protons and neutro 250 << "Barashenkov parameterization bel 251 << "parameterization above 91 GeV. n 252 } 253 254 //....oooOO0OOooo........oooOO0OOooo........oo 255