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