From c2004a126d28cea08e10a8cdb27e1e59c3972366 Mon Sep 17 00:00:00 2001
From: lintao <lintao51@gmail.com>
Date: Fri, 18 Sep 2020 16:13:26 +0800
Subject: [PATCH] WIP: enable the dedx simtool.

---
 Examples/options/tut_detsim_SDT.py                 |  4 ++++
 Simulation/DetSimDedx/src/DummyDedxSimTool.cpp     |  2 +-
 .../DetSimSD/src/DriftChamberSensDetTool.cpp       | 14 +++++++++++++-
 Simulation/DetSimSD/src/DriftChamberSensDetTool.h  |  5 +++++
 .../DetSimSD/src/DriftChamberSensitiveDetector.cpp |  6 ++++++
 .../DetSimSD/src/DriftChamberSensitiveDetector.h   |  7 +++++++
 6 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/Examples/options/tut_detsim_SDT.py b/Examples/options/tut_detsim_SDT.py
index 1b2adeb7..1fd7773b 100644
--- a/Examples/options/tut_detsim_SDT.py
+++ b/Examples/options/tut_detsim_SDT.py
@@ -126,6 +126,10 @@ from Configurables import DriftChamberSensDetTool
 
 calo_sensdettool = CalorimeterSensDetTool("CalorimeterSensDetTool")
 driftchamber_sensdettool = DriftChamberSensDetTool("DriftChamberSensDetTool")
+driftchamber_sensdettool.DedxSimTool = "DummyDedxSimTool"
+
+from Configurables import DummyDedxSimTool
+dedx_simtool = DummyDedxSimTool("DummyDedxSimTool")
 
 ##############################################################################
 # POD I/O
diff --git a/Simulation/DetSimDedx/src/DummyDedxSimTool.cpp b/Simulation/DetSimDedx/src/DummyDedxSimTool.cpp
index df1aa692..291b8c20 100644
--- a/Simulation/DetSimDedx/src/DummyDedxSimTool.cpp
+++ b/Simulation/DetSimDedx/src/DummyDedxSimTool.cpp
@@ -17,7 +17,7 @@ StatusCode DummyDedxSimTool::finalize() {
 }
 
 double DummyDedxSimTool::dedx(const G4Step* aStep) {
-    double result = 0.0;
+    double result = aStep->GetTotalEnergyDeposit();
 
 
     return result;
diff --git a/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp b/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp
index 2220500c..bf053216 100644
--- a/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp
+++ b/Simulation/DetSimSD/src/DriftChamberSensDetTool.cpp
@@ -17,6 +17,12 @@ StatusCode DriftChamberSensDetTool::initialize() {
         return StatusCode::FAILURE;
     }
 
+    m_dedx_simtool = ToolHandle<IDedxSimTool>(m_dedx_sim_option.value());
+    if (!m_dedx_simtool) {
+        error() << "Failed to find dedx simtoo." << endmsg;
+        return StatusCode::FAILURE;
+    }
+
     return sc;
 }
 
@@ -30,7 +36,13 @@ G4VSensitiveDetector*
 DriftChamberSensDetTool::createSD(const std::string& name) {
     dd4hep::Detector* dd4hep_geo = m_geosvc->lcdd();
 
-    G4VSensitiveDetector* sd = new DriftChamberSensitiveDetector(name, *dd4hep_geo);
+    G4VSensitiveDetector* sd = nullptr;
+
+    if (name == "DriftChamber") {
+        DriftChamberSensitiveDetector* dcsd = new DriftChamberSensitiveDetector(name, *dd4hep_geo);
+        dcsd->setDedxSimTool(m_dedx_simtool);
+    }
+
 
     return sd;
 }
diff --git a/Simulation/DetSimSD/src/DriftChamberSensDetTool.h b/Simulation/DetSimSD/src/DriftChamberSensDetTool.h
index 83e75aa7..ae727ed0 100644
--- a/Simulation/DetSimSD/src/DriftChamberSensDetTool.h
+++ b/Simulation/DetSimSD/src/DriftChamberSensDetTool.h
@@ -10,9 +10,12 @@
  */
 
 #include "GaudiKernel/AlgTool.h"
+#include "GaudiKernel/ToolHandle.h"
 #include "DetSimInterface/ISensDetTool.h"
+#include "DetSimInterface/IDedxSimTool.h"
 #include "DetInterface/IGeoSvc.h"
 
+
 class DriftChamberSensDetTool: public extends<AlgTool, ISensDetTool> {
 
 public:
@@ -30,6 +33,8 @@ private:
 
     // in order to initialize SD, we need to get the lcdd()
     SmartIF<IGeoSvc> m_geosvc;
+    ToolHandle<IDedxSimTool> m_dedx_simtool;
+    Gaudi::Property<std::string> m_dedx_sim_option{this, "DedxSimTool"};
 
 };
 
diff --git a/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp
index 9f5ce3e0..1ba9f7bf 100644
--- a/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp
+++ b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp
@@ -12,6 +12,12 @@ DriftChamberSensitiveDetector::DriftChamberSensitiveDetector(const std::string&
     collectionName.insert(coll_name);
 }
 
+bool DriftChamberSensitiveDetector::setDedxSimTool(ToolHandle<IDedxSimTool> simtool) {
+    m_dedx_simtool = simtool;
+
+    return true;
+}
+
 void
 DriftChamberSensitiveDetector::Initialize(G4HCofThisEvent* HCE) {
 
diff --git a/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.h b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.h
index ebe455de..638e146b 100644
--- a/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.h
+++ b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.h
@@ -8,6 +8,8 @@
  */
 
 #include "DetSimSD/DDG4SensitiveDetector.h"
+#include "DetSimInterface/IDedxSimTool.h"
+#include "GaudiKernel/ToolHandle.h"
 
 class DriftChamberSensitiveDetector: public DDG4SensitiveDetector {
 public:
@@ -16,6 +18,8 @@ public:
 
 public:
     DriftChamberSensitiveDetector(const std::string& name, dd4hep::Detector& description);
+
+    bool setDedxSimTool(ToolHandle<IDedxSimTool>);
     
 public:
     // Geant4 interface
@@ -28,6 +32,9 @@ protected:
 
     HitCollection* m_hc;
 
+    // this is passed from SensDetTool
+    ToolHandle<IDedxSimTool> m_dedx_simtool;
+
 };
 
 #endif
-- 
GitLab