From 391b85bc673ac3cf759c23f616abd84b44fd2a8e Mon Sep 17 00:00:00 2001
From: lintao <lintao51@gmail.com>
Date: Fri, 16 Oct 2020 18:22:58 +0800
Subject: [PATCH] WIP: support custom position in particle gun.

---
 Examples/options/tut_detsim_SDT.py            |  6 ++++
 Generator/src/GtGunTool.cpp                   | 29 ++++++++++++++++++-
 Generator/src/GtGunTool.h                     |  5 ++++
 .../DetSimCore/src/G4PrimaryCnvTool.cpp       |  7 +++++
 4 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/Examples/options/tut_detsim_SDT.py b/Examples/options/tut_detsim_SDT.py
index 8d490193..5510a6d9 100644
--- a/Examples/options/tut_detsim_SDT.py
+++ b/Examples/options/tut_detsim_SDT.py
@@ -64,6 +64,12 @@ gun = GtGunTool("GtGunTool")
 # gun.EnergyMaxs = [100.] # GeV
 
 gun.Particles = ["e-"]
+
+# gun.PositionXs = [100.] # mm
+# gun.PositionYs = [100.] # mm
+# gun.PositionZs = [0.] # mm
+
+
 gun.EnergyMins = [1.] # GeV
 gun.EnergyMaxs = [1.] # GeV
 
diff --git a/Generator/src/GtGunTool.cpp b/Generator/src/GtGunTool.cpp
index df29f4a2..7ff4dab0 100644
--- a/Generator/src/GtGunTool.cpp
+++ b/Generator/src/GtGunTool.cpp
@@ -15,7 +15,25 @@ GtGunTool::initialize() {
         error() << "Please specify the list of particle names/pdgs" << endmsg;
         return StatusCode::FAILURE;
     }
+
+    // Position
+    if (m_positionXs.value().size()
+        && m_positionXs.value().size() != m_particles.value().size()) {
+        error() << "Mismatched PositionXs and particles." << endmsg;
+        return StatusCode::FAILURE;
+    }
+    if (m_positionYs.value().size()
+        && m_positionYs.value().size() != m_particles.value().size()) {
+        error() << "Mismatched PositionYs and particles." << endmsg;
+        return StatusCode::FAILURE;
+    }
+    if (m_positionZs.value().size()
+        && m_positionZs.value().size() != m_particles.value().size()) {
+        error() << "Mismatched PositionZs and particles." << endmsg;
+        return StatusCode::FAILURE;
+    }
     
+    // Energy
     if (m_energymins.value().size() != m_particles.value().size()) {
         error() << "Mismatched energies and particles." << endmsg;
         return StatusCode::FAILURE;
@@ -89,7 +107,16 @@ GtGunTool::mutate(MyHepMC::GenEvent& event) {
         // mcp.setCharge();
         mcp.setTime(0.0);
         mcp.setMass(mass);
-        // mcp.setVertex(); 
+
+        // Unit is mm
+        double x = 0;
+        double y = 0;
+        double z = 0;
+        if (i<m_positionXs.value().size()) { x = m_positionXs.value()[i]; }
+        if (i<m_positionYs.value().size()) { y = m_positionYs.value()[i]; }
+        if (i<m_positionZs.value().size()) { z = m_positionZs.value()[i]; }
+
+        mcp.setVertex(edm4hep::Vector3d(x,y,z)); 
         // mcp.setEndpoint();
 
         // assume energy is momentum
diff --git a/Generator/src/GtGunTool.h b/Generator/src/GtGunTool.h
index 388c14d4..0c62f4c3 100644
--- a/Generator/src/GtGunTool.h
+++ b/Generator/src/GtGunTool.h
@@ -34,6 +34,11 @@ private:
 
     Gaudi::Property<std::vector<std::string>> m_particles{this, "Particles"};
 
+    Gaudi::Property<std::vector<double>> m_positionXs{this, "PositionXs"};
+    Gaudi::Property<std::vector<double>> m_positionYs{this, "PositionYs"};
+    Gaudi::Property<std::vector<double>> m_positionZs{this, "PositionZs"};
+
+
     Gaudi::Property<std::vector<double>> m_energymins{this, "EnergyMins"};
     Gaudi::Property<std::vector<double>> m_energymaxs{this, "EnergyMaxs"};
 
diff --git a/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp b/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp
index d725aa27..51c5f914 100644
--- a/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp
+++ b/Simulation/DetSimCore/src/G4PrimaryCnvTool.cpp
@@ -30,6 +30,13 @@ bool G4PrimaryCnvTool::mutate(G4Event* anEvent) {
                                                      vertex.y*CLHEP::mm,
                                                      vertex.z*CLHEP::mm,
                                                      t);
+
+        info() << "Geant4 Primary Vertex: ("
+               << vertex.x*CLHEP::mm << ","
+               << vertex.y*CLHEP::mm << ","
+               << vertex.z*CLHEP::mm << ")"
+               << endmsg;
+
         // pdg/particle
         int pdgcode = p.getPDG();
         G4ParticleTable* particletbl = G4ParticleTable::GetParticleTable();
-- 
GitLab