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 // ------------------------------------------- 26 // ------------------------------------------------------------------- 27 // 27 // 28 // GEANT4 Class file 28 // GEANT4 Class file 29 // 29 // 30 // 30 // 31 // File name: G4BGGNucleonInelasticXS 31 // File name: G4BGGNucleonInelasticXS 32 // 32 // 33 // Author: Vladimir Ivanchenko 33 // Author: Vladimir Ivanchenko 34 // 34 // 35 // Creation date: 13.03.2007 35 // Creation date: 13.03.2007 36 // Modifications: 36 // Modifications: 37 // 37 // 38 // 38 // 39 // ------------------------------------------- 39 // ------------------------------------------------------------------- 40 // 40 // 41 41 42 #include "G4BGGNucleonInelasticXS.hh" 42 #include "G4BGGNucleonInelasticXS.hh" 43 #include "G4SystemOfUnits.hh" 43 #include "G4SystemOfUnits.hh" 44 #include "G4ComponentGGHadronNucleusXsc.hh" 44 #include "G4ComponentGGHadronNucleusXsc.hh" 45 #include "G4NucleonNuclearCrossSection.hh" 45 #include "G4NucleonNuclearCrossSection.hh" 46 #include "G4HadronNucleonXsc.hh" 46 #include "G4HadronNucleonXsc.hh" 47 #include "G4ComponentSAIDTotalXS.hh" 47 #include "G4ComponentSAIDTotalXS.hh" 48 #include "G4Proton.hh" 48 #include "G4Proton.hh" 49 #include "G4Neutron.hh" 49 #include "G4Neutron.hh" 50 #include "G4NistManager.hh" 50 #include "G4NistManager.hh" 51 #include "G4Material.hh" 51 #include "G4Material.hh" 52 #include "G4Element.hh" 52 #include "G4Element.hh" 53 #include "G4Isotope.hh" 53 #include "G4Isotope.hh" 54 #include "G4Log.hh" 54 #include "G4Log.hh" 55 #include "G4Exp.hh" 55 #include "G4Exp.hh" 56 #include "G4NuclearRadii.hh" 56 #include "G4NuclearRadii.hh" 57 57 >> 58 #include "G4CrossSectionDataSetRegistry.hh" >> 59 58 //....oooOO0OOooo........oooOO0OOooo........oo 60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 59 61 60 namespace << 62 const G4double llog10 = G4Log(10.); 61 { << 62 const G4double llog10 = G4Log(10.); << 63 } << 64 63 65 G4double G4BGGNucleonInelasticXS::theGlauberFa 64 G4double G4BGGNucleonInelasticXS::theGlauberFacP[93] = {0.0}; 66 G4double G4BGGNucleonInelasticXS::theCoulombFa 65 G4double G4BGGNucleonInelasticXS::theCoulombFacP[93] = {0.0}; 67 G4double G4BGGNucleonInelasticXS::theGlauberFa 66 G4double G4BGGNucleonInelasticXS::theGlauberFacN[93] = {0.0}; 68 G4double G4BGGNucleonInelasticXS::theCoulombFa 67 G4double G4BGGNucleonInelasticXS::theCoulombFacN[93] = {0.0}; 69 G4int G4BGGNucleonInelasticXS::theA[93] = {0}; << 68 G4int G4BGGNucleonInelasticXS::theA[93] = {0}; >> 69 >> 70 #ifdef G4MULTITHREADED >> 71 G4Mutex G4BGGNucleonInelasticXS::nucleonInelasticXSMutex = G4MUTEX_INITIALIZER; >> 72 #endif 70 73 71 G4BGGNucleonInelasticXS::G4BGGNucleonInelastic 74 G4BGGNucleonInelasticXS::G4BGGNucleonInelasticXS(const G4ParticleDefinition* p) 72 : G4VCrossSectionDataSet("BarashenkovGlauberG 75 : G4VCrossSectionDataSet("BarashenkovGlauberGribov") 73 { 76 { 74 verboseLevel = 0; 77 verboseLevel = 0; 75 fGlauberEnergy = 91.*CLHEP::GeV; << 78 fGlauberEnergy = 91.*GeV; 76 fLowEnergy = 14.*CLHEP::MeV; << 79 fLowEnergy = 14.*MeV; 77 80 78 fNucleon = new G4NucleonNuclearCrossSection( << 81 fNucleon = nullptr; 79 fGlauber = new G4ComponentGGHadronNucleusXsc << 82 fGlauber = nullptr; 80 fHadron = new G4HadronNucleonXsc(); << 83 fHadron = nullptr; 81 84 82 theProton= G4Proton::Proton(); 85 theProton= G4Proton::Proton(); 83 isProton = (theProton == p); 86 isProton = (theProton == p); >> 87 isMaster = false; 84 SetForAllAtomsAndEnergies(true); 88 SetForAllAtomsAndEnergies(true); 85 << 86 if (0 == theA[0]) { Initialise(); } << 87 } 89 } 88 90 89 //....oooOO0OOooo........oooOO0OOooo........oo 91 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 90 92 91 G4BGGNucleonInelasticXS::~G4BGGNucleonInelasti 93 G4BGGNucleonInelasticXS::~G4BGGNucleonInelasticXS() 92 { 94 { 93 delete fHadron; 95 delete fHadron; 94 } 96 } 95 97 96 //....oooOO0OOooo........oooOO0OOooo........oo 98 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 97 99 98 G4bool G4BGGNucleonInelasticXS::IsElementAppli 100 G4bool G4BGGNucleonInelasticXS::IsElementApplicable(const G4DynamicParticle*, 99 101 G4int, const G4Material*) 100 { 102 { 101 return true; 103 return true; 102 } 104 } 103 105 104 //....oooOO0OOooo........oooOO0OOooo........oo 106 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 105 107 106 G4bool G4BGGNucleonInelasticXS::IsIsoApplicabl 108 G4bool G4BGGNucleonInelasticXS::IsIsoApplicable(const G4DynamicParticle*, 107 109 G4int Z, G4int, 108 110 const G4Element*, 109 111 const G4Material*) 110 { 112 { 111 return (1 == Z); 113 return (1 == Z); 112 } 114 } 113 115 114 //....oooOO0OOooo........oooOO0OOooo........oo 116 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 115 117 116 G4double 118 G4double 117 G4BGGNucleonInelasticXS::GetElementCrossSectio 119 G4BGGNucleonInelasticXS::GetElementCrossSection(const G4DynamicParticle* dp, 118 120 G4int ZZ, const G4Material*) 119 { 121 { 120 G4double cross = 0.0; 122 G4double cross = 0.0; 121 G4double ekin = dp->GetKineticEnergy(); 123 G4double ekin = dp->GetKineticEnergy(); 122 G4int Z = std::min(ZZ, 92); 124 G4int Z = std::min(ZZ, 92); 123 if (1 == Z) { << 125 if(1 == Z) { 124 cross = 1.0115*GetIsoCrossSection(dp,1,1); 126 cross = 1.0115*GetIsoCrossSection(dp,1,1); 125 } else { 127 } else { 126 if (ekin <= fLowEnergy) { << 128 if(ekin <= fLowEnergy) { 127 cross = CoulombFactor(ekin, Z); << 129 cross = (isProton) ? theCoulombFacP[Z] : theCoulombFacN[Z]; 128 cross *= (isProton) ? theCoulombFacP[Z] << 130 cross *= CoulombFactor(ekin, Z); 129 } else if (ekin > fGlauberEnergy) { << 131 } else if(ekin > fGlauberEnergy) { 130 cross = fGlauber->GetInelasticGlauberGri << 132 cross = (isProton) ? theGlauberFacP[Z] : theGlauberFacN[Z]; 131 cross *= (isProton) ? theGlauberFacP[Z] << 133 cross *= fGlauber->GetInelasticGlauberGribov(dp, Z, theA[Z]); 132 } else { 134 } else { 133 cross = fNucleon->GetElementCrossSection 135 cross = fNucleon->GetElementCrossSection(dp, Z); 134 } 136 } 135 } 137 } 136 138 137 #ifdef G4VERBOSE << 139 if(verboseLevel > 1) { 138 if (verboseLevel > 1) { << 139 G4cout << "G4BGGNucleonInelasticXS::GetCro 140 G4cout << "G4BGGNucleonInelasticXS::GetCrossSection for " 140 << dp->GetDefinition()->GetParticle 141 << dp->GetDefinition()->GetParticleName() 141 << " Ekin(GeV)= " << dp->GetKineti 142 << " Ekin(GeV)= " << dp->GetKineticEnergy()/CLHEP::GeV 142 << " in nucleus Z= " << Z << " A= 143 << " in nucleus Z= " << Z << " A= " << theA[Z] 143 << " XS(b)= " << cross/barn 144 << " XS(b)= " << cross/barn 144 << G4endl; 145 << G4endl; 145 } 146 } 146 #endif << 147 return cross; 147 return cross; 148 } 148 } 149 149 150 //....oooOO0OOooo........oooOO0OOooo........oo 150 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 151 151 152 G4double 152 G4double 153 G4BGGNucleonInelasticXS::GetIsoCrossSection(co 153 G4BGGNucleonInelasticXS::GetIsoCrossSection(const G4DynamicParticle* dp, 154 G4int, << 154 G4int Z, G4int A, 155 const G 155 const G4Isotope*, 156 const G 156 const G4Element*, 157 const G 157 const G4Material*) 158 { 158 { 159 // this method should be called only for Z = 159 // this method should be called only for Z = 1 160 fHadron->HadronNucleonXscNS(dp->GetDefinitio 160 fHadron->HadronNucleonXscNS(dp->GetDefinition(), theProton, 161 dp->GetKineticEnerg 161 dp->GetKineticEnergy()); 162 G4double cross = A*fHadron->GetInelasticHadr 162 G4double cross = A*fHadron->GetInelasticHadronNucleonXsc(); 163 163 164 #ifdef G4VERBOSE << 165 if(verboseLevel > 1) { 164 if(verboseLevel > 1) { 166 G4cout << "G4BGGNucleonInelasticXS::GetIso 165 G4cout << "G4BGGNucleonInelasticXS::GetIsoCrossSection for " 167 << dp->GetDefinition()->GetParticle 166 << dp->GetDefinition()->GetParticleName() 168 << " Ekin(GeV)= " << dp->GetKineti 167 << " Ekin(GeV)= " << dp->GetKineticEnergy()/CLHEP::GeV 169 << " in nucleus Z=1 A=" << A << 168 << " in nucleus Z= " << Z << " A= " << theA[Z] 170 << " XS(b)= " << cross/barn 169 << " XS(b)= " << cross/barn 171 << G4endl; 170 << G4endl; 172 } 171 } 173 #endif << 174 return cross; 172 return cross; 175 } 173 } 176 174 177 //....oooOO0OOooo........oooOO0OOooo........oo 175 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 178 176 179 void G4BGGNucleonInelasticXS::BuildPhysicsTabl 177 void G4BGGNucleonInelasticXS::BuildPhysicsTable(const G4ParticleDefinition& p) 180 { 178 { >> 179 if(fNucleon) { return; } 181 if(&p == theProton || &p == G4Neutron::Neutr 180 if(&p == theProton || &p == G4Neutron::Neutron()) { 182 isProton = (theProton == &p); 181 isProton = (theProton == &p); 183 } else { 182 } else { 184 G4ExceptionDescription ed; 183 G4ExceptionDescription ed; 185 ed << "This BGG cross section is applicabl 184 ed << "This BGG cross section is applicable only to nucleons and not to " 186 << p.GetParticleName() << G4endl; 185 << p.GetParticleName() << G4endl; 187 G4Exception("G4BGGNucleonInelasticXS::Buil 186 G4Exception("G4BGGNucleonInelasticXS::BuildPhysicsTable", "had001", 188 FatalException, ed); 187 FatalException, ed); 189 return; 188 return; 190 } 189 } 191 } << 192 << 193 //....oooOO0OOooo........oooOO0OOooo........oo << 194 190 195 void G4BGGNucleonInelasticXS::Initialise() << 191 fNucleon = new G4NucleonNuclearCrossSection(); 196 { << 192 fGlauber = new G4ComponentGGHadronNucleusXsc(); 197 theA[0] = theA[1] = 1; << 193 fHadron = new G4HadronNucleonXsc(); 198 G4ThreeVector mom(0.0,0.0,1.0); << 199 G4DynamicParticle dp(theProton, mom, fGlaube << 200 << 201 G4NistManager* nist = G4NistManager::Instanc << 202 G4double csup, csdn; << 203 << 204 for (G4int iz=2; iz<93; ++iz) { << 205 194 206 G4int A = G4lrint(nist->GetAtomicMassAmu(i << 195 fNucleon->BuildPhysicsTable(p); 207 theA[iz] = A; << 208 196 209 csup = fGlauber->GetInelasticGlauberGribov << 197 if(0 == theA[0]) { 210 csdn = fNucleon->GetElementCrossSection(&d << 198 #ifdef G4MULTITHREADED 211 theGlauberFacP[iz] = csdn/csup; << 199 G4MUTEXLOCK(&nucleonInelasticXSMutex); >> 200 if(0 == theA[0]) { >> 201 #endif >> 202 isMaster = true; >> 203 #ifdef G4MULTITHREADED >> 204 } >> 205 G4MUTEXUNLOCK(&nucleonInelasticXSMutex); >> 206 #endif >> 207 } else { >> 208 return; 212 } 209 } 213 210 214 dp.SetDefinition(G4Neutron::Neutron()); << 211 if(isMaster && 0 == theA[0]) { 215 for (G4int iz=2; iz<93; ++iz) { << 216 csup = fGlauber->GetInelasticGlauberGribov << 217 csdn = fNucleon->GetElementCrossSection(&d << 218 theGlauberFacN[iz] = csdn/csup; << 219 212 220 if(verboseLevel > 1) { << 213 theA[0] = theA[1] = 1; 221 G4cout << "G4BGGNucleonInelasticXS::Init << 214 G4ThreeVector mom(0.0,0.0,1.0); 222 << " GFactorP= " << theGlauberFacP[iz] << 215 G4DynamicParticle dp(theProton, mom, fGlauberEnergy); 223 << " GFactorN= " << theGlauberFacN[iz] << 216 >> 217 G4NistManager* nist = G4NistManager::Instance(); >> 218 G4double csup, csdn; >> 219 >> 220 if(verboseLevel > 0) { >> 221 G4cout << "### G4BGGNucleonInelasticXS::Initialise for " >> 222 << p.GetParticleName() << G4endl; 224 } 223 } 225 } << 224 for(G4int iz=2; iz<93; ++iz) { 226 225 227 theCoulombFacP[1] = theCoulombFacN[1] = 1.0; << 226 G4int A = G4lrint(nist->GetAtomicMassAmu(iz)); 228 dp.SetDefinition(theProton); << 227 theA[iz] = A; 229 dp.SetKineticEnergy(fLowEnergy); << 230 for (G4int iz=2; iz<93; ++iz) { << 231 theCoulombFacP[iz] = fNucleon->GetElementC << 232 /CoulombFactor(fLowEnergy, iz); << 233 } << 234 dp.SetDefinition(G4Neutron::Neutron()); << 235 for (G4int iz=2; iz<93; ++iz) { << 236 theCoulombFacN[iz] = fNucleon->GetElementC << 237 /CoulombFactor(fLowEnergy, iz); << 238 228 239 if (verboseLevel > 1) { << 229 csup = fGlauber->GetInelasticGlauberGribov(&dp, iz, A); 240 G4cout << "G4BGGNucleonInelasticXS::Init << 230 csdn = fNucleon->GetElementCrossSection(&dp, iz); 241 << " CFactorP= " << theCoulombFacP[iz] << 231 theGlauberFacP[iz] = csdn/csup; 242 << " CFactorN= " << theCoulombFacN[iz] << 232 } >> 233 >> 234 dp.SetDefinition(G4Neutron::Neutron()); >> 235 for(G4int iz=2; iz<93; ++iz) { >> 236 csup = fGlauber->GetInelasticGlauberGribov(&dp, iz, theA[iz]); >> 237 csdn = fNucleon->GetElementCrossSection(&dp, iz); >> 238 theGlauberFacN[iz] = csdn/csup; >> 239 >> 240 if(verboseLevel > 0) { >> 241 G4cout << "Z= " << iz << " A= " << theA[iz] >> 242 << " GFactorP= " << theGlauberFacP[iz] >> 243 << " GFactorN= " << theGlauberFacN[iz] << G4endl; >> 244 } >> 245 } >> 246 theCoulombFacP[1] = theCoulombFacN[1] = 1.0; >> 247 dp.SetDefinition(theProton); >> 248 dp.SetKineticEnergy(fLowEnergy); >> 249 for(G4int iz=2; iz<93; ++iz) { >> 250 theCoulombFacP[iz] = fNucleon->GetElementCrossSection(&dp, iz) >> 251 /CoulombFactor(fLowEnergy, iz); >> 252 } >> 253 dp.SetDefinition(G4Neutron::Neutron()); >> 254 for(G4int iz=2; iz<93; ++iz) { >> 255 theCoulombFacN[iz] = fNucleon->GetElementCrossSection(&dp, iz) >> 256 /CoulombFactor(fLowEnergy, iz); >> 257 >> 258 if(verboseLevel > 0) { >> 259 G4cout << "Z= " << iz << " A= " << theA[iz] >> 260 << " CFactorP= " << theCoulombFacP[iz] >> 261 << " CFactorN= " << theCoulombFacN[iz] << G4endl; >> 262 } 243 } 263 } 244 } 264 } 245 } 265 } 246 266 247 //....oooOO0OOooo........oooOO0OOooo........oo 267 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 248 268 249 G4double G4BGGNucleonInelasticXS::CoulombFacto 269 G4double G4BGGNucleonInelasticXS::CoulombFactor(G4double kinEnergy, G4int Z) 250 { 270 { 251 G4double res = 0.0; 271 G4double res = 0.0; 252 272 253 if(kinEnergy <= 0.0) { return res; } 273 if(kinEnergy <= 0.0) { return res; } 254 274 255 G4double elog = G4Log(kinEnergy/GeV)/llog10; 275 G4double elog = G4Log(kinEnergy/GeV)/llog10; 256 G4double aa = theA[Z]; 276 G4double aa = theA[Z]; 257 277 258 if(isProton) { 278 if(isProton) { 259 279 260 res = G4NuclearRadii::CoulombFactor(Z, aa, << 280 res = G4NuclearRadii::CoulombFactor(Z, theA[Z], theProton, kinEnergy); 261 281 262 // from G4ProtonInelasticCrossSection 282 // from G4ProtonInelasticCrossSection 263 if(res > 0.0) { 283 if(res > 0.0) { 264 G4double ff1 = 5.6 - 0.016*aa; // slope << 284 G4double ff1 = 5.6 - 0.016*aa; // slope of the drop at medium energies. 265 G4double ff2 = 1.37 + 1.37/aa; // start << 285 G4double ff2 = 1.37 + 1.37/aa; // start of the slope. 266 G4double ff3 = 0.8 + 18./aa - 0.002*aa; 286 G4double ff3 = 0.8 + 18./aa - 0.002*aa; // stephight 267 res *= (1.0 + ff3*(1.0 - (1.0/(1+G4Exp(- 287 res *= (1.0 + ff3*(1.0 - (1.0/(1+G4Exp(-ff1*(elog + ff2)))))); 268 ff1 = 8. - 8./aa - 0.008*aa; // slope 288 ff1 = 8. - 8./aa - 0.008*aa; // slope of the rise 269 ff2 = 2.34 - 5.4/aa - 0.0028*aa; // star 289 ff2 = 2.34 - 5.4/aa - 0.0028*aa; // start of the rise 270 res /= (1.0 + G4Exp(-ff1*(elog + ff2))); 290 res /= (1.0 + G4Exp(-ff1*(elog + ff2))); 271 } 291 } 272 } else { 292 } else { 273 // from G4NeutronInelasticCrossSection 293 // from G4NeutronInelasticCrossSection 274 G4double p3 = 0.6 + 13./aa - 0.0005*aa; 294 G4double p3 = 0.6 + 13./aa - 0.0005*aa; 275 G4double p4 = 7.2449 - 0.018242*aa; 295 G4double p4 = 7.2449 - 0.018242*aa; 276 G4double p5 = 1.36 + 1.8/aa + 0.0005*aa; 296 G4double p5 = 1.36 + 1.8/aa + 0.0005*aa; 277 G4double p6 = 1. + 200./aa + 0.02*aa; 297 G4double p6 = 1. + 200./aa + 0.02*aa; 278 G4double p7 = 3.0 - (aa-70.)*(aa-200.)/110 298 G4double p7 = 3.0 - (aa-70.)*(aa-200.)/11000.; 279 299 280 G4double firstexp = G4Exp(-p4*(elog + p5) 300 G4double firstexp = G4Exp(-p4*(elog + p5)); 281 G4double secondexp = G4Exp(-p6*(elog + p7) 301 G4double secondexp = G4Exp(-p6*(elog + p7)); 282 302 283 res = (1. + p3*firstexp/(1. + firstexp))/( << 303 res = (1.+p3*firstexp/(1. + firstexp))/(1. + secondexp); 284 } 304 } 285 return res; 305 return res; 286 } 306 } 287 307 288 //....oooOO0OOooo........oooOO0OOooo........oo 308 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 289 309 290 void G4BGGNucleonInelasticXS::CrossSectionDesc 310 void G4BGGNucleonInelasticXS::CrossSectionDescription(std::ostream& outFile) const 291 { 311 { 292 outFile << "The Barashenkov-Glauber-Gribov c 312 outFile << "The Barashenkov-Glauber-Gribov cross section calculates inelastic\n" 293 << "scattering of protons and neutro 313 << "scattering of protons and neutrons from nuclei using the\n" 294 << "Barashenkov parameterization bel 314 << "Barashenkov parameterization below 91 GeV and the Glauber-Gribov\n" 295 << "parameterization above 91 GeV. 315 << "parameterization above 91 GeV. It uses the G4HadronNucleonXsc\n" 296 << "cross section component for hydr 316 << "cross section component for hydrogen targets, and the\n" 297 << "G4ComponentGGHadronNucleusXsc co 317 << "G4ComponentGGHadronNucleusXsc component for other targets.\n"; 298 } 318 } 299 319 300 //....oooOO0OOooo........oooOO0OOooo........oo 320 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 301 321