From f5835b8b2882b766bbdbff7a3b9446a6461c72bb Mon Sep 17 00:00:00 2001
From: lintao <lintao51@gmail.com>
Date: Fri, 18 Sep 2020 11:08:57 +0800
Subject: [PATCH] WIP: Add the DriftChamberSensitiveDetector.

---
 Simulation/DetSimSD/CMakeLists.txt            |  1 +
 .../src/DriftChamberSensitiveDetector.cpp     | 67 +++++++++++++++++++
 .../src/DriftChamberSensitiveDetector.h       | 33 +++++++++
 3 files changed, 101 insertions(+)
 create mode 100644 Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp
 create mode 100644 Simulation/DetSimSD/src/DriftChamberSensitiveDetector.h

diff --git a/Simulation/DetSimSD/CMakeLists.txt b/Simulation/DetSimSD/CMakeLists.txt
index 10ac6793..d917ecef 100644
--- a/Simulation/DetSimSD/CMakeLists.txt
+++ b/Simulation/DetSimSD/CMakeLists.txt
@@ -18,6 +18,7 @@ set(DetSimSD_srcs
     src/CaloSensitiveDetector.cpp
 
     src/DriftChamberSensDetTool.cpp
+    src/DriftChamberSensitiveDetector.cpp
 )
 
 gaudi_add_module(DetSimSD ${DetSimSD_srcs}
diff --git a/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp
new file mode 100644
index 00000000..9f5ce3e0
--- /dev/null
+++ b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.cpp
@@ -0,0 +1,67 @@
+#include "DriftChamberSensitiveDetector.h"
+
+#include "G4SDManager.hh"
+
+DriftChamberSensitiveDetector::DriftChamberSensitiveDetector(const std::string& name,
+                                                             dd4hep::Detector& description)
+    : DDG4SensitiveDetector(name, description),
+      m_hc(nullptr) {
+
+    const std::string& coll_name = m_sensitive.hitsCollection();
+
+    collectionName.insert(coll_name);
+}
+
+void
+DriftChamberSensitiveDetector::Initialize(G4HCofThisEvent* HCE) {
+
+    const std::string& coll_name = collectionName[0];
+    m_hc = new HitCollection(GetName(), coll_name);
+
+    int HCID = -1;
+    if(HCID<0) HCID = G4SDManager::GetSDMpointer()->GetCollectionID(m_hc);
+    HCE->AddHitsCollection( HCID, m_hc ); 
+
+}
+
+G4bool
+DriftChamberSensitiveDetector::ProcessHits(G4Step* step, G4TouchableHistory*) {
+    // Refer to: DDG4/legacy/Geant4TrackerSD.cpp (note: there's bug in momentum calculation)
+    //           DDCore/include/DD4hep/Objects.h (mean_direction and mean_length)
+
+    dd4hep::sim::Geant4StepHandler h(step);
+
+    dd4hep::Position prePos    = h.prePos();
+    dd4hep::Position postPos   = h.postPos();
+    dd4hep::Position direction = postPos - prePos;
+    dd4hep::Position position  = mean_direction(prePos,postPos); // (pre+post)/2
+    double           hit_len   = direction.R();
+
+    HitContribution contrib = dd4hep::sim::Geant4Hit::extractContribution(step);
+    // Now, invokes the dE/dx simulator
+    double dedx = 0.0;
+
+    double de = hit_len * dedx;
+    // contrib.deposit = de; // if need the de from dedx simulator
+
+    // create a new hit
+    TrackerHit* hit = new TrackerHit(
+                                     h.track->GetTrackID(),
+                                     h.track->GetDefinition()->GetPDGEncoding(),
+                                     de, // not the Geant4's deposit energy. from dE/dx simulator
+                                     h.track->GetGlobalTime()
+                                     );
+    hit->cellID = getCellID(step);
+    hit->energyDeposit = de; // FIXME: also use the dedx
+    hit->position = position;
+    hit->momentum = (h.preMom() + h.postMom() )/2;
+    hit->length   = hit_len;
+    m_hc->insert(hit);
+
+    return true;
+}
+
+void
+DriftChamberSensitiveDetector::EndOfEvent(G4HCofThisEvent* HCE) {
+
+}
diff --git a/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.h b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.h
new file mode 100644
index 00000000..ebe455de
--- /dev/null
+++ b/Simulation/DetSimSD/src/DriftChamberSensitiveDetector.h
@@ -0,0 +1,33 @@
+#ifndef DriftChamberSensitiveDetector_h
+#define DriftChamberSensitiveDetector_h
+
+/*
+ * DriftChamberSensitiveDetector is used in Drift Chamber with dE/dx simulator.
+ *
+ * 19 Sept. 2020, Tao Lin <lintao@ihep.ac.cn>
+ */
+
+#include "DetSimSD/DDG4SensitiveDetector.h"
+
+class DriftChamberSensitiveDetector: public DDG4SensitiveDetector {
+public:
+    typedef dd4hep::sim::Geant4TrackerHit TrackerHit;
+    typedef G4THitsCollection<TrackerHit> TrackerHitCollection;
+
+public:
+    DriftChamberSensitiveDetector(const std::string& name, dd4hep::Detector& description);
+    
+public:
+    // Geant4 interface
+
+    virtual void Initialize(G4HCofThisEvent* HCE);
+    virtual G4bool ProcessHits(G4Step* step,G4TouchableHistory* history);
+    virtual void EndOfEvent(G4HCofThisEvent* HCE);
+
+protected:
+
+    HitCollection* m_hc;
+
+};
+
+#endif
-- 
GitLab