diff --git a/DDG4/include/DDG4/Geant4StackingAction.h b/DDG4/include/DDG4/Geant4StackingAction.h index 0741260670a112674966da508444341ce6a1dfe5..2c1138475a5ad0d01e756f68db70dd3a4348409e 100644 --- a/DDG4/include/DDG4/Geant4StackingAction.h +++ b/DDG4/include/DDG4/Geant4StackingAction.h @@ -13,8 +13,14 @@ #ifndef DDG4_GEANT4STACKINGACTION_H #define DDG4_GEANT4STACKINGACTION_H -// Framework include files -#include "DDG4/Geant4Action.h" +/// Framework include files +#include <DDG4/Geant4Action.h> + +/// Geant4 include files +#include <G4ClassificationOfNewTrack.hh> + +/// Forward declarations +class G4StackManager; /// Namespace for the AIDA detector description toolkit namespace dd4hep { @@ -27,6 +33,16 @@ namespace dd4hep { class Geant4SharedStackingAction; class Geant4StackingActionSequence; + enum Geant4StackingActionTrackClassification { + NoTrackClassification = 0xFEED + }; + union TrackClassification { + G4ClassificationOfNewTrack value; + int type; + TrackClassification() { type = NoTrackClassification; } + TrackClassification(G4ClassificationOfNewTrack val) { value = val; } + }; + /// Concrete implementation of the Geant4 stacking action base class /** * \author M.Frank @@ -35,21 +51,26 @@ namespace dd4hep { */ class Geant4StackingAction: public Geant4Action { public: + friend class Geant4StackingActionSequence; typedef Geant4SharedStackingAction shared_type; public: /// Define standard assignments and constructors DDG4_DEFINE_ACTION_CONSTRUCTORS(Geant4StackingAction); + public: /// Standard constructor Geant4StackingAction(Geant4Context* ctxt, const std::string& name); /// Default destructor virtual ~Geant4StackingAction(); /// New-stage callback - virtual void newStage() { + virtual void newStage(G4StackManager* /* stackManager */) { } /// Preparation callback - virtual void prepare() { + virtual void prepare(G4StackManager* /* stackManager */) { } + /// Return TrackClassification with enum G4ClassificationOfNewTrack or NoTrackClassification + virtual TrackClassification + classifyNewTrack(G4StackManager* /* stackManager */, const G4Track* track); }; /// Implementation of the Geant4 shared stacking action @@ -81,9 +102,12 @@ namespace dd4hep { /// Underlying object to be used during the execution of this thread virtual void use(Geant4StackingAction* action); /// New-stage callback - virtual void newStage(); + virtual void newStage(G4StackManager* stackManager) override; /// Preparation callback - virtual void prepare(); + virtual void prepare(G4StackManager* stackManager) override; + /// Return TrackClassification with enum G4ClassificationOfNewTrack or NoTrackClassification + virtual TrackClassification + classifyNewTrack(G4StackManager* stackManager, const G4Track* track) override; }; /// Concrete implementation of the Geant4 stacking action sequence @@ -124,22 +148,24 @@ namespace dd4hep { /// Get an action by name Geant4StackingAction* get(const std::string& name) const; /// Register begin-of-event callback. Types Q and T must be polymorph! - template <typename T> void callAtNewStage(T* p, void (T::*f)()) { + template <typename T> void callAtNewStage(T* p, void (T::*f)(G4StackManager*)) { m_newStage.add(p, f); } /// Register end-of-event callback. Types Q and T must be polymorph! - template <typename T> void callAtPrepare(T* p, void (T::*f)()) { + template <typename T> void callAtPrepare(T* p, void (T::*f)(G4StackManager*)) { m_prepare.add(p, f); } /// Add an actor responding to all callbacks. Sequence takes ownership. void adopt(Geant4StackingAction* action); /// New-stage callback - virtual void newStage(); + virtual void newStage(G4StackManager* stackManager); /// Preparation callback - virtual void prepare(); + virtual void prepare(G4StackManager* stackManager); + /// Classify new track: The first call in the sequence returning non-null pointer wins! + virtual TrackClassification + classifyNewTrack(G4StackManager* stackManager, const G4Track* track); }; } // End namespace sim } // End namespace dd4hep - #endif // DDG4_GEANT4STACKINGACTION_H