1#include "SimCore/SimulatorBase.h"
13 "/persistency/gdml/read"
16SimulatorBase::SimulatorBase(
const std::string& name,
18 :
framework::Producer(name, process), conditions_intf_(this) {
19 ui_manager_ = G4UImanager::GetUIpointer();
23 PrimaryGenerator::Factory::get().apply(
24 [&event](
auto gen) { gen->prepEvent(event); });
28 run_manager_->GetCurrentEvent()->GetUserInformation());
30 eventHeader.
setWeight(event_info->getWeight());
32 event_info->getPNEnergy());
34 event_info->getENEnergy());
36 event_info->getDarkBremMaterialZ());
38 event_info->getAPrimeConversionMaterialZ());
42 event_info->getPNResampleCount());
44void SimulatorBase::onProcessEnd() {
45 run_manager_->TerminateEventLoop();
46 run_manager_->RunTermination();
58 run_manager_.reset(
nullptr);
63 session_handle_.reset(
nullptr);
65void SimulatorBase::onProcessStart() {
67 run_manager_->Initialize();
69 for (
const std::string& cmd : post_init_commands_) {
70 int g4_ret = ui_manager_->ApplyCommand(cmd);
72 EXCEPTION_RAISE(
"PostInitCmd",
73 "Post Initialization command '" + cmd +
74 "' returned a failue status from Geant4: " +
75 std::to_string(g4_ret));
80 run_manager_->ConstructScoringWorlds();
83 run_manager_->RunInitialization();
86 run_manager_->InitializeEventLoop(1);
90void SimulatorBase::verifyParameters()
const {
95 if (parameters_.exists(
"runNumber")) {
96 EXCEPTION_RAISE(
"InvalidParam",
97 "Remove old-style of setting the simulation run number "
99 " Replace with using the Process object (p.run).");
104 for (
const auto& invalid_command : INVALID_COMMANDS) {
105 for (
const auto& cmd : pre_init_commands_) {
106 if (cmd.find(invalid_command) != std::string::npos) {
107 EXCEPTION_RAISE(
"PreInitCmd",
"Pre Initialization command '" + cmd +
108 "' is not allowed because another "
109 "part of Simulator handles it.");
112 for (
const auto& cmd : post_init_commands_) {
113 if (cmd.find(invalid_command) != std::string::npos) {
114 EXCEPTION_RAISE(
"PostInitCmd",
"Post Initialization command '" + cmd +
115 "' is not allowed because another "
116 "part of Simulator handles it.");
124 parameters_ = parameters;
127 parameters_.
get<std::vector<std::string>>(
"pre_init_commands", {});
130 post_init_commands_ =
131 parameters_.get<std::vector<std::string>>(
"post_init_commands", {});
137 "MultipleSimulators",
138 "A simulator or resimulator producer has already been created. Only "
139 "one of them can be present in a given run. To run the resimulator, "
140 "use a an existing eventFile as input.");
145 run_manager_ = std::make_unique<RunManager>(parameters_, conditions_intf_);
148 G4CascadeParameters::Instance();
151 for (
const std::string& cmd : pre_init_commands_) {
152 int g4_ret = ui_manager_->ApplyCommand(cmd);
154 EXCEPTION_RAISE(
"PreInitCmd",
155 "Pre Initialization command '" + cmd +
156 "' returned a failure status from Geant4: " +
157 std::to_string(g4_ret));
161void SimulatorBase::createLogging() {
162 auto logging_prefix = parameters_.get<std::string>(
"logging_prefix");
163 session_handle_ = std::make_unique<LoggedSession>(logging_prefix);
165 if (session_handle_ !=
nullptr)
166 ui_manager_->SetCoutDestination(session_handle_.get());
170 TrackMap& tracks{g4user::TrackingAction::get()->getTrackMap()};
171 tracks.traceAncestry();
172 event.add(
"SimParticles", tracks.getParticleMap());
176 SensitiveDetector::Factory::get().apply([&event](
auto sd) {
178 sd->onFinishedEvent();
184 auto pn_tracker = PhotonuclearTracker::get();
186 auto pn_interactions = pn_tracker->getInteractions();
187 if (!pn_interactions.empty()) {
188 event.add(
"PhotonuclearInteractions", pn_interactions);
193void SimulatorBase::buildGeometry() {
196 auto parser{simcore::geo::Parser::Factory::get().make(
"gdml", parameters_,
201 "Unable to find a parser registered under the name 'gdml'.");
203 auto parser_ptr{parser.value()};
207 run_manager_->SetUserInitialization(
208 new DetectorConstruction(parser_ptr, parameters_, conditions_intf_));
211 auto detector_path{parameters_.get<std::string>(
"detector")};
212 ldmx_log(trace) <<
"Reading in geometry from '" << detector_path <<
"'";
213 G4GeometryManager::GetInstance()->OpenGeometry();
215 run_manager_->DefineWorldVolume(parser_ptr->getWorldVolume());
UserAction for tracking detailed photonuclear interaction information.
Header file for PrimaryGenerator.
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 ...