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