diff --git a/Detector/DetDriftChamber/compact/det.xml b/Detector/DetDriftChamber/compact/det.xml index f588fd48c9811cde95ae3577cc4991f6875b9e93..12b998b8ec54422c0602ca30dc514c8ff323d43b 100644 --- a/Detector/DetDriftChamber/compact/det.xml +++ b/Detector/DetDriftChamber/compact/det.xml @@ -50,8 +50,13 @@ <vis name="VisibleGreen" alpha="1.0" r="0.0" g="1.0" b="0.0" drawingStyle="solid" lineStyle="solid" showDaughters="true" visible="true"/> </display> + <regions> + <region name="DriftChamberRegion"> + </region> + </regions> + <detectors> - <detector id="1" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="VisibleBlue" sensitive="true"> + <detector id="1" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="VisibleBlue" sensitive="true" region="DriftChamberRegion"> <envelope vis="SeeThrough"> <shape type="BooleanShape" operation="Union" material="Air"> <shape type="Tube" rmin="SDT_inner_chamber_radius_min" rmax="SDT_inner_chamber_radius_max" dz="SDT_half_length" /> diff --git a/Detector/DetSegmentation/src/GridDriftChamber.cpp b/Detector/DetSegmentation/src/GridDriftChamber.cpp index 991f42a816953224c8138a488885983e3739d901..d4facaaea91861aea6166c8d117d8823178f3b4f 100644 --- a/Detector/DetSegmentation/src/GridDriftChamber.cpp +++ b/Detector/DetSegmentation/src/GridDriftChamber.cpp @@ -56,13 +56,13 @@ CellID GridDriftChamber::cellID(const Vector3D& /*localPosition*/, const Vector3 _decoder->set(cID, m_phiID, lphi); -//std::cout << "#######################################: " -// << " offset : " << m_offset -// << " offsetphi: " << offsetphi -// << " layerID: " << layerID -// << " r: " << _currentRadius -// << " layerphi: " << _currentLayerphi -// << std::endl; +// std::cout << "#######################################: " +// << " offset : " << m_offset +// << " offsetphi: " << offsetphi +// << " layerID: " << layerID +// << " r: " << _currentRadius +// << " layerphi: " << _currentLayerphi +// << std::endl; return cID; } diff --git a/Examples/options/tut_detsim_SDT.py b/Examples/options/tut_detsim_SDT.py index 779454ac323fdd87a20415dd3e3193dfbf643b14..4aa215871c5357e1ba5099a9d73ef7327b817cbc 100644 --- a/Examples/options/tut_detsim_SDT.py +++ b/Examples/options/tut_detsim_SDT.py @@ -117,6 +117,13 @@ if int(os.environ.get("VIS", 0)): detsimalg.RunCmds = [ # "/tracking/verbose 1", ] + +from Configurables import DummyFastSimG4Tool +dummy_fastsim_tool = DummyFastSimG4Tool("DummyFastSimG4Tool") + +detsimalg.FastSimG4Tools = [ + "DummyFastSimG4Tool" +] detsimalg.AnaElems = [ # example_anatool.name() # "ExampleAnaElemTool" diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp index 17385cf701b1a40ce8370d7c86d17ae8c325e668..31583d82135590f33f4ed712740df02505d8199e 100644 --- a/Simulation/DetSimCore/src/DetSimAlg.cpp +++ b/Simulation/DetSimCore/src/DetSimAlg.cpp @@ -10,6 +10,9 @@ #include "DetectorConstruction.h" #include "G4PhysListFactory.hh" +#include "G4EmParameters.hh" +#include "G4StepLimiterPhysics.hh" +#include "G4FastSimulationPhysics.hh" #include "PrimaryGeneratorAction.h" #include "ActionInitialization.h" @@ -42,14 +45,37 @@ 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_simnames) { + info() << "Fast Sim Tool: " << fastsimname << endmsg; + 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") { } else { G4PhysListFactory *physListFactory = new G4PhysListFactory(); - physicsList = physListFactory->GetReferencePhysList(m_physics_lists_name.value()); + G4VModularPhysicsList* modularPhysicsList = physListFactory->GetReferencePhysList(m_physics_lists_name.value()); + + // PAI model + G4EmParameters::Instance()->AddPAIModel("all","DriftChamberRegion","pai"); + // G4EmParameters::Instance()->AddPAIModel("all","DriftChamberRegion","pai_photon"); + + // register addition physics list + modularPhysicsList->RegisterPhysics(new G4StepLimiterPhysics()); + + // register fastsim physics + G4FastSimulationPhysics* fastsim_physics = new G4FastSimulationPhysics(); + fastsim_physics->BeVerbose(); + fastsim_physics->ActivateFastSimulation("e-"); + fastsim_physics->ActivateFastSimulation("e+"); + fastsim_physics->ActivateFastSimulation("gamma"); + modularPhysicsList->RegisterPhysics(fastsim_physics); + + physicsList = modularPhysicsList; } assert(physicsList); runmgr->SetUserInitialization(physicsList); 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..fb3bbb131afbbfefa6e1bbb5dfa1cc853f37c1c9 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,15 @@ DetectorConstruction::Construct() { false, // no boolean operations 0); // no field specific to volume + // ======================================================================= + // Associate Fast Simulation Model and Regions + // ======================================================================= + for (auto fastsimtool: m_fast_simtools) { + G4cout << "Invoke CreateFastSimulationModel of fastsimtool instance " + << m_fast_simtools << G4endl; + 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/DetSimFastModel/CMakeLists.txt b/Simulation/DetSimFastModel/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..3f968544a0953d2def1653b6d176c4992a65bd7b --- /dev/null +++ b/Simulation/DetSimFastModel/CMakeLists.txt @@ -0,0 +1,24 @@ +gaudi_subdir(DetSimFastModel v0r0) + +gaudi_depends_on_subdirs( + k4FWCore + Simulation/DetSimInterface +) + +find_package(Geant4 REQUIRED ui_all vis_all) +include(${Geant4_USE_FILE}) +find_package(DD4hep COMPONENTS DDG4 REQUIRED) + +set(DetSimFastModel_srcs + src/DummyFastSimG4Tool.cpp + src/DummyFastSimG4Model.cpp +) + +gaudi_add_module(DetSimFastModel ${DetSimFastModel_srcs} + INCLUDE_DIRS + LINK_LIBRARIES + DD4hep + ${DD4hep_COMPONENT_LIBRARIES} + GaudiKernel +) + diff --git a/Simulation/DetSimFastModel/src/DummyFastSimG4Model.cpp b/Simulation/DetSimFastModel/src/DummyFastSimG4Model.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0e7f7da425a2c8af576b2c69e8a8198ada98c03e --- /dev/null +++ b/Simulation/DetSimFastModel/src/DummyFastSimG4Model.cpp @@ -0,0 +1,37 @@ +#include "DummyFastSimG4Model.h" + +#include "G4Track.hh" +#include "G4FastTrack.hh" + +DummyFastSimG4Model::DummyFastSimG4Model(G4String aModelName, G4Region* aEnvelope) + : G4VFastSimulationModel(aModelName, aEnvelope) { + +} + +DummyFastSimG4Model::~DummyFastSimG4Model() { + +} + +G4bool DummyFastSimG4Model::IsApplicable(const G4ParticleDefinition& aParticle) { + return aParticle.GetPDGCharge() != 0; +} + +G4bool DummyFastSimG4Model::ModelTrigger(const G4FastTrack& aFastTrack) { + // G4cout << __FILE__ << __LINE__ << ": ModelTrigger." << G4endl; + + bool istrigged = false; + + // only select the secondaries + const G4Track* track = aFastTrack.GetPrimaryTrack(); + // secondaries + if (track->GetParentID() != 0) { + istrigged = true; + } + return istrigged; +} + +void DummyFastSimG4Model::DoIt(const G4FastTrack& aFastTrack, G4FastStep& aFastStep) { + // G4cout << __FILE__ << __LINE__ << ": DoIt." << G4endl; + + aFastStep.ProposeTrackStatus(fStopAndKill); +} diff --git a/Simulation/DetSimFastModel/src/DummyFastSimG4Model.h b/Simulation/DetSimFastModel/src/DummyFastSimG4Model.h new file mode 100644 index 0000000000000000000000000000000000000000..fca5093f8574d8529df72b9e74e0bcbcdcc4414a --- /dev/null +++ b/Simulation/DetSimFastModel/src/DummyFastSimG4Model.h @@ -0,0 +1,19 @@ +#ifndef DummyFastSimG4Model_h +#define DummyFastSimG4Model_h + +#include "G4VFastSimulationModel.hh" + +class DummyFastSimG4Model: public G4VFastSimulationModel { +public: + + DummyFastSimG4Model(G4String aModelName, G4Region* aEnvelope); + ~DummyFastSimG4Model(); + + virtual G4bool IsApplicable( const G4ParticleDefinition& aParticle ); + virtual G4bool ModelTrigger( const G4FastTrack& aFastTrack ); + virtual void DoIt( const G4FastTrack& aFastTrack, G4FastStep& aFastStep ); + +}; + +#endif + diff --git a/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.cpp b/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.cpp new file mode 100644 index 0000000000000000000000000000000000000000..47420ae38d180150f29e5ed9f65edfb4ccf1d612 --- /dev/null +++ b/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.cpp @@ -0,0 +1,40 @@ +#include "DummyFastSimG4Tool.h" + +#include "G4Region.hh" +#include "G4RegionStore.hh" + +#include "G4VFastSimulationModel.hh" +#include "DummyFastSimG4Model.h" + +DECLARE_COMPONENT(DummyFastSimG4Tool); + +StatusCode DummyFastSimG4Tool::initialize() { + StatusCode sc; + + return sc; +} + +StatusCode DummyFastSimG4Tool::finalize() { + StatusCode sc; + + return sc; +} + +bool DummyFastSimG4Tool::CreateFastSimulationModel() { + // In this method: + // * Retrieve the G4Region + // * Create Model + // * Associate model and region + + G4String model_name = "DummyFastSimG4Model"; + G4String region_name = "DriftChamberRegion"; + G4Region* aEnvelope = G4RegionStore::GetInstance()->GetRegion(region_name); + if (!aEnvelope) { + error() << "Failed to find G4Region '" << region_name << "'" << endmsg; + return false; + } + + DummyFastSimG4Model* model = new DummyFastSimG4Model(model_name, aEnvelope); + info() << "Create Model " << model_name << " for G4Region " << region_name << endmsg; + return true; +} diff --git a/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.h b/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.h new file mode 100644 index 0000000000000000000000000000000000000000..2254d892cacce2110bf5ed61ebf4cde234480acb --- /dev/null +++ b/Simulation/DetSimFastModel/src/DummyFastSimG4Tool.h @@ -0,0 +1,20 @@ +#ifndef DummyFastSimG4Tool_h +#define DummyFastSimG4Tool_h + +#include "GaudiKernel/AlgTool.h" +#include "DetSimInterface/IFastSimG4Tool.h" + +class DummyFastSimG4Tool: public extends<AlgTool, IFastSimG4Tool> { +public: + using extends::extends; + + StatusCode initialize() override; + StatusCode finalize() override; + + bool CreateFastSimulationModel() override; + +private: + +}; + +#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