00001 // $Header: /cvs/lcd/slic/src/RunManager.cc,v 1.17 2010/01/08 23:18:56 jeremy Exp $ 00002 #include "RunManager.hh" 00003 00004 // lcdd 00005 #include "LCDDParser.hh" 00006 #include "LCDDProcessor.hh" 00007 00008 // slic 00009 #include "EventAction.hh" 00010 #include "EventSourceManager.hh" 00011 #include "ModuleRegistry.hh" 00012 #include "PhysicsListManager.hh" 00013 #include "PrimaryGeneratorAction.hh" 00014 #include "RunAction.hh" 00015 #include "SteppingAction.hh" 00016 #include "TrackingAction.hh" 00017 00018 // geant4 00019 #include "G4StateManager.hh" 00020 #include "G4UImanager.hh" 00021 00022 namespace slic 00023 { 00024 00025 RunManager::RunManager() : 00026 Module("RunManager", false), 00027 m_userActionsInitialized(false) 00028 {} 00029 00030 RunManager::~RunManager() 00031 {} 00032 00033 void RunManager::initializeUserActions() 00034 { 00035 SetUserAction(new PrimaryGeneratorAction); 00036 SetUserAction(new RunAction); 00037 SetUserAction(new EventAction); 00038 SetUserAction(new TrackingAction); 00039 SetUserAction(new SteppingAction); 00040 m_userActionsInitialized = true; 00041 } 00042 00043 void RunManager::Initialize() 00044 { 00045 // This makes sure that physics initialization occurs before other user actions. 00046 G4RunManager::Initialize(); 00047 00048 // Initialize user actions here to avoid ordering problems. 00049 if (!m_userActionsInitialized) 00050 initializeUserActions(); 00051 00052 // Initialize the event generation manager. 00053 EventSourceManager::instance(); 00054 00055 // Setup the default event source. 00056 EventSourceManager::instance()->setupEventSource(); 00057 00058 // Print list of registered modules. 00059 #ifdef SLIC_LOG 00060 ModuleRegistry::instance()->print(); 00061 #endif 00062 } 00063 00064 void RunManager::InitializePhysics() 00065 { 00066 // Initialize the physics list. 00067 PhysicsListManager::instance()->initializePhysicsList(); 00068 00069 // Call the G4RunManager's intitialization method. 00070 G4RunManager::InitializePhysics(); 00071 00072 // Check if the LCDD subsystem got some limits. 00073 LCDDProcessor* lcdd = LCDDProcessor::instance(); 00074 PhysicsListManager* pmgr = PhysicsListManager::instance(); 00075 if ( lcdd->getLimitSetsBegin() != lcdd->getLimitSetsEnd() ) 00076 { 00077 pmgr->enableLimits(true); 00078 } 00079 00080 // Enable physics limits, if necessary. 00081 if ( pmgr->enableLimits() ) 00082 { 00083 pmgr->setupUserLimitsProcesses(); 00084 } 00085 } 00086 00087 void RunManager::InitializeGeometry() 00088 { 00089 if ( !LCDDParser::instance()->isValidSetup() ) 00090 { 00091 G4Exception("FATAL ERROR: Current LCDD geometry setup is not valid."); 00092 } 00093 00094 G4RunManager::InitializeGeometry(); 00095 } 00096 00097 void RunManager::BeamOn(G4int n_event, const char* macroFile, G4int n_select) 00098 { 00099 // Attempt to initialize Geant4 if not in idle state. 00100 if ( G4StateManager::GetStateManager()->GetCurrentState() != G4State_Idle ) 00101 { 00102 this->Initialize(); 00103 } 00104 00105 m_numberOfEventsToRun = n_event; 00106 00107 G4RunManager::BeamOn(n_event, macroFile, n_select); 00108 } 00109 00110 int RunManager::getNumberOfEventsToRun() 00111 { 00112 return m_numberOfEventsToRun; 00113 } 00114 }
1.5.4