From c158b73a45a8d804151874c41e66b9adb105c05c Mon Sep 17 00:00:00 2001 From: lintao <lintao51@gmail.com> Date: Fri, 9 Aug 2019 16:00:42 +0800 Subject: [PATCH] WIP: a dummpy script. --- Examples/options/tut_detsim.py | 14 +++++ Simulation/DetSimCore/CMakeLists.txt | 1 + Simulation/DetSimCore/src/DetSimAlg.cpp | 48 ++++++++++++++++- Simulation/DetSimCore/src/DetSimSvc.cpp | 70 +++++++++++++++++++++++++ Simulation/DetSimCore/src/DetSimSvc.h | 30 +++++++++++ 5 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 Examples/options/tut_detsim.py create mode 100644 Simulation/DetSimCore/src/DetSimSvc.cpp create mode 100644 Simulation/DetSimCore/src/DetSimSvc.h diff --git a/Examples/options/tut_detsim.py b/Examples/options/tut_detsim.py new file mode 100644 index 00000000..f5308213 --- /dev/null +++ b/Examples/options/tut_detsim.py @@ -0,0 +1,14 @@ +/run/initialize +/vis/initialize +/vis/open OGL +# +####/vis/open OGLSXm +####/vis/open HepRepXML +# +#/vis/open DAWNFILE +# +# draw scene +# +/vis/drawVolume worlds +/tracking/storeTrajectory 1 +/vis/scene/add/trajectories diff --git a/Simulation/DetSimCore/CMakeLists.txt b/Simulation/DetSimCore/CMakeLists.txt index 5ed403b8..2b292797 100644 --- a/Simulation/DetSimCore/CMakeLists.txt +++ b/Simulation/DetSimCore/CMakeLists.txt @@ -10,6 +10,7 @@ include(${Geant4_USE_FILE}) set(DetSimCore_srcs src/DetSimAlg.cpp + src/DetSimSvc.cpp src/DetectorConstruction.cpp src/PrimaryGeneratorAction.cpp ) diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp index a5b44538..8be8d269 100644 --- a/Simulation/DetSimCore/src/DetSimAlg.cpp +++ b/Simulation/DetSimCore/src/DetSimAlg.cpp @@ -5,7 +5,9 @@ #include "DetectorConstruction.h" #include "G4PhysListFactory.hh" - +#include "G4UImanager.hh" +#include "G4VisExecutive.hh" +#include "G4UIExecutive.hh" #include "PrimaryGeneratorAction.h" DECLARE_COMPONENT(DetSimAlg) @@ -49,6 +51,50 @@ DetSimAlg::initialize() { // Primary Generator Action runmgr->SetUserAction(new PrimaryGeneratorAction()); + // Vis Mac + bool hasVis = false; + G4VisManager* visManager = nullptr; + G4UIExecutive* ui = nullptr; + if (not m_vis_macs.value().empty()) { + hasVis = true; + info() << "Start Geant4 Visualization." << endmsg; + // initialize Vis + visManager = new G4VisExecutive; + char* argv[1] = {"geant4Vis"}; + ui = new G4UIExecutive(1,argv); + } + for (auto vismac: m_vis_macs.value()) { + G4UImanager *UImanager = G4UImanager::GetUIpointer(); + std::string command = "/control/execute "; + UImanager->ApplyCommand( command + vismac); + } + + // Run Mac & Run Cmds + for (auto runmac: m_run_macs.value()) { + G4UImanager *UImanager = G4UImanager::GetUIpointer(); + std::string command = "/control/execute "; + UImanager->ApplyCommand( command + runmac); + } + for (auto runcmd: m_run_cmds.value()) { + G4UImanager *UImanager = G4UImanager::GetUIpointer(); + UImanager->ApplyCommand(runcmd); + } + + // if has vis, we stop here + if (hasVis) { + + ui->SessionStart(); + + delete ui; + delete visManager; + + // fixme: how to stop the run? + return StatusCode::FAILURE; + } + + // Initialize G4 Kernel + runmgr->Initialize(); + // after set up the user initialization and user actions, start the initialization. m_detsimsvc->initializeRM(); diff --git a/Simulation/DetSimCore/src/DetSimSvc.cpp b/Simulation/DetSimCore/src/DetSimSvc.cpp new file mode 100644 index 00000000..dd26f3bb --- /dev/null +++ b/Simulation/DetSimCore/src/DetSimSvc.cpp @@ -0,0 +1,70 @@ +#include "DetSimSvc.h" + +#include "G4RunManager.hh" + +DECLARE_COMPONENT(DetSimSvc) + +DetSimSvc::DetSimSvc(const std::string& name, ISvcLocator* svc) +: base_class(name, svc) { + m_runmgr = nullptr; +} + +DetSimSvc::~DetSimSvc() { + +} + +G4RunManager* +DetSimSvc::getRM() { + return m_runmgr; +} + +StatusCode +DetSimSvc::initializeRM() { + StatusCode sc; + + + G4bool cond = m_runmgr->ConfirmBeamOnCondition(); + if(!cond) { + return StatusCode::FAILURE; + } + + m_runmgr->ConstructScoringWorlds(); + m_runmgr->RunInitialization(); + + return sc; +} + +StatusCode +DetSimSvc::simulateEvent(int i_event) { + StatusCode sc; + + m_runmgr->ProcessOneEvent(i_event); + + return sc; +} + +StatusCode +DetSimSvc::finalizeRM() { + StatusCode sc; + + m_runmgr->RunTermination(); + + return sc; +} + +StatusCode +DetSimSvc::initialize() { + StatusCode sc; + + m_runmgr = new G4RunManager(); + + return sc; +} + +StatusCode +DetSimSvc::finalize() { + StatusCode sc; + delete m_runmgr; + + return sc; +} diff --git a/Simulation/DetSimCore/src/DetSimSvc.h b/Simulation/DetSimCore/src/DetSimSvc.h new file mode 100644 index 00000000..b910a6da --- /dev/null +++ b/Simulation/DetSimCore/src/DetSimSvc.h @@ -0,0 +1,30 @@ +#ifndef DetSimSvc_h +#define DetSimSvc_h + +#include "DetSimInterface/IDetSimSvc.h" +#include <GaudiKernel/Service.h> + +class DetSimSvc: public extends<Service, IDetSimSvc> { +public: + + DetSimSvc(const std::string& name, ISvcLocator* svc ); + ~DetSimSvc(); + + // Get the Run Manager + G4RunManager* getRM() override; + + // Control the run manager directly. + StatusCode initializeRM() override; + StatusCode simulateEvent(int i_event) override; + StatusCode finalizeRM() override; + + StatusCode initialize() override; + StatusCode finalize() override; + +private: + G4RunManager* m_runmgr; + +}; + + +#endif -- GitLab