diff --git a/include/PhysicsListManager.hh b/include/PhysicsListManager.hh index edfc9bf5f6abede65c022c68522d9ddc8665652f..f6fdd55bd9015f7573d1e12b2a3abe3e12b35fbb 100644 --- a/include/PhysicsListManager.hh +++ b/include/PhysicsListManager.hh @@ -5,19 +5,18 @@ #include "Module.hh" // slic -//#include "PhysicsListFactory.hh" #include "PhysicsMessenger.hh" #include "Singleton.hh" // geant4 #include "G4VUserPhysicsList.hh" -#include "G4RunManager.hh" #include "G4Decay.hh" // std #include <string> class G4PhysListFactory; +class G4VUserPhysicsList; namespace slic { @@ -45,8 +44,10 @@ public: /** * Initialize the currently selected physics list. + * This will also register option physics such as optical + * and extended particle set. */ - void initializePhysicsList(); + G4VUserPhysicsList* createPhysicsList(); /** * Set the name of the current physics list. @@ -115,24 +116,15 @@ public: private: - /** - * Setup optical physics. - */ - void setupOpticalProcesses(); - /** * Setup SUSY physics. */ void setupSUSY(); - /** - * Setup extended particle set from HepPDT. - */ - void setupExtended(); - private: G4VUserPhysicsList* m_currentList; + bool m_isInitialized; bool m_isFromDefault; bool m_enableLimits; diff --git a/include/RunManager.hh b/include/RunManager.hh index 33e963616234ee7646290316678ac3ce09e70fe7..30441c80f9c4f49c57a6398729b2c2779dcbe33c 100644 --- a/include/RunManager.hh +++ b/include/RunManager.hh @@ -103,14 +103,6 @@ protected: private: - /** - * Initialize the user actions defined by this application. - */ - void initializeUserActions(); - -private: - - bool m_userActionsInitialized; int m_numberOfEventsToRun; bool m_abortRun; }; diff --git a/src/LCSUSYPhysics.cc b/src/LCSUSYPhysics.cc index 433856142fce5784c3e6fb1277435cb18738c6a8..a1d408c05ed965c970db7a24ff3c2e67f7e1800f 100644 --- a/src/LCSUSYPhysics.cc +++ b/src/LCSUSYPhysics.cc @@ -24,7 +24,8 @@ LCSUSYPhysics::~LCSUSYPhysics() { #endif void LCSUSYPhysics::ConstructParticle() { - // Get the particle data table to be imported. + + // Get the particle data table to be imported. HepPDT::ParticleDataTable* pdtbl = HepPDTManager::instance()->getParticleDataTable(); // Loop over all particles. diff --git a/src/PhysicsListManager.cc b/src/PhysicsListManager.cc index fefd530de9da7e878f1a5c630c8e8a8543ae1cc7..b61df18a623bfee736098e424732a9a99fb2043e 100644 --- a/src/PhysicsListManager.cc +++ b/src/PhysicsListManager.cc @@ -2,7 +2,7 @@ // geant4 #include "G4RunManager.hh" -#include "G4VModularPhysicsList.hh" +#include "G4VUserPhysicsList.hh" #include "G4UserSpecialCuts.hh" #include "G4StepLimiter.hh" #include "G4PhysListFactory.hh" @@ -13,121 +13,81 @@ #include "LCExtendedParticles.hh" namespace slic { + // QGSP_BERT is the default physics list. const std::string PhysicsListManager::m_defaultListName = std::string("QGSP_BERT"); PhysicsListManager::PhysicsListManager() : - Module("PhysicsListManager"), m_currentList(0), m_isInitialized(false), m_isFromDefault(false), m_enableLimits( - false), m_setupLimits(false), m_enableOptical(false) { - // Set the current list to the default. - m_currentListName = m_defaultListName; + Module("PhysicsListManager"), m_currentList(0), m_isInitialized(false), m_isFromDefault(false), m_enableLimits( + false), m_setupLimits(false), m_enableOptical(false) { + // Set the current list to the default. + m_currentListName = m_defaultListName; - // Create the messenger class for the manager. - m_messenger = new PhysicsMessenger(); + // Create the messenger class for the manager. + m_messenger = new PhysicsMessenger(); - // Create the list factory. - m_factory = new G4PhysListFactory(); + // Create the list factory. + m_factory = new G4PhysListFactory(); } PhysicsListManager::~PhysicsListManager() { } void PhysicsListManager::setCurrentListName(const std::string& n) { - m_currentListName = n; - m_isFromDefault = false; + m_currentListName = n; + m_isFromDefault = false; } -void PhysicsListManager::initializePhysicsList() { - if (!m_isInitialized) { -#ifdef SLIC_LOG - if ( m_isFromDefault ) - { - log() << LOG::okay << "Using default physics list <" << m_defaultListName << ">." << LOG::done; - } -#endif - - // Create the physics list from the name argument. - m_currentList = m_factory->GetReferencePhysList(m_currentListName); - - // Enable optical processes. - if (enableOptical()) { - setupOpticalProcesses(); - } - - // Support for extended set of particles from PDT. - setupExtended(); +G4VUserPhysicsList* PhysicsListManager::createPhysicsList() { - // Register the physics list with the run manager. - G4RunManager::GetRunManager()->SetUserInitialization(m_currentList); - - // Print out particle table. - //G4cout << "Dumping Geant4 particle table ..." << G4endl; - //G4ParticleTable::GetParticleTable()->DumpTable(); - - m_isInitialized = true; - } #ifdef SLIC_LOG - // Don't allow initialization to be called more than once. - else - { - log().error("Ignoring additional call to PhysicsListManager::initializePhysics() !!!"); - } + if ( m_isFromDefault ) { + log() << LOG::okay << "Using default physics list <" << m_defaultListName << ">." << LOG::done; + } #endif -} - -void PhysicsListManager::setupUserLimitsProcesses() { - G4ParticleTable* ptbl = G4ParticleTable::GetParticleTable(); - G4ParticleTable::G4PTblDicIterator* piter = ptbl->GetIterator(); + // Create the physics list from the name argument. + m_currentList = m_factory->GetReferencePhysList(m_currentListName); - G4UserSpecialCuts* cuts = new G4UserSpecialCuts("UserSpecialCuts"); - G4StepLimiter* slim = new G4StepLimiter("StepLimiter"); + // Enable optical processes. + if (enableOptical()) { + dynamic_cast<G4VModularPhysicsList*>(m_currentList)->RegisterPhysics(new LCOpticalPhysics("optical")); + } - piter->reset(); - while ((*piter)()) { - G4ParticleDefinition* pdef = piter->value(); - G4ProcessManager* pmgr = pdef->GetProcessManager(); + if (HepPDTManager::instance()->getParticleDataTable()) { + dynamic_cast<G4VModularPhysicsList*>(m_currentList)->RegisterPhysics(new LCExtendedParticles()); + } - // Add user limit processes for steps and special cuts. - if (pmgr) { - pmgr->AddProcess(slim, -1, -1, 3); - - pmgr->AddProcess(cuts, -1, -1, 4); - } else { - G4Exception("", "", FatalException, "G4ProcessManager is null."); - } - } -} - -void PhysicsListManager::setupOpticalProcesses() { -#ifdef SLIC_LOG - log() << LOG::always << "Enabling optical physics processes for the current physics list." << LOG::done; -#endif - G4VModularPhysicsList* l = dynamic_cast<G4VModularPhysicsList*>(m_currentList); - l->RegisterPhysics(new LCOpticalPhysics("optical")); + return m_currentList; } -void PhysicsListManager::setupExtended() { -#ifdef SLIC_LOG - log().always("Enabling extended PDT particles for the current physics list."); -#endif +void PhysicsListManager::setupUserLimitsProcesses() { - G4VModularPhysicsList* l = dynamic_cast<G4VModularPhysicsList*>(m_currentList); - if (HepPDTManager::instance()->getParticleDataTable()) { - l->RegisterPhysics(new LCExtendedParticles()); - } -#ifdef SLIC_LOG - else - { - log() << LOG::error << "HepPDTManager could not load particle data, so extended particles will not be enabled!" << LOG::done; - } -#endif + G4ParticleTable* ptbl = G4ParticleTable::GetParticleTable(); + G4ParticleTable::G4PTblDicIterator* piter = ptbl->GetIterator(); + G4UserSpecialCuts* cuts = new G4UserSpecialCuts("UserSpecialCuts"); + G4StepLimiter* slim = new G4StepLimiter("StepLimiter"); + + piter->reset(); + while ((*piter)()) { + G4ParticleDefinition* pdef = piter->value(); + G4ProcessManager* pmgr = pdef->GetProcessManager(); + + // Add user limit processes for steps and special cuts. + if (pmgr) { + pmgr->AddProcess(slim, -1, -1, 3); + + pmgr->AddProcess(cuts, -1, -1, 4); + } else { + G4Exception("", "", FatalException, "G4ProcessManager is null."); + } + } } void PhysicsListManager::printAvailablePhysicsLists() { - const std::vector<G4String>& lists = m_factory->AvailablePhysLists(); - for (std::vector<G4String>::const_iterator it = lists.begin(); it != lists.end(); it++) { - log().always(*it); - } + const std::vector<G4String>& lists = m_factory->AvailablePhysLists(); + for (std::vector<G4String>::const_iterator it = lists.begin(); it != lists.end(); it++) { + log().always(*it); + } } } diff --git a/src/RunManager.cc b/src/RunManager.cc index f203499c0e18d2f9ace4c33c815ae83be64aa6e9..61f0c4d006102dbd7542b541b228f6a4ec6bc0b8 100644 --- a/src/RunManager.cc +++ b/src/RunManager.cc @@ -22,29 +22,27 @@ namespace slic { RunManager::RunManager() : - Module("RunManager", false), m_userActionsInitialized(false), m_abortRun(false) { + Module("RunManager", false),m_abortRun(false) { } RunManager::~RunManager() { } -void RunManager::initializeUserActions() { - SetUserAction(new PrimaryGeneratorAction()); - SetUserAction(new RunAction()); - SetUserAction(new EventAction()); - SetUserAction(new TrackingAction()); - SetUserAction(new SteppingAction()); - SetUserAction(new StackingAction()); - m_userActionsInitialized = true; -} - void RunManager::Initialize() { + + // Init physics list. + G4VUserPhysicsList* list = PhysicsListManager::instance()->createPhysicsList(); + G4RunManager::GetRunManager()->SetUserInitialization(list); + // This makes sure that physics initialization occurs before other user actions. G4RunManager::Initialize(); - // Initialize user actions here to avoid ordering problems. - if (!m_userActionsInitialized) - initializeUserActions(); + SetUserAction(new PrimaryGeneratorAction()); + SetUserAction(new RunAction()); + SetUserAction(new EventAction()); + SetUserAction(new TrackingAction()); + SetUserAction(new SteppingAction()); + SetUserAction(new StackingAction()); // Initialize the event generation manager. EventSourceManager::instance(); @@ -59,23 +57,26 @@ void RunManager::Initialize() { } void RunManager::InitializePhysics() { - // Initialize the physics list. - PhysicsListManager::instance()->initializePhysicsList(); - - // Call the G4RunManager's intitialization method. - G4RunManager::InitializePhysics(); // Check if the LCDD subsystem got some limits. LCDDProcessor* lcdd = LCDDProcessor::instance(); PhysicsListManager* pmgr = PhysicsListManager::instance(); if (lcdd->getLimitSetsBegin() != lcdd->getLimitSetsEnd()) { + std::cout << "enabling phys limits" << std::endl; pmgr->enableLimits(true); } // Enable physics limits, if necessary. if (pmgr->enableLimits()) { + std::cout << "setting up user limits processes" << std::endl; pmgr->setupUserLimitsProcesses(); } + + // Call the G4RunManager's intitialization method. + G4RunManager::InitializePhysics(); + + // Print out particle table. + //G4ParticleTable::GetParticleTable()->DumpTable(); } void RunManager::InitializeGeometry() { diff --git a/src/SlicApplication.cc b/src/SlicApplication.cc index b80ccc89f5722248c634864c3729c155fc7baba0..a9743855febcd7c1aed1ef673d114a8f2371a041 100644 --- a/src/SlicApplication.cc +++ b/src/SlicApplication.cc @@ -91,9 +91,6 @@ void SlicApplication::initialize() { // Create a new RunManager. m_runManager = new RunManager(); - // Initialize the physics list manager. - PhysicsListManager::instance(); - // Initialize the LcioManager. LcioManager::instance(); @@ -113,9 +110,6 @@ void SlicApplication::initialize() { #ifdef G4VIS_USE initializeVis(); #endif - - HepPDTManager::instance(); - // Set state variable. m_isInitialized = true; } else {