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