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: G4BGGNucleonElasticXS 31 // File name: G4BGGNucleonElasticXS 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 // 36 // 37 // ------------------------------------------- 37 // ------------------------------------------------------------------- 38 // 38 // 39 39 40 #include "G4BGGNucleonElasticXS.hh" 40 #include "G4BGGNucleonElasticXS.hh" 41 #include "G4SystemOfUnits.hh" 41 #include "G4SystemOfUnits.hh" 42 #include "G4ComponentGGHadronNucleusXsc.hh" 42 #include "G4ComponentGGHadronNucleusXsc.hh" 43 #include "G4NucleonNuclearCrossSection.hh" 43 #include "G4NucleonNuclearCrossSection.hh" 44 #include "G4HadronNucleonXsc.hh" 44 #include "G4HadronNucleonXsc.hh" 45 #include "G4NuclearRadii.hh" 45 #include "G4NuclearRadii.hh" 46 #include "G4Proton.hh" 46 #include "G4Proton.hh" 47 #include "G4Neutron.hh" 47 #include "G4Neutron.hh" 48 #include "G4NistManager.hh" 48 #include "G4NistManager.hh" 49 #include "G4NuclearRadii.hh" 49 #include "G4NuclearRadii.hh" 50 50 51 #include "G4CrossSectionDataSetRegistry.hh" 51 #include "G4CrossSectionDataSetRegistry.hh" 52 52 53 G4double G4BGGNucleonElasticXS::theGlauberFacP 53 G4double G4BGGNucleonElasticXS::theGlauberFacP[93] = {0.0}; 54 G4double G4BGGNucleonElasticXS::theCoulombFacP 54 G4double G4BGGNucleonElasticXS::theCoulombFacP[93] = {0.0}; 55 G4double G4BGGNucleonElasticXS::theGlauberFacN 55 G4double G4BGGNucleonElasticXS::theGlauberFacN[93] = {0.0}; 56 G4double G4BGGNucleonElasticXS::theCoulombFacN 56 G4double G4BGGNucleonElasticXS::theCoulombFacN[93] = {0.0}; 57 G4int G4BGGNucleonElasticXS::theA[93] = {0}; << 57 G4int G4BGGNucleonElasticXS::theA[93] = {0}; >> 58 >> 59 #ifdef G4MULTITHREADED >> 60 G4Mutex G4BGGNucleonElasticXS::nucleonElasticXSMutex = G4MUTEX_INITIALIZER; >> 61 #endif 58 62 59 G4BGGNucleonElasticXS::G4BGGNucleonElasticXS(c 63 G4BGGNucleonElasticXS::G4BGGNucleonElasticXS(const G4ParticleDefinition* p) 60 : G4VCrossSectionDataSet("BarashenkovGlauberG 64 : G4VCrossSectionDataSet("BarashenkovGlauberGribov") 61 { 65 { 62 verboseLevel = 0; 66 verboseLevel = 0; 63 fGlauberEnergy = 91.*GeV; 67 fGlauberEnergy = 91.*GeV; 64 fLowEnergy = 14.0*MeV; 68 fLowEnergy = 14.0*MeV; 65 fNucleon = new G4NucleonNuclearCrossSection( << 69 fNucleon = nullptr; 66 fGlauber = new G4ComponentGGHadronNucleusXsc << 70 fGlauber = nullptr; 67 fHadron = new G4HadronNucleonXsc(); << 71 fHadron = nullptr; 68 72 69 theProton = G4Proton::Proton(); << 73 theProton= G4Proton::Proton(); 70 isProton = (theProton == p); 74 isProton = (theProton == p); >> 75 isMaster = false; 71 SetForAllAtomsAndEnergies(true); 76 SetForAllAtomsAndEnergies(true); 72 << 73 if (0 == theA[0]) { Initialise(); } << 74 } 77 } 75 78 76 //....oooOO0OOooo........oooOO0OOooo........oo 79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 77 80 78 G4BGGNucleonElasticXS::~G4BGGNucleonElasticXS( 81 G4BGGNucleonElasticXS::~G4BGGNucleonElasticXS() 79 { 82 { 80 delete fHadron; 83 delete fHadron; 81 } 84 } 82 85 83 //....oooOO0OOooo........oooOO0OOooo........oo 86 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 84 87 85 G4bool 88 G4bool 86 G4BGGNucleonElasticXS::IsElementApplicable(con 89 G4BGGNucleonElasticXS::IsElementApplicable(const G4DynamicParticle*, G4int, 87 con 90 const G4Material*) 88 { 91 { 89 return true; 92 return true; 90 } 93 } 91 94 92 //....oooOO0OOooo........oooOO0OOooo........oo 95 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 93 96 94 G4bool G4BGGNucleonElasticXS::IsIsoApplicable( 97 G4bool G4BGGNucleonElasticXS::IsIsoApplicable(const G4DynamicParticle*, 95 98 G4int Z, G4int, 96 99 const G4Element*, 97 100 const G4Material*) 98 { 101 { 99 return (1 == Z); 102 return (1 == Z); 100 } 103 } 101 104 102 //....oooOO0OOooo........oooOO0OOooo........oo 105 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 103 106 104 G4double 107 G4double 105 G4BGGNucleonElasticXS::GetElementCrossSection( 108 G4BGGNucleonElasticXS::GetElementCrossSection(const G4DynamicParticle* dp, 106 109 G4int ZZ, const G4Material*) 107 { 110 { 108 // this method should be called only for Z > 111 // this method should be called only for Z > 1 109 112 110 G4double cross = 0.0; 113 G4double cross = 0.0; 111 G4int Z = std::min(ZZ, 92); 114 G4int Z = std::min(ZZ, 92); 112 G4double ekin = dp->GetKineticEnergy(); 115 G4double ekin = dp->GetKineticEnergy(); 113 if(1 == Z) { 116 if(1 == Z) { 114 cross = 1.0115*GetIsoCrossSection(dp,1,1); 117 cross = 1.0115*GetIsoCrossSection(dp,1,1); 115 } else { 118 } else { 116 if(ekin <= fLowEnergy) { 119 if(ekin <= fLowEnergy) { 117 cross = (isProton) ? theCoulombFacP[Z] : 120 cross = (isProton) ? theCoulombFacP[Z] : theCoulombFacN[Z]; 118 cross *= CoulombFactor(ekin, Z); 121 cross *= CoulombFactor(ekin, Z); 119 } else if(ekin > fGlauberEnergy) { 122 } else if(ekin > fGlauberEnergy) { 120 cross = (isProton) ? theGlauberFacP[Z] : 123 cross = (isProton) ? theGlauberFacP[Z] : theGlauberFacN[Z]; 121 cross *= fGlauber->GetElasticGlauberGrib 124 cross *= fGlauber->GetElasticGlauberGribov(dp, Z, theA[Z]); 122 } else { 125 } else { 123 cross = fNucleon->GetElasticCrossSection 126 cross = fNucleon->GetElasticCrossSection(dp, Z); 124 } 127 } 125 } 128 } 126 #ifdef G4VERBOSE << 129 if(verboseLevel > 1) { 127 if (verboseLevel > 1) { << 128 G4cout << "G4BGGNucleonElasticXS::GetEleme 130 G4cout << "G4BGGNucleonElasticXS::GetElementCrossSection for " 129 << dp->GetDefinition()->GetParticle 131 << dp->GetDefinition()->GetParticleName() 130 << " Ekin(GeV)= " << dp->GetKineti 132 << " Ekin(GeV)= " << dp->GetKineticEnergy()/CLHEP::GeV 131 << " in nucleus Z= " << Z << " A= 133 << " in nucleus Z= " << Z << " A= " << theA[Z] 132 << " XS(b)= " << cross/barn 134 << " XS(b)= " << cross/barn 133 << G4endl; 135 << G4endl; 134 } 136 } 135 #endif << 136 return cross; 137 return cross; 137 } 138 } 138 139 139 //....oooOO0OOooo........oooOO0OOooo........oo 140 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 140 141 141 G4double 142 G4double 142 G4BGGNucleonElasticXS::GetIsoCrossSection(cons 143 G4BGGNucleonElasticXS::GetIsoCrossSection(const G4DynamicParticle* dp, 143 G4in << 144 G4int Z, G4int A, 144 cons 145 const G4Isotope*, 145 cons 146 const G4Element*, 146 cons 147 const G4Material*) 147 { 148 { 148 // this method should be called only for Z = 149 // this method should be called only for Z = 1 149 fHadron->HadronNucleonXscNS(dp->GetDefinitio 150 fHadron->HadronNucleonXscNS(dp->GetDefinition(), theProton, 150 dp->GetKineticEn 151 dp->GetKineticEnergy()); 151 G4double cross = A*fHadron->GetElasticHadron 152 G4double cross = A*fHadron->GetElasticHadronNucleonXsc(); 152 153 153 #ifdef G4VERBOSE << 154 if(verboseLevel > 1) { 154 if (verboseLevel > 1) { << 155 G4cout << "G4BGGNucleonElasticXS::GetIsoCr 155 G4cout << "G4BGGNucleonElasticXS::GetIsoCrossSection for " 156 << dp->GetDefinition()->GetParticle 156 << dp->GetDefinition()->GetParticleName() 157 << " Ekin(GeV)= " << dp->GetKineti 157 << " Ekin(GeV)= " << dp->GetKineticEnergy()/CLHEP::GeV 158 << " in nucleus Z=1 A=" << A << 158 << " in nucleus Z= " << Z << " A= " << A 159 << " XS(b)= " << cross/barn 159 << " XS(b)= " << cross/barn 160 << G4endl; 160 << G4endl; 161 } 161 } 162 #endif << 163 return cross; 162 return cross; 164 } 163 } 165 164 166 //....oooOO0OOooo........oooOO0OOooo........oo 165 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 167 166 168 void G4BGGNucleonElasticXS::BuildPhysicsTable( 167 void G4BGGNucleonElasticXS::BuildPhysicsTable(const G4ParticleDefinition& p) 169 { 168 { >> 169 if(fNucleon) { return; } 170 if(&p == theProton || &p == G4Neutron::Neutr 170 if(&p == theProton || &p == G4Neutron::Neutron()) { 171 isProton = (theProton == &p); 171 isProton = (theProton == &p); 172 172 173 } else { 173 } else { 174 G4ExceptionDescription ed; 174 G4ExceptionDescription ed; 175 ed << "This BGG cross section is applicabl 175 ed << "This BGG cross section is applicable only to nucleons and not to " 176 << p.GetParticleName() << G4endl; 176 << p.GetParticleName() << G4endl; 177 G4Exception("G4BGGNucleonElasticXS::BuildP 177 G4Exception("G4BGGNucleonElasticXS::BuildPhysicsTable", "had001", 178 FatalException, ed); 178 FatalException, ed); >> 179 return; 179 } 180 } 180 } << 181 181 182 //....oooOO0OOooo........oooOO0OOooo........oo << 182 fNucleon = new G4NucleonNuclearCrossSection(); >> 183 fGlauber = new G4ComponentGGHadronNucleusXsc(); >> 184 fHadron = new G4HadronNucleonXsc(); 183 185 184 void G4BGGNucleonElasticXS::Initialise() << 186 fNucleon->BuildPhysicsTable(p); 185 { << 187 186 theA[0] = theA[1] = 1; << 188 if(0 == theA[0]) { 187 G4ThreeVector mom(0.0,0.0,1.0); << 189 #ifdef G4MULTITHREADED 188 G4DynamicParticle dp(theProton, mom, fGlaube << 190 G4MUTEXLOCK(&nucleonElasticXSMutex); >> 191 if(0 == theA[0]) { >> 192 #endif >> 193 isMaster = true; >> 194 #ifdef G4MULTITHREADED >> 195 } >> 196 G4MUTEXUNLOCK(&nucleonElasticXSMutex); >> 197 #endif >> 198 } else { >> 199 return; >> 200 } 189 201 190 G4NistManager* nist = G4NistManager::Instanc << 202 if(isMaster && 0 == theA[0]) { 191 G4double csup, csdn; << 192 203 193 for (G4int iz=2; iz<93; ++iz) { << 204 theA[0] = theA[1] = 1; 194 G4int A = G4lrint(nist->GetAtomicMassAmu(i << 205 G4ThreeVector mom(0.0,0.0,1.0); 195 theA[iz] = A; << 206 G4DynamicParticle dp(theProton, mom, fGlauberEnergy); 196 207 197 csup = fGlauber->GetElasticGlauberGribov(& << 208 G4NistManager* nist = G4NistManager::Instance(); 198 csdn = fNucleon->GetElasticCrossSection(&d << 209 G4double csup, csdn; 199 theGlauberFacP[iz] = csdn/csup; << 200 } << 201 210 202 dp.SetDefinition(G4Neutron::Neutron()); << 211 if(verboseLevel > 0) { 203 for (G4int iz=2; iz<93; ++iz) { << 212 G4cout << "### G4BGGNucleonElasticXS::Initialise for " 204 csup = fGlauber->GetElasticGlauberGribov(& << 213 << p.GetParticleName() << G4endl; 205 csdn = fNucleon->GetElasticCrossSection(&d << 214 } 206 theGlauberFacN[iz] = csdn/csup; << 207 215 208 if (verboseLevel > 1) { << 216 for(G4int iz=2; iz<93; ++iz) { 209 G4cout << "G4BGGNucleonElasticXS::Init << 217 G4int A = G4lrint(nist->GetAtomicMassAmu(iz)); 210 << " GFactorP=" << theGlauberFa << 218 theA[iz] = A; 211 << " GFactorN=" << theGlauberFa << 219 212 } << 220 csup = fGlauber->GetElasticGlauberGribov(&dp, iz, A); 213 } << 221 csdn = fNucleon->GetElasticCrossSection(&dp, iz); >> 222 theGlauberFacP[iz] = csdn/csup; >> 223 } >> 224 >> 225 dp.SetDefinition(G4Neutron::Neutron()); >> 226 for(G4int iz=2; iz<93; ++iz) { >> 227 csup = fGlauber->GetElasticGlauberGribov(&dp, iz, theA[iz]); >> 228 csdn = fNucleon->GetElasticCrossSection(&dp, iz); >> 229 theGlauberFacN[iz] = csdn/csup; >> 230 >> 231 if(verboseLevel > 0) { >> 232 G4cout << "Z= " << iz << " A= " << theA[iz] >> 233 << " GFactorP= " << theGlauberFacP[iz] >> 234 << " GFactorN= " << theGlauberFacN[iz] << G4endl; >> 235 } >> 236 } 214 237 215 theCoulombFacP[0] = theCoulombFacP[1] = << 238 theCoulombFacP[0] = theCoulombFacP[1] = 216 theCoulombFacN[0] = theCoulombFacN[1] = 1. 239 theCoulombFacN[0] = theCoulombFacN[1] = 1.0; 217 dp.SetDefinition(theProton); << 240 dp.SetDefinition(theProton); 218 dp.SetKineticEnergy(fLowEnergy); << 241 dp.SetKineticEnergy(fLowEnergy); 219 for (G4int iz=2; iz<93; ++iz) { << 242 for(G4int iz=2; iz<93; ++iz) { 220 theCoulombFacP[iz] = fNucleon->GetElasticC << 243 theCoulombFacP[iz] = fNucleon->GetElasticCrossSection(&dp, iz) 221 /CoulombFactor(fLowEnergy, iz); << 244 /CoulombFactor(fLowEnergy, iz); 222 } << 245 } 223 dp.SetDefinition(G4Neutron::Neutron()); << 246 dp.SetDefinition(G4Neutron::Neutron()); 224 for(G4int iz=2; iz<93; ++iz) { << 247 for(G4int iz=2; iz<93; ++iz) { 225 theCoulombFacN[iz] = fNucleon->GetElasticC << 248 theCoulombFacN[iz] = fNucleon->GetElasticCrossSection(&dp, iz) 226 /CoulombFactor(fLowEnergy, iz); << 249 /CoulombFactor(fLowEnergy, iz); 227 << 250 228 if (verboseLevel > 1) { << 251 if(verboseLevel > 0) { 229 G4cout << "G4BGGNucleonElasticXS::Initia << 252 G4cout << "Z= " << iz << " A= " << theA[iz] 230 << " CFactorP=" << theCoulombFacP[iz] << 253 << " CFactorP= " << theCoulombFacP[iz] 231 << " CFactorN=" << theCoulombFacN[iz] < << 254 << " CFactorN= " << theCoulombFacN[iz] << G4endl; >> 255 } 232 } 256 } 233 } 257 } 234 } 258 } 235 259 236 //....oooOO0OOooo........oooOO0OOooo........oo 260 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 237 261 238 G4double G4BGGNucleonElasticXS::CoulombFactor( 262 G4double G4BGGNucleonElasticXS::CoulombFactor(G4double kinEnergy, G4int Z) 239 { 263 { 240 return (isProton) ? << 264 G4double res= 1.0; 241 G4NuclearRadii::CoulombFactor(Z, theA[Z], << 265 if(isProton) { >> 266 res = G4NuclearRadii::CoulombFactor(Z, theA[Z], theProton, kinEnergy); >> 267 } >> 268 return res; 242 } 269 } 243 270 244 //....oooOO0OOooo........oooOO0OOooo........oo 271 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 245 272 246 void G4BGGNucleonElasticXS::CrossSectionDescri 273 void G4BGGNucleonElasticXS::CrossSectionDescription(std::ostream& outFile) const 247 { 274 { 248 outFile << "The Barashenkov-Glauber-Gribov c 275 outFile << "The Barashenkov-Glauber-Gribov cross section handles elastic\n" 249 << "scattering of protons and neutro 276 << "scattering of protons and neutrons from nuclei using the\n" 250 << "Barashenkov parameterization bel 277 << "Barashenkov parameterization below 91 GeV and the Glauber-Gribov\n" 251 << "parameterization above 91 GeV. n 278 << "parameterization above 91 GeV. n"; 252 } 279 } 253 280 254 //....oooOO0OOooo........oooOO0OOooo........oo 281 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 255 282