6.4. Multiple User Actions

Starting from Geant4 Version 10.3 it is possible to attach multiple instances of the same type of user action to a single run manager. This is achieved via the use of a special proxy classes to which multiple child user actions are attached. This is allowed for run-, event-, tracking- and stepping-type user actions (G4UserRunAction, G4UserEventAction,G4UserTrackingAction,G4UserSteppingAction).

The kernel still sees a single user action of each type, the proxy will forward the calls from kernel to all the attached child user actions.

Example 6.16.  An example of the use of the use of multiple user-actions.

#include "G4MultiRunAction.hh"
#include "G4MultiEventAction.hh"
#include "G4MultiTrackingAction.hh"
#include "G4MultiSteppingAction.hh"
//...
void MyUserActionInitialization::Build() 
{
  //...
  // Example with multiple-event action, similartly
  // for the other cases
  // multi- user actions extend std::vector
  auto multiAction = new G4MultiEventAction { new MyEventAction1, new MyEventAction2 } ;
  //...
  multiAction->push_back( new MyEventAction3 );
  SetUserAction( multiAction );
  //...
}


6.4.1. Exceptions

This functionality is not implemented for the the stacking user action and primary generation action. There is no multiple G4UserStackingAction equivalent since this would require a complex handling of the case in which conflicting classifications are issued. For the case of G4VUserPrimaryGeneratorAction the use case of the multiple user actions is already addressed by the design of the class itself. User can implement one or more generators in the actions.

For the case of G4MultiRunAction only one of the child user actions can implement the G4UserRunAction::GenerateRun() method returning a non null, user derived G4Run object, otherwise an exception is thrown.