From 3e2ceb9d0f20ca122e805f0acc40ce35cdc499a8 Mon Sep 17 00:00:00 2001
From: lintao <lintao51@gmail.com>
Date: Mon, 7 Dec 2020 17:04:14 +0800
Subject: [PATCH] WIP: Fast simulation interface support in CEPCSW.

---
 Simulation/DetSimCore/src/DetSimAlg.cpp       |  7 ++++++-
 Simulation/DetSimCore/src/DetSimAlg.h         |  3 +++
 .../DetSimCore/src/DetectorConstruction.cpp   | 12 +++++++++--
 .../DetSimCore/src/DetectorConstruction.h     |  5 ++++-
 .../DetSimInterface/IFastSimG4Tool.h          | 20 +++++++++++++++++++
 5 files changed, 43 insertions(+), 4 deletions(-)
 create mode 100644 Simulation/DetSimInterface/DetSimInterface/IFastSimG4Tool.h

diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp
index 17385cf7..f07eaf5e 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.cpp
+++ b/Simulation/DetSimCore/src/DetSimAlg.cpp
@@ -42,7 +42,12 @@ DetSimAlg::initialize() {
 
     // Detector Construction
     m_root_detelem = ToolHandle<IDetElemTool>(m_root_det_elem.value());
-    runmgr->SetUserInitialization(new DetectorConstruction(m_root_detelem));
+
+    for (auto fastsimname: m_fast_simtools) {
+        m_fast_simtools.push_back(fastsimname);
+    }
+
+    runmgr->SetUserInitialization(new DetectorConstruction(m_root_detelem, m_fast_simtools));
     // Physics List
     G4VUserPhysicsList *physicsList = nullptr;
     if (m_physics_lists_name.value() == "CEPC") {
diff --git a/Simulation/DetSimCore/src/DetSimAlg.h b/Simulation/DetSimCore/src/DetSimAlg.h
index 0f66b74c..86754631 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.h
+++ b/Simulation/DetSimCore/src/DetSimAlg.h
@@ -12,6 +12,7 @@
 #include <DetSimInterface/IG4PrimaryCnvTool.h>
 #include <DetSimInterface/IAnaElemTool.h>
 #include <DetSimInterface/IDetElemTool.h>
+#include <DetSimInterface/IFastSimG4Tool.h>
 
 class DetSimAlg: public Algorithm {
 public:
@@ -24,6 +25,7 @@ public:
 private:
     SmartIF<IDetSimSvc> m_detsimsvc;
     ToolHandleArray<IAnaElemTool> m_anaelemtools;
+    ToolHandleArray<IFastSimG4Tool> m_fast_simtools;
     ToolHandle<IDetElemTool> m_root_detelem;
     ToolHandle<IG4PrimaryCnvTool> m_prim_cnvtool{"G4PrimaryCnvTool", this};
 
@@ -36,6 +38,7 @@ private:
     Gaudi::Property<std::string> m_physics_lists_name{this, "PhysicsList", "QGSP_BERT"};
 
     Gaudi::Property<std::vector<std::string>> m_ana_elems{this, "AnaElems"};
+    Gaudi::Property<std::vector<std::string>> m_fast_simnames{this, "FastSimG4Tools"};
     Gaudi::Property<std::string> m_root_det_elem{this, "RootDetElem"};
 
 
diff --git a/Simulation/DetSimCore/src/DetectorConstruction.cpp b/Simulation/DetSimCore/src/DetectorConstruction.cpp
index 1f064351..2d94bbb8 100644
--- a/Simulation/DetSimCore/src/DetectorConstruction.cpp
+++ b/Simulation/DetSimCore/src/DetectorConstruction.cpp
@@ -25,8 +25,9 @@
 #include "G4ios.hh"
 
 
-DetectorConstruction::DetectorConstruction(ToolHandle<IDetElemTool>& root_elem) 
-    : m_root_detelem(root_elem) {
+DetectorConstruction::DetectorConstruction(ToolHandle<IDetElemTool>& root_elem,
+                                           ToolHandleArray<IFastSimG4Tool>& fast_simtools) 
+    : m_root_detelem(root_elem), m_fast_simtools(fast_simtools) {
 
 }
 
@@ -60,6 +61,13 @@ DetectorConstruction::Construct() {
                                                       false,           // no boolean operations
                                                       0);              // no field specific to volume
 
+    // =======================================================================
+    // Associate Fast Simulation Model and Regions
+    // =======================================================================
+    for (auto fastsimtool: m_fast_simtools) {
+        fastsimtool->CreateFastSimulationModel();
+    }
+
     return physiWorld;
 
 }
diff --git a/Simulation/DetSimCore/src/DetectorConstruction.h b/Simulation/DetSimCore/src/DetectorConstruction.h
index 3e211205..e8d992a3 100644
--- a/Simulation/DetSimCore/src/DetectorConstruction.h
+++ b/Simulation/DetSimCore/src/DetectorConstruction.h
@@ -3,6 +3,7 @@
 
 #include "GaudiKernel/ToolHandle.h"
 #include "DetSimInterface/IDetElemTool.h"
+#include "DetSimInterface/IFastSimG4Tool.h"
 
 #include "globals.hh"
 #include "G4VUserDetectorConstruction.hh"
@@ -16,7 +17,8 @@
 class DetectorConstruction: public G4VUserDetectorConstruction {
 
 public:
-    DetectorConstruction(ToolHandle<IDetElemTool>& root_elem);
+    DetectorConstruction(ToolHandle<IDetElemTool>& root_elem,
+                         ToolHandleArray<IFastSimG4Tool>& fast_simtools);
     ~DetectorConstruction();
 public:
     G4VPhysicalVolume* Construct() override;
@@ -24,6 +26,7 @@ public:
 
 private:
     ToolHandle<IDetElemTool>& m_root_detelem;
+    ToolHandleArray<IFastSimG4Tool>& m_fast_simtools;
 };
 
 #endif
diff --git a/Simulation/DetSimInterface/DetSimInterface/IFastSimG4Tool.h b/Simulation/DetSimInterface/DetSimInterface/IFastSimG4Tool.h
new file mode 100644
index 00000000..12d9c421
--- /dev/null
+++ b/Simulation/DetSimInterface/DetSimInterface/IFastSimG4Tool.h
@@ -0,0 +1,20 @@
+#ifndef IFastSimG4Tool_h
+#define IFastSimG4Tool_h
+
+// IFastSimG4Tool is to associate the G4Region and Fast simulation model in G4.
+// It is recommended to create one fast simulation model in one tool.
+// -- Tao Lin <lintao@ihep.ac.cn>, 7 Dec 2020
+
+#include "GaudiKernel/IAlgTool.h"
+
+class IFastSimG4Tool: virtual public IAlgTool {
+public:
+    DeclareInterfaceID(IFastSimG4Tool, 0, 1);
+
+    virtual ~IFastSimG4Tool() {}
+
+    // Build the association between G4Region and G4 Fast simulation model
+    virtual bool CreateFastSimulationModel() = 0;
+};
+
+#endif
-- 
GitLab