From 43d8db0394a4f0dc55e964cd9a14ac4a0c0b90f9 Mon Sep 17 00:00:00 2001
From: lintao <lintao51@gmail.com>
Date: Mon, 12 Aug 2019 15:11:29 +0800
Subject: [PATCH] WIP: add IAnaElemTool interface.

---
 .../DetSimCore/src/ActionInitialization.cpp   | 13 +++---
 .../DetSimCore/src/ActionInitialization.h     |  9 +++-
 Simulation/DetSimCore/src/DetSimAlg.cpp       |  5 ++-
 Simulation/DetSimCore/src/DetSimAlg.h         |  7 ++++
 Simulation/DetSimCore/src/EventAction.cpp     |  5 ++-
 Simulation/DetSimCore/src/EventAction.h       |  8 +++-
 Simulation/DetSimCore/src/RunAction.cpp       |  5 ++-
 Simulation/DetSimCore/src/RunAction.h         |  8 +++-
 Simulation/DetSimCore/src/SteppingAction.cpp  |  3 +-
 Simulation/DetSimCore/src/SteppingAction.h    |  8 +++-
 Simulation/DetSimCore/src/TrackingAction.cpp  |  5 ++-
 Simulation/DetSimCore/src/TrackingAction.h    | 11 +++--
 .../DetSimInterface/IAnaElemTool.h            | 42 +++++++++++++++++++
 13 files changed, 108 insertions(+), 21 deletions(-)
 create mode 100644 Simulation/DetSimInterface/DetSimInterface/IAnaElemTool.h

diff --git a/Simulation/DetSimCore/src/ActionInitialization.cpp b/Simulation/DetSimCore/src/ActionInitialization.cpp
index 515f975b..7238d15b 100644
--- a/Simulation/DetSimCore/src/ActionInitialization.cpp
+++ b/Simulation/DetSimCore/src/ActionInitialization.cpp
@@ -5,8 +5,9 @@
 #include "TrackingAction.h"
 #include "SteppingAction.h"
 
-ActionInitialization::ActionInitialization()
-    : G4VUserActionInitialization() {
+ActionInitialization::ActionInitialization(ToolHandleArray<IAnaElemTool>& anatools)
+    : G4VUserActionInitialization(),
+      m_anaelemtools(anatools) {
 
 }
 
@@ -23,16 +24,16 @@ void
 ActionInitialization::Build() const {
 
 
-    RunAction* runAction = new RunAction();
+    RunAction* runAction = new RunAction(m_anaelemtools);
     SetUserAction(runAction);
 
-    EventAction* eventAction = new EventAction();
+    EventAction* eventAction = new EventAction(m_anaelemtools);
     SetUserAction(eventAction);
 
-    TrackingAction* trackingAction = new TrackingAction();
+    TrackingAction* trackingAction = new TrackingAction(m_anaelemtools);
     SetUserAction(trackingAction);
 
-    SteppingAction* steppingAction = new SteppingAction();
+    SteppingAction* steppingAction = new SteppingAction(m_anaelemtools);
     SetUserAction(steppingAction);
 
 }
diff --git a/Simulation/DetSimCore/src/ActionInitialization.h b/Simulation/DetSimCore/src/ActionInitialization.h
index 6ad9791d..ef33b470 100644
--- a/Simulation/DetSimCore/src/ActionInitialization.h
+++ b/Simulation/DetSimCore/src/ActionInitialization.h
@@ -1,17 +1,24 @@
 #ifndef ActionInitialization_h
 #define ActionInitialization_h
 
+#include <GaudiKernel/ToolHandle.h>
+
+#include <DetSimInterface/IAnaElemTool.h>
+
+
 #include "G4VUserActionInitialization.hh"
 
 class ActionInitialization: public G4VUserActionInitialization {
 public:
 
-    ActionInitialization();
+    ActionInitialization(ToolHandleArray<IAnaElemTool>&);
     ~ActionInitialization();
 
     void BuildForMaster() const override;
     void Build() const override;
 
+private:
+    ToolHandleArray<IAnaElemTool>& m_anaelemtools;
 };
 
 
diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp
index 8bd06abb..70dde30c 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.cpp
+++ b/Simulation/DetSimCore/src/DetSimAlg.cpp
@@ -56,7 +56,10 @@ DetSimAlg::initialize() {
     runmgr->SetUserAction(new PrimaryGeneratorAction());
 
     // User Actions
-    runmgr->SetUserInitialization(new ActionInitialization());
+    for (auto anaelem: m_ana_elems.value()) {
+        m_anaelemtools.push_back(anaelem);
+    }
+    runmgr->SetUserInitialization(new ActionInitialization(m_anaelemtools));
 
     // Vis Mac
     bool hasVis = false;
diff --git a/Simulation/DetSimCore/src/DetSimAlg.h b/Simulation/DetSimCore/src/DetSimAlg.h
index d9c2a2f6..08ee2489 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.h
+++ b/Simulation/DetSimCore/src/DetSimAlg.h
@@ -6,8 +6,10 @@
 
 #include <GaudiKernel/Algorithm.h>
 #include <GaudiKernel/Property.h>
+#include <GaudiKernel/ToolHandle.h>
 
 #include <DetSimInterface/IDetSimSvc.h>
+#include <DetSimInterface/IAnaElemTool.h>
 
 class DetSimAlg: public Algorithm {
 public:
@@ -19,6 +21,7 @@ public:
 
 private:
     SmartIF<IDetSimSvc> m_detsimsvc;
+    ToolHandleArray<IAnaElemTool> m_anaelemtools;
 
 private:
 
@@ -27,6 +30,10 @@ private:
     Gaudi::Property<std::vector<std::string>> m_vis_macs{this, "VisMacs"};
 
     Gaudi::Property<std::string> m_physics_lists_name{this, "PhysicsList", "QGSP_BERT"};
+
+    Gaudi::Property<std::vector<std::string>> m_ana_elems{this, "AnaElems"};
+
+
 private:
     int i_event;
 };
diff --git a/Simulation/DetSimCore/src/EventAction.cpp b/Simulation/DetSimCore/src/EventAction.cpp
index c0a9ab35..bbe00357 100644
--- a/Simulation/DetSimCore/src/EventAction.cpp
+++ b/Simulation/DetSimCore/src/EventAction.cpp
@@ -1,7 +1,8 @@
 #include "EventAction.h"
 
-EventAction::EventAction() 
-    : G4UserEventAction() {
+EventAction::EventAction(ToolHandleArray<IAnaElemTool>& anatools) 
+    : G4UserEventAction(),
+      m_anaelemtools(anatools) {
 
 }
 
diff --git a/Simulation/DetSimCore/src/EventAction.h b/Simulation/DetSimCore/src/EventAction.h
index af2bc93a..8cd9fb99 100644
--- a/Simulation/DetSimCore/src/EventAction.h
+++ b/Simulation/DetSimCore/src/EventAction.h
@@ -1,6 +1,10 @@
 #ifndef EventAction_h
 #define EventAction_h
 
+#include <GaudiKernel/ToolHandle.h>
+
+#include <DetSimInterface/IAnaElemTool.h>
+
 #include "G4UserEventAction.hh"
 
 class G4Event;
@@ -8,12 +12,14 @@ class G4Event;
 class EventAction: public G4UserEventAction {
 public:
 
-    EventAction();
+    EventAction(ToolHandleArray<IAnaElemTool>&);
     ~EventAction();
 
     void BeginOfEventAction(const G4Event*) override;
     void EndOfEventAction(const G4Event*) override;
 
+private:
+    ToolHandleArray<IAnaElemTool>& m_anaelemtools;
 };
 
 #endif
diff --git a/Simulation/DetSimCore/src/RunAction.cpp b/Simulation/DetSimCore/src/RunAction.cpp
index b86ff14c..81699bdd 100644
--- a/Simulation/DetSimCore/src/RunAction.cpp
+++ b/Simulation/DetSimCore/src/RunAction.cpp
@@ -2,8 +2,9 @@
 
 #include "G4Run.hh"
 
-RunAction::RunAction() 
-    : G4UserRunAction() {
+RunAction::RunAction(ToolHandleArray<IAnaElemTool>& anatools) 
+    : G4UserRunAction(),
+      m_anaelemtools(anatools) {
 
 }
 
diff --git a/Simulation/DetSimCore/src/RunAction.h b/Simulation/DetSimCore/src/RunAction.h
index 72b76012..ab98e546 100644
--- a/Simulation/DetSimCore/src/RunAction.h
+++ b/Simulation/DetSimCore/src/RunAction.h
@@ -1,6 +1,10 @@
 #ifndef RunAction_h
 #define RunAction_h
 
+#include <GaudiKernel/ToolHandle.h>
+
+#include <DetSimInterface/IAnaElemTool.h>
+
 #include "G4UserRunAction.hh"
 
 class G4Run;
@@ -9,11 +13,13 @@ class G4Run;
 class RunAction: public G4UserRunAction {
 
 public:
-    RunAction();
+    RunAction(ToolHandleArray<IAnaElemTool>&);
     ~RunAction();
 
     virtual void BeginOfRunAction(const G4Run*);
     virtual void EndOfRunAction(const G4Run*);
+private:
+    ToolHandleArray<IAnaElemTool>& m_anaelemtools;
 
 };
 
diff --git a/Simulation/DetSimCore/src/SteppingAction.cpp b/Simulation/DetSimCore/src/SteppingAction.cpp
index 3ad62235..30ef20f6 100644
--- a/Simulation/DetSimCore/src/SteppingAction.cpp
+++ b/Simulation/DetSimCore/src/SteppingAction.cpp
@@ -1,6 +1,7 @@
 #include "SteppingAction.h"
 
-SteppingAction::SteppingAction() {
+SteppingAction::SteppingAction(ToolHandleArray<IAnaElemTool>& anatools)
+    : m_anaelemtools(anatools) {
 
 }
 
diff --git a/Simulation/DetSimCore/src/SteppingAction.h b/Simulation/DetSimCore/src/SteppingAction.h
index 9c181753..fd7e6ef7 100644
--- a/Simulation/DetSimCore/src/SteppingAction.h
+++ b/Simulation/DetSimCore/src/SteppingAction.h
@@ -1,6 +1,10 @@
 #ifndef SteppingAction_h
 #define SteppingAction_h
 
+#include <GaudiKernel/ToolHandle.h>
+
+#include <DetSimInterface/IAnaElemTool.h>
+
 #include "G4UserSteppingAction.hh"
 
 class G4Step;
@@ -8,11 +12,13 @@ class G4Step;
 class SteppingAction: public G4UserSteppingAction {
 
 public:
-    SteppingAction();
+    SteppingAction(ToolHandleArray<IAnaElemTool>&);
     ~SteppingAction();
 
     void UserSteppingAction(const G4Step*) override;
 
+private:
+    ToolHandleArray<IAnaElemTool>& m_anaelemtools;
 };
 
 #endif
diff --git a/Simulation/DetSimCore/src/TrackingAction.cpp b/Simulation/DetSimCore/src/TrackingAction.cpp
index 7672c7d6..89b6d1ee 100644
--- a/Simulation/DetSimCore/src/TrackingAction.cpp
+++ b/Simulation/DetSimCore/src/TrackingAction.cpp
@@ -1,7 +1,8 @@
 #include "TrackingAction.h"
 
-TrackingAction::TrackingAction()
-    : G4UserTrackingAction() {
+TrackingAction::TrackingAction(ToolHandleArray<IAnaElemTool>& anatools)
+    : G4UserTrackingAction(),
+      m_anaelemtools(anatools) {
 
 }
 
diff --git a/Simulation/DetSimCore/src/TrackingAction.h b/Simulation/DetSimCore/src/TrackingAction.h
index 5b7ff885..49cd8dce 100644
--- a/Simulation/DetSimCore/src/TrackingAction.h
+++ b/Simulation/DetSimCore/src/TrackingAction.h
@@ -1,20 +1,25 @@
 #ifndef TrackingAction_h
 #define TrackingAction_h
 
+#include <GaudiKernel/ToolHandle.h>
+
+#include <DetSimInterface/IAnaElemTool.h>
+
 #include "G4UserTrackingAction.hh"
 
 class TrackingAction: public G4UserTrackingAction {
 
 public:
 
-    TrackingAction();
+    TrackingAction(ToolHandleArray<IAnaElemTool>&);
     ~TrackingAction();
 
     void PreUserTrackingAction(const G4Track*);
     void PostUserTrackingAction(const G4Track*);
 
-
-
+private:
+    ToolHandleArray<IAnaElemTool>& m_anaelemtools;
+    
 };
 
 #endif
diff --git a/Simulation/DetSimInterface/DetSimInterface/IAnaElemTool.h b/Simulation/DetSimInterface/DetSimInterface/IAnaElemTool.h
new file mode 100644
index 00000000..9d7f7ab1
--- /dev/null
+++ b/Simulation/DetSimInterface/DetSimInterface/IAnaElemTool.h
@@ -0,0 +1,42 @@
+#ifndef IAnaElemTool_h
+#define IAnaElemTool_h
+
+#include "GaudiKernel/IAlgTool.h"
+
+class G4Run;
+class G4Event;
+class G4Track;
+class G4Step;
+
+#include "G4ClassificationOfNewTrack.hh"
+
+class IAnaElemTool : virtual public IAlgTool {
+public:
+    DeclareInterfaceID(IAnaElemTool, 0, 1);
+
+    virtual ~IAnaElemTool() {}
+
+    // Run
+    virtual void BeginOfRunAction(const G4Run*) {}
+    virtual void EndOfRunAction(const G4Run*) {}
+
+    // Event
+    virtual void BeginOfEventAction(const G4Event*) {}
+    virtual void EndOfEventAction(const G4Event*) {}
+
+    // Stacking
+    virtual G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track*) {return fUrgent;}
+    virtual void NewStage() {}
+    virtual void PrepareNewEvent() {}
+
+    // Tracking
+    virtual void PreUserTrackingAction(const G4Track*) {}
+    virtual void PostUserTrackingAction(const G4Track*) {}
+
+    // Stepping
+    virtual void UserSteppingAction(const G4Step*) {}
+
+};
+
+
+#endif
-- 
GitLab