From c172e8671c7003aaf1d57ec1967b5d48b99b6c04 Mon Sep 17 00:00:00 2001
From: lintao <lintao51@gmail.com>
Date: Fri, 9 Aug 2019 14:09:29 +0800
Subject: [PATCH] Add a dummy Primary Generator Action.

---
 Simulation/DetSimCore/CMakeLists.txt          |  1 +
 Simulation/DetSimCore/src/DetSimAlg.cpp       |  8 ++--
 .../DetSimCore/src/PrimaryGeneratorAction.cpp | 42 +++++++++++++++++++
 .../DetSimCore/src/PrimaryGeneratorAction.h   | 18 ++++++++
 4 files changed, 66 insertions(+), 3 deletions(-)
 create mode 100644 Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp
 create mode 100644 Simulation/DetSimCore/src/PrimaryGeneratorAction.h

diff --git a/Simulation/DetSimCore/CMakeLists.txt b/Simulation/DetSimCore/CMakeLists.txt
index f8a022fa..5ed403b8 100644
--- a/Simulation/DetSimCore/CMakeLists.txt
+++ b/Simulation/DetSimCore/CMakeLists.txt
@@ -11,6 +11,7 @@ include(${Geant4_USE_FILE})
 set(DetSimCore_srcs
     src/DetSimAlg.cpp
     src/DetectorConstruction.cpp
+    src/PrimaryGeneratorAction.cpp
 )
 
 gaudi_add_module(DetSimCore ${DetSimCore_srcs}
diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp
index d7b29b32..a5b44538 100644
--- a/Simulation/DetSimCore/src/DetSimAlg.cpp
+++ b/Simulation/DetSimCore/src/DetSimAlg.cpp
@@ -6,6 +6,7 @@
 
 #include "G4PhysListFactory.hh"
 
+#include "PrimaryGeneratorAction.h"
 
 DECLARE_COMPONENT(DetSimAlg)
 
@@ -33,8 +34,9 @@ DetSimAlg::initialize() {
         return StatusCode::FAILURE;
     }
 
+    // Detector Construction
     runmgr->SetUserInitialization(new DetectorConstruction());
-
+    // Physics List
     G4VUserPhysicsList *physicsList = nullptr;
     if (m_physics_lists_name.value() == "CEPC") {
 
@@ -44,8 +46,8 @@ DetSimAlg::initialize() {
     }
     assert(physicsList);
     runmgr->SetUserInitialization(physicsList);
-
-    runmgr->SetUserAction((G4VUserPrimaryGeneratorAction*)0);
+    // Primary Generator Action
+    runmgr->SetUserAction(new PrimaryGeneratorAction());
 
     // after set up the user initialization and user actions, start the initialization.
     m_detsimsvc->initializeRM();
diff --git a/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp b/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp
new file mode 100644
index 00000000..6454963b
--- /dev/null
+++ b/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp
@@ -0,0 +1,42 @@
+#include "PrimaryGeneratorAction.h"
+
+#include "G4Event.hh"
+#include "G4ParticleTable.hh"
+#include "G4IonTable.hh"
+#include "G4ParticleDefinition.hh"
+
+
+PrimaryGeneratorAction::PrimaryGeneratorAction() {
+
+}
+
+PrimaryGeneratorAction::~PrimaryGeneratorAction() {
+
+}
+
+void
+PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) {
+    // Generate Vertex (G4PrimaryVertex) and Particle (G4PrimaryParticle).
+
+    // Following is an example:
+    double x = 0.0;
+    double y = 0.0;
+    double z = 0.0;
+    double t = 0.0;
+    G4PrimaryVertex* g4vtx = new G4PrimaryVertex(x, y, z, t);
+
+
+    G4int pdgcode = 22;
+    // check the pdgid
+    G4ParticleTable* particletbl = G4ParticleTable::GetParticleTable();
+    G4ParticleDefinition* particle_def = particletbl->FindParticle(pdgcode);
+
+    double px = 0.0;
+    double py = 0.0;
+    double pz = 0.0;
+    G4PrimaryParticle* g4prim=new G4PrimaryParticle(particle_def, px, py, pz);
+    g4vtx->SetPrimary(g4prim);
+
+    anEvent->AddPrimaryVertex(g4vtx);
+}
+
diff --git a/Simulation/DetSimCore/src/PrimaryGeneratorAction.h b/Simulation/DetSimCore/src/PrimaryGeneratorAction.h
new file mode 100644
index 00000000..fa34d7a4
--- /dev/null
+++ b/Simulation/DetSimCore/src/PrimaryGeneratorAction.h
@@ -0,0 +1,18 @@
+#ifndef PrimaryGeneratorAction_h
+#define PrimaryGeneratorAction_h
+
+#include "G4VUserPrimaryGeneratorAction.hh"
+
+class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction
+{
+public:
+  PrimaryGeneratorAction();
+  ~PrimaryGeneratorAction();
+
+public:
+  void GeneratePrimaries(G4Event* anEvent);
+
+};
+
+#endif
+
-- 
GitLab