Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // >> 26 // $Id$ >> 27 // 26 // ------------------------------------------- 28 // ------------------------------------------------------------------- 27 // 29 // 28 // GEANT4 Class file 30 // GEANT4 Class file 29 // 31 // 30 // 32 // 31 // File name: G4BGGNucleonInelasticXS 33 // File name: G4BGGNucleonInelasticXS 32 // 34 // 33 // Author: Vladimir Ivanchenko 35 // Author: Vladimir Ivanchenko 34 // 36 // 35 // Creation date: 13.03.2007 37 // Creation date: 13.03.2007 36 // Modifications: 38 // Modifications: 37 // 39 // 38 // 40 // 39 // ------------------------------------------- 41 // ------------------------------------------------------------------- 40 // 42 // 41 43 42 #include "G4BGGNucleonInelasticXS.hh" 44 #include "G4BGGNucleonInelasticXS.hh" 43 #include "G4SystemOfUnits.hh" 45 #include "G4SystemOfUnits.hh" 44 #include "G4ComponentGGHadronNucleusXsc.hh" << 46 #include "G4GlauberGribovCrossSection.hh" 45 #include "G4NucleonNuclearCrossSection.hh" 47 #include "G4NucleonNuclearCrossSection.hh" 46 #include "G4HadronNucleonXsc.hh" 48 #include "G4HadronNucleonXsc.hh" >> 49 //#include "G4HadronInelasticDataSet.hh" 47 #include "G4ComponentSAIDTotalXS.hh" 50 #include "G4ComponentSAIDTotalXS.hh" 48 #include "G4Proton.hh" 51 #include "G4Proton.hh" 49 #include "G4Neutron.hh" 52 #include "G4Neutron.hh" 50 #include "G4NistManager.hh" 53 #include "G4NistManager.hh" 51 #include "G4Material.hh" 54 #include "G4Material.hh" 52 #include "G4Element.hh" 55 #include "G4Element.hh" 53 #include "G4Isotope.hh" 56 #include "G4Isotope.hh" 54 #include "G4Log.hh" << 55 #include "G4Exp.hh" << 56 #include "G4NuclearRadii.hh" << 57 << 58 //....oooOO0OOooo........oooOO0OOooo........oo << 59 57 60 namespace << 58 #include "G4CrossSectionDataSetRegistry.hh" 61 { << 62 const G4double llog10 = G4Log(10.); << 63 } << 64 59 65 G4double G4BGGNucleonInelasticXS::theGlauberFa << 60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 66 G4double G4BGGNucleonInelasticXS::theCoulombFa << 67 G4double G4BGGNucleonInelasticXS::theGlauberFa << 68 G4double G4BGGNucleonInelasticXS::theCoulombFa << 69 G4int G4BGGNucleonInelasticXS::theA[93] = {0}; << 70 61 71 G4BGGNucleonInelasticXS::G4BGGNucleonInelastic 62 G4BGGNucleonInelasticXS::G4BGGNucleonInelasticXS(const G4ParticleDefinition* p) 72 : G4VCrossSectionDataSet("BarashenkovGlauberG << 63 : G4VCrossSectionDataSet("Barashenkov-Glauber") 73 { 64 { 74 verboseLevel = 0; 65 verboseLevel = 0; 75 fGlauberEnergy = 91.*CLHEP::GeV; << 66 fGlauberEnergy = 91.*GeV; 76 fLowEnergy = 14.*CLHEP::MeV; << 67 fLowEnergy = 14.*MeV; 77 << 68 fHighEnergy = 5.*GeV; 78 fNucleon = new G4NucleonNuclearCrossSection( << 69 fSAIDHighEnergyLimit = 1.3*GeV; 79 fGlauber = new G4ComponentGGHadronNucleusXsc << 70 for (G4int i = 0; i < 93; ++i) { 80 fHadron = new G4HadronNucleonXsc(); << 71 theGlauberFac[i] = 0.0; 81 << 72 theCoulombFac[i] = 0.0; >> 73 theA[i] = 1; >> 74 } >> 75 fNucleon = 0; >> 76 fGlauber = 0; >> 77 fHadron = 0; >> 78 // fGHEISHA = 0; >> 79 fSAID = 0; >> 80 particle = p; 82 theProton= G4Proton::Proton(); 81 theProton= G4Proton::Proton(); 83 isProton = (theProton == p); << 82 isProton = false; 84 SetForAllAtomsAndEnergies(true); << 83 isInitialized = false; 85 << 86 if (0 == theA[0]) { Initialise(); } << 87 } 84 } 88 85 89 //....oooOO0OOooo........oooOO0OOooo........oo 86 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 90 87 91 G4BGGNucleonInelasticXS::~G4BGGNucleonInelasti 88 G4BGGNucleonInelasticXS::~G4BGGNucleonInelasticXS() 92 { 89 { 93 delete fHadron; 90 delete fHadron; >> 91 delete fSAID; 94 } 92 } 95 93 96 //....oooOO0OOooo........oooOO0OOooo........oo 94 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 97 95 98 G4bool G4BGGNucleonInelasticXS::IsElementAppli 96 G4bool G4BGGNucleonInelasticXS::IsElementApplicable(const G4DynamicParticle*, 99 << 97 G4int, const G4Material*) 100 { 98 { 101 return true; 99 return true; 102 } 100 } 103 101 104 //....oooOO0OOooo........oooOO0OOooo........oo 102 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 105 103 106 G4bool G4BGGNucleonInelasticXS::IsIsoApplicabl 104 G4bool G4BGGNucleonInelasticXS::IsIsoApplicable(const G4DynamicParticle*, 107 << 105 G4int Z, G4int A, 108 << 106 const G4Element*, 109 << 107 const G4Material*) 110 { 108 { 111 return (1 == Z); << 109 return (1 == Z && 2 >= A); 112 } 110 } 113 111 114 //....oooOO0OOooo........oooOO0OOooo........oo 112 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 115 113 116 G4double 114 G4double 117 G4BGGNucleonInelasticXS::GetElementCrossSectio 115 G4BGGNucleonInelasticXS::GetElementCrossSection(const G4DynamicParticle* dp, 118 << 116 G4int ZZ, const G4Material*) 119 { 117 { >> 118 // this method should be called only for Z > 1 >> 119 120 G4double cross = 0.0; 120 G4double cross = 0.0; 121 G4double ekin = dp->GetKineticEnergy(); 121 G4double ekin = dp->GetKineticEnergy(); 122 G4int Z = std::min(ZZ, 92); << 122 G4int Z = ZZ; 123 if (1 == Z) { << 123 if(1 == Z) { 124 cross = 1.0115*GetIsoCrossSection(dp,1,1); 124 cross = 1.0115*GetIsoCrossSection(dp,1,1); >> 125 } else if(2 == Z) { >> 126 if(ekin > fGlauberEnergy) { >> 127 cross = theGlauberFac[Z]*fGlauber->GetInelasticGlauberGribov(dp, Z, theA[Z]); >> 128 } else { >> 129 cross = fNucleon->GetElementCrossSection(dp, Z); >> 130 } >> 131 125 } else { 132 } else { 126 if (ekin <= fLowEnergy) { << 133 if(Z > 92) { Z = 92; } 127 cross = CoulombFactor(ekin, Z); << 134 128 cross *= (isProton) ? theCoulombFacP[Z] << 135 if(ekin <= fLowEnergy) { 129 } else if (ekin > fGlauberEnergy) { << 136 cross = theCoulombFac[Z]*CoulombFactor(ekin, Z); 130 cross = fGlauber->GetInelasticGlauberGri << 137 } else if(ekin > fGlauberEnergy) { 131 cross *= (isProton) ? theGlauberFacP[Z] << 138 cross = theGlauberFac[Z]*fGlauber->GetInelasticGlauberGribov(dp, Z, theA[Z]); 132 } else { 139 } else { 133 cross = fNucleon->GetElementCrossSection 140 cross = fNucleon->GetElementCrossSection(dp, Z); 134 } 141 } 135 } 142 } 136 143 137 #ifdef G4VERBOSE << 144 if(verboseLevel > 1) { 138 if (verboseLevel > 1) { << 139 G4cout << "G4BGGNucleonInelasticXS::GetCro 145 G4cout << "G4BGGNucleonInelasticXS::GetCrossSection for " 140 << dp->GetDefinition()->GetParticle << 146 << dp->GetDefinition()->GetParticleName() 141 << " Ekin(GeV)= " << dp->GetKineti << 147 << " Ekin(GeV)= " << dp->GetKineticEnergy()/CLHEP::GeV 142 << " in nucleus Z= " << Z << " A= << 148 << " in nucleus Z= " << Z << " A= " << theA[Z] 143 << " XS(b)= " << cross/barn << 149 << " XS(b)= " << cross/barn 144 << G4endl; << 150 << G4endl; 145 } 151 } 146 #endif << 147 return cross; 152 return cross; 148 } 153 } 149 154 150 //....oooOO0OOooo........oooOO0OOooo........oo 155 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 151 156 152 G4double 157 G4double 153 G4BGGNucleonInelasticXS::GetIsoCrossSection(co 158 G4BGGNucleonInelasticXS::GetIsoCrossSection(const G4DynamicParticle* dp, 154 G4int, << 159 G4int Z, G4int A, 155 const G << 160 const G4Isotope*, 156 const G << 161 const G4Element*, 157 const G << 162 const G4Material*) 158 { 163 { 159 // this method should be called only for Z = 164 // this method should be called only for Z = 1 160 fHadron->HadronNucleonXscNS(dp->GetDefinitio << 161 dp->GetKineticEnerg << 162 G4double cross = A*fHadron->GetInelasticHadr << 163 165 164 #ifdef G4VERBOSE << 166 G4double cross = 0.0; >> 167 G4double ekin = dp->GetKineticEnergy(); >> 168 >> 169 if(ekin <= fSAIDHighEnergyLimit) { >> 170 cross = fSAID->GetInelasticIsotopeCrossSection(particle, ekin, 1, 1); >> 171 } else if(ekin < fHighEnergy) { >> 172 fHadron->GetHadronNucleonXscNS(dp, theProton); >> 173 cross = (theCoulombFac[0]/ekin + 1)*fHadron->GetInelasticHadronNucleonXsc(); >> 174 } else { >> 175 fHadron->GetHadronNucleonXscPDG(dp, theProton); >> 176 cross = (theCoulombFac[1]/ekin + 1)*fHadron->GetInelasticHadronNucleonXsc(); >> 177 } >> 178 cross *= A; >> 179 165 if(verboseLevel > 1) { 180 if(verboseLevel > 1) { 166 G4cout << "G4BGGNucleonInelasticXS::GetIso << 181 G4cout << "G4BGGNucleonInelasticXS::GetCrossSection for " 167 << dp->GetDefinition()->GetParticle << 182 << dp->GetDefinition()->GetParticleName() 168 << " Ekin(GeV)= " << dp->GetKineti << 183 << " Ekin(GeV)= " << dp->GetKineticEnergy()/CLHEP::GeV 169 << " in nucleus Z=1 A=" << A << 184 << " in nucleus Z= " << Z << " A= " << A 170 << " XS(b)= " << cross/barn << 185 << " XS(b)= " << cross/barn 171 << G4endl; << 186 << G4endl; 172 } 187 } 173 #endif << 174 return cross; 188 return cross; 175 } 189 } 176 190 177 //....oooOO0OOooo........oooOO0OOooo........oo 191 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 178 192 179 void G4BGGNucleonInelasticXS::BuildPhysicsTabl 193 void G4BGGNucleonInelasticXS::BuildPhysicsTable(const G4ParticleDefinition& p) 180 { 194 { 181 if(&p == theProton || &p == G4Neutron::Neutr 195 if(&p == theProton || &p == G4Neutron::Neutron()) { 182 isProton = (theProton == &p); << 196 particle = &p; 183 } else { 197 } else { 184 G4ExceptionDescription ed; << 198 G4cout << "### G4BGGNucleonInelasticXS WARNING: is not applicable to " 185 ed << "This BGG cross section is applicabl << 199 << p.GetParticleName() 186 << p.GetParticleName() << G4endl; << 200 << G4endl; 187 G4Exception("G4BGGNucleonInelasticXS::Buil << 201 throw G4HadronicException(__FILE__, __LINE__, 188 FatalException, ed); << 202 "G4BGGNucleonElasticXS::BuildPhysicsTable is used for wrong particle"); 189 return; 203 return; 190 } 204 } 191 } << 192 205 193 //....oooOO0OOooo........oooOO0OOooo........oo << 206 if(isInitialized) { return; } >> 207 isInitialized = true; 194 208 195 void G4BGGNucleonInelasticXS::Initialise() << 209 fNucleon = (G4NucleonNuclearCrossSection*)G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4NucleonNuclearCrossSection::Default_Name()); 196 { << 210 fGlauber = (G4GlauberGribovCrossSection*)G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4GlauberGribovCrossSection::Default_Name()); 197 theA[0] = theA[1] = 1; << 211 >> 212 fHadron = new G4HadronNucleonXsc(); >> 213 //fGHEISHA = new G4HadronInelasticDataSet(); >> 214 fSAID = new G4ComponentSAIDTotalXS(); >> 215 >> 216 fNucleon->BuildPhysicsTable(*particle); >> 217 fGlauber->BuildPhysicsTable(*particle); >> 218 >> 219 if(particle == theProton) { >> 220 isProton = true; >> 221 fSAIDHighEnergyLimit = 2*GeV; >> 222 fHighEnergy = 2*GeV; >> 223 } >> 224 >> 225 G4ParticleDefinition* part = const_cast<G4ParticleDefinition*>(particle); 198 G4ThreeVector mom(0.0,0.0,1.0); 226 G4ThreeVector mom(0.0,0.0,1.0); 199 G4DynamicParticle dp(theProton, mom, fGlaube << 227 G4DynamicParticle dp(part, mom, fGlauberEnergy); 200 228 201 G4NistManager* nist = G4NistManager::Instanc 229 G4NistManager* nist = G4NistManager::Instance(); >> 230 G4int A; >> 231 202 G4double csup, csdn; 232 G4double csup, csdn; 203 233 204 for (G4int iz=2; iz<93; ++iz) { << 234 if(verboseLevel > 0) { >> 235 G4cout << "### G4BGGNucleonInelasticXS::Initialise for " >> 236 << particle->GetParticleName() << G4endl; >> 237 } >> 238 for(G4int iz=2; iz<93; iz++) { 205 239 206 G4int A = G4lrint(nist->GetAtomicMassAmu(i << 240 A = G4lrint(nist->GetAtomicMassAmu(iz)); 207 theA[iz] = A; 241 theA[iz] = A; 208 242 209 csup = fGlauber->GetInelasticGlauberGribov 243 csup = fGlauber->GetInelasticGlauberGribov(&dp, iz, A); 210 csdn = fNucleon->GetElementCrossSection(&d 244 csdn = fNucleon->GetElementCrossSection(&dp, iz); 211 theGlauberFacP[iz] = csdn/csup; << 212 } << 213 << 214 dp.SetDefinition(G4Neutron::Neutron()); << 215 for (G4int iz=2; iz<93; ++iz) { << 216 csup = fGlauber->GetInelasticGlauberGribov << 217 csdn = fNucleon->GetElementCrossSection(&d << 218 theGlauberFacN[iz] = csdn/csup; << 219 245 220 if(verboseLevel > 1) { << 246 theGlauberFac[iz] = csdn/csup; 221 G4cout << "G4BGGNucleonInelasticXS::Init << 247 if(verboseLevel > 0) { 222 << " GFactorP= " << theGlauberFacP[iz] << 248 G4cout << "Z= " << iz << " A= " << A 223 << " GFactorN= " << theGlauberFacN[iz] << 249 << " GlauberFactor= " << theGlauberFac[iz] << G4endl; 224 } 250 } 225 } 251 } >> 252 //const G4Material* mat = 0; 226 253 227 theCoulombFacP[1] = theCoulombFacN[1] = 1.0; << 254 dp.SetKineticEnergy(fSAIDHighEnergyLimit); 228 dp.SetDefinition(theProton); << 255 fHadron->GetHadronNucleonXscNS(&dp, theProton); >> 256 theCoulombFac[0] = fSAIDHighEnergyLimit* >> 257 (fSAID->GetInelasticIsotopeCrossSection(particle,fSAIDHighEnergyLimit,1,1) >> 258 /fHadron->GetInelasticHadronNucleonXsc() - 1); >> 259 >> 260 //G4cout << "Z=1 E(GeV)= " << fSAIDHighEnergyLimit/GeV >> 261 // << " xsNS(b)= " << fHadron->GetInelasticHadronNucleonXsc()/barn; >> 262 fHadron->GetHadronNucleonXscPDG(&dp, theProton); >> 263 //G4cout << " xsPDG(b)= " << fHadron->GetInelasticHadronNucleonXsc()/barn; >> 264 //G4cout << " xsSAID(b)= " << fSAID->GetInelasticIsotopeCrossSection(particle,fSAIDHighEnergyLimit,1,1)/barn << G4endl; >> 265 >> 266 dp.SetKineticEnergy(fHighEnergy); >> 267 fHadron->GetHadronNucleonXscPDG(&dp, theProton); >> 268 G4double x = fHadron->GetInelasticHadronNucleonXsc(); >> 269 >> 270 //G4cout << "Z=1 E(GeV)= " << fHighEnergy/GeV >> 271 // << " xsPDG(b)= " << fHadron->GetInelasticHadronNucleonXsc()/barn; >> 272 >> 273 fHadron->GetHadronNucleonXscNS(&dp, theProton); >> 274 theCoulombFac[1] = fHighEnergy*((theCoulombFac[0]/fHighEnergy + 1) >> 275 *fHadron->GetInelasticHadronNucleonXsc()/x - 1); >> 276 >> 277 fHadron->GetHadronNucleonXscNS(&dp, theProton); >> 278 //G4cout << " xsNS(b)= " << fHadron->GetInelasticHadronNucleonXsc()/barn << G4endl; >> 279 >> 280 if(verboseLevel > 0) { >> 281 G4cout << "Z=1 A=1" << " CoulombFactor[0]= " << theCoulombFac[0] >> 282 << " CoulombFactor[1]= " << theCoulombFac[1] << G4endl; >> 283 } >> 284 theCoulombFac[2] = 1.0; >> 285 229 dp.SetKineticEnergy(fLowEnergy); 286 dp.SetKineticEnergy(fLowEnergy); 230 for (G4int iz=2; iz<93; ++iz) { << 287 for(G4int iz=3; iz<93; iz++) { 231 theCoulombFacP[iz] = fNucleon->GetElementC << 288 theCoulombFac[iz] = 232 /CoulombFactor(fLowEnergy, iz); << 289 fNucleon->GetElementCrossSection(&dp, iz)/CoulombFactor(fLowEnergy, iz); 233 } << 290 234 dp.SetDefinition(G4Neutron::Neutron()); << 291 if(verboseLevel > 0) { 235 for (G4int iz=2; iz<93; ++iz) { << 292 G4cout << "Z= " << iz << " A= " << theA[iz] 236 theCoulombFacN[iz] = fNucleon->GetElementC << 293 << " CoulombFactor= " << theCoulombFac[iz] << G4endl; 237 /CoulombFactor(fLowEnergy, iz); << 238 << 239 if (verboseLevel > 1) { << 240 G4cout << "G4BGGNucleonInelasticXS::Init << 241 << " CFactorP= " << theCoulombFacP[iz] << 242 << " CFactorN= " << theCoulombFacN[iz] << 243 } 294 } 244 } 295 } 245 } 296 } 246 297 247 //....oooOO0OOooo........oooOO0OOooo........oo 298 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 248 299 249 G4double G4BGGNucleonInelasticXS::CoulombFacto 300 G4double G4BGGNucleonInelasticXS::CoulombFactor(G4double kinEnergy, G4int Z) 250 { 301 { 251 G4double res = 0.0; << 302 G4double res= 0.0; 252 << 253 if(kinEnergy <= 0.0) { return res; } 303 if(kinEnergy <= 0.0) { return res; } 254 << 304 else if (Z <= 1) { return kinEnergy*kinEnergy; } 255 G4double elog = G4Log(kinEnergy/GeV)/llog10; << 305 >> 306 G4double elog = std::log10(kinEnergy/GeV); 256 G4double aa = theA[Z]; 307 G4double aa = theA[Z]; 257 << 258 if(isProton) { << 259 308 260 res = G4NuclearRadii::CoulombFactor(Z, aa, << 309 // from G4ProtonInelasticCrossSection >> 310 if(isProton) { >> 311 >> 312 G4double ff1 = 0.70 - 0.002*aa; // slope of the drop at medium energies. >> 313 G4double ff2 = 1.00 + 1/aa; // start of the slope. >> 314 G4double ff3 = 0.8 + 18/aa - 0.002*aa; // stephight >> 315 res = 1.0 + ff3*(1.0 - (1.0/(1+std::exp(-8*ff1*(elog + 1.37*ff2))))); >> 316 >> 317 ff1 = 1. - 1./aa - 0.001*aa; // slope of the rise >> 318 ff2 = 1.17 - 2.7/aa-0.0014*aa; // start of the rise >> 319 res /= (1 + std::exp(-8.*ff1*(elog + 2*ff2))); 261 320 262 // from G4ProtonInelasticCrossSection << 263 if(res > 0.0) { << 264 G4double ff1 = 5.6 - 0.016*aa; // slope << 265 G4double ff2 = 1.37 + 1.37/aa; // start << 266 G4double ff3 = 0.8 + 18./aa - 0.002*aa; << 267 res *= (1.0 + ff3*(1.0 - (1.0/(1+G4Exp(- << 268 ff1 = 8. - 8./aa - 0.008*aa; // slope << 269 ff2 = 2.34 - 5.4/aa - 0.0028*aa; // star << 270 res /= (1.0 + G4Exp(-ff1*(elog + ff2))); << 271 } << 272 } else { 321 } else { >> 322 273 // from G4NeutronInelasticCrossSection 323 // from G4NeutronInelasticCrossSection 274 G4double p3 = 0.6 + 13./aa - 0.0005*aa; 324 G4double p3 = 0.6 + 13./aa - 0.0005*aa; 275 G4double p4 = 7.2449 - 0.018242*aa; 325 G4double p4 = 7.2449 - 0.018242*aa; 276 G4double p5 = 1.36 + 1.8/aa + 0.0005*aa; 326 G4double p5 = 1.36 + 1.8/aa + 0.0005*aa; 277 G4double p6 = 1. + 200./aa + 0.02*aa; 327 G4double p6 = 1. + 200./aa + 0.02*aa; 278 G4double p7 = 3.0 - (aa-70.)*(aa-200.)/110 328 G4double p7 = 3.0 - (aa-70.)*(aa-200.)/11000.; 279 329 280 G4double firstexp = G4Exp(-p4*(elog + p5) << 330 G4double firstexp = std::exp(-p4*(elog + p5)); 281 G4double secondexp = G4Exp(-p6*(elog + p7) << 331 G4double secondexp = std::exp(-p6*(elog + p7)); >> 332 >> 333 res = (1.+p3*firstexp/(1. + firstexp))/(1. + secondexp); 282 334 283 res = (1. + p3*firstexp/(1. + firstexp))/( << 284 } 335 } 285 return res; 336 return res; 286 } 337 } 287 338 288 //....oooOO0OOooo........oooOO0OOooo........oo 339 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 289 340 290 void G4BGGNucleonInelasticXS::CrossSectionDesc 341 void G4BGGNucleonInelasticXS::CrossSectionDescription(std::ostream& outFile) const 291 { 342 { 292 outFile << "The Barashenkov-Glauber-Gribov c 343 outFile << "The Barashenkov-Glauber-Gribov cross section calculates inelastic\n" 293 << "scattering of protons and neutro 344 << "scattering of protons and neutrons from nuclei using the\n" 294 << "Barashenkov parameterization bel 345 << "Barashenkov parameterization below 91 GeV and the Glauber-Gribov\n" 295 << "parameterization above 91 GeV. 346 << "parameterization above 91 GeV. It uses the G4HadronNucleonXsc\n" 296 << "cross section component for hydr 347 << "cross section component for hydrogen targets, and the\n" 297 << "G4ComponentGGHadronNucleusXsc co << 348 << "G4GlauberGribovCrossSection component for other targets.\n"; 298 } 349 } 299 350 300 //....oooOO0OOooo........oooOO0OOooo........oo 351 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 301 352