diff --git a/FullSimLight/fullSimLight.cc b/FullSimLight/fullSimLight.cc index 8dd2f4e745980ff19145c36d378558c08a62e73f..d014d25400297ab1cad06fbcfe4819f0e5985f00 100644 --- a/FullSimLight/fullSimLight.cc +++ b/FullSimLight/fullSimLight.cc @@ -209,6 +209,14 @@ int main(int argc, char** argv) { // 3. User action FSLActionInitialization* actInit = new FSLActionInitialization(parIsPerformance); + actInit->SetActions( + simConfig::jf["Event Actions"], + simConfig::jf["Run Actions"], + simConfig::jf["Tracking Actions"], + simConfig::jf["Stepping Actions"], + simConfig::jf["Stacking Actions"] + ); + // set the name of a region in which we are interested to see a very basic simulation // stat e.g. "EMEC" (NOTE: only if the given region can be found and executed in // non-perfomance mode) diff --git a/FullSimLight/include/FSLActionInitialization.hh b/FullSimLight/include/FSLActionInitialization.hh index 8a072abe578641b73f951cf1d3ce44a70dff0e44..0d042396f9eb1f7979dd339a122da7bc4c6daa3a 100644 --- a/FullSimLight/include/FSLActionInitialization.hh +++ b/FullSimLight/include/FSLActionInitialization.hh @@ -10,19 +10,41 @@ class FSLActionInitialization : public G4VUserActionInitialization { public: - FSLActionInitialization(bool isperformance=false); + FSLActionInitialization(bool isperformance=false, bool customUserActions = false); ~FSLActionInitialization() override; void BuildForMaster() const override; void Build() const override; void SetPerformanceModeFlag(bool val) { fIsPerformance = val; } - void SetSpecialScoringRegionName(const G4String& rname) { fSpecialScoringRegionName = rname; } - + void SetSpecialScoringRegionName(const G4String& rname) { fSpecialScoringRegionName = rname; } + + void SetActions(std::vector<std::string> &evtActions, + std::vector<std::string> &rActions, + std::vector<std::string> &trActions, + std::vector<std::string> &steActions, + std::vector<std::string> &staActions) + { + eventActions = evtActions; + runActions = rActions; + trackingActions = trActions; + steppingActions = steActions; + stackingActions = staActions; + }; + private: GeantinoMapsConfigurator* fGeantinoMapsConfig; bool fIsPerformance; + bool fCustomUserActions; G4String fSpecialScoringRegionName; + + + std::vector<std::string> eventActions; + std::vector<std::string> runActions; + std::vector<std::string> trackingActions; + std::vector<std::string> steppingActions; + std::vector<std::string> stackingActions; + }; diff --git a/FullSimLight/src/FSLActionInitialization.cc b/FullSimLight/src/FSLActionInitialization.cc index ac6c7117e8ad70137b78caff3d79d3b8a459696e..84a51686fe9e43a5c689e7361eef33f6f55a9e37 100644 --- a/FullSimLight/src/FSLActionInitialization.cc +++ b/FullSimLight/src/FSLActionInitialization.cc @@ -1,6 +1,6 @@ #include "FSLActionInitialization.hh" - +#include "GeoModelKernel/GeoPluginLoader.h" #include "FSLPrimaryGeneratorAction.hh" #include "FSLRunAction.hh" #include "FSLEventAction.hh" @@ -22,8 +22,8 @@ //const G4AnalysisManager* FSLActionInitialization::fMasterAnalysisManager = nullptr; -FSLActionInitialization::FSLActionInitialization(bool isperformance) -: G4VUserActionInitialization(), fIsPerformance(isperformance), +FSLActionInitialization::FSLActionInitialization(bool isperformance, bool customuseractions) +: G4VUserActionInitialization(), fIsPerformance(isperformance),fCustomUserActions(customuseractions), fSpecialScoringRegionName("") { fGeantinoMapsConfig = GeantinoMapsConfigurator::getGeantinoMapsConf(); @@ -35,10 +35,12 @@ FSLActionInitialization::~FSLActionInitialization() {} // called in case of MT void FSLActionInitialization::BuildForMaster() const { - FSLRunAction* masterRunAct = new FSLRunAction(); + if(fCustomUserActions){}/*set run action from config file*/ + else + {FSLRunAction* masterRunAct = new FSLRunAction(); masterRunAct->SetPerformanceFlag(fIsPerformance); masterRunAct->SetSpecialScoringRegionName(fSpecialScoringRegionName); - + #if USE_PYTHIA if (use_pythia()) { G4String str(get_pythia_config()); @@ -47,6 +49,7 @@ void FSLActionInitialization::BuildForMaster() const { #endif SetUserAction(masterRunAct); } +} void FSLActionInitialization::Build() const { @@ -81,7 +84,7 @@ void FSLActionInitialization::Build() const { } #endif // do not create Run,Event,Stepping and Tracking actions in case of perfomance mode - if (!fIsPerformance) { + if (!fIsPerformance && !fCustomUserActions) { FSLRunAction* runact = new FSLRunAction(); SetUserAction(runact); runact->SetSpecialScoringRegionName(fSpecialScoringRegionName); @@ -113,4 +116,61 @@ void FSLActionInitialization::Build() const { #endif //MultiEventActions?? TO DO? } + + else if(fCustomUserActions) + { + for (const auto& element : runActions) + { + GeoPluginLoader<FSLUserRunActionPlugin> loader; + const FSLUserRunActionPlugin * plugin = loader.load(element); + G4UserRunAction* runAct = plugin->getRunAction(); + SetUserAction(runAct); + + } + + for (const auto& element : eventActions) + { + GeoPluginLoader<FSLUserEventActionPlugin> loader; + const FSLUserEventActionPlugin * plugin = loader.load(element); + G4UserEventAction* evtAct = plugin->getEventAction(); + SetUserAction(evtAct); + + } + + for (const auto& element : steppingActions) + { + GeoPluginLoader<FSLUserSteppingActionPlugin> loader; + const FSLUserSteppingActionPlugin * plugin = loader.load(element); + G4UserSteppingAction* steAct = plugin->getSteppingAction(); + SetUserAction(steAct); + + } + + + for (const auto& element : trackingActions) + { + GeoPluginLoader<FSLUserTrackingActionPlugin> loader; + const FSLUserTrackingActionPlugin * plugin = loader.load(element); + G4UserTrackingAction* traAct = plugin->getTrackingAction(); + SetUserAction(traAct); + + } + + for (const auto& element : stackingActions) + { + GeoPluginLoader<FSLUserStackingActionPlugin> loader; + const FSLUserStackingActionPlugin * plugin = loader.load(element); + G4UserStackingAction* staAct = plugin->getStackingAction(); + SetUserAction(staAct); + + } + + + + + + + + } + }