1#include "SimCore/SimulatorBase.h"
12 "/persistency/gdml/read"
15SimulatorBase::SimulatorBase(
const std::string& name,
17 :
framework::Producer(name, process), conditions_intf_(this) {
18 ui_manager_ = G4UImanager::GetUIpointer();
21 auto event_info =
static_cast<UserEventInformation*
>(
22 run_manager_->GetCurrentEvent()->GetUserInformation());
24 eventHeader.
setWeight(event_info->getWeight());
26 event_info->getPNEnergy());
28 event_info->getENEnergy());
30 event_info->getDarkBremMaterialZ());
32 event_info->getAPrimeConversionMaterialZ());
36 event_info->getPNResampleCount());
38void SimulatorBase::onProcessEnd() {
39 run_manager_->TerminateEventLoop();
40 run_manager_->RunTermination();
52 run_manager_.reset(
nullptr);
57 session_handle_.reset(
nullptr);
59void SimulatorBase::onProcessStart() {
61 run_manager_->Initialize();
63 for (
const std::string& cmd : post_init_commands_) {
64 int g4_ret = ui_manager_->ApplyCommand(cmd);
66 EXCEPTION_RAISE(
"PostInitCmd",
67 "Post Initialization command '" + cmd +
68 "' returned a failue status from Geant4: " +
69 std::to_string(g4_ret));
74 run_manager_->ConstructScoringWorlds();
77 run_manager_->RunInitialization();
80 run_manager_->InitializeEventLoop(1);
84void SimulatorBase::verifyParameters()
const {
89 if (parameters_.exists(
"runNumber")) {
90 EXCEPTION_RAISE(
"InvalidParam",
91 "Remove old-style of setting the simulation run number "
93 " Replace with using the Process object (p.run).");
98 for (
const auto& invalid_command : INVALID_COMMANDS) {
99 for (
const auto& cmd : pre_init_commands_) {
100 if (cmd.find(invalid_command) != std::string::npos) {
101 EXCEPTION_RAISE(
"PreInitCmd",
"Pre Initialization command '" + cmd +
102 "' is not allowed because another "
103 "part of Simulator handles it.");
106 for (
const auto& cmd : post_init_commands_) {
107 if (cmd.find(invalid_command) != std::string::npos) {
108 EXCEPTION_RAISE(
"PostInitCmd",
"Post Initialization command '" + cmd +
109 "' is not allowed because another "
110 "part of Simulator handles it.");
118 parameters_ = parameters;
121 parameters_.
get<std::vector<std::string>>(
"pre_init_commands", {});
124 post_init_commands_ =
125 parameters_.get<std::vector<std::string>>(
"post_init_commands", {});
131 "MultipleSimulators",
132 "A simulator or resimulator producer has already been created. Only "
133 "one of them can be present in a given run. To run the resimulator, "
134 "use a an existing eventFile as input.");
139 run_manager_ = std::make_unique<RunManager>(parameters_, conditions_intf_);
142 G4CascadeParameters::Instance();
145 for (
const std::string& cmd : pre_init_commands_) {
146 int g4_ret = ui_manager_->ApplyCommand(cmd);
148 EXCEPTION_RAISE(
"PreInitCmd",
149 "Pre Initialization command '" + cmd +
150 "' returned a failure status from Geant4: " +
151 std::to_string(g4_ret));
155void SimulatorBase::createLogging() {
156 auto logging_prefix = parameters_.get<std::string>(
"logging_prefix");
157 session_handle_ = std::make_unique<LoggedSession>(logging_prefix);
159 if (session_handle_ !=
nullptr)
160 ui_manager_->SetCoutDestination(session_handle_.get());
164 TrackMap& tracks{g4user::TrackingAction::get()->getTrackMap()};
165 tracks.traceAncestry();
166 event.add(
"SimParticles", tracks.getParticleMap());
170 SensitiveDetector::Factory::get().apply([&event](
auto sd) {
172 sd->onFinishedEvent();
178 auto pn_tracker = PhotonuclearTracker::get();
180 auto pn_interactions = pn_tracker->getInteractions();
181 if (!pn_interactions.empty()) {
182 event.add(
"PhotonuclearInteractions", pn_interactions);
187void SimulatorBase::buildGeometry() {
190 auto parser{simcore::geo::Parser::Factory::get().make(
"gdml", parameters_,
195 "Unable to find a parser registered under the name 'gdml'.");
197 auto parser_ptr{parser.value()};
201 run_manager_->SetUserInitialization(
202 new DetectorConstruction(parser_ptr, parameters_, conditions_intf_));
205 auto detector_path{parameters_.get<std::string>(
"detector")};
206 ldmx_log(trace) <<
"Reading in geometry from '" << detector_path <<
"'";
207 G4GeometryManager::GetInstance()->OpenGeometry();
209 run_manager_->DefineWorldVolume(parser_ptr->getWorldVolume());
UserAction for tracking detailed photonuclear interaction information.
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 ...