14 #include "G4RunManager.hh"
19 :
GGSUserAction(), _messenger(this,
"/GGS/userActions/",
"User actions build messenger") {}
31 G4RunManager *runManager = G4RunManager::GetRunManager();
32 if (runManager->GetUserSteppingAction() ==
this)
33 runManager->SetUserAction((G4UserSteppingAction *)0);
34 if (runManager->GetUserTrackingAction() ==
this)
35 runManager->SetUserAction((G4UserTrackingAction *)0);
36 if (runManager->GetUserEventAction() ==
this)
37 runManager->SetUserAction((G4UserEventAction *)0);
38 if (runManager->GetUserRunAction() ==
this)
39 runManager->SetUserAction((G4UserRunAction *)0);
40 if (runManager->GetUserStackingAction() ==
this)
41 runManager->SetUserAction((G4UserStackingAction *)0);
48 _userActions.push_back(std::move(userAction));
49 _userActions.back()->SetTrackingManagerPointer(fpTrackingManager);
57 _steppingActions.push_back(std::move(steppingAction));
65 _trackingActions.push_back(std::move(trackingAction));
66 _trackingActions.back()->SetTrackingManagerPointer(fpTrackingManager);
74 _eventActions.push_back(std::move(eventAction));
82 _runActions.push_back(std::move(runAction));
90 _stackingActions.push_back(std::move(stackingAction));
99 for (
unsigned int i = 0; i < _userActions.size(); i++)
103 for (
unsigned int i = 0; i < _steppingActions.size(); i++)
112 for (
unsigned int i = 0; i < _userActions.size(); i++)
116 for (
unsigned int i = 0; i < _trackingActions.size(); i++)
125 for (
unsigned int i = 0; i < _userActions.size(); i++)
129 for (
unsigned int i = 0; i < _trackingActions.size(); i++)
138 for (
unsigned int i = 0; i < _userActions.size(); i++)
142 for (
unsigned int i = 0; i < _eventActions.size(); i++)
154 for (
unsigned int i = 0; i < _userActions.size(); i++)
158 for (
unsigned int i = 0; i < _eventActions.size(); i++)
170 for (
unsigned int i = 0; i < _userActions.size(); i++)
174 for (
unsigned int i = 0; i < _runActions.size(); i++)
183 for (
unsigned int i = 0; i < _userActions.size(); i++)
187 for (
unsigned int i = 0; i < _runActions.size(); i++)
195 int classif, actionClassif;
198 G4UserStackingAction *classifierSA =
nullptr;
200 for (
auto &actionPtr : _userActions) {
202 if (actionClassif != -100) {
203 if (actionClassif != classif && classif != -100) {
204 G4ExceptionDescription ed;
205 std::string classifierUAClassName =
typeid(*classifierUA).name();
206 auto *actionRawPtr = actionPtr.get();
208 std::string thisUAClassName =
typeid(*actionRawPtr).name();
209 ed <<
"Classification of track " << aTrack->GetTrackID() <<
" from GGS action " << classifierUAClassName <<
" ("
210 << classif <<
") is different from classification from GGS action " << thisUAClassName <<
" ("
211 << actionClassif <<
")";
212 G4Exception(
"GGSMultiUserAction::ClassifyNewTrack",
"Clashing track classifications",
213 G4ExceptionSeverity::FatalException, ed);
215 classif = actionClassif;
216 classifierUA = actionPtr.get();
220 for (
auto &actionPtr : _stackingActions) {
222 if (actionClassif != classif && classif != -100) {
223 G4ExceptionDescription ed;
224 std::string classifierActionType, classifierClassName;
225 if (classifierUA !=
nullptr) {
226 classifierActionType =
"GGS";
227 classifierClassName =
typeid(*classifierUA).name();
228 }
else if (classifierSA !=
nullptr) {
229 classifierActionType =
"stacking";
230 classifierClassName =
typeid(*classifierSA).name();
232 auto *actionRawPtr = actionPtr.get();
234 auto thisSAClassName =
typeid(*actionRawPtr).name();
235 ed <<
"Classification of track " << aTrack->GetTrackID() <<
" from " << classifierActionType <<
" action "
236 << classifierClassName <<
" (" << classif <<
") is different from classification from stacking action "
237 << thisSAClassName <<
" (" << actionClassif <<
")";
238 G4Exception(
"GGSMultiUserAction::ClassifyNewTrack",
"Clashing track classifications",
239 G4ExceptionSeverity::FatalException, ed);
241 classif = actionClassif;
242 classifierSA = actionPtr.get();
245 if (classif == -100) {
246 return G4UserStackingAction::ClassifyNewTrack(aTrack);
248 return (G4ClassificationOfNewTrack)classif;
255 for (
unsigned int i = 0; i < _userActions.size(); i++) {
256 _userActions[i]->NewStage();
264 for (
unsigned int i = 0; i < _userActions.size(); i++) {
265 _userActions[i]->PrepareNewEvent();
void BeginOfRunAction(const G4Run *run)
Override of BeginOfRunAction method.
GGSMultiUserAction()
constructor.
void PostUserTrackingAction(const G4Track *track)
Override of PostUserTrackingAction method.
void UserSteppingAction(const G4Step *step)
Override of UserSteppingAction method.
G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track *)
Override of the ClassifyNewTrack method.
void PrepareNewEvent()
Override of PrepareNewEvent method.
G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track *aTrack)
Override of ClassifyNewTrack method.
void EndOfRunAction(const G4Run *run)
Override of EndOfRunAction method.
Class with additional functionalities for run managers.
void NewStage()
Override of NewStage method.
bool IsCurrentEventKilled()
Getter method for killed event flag.
~GGSMultiUserAction()
Destructor.
void AddAction(std::unique_ptr< GGSUserAction > &&userAction)
Adds a general user action.
static GGSRootFileService & GetInstance()
Get reference to GGSRootFileService unique instance.
void EndOfEventAction(const G4Event *event)
Override of EndOfEventAction method.
void BeginOfEventAction(const G4Event *event)
Override of BeginOfEventAction method.
Mother class for user actions in GGS.
void PreUserTrackingAction(const G4Track *track)
Override of PreUserTrackingAction method.