12 #include "montecarlo/mccore/GGSRunManagerExtensions.h"
15 GGSMUAMessenger::GGSMUAMessenger(
GGSMultiUserAction *muAction,
const G4String &path,
const G4String &dsc)
16 : G4UImessenger(path, dsc), _muAction(muAction), _gaBuildCommand(
"/GGS/generatorActions/set", this) {
25 void GGSMUAMessenger::CreateCommands(
const std::vector<std::string> &userActionClasses) {
26 for (
auto &className : userActionClasses) {
27 _uaBuildCommands.push_back(std::make_unique<G4UIcommand>((
"/GGS/userActions/add" + className).c_str(),
this));
31 void GGSMUAMessenger::BuildAction(
const std::string &actionClassName) {
33 auto BuildWithFactory = [&actionClassName,
this](
auto &factory) {
34 const auto &avaialbleBuilders = factory.GetListOfRegisteredBuilders();
35 if (std::find(avaialbleBuilders.begin(), avaialbleBuilders.end(), actionClassName) != avaialbleBuilders.end()) {
36 _muAction->
AddAction(factory.CreateObject(actionClassName));
48 G4ExceptionDescription ed;
49 ed <<
"Can't build " << actionClassName <<
" user action" << std::endl;
50 G4Exception(
"GGSUserActionInitialization::UAIMessenger::SetNewValue",
"No builder for given user action",
51 G4ExceptionSeverity::FatalException, ed);
60 void GGSMUAMessenger::SetNewValue(G4UIcommand *command, G4String newValue) {
61 std::string path = command->GetCommandPath();
62 if (path.size() > 20 && path.substr(0, 20) ==
"/GGS/userActions/add") {
64 auto actionClassName = path.substr(20);
65 BuildAction(actionClassName);
66 }
else if (path ==
"/GGS/generatorActions/set") {
68 if (G4RunManager::GetRunManager()->GetUserPrimaryGeneratorAction()) {
69 delete G4RunManager::GetRunManager()->GetUserPrimaryGeneratorAction();
72 std::unique_ptr<G4VUserPrimaryGeneratorAction> gen =
75 G4ExceptionDescription ed;
76 ed <<
"No registered builder for generator " << newValue << std::endl;
77 G4Exception(
"GGSUserActionInitialization::UAIMessenger::SetNewValue",
"Invalid generator",
78 G4ExceptionSeverity::FatalException, ed);
81 if (G4Threading::IsMultithreadedApplication() && G4Threading::IsMasterThread()) {
84 _genForMaster = std::move(gen);
86 rme.SetGGSGeneratorAction(gen.release());
std::unique_ptr< T > CreateObject(const std::string &name, ConstructorArgs...arguments)
Create an object.
Class with additional functionalities for run managers.
A multiplexer container for user actions.
void AddAction(std::unique_ptr< GGSUserAction > &&userAction)
Adds a general user action.
static GGSFactory & GetInstance()
Getter method for singleton pointer.