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 // CaTS (Calorimetry and Tracking Simulation) 28 // CaTS (Calorimetry and Tracking Simulation) 29 // 29 // 30 // Authors : Hans Wenzel 30 // Authors : Hans Wenzel 31 // Soon Yung Jun 31 // Soon Yung Jun 32 // (Fermi National Accelerator Labo 32 // (Fermi National Accelerator Laboratory) 33 // 33 // 34 // History 34 // History 35 // October 18th, 2021 : first implementation 35 // October 18th, 2021 : first implementation 36 // 36 // 37 // ******************************************* 37 // ******************************************************************** 38 // 38 // 39 /// \file PhysicsConfigurator.cc 39 /// \file PhysicsConfigurator.cc 40 /// \brief Implementation of the CaTS::Physics 40 /// \brief Implementation of the CaTS::PhysicsConfigurator class 41 41 42 // Geant4 headers 42 // Geant4 headers 43 #include "G4String.hh" 43 #include "G4String.hh" 44 #include "G4VModularPhysicsList.hh" 44 #include "G4VModularPhysicsList.hh" 45 #include "G4PhysListFactoryAlt.hh" 45 #include "G4PhysListFactoryAlt.hh" 46 #include "G4PhysicsConstructorRegistry.hh" 46 #include "G4PhysicsConstructorRegistry.hh" 47 #include "G4PhysListRegistry.hh" 47 #include "G4PhysListRegistry.hh" 48 #include "G4OpticalParameters.hh" 48 #include "G4OpticalParameters.hh" 49 #include "G4NeutronTrackingCut.hh" 49 #include "G4NeutronTrackingCut.hh" 50 #include "G4StepLimiter.hh" 50 #include "G4StepLimiter.hh" 51 #include "G4StepLimiterPhysics.hh" 51 #include "G4StepLimiterPhysics.hh" 52 #include "G4SystemOfUnits.hh" 52 #include "G4SystemOfUnits.hh" 53 // project Headers 53 // project Headers 54 #include "PhysicsConfigurator.hh" 54 #include "PhysicsConfigurator.hh" 55 #include "ConfigurationManager.hh" 55 #include "ConfigurationManager.hh" 56 // c++ headers 56 // c++ headers 57 #include <stdlib.h> 57 #include <stdlib.h> 58 PhysicsConfigurator* PhysicsConfigurator::inst 58 PhysicsConfigurator* PhysicsConfigurator::instance = 0; 59 59 60 G4VModularPhysicsList* PhysicsConfigurator::Co 60 G4VModularPhysicsList* PhysicsConfigurator::Construct(G4String physName) 61 { 61 { 62 // 62 // 63 // Access to registries and factories 63 // Access to registries and factories 64 // 64 // 65 G4PhysicsConstructorRegistry* g4pcr = 65 G4PhysicsConstructorRegistry* g4pcr = 66 G4PhysicsConstructorRegistry::Instance(); 66 G4PhysicsConstructorRegistry::Instance(); 67 G4PhysListRegistry* g4plr = G4PhysListRegist 67 G4PhysListRegistry* g4plr = G4PhysListRegistry::Instance(); 68 G4bool verbose = ConfigurationManager::getIn 68 G4bool verbose = ConfigurationManager::getInstance()->isEnable_verbose(); 69 if(verbose) 69 if(verbose) 70 { 70 { 71 G4cout << "Available Physics Constructors: 71 G4cout << "Available Physics Constructors: " 72 << g4pcr->AvailablePhysicsConstruct 72 << g4pcr->AvailablePhysicsConstructors().size() << G4endl; 73 G4cout << "Available Physics Lists: 73 G4cout << "Available Physics Lists: " 74 << g4plr->AvailablePhysLists().size 74 << g4plr->AvailablePhysLists().size() << G4endl; 75 G4cout << "Available Physics Extensions: 75 G4cout << "Available Physics Extensions: " 76 << g4plr->AvailablePhysicsExtension 76 << g4plr->AvailablePhysicsExtensions().size() << G4endl; 77 G4cout << "Available Physics Lists Em: 77 G4cout << "Available Physics Lists Em: " 78 << g4plr->AvailablePhysListsEM().si 78 << g4plr->AvailablePhysListsEM().size() << G4endl; 79 g4plr->SetVerbose(1); 79 g4plr->SetVerbose(1); 80 } 80 } 81 else 81 else 82 { 82 { 83 g4plr->SetVerbose(0); 83 g4plr->SetVerbose(0); 84 } 84 } 85 g4plr->AddPhysicsExtension("OPTICAL", "G4Opt 85 g4plr->AddPhysicsExtension("OPTICAL", "G4OpticalPhysics"); 86 g4plr->AddPhysicsExtension("STEPLIMIT", "G4S 86 g4plr->AddPhysicsExtension("STEPLIMIT", "G4StepLimiterPhysics"); 87 g4plr->AddPhysicsExtension("NEUTRONLIMIT", " 87 g4plr->AddPhysicsExtension("NEUTRONLIMIT", "G4NeutronTrackingCut"); 88 if(verbose) 88 if(verbose) 89 { 89 { 90 g4pcr->PrintAvailablePhysicsConstructors() 90 g4pcr->PrintAvailablePhysicsConstructors(); 91 g4plr->PrintAvailablePhysLists(); 91 g4plr->PrintAvailablePhysLists(); 92 } 92 } 93 g4alt::G4PhysListFactory factory; 93 g4alt::G4PhysListFactory factory; 94 G4VModularPhysicsList* phys = nullptr; 94 G4VModularPhysicsList* phys = nullptr; 95 if(verbose) 95 if(verbose) 96 G4cout << "Physics configuration: " << phy 96 G4cout << "Physics configuration: " << physName << G4endl; 97 // 97 // 98 // currently using the Constructor names doe 98 // currently using the Constructor names doesn't work otherwise it would be: 99 // G4String physName = "FTFP_BERT+G4OpticalP 99 // G4String physName = "FTFP_BERT+G4OpticalPhysics+G4StepLimiterPhysics"; 100 // using the name doesn't work either 100 // using the name doesn't work either 101 // G4String physName = "FTFP_BERT+Optical+st 101 // G4String physName = "FTFP_BERT+Optical+stepLimiter"; 102 // reference PhysicsList via its name 102 // reference PhysicsList via its name 103 // 103 // 104 if(factory.IsReferencePhysList(physName)) 104 if(factory.IsReferencePhysList(physName)) 105 { 105 { 106 phys = factory.GetReferencePhysList(physNa 106 phys = factory.GetReferencePhysList(physName); 107 } 107 } 108 else 108 else 109 { 109 { 110 G4cout << "Not a reference physics list" < 110 G4cout << "Not a reference physics list" << G4endl; 111 g4plr->PrintAvailablePhysLists(); 111 g4plr->PrintAvailablePhysLists(); 112 exit(EXIT_FAILURE); 112 exit(EXIT_FAILURE); 113 } 113 } 114 if(verbose) 114 if(verbose) 115 { 115 { 116 G4cout << phys->GetPhysicsTableDirectory() 116 G4cout << phys->GetPhysicsTableDirectory() << G4endl; 117 } 117 } 118 G4OpticalParameters::Instance()->SetProcessA 118 G4OpticalParameters::Instance()->SetProcessActivation("Cerenkov", true); 119 G4OpticalParameters::Instance()->SetProcessA 119 G4OpticalParameters::Instance()->SetProcessActivation("Scintillation", true); 120 G4OpticalParameters::Instance()->SetProcessA 120 G4OpticalParameters::Instance()->SetProcessActivation("OpAbsorption", true); 121 G4OpticalParameters::Instance()->SetProcessA 121 G4OpticalParameters::Instance()->SetProcessActivation("OpRayleigh", true); 122 G4OpticalParameters::Instance()->SetProcessA 122 G4OpticalParameters::Instance()->SetProcessActivation("OpMieHG", false); 123 G4OpticalParameters::Instance()->SetProcessA 123 G4OpticalParameters::Instance()->SetProcessActivation("OpWLS", true); 124 G4OpticalParameters::Instance()->SetProcessA 124 G4OpticalParameters::Instance()->SetProcessActivation("OpWLS2", false); 125 125 126 G4OpticalParameters::Instance()->SetCerenkov 126 G4OpticalParameters::Instance()->SetCerenkovStackPhotons(false); 127 G4OpticalParameters::Instance()->SetScintSta 127 G4OpticalParameters::Instance()->SetScintStackPhotons(false); 128 G4OpticalParameters::Instance()->SetScintTra 128 G4OpticalParameters::Instance()->SetScintTrackSecondariesFirst( 129 true); // only relevant if we actually st 129 true); // only relevant if we actually stack and trace the optical photons 130 G4OpticalParameters::Instance()->SetCerenkov 130 G4OpticalParameters::Instance()->SetCerenkovTrackSecondariesFirst( 131 true); // only relevant if we actually st 131 true); // only relevant if we actually stack and trace the optical photons 132 G4OpticalParameters::Instance()->SetCerenkov 132 G4OpticalParameters::Instance()->SetCerenkovMaxPhotonsPerStep(100); 133 G4OpticalParameters::Instance()->SetCerenkov 133 G4OpticalParameters::Instance()->SetCerenkovMaxBetaChange(10.0); 134 if(verbose) 134 if(verbose) 135 { 135 { 136 phys->DumpList(); 136 phys->DumpList(); 137 } 137 } 138 return phys; 138 return phys; 139 } 139 } 140 140 141 PhysicsConfigurator* PhysicsConfigurator::getI 141 PhysicsConfigurator* PhysicsConfigurator::getInstance() 142 { 142 { 143 if(instance == 0) 143 if(instance == 0) 144 instance = new PhysicsConfigurator(); 144 instance = new PhysicsConfigurator(); 145 return instance; 145 return instance; 146 } 146 } 147 147