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());
30 event_info->getAPrimeConversionMaterialZ());
32void SimulatorBase::onProcessEnd() {
33 run_manager_->TerminateEventLoop();
34 run_manager_->RunTermination();
46 run_manager_.reset(
nullptr);
51 session_handle_.reset(
nullptr);
53void SimulatorBase::onProcessStart() {
55 run_manager_->Initialize();
57 for (
const std::string& cmd : post_init_commands_) {
58 int g4_ret = ui_manager_->ApplyCommand(cmd);
60 EXCEPTION_RAISE(
"PostInitCmd",
61 "Post Initialization command '" + cmd +
62 "' returned a failue status from Geant4: " +
63 std::to_string(g4_ret));
68 run_manager_->ConstructScoringWorlds();
71 run_manager_->RunInitialization();
74 run_manager_->InitializeEventLoop(1);
78void SimulatorBase::verifyParameters()
const {
83 if (parameters_.exists(
"runNumber")) {
84 EXCEPTION_RAISE(
"InvalidParam",
85 "Remove old-style of setting the simulation run number "
87 " Replace with using the Process object (p.run).");
92 for (
const auto& invalid_command : INVALID_COMMANDS) {
93 for (
const auto& cmd : pre_init_commands_) {
94 if (cmd.find(invalid_command) != std::string::npos) {
95 EXCEPTION_RAISE(
"PreInitCmd",
"Pre Initialization command '" + cmd +
96 "' is not allowed because another "
97 "part of Simulator handles it.");
100 for (
const auto& cmd : post_init_commands_) {
101 if (cmd.find(invalid_command) != std::string::npos) {
102 EXCEPTION_RAISE(
"PostInitCmd",
"Post Initialization command '" + cmd +
103 "' is not allowed because another "
104 "part of Simulator handles it.");
112 parameters_ = parameters;
115 parameters_.
get<std::vector<std::string>>(
"pre_init_commands", {});
118 post_init_commands_ =
119 parameters_.get<std::vector<std::string>>(
"post_init_commands", {});
125 "MultipleSimulators",
126 "A simulator or resimulator producer has already been created. Only "
127 "one of them can be present in a given run. To run the resimulator, "
128 "use a an existing eventFile as input.");
133 run_manager_ = std::make_unique<RunManager>(parameters_, conditions_intf_);
136 G4CascadeParameters::Instance();
139 for (
const std::string& cmd : pre_init_commands_) {
140 int g4_ret = ui_manager_->ApplyCommand(cmd);
142 EXCEPTION_RAISE(
"PreInitCmd",
143 "Pre Initialization command '" + cmd +
144 "' returned a failure status from Geant4: " +
145 std::to_string(g4_ret));
149void SimulatorBase::createLogging() {
150 auto logging_prefix = parameters_.get<std::string>(
"logging_prefix");
151 session_handle_ = std::make_unique<LoggedSession>(logging_prefix);
153 if (session_handle_ !=
nullptr)
154 ui_manager_->SetCoutDestination(session_handle_.get());
158 TrackMap& tracks{g4user::TrackingAction::get()->getTrackMap()};
159 tracks.traceAncestry();
160 event.add(
"SimParticles", tracks.getParticleMap());
164 SensitiveDetector::Factory::get().apply([&event](
auto sd) {
166 sd->onFinishedEvent();
170void SimulatorBase::buildGeometry() {
173 auto parser{simcore::geo::Parser::Factory::get().make(
"gdml", parameters_,
178 "Unable to find a parser registered under the name 'gdml'.");
180 auto parser_ptr{parser.value()};
184 run_manager_->SetUserInitialization(
185 new DetectorConstruction(parser_ptr, parameters_, conditions_intf_));
188 auto detector_path{parameters_.get<std::string>(
"detector")};
189 ldmx_log(trace) <<
"Reading in geometry from '" << detector_path <<
"'";
190 G4GeometryManager::GetInstance()->OpenGeometry();
192 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 ...