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 37 of file RunManager.cxx.

38 {
39 parameters_ = parameters;
40
41 // Set whether the ROOT primary generator should use the persisted seed.
42 auto root_primary_gen_use_seed{parameters.get<bool>("rootPrimaryGenUseSeed")};
43
44 // Validate the geometry if specified.
45 setUseRootSeed(root_primary_gen_use_seed);
46}
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 198 of file RunManager.cxx.

198 {
199 return static_cast<DetectorConstruction*>(this->userDetector);
200}

Referenced by Initialize().

◆ Initialize()

void simcore::RunManager::Initialize ( )

Perform application initialization.

Definition at line 104 of file RunManager.cxx.

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

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

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

◆ 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: