LDMX Software
simcore::RunManager Class Reference

Extension of Geant4 run manager. More...

#include <RunManager.h>

Public Member Functions

 RunManager (framework::config::Parameters &parameters, ConditionsInterface &)
 Class constructor.
 
virtual ~RunManager ()=default
 Class destructor.
 
void setupPhysics ()
 Initialize physics.
 
void Initialize ()
 Perform application initialization.
 
void TerminateOneEvent ()
 Called at the end of each event.
 
DetectorConstructiongetDetectorConstruction ()
 Get the user detector construction cast to a specific type.
 
void setUseRootSeed (bool useIt=true)
 Tell RunManager to use the seed from the root file.
 
bool useRootSeed ()
 Should we use the seed from the root file?
 

Private Attributes

framework::config::Parameters parameters_
 The set of parameters used to configure the RunManager.
 
G4PhysListFactory physics_list_factory_
 Factory class for instantiating the physics list.
 
bool is_pw_enabled_ {false}
 Flag indicating whether a parallel world should be registered.
 
std::string parallel_world_path_ {""}
 Path to GDML description of parallel world.
 
bool use_root_seed_ {false}
 Should we use random seed from root file?
 

Detailed Description

Extension of Geant4 run manager.

Definition at line 42 of file RunManager.h.

Constructor & Destructor Documentation

◆ RunManager()

simcore::RunManager::RunManager ( framework::config::Parameters & parameters,
ConditionsInterface &  )

Class constructor.

Definition at line 38 of file RunManager.cxx.

39 {
40 parameters_ = parameters;
41
42 // Set whether the ROOT primary generator should use the persisted seed.
43 auto root_primary_gen_use_seed{
44 parameters.get<bool>("root_primary_gen_use_seed")};
45
46 // Validate the geometry if specified.
47 setUseRootSeed(root_primary_gen_use_seed);
48}
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:78
framework::config::Parameters parameters_
The set of parameters used to configure the RunManager.
Definition RunManager.h:91
void setUseRootSeed(bool useIt=true)
Tell RunManager to use the seed from the root file.
Definition RunManager.h:82

References framework::config::Parameters::get(), parameters_, and setUseRootSeed().

Member Function Documentation

◆ getDetectorConstruction()

DetectorConstruction * simcore::RunManager::getDetectorConstruction ( )

Get the user detector construction cast to a specific type.

Returns
The user detector construction.

Definition at line 202 of file RunManager.cxx.

202 {
203 return static_cast<DetectorConstruction*>(this->userDetector);
204}

Referenced by Initialize().

◆ Initialize()

void simcore::RunManager::Initialize ( )

Perform application initialization.

Definition at line 109 of file RunManager.cxx.

109 {
110 setupPhysics();
111
112 // The parallel world needs to be registered before the mass world is
113 // constructed i.e. before G4RunManager::Initialize() is called.
114 if (is_pw_enabled_) {
115 ldmx_log(debug) << "Parallel worlds have been enabled";
116
117 auto validate_geometry{parameters_.get<bool>("validate_detector")};
118 G4GDMLParser* pw_parser = new G4GDMLParser();
119 pw_parser->Read(parallel_world_path_, validate_geometry);
120 this->getDetectorConstruction()->RegisterParallelWorld(
121 new ParallelWorld(pw_parser, "ldmxParallelWorld"));
122 }
123
124 // This is where the physics lists are told to construct their particles and
125 // their processes
126 // They are constructed in order, so it is important to register the biasing
127 // physics *after* any other processes that need to be able to be biased
128 G4RunManager::Initialize();
129
130 // create our G4User actions
131 auto primary_action{new PrimaryGeneratorAction(parameters_)};
132 auto run_action{new g4user::RunAction};
133 auto event_action{new g4user::EventAction};
134 auto tracking_action{new g4user::TrackingAction};
135 auto stepping_action{new g4user::SteppingAction};
136 auto stacking_action{new g4user::StackingAction};
137 // ...and register them with G4
138 SetUserAction(primary_action);
139 SetUserAction(run_action);
140 SetUserAction(event_action);
141 SetUserAction(tracking_action);
142 SetUserAction(stepping_action);
143 SetUserAction(stacking_action);
144
145 // Create all user actions and attch them to the corresponding G4 actions
146 auto user_actions{parameters_.get<std::vector<framework::config::Parameters>>(
147 "actions", {})};
148 for (auto& user_action : user_actions) {
149 auto ua = UserAction::Factory::get().make(
150 user_action.get<std::string>("class_name"),
151 user_action.get<std::string>("instance_name"), user_action);
152 if (not ua) {
153 EXCEPTION_RAISE(
154 "UnableToCreate",
155 "Unable to create a UserAction of type " +
156 user_action.get<std::string>("class_name") +
157 ". Did you inherit from simcore::UserAction? "
158 "Do you have DECLARE_ACTION in your implementation (.cxx) file? "
159 "Did you include the fully-specified class name in your python "
160 "configuration class? "
161 "Did you specify the correct library in the python configuration "
162 "class?");
163 }
164 for (auto& type : ua.value()->getTypes()) {
165 if (type == simcore::TYPE::RUN) {
166 run_action->registerAction(ua.value());
167 } else if (type == simcore::TYPE::EVENT) {
168 event_action->registerAction(ua.value());
169 } else if (type == simcore::TYPE::TRACKING) {
170 tracking_action->registerAction(ua.value());
171 } else if (type == simcore::TYPE::STEPPING) {
172 stepping_action->registerAction(ua.value());
173 } else if (type == simcore::TYPE::STACKING) {
174 stacking_action->registerAction(ua.value());
175 } else {
176 EXCEPTION_RAISE("ActionType", "Action type does not exist.");
177 }
178 }
179 }
180}
std::string parallel_world_path_
Path to GDML description of parallel world.
Definition RunManager.h:105
void setupPhysics()
Initialize physics.
bool is_pw_enabled_
Flag indicating whether a parallel world should be registered.
Definition RunManager.h:102
DetectorConstruction * getDetectorConstruction()
Get the user detector construction cast to a specific type.

References framework::config::Parameters::get(), getDetectorConstruction(), is_pw_enabled_, parallel_world_path_, parameters_, and setupPhysics().

◆ setupPhysics()

void simcore::RunManager::setupPhysics ( )

Initialize physics.

Definition at line 50 of file RunManager.cxx.

50 {
51 auto p_list{physics_list_factory_.GetReferencePhysList("FTFP_BERT")};
52 p_list->SetVerboseLevel(0);
53
54 parallel_world_path_ = parameters_.get<std::string>("scoring_planes");
56 if (is_pw_enabled_) {
57 ldmx_log(debug) << "Parallel worlds physics list has been registered";
58 p_list->RegisterPhysics(new G4ParallelWorldPhysics("ldmxParallelWorld"));
59 }
60
61 p_list->RegisterPhysics(new GammaPhysics{"GammaPhysics", parameters_});
62 p_list->RegisterPhysics(new APrimePhysics(
64 p_list->RegisterPhysics(new KaonPhysics(
65 "KaonPhysics",
66 parameters_.get<framework::config::Parameters>("kaon_parameters")));
67 p_list->RegisterPhysics(new FCPPhysics(
68 "FCPPhysics",
70
71 auto biasing_operators{
72 parameters_.get<std::vector<framework::config::Parameters>>(
73 "biasing_operators", {})};
74 if (!biasing_operators.empty()) {
75 ldmx_log(info) << " Biasing enabled with " << biasing_operators.size()
76 << " operator(s)";
77
78 // create all the biasing operators that will be used
79 for (framework::config::Parameters& bop : biasing_operators) {
80 if (not simcore::XsecBiasingOperator::Factory::get().make(
81 bop.get<std::string>("class_name"),
82 bop.get<std::string>("instance_name"), bop)) {
83 EXCEPTION_RAISE("UnableToCreate",
84 "Unable to create a XsecBiasingOperator of type " +
85 bop.get<std::string>("class_name"));
86 }
87 }
88
89 // Instantiate the constructor used when biasing
90 G4GenericBiasingPhysics* biasing_physics = new G4GenericBiasingPhysics();
91
92 // specify which particles are going to be biased
93 // this will put a biasing interface wrapper around *all* processes
94 // associated with these particles
95 simcore::XsecBiasingOperator::Factory::get().apply(
96 [this, biasing_physics](auto bop) {
97 ldmx_log(info) << "Biasing operator '" << bop->GetName()
98 << "' set to bias " << bop->getParticleToBias();
99 biasing_physics->Bias(bop->getParticleToBias());
100 });
101
102 // Register the physics constructor to the physics list:
103 p_list->RegisterPhysics(biasing_physics);
104 }
105
106 this->SetUserInitialization(p_list);
107}
Class encapsulating parameters for configuring a processor.
Definition Parameters.h:29
G4PhysListFactory physics_list_factory_
Factory class for instantiating the physics list.
Definition RunManager.h:96

References framework::config::Parameters::get(), is_pw_enabled_, parallel_world_path_, parameters_, and physics_list_factory_.

Referenced by Initialize().

◆ setUseRootSeed()

void simcore::RunManager::setUseRootSeed ( bool useIt = true)
inline

Tell RunManager to use the seed from the root file.

Definition at line 82 of file RunManager.h.

82{ use_root_seed_ = useIt; }
bool use_root_seed_
Should we use random seed from root file?
Definition RunManager.h:110

References use_root_seed_.

Referenced by RunManager().

◆ TerminateOneEvent()

void simcore::RunManager::TerminateOneEvent ( )

Called at the end of each event.

Runs parent process G4RunManager::TerminateOneEvent() and resets the activation for the G4DarkBremsstrahlung process (if dark brem is possible)

Definition at line 182 of file RunManager.cxx.

182 {
183 // have geant4 do its own thing
184 G4RunManager::TerminateOneEvent();
185
186 // go through the processes attached to the electron and
187 // reactivate any process that contains the G4DarkBremmstrahlung name
188 // this covers both cases where the process is biased and not
189 static auto reactivate_dark_brem = [](G4ProcessManager* pman) {
190 for (int i_proc{0}; i_proc < pman->GetProcessList()->size(); i_proc++) {
191 G4VProcess* p{(*(pman->GetProcessList()))[i_proc]};
192 if (p->GetProcessName().contains(G4DarkBremsstrahlung::PROCESS_NAME)) {
193 pman->SetProcessActivation(p, true);
194 break;
195 }
196 }
197 };
198
199 reactivate_dark_brem(G4Electron::Definition()->GetProcessManager());
200}

◆ useRootSeed()

bool simcore::RunManager::useRootSeed ( )
inline

Should we use the seed from the root file?

Definition at line 87 of file RunManager.h.

87{ return use_root_seed_; }

References use_root_seed_.

Member Data Documentation

◆ is_pw_enabled_

bool simcore::RunManager::is_pw_enabled_ {false}
private

Flag indicating whether a parallel world should be registered.

Definition at line 102 of file RunManager.h.

102{false};

Referenced by Initialize(), and setupPhysics().

◆ parallel_world_path_

std::string simcore::RunManager::parallel_world_path_ {""}
private

Path to GDML description of parallel world.

Definition at line 105 of file RunManager.h.

105{""};

Referenced by Initialize(), and setupPhysics().

◆ parameters_

framework::config::Parameters simcore::RunManager::parameters_
private

The set of parameters used to configure the RunManager.

Definition at line 91 of file RunManager.h.

Referenced by Initialize(), RunManager(), and setupPhysics().

◆ physics_list_factory_

G4PhysListFactory simcore::RunManager::physics_list_factory_
private

Factory class for instantiating the physics list.

Definition at line 96 of file RunManager.h.

Referenced by setupPhysics().

◆ use_root_seed_

bool simcore::RunManager::use_root_seed_ {false}
private

Should we use random seed from root file?

Definition at line 110 of file RunManager.h.

110{false};

Referenced by setUseRootSeed(), and useRootSeed().


The documentation for this class was generated from the following files: