From a81eb106b10dad089fe4ab5f173e696d3d0a720e Mon Sep 17 00:00:00 2001
From: Carl Gwilliam <gwilliam@hep.ph.liv.ac.uk>
Date: Thu, 28 Apr 2022 17:42:49 +0100
Subject: [PATCH] Add energy cut into Fluka reader

---
 .../FlukaReader/python/FlukaReaderAlg.py      | 27 +++++++++++++++----
 1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/Generators/FlukaReader/python/FlukaReaderAlg.py b/Generators/FlukaReader/python/FlukaReaderAlg.py
index b54aa07a..3a8728e3 100644
--- a/Generators/FlukaReader/python/FlukaReaderAlg.py
+++ b/Generators/FlukaReader/python/FlukaReaderAlg.py
@@ -36,7 +36,8 @@ class FlukaReader(EvgenAlg):
 
         if self.test:
             self.before = dict(zip(self.columns, [[] for i in range(len(self.columns))]))
-            self.after = dict(zip(self.columns, [[] for i in range(len(self.columns))]))                           
+            self.after = dict(zip(self.columns, [[] for i in range(len(self.columns))]))
+
                
         return
 
@@ -153,6 +154,8 @@ class FlukaReader(EvgenAlg):
         thetaX = self.angle(cosThetaX)
         
         xout = np.copy(x)
+        if xout.ndim == 0:
+            xout = float(xout)
         
         # Add displacement due to initial angle
         #xang = z * np.tan(thetaX)
@@ -275,7 +278,16 @@ class FlukaReader(EvgenAlg):
         gp = HepMC.GenParticle()
 
         m = 105.66
-        e = newentry["E"] * 1000.  #MeV      
+        e = newentry["E"] * 1000.  #MeV
+
+        # If the energy is less than mass then skip the event
+        if e < m:
+            self.setFilterPassed(False)
+            self.msg.debug("Event failed energy cut")
+            return False
+        else:
+            self.setFilterPassed(True)
+        
         p = np.sqrt(e**2 - m**2)
 
         thetaX = self.angle(newentry["cosX"])        
@@ -288,22 +300,27 @@ class FlukaReader(EvgenAlg):
         #phi = np.arctan(newentry["cosY"] / newentry["cosX"])
         if phi < 0: phi += 2*np.pi
         if phi == 2*np.pi: phi = 0
+
+        #self.msg.debug(f"INPUT: {e}, {m}, {p}, {theta}, {phi}, {np.sin(theta)}, {np.cos(theta)}, {np.sin(phi)}, {np.cos(phi)}")
                     
         px = p * np.sin(theta) * np.cos(phi)
         py = p * np.sin(theta) * np.sin(phi)        
         pz = p * np.cos(theta) 
-        
+
         mom = HepMC.FourVector(px, py, pz, e)
 
         gp.set_momentum(mom)
         gp.set_generated_mass(m)
         gp.set_pdg_id(self.pid(newentry["type"]))
         gp.set_status(1)
+
+        #self.msg.debug(f"HEPMC:{px, py, pz, e}")
+        #gp.print()
         
         ROOT.SetOwnership(gp, False)
         gv.add_particle_out(gp)
 
-        return
+        return True
 
     def plot(self):
         "Plot entries before and after propagation/smeating for tests"
@@ -434,6 +451,6 @@ if __name__ == "__main__":
     itemList = [ "EventInfo#McEventInfo", "McEventCollection#*" ]
     from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
     cfg.merge(OutputStreamCfg(ConfigFlags, "EVNT", itemList, disableEventTag = True))
-
+    cfg.getEventAlgo("OutputStreamEVNT").AcceptAlgs = ["FlukaReader"]
     sc = cfg.run(maxEvents = getNEvents(args.file, args.nevents) * args.nsamples)
     sys.exit(not sc.isSuccess())    
-- 
GitLab