From 535efcab734639d3c8232ceb32f596fc1ae3fa29 Mon Sep 17 00:00:00 2001
From: Wouter Deconinck <wdconinc@gmail.com>
Date: Tue, 21 Sep 2021 16:52:10 -0500
Subject: [PATCH] Geant4IsotropeGenerator::getParticleMomentumUniform(double&
 momentum)

---
 DDG4/include/DDG4/Geant4IsotropeGenerator.h |  6 +++++
 DDG4/src/Geant4IsotropeGenerator.cpp        | 28 ++++++++++++++++++---
 2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/DDG4/include/DDG4/Geant4IsotropeGenerator.h b/DDG4/include/DDG4/Geant4IsotropeGenerator.h
index 5bf0164b6..084ba36a8 100644
--- a/DDG4/include/DDG4/Geant4IsotropeGenerator.h
+++ b/DDG4/include/DDG4/Geant4IsotropeGenerator.h
@@ -40,6 +40,10 @@ namespace dd4hep {
       double      m_thetaMin;
       /// Property: Maximal theta angular value
       double      m_thetaMax;
+      /// Property: Minimal momentum value
+      double      m_momentumMin;
+      /// Property: Maximal momentum value
+      double      m_momentumMax;
       
       /// Particle modification. Caller presets defaults to: ( direction = m_direction, momentum = m_energy)
       /** Use this function to implement isotrop guns, multiple guns etc. 
@@ -54,6 +58,8 @@ namespace dd4hep {
       void getParticleDirectionCosTheta(int num, ROOT::Math::XYZVector& direction, double& momentum) const;
       /// Uniform particle distribution
       void getParticleDirectionUniform(int num, ROOT::Math::XYZVector& direction, double& momentum) const;
+      /// Uniform particle momentum
+      void getParticleMomentumUniform(double& momentum) const;
 
     public:
       /// Inhibit default constructor
diff --git a/DDG4/src/Geant4IsotropeGenerator.cpp b/DDG4/src/Geant4IsotropeGenerator.cpp
index 54588aafd..24f6176ce 100644
--- a/DDG4/src/Geant4IsotropeGenerator.cpp
+++ b/DDG4/src/Geant4IsotropeGenerator.cpp
@@ -29,6 +29,8 @@ Geant4IsotropeGenerator::Geant4IsotropeGenerator(Geant4Context* ctxt, const stri
   declareProperty("PhiMax", m_phiMax = 2.0*M_PI);
   declareProperty("ThetaMin", m_thetaMin = 0.0);
   declareProperty("ThetaMax", m_thetaMax = M_PI);
+  declareProperty("MomentumMin", m_momentumMin =  0.0);
+  declareProperty("MomentumMax", m_momentumMax = -1.0);
   declareProperty("Distribution", m_distribution = "uniform" );
 }
 
@@ -37,6 +39,16 @@ Geant4IsotropeGenerator::~Geant4IsotropeGenerator() {
   InstanceCount::decrement(this);
 }
 
+/// Uniform momentum distribution
+void Geant4IsotropeGenerator::getParticleMomentumUniform(double& momentum) const  {
+  Geant4Event&  evt = context()->event();
+  Geant4Random& rnd = evt.random();
+  if (m_momentumMax < m_momentumMin)
+    momentum = m_momentumMin+(momentum-m_momentumMin)*rnd.rndm();
+  else
+    momentum = m_momentumMin+(m_momentumMax-m_momentumMin)*rnd.rndm();
+}
+
 /// Uniform particle distribution
 void Geant4IsotropeGenerator::getParticleDirectionUniform(int, ROOT::Math::XYZVector& direction, double& momentum) const   {
   Geant4Event&  evt = context()->event();
@@ -48,7 +60,7 @@ void Geant4IsotropeGenerator::getParticleDirectionUniform(int, ROOT::Math::XYZVe
   double x3 = std::cos(theta);
 
   direction.SetXYZ(x1,x2,x3);
-  momentum = rnd.rndm()*momentum;
+  getParticleMomentumUniform(momentum);
 }
 
 /// Particle distribution ~ cos(theta)
@@ -63,7 +75,10 @@ void Geant4IsotropeGenerator::getParticleDirectionCosTheta(int, ROOT::Math::XYZV
   double x3 = cos_theta;
 
   direction.SetXYZ(x1,x2,x3);
-  momentum = rnd.rndm()*momentum;
+  if (m_momentumMax < m_momentumMin)
+    momentum = m_momentumMin+(momentum-m_momentumMin)*rnd.rndm();
+  else
+    momentum = m_momentumMin+(m_momentumMax-m_momentumMin)*rnd.rndm();
 }
 
 /// Particle distribution flat in eta (pseudo rapidity)
@@ -84,7 +99,10 @@ void Geant4IsotropeGenerator::getParticleDirectionEta(int, ROOT::Math::XYZVector
   double x3         = std::sinh(eta);
   double r          = std::sqrt(1.0+x3*x3);
   direction.SetXYZ(x1/r,x2/r,x3/r);
-  momentum = rnd.rndm()*momentum;
+  if (m_momentumMax < m_momentumMin)
+    momentum = m_momentumMin+(momentum-m_momentumMin)*rnd.rndm();
+  else
+    momentum = m_momentumMin+(m_momentumMax-m_momentumMin)*rnd.rndm();
 }
 
 /// e+e- --> ffbar particle distribution ~ 1 + cos^2(theta)
@@ -110,6 +128,10 @@ void Geant4IsotropeGenerator::getParticleDirectionFFbar(int, ROOT::Math::XYZVect
       double x2 = std::sin(theta)*std::sin(phi);
       double x3 = std::cos(theta);
       direction.SetXYZ(x1,x2,x3);
+      if (m_momentumMax < m_momentumMin)
+        momentum = m_momentumMin+(momentum-m_momentumMin)*rnd.rndm();
+      else
+        momentum = m_momentumMin+(m_momentumMax-m_momentumMin)*rnd.rndm();
       momentum = rnd.rndm()*momentum;
       return;
     }
-- 
GitLab