12#include "G4DarkBreM/G4DarkBremsstrahlung.h"
14#include "SimCore/DetectorConstruction.h"
17#include "SimCore/G4User/RunAction.h"
18#include "SimCore/G4User/StackingAction.h"
19#include "SimCore/G4User/SteppingAction.h"
22#include "SimCore/ParallelWorld.h"
23#include "SimCore/XsecBiasingOperator.h"
28#include "FTFP_BERT.hh"
29#include "G4GDMLParser.hh"
30#include "G4GenericBiasingPhysics.hh"
31#include "G4ParallelWorldPhysics.hh"
32#include "G4ProcessTable.hh"
33#include "G4VModularPhysicsList.hh"
42 auto rootPrimaryGenUseSeed{
43 parameters.getParameter<
bool>(
"rootPrimaryGenUseSeed")};
55 ldmx_log(debug) <<
"Parallel worlds physics list has been registered";
56 pList->RegisterPhysics(
new G4ParallelWorldPhysics(
"ldmxParallelWorld"));
66 auto biasing_operators{
67 parameters_.getParameter<std::vector<framework::config::Parameters>>(
68 "biasing_operators", {})};
69 if (!biasing_operators.empty()) {
70 ldmx_log(info) <<
" Biasing enabled with " << biasing_operators.size()
76 bop.getParameter<std::string>(
"class_name"),
77 bop.getParameter<std::string>(
"instance_name"), bop);
81 G4GenericBiasingPhysics* biasingPhysics =
new G4GenericBiasingPhysics();
87 [
this, biasingPhysics](
auto bop) {
88 ldmx_log(info) <<
"Biasing operator '" << bop->GetName()
89 <<
"' set to bias " << bop->getParticleToBias();
90 biasingPhysics->Bias(bop->getParticleToBias());
94 pList->RegisterPhysics(biasingPhysics);
97 this->SetUserInitialization(pList);
106 ldmx_log(debug) <<
"Parallel worlds have been enabled";
108 auto validateGeometry_{
parameters_.getParameter<
bool>(
"validate_detector")};
109 G4GDMLParser* pwParser =
new G4GDMLParser();
119 G4RunManager::Initialize();
129 SetUserAction(primary_action);
130 SetUserAction(run_action);
131 SetUserAction(event_action);
132 SetUserAction(tracking_action);
133 SetUserAction(stepping_action);
134 SetUserAction(stacking_action);
138 parameters_.getParameter<std::vector<framework::config::Parameters>>(
140 for (
auto& user_action : user_actions) {
142 user_action.getParameter<std::string>(
"class_name"),
143 user_action.getParameter<std::string>(
"instance_name"), user_action);
144 for (
auto& type : ua->getTypes()) {
145 if (type == simcore::TYPE::RUN) {
146 run_action->registerAction(ua.get());
147 }
else if (type == simcore::TYPE::EVENT) {
148 event_action->registerAction(ua.get());
149 }
else if (type == simcore::TYPE::TRACKING) {
150 tracking_action->registerAction(ua.get());
151 }
else if (type == simcore::TYPE::STEPPING) {
152 stepping_action->registerAction(ua.get());
153 }
else if (type == simcore::TYPE::STACKING) {
154 stacking_action->registerAction(ua.get());
156 EXCEPTION_RAISE(
"ActionType",
"Action type does not exist.");
164 G4RunManager::TerminateOneEvent();
169 static auto reactivate_dark_brem = [](G4ProcessManager* pman) {
170 for (
int i_proc{0}; i_proc < pman->GetProcessList()->size(); i_proc++) {
171 G4VProcess* p{(*(pman->GetProcessList()))[i_proc]};
172 if (p->GetProcessName().contains(G4DarkBremsstrahlung::PROCESS_NAME)) {
173 pman->SetProcessActivation(p,
true);
179 reactivate_dark_brem(G4Electron::Definition()->GetProcessManager());
181 if (this->GetVerboseLevel() > 1) {
182 ldmx_log(debug) <<
"Reset the dark brem process (if it was activated)";
Class which defines basic APrime physics.
Class which implements the Geant4 user event action.
Class used to enhanced the gamma physics list.
Class implementing the Geant4 primary generator action.
Class providing a Geant4 run manager implementation.
Class which implements the user tracking action.
Class encapsulating parameters for configuring a processor.
Defines basic APrime physics.
Handle to the conditions system, provided at construction to classes which require it.
Implements the Geant4 detector construction.
void apply(UnaryFunction f) const
Apply the input UnaryFunction to each entry in the inventory.
static Factory & get()
get the factory instance
PrototypePtr make(const std::string &full_name, PrototypeConstructorArgs... maker_args)
make a new object by name
extra gamma particle physics for simulation and sets up the photonuclear model to use from the config...
Allows the configuration of properties of kaons produced in the simulation, in particular setting the...
std::string parallelWorldPath_
Path to GDML description of parallel world.
framework::config::Parameters parameters_
The set of parameters used to configure the RunManager.
bool isPWEnabled_
Flag indicating whether a parallel world should be registered.
void TerminateOneEvent()
Called at the end of each event.
void setupPhysics()
Initialize physics.
void setUseRootSeed(bool useIt=true)
Tell RunManager to use the seed from the root file.
void Initialize()
Perform application initialization.
DetectorConstruction * getDetectorConstruction()
Get the user detector construction cast to a specific type.
G4PhysListFactory physicsListFactory_
Factory class for instantiating the physics list.
RunManager(framework::config::Parameters ¶meters, ConditionsInterface &)
Class constructor.
Implementation of user event action hook.
Implementation of Geant4 primary generator action.
Implementation of user run action hook.
Class implementing a user stacking action.
Implements the Geant4 user stepping action.
Implementation of user tracking action.