Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // 27 // -------------------------------------------------------------- 28 // 29 // For information related to this code contact: Alex Howard 30 // e-mail: alexander.howard@cern.ch 31 // -------------------------------------------------------------- 32 // Comments 33 // 34 // Underground Advanced 35 // 36 // This physics list is taken from the underground_physics example with small 37 // modifications. It is an example of a "flat" physics list with no dependence 38 // on builders. The physics covered would be suitable for a low background 39 // experiment including the neutron_hp package 40 // 41 // 42 // 43 // PhysicsList program 44 // 45 // Modified: 46 // 47 // 14-02-03 Fix bugs in msc and hIon instanciation + cut per region 48 // 16-08-10 Remove inclusion of obsolete class of G4ParticleWithCuts 49 // 20-10-10 Migrate LowEnergy process to Livermore models, LP 50 // 28-03-13 Replace LEP/HEP with FTFP+BERT (A.R.) 51 // 15-01-20 Updated cross sections (A.R.) 52 // -------------------------------------------------------------- 53 54 #include <iomanip> 55 56 #include "globals.hh" 57 #include <CLHEP/Units/SystemOfUnits.h> 58 #include "G4ios.hh" 59 #include "G4ProcessManager.hh" 60 #include "G4ProcessVector.hh" 61 62 #include "G4ParticleTypes.hh" 63 #include "G4ParticleTable.hh" 64 #include "G4ProductionCutsTable.hh" 65 66 #include "G4UserLimits.hh" 67 #include "G4WarnPLStatus.hh" 68 69 // Builder for all stopping processes 70 #include "G4StoppingPhysics.hh" 71 72 #include "G4HadronicParameters.hh" 73 #include "G4ShortLivedConstructor.hh" 74 #include "LBE.hh" 75 76 // Constructor ///////////////////////////////////////////////////////////// 77 LBE::LBE(G4int ver) 78 { 79 if(ver > 0) { 80 G4cout << "You are using the simulation engine: LBE"<<G4endl; 81 G4cout <<G4endl; 82 } 83 defaultCutValue = 1.0*CLHEP::micrometer; // 84 cutForGamma = defaultCutValue; 85 cutForElectron = 1.0*CLHEP::micrometer; 86 cutForPositron = defaultCutValue; 87 //not used: 88 // cutForProton = defaultCutValue; 89 // cutForAlpha = 1.0*CLHEP::nanometer; 90 // cutForGenericIon = 1.0*CLHEP::nanometer; 91 92 stoppingPhysics = new G4StoppingPhysics; 93 94 VerboseLevel = ver; 95 OpVerbLevel = 0; 96 97 SetVerboseLevel(VerboseLevel); 98 } 99 100 101 // Destructor ////////////////////////////////////////////////////////////// 102 LBE::~LBE() 103 { 104 delete stoppingPhysics; 105 } 106 107 108 // Construct Particles ///////////////////////////////////////////////////// 109 void LBE::ConstructParticle() 110 { 111 112 // In this method, static member functions should be called 113 // for all particles which you want to use. 114 // This ensures that objects of these particle types will be 115 // created in the program. 116 117 ConstructMyBosons(); 118 ConstructMyLeptons(); 119 ConstructMyMesons(); 120 ConstructMyBaryons(); 121 ConstructMyIons(); 122 ConstructMyShortLiveds(); 123 stoppingPhysics->ConstructParticle(); // Anything not included above 124 } 125 126 127 // construct Bosons:///////////////////////////////////////////////////// 128 void LBE::ConstructMyBosons() 129 { 130 // pseudo-particles 131 G4Geantino::GeantinoDefinition(); 132 G4ChargedGeantino::ChargedGeantinoDefinition(); 133 134 // gamma 135 G4Gamma::GammaDefinition(); 136 137 //OpticalPhotons 138 G4OpticalPhoton::OpticalPhotonDefinition(); 139 } 140 141 142 // construct Leptons:///////////////////////////////////////////////////// 143 void LBE::ConstructMyLeptons() 144 { 145 // leptons 146 G4Electron::ElectronDefinition(); 147 G4Positron::PositronDefinition(); 148 G4MuonPlus::MuonPlusDefinition(); 149 G4MuonMinus::MuonMinusDefinition(); 150 151 G4NeutrinoE::NeutrinoEDefinition(); 152 G4AntiNeutrinoE::AntiNeutrinoEDefinition(); 153 G4NeutrinoMu::NeutrinoMuDefinition(); 154 G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); 155 } 156 157 #include "G4MesonConstructor.hh" 158 #include "G4BaryonConstructor.hh" 159 #include "G4IonConstructor.hh" 160 161 162 // construct Mesons:///////////////////////////////////////////////////// 163 void LBE::ConstructMyMesons() 164 { 165 // mesons 166 G4MesonConstructor mConstructor; 167 mConstructor.ConstructParticle(); 168 169 } 170 171 172 // construct Baryons:///////////////////////////////////////////////////// 173 void LBE::ConstructMyBaryons() 174 { 175 // baryons 176 G4BaryonConstructor bConstructor; 177 bConstructor.ConstructParticle(); 178 179 } 180 181 182 // construct Ions:///////////////////////////////////////////////////// 183 void LBE::ConstructMyIons() 184 { 185 // ions 186 G4IonConstructor iConstructor; 187 iConstructor.ConstructParticle(); 188 189 } 190 191 // construct Shortliveds:///////////////////////////////////////////////////// 192 void LBE::ConstructMyShortLiveds() 193 { 194 // ShortLiveds 195 G4ShortLivedConstructor pShortLivedConstructor; 196 pShortLivedConstructor.ConstructParticle(); 197 } 198 199 200 201 202 // Construct Processes ////////////////////////////////////////////////////// 203 void LBE::ConstructProcess() 204 { 205 AddTransportation(); 206 ConstructEM(); 207 ConstructOp(); 208 ConstructHad(); 209 ConstructGeneral(); 210 } 211 212 213 // Transportation /////////////////////////////////////////////////////////// 214 #include "G4MaxTimeCuts.hh" 215 #include "G4MinEkineCuts.hh" 216 217 void LBE::AddTransportation() { 218 219 G4VUserPhysicsList::AddTransportation(); 220 221 auto myParticleIterator=G4ParticleTable::GetParticleTable()->GetIterator(); 222 myParticleIterator->reset(); 223 while( (*(myParticleIterator))() ){ 224 G4ParticleDefinition* particle = myParticleIterator->value(); 225 G4ProcessManager* pmanager = particle->GetProcessManager(); 226 G4String particleName = particle->GetParticleName(); 227 // time cuts for ONLY neutrons: 228 if(particleName == "neutron") 229 pmanager->AddDiscreteProcess(new G4MaxTimeCuts()); 230 // Energy cuts to kill charged (embedded in method) particles: 231 pmanager->AddDiscreteProcess(new G4MinEkineCuts()); 232 } 233 } 234 235 236 // Electromagnetic Processes //////////////////////////////////////////////// 237 // all charged particles 238 239 #include "G4eMultipleScattering.hh" 240 #include "G4MuMultipleScattering.hh" 241 #include "G4hMultipleScattering.hh" 242 243 // gamma. Use Livermore models 244 #include "G4PhotoElectricEffect.hh" 245 #include "G4LivermorePhotoElectricModel.hh" 246 #include "G4ComptonScattering.hh" 247 #include "G4LivermoreComptonModel.hh" 248 #include "G4GammaConversion.hh" 249 #include "G4LivermoreGammaConversionModel.hh" 250 #include "G4RayleighScattering.hh" 251 #include "G4LivermoreRayleighModel.hh" 252 253 254 // e- 255 #include "G4eMultipleScattering.hh" 256 #include "G4UniversalFluctuation.hh" 257 #include "G4UrbanMscModel.hh" 258 259 #include "G4eIonisation.hh" 260 #include "G4LivermoreIonisationModel.hh" 261 262 #include "G4eBremsstrahlung.hh" 263 #include "G4LivermoreBremsstrahlungModel.hh" 264 265 // e+ 266 #include "G4eplusAnnihilation.hh" 267 268 269 // alpha and GenericIon and deuterons, triton, He3: 270 #include "G4ionIonisation.hh" 271 #include "G4hIonisation.hh" 272 #include "G4hBremsstrahlung.hh" 273 // 274 #include "G4IonParametrisedLossModel.hh" 275 #include "G4NuclearStopping.hh" 276 #include "G4EnergyLossTables.hh" 277 278 //muon: 279 #include "G4MuIonisation.hh" 280 #include "G4MuBremsstrahlung.hh" 281 #include "G4MuPairProduction.hh" 282 #include "G4MuonMinusCapture.hh" 283 284 //OTHERS: 285 //#include "G4hIonisation.hh" // standard hadron ionisation 286 287 void LBE::ConstructEM() { 288 289 // models & processes: 290 // Use Livermore models up to 20 MeV, and standard 291 // models for higher energy 292 G4double LivermoreHighEnergyLimit = 20*CLHEP::MeV; 293 // 294 auto myParticleIterator=G4ParticleTable::GetParticleTable()->GetIterator(); 295 myParticleIterator->reset(); 296 while( (*(myParticleIterator))() ){ 297 G4ParticleDefinition* particle = myParticleIterator->value(); 298 G4ProcessManager* pmanager = particle->GetProcessManager(); 299 G4String particleName = particle->GetParticleName(); 300 G4String particleType = particle->GetParticleType(); 301 G4double charge = particle->GetPDGCharge(); 302 303 if (particleName == "gamma") 304 { 305 G4PhotoElectricEffect* thePhotoElectricEffect = new G4PhotoElectricEffect(); 306 G4LivermorePhotoElectricModel* theLivermorePhotoElectricModel = 307 new G4LivermorePhotoElectricModel(); 308 theLivermorePhotoElectricModel->SetHighEnergyLimit(LivermoreHighEnergyLimit); 309 thePhotoElectricEffect->AddEmModel(0, theLivermorePhotoElectricModel); 310 pmanager->AddDiscreteProcess(thePhotoElectricEffect); 311 312 G4ComptonScattering* theComptonScattering = new G4ComptonScattering(); 313 G4LivermoreComptonModel* theLivermoreComptonModel = 314 new G4LivermoreComptonModel(); 315 theLivermoreComptonModel->SetHighEnergyLimit(LivermoreHighEnergyLimit); 316 theComptonScattering->AddEmModel(0, theLivermoreComptonModel); 317 pmanager->AddDiscreteProcess(theComptonScattering); 318 319 G4GammaConversion* theGammaConversion = new G4GammaConversion(); 320 G4LivermoreGammaConversionModel* theLivermoreGammaConversionModel = 321 new G4LivermoreGammaConversionModel(); 322 theLivermoreGammaConversionModel->SetHighEnergyLimit(LivermoreHighEnergyLimit); 323 theGammaConversion->AddEmModel(0, theLivermoreGammaConversionModel); 324 pmanager->AddDiscreteProcess(theGammaConversion); 325 326 G4RayleighScattering* theRayleigh = new G4RayleighScattering(); 327 G4LivermoreRayleighModel* theRayleighModel = new G4LivermoreRayleighModel(); 328 theRayleighModel->SetHighEnergyLimit(LivermoreHighEnergyLimit); 329 theRayleigh->AddEmModel(0, theRayleighModel); 330 pmanager->AddDiscreteProcess(theRayleigh); 331 332 } 333 else if (particleName == "e-") 334 { 335 //electron 336 // process ordering: AddProcess(name, at rest, along step, post step) 337 // -1 = not implemented, then ordering 338 G4eMultipleScattering* msc = new G4eMultipleScattering(); 339 //msc->AddEmModel(0, new G4UrbanMscModel()); 340 msc->SetStepLimitType(fUseDistanceToBoundary); 341 pmanager->AddProcess(msc, -1, 1, 1); 342 343 // Ionisation 344 G4eIonisation* eIoni = new G4eIonisation(); 345 G4LivermoreIonisationModel* theIoniLivermore = new 346 G4LivermoreIonisationModel(); 347 theIoniLivermore->SetHighEnergyLimit(1*CLHEP::MeV); 348 eIoni->AddEmModel(0, theIoniLivermore, new G4UniversalFluctuation() ); 349 eIoni->SetStepFunction(0.2, 100*CLHEP::um); // 350 pmanager->AddProcess(eIoni, -1, 2, 2); 351 352 // Bremsstrahlung 353 G4eBremsstrahlung* eBrem = new G4eBremsstrahlung(); 354 G4LivermoreBremsstrahlungModel* theBremLivermore = new 355 G4LivermoreBremsstrahlungModel(); 356 theBremLivermore->SetHighEnergyLimit(LivermoreHighEnergyLimit); 357 eBrem->AddEmModel(0, theBremLivermore); 358 pmanager->AddProcess(eBrem, -1,-3, 3); 359 } 360 else if (particleName == "e+") 361 { 362 //positron 363 G4eMultipleScattering* msc = new G4eMultipleScattering(); 364 //msc->AddEmModel(0, new G4UrbanMscModel()); 365 msc->SetStepLimitType(fUseDistanceToBoundary); 366 pmanager->AddProcess(msc, -1, 1, 1); 367 G4eIonisation* eIoni = new G4eIonisation(); 368 eIoni->SetStepFunction(0.2, 100*CLHEP::um); 369 pmanager->AddProcess(eIoni, -1, 2, 2); 370 pmanager->AddProcess(new G4eBremsstrahlung, -1,-3, 3); 371 pmanager->AddProcess(new G4eplusAnnihilation,0,-1, 4); 372 } 373 else if( particleName == "mu+" || 374 particleName == "mu-" ) 375 { 376 //muon 377 G4MuMultipleScattering* aMultipleScattering = new G4MuMultipleScattering(); 378 pmanager->AddProcess(aMultipleScattering, -1, 1, 1); 379 pmanager->AddProcess(new G4MuIonisation(), -1, 2, 2); 380 pmanager->AddProcess(new G4MuBremsstrahlung(), -1,-1, 3); 381 pmanager->AddProcess(new G4MuPairProduction(), -1,-1, 4); 382 if( particleName == "mu-" ) 383 pmanager->AddProcess(new G4MuonMinusCapture(), 0,-1,-1); 384 } 385 else if (particleName == "GenericIon") 386 { 387 pmanager->AddProcess(new G4hMultipleScattering, -1, 1, 1); 388 G4ionIonisation* ionIoni = new G4ionIonisation(); 389 ionIoni->SetEmModel(new G4IonParametrisedLossModel()); 390 ionIoni->SetStepFunction(0.1, 10*CLHEP::um); 391 pmanager->AddProcess(ionIoni, -1, 2, 2); 392 pmanager->AddProcess(new G4NuclearStopping(), -1, 3,-1); 393 } 394 else if (particleName == "alpha" || particleName == "He3") 395 { 396 //MSC, ion-Ionisation, Nuclear Stopping 397 pmanager->AddProcess(new G4hMultipleScattering, -1, 1, 1); 398 399 G4ionIonisation* ionIoni = new G4ionIonisation(); 400 ionIoni->SetStepFunction(0.1, 20*CLHEP::um); 401 pmanager->AddProcess(ionIoni, -1, 2, 2); 402 pmanager->AddProcess(new G4NuclearStopping(), -1, 3,-1); 403 } 404 else if (particleName == "proton" || 405 particleName == "deuteron" || 406 particleName == "triton" || 407 particleName == "pi+" || 408 particleName == "pi-" || 409 particleName == "kaon+" || 410 particleName == "kaon-") 411 { 412 //MSC, h-ionisation, bremsstrahlung 413 pmanager->AddProcess(new G4hMultipleScattering, -1, 1, 1); 414 G4hIonisation* hIoni = new G4hIonisation(); 415 hIoni->SetStepFunction(0.2, 50*CLHEP::um); 416 pmanager->AddProcess(hIoni, -1, 2, 2); 417 pmanager->AddProcess(new G4hBremsstrahlung, -1,-3, 3); 418 } 419 else if ((!particle->IsShortLived()) && 420 (charge != 0.0) && 421 (particle->GetParticleName() != "chargedgeantino")) 422 { 423 //all others charged particles except geantino 424 pmanager->AddProcess(new G4hMultipleScattering, -1, 1, 1); 425 pmanager->AddProcess(new G4hIonisation, -1, 2, 2); 426 } 427 428 } 429 } 430 431 432 // Optical Processes //////////////////////////////////////////////////////// 433 #include "G4Scintillation.hh" 434 #include "G4OpAbsorption.hh" 435 //#include "G4OpRayleigh.hh" 436 #include "G4OpBoundaryProcess.hh" 437 438 void LBE::ConstructOp() 439 { 440 // default scintillation process 441 //Coverity report: check that the process is actually used, if not must delete 442 G4bool theScintProcessDefNeverUsed = true; 443 G4Scintillation* theScintProcessDef = new G4Scintillation("Scintillation"); 444 // theScintProcessDef->DumpPhysicsTable(); 445 theScintProcessDef->SetTrackSecondariesFirst(true); 446 theScintProcessDef->SetVerboseLevel(OpVerbLevel); 447 448 // scintillation process for alpha: 449 G4bool theScintProcessAlphaNeverUsed = true; 450 G4Scintillation* theScintProcessAlpha = new G4Scintillation("Scintillation"); 451 // theScintProcessNuc->DumpPhysicsTable(); 452 theScintProcessAlpha->SetTrackSecondariesFirst(true); 453 theScintProcessAlpha->SetVerboseLevel(OpVerbLevel); 454 455 // scintillation process for heavy nuclei 456 G4bool theScintProcessNucNeverUsed = true; 457 G4Scintillation* theScintProcessNuc = new G4Scintillation("Scintillation"); 458 // theScintProcessNuc->DumpPhysicsTable(); 459 theScintProcessNuc->SetTrackSecondariesFirst(true); 460 theScintProcessNuc->SetVerboseLevel(OpVerbLevel); 461 462 // optical processes 463 G4bool theAbsorptionProcessNeverUsed = true; 464 G4OpAbsorption* theAbsorptionProcess = new G4OpAbsorption(); 465 // G4OpRayleigh* theRayleighScatteringProcess = new G4OpRayleigh(); 466 G4bool theBoundaryProcessNeverUsed = true; 467 G4OpBoundaryProcess* theBoundaryProcess = new G4OpBoundaryProcess(); 468 // theAbsorptionProcess->DumpPhysicsTable(); 469 // theRayleighScatteringProcess->DumpPhysicsTable(); 470 theAbsorptionProcess->SetVerboseLevel(OpVerbLevel); 471 // theRayleighScatteringProcess->SetVerboseLevel(OpVerbLevel); 472 theBoundaryProcess->SetVerboseLevel(OpVerbLevel); 473 474 auto myParticleIterator=G4ParticleTable::GetParticleTable()->GetIterator(); 475 myParticleIterator->reset(); 476 while( (*(myParticleIterator))() ) 477 { 478 G4ParticleDefinition* particle = myParticleIterator->value(); 479 G4ProcessManager* pmanager = particle->GetProcessManager(); 480 G4String particleName = particle->GetParticleName(); 481 if (theScintProcessDef->IsApplicable(*particle)) { 482 // if(particle->GetPDGMass() > 5.0*CLHEP::GeV) 483 if(particle->GetParticleName() == "GenericIon") { 484 pmanager->AddProcess(theScintProcessNuc); // AtRestDiscrete 485 pmanager->SetProcessOrderingToLast(theScintProcessNuc,idxAtRest); 486 pmanager->SetProcessOrderingToLast(theScintProcessNuc,idxPostStep); 487 theScintProcessNucNeverUsed = false; 488 } 489 else if(particle->GetParticleName() == "alpha") { 490 pmanager->AddProcess(theScintProcessAlpha); 491 pmanager->SetProcessOrderingToLast(theScintProcessAlpha,idxAtRest); 492 pmanager->SetProcessOrderingToLast(theScintProcessAlpha,idxPostStep); 493 theScintProcessAlphaNeverUsed = false; 494 } 495 else { 496 pmanager->AddProcess(theScintProcessDef); 497 pmanager->SetProcessOrderingToLast(theScintProcessDef,idxAtRest); 498 pmanager->SetProcessOrderingToLast(theScintProcessDef,idxPostStep); 499 theScintProcessDefNeverUsed = false; 500 } 501 } 502 503 if (particleName == "opticalphoton") { 504 pmanager->AddDiscreteProcess(theAbsorptionProcess); 505 theAbsorptionProcessNeverUsed = false; 506 // pmanager->AddDiscreteProcess(theRayleighScatteringProcess); 507 theBoundaryProcessNeverUsed = false; 508 pmanager->AddDiscreteProcess(theBoundaryProcess); 509 } 510 } 511 if ( theScintProcessDefNeverUsed ) delete theScintProcessDef; 512 if ( theScintProcessAlphaNeverUsed ) delete theScintProcessAlpha; 513 if ( theScintProcessNucNeverUsed ) delete theScintProcessNuc; 514 if ( theBoundaryProcessNeverUsed ) delete theBoundaryProcess; 515 if ( theAbsorptionProcessNeverUsed ) delete theAbsorptionProcess; 516 } 517 518 519 // Hadronic processes //////////////////////////////////////////////////////// 520 521 // Elastic processes: 522 #include "G4HadronElasticProcess.hh" 523 #include "G4NeutronCaptureProcess.hh" 524 #include "G4HadronElastic.hh" 525 #include "G4ChipsElasticModel.hh" 526 #include "G4ElasticHadrNucleusHE.hh" 527 #include "G4AntiNuclElastic.hh" 528 #include "G4BGGPionElasticXS.hh" 529 #include "G4CrossSectionDataSetRegistry.hh" 530 #include "G4ChipsProtonElasticXS.hh" 531 #include "G4ChipsNeutronElasticXS.hh" 532 #include "G4ComponentAntiNuclNuclearXS.hh" 533 #include "G4ChipsKaonMinusElasticXS.hh" 534 #include "G4ChipsKaonPlusElasticXS.hh" 535 #include "G4ChipsKaonZeroElasticXS.hh" 536 #include "G4BGGNucleonElasticXS.hh" 537 #include "G4CrossSectionElastic.hh" 538 539 // Inelastic processes: 540 #include "G4HadronInelasticProcess.hh" 541 542 // FTFP + BERT model 543 #include "G4TheoFSGenerator.hh" 544 #include "G4ExcitationHandler.hh" 545 #include "G4PreCompoundModel.hh" 546 #include "G4GeneratorPrecompoundInterface.hh" 547 #include "G4FTFModel.hh" 548 #include "G4LundStringFragmentation.hh" 549 #include "G4ExcitedStringDecay.hh" 550 #include "G4CascadeInterface.hh" 551 #include "G4CrossSectionInelastic.hh" 552 #include "G4BGGPionInelasticXS.hh" 553 #include "G4ChipsKaonMinusInelasticXS.hh" 554 #include "G4ChipsKaonPlusInelasticXS.hh" 555 #include "G4ChipsKaonZeroInelasticXS.hh" 556 #include "G4CrossSectionDataSetRegistry.hh" 557 #include "G4BGGNucleonInelasticXS.hh" 558 #include "G4ComponentAntiNuclNuclearXS.hh" 559 #include "G4ComponentGGNuclNuclXsc.hh" 560 561 // Neutron high-precision models: <20 MeV 562 #include "G4ParticleHPElastic.hh" 563 #include "G4ParticleHPElasticData.hh" 564 #include "G4ParticleHPCapture.hh" 565 #include "G4ParticleHPCaptureData.hh" 566 #include "G4ParticleHPInelastic.hh" 567 #include "G4ParticleHPInelasticData.hh" 568 #include "G4NeutronCaptureXS.hh" 569 #include "G4NeutronRadCapture.hh" 570 571 // Binary light ion cascade for alpha, deuteron and triton 572 #include "G4BinaryLightIonReaction.hh" 573 574 // ConstructHad() 575 // Makes discrete physics processes for the hadrons, at present limited 576 // to those particles with GHEISHA interactions (INTRC > 0). 577 // The processes are: Elastic scattering and Inelastic scattering. 578 // F.W.Jones 09-JUL-1998 579 void LBE::ConstructHad() 580 { 581 // Elastic scattering 582 G4HadronElastic* elastic_lhep0 = new G4HadronElastic(); 583 G4ChipsElasticModel* elastic_chip = new G4ChipsElasticModel(); 584 G4ElasticHadrNucleusHE* elastic_he = new G4ElasticHadrNucleusHE(); 585 586 const G4double elastic_elimitAntiNuc = 100.0*CLHEP::MeV; 587 G4AntiNuclElastic* elastic_anuc = new G4AntiNuclElastic(); 588 elastic_anuc->SetMinEnergy( elastic_elimitAntiNuc ); 589 G4CrossSectionElastic* elastic_anucxs = new G4CrossSectionElastic( elastic_anuc->GetComponentCrossSection() ); 590 G4HadronElastic* elastic_lhep2 = new G4HadronElastic(); 591 elastic_lhep2->SetMaxEnergy( elastic_elimitAntiNuc ); 592 593 // Inelastic scattering 594 const G4double theFTFMin0 = 0.0*CLHEP::GeV; 595 const G4double theFTFMin1 = 4.0*CLHEP::GeV; 596 const G4double theFTFMax = G4HadronicParameters::Instance()->GetMaxEnergy(); 597 const G4double theBERTMin0 = 0.0*CLHEP::GeV; 598 const G4double theBERTMin1 = 19.0*CLHEP::MeV; 599 const G4double theBERTMax = 5.0*CLHEP::GeV; 600 const G4double theHPMin = 0.0*CLHEP::GeV; 601 const G4double theHPMax = 20.0*CLHEP::MeV; 602 const G4double theIonBCMin = 0.0*CLHEP::GeV; 603 const G4double theIonBCMax = 5.0*CLHEP::GeV; 604 605 606 G4FTFModel * theStringModel = new G4FTFModel; 607 G4ExcitedStringDecay * theStringDecay = new G4ExcitedStringDecay( new G4LundStringFragmentation ); 608 theStringModel->SetFragmentationModel( theStringDecay ); 609 G4PreCompoundModel * thePreEquilib = new G4PreCompoundModel( new G4ExcitationHandler ); 610 G4GeneratorPrecompoundInterface * theCascade = new G4GeneratorPrecompoundInterface( thePreEquilib ); 611 612 G4TheoFSGenerator * theFTFModel0 = new G4TheoFSGenerator( "FTFP" ); 613 theFTFModel0->SetHighEnergyGenerator( theStringModel ); 614 theFTFModel0->SetTransport( theCascade ); 615 theFTFModel0->SetMinEnergy( theFTFMin0 ); 616 theFTFModel0->SetMaxEnergy( theFTFMax ); 617 618 G4TheoFSGenerator * theFTFModel1 = new G4TheoFSGenerator( "FTFP" ); 619 theFTFModel1->SetHighEnergyGenerator( theStringModel ); 620 theFTFModel1->SetTransport( theCascade ); 621 theFTFModel1->SetMinEnergy( theFTFMin1 ); 622 theFTFModel1->SetMaxEnergy( theFTFMax ); 623 624 G4CascadeInterface * theBERTModel0 = new G4CascadeInterface; 625 theBERTModel0->SetMinEnergy( theBERTMin0 ); 626 theBERTModel0->SetMaxEnergy( theBERTMax ); 627 628 G4CascadeInterface * theBERTModel1 = new G4CascadeInterface; 629 theBERTModel1->SetMinEnergy( theBERTMin1 ); 630 theBERTModel1->SetMaxEnergy( theBERTMax ); 631 632 // Binary Cascade 633 G4BinaryLightIonReaction * theIonBC = new G4BinaryLightIonReaction( thePreEquilib ); 634 theIonBC->SetMinEnergy( theIonBCMin ); 635 theIonBC->SetMaxEnergy( theIonBCMax ); 636 637 G4VCrossSectionDataSet * theAntiNucleonData = new G4CrossSectionInelastic( new G4ComponentAntiNuclNuclearXS ); 638 G4ComponentGGNuclNuclXsc * ggNuclNuclXsec = new G4ComponentGGNuclNuclXsc(); 639 G4VCrossSectionDataSet * theGGNuclNuclData = new G4CrossSectionInelastic(ggNuclNuclXsec); 640 641 auto myParticleIterator=G4ParticleTable::GetParticleTable()->GetIterator(); 642 myParticleIterator->reset(); 643 while ((*(myParticleIterator))()) 644 { 645 G4ParticleDefinition* particle = myParticleIterator->value(); 646 G4ProcessManager* pmanager = particle->GetProcessManager(); 647 G4String particleName = particle->GetParticleName(); 648 649 if (particleName == "pi+") 650 { 651 // Elastic scattering 652 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 653 theElasticProcess->AddDataSet( new G4BGGPionElasticXS( particle ) ); 654 theElasticProcess->RegisterMe( elastic_he ); 655 pmanager->AddDiscreteProcess( theElasticProcess ); 656 // Inelastic scattering 657 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4PionPlus::Definition() ); 658 theInelasticProcess->AddDataSet( new G4BGGPionInelasticXS( G4PionPlus::Definition() ) ); 659 theInelasticProcess->RegisterMe( theFTFModel1 ); 660 theInelasticProcess->RegisterMe( theBERTModel0 ); 661 pmanager->AddDiscreteProcess( theInelasticProcess ); 662 } 663 664 else if (particleName == "pi-") 665 { 666 // Elastic scattering 667 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 668 theElasticProcess->AddDataSet( new G4BGGPionElasticXS( particle ) ); 669 theElasticProcess->RegisterMe( elastic_he ); 670 pmanager->AddDiscreteProcess( theElasticProcess ); 671 // Inelastic scattering 672 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4PionMinus::Definition() ); 673 theInelasticProcess->AddDataSet( new G4BGGPionInelasticXS( G4PionMinus::Definition() ) ); 674 theInelasticProcess->RegisterMe( theFTFModel1 ); 675 theInelasticProcess->RegisterMe( theBERTModel0 ); 676 pmanager->AddDiscreteProcess( theInelasticProcess ); 677 } 678 679 else if (particleName == "kaon+") 680 { 681 // Elastic scattering 682 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 683 theElasticProcess->RegisterMe( elastic_lhep0 ); 684 theElasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonPlusElasticXS::Default_Name())); 685 pmanager->AddDiscreteProcess( theElasticProcess ); 686 // Inelastic scattering 687 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4KaonPlus::Definition() ); 688 689 theInelasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonPlusInelasticXS::Default_Name())); 690 theInelasticProcess->RegisterMe( theFTFModel1 ); 691 theInelasticProcess->RegisterMe( theBERTModel0 ); 692 pmanager->AddDiscreteProcess( theInelasticProcess ); 693 } 694 695 else if (particleName == "kaon0S") 696 { 697 // Elastic scattering 698 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 699 theElasticProcess->RegisterMe( elastic_lhep0 ); 700 theElasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonZeroElasticXS::Default_Name())); 701 pmanager->AddDiscreteProcess( theElasticProcess ); 702 // Inelastic scattering 703 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4KaonZeroShort::Definition() ); 704 theInelasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonZeroInelasticXS::Default_Name())); 705 theInelasticProcess->RegisterMe( theFTFModel1 ); 706 theInelasticProcess->RegisterMe( theBERTModel0 ); 707 pmanager->AddDiscreteProcess( theInelasticProcess ); 708 } 709 710 else if (particleName == "kaon0L") 711 { 712 // Elastic scattering 713 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 714 theElasticProcess->RegisterMe( elastic_lhep0 ); 715 theElasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonZeroElasticXS::Default_Name())); 716 pmanager->AddDiscreteProcess( theElasticProcess ); 717 // Inelastic scattering 718 //G4KaonZeroLInelasticProcess* theInelasticProcess = new G4KaonZeroLInelasticProcess("inelastic"); 719 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4KaonZeroLong::Definition() ); 720 theInelasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonZeroInelasticXS::Default_Name())); 721 theInelasticProcess->RegisterMe( theFTFModel1 ); 722 theInelasticProcess->RegisterMe( theBERTModel0 ); 723 pmanager->AddDiscreteProcess( theInelasticProcess ); 724 } 725 726 else if (particleName == "kaon-") 727 { 728 // Elastic scattering 729 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 730 theElasticProcess->RegisterMe( elastic_lhep0 ); 731 theElasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonMinusElasticXS::Default_Name())); 732 pmanager->AddDiscreteProcess( theElasticProcess ); 733 // Inelastic scattering 734 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4KaonMinus::Definition() ); 735 theInelasticProcess->AddDataSet( G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonMinusInelasticXS::Default_Name())); 736 theInelasticProcess->RegisterMe( theFTFModel1 ); 737 theInelasticProcess->RegisterMe( theBERTModel0 ); 738 pmanager->AddDiscreteProcess( theInelasticProcess ); 739 } 740 741 else if (particleName == "proton") 742 { 743 // Elastic scattering 744 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 745 theElasticProcess->AddDataSet(G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsProtonElasticXS::Default_Name())); 746 theElasticProcess->AddDataSet( new G4BGGNucleonElasticXS( G4Proton::Proton() ) ); 747 theElasticProcess->RegisterMe( elastic_chip ); 748 pmanager->AddDiscreteProcess( theElasticProcess ); 749 // Inelastic scattering 750 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4Proton::Definition() ); 751 theInelasticProcess->AddDataSet( new G4BGGNucleonInelasticXS( G4Proton::Proton() ) ); 752 theInelasticProcess->RegisterMe( theFTFModel1 ); 753 theInelasticProcess->RegisterMe( theBERTModel0 ); 754 pmanager->AddDiscreteProcess( theInelasticProcess ); 755 } 756 757 else if (particleName == "anti_proton") 758 { 759 // Elastic scattering 760 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 761 theElasticProcess->AddDataSet( elastic_anucxs ); 762 theElasticProcess->RegisterMe( elastic_lhep2 ); 763 theElasticProcess->RegisterMe( elastic_anuc ); 764 pmanager->AddDiscreteProcess( theElasticProcess ); 765 // Inelastic scattering 766 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4AntiProton::Definition() ); 767 theInelasticProcess->AddDataSet( theAntiNucleonData ); 768 theInelasticProcess->RegisterMe( theFTFModel0 ); 769 pmanager->AddDiscreteProcess( theInelasticProcess ); 770 } 771 772 else if (particleName == "neutron") { 773 // elastic scattering 774 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 775 theElasticProcess->AddDataSet(G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsNeutronElasticXS::Default_Name())); 776 G4HadronElastic* elastic_neutronChipsModel = new G4ChipsElasticModel(); 777 elastic_neutronChipsModel->SetMinEnergy( 19.0*CLHEP::MeV ); 778 theElasticProcess->RegisterMe( elastic_neutronChipsModel ); 779 G4ParticleHPElastic * theElasticNeutronHP = new G4ParticleHPElastic; 780 theElasticNeutronHP->SetMinEnergy( theHPMin ); 781 theElasticNeutronHP->SetMaxEnergy( theHPMax ); 782 theElasticProcess->RegisterMe( theElasticNeutronHP ); 783 theElasticProcess->AddDataSet( new G4ParticleHPElasticData ); 784 pmanager->AddDiscreteProcess( theElasticProcess ); 785 // inelastic scattering 786 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4Neutron::Definition() ); 787 theInelasticProcess->AddDataSet( new G4BGGNucleonInelasticXS( G4Neutron::Neutron() ) ); 788 theInelasticProcess->RegisterMe( theFTFModel1 ); 789 theInelasticProcess->RegisterMe( theBERTModel1 ); 790 G4ParticleHPInelastic * theNeutronInelasticHPModel = new G4ParticleHPInelastic; 791 theNeutronInelasticHPModel->SetMinEnergy( theHPMin ); 792 theNeutronInelasticHPModel->SetMaxEnergy( theHPMax ); 793 theInelasticProcess->RegisterMe( theNeutronInelasticHPModel ); 794 theInelasticProcess->AddDataSet( new G4ParticleHPInelasticData ); 795 pmanager->AddDiscreteProcess(theInelasticProcess); 796 // capture 797 G4NeutronCaptureProcess* theCaptureProcess = new G4NeutronCaptureProcess; 798 G4ParticleHPCapture * theNeutronCaptureHPModel = new G4ParticleHPCapture; 799 theNeutronCaptureHPModel->SetMinEnergy( theHPMin ); 800 theNeutronCaptureHPModel->SetMaxEnergy( theHPMax ); 801 G4NeutronRadCapture* theNeutronRadCapture = new G4NeutronRadCapture(); 802 theNeutronRadCapture->SetMinEnergy(theHPMax*0.99); 803 theCaptureProcess->RegisterMe( theNeutronCaptureHPModel ); 804 theCaptureProcess->RegisterMe( theNeutronRadCapture); 805 theCaptureProcess->AddDataSet( new G4ParticleHPCaptureData ); 806 theCaptureProcess->AddDataSet((G4NeutronCaptureXS*)G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4NeutronCaptureXS::Default_Name())); 807 pmanager->AddDiscreteProcess(theCaptureProcess); 808 } 809 else if (particleName == "anti_neutron") 810 { 811 // Elastic scattering 812 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 813 theElasticProcess->AddDataSet( elastic_anucxs ); 814 theElasticProcess->RegisterMe( elastic_lhep2 ); 815 theElasticProcess->RegisterMe( elastic_anuc ); 816 pmanager->AddDiscreteProcess( theElasticProcess ); 817 // Inelastic scattering 818 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4AntiNeutron::Definition() ); 819 theInelasticProcess->AddDataSet( theAntiNucleonData ); 820 theInelasticProcess->RegisterMe( theFTFModel0 ); 821 pmanager->AddDiscreteProcess( theInelasticProcess ); 822 } 823 824 else if (particleName == "deuteron") 825 { 826 // Elastic scattering 827 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 828 theElasticProcess->RegisterMe( elastic_lhep0 ); 829 theElasticProcess->AddDataSet( theGGNuclNuclData ); 830 pmanager->AddDiscreteProcess( theElasticProcess ); 831 // Inelastic scattering 832 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4Deuteron::Definition() ); 833 theInelasticProcess->AddDataSet( theGGNuclNuclData ); 834 theInelasticProcess->RegisterMe( theFTFModel1 ); 835 theInelasticProcess->RegisterMe( theIonBC ); 836 pmanager->AddDiscreteProcess( theInelasticProcess ); 837 } 838 839 else if (particleName == "triton") 840 { 841 // Elastic scattering 842 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 843 theElasticProcess->RegisterMe( elastic_lhep0 ); 844 theElasticProcess->AddDataSet( theGGNuclNuclData ); 845 pmanager->AddDiscreteProcess( theElasticProcess ); 846 // Inelastic scattering 847 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4Triton::Definition() ); 848 theInelasticProcess->AddDataSet( theGGNuclNuclData ); 849 theInelasticProcess->RegisterMe( theFTFModel1 ); 850 theInelasticProcess->RegisterMe( theIonBC ); 851 pmanager->AddDiscreteProcess( theInelasticProcess ); 852 } 853 854 else if (particleName == "alpha") 855 { 856 // Elastic scattering 857 G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; 858 theElasticProcess->RegisterMe( elastic_lhep0 ); 859 theElasticProcess->AddDataSet( theGGNuclNuclData ); 860 pmanager->AddDiscreteProcess( theElasticProcess ); 861 // Inelastic scattering 862 G4HadronInelasticProcess* theInelasticProcess = new G4HadronInelasticProcess( "inelastic", G4Alpha::Definition() ); 863 theInelasticProcess->AddDataSet( theGGNuclNuclData ); 864 theInelasticProcess->RegisterMe( theFTFModel1 ); 865 theInelasticProcess->RegisterMe( theIonBC ); 866 pmanager->AddDiscreteProcess( theInelasticProcess ); 867 } 868 } // while ((*(myParticleIterator))()) 869 870 // Add stopping processes with builder 871 stoppingPhysics->ConstructProcess(); 872 } 873 874 875 // Decays /////////////////////////////////////////////////////////////////// 876 #include "G4Decay.hh" 877 #include "G4RadioactiveDecay.hh" 878 #include "G4IonTable.hh" 879 #include "G4Ions.hh" 880 881 #include "G4LossTableManager.hh" 882 #include "G4UAtomicDeexcitation.hh" 883 #include "G4NuclearLevelData.hh" 884 #include "G4NuclideTable.hh" 885 886 void LBE::ConstructGeneral() { 887 888 // Add Decay Process 889 G4Decay* theDecayProcess = new G4Decay(); 890 G4bool theDecayProcessNeverUsed = true; //Check if theDecayProcess will be used 891 auto myParticleIterator=G4ParticleTable::GetParticleTable()->GetIterator(); 892 myParticleIterator->reset(); 893 while( (*(myParticleIterator))() ) 894 { 895 G4ParticleDefinition* particle = myParticleIterator->value(); 896 G4ProcessManager* pmanager = particle->GetProcessManager(); 897 898 if (theDecayProcess->IsApplicable(*particle) && !particle->IsShortLived()) 899 { 900 theDecayProcessNeverUsed = false; 901 pmanager ->AddProcess(theDecayProcess); 902 // set ordering for PostStepDoIt and AtRestDoIt 903 pmanager ->SetProcessOrdering(theDecayProcess, idxPostStep); 904 pmanager ->SetProcessOrdering(theDecayProcess, idxAtRest); 905 } 906 } 907 908 // Declare radioactive decay to the GenericIon in the IonTable. 909 const G4IonTable *theIonTable = 910 G4ParticleTable::GetParticleTable()->GetIonTable(); 911 G4RadioactiveDecay* theRadioactiveDecay = new G4RadioactiveDecay(); 912 913 //Fix for activation of RadioactiveDecay, based on G4RadioactiveDecayPhysics 914 G4EmParameters* param = G4EmParameters::Instance(); 915 param->SetAugerCascade(true); 916 param->AddPhysics("world","G4RadioactiveDecay"); 917 918 G4DeexPrecoParameters* deex = G4NuclearLevelData::GetInstance()->GetParameters(); 919 deex->SetStoreAllLevels(true); 920 deex->SetMaxLifeTime(G4NuclideTable::GetInstance()->GetThresholdOfHalfLife() 921 /std::log(2.)); 922 923 G4LossTableManager* man = G4LossTableManager::Instance(); 924 G4VAtomDeexcitation* ad = man->AtomDeexcitation(); 925 if(!ad) { 926 ad = new G4UAtomicDeexcitation(); 927 man->SetAtomDeexcitation(ad); 928 ad->InitialiseAtomicDeexcitation(); 929 } 930 931 for (G4int i=0; i<theIonTable->Entries(); i++) 932 { 933 G4String particleName = theIonTable->GetParticle(i)->GetParticleName(); 934 G4String particleType = theIonTable->GetParticle(i)->GetParticleType(); 935 936 if (particleName == "GenericIon") 937 { 938 G4ProcessManager* pmanager = 939 theIonTable->GetParticle(i)->GetProcessManager(); 940 pmanager->SetVerboseLevel(VerboseLevel); 941 pmanager ->AddProcess(theRadioactiveDecay); 942 pmanager ->SetProcessOrdering(theRadioactiveDecay, idxPostStep); 943 pmanager ->SetProcessOrdering(theRadioactiveDecay, idxAtRest); 944 } 945 } 946 //If we actually never used the process, delete it 947 //From Coverity report 948 if ( theDecayProcessNeverUsed ) delete theDecayProcess; 949 } 950 951 // Cuts ///////////////////////////////////////////////////////////////////// 952 void LBE::SetCuts() 953 { 954 955 if (verboseLevel >1) 956 G4cout << "LBE::SetCuts:"; 957 958 if (verboseLevel>0){ 959 G4cout << "LBE::SetCuts:"; 960 G4cout << "CutLength : " 961 << G4BestUnit(defaultCutValue,"Length") << G4endl; 962 } 963 964 //special for low energy physics 965 G4double lowlimit=250*CLHEP::eV; 966 G4ProductionCutsTable * aPCTable = G4ProductionCutsTable::GetProductionCutsTable(); 967 aPCTable->SetEnergyRange(lowlimit,100*CLHEP::GeV); 968 969 // set cut values for gamma at first and for e- second and next for e+, 970 // because some processes for e+/e- need cut values for gamma 971 SetCutValue(cutForGamma, "gamma"); 972 SetCutValue(cutForElectron, "e-"); 973 SetCutValue(cutForPositron, "e+"); 974 975 // SetCutValue(cutForProton, "proton"); 976 // SetCutValue(cutForProton, "anti_proton"); 977 // SetCutValue(cutForAlpha, "alpha"); 978 // SetCutValue(cutForGenericIon, "GenericIon"); 979 980 // SetCutValueForOthers(defaultCutValue); 981 982 if (verboseLevel>0) DumpCutValuesTable(); 983 } 984 985