diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp index 17385cf701b1a40ce8370d7c86d17ae8c325e668..f07eaf5ebbacf369c9d7bbf7b245d171bd7be05c 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 0f66b74ccc89b9dc0d4d65f3bb590914d2ec249a..86754631d96ac78cec77510f1b75ba9bcf55983b 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 1f06435134761a8c0c14f3f9627396e166eaf51b..2d94bbb8eb773bc4ef4f31fd6c2d3524cce165df 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 3e211205f782d3501addbb0ef055cd6383d0dd15..e8d992a30abc0caafe6afdcb75f457f9a66f80f4 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 0000000000000000000000000000000000000000..12d9c421f3a06f1fc4b2637e5284c3373cba471a --- /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