From 4a7c3ea27d68de0b7333b1bd4fac7cde364b6af3 Mon Sep 17 00:00:00 2001
From: lintao <lintao51@gmail.com>
Date: Sun, 8 Sep 2019 11:04:43 +0800
Subject: [PATCH] WIP: add an implementation of primary cnv tool.

---
 Simulation/DetSimCore/CMakeLists.txt             |  1 +
 Simulation/DetSimCore/src/DetSimAlg.cpp          |  6 +++++-
 Simulation/DetSimCore/src/DetSimAlg.h            |  2 ++
 Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp   | 11 +++++++++++
 Simulation/DetSimCore/src/G4PrimaryCnvTool.h     | 16 ++++++++++++++++
 .../DetSimCore/src/PrimaryGeneratorAction.cpp    |  8 +++++++-
 .../DetSimCore/src/PrimaryGeneratorAction.h      |  6 +++++-
 .../DetSimInterface/IG4PrimaryCnvTool.h          |  2 +-
 8 files changed, 48 insertions(+), 4 deletions(-)
 create mode 100644 Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp
 create mode 100644 Simulation/DetSimCore/src/G4PrimaryCnvTool.h

diff --git a/Simulation/DetSimCore/CMakeLists.txt b/Simulation/DetSimCore/CMakeLists.txt
index e25301fa..57f82000 100644
--- a/Simulation/DetSimCore/CMakeLists.txt
+++ b/Simulation/DetSimCore/CMakeLists.txt
@@ -14,6 +14,7 @@ set(DetSimCore_srcs
     src/DetSimSvc.cpp
     src/DetectorConstruction.cpp
     src/PrimaryGeneratorAction.cpp
+    src/G4PrimaryCnvTool.cpp
     src/ActionInitialization.cpp
     src/RunAction.cpp
     src/EventAction.cpp
diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp
index 34420d42..17385cf7 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.cpp
+++ b/Simulation/DetSimCore/src/DetSimAlg.cpp
@@ -54,7 +54,11 @@ DetSimAlg::initialize() {
     assert(physicsList);
     runmgr->SetUserInitialization(physicsList);
     // Primary Generator Action
-    runmgr->SetUserAction(new PrimaryGeneratorAction());
+    if (!m_prim_cnvtool) {
+        error() << "Failed to get the primary cnvtool." << endmsg;
+        return StatusCode::FAILURE;
+    }
+    runmgr->SetUserAction(new PrimaryGeneratorAction(m_prim_cnvtool));
 
     // User Actions
     for (auto anaelem: m_ana_elems.value()) {
diff --git a/Simulation/DetSimCore/src/DetSimAlg.h b/Simulation/DetSimCore/src/DetSimAlg.h
index ff484969..0f66b74c 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.h
+++ b/Simulation/DetSimCore/src/DetSimAlg.h
@@ -9,6 +9,7 @@
 #include <GaudiKernel/ToolHandle.h>
 
 #include <DetSimInterface/IDetSimSvc.h>
+#include <DetSimInterface/IG4PrimaryCnvTool.h>
 #include <DetSimInterface/IAnaElemTool.h>
 #include <DetSimInterface/IDetElemTool.h>
 
@@ -24,6 +25,7 @@ private:
     SmartIF<IDetSimSvc> m_detsimsvc;
     ToolHandleArray<IAnaElemTool> m_anaelemtools;
     ToolHandle<IDetElemTool> m_root_detelem;
+    ToolHandle<IG4PrimaryCnvTool> m_prim_cnvtool{"G4PrimaryCnvTool", this};
 
 private:
 
diff --git a/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp b/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp
new file mode 100644
index 00000000..4f34751e
--- /dev/null
+++ b/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp
@@ -0,0 +1,11 @@
+#include "G4PrimaryCnvTool.h"
+
+#include "G4Event.hh"
+
+DECLARE_COMPONENT(G4PrimaryCnvTool)
+
+bool G4PrimaryCnvTool::mutate(G4Event* anEvent) {
+
+
+    return true;
+}
diff --git a/Simulation/DetSimCore/src/G4PrimaryCnvTool.h b/Simulation/DetSimCore/src/G4PrimaryCnvTool.h
new file mode 100644
index 00000000..00c225a5
--- /dev/null
+++ b/Simulation/DetSimCore/src/G4PrimaryCnvTool.h
@@ -0,0 +1,16 @@
+#ifndef G4PrimaryCnvTool_h
+#define G4PrimaryCnvTool_h
+
+#include "GaudiKernel/AlgTool.h"
+#include "DetSimInterface/IG4PrimaryCnvTool.h"
+
+class G4PrimaryCnvTool: public extends<AlgTool, IG4PrimaryCnvTool> {
+public:
+
+    using extends::extends;
+
+    bool mutate(G4Event* anEvent) override;
+
+};
+
+#endif
diff --git a/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp b/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp
index 6454963b..067bd8ce 100644
--- a/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp
+++ b/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp
@@ -6,7 +6,9 @@
 #include "G4ParticleDefinition.hh"
 
 
-PrimaryGeneratorAction::PrimaryGeneratorAction() {
+PrimaryGeneratorAction::PrimaryGeneratorAction(ToolHandle<IG4PrimaryCnvTool>& cnvtool) 
+    : G4VUserPrimaryGeneratorAction(), 
+      tool(cnvtool) {
 
 }
 
@@ -17,6 +19,10 @@ PrimaryGeneratorAction::~PrimaryGeneratorAction() {
 void
 PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) {
     // Generate Vertex (G4PrimaryVertex) and Particle (G4PrimaryParticle).
+    if (tool) {
+        tool->mutate(anEvent);
+    }
+
 
     // Following is an example:
     double x = 0.0;
diff --git a/Simulation/DetSimCore/src/PrimaryGeneratorAction.h b/Simulation/DetSimCore/src/PrimaryGeneratorAction.h
index fa34d7a4..f8ac0ebe 100644
--- a/Simulation/DetSimCore/src/PrimaryGeneratorAction.h
+++ b/Simulation/DetSimCore/src/PrimaryGeneratorAction.h
@@ -1,17 +1,21 @@
 #ifndef PrimaryGeneratorAction_h
 #define PrimaryGeneratorAction_h
 
+#include <GaudiKernel/ToolHandle.h>
 #include "G4VUserPrimaryGeneratorAction.hh"
+#include <DetSimInterface/IG4PrimaryCnvTool.h>
 
 class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction
 {
 public:
-  PrimaryGeneratorAction();
+  PrimaryGeneratorAction(ToolHandle<IG4PrimaryCnvTool>& cnvtool);
   ~PrimaryGeneratorAction();
 
 public:
   void GeneratePrimaries(G4Event* anEvent);
 
+private:
+  ToolHandle<IG4PrimaryCnvTool> tool;
 };
 
 #endif
diff --git a/Simulation/DetSimInterface/DetSimInterface/IG4PrimaryCnvTool.h b/Simulation/DetSimInterface/DetSimInterface/IG4PrimaryCnvTool.h
index 83caf9d5..3eba505c 100644
--- a/Simulation/DetSimInterface/DetSimInterface/IG4PrimaryCnvTool.h
+++ b/Simulation/DetSimInterface/DetSimInterface/IG4PrimaryCnvTool.h
@@ -16,7 +16,7 @@ public:
 
     virtual ~IG4PrimaryCnvTool() {};
 
-    virtual mutate(G4Event* anEvent) = 0;
+    virtual bool mutate(G4Event* anEvent) = 0;
 };
 
 #endif
-- 
GitLab