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 // 28 // 29 // ClassName: G4HadronicParameters 29 // ClassName: G4HadronicParameters 30 // 30 // 31 // Author: 2018 Alberto Ribon 31 // Author: 2018 Alberto Ribon 32 // 32 // 33 // Description: Singleton to keep global ha 33 // Description: Singleton to keep global hadronic parameters. 34 // 34 // 35 // Modified: 35 // Modified: 36 // 36 // 37 //-------------------------------------------- 37 //---------------------------------------------------------------------------- 38 38 39 #include "G4HadronicParameters.hh" 39 #include "G4HadronicParameters.hh" 40 #include <CLHEP/Units/PhysicalConstants.h> 40 #include <CLHEP/Units/PhysicalConstants.h> 41 #include "G4ApplicationState.hh" 41 #include "G4ApplicationState.hh" 42 #include "G4StateManager.hh" 42 #include "G4StateManager.hh" 43 #include "G4HadronicParametersMessenger.hh" 43 #include "G4HadronicParametersMessenger.hh" 44 #include "G4Threading.hh" << 44 45 #include "G4AutoLock.hh" << 46 45 47 G4HadronicParameters* G4HadronicParameters::sI 46 G4HadronicParameters* G4HadronicParameters::sInstance = nullptr; 48 47 49 namespace << 48 #ifdef G4MULTITHREADED 50 { << 49 G4Mutex G4HadronicParameters::paramMutex = G4MUTEX_INITIALIZER; 51 G4Mutex paramMutex = G4MUTEX_INITIALIZER; << 50 #endif 52 } << 53 51 54 G4HadronicParameters* G4HadronicParameters::In 52 G4HadronicParameters* G4HadronicParameters::Instance() { 55 if ( sInstance == nullptr ) { 53 if ( sInstance == nullptr ) { 56 G4AutoLock l(¶mMutex); << 54 #ifdef G4MULTITHREADED >> 55 G4MUTEXLOCK( ¶mMutex ); 57 if ( sInstance == nullptr ) { 56 if ( sInstance == nullptr ) { >> 57 #endif 58 static G4HadronicParameters theHadronicP 58 static G4HadronicParameters theHadronicParametersObject; 59 sInstance = &theHadronicParametersObject 59 sInstance = &theHadronicParametersObject; >> 60 #ifdef G4MULTITHREADED 60 } 61 } 61 l.unlock(); << 62 G4MUTEXUNLOCK(¶mMutex); >> 63 #endif 62 } 64 } 63 return sInstance; 65 return sInstance; 64 } 66 } 65 67 66 68 67 G4HadronicParameters::~G4HadronicParameters() 69 G4HadronicParameters::~G4HadronicParameters() { 68 delete fMessenger; 70 delete fMessenger; 69 } 71 } 70 72 71 73 72 G4HadronicParameters::G4HadronicParameters() { 74 G4HadronicParameters::G4HadronicParameters() { 73 fMaxEnergy = 100.0*CLHEP::TeV; 75 fMaxEnergy = 100.0*CLHEP::TeV; 74 fMinEnergyTransitionFTF_Cascade = 3.0*CLHEP: 76 fMinEnergyTransitionFTF_Cascade = 3.0*CLHEP::GeV; 75 fMaxEnergyTransitionFTF_Cascade = 6.0*CLHEP: 77 fMaxEnergyTransitionFTF_Cascade = 6.0*CLHEP::GeV; 76 fMinEnergyTransitionQGS_FTF = 12.0*CLHEP::Ge 78 fMinEnergyTransitionQGS_FTF = 12.0*CLHEP::GeV; 77 fMaxEnergyTransitionQGS_FTF = 25.0*CLHEP::Ge 79 fMaxEnergyTransitionQGS_FTF = 25.0*CLHEP::GeV; 78 fMinEnergyINCLXX_Pbar = 0.0*CLHEP::GeV; << 79 fMaxEnergyINCLXX_Pbar = 10.0*CLHEP::GeV; << 80 fEnergyThresholdForHeavyHadrons = 1.1*CLHEP: 80 fEnergyThresholdForHeavyHadrons = 1.1*CLHEP::GeV; 81 fMessenger = new G4HadronicParametersMesseng 81 fMessenger = new G4HadronicParametersMessenger( this ); 82 << 83 // read environment variables << 84 fReportLevel = G4GetEnv<G4int>("G4Hadronic_e << 85 const char* ep1 = std::getenv("G4Hadronic_ep << 86 if(nullptr != ep1) { fRelativeDiff = std::st << 87 const char* ep2 = std::getenv("G4Hadronic_ep << 88 if(nullptr != ep2) { fAbsoluteDiff = std::st << 89 const char* v = G4FindDataDir("G4PARTICLEXSD << 90 if(nullptr != v) { << 91 fDirPARTICLEXS = G4String(v); << 92 } else { << 93 if(1 < fVerboseLevel) { << 94 G4ExceptionDescription ed; << 95 ed << "Environment variable G4PARTICLEXS << 96 << " it is pointing out to not existi << 97 G4Exception("G4LevelReader::LevelManager << 98 JustWarning, ed, "Check file path"); << 99 } << 100 } << 101 const char* x = std::getenv("G4PhysListDocDi << 102 if(nullptr != x) { fPhysListDocDir = G4Strin << 103 const char* y = std::getenv("G4PhysListName" << 104 if(nullptr != y) { fPhysListName = G4String( << 105 const char* z = std::getenv("BINARY_CASCADE_ << 106 if(nullptr != z) { fBinaryDebug = true; } << 107 } 82 } 108 83 109 84 110 G4bool G4HadronicParameters::IsLocked() const 85 G4bool G4HadronicParameters::IsLocked() const { 111 return ( ! G4Threading::IsMasterThread() || 86 return ( ! G4Threading::IsMasterThread() || 112 G4StateManager::GetStateManager()-> 87 G4StateManager::GetStateManager()->GetCurrentState() != G4State_PreInit ); 113 } 88 } 114 89 115 90 116 void G4HadronicParameters::SetMaxEnergy( const 91 void G4HadronicParameters::SetMaxEnergy( const G4double val ) { 117 if ( ! IsLocked() && val > 0.0 ) { 92 if ( ! IsLocked() && val > 0.0 ) { 118 fMaxEnergy = val; 93 fMaxEnergy = val; 119 } 94 } 120 } 95 } 121 96 122 97 123 void G4HadronicParameters::SetMinEnergyTransit 98 void G4HadronicParameters::SetMinEnergyTransitionFTF_Cascade( const G4double val ) { 124 if ( ! IsLocked() && val > 0.0 ) { 99 if ( ! IsLocked() && val > 0.0 ) { 125 fMinEnergyTransitionFTF_Cascade = val; 100 fMinEnergyTransitionFTF_Cascade = val; 126 } 101 } 127 } 102 } 128 103 129 104 130 void G4HadronicParameters::SetMaxEnergyTransit 105 void G4HadronicParameters::SetMaxEnergyTransitionFTF_Cascade( const G4double val ) { 131 if ( ! IsLocked() && val > fMinEnergyTrans 106 if ( ! IsLocked() && val > fMinEnergyTransitionFTF_Cascade ) { 132 fMaxEnergyTransitionFTF_Cascade = val; 107 fMaxEnergyTransitionFTF_Cascade = val; 133 } 108 } 134 } 109 } 135 110 136 111 137 void G4HadronicParameters::SetMinEnergyTransit 112 void G4HadronicParameters::SetMinEnergyTransitionQGS_FTF( const G4double val ) { 138 if ( ! IsLocked() && val > 0.0 ) { 113 if ( ! IsLocked() && val > 0.0 ) { 139 fMinEnergyTransitionQGS_FTF = val; 114 fMinEnergyTransitionQGS_FTF = val; 140 } 115 } 141 } 116 } 142 117 143 void G4HadronicParameters::SetMaxEnergyTransit 118 void G4HadronicParameters::SetMaxEnergyTransitionQGS_FTF( const G4double val ) { 144 if ( ! IsLocked() && val > fMinEnergyTrans 119 if ( ! IsLocked() && val > fMinEnergyTransitionQGS_FTF ) { 145 fMaxEnergyTransitionQGS_FTF = val; 120 fMaxEnergyTransitionQGS_FTF = val; 146 } 121 } 147 } 122 } 148 123 149 void G4HadronicParameters::SetMinEnergyINCLXX_ << 150 if ( ! IsLocked() && val >= 0.0 ) { << 151 fMinEnergyINCLXX_Pbar = val; << 152 } << 153 } << 154 << 155 << 156 void G4HadronicParameters::SetMaxEnergyINCLXX_ << 157 if ( ! IsLocked() && val > fMinEnergyINCLX << 158 fMaxEnergyINCLXX_Pbar = val; << 159 } << 160 } << 161 << 162 void G4HadronicParameters::SetEnableBCParticle 124 void G4HadronicParameters::SetEnableBCParticles( G4bool val ) { 163 if ( ! IsLocked() ) fEnableBC = val; 125 if ( ! IsLocked() ) fEnableBC = val; 164 } 126 } 165 127 166 128 167 void G4HadronicParameters::SetEnableHyperNucle 129 void G4HadronicParameters::SetEnableHyperNuclei( G4bool val ) { 168 if ( ! IsLocked() ) fEnableHyperNuclei = val 130 if ( ! IsLocked() ) fEnableHyperNuclei = val; 169 } 131 } 170 132 171 133 172 void G4HadronicParameters::SetVerboseLevel( co 134 void G4HadronicParameters::SetVerboseLevel( const G4int val ) { 173 if ( ! IsLocked() && val >= 0 ) fVerboseLe 135 if ( ! IsLocked() && val >= 0 ) fVerboseLevel = val; 174 } 136 } 175 137 176 138 177 void G4HadronicParameters::SetEnergyThresholdF 139 void G4HadronicParameters::SetEnergyThresholdForHeavyHadrons( G4double val ) { 178 if ( ! IsLocked() && val >= 0 && val < 5*C 140 if ( ! IsLocked() && val >= 0 && val < 5*CLHEP::GeV ) { 179 fEnergyThresholdForHeavyHadrons = val; 141 fEnergyThresholdForHeavyHadrons = val; 180 } 142 } 181 } 143 } 182 144 183 145 184 void G4HadronicParameters::SetXSFactorNucleonI 146 void G4HadronicParameters::SetXSFactorNucleonInelastic( G4double val ) { 185 if ( ! IsLocked() && std::abs(val - 1.0) < 147 if ( ! IsLocked() && std::abs(val - 1.0) < fXSFactorLimit ) { 186 fXSFactorNucleonInelastic = val; 148 fXSFactorNucleonInelastic = val; 187 } 149 } 188 } 150 } 189 151 190 152 191 void G4HadronicParameters::SetXSFactorNucleonE 153 void G4HadronicParameters::SetXSFactorNucleonElastic( G4double val ) { 192 if ( ! IsLocked() && std::abs(val - 1.0) < 154 if ( ! IsLocked() && std::abs(val - 1.0) < fXSFactorLimit ) { 193 fXSFactorNucleonElastic = val; 155 fXSFactorNucleonElastic = val; 194 } 156 } 195 } 157 } 196 158 197 159 198 void G4HadronicParameters::SetXSFactorPionInel 160 void G4HadronicParameters::SetXSFactorPionInelastic( G4double val ) { 199 if ( ! IsLocked() && std::abs(val - 1.0) < 161 if ( ! IsLocked() && std::abs(val - 1.0) < fXSFactorLimit ) { 200 fXSFactorPionInelastic = val; 162 fXSFactorPionInelastic = val; 201 } 163 } 202 } 164 } 203 165 204 166 205 void G4HadronicParameters::SetXSFactorPionElas 167 void G4HadronicParameters::SetXSFactorPionElastic( G4double val ) { 206 if ( ! IsLocked() && std::abs(val - 1.0) < 168 if ( ! IsLocked() && std::abs(val - 1.0) < fXSFactorLimit ) { 207 fXSFactorPionElastic = val; 169 fXSFactorPionElastic = val; 208 } 170 } 209 } 171 } 210 172 211 173 212 void G4HadronicParameters::SetXSFactorHadronIn 174 void G4HadronicParameters::SetXSFactorHadronInelastic( G4double val ) { 213 if ( ! IsLocked() && std::abs(val - 1.0) < 175 if ( ! IsLocked() && std::abs(val - 1.0) < fXSFactorLimit ) { 214 fXSFactorHadronInelastic = val; 176 fXSFactorHadronInelastic = val; 215 } 177 } 216 } 178 } 217 179 218 180 219 void G4HadronicParameters::SetXSFactorHadronEl 181 void G4HadronicParameters::SetXSFactorHadronElastic( G4double val ) { 220 if ( ! IsLocked() && std::abs(val - 1.0) < 182 if ( ! IsLocked() && std::abs(val - 1.0) < fXSFactorLimit ) { 221 fXSFactorHadronElastic = val; 183 fXSFactorHadronElastic = val; 222 } 184 } 223 } 185 } 224 186 225 187 226 void G4HadronicParameters::SetXSFactorEM( G4do 188 void G4HadronicParameters::SetXSFactorEM( G4double val ) { 227 if ( ! IsLocked() && std::abs(val - 1.0) < 189 if ( ! IsLocked() && std::abs(val - 1.0) < fXSFactorLimit ) { 228 fXSFactorEM = val; 190 fXSFactorEM = val; 229 } 191 } 230 } 192 } 231 193 232 194 233 void G4HadronicParameters::SetNeutronKineticEn << 234 // This setting works only after initializat << 235 // whereas it does not work for G4State_PreI << 236 if ( G4Threading::IsMasterThread() && val << 237 fNeutronEkinThresholdForSVT = val; << 238 } << 239 } << 240 << 241 << 242 void G4HadronicParameters::SetTimeThresholdFor << 243 // This setting works only before initializa << 244 // (else, if used after initialization, it w << 245 if ( G4Threading::IsMasterThread() && val << 246 fTimeThresholdForRadioactiveDecays = val; << 247 } << 248 } << 249 << 250 << 251 void G4HadronicParameters::SetApplyFactorXS( G 195 void G4HadronicParameters::SetApplyFactorXS( G4bool val ) { 252 if ( ! IsLocked() ) fApplyFactorXS = val; 196 if ( ! IsLocked() ) fApplyFactorXS = val; 253 } 197 } 254 198 255 199 256 void G4HadronicParameters::SetEnableCRCoalesce 200 void G4HadronicParameters::SetEnableCRCoalescence( G4bool val ) { 257 if ( ! IsLocked() ) fEnableCRCoalescence = v 201 if ( ! IsLocked() ) fEnableCRCoalescence = val; 258 } << 259 << 260 << 261 void G4HadronicParameters::SetEnableIntegralIn << 262 if ( ! IsLocked() ) fEnableIntegralInelastic << 263 } << 264 << 265 << 266 void G4HadronicParameters::SetEnableIntegralEl << 267 if ( ! IsLocked() ) fEnableIntegralElasticXS << 268 } << 269 << 270 << 271 void G4HadronicParameters::SetEnableDiffDissoc << 272 if ( ! IsLocked() ) fEnableDiffDissociationF << 273 } << 274 << 275 << 276 void G4HadronicParameters::SetEnableNeutronGen << 277 if ( ! IsLocked() ) fNeutronGeneral = val; << 278 } << 279 << 280 << 281 void G4HadronicParameters::SetEnableNUDEX( G4b << 282 if ( ! IsLocked() ) fEnableNUDEX = val; << 283 } << 284 << 285 << 286 void G4HadronicParameters::SetTypeTablePT( con << 287 if ( ! IsLocked() ) fTypeTablePT = typeTable << 288 } << 289 << 290 << 291 void G4HadronicParameters::SetEnableCoherentCh << 292 if ( ! IsLocked() ) fChargeExchange = val; << 293 } 202 } 294 203