1#include "SimCore/SimulatorBase.h"
3#include <G4CascadeParameters.hh>
4#include <G4GeometryManager.hh>
6#include "SimCore/DetectorConstruction.h"
9#include "SimCore/G4User/UserEventInformation.h"
11#include "SimCore/Geo/Parser.h"
12#include "SimCore/SDs/SensitiveDetector.h"
21 "/persistency/gdml/read"
24SimulatorBase::SimulatorBase(
const std::string& name,
26 :
framework::Producer(name, process), conditions_intf_(this) {
27 ui_manager_ = G4UImanager::GetUIpointer();
31 PrimaryGenerator::Factory::get().apply(
32 [&event](
auto gen) { gen->prepEvent(event); });
36 run_manager_->GetCurrentEvent()->GetUserInformation());
38 eventHeader.
setWeight(event_info->getWeight());
40 event_info->getPNEnergy());
42 event_info->getENEnergy());
44 event_info->getDarkBremMaterialZ());
46 event_info->getAPrimeConversionMaterialZ());
50 event_info->getPNResampleCount());
52void SimulatorBase::onProcessEnd() {
53 run_manager_->TerminateEventLoop();
54 run_manager_->RunTermination();
66 run_manager_.reset(
nullptr);
71 session_handle_.reset(
nullptr);
73void SimulatorBase::onProcessStart() {
75 run_manager_->Initialize();
77 for (
const std::string& cmd : post_init_commands_) {
78 int g4_ret = ui_manager_->ApplyCommand(cmd);
80 EXCEPTION_RAISE(
"PostInitCmd",
81 "Post Initialization command '" + cmd +
82 "' returned a failue status from Geant4: " +
83 std::to_string(g4_ret));
88 run_manager_->ConstructScoringWorlds();
91 run_manager_->RunInitialization();
94 run_manager_->InitializeEventLoop(1);
98void SimulatorBase::verifyParameters()
const {
103 if (parameters_.exists(
"runNumber")) {
104 EXCEPTION_RAISE(
"InvalidParam",
105 "Remove old-style of setting the simulation run number "
107 " Replace with using the Process object (p.run).");
112 for (
const auto& invalid_command : INVALID_COMMANDS) {
113 for (
const auto& cmd : pre_init_commands_) {
114 if (cmd.find(invalid_command) != std::string::npos) {
115 EXCEPTION_RAISE(
"PreInitCmd",
"Pre Initialization command '" + cmd +
116 "' is not allowed because another "
117 "part of Simulator handles it.");
120 for (
const auto& cmd : post_init_commands_) {
121 if (cmd.find(invalid_command) != std::string::npos) {
122 EXCEPTION_RAISE(
"PostInitCmd",
"Post Initialization command '" + cmd +
123 "' is not allowed because another "
124 "part of Simulator handles it.");
132 parameters_ = parameters;
135 parameters_.
get<std::vector<std::string>>(
"pre_init_commands", {});
138 post_init_commands_ =
139 parameters_.get<std::vector<std::string>>(
"post_init_commands", {});
145 "MultipleSimulators",
146 "A simulator or resimulator producer has already been created. Only "
147 "one of them can be present in a given run. To run the resimulator, "
148 "use a an existing eventFile as input.");
153 run_manager_ = std::make_unique<RunManager>(parameters_, conditions_intf_);
156 G4CascadeParameters::Instance();
159 for (
const std::string& cmd : pre_init_commands_) {
160 int g4_ret = ui_manager_->ApplyCommand(cmd);
162 EXCEPTION_RAISE(
"PreInitCmd",
163 "Pre Initialization command '" + cmd +
164 "' returned a failure status from Geant4: " +
165 std::to_string(g4_ret));
169void SimulatorBase::createLogging() {
170 auto logging_prefix = parameters_.get<std::string>(
"logging_prefix");
171 session_handle_ = std::make_unique<LoggedSession>(logging_prefix);
173 if (session_handle_ !=
nullptr)
174 ui_manager_->SetCoutDestination(session_handle_.get());
178 TrackMap& tracks{g4user::TrackingAction::get()->getTrackMap()};
179 tracks.traceAncestry();
180 event.add(
"SimParticles", tracks.getParticleMap());
184 SensitiveDetector::Factory::get().apply([&event](
auto sd) {
186 sd->onFinishedEvent();
192 auto pn_tracker = PhotonuclearTracker::get();
194 auto pn_interactions = pn_tracker->getInteractions();
195 if (!pn_interactions.empty()) {
196 event.add(
"PhotonuclearInteractions", pn_interactions);
201void SimulatorBase::buildGeometry() {
204 auto parser{simcore::geo::Parser::Factory::get().make(
"gdml", parameters_,
209 "Unable to find a parser registered under the name 'gdml'.");
211 auto parser_ptr{parser.value()};
215 run_manager_->SetUserInitialization(
216 new DetectorConstruction(parser_ptr, parameters_, conditions_intf_));
219 auto detector_path{parameters_.get<std::string>(
"detector")};
220 ldmx_log(trace) <<
"Reading in geometry from '" << detector_path <<
"'";
221 G4GeometryManager::GetInstance()->OpenGeometry();
223 run_manager_->DefineWorldVolume(parser_ptr->getWorldVolume());
UserAction for tracking detailed photonuclear interaction information.
Header file for PrimaryGenerator.
Class which implements the user tracking action.
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 ...