1#include "SimCore/SimulatorBase.h"
10 "/persistency/gdml/read"
13SimulatorBase::SimulatorBase(
const std::string& name,
15 :
framework::Producer(name, process), conditions_intf_(this) {
16 ui_manager_ = G4UImanager::GetUIpointer();
19 auto event_info =
static_cast<UserEventInformation*
>(
20 run_manager_->GetCurrentEvent()->GetUserInformation());
22 eventHeader.
setWeight(event_info->getWeight());
24 event_info->getPNEnergy());
26 event_info->getENEnergy());
28 event_info->getDarkBremMaterialZ());
30void SimulatorBase::onProcessEnd() {
31 run_manager_->TerminateEventLoop();
32 run_manager_->RunTermination();
44 run_manager_.reset(
nullptr);
49 session_handle_.reset(
nullptr);
51void SimulatorBase::onProcessStart() {
53 run_manager_->Initialize();
55 for (
const std::string& cmd : post_init_commands_) {
56 int g4_ret = ui_manager_->ApplyCommand(cmd);
58 EXCEPTION_RAISE(
"PostInitCmd",
59 "Post Initialization command '" + cmd +
60 "' returned a failue status from Geant4: " +
61 std::to_string(g4_ret));
66 run_manager_->ConstructScoringWorlds();
69 run_manager_->RunInitialization();
72 run_manager_->InitializeEventLoop(1);
76void SimulatorBase::verifyParameters()
const {
81 if (parameters_.exists(
"runNumber")) {
82 EXCEPTION_RAISE(
"InvalidParam",
83 "Remove old-style of setting the simulation run number "
85 " Replace with using the Process object (p.run).");
90 for (
const auto& invalid_command : INVALID_COMMANDS) {
91 for (
const auto& cmd : pre_init_commands_) {
92 if (cmd.find(invalid_command) != std::string::npos) {
93 EXCEPTION_RAISE(
"PreInitCmd",
"Pre Initialization command '" + cmd +
94 "' is not allowed because another "
95 "part of Simulator handles it.");
98 for (
const auto& cmd : post_init_commands_) {
99 if (cmd.find(invalid_command) != std::string::npos) {
100 EXCEPTION_RAISE(
"PostInitCmd",
"Post Initialization command '" + cmd +
101 "' is not allowed because another "
102 "part of Simulator handles it.");
110 parameters_ = parameters;
113 parameters_.
get<std::vector<std::string>>(
"preInitCommands", {});
116 post_init_commands_ =
117 parameters_.get<std::vector<std::string>>(
"postInitCommands", {});
123 "MultipleSimulators",
124 "A simulator or resimulator producer has already been created. Only "
125 "one of them can be present in a given run. To run the resimulator, "
126 "use a an existing eventFile as input.");
131 run_manager_ = std::make_unique<RunManager>(parameters_, conditions_intf_);
134 G4CascadeParameters::Instance();
137 for (
const std::string& cmd : pre_init_commands_) {
138 int g4_ret = ui_manager_->ApplyCommand(cmd);
140 EXCEPTION_RAISE(
"PreInitCmd",
141 "Pre Initialization command '" + cmd +
142 "' returned a failure status from Geant4: " +
143 std::to_string(g4_ret));
147void SimulatorBase::createLogging() {
148 auto logging_prefix = parameters_.get<std::string>(
"logging_prefix");
149 session_handle_ = std::make_unique<LoggedSession>(logging_prefix);
151 if (session_handle_ !=
nullptr)
152 ui_manager_->SetCoutDestination(session_handle_.get());
156 TrackMap& tracks{g4user::TrackingAction::get()->getTrackMap()};
157 tracks.traceAncestry();
158 event.add(
"SimParticles", tracks.getParticleMap());
162 SensitiveDetector::Factory::get().apply([&event](
auto sd) {
164 sd->onFinishedEvent();
168void SimulatorBase::buildGeometry() {
171 auto parser{simcore::geo::Parser::Factory::get().make(
"gdml", parameters_,
176 "Unable to find a parser registered under the name 'gdml'.");
178 auto parser_ptr{parser.value()};
182 run_manager_->SetUserInitialization(
183 new DetectorConstruction(parser_ptr, parameters_, conditions_intf_));
186 auto detector_path{parameters_.get<std::string>(
"detector")};
187 ldmx_log(trace) <<
"Reading in geometry from '" << detector_path <<
"'";
188 G4GeometryManager::GetInstance()->OpenGeometry();
190 run_manager_->DefineWorldVolume(parser_ptr->getWorldVolume());
Implements an event buffer system for storing event data.
Class which represents the process under execution.
Class encapsulating parameters for configuring a processor.
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
static const std::vector< std::string > INVALID_COMMANDS
Commands not allowed to be passed from python config file This is because Simulator already runs them...
All classes in the ldmx-sw project use this namespace.
Dynamically loadable photonuclear models either from SimCore or external libraries implementing this ...