From e29a74da8592857d147bec704e570abc2d4e4e42 Mon Sep 17 00:00:00 2001
From: "Ewelina.Maria.Lobodzinska" <ewelina.maria.lobodzinska@cern.ch>
Date: Tue, 15 May 2018 15:33:10 +0200
Subject: [PATCH] fix the problem in merhe_lhe AGENE-1576 update to
 EvgenProdTools-00-02-33 and EvgenJobTransforms-01-02-63-13 (meta data info
 and reading of untarred LHE files for H7 and Powheg)

Former-commit-id: 61b7bd652af713b86e308be63b6489000d8b4b6a
---
 .../EvgenJobTransforms/python/EvgenConfig.py  |   2 +-
 .../EvgenJobTransforms/python/evgenTrfArgs.py |   4 +-
 .../share/skeleton.GENtoEVGEN.py              |  51 ++++---
 .../EvgenJobTransforms_TestConfiguration.xml  |  26 +++-
 .../test/test_herwig7_minbias                 |   8 ++
 .../test/test_herwig7_wjets                   |   8 ++
 .../test/test_herwig7_zjets                   |   8 ++
 .../EvgenJobTransforms/test/test_powheg_ttbar |   6 +-
 .../EvgenProdTools/EvgenProdTools/TestHepMC.h |   5 +-
 .../python/LogicalExpressionFilter.py         |  26 +++-
 Generators/EvgenProdTools/src/TestHepMC.cxx   | 126 +++++++++++++-----
 11 files changed, 210 insertions(+), 60 deletions(-)
 create mode 100755 Generators/EvgenJobTransforms/test/test_herwig7_minbias
 create mode 100755 Generators/EvgenJobTransforms/test/test_herwig7_wjets
 create mode 100755 Generators/EvgenJobTransforms/test/test_herwig7_zjets

diff --git a/Generators/EvgenJobTransforms/python/EvgenConfig.py b/Generators/EvgenJobTransforms/python/EvgenConfig.py
index 49fc44a352832..c2dbfc83d9db7 100644
--- a/Generators/EvgenJobTransforms/python/EvgenConfig.py
+++ b/Generators/EvgenJobTransforms/python/EvgenConfig.py
@@ -5,7 +5,7 @@
 ## just used to determine the input file dummy-naming strategy for C++ generators)
 lhefGenerators = ["Lhef", # generic name: prefer to use the names below
                   "aMcAtNlo", "McAtNlo", "Powheg", "PowHel", "MadGraph", "CompHep", "CalcHep",
-                  "Whizard", "MCFM", "JHU", "MEtop", "Charybdis", "Charybdis2",
+                  "Whizard", "MCFM", "JHU", "MEtop", "Charybdis", "Charybdis2","BCVEGPY", "Dire4Pythia8",
                   "BlackMax", "QBH", "gg2ww", "gg2zz", "gg2vv", "HvyN", "VBFNLO", "FPMC", "ProtosLHEF"]
 
 ## A more general list of generators which provide partonic input, including non-LHEF ones
diff --git a/Generators/EvgenJobTransforms/python/evgenTrfArgs.py b/Generators/EvgenJobTransforms/python/evgenTrfArgs.py
index f812dfc1c93f4..bacd77797510e 100644
--- a/Generators/EvgenJobTransforms/python/evgenTrfArgs.py
+++ b/Generators/EvgenJobTransforms/python/evgenTrfArgs.py
@@ -1,4 +1,4 @@
-#  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+#  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 
 import PyJobTransforms.trfArgClasses as trfArgClasses
 
@@ -83,7 +83,7 @@ def addStdEvgenArgs(parser):
 
     parser.add_argument("--outputTXTFile", group="Evgen",
                         help="optional output TXT file for LHEF events, default is None",
-                        type=trfArgClasses.argFactory(trfArgClasses.argFile))
+                        type=trfArgClasses.argFactory(trfArgClasses.argLHEFile, io='output', runarg=True))
     parser.add_argument("--generatorRunMode", group="Evgen",
                         help="Run mode to pass on to the event generator",
                         default=trfArgClasses.argString("run", runarg=True),
diff --git a/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py b/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py
index 35c1a2c089c39..ccf4161bb24d1 100644
--- a/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py
+++ b/Generators/EvgenJobTransforms/share/skeleton.GENtoEVGEN.py
@@ -1,6 +1,4 @@
-
-#  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
+#  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 """Functionality core of the Generate_tf transform"""
 
 ##==============================================================
@@ -414,6 +412,7 @@ svcMgr.EventSelector.RunNumber = runArgs.runNumber
 
 ## Include information about generators in metadata
 import EventInfoMgt.EventInfoMgtInit
+svcMgr.TagInfoMgr.ExtraTagValuePairs += ["mc_channel_number", str(runArgs.runNumber) ]
 svcMgr.TagInfoMgr.ExtraTagValuePairs += ["lhefGenerator", '+'.join( filter( gens_lhef, gennames ) ) ]
 svcMgr.TagInfoMgr.ExtraTagValuePairs += ["generators", '+'.join(gennames)]
 svcMgr.TagInfoMgr.ExtraTagValuePairs += ["evgenProcess", evgenConfig.process]
@@ -501,6 +500,7 @@ elif "HepMCAscii" in evgenConfig.generators:
 elif gens_lhef(evgenConfig.generators):
     eventsFile = "events.lhe"
 
+
 ## Helper functions for input file handling
 def find_unique_file(pattern):
     "Return a matching file, provided it is unique"
@@ -541,6 +541,7 @@ def merge_lhe_files(listOfFiles,outputFile):
              if(len(holdHeader)<1):
                 holdHeader = header
                 output.write(header)
+          output.write(line)
 ##        each input file ends with "</LesHouchesEvents>".  We don't want to write this out until all
 ##        the files have been read.  The elif below writes out all the events.
           elif(not inHeader and not ("</LesHouchesEvents>" in line)):
@@ -557,7 +558,7 @@ def merge_lhe_files(listOfFiles,outputFile):
                 nnn = str(nevents)
                 line = line.replace(tmp[1],nnn)
              header+=line
-    output.write("</LesHouchesEvents>")
+    output.write("</LesHouchesEvents>\n")
     output.close()
 
 
@@ -582,10 +583,13 @@ if eventsFile or datFile:
                            (runArgs.inputGeneratorFile, evgenConfig.inputfilecheck, runArgs.jobConfig))
 #    inputroot = os.path.basename(runArgs.inputGeneratorFile).split("._")[0]
     if datFile:
-#        inputroot = os.path.basename(runArgs.inputGeneratorFile).split("._")[0]
+      if ".tar" in os.path.basename(runArgs.inputGeneratorFile):
         inputroot = os.path.basename(runArgs.inputGeneratorFile).split(".tar.")[0]
-        realDatFile = find_unique_file('*%s*.dat' % inputroot)
-        mk_symlink(realDatFile, datFile)
+      else:  
+        inputroot = os.path.basename(runArgs.inputGeneratorFile).split("._")[0]
+
+      realDatFile = find_unique_file('*%s*.dat' % inputroot)
+      mk_symlink(realDatFile, datFile)
     if eventsFile:
 #        realEventsFile = find_unique_file('*%s.*.ev*ts' % inputroot)
 #        mk_symlink(realEventsFile, eventsFile)
@@ -594,8 +598,13 @@ if eventsFile or datFile:
         numberOfFiles = len(genInputFiles)
         # if there is a single file, make a symlink.  If multiple files, merge them into one output eventsFile
         if(numberOfFiles<2):
-#           inputroot = os.path.basename(runArgs.inputGeneratorFile).split("._")[0]
-           inputroot = os.path.basename(runArgs.inputGeneratorFile).split(".tar.")[0]
+           if ".tar" in os.path.basename(runArgs.inputGeneratorFile):
+             inputroot = os.path.basename(runArgs.inputGeneratorFile).split(".tar.")[0]
+           else:  
+             inputroot = os.path.basename(runArgs.inputGeneratorFile).split("._")[0]
+
+           if "events" in inputroot :
+               inputroot = inputroot.replace(".events","")
            realEventsFile = find_unique_file('*%s.*ev*ts' % inputroot)
            mk_symlink(realEventsFile, eventsFile)
         else:
@@ -603,11 +612,13 @@ if eventsFile or datFile:
            for file in genInputFiles:
 #             Since we can have multiple files from the same task, inputroot must include more of the filename
 #             to make it unique
-#              input0 = os.path.basename(file).split("._")[0]
-#              input1 = (os.path.basename(file).split("._")[1]).split(".")[0]
-#              inputroot = input0+"._"+input1
-              inputroot = os.path.basename(file).split(".tar.")[0]
-#              print "inputroot ",inputroot
+              if ".tar" in os.path.basename(runArgs.inputGeneratorFile):
+                inputroot = os.path.basename(runArgs.inputGeneratorFile).split(".tar.")[0]
+              else:  
+                input0 = os.path.basename(file).split("._")[0]
+                input1 = (os.path.basename(file).split("._")[1]).split(".")[0]
+                inputroot = input0+"._"+input1
+              print "inputroot ",inputroot
               realEventsFile = find_unique_file('*%s.*ev*ts' % inputroot)
 #             The only input format where merging is permitted is LHE
               with open(realEventsFile, 'r') as f:
@@ -616,6 +627,7 @@ if eventsFile or datFile:
                     raise RuntimeError("%s is NOT a LesHouche file" % realEventsFile)
                  allFiles.append(realEventsFile)
            merge_lhe_files(allFiles,eventsFile)
+
 else:
     if hasattr(runArgs, "inputGeneratorFile") and runArgs.inputGeneratorFile != "NONE":
         raise RuntimeError("inputGeneratorFile arg specified for %s, but generators %s do not require an input file" %
@@ -654,7 +666,16 @@ if _checkattr("description", required=True):
         msg += " " + evgenConfig.notes
     print "MetaData: %s = %s" % ("physicsComment", msg)
 if _checkattr("generators", required=True):
-    print "MetaData: %s = %s" % ("generatorName", "+".join(gennames))
+#    print "MetaData: %s = %s" % ("generatorName", "+".join(gennames))
+    gennamesvers=[]
+    for item in gennames:
+       genera = item.upper()
+       generat = genera+"VER"
+       if (generat in os.environ):
+           gennamesvers.append(item+"."+os.environ[generat])
+       else:
+           gennamesvers.append(item)
+    print "MetaData: %s = %s" % ("generatorName", "+".join(gennamesvers))    
 if _checkattr("process"):
     print "MetaData: %s = %s" % ("physicsProcess", evgenConfig.process)
 if _checkattr("tune"):
diff --git a/Generators/EvgenJobTransforms/test/EvgenJobTransforms_TestConfiguration.xml b/Generators/EvgenJobTransforms/test/EvgenJobTransforms_TestConfiguration.xml
index f75b771c4553f..15ebaec008625 100644
--- a/Generators/EvgenJobTransforms/test/EvgenJobTransforms_TestConfiguration.xml
+++ b/Generators/EvgenJobTransforms/test/EvgenJobTransforms_TestConfiguration.xml
@@ -174,7 +174,7 @@
         <displayProcess>EvGen</displayProcess>
         <displayComponent>Athena-Core</displayComponent>
       </classification>
-      <options_atn>${ATN_PACKAGE}/test/test_herwig7</options_atn>
+      <options_atn>${ATN_PACKAGE}/test/test_herwig7_minbias</options_atn>
       <timelimit>15</timelimit>
       <prescript>source ${ATN_PACKAGE}/test/setup_testenv</prescript>
     </TEST>
@@ -190,6 +190,30 @@
       <timelimit>35</timelimit>
       <prescript>source ${ATN_PACKAGE}/test/setup_testenv</prescript>
     </TEST>
+
+   <TEST name="Herwig7Zjets" type="script" suite="EvgenJobTransforms-Core">
+      <doc>Test dijets generation with Herwig7</doc>
+      <classification>
+        <displayClass>OfflineValidation</displayClass>
+        <displayProcess>EvGen</displayProcess>
+        <displayComponent>Athena-Core</displayComponent>
+      </classification>
+      <options_atn>${ATN_PACKAGE}/test/test_herwig7_zjets</options_atn>
+      <timelimit>35</timelimit>
+      <prescript>source ${ATN_PACKAGE}/test/setup_testenv</prescript>
+    </TEST>
+
+   <TEST name="Herwig7wjets" type="script" suite="EvgenJobTransforms-Core">
+      <doc>Test dijets generation with Herwig7</doc>
+      <classification>
+        <displayClass>OfflineValidation</displayClass>
+        <displayProcess>EvGen</displayProcess>
+        <displayComponent>Athena-Core</displayComponent>
+      </classification>
+      <options_atn>${ATN_PACKAGE}/test/test_herwig7_wjets</options_atn>
+      <timelimit>35</timelimit>
+      <prescript>source ${ATN_PACKAGE}/test/setup_testenv</prescript>
+    </TEST>
     
     <TEST name="PowhegWenu" type="script" suite="EvgenJobTransforms-Core">
       <doc>Test W-enu generation with Powheg</doc>
diff --git a/Generators/EvgenJobTransforms/test/test_herwig7_minbias b/Generators/EvgenJobTransforms/test/test_herwig7_minbias
new file mode 100755
index 0000000000000..8a7aa29179746
--- /dev/null
+++ b/Generators/EvgenJobTransforms/test/test_herwig7_minbias
@@ -0,0 +1,8 @@
+#! /usr/bin/env bash
+
+## Any arguments are considered overrides, and will be added at the end
+export TRF_ECHO=True;
+Generate_tf.py --ecmEnergy=13000 --runNumber=429700 --maxEvents=10 \
+    --jobConfig=$JODIR15/share/DSID429xxx/MC15.429700.Herwig7_MinBias.py  \
+    --outputEVNTFile=test_herwig7_minbias_inelastic.EVNT.pool.root \
+    $@
diff --git a/Generators/EvgenJobTransforms/test/test_herwig7_wjets b/Generators/EvgenJobTransforms/test/test_herwig7_wjets
new file mode 100755
index 0000000000000..eb35bdbd90a9f
--- /dev/null
+++ b/Generators/EvgenJobTransforms/test/test_herwig7_wjets
@@ -0,0 +1,8 @@
+#! /usr/bin/env bash
+
+## Any arguments are considered overrides, and will be added at the end
+export TRF_ECHO=True;
+Generate_tf.py --ecmEnergy=13000 --runNumber=429722 --maxEvents=10 \
+    --jobConfig=$JODIR15/share/DSID429xxx/MC15.429722.Herwig7_H7UE_MMHT2014lo68cl_Wjets.py  \
+    --outputEVNTFile=test_herwig7_wjets_inelastic.EVNT.pool.root \
+    $@
diff --git a/Generators/EvgenJobTransforms/test/test_herwig7_zjets b/Generators/EvgenJobTransforms/test/test_herwig7_zjets
new file mode 100755
index 0000000000000..1dcd1b55e5c13
--- /dev/null
+++ b/Generators/EvgenJobTransforms/test/test_herwig7_zjets
@@ -0,0 +1,8 @@
+#! /usr/bin/env bash
+
+## Any arguments are considered overrides, and will be added at the end
+export TRF_ECHO=True;
+Generate_tf.py --ecmEnergy=13000 --runNumber=429721 --maxEvents=10 \
+    --jobConfig=$JODIR15/share/DSID429xxx/MC15.429721.Herwig7_H7UE_MMHT2014lo68cl_Zjets.py  \
+    --outputEVNTFile=test_herwig7_zjets_inelastic.EVNT.pool.root \
+    $@
diff --git a/Generators/EvgenJobTransforms/test/test_powheg_ttbar b/Generators/EvgenJobTransforms/test/test_powheg_ttbar
index 983ac9171f48b..7ad25e78f0a87 100755
--- a/Generators/EvgenJobTransforms/test/test_powheg_ttbar
+++ b/Generators/EvgenJobTransforms/test/test_powheg_ttbar
@@ -2,7 +2,7 @@
 
 ## Any arguments are considered overrides, and will be added at the end
 export TRF_ECHO=True;
-Generate_tf.py --ecmEnergy=13000 --runNumber=101010 --maxEvents=10 \
-    --jobConfig=$JODIR/share/tests/MC14.101010.PowhegPythia_Perugia2011_tt_example.py  \
-    --outputEVNTFile=test_powheg_minbias_inelastic.EVNT.pool.root \
+Generate_tf.py --ecmEnergy=13000 --runNumber=410006 --maxEvents=10 \
+    --jobConfig=$JODIR15/share/DSID410xxx/MC15.410006.PowhegPythia8EvtGen_A14_ttbar_hdamp172p5_nonallhad.py  \
+    --outputEVNTFile=test_powheg_ttbar.EVNT.pool.root \
     $@
diff --git a/Generators/EvgenProdTools/EvgenProdTools/TestHepMC.h b/Generators/EvgenProdTools/EvgenProdTools/TestHepMC.h
index 75da0cb385212..a08315fc0f19e 100644
--- a/Generators/EvgenProdTools/EvgenProdTools/TestHepMC.h
+++ b/Generators/EvgenProdTools/EvgenProdTools/TestHepMC.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef XAOD_ANALYSIS
@@ -48,6 +48,9 @@ public:
   double      m_eff_warn_threshold, m_eff_fail_threshold, m_tau_eff_threshold;
   double      m_accur_margin;
   bool m_doHist;
+  bool m_beamEnergyTest, m_vtxNaNTest, m_vtxDisplacedTest, m_momNaNTest, m_lifeTimeTest, m_energyG4Test;
+  bool m_energyImbalanceTest, m_momImbalanceTest, m_negativeEnergyTest, m_tachyonsTest, m_unstableNoVtxTest;
+  bool m_pi0NoVtxTest, m_undisplacedDaughtersTest;
 
   std::vector<int> m_vertexStatuses;
 
diff --git a/Generators/EvgenProdTools/python/LogicalExpressionFilter.py b/Generators/EvgenProdTools/python/LogicalExpressionFilter.py
index fa7f3f12bb274..ff19f1c8c3bc4 100644
--- a/Generators/EvgenProdTools/python/LogicalExpressionFilter.py
+++ b/Generators/EvgenProdTools/python/LogicalExpressionFilter.py
@@ -1,5 +1,6 @@
-#  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
+/*
+   Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
 ##==============================================================================
 ## Name:        LogicalExpressionFilter.py
 ##
@@ -34,8 +35,12 @@ class LogicalExpressionFilter( PyAthena.Alg ):
         super(LogicalExpressionFilter, self).__init__(**kw)
         self.nEventsProcessed=0
         self.nEventsPassed=0
+        self.nEventsProcessedPosWeighted=0
+        self.nEventsProcessedNegWeighted=0
         self.nEventsProcessedWeighted=0
         self.nEventsPassedWeighted=0
+        self.nEventsPassedPosWeighted=0
+        self.nEventsPassedNegWeighted=0
         self.Expression = kw.get('Expression', '')
         self.UseEventWeight = kw.get('UseEventWeight',True)
         self.McEventKey = kw.get('McEventKey','GEN_EVENT')
@@ -158,8 +163,8 @@ class LogicalExpressionFilter( PyAthena.Alg ):
 
     def evalFilter(self, filterName):
       if not self.algdict[filterName].isExecuted():
-         self.algdict[filterName].sysExecute( )
-#         self.algdict[filterName].sysExecute( self.getContext() ) # for rel. 22
+#         self.algdict[filterName].sysExecute( self.getContext() ) # only rel. 21+
+         self.algdict[filterName].sysExecute()
          self.algdict[filterName].setExecuted(True)
       decision = self.algdict[filterName].filterPassed()
       self.msg.verbose(filterName + " decision=" + str(decision))
@@ -186,10 +191,18 @@ class LogicalExpressionFilter( PyAthena.Alg ):
 
         self.nEventsProcessed+=1
         self.nEventsProcessedWeighted+=event_weight
+        if event_weight > 0 :
+            self.nEventsProcessedPosWeighted+=event_weight
+        else :
+            self.nEventsProcessedNegWeighted+=abs(event_weight)
         response = bool(eval(self.cmd)) if self.cmd else True
         if response:
             self.nEventsPassed+=1
             self.nEventsPassedWeighted+=event_weight
+            if event_weight > 0 :
+                self.nEventsPassedPosWeighted+=event_weight
+            else :
+                self.nEventsPassedNegWeighted+=abs(event_weight)
         self.msg.debug("My decision is: %s" % response)
         self.setFilterPassed(response)
         return StatusCode.Success
@@ -206,6 +219,11 @@ class LogicalExpressionFilter( PyAthena.Alg ):
         self.msg.info("Filter Efficiency = %f [%s / %s]" % (efficiency,self.nEventsPassed,self.nEventsProcessed))
         self.msg.info("Weighted Filter Efficiency = %f [%f / %f]" % (efficiencyWeighted,self.nEventsPassedWeighted,self.nEventsProcessedWeighted))
         print("MetaData: GenFiltEff = %e" % (efficiencyWeighted if self.UseEventWeight else efficiency))
+
+        print("MetaData: sumOfPosWeights = %e" % (self.nEventsPassedPosWeighted if self.UseEventWeight else self.nEventsPassed))
+        print("MetaData: sumOfNegWeights = %e" % (self.nEventsPassedNegWeighted if self.UseEventWeight else self.nEventsPassed))
+        print("MetaData: sumOfPosWeightsNoFilter = %e" % (self.nEventsProcessedPosWeighted if self.UseEventWeight else self.nEventsProcessed))
+        print("MetaData: sumOfNegWeightsNoFilter = %e" % (self.nEventsProcessedNegWeighted if self.UseEventWeight else self.nEventsProcessed))
         return StatusCode.Success
 
 
diff --git a/Generators/EvgenProdTools/src/TestHepMC.cxx b/Generators/EvgenProdTools/src/TestHepMC.cxx
index 569c8fae8c583..9504fde02bc98 100644
--- a/Generators/EvgenProdTools/src/TestHepMC.cxx
+++ b/Generators/EvgenProdTools/src/TestHepMC.cxx
@@ -1,7 +1,6 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+   Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 */
-
 #ifndef XAOD_ANALYSIS
 
 #include "EvgenProdTools/TestHepMC.h"
@@ -32,6 +31,21 @@ TestHepMC::TestHepMC(const string& name, ISvcLocator* pSvcLocator)
   declareProperty( "G4ExtraWhiteFile", m_paramFile       = "g4_extrawhite.param" );
 
   declareProperty("NoDecayVertexStatuses", m_vertexStatuses );
+
+  declareProperty("BeamEnergyTest",           m_beamEnergyTest = true); //switching off inactive
+  declareProperty("VtxNaNTest",               m_vtxNaNTest = true);
+  declareProperty("VtxDisplacedTest",         m_vtxDisplacedTest = true);
+  declareProperty("MomNaNTest",               m_momNaNTest = true);
+  declareProperty("LifeTimeTest",             m_lifeTimeTest = true);
+  declareProperty("EnergyG4Test",             m_energyG4Test = true);
+  declareProperty("EnergyImbalanceTest",      m_energyImbalanceTest = true);
+  declareProperty("MomImbalanceTest",         m_momImbalanceTest = true);
+  declareProperty("NegativeEnergyTest",       m_negativeEnergyTest = true);
+  declareProperty("TachyonsTest",             m_tachyonsTest = true);
+  declareProperty("UnstableNoVtxTest",        m_unstableNoVtxTest = true);
+  declareProperty("Pi0NoVtxTest",             m_pi0NoVtxTest = true);
+  declareProperty("UndisplacedDaughtersTest", m_undisplacedDaughtersTest = true);
+
   m_vertexStatuses.push_back( 1 );
   m_vertexStatuses.push_back( 3 );
   m_vertexStatuses.push_back( 4 );
@@ -298,10 +312,13 @@ StatusCode TestHepMC::execute() {
            std::isnan(pos.y()) || std::isinf(pos.y()) ||
            std::isnan(pos.z()) || std::isinf(pos.z()) ) {
         ATH_MSG_WARNING("NaN (Not A Number) or inf found in the event record vertex positions");
-        ++m_nFail;
+        
         ++m_vtxNANandINFCheckRate;
         if (m_dumpEvent) (*itr)->print();
-        setFilterPassed(false);
+        if (m_vtxNaNTest) {
+           ++m_nFail;
+           setFilterPassed(false);
+        }
         return StatusCode::SUCCESS;
       }
 
@@ -314,8 +331,11 @@ StatusCode TestHepMC::execute() {
       if (dist2 > m_max_dist*m_max_dist) {
         ATH_MSG_WARNING("Found vertex position displaced by more than " << m_max_dist << "mm: " << dist << "mm");
         ++m_vtxDisplacedMoreThan_1m_CheckRateCnt;
-        ++m_nFail;
-        setFilterPassed(false);
+        
+        if (m_vtxDisplacedTest) {
+            setFilterPassed(false);
+            ++m_nFail;
+            }
         return StatusCode::SUCCESS;
       }
       if (dist_trans2 > m_max_dist_trans*m_max_dist_trans) {
@@ -396,9 +416,12 @@ StatusCode TestHepMC::execute() {
            std::isnan(pmom.e())  || std::isinf(pmom.e()) ) {
         ATH_MSG_WARNING("NaN (Not A Number) or inf found in the event record momenta");
         ++m_partMomentumNANandINFCheckRate;
-        ++m_nFail;
+        
         if (m_dumpEvent) (*pitr)->print();
-        setFilterPassed(false);
+        if (m_momNaNTest) {
+           setFilterPassed(false);
+           ++m_nFail;
+        }
         return StatusCode::SUCCESS;
       }
 
@@ -420,8 +443,11 @@ StatusCode TestHepMC::execute() {
 	    if (m_dumpEvent) (*pitr)->print();
 
             ++m_Status1ShortLifetime;
-            ++m_nFail;
-            setFilterPassed(false);
+            
+            if (m_lifeTimeTest) {
+               setFilterPassed(false);
+               ++m_nFail;
+               }
             return StatusCode::SUCCESS;
           }
         }
@@ -466,11 +492,10 @@ StatusCode TestHepMC::execute() {
             }
       }
 
-      // Check for unstables with no end vertex, such as undecayed gluons, Ws, Zs, and h [not status 3 to avoid probles with photos]
-      if (!(*pitr)->end_vertex() &&
-          ( ( std::find( m_vertexStatuses.begin(), m_vertexStatuses.end(), pstatus ) == m_vertexStatuses.end() ) 
-	    || 
-	    ((abs(ppdgid) == 23 || ppdgid == 24 || ppdgid == 25) && pstatus != 3))) {
+      // Check for unstables with no end vertex, 
+	    
+      if (!(*pitr)->end_vertex() && pstatus == 2) { 
+
         unstNoEnd.push_back(pbarcode);
         ++m_unstableNoEndVtxCheckRate;
       }
@@ -564,9 +589,12 @@ StatusCode TestHepMC::execute() {
     // Energy of interacting particles not known by Geant4
     if(nonG4_energy > m_nonG4_energy_threshold) {
       ATH_MSG_WARNING("The energy of interacting particles not known by Geant4 is = " << nonG4_energy << " MeV");
-      setFilterPassed(false);
+      if (m_energyG4Test) {
+         setFilterPassed(false);
+         ++m_nFail;
+         }
       ++m_nonG4_energyCheckRate;
-      ++m_nFail;
+      
       return StatusCode::SUCCESS;      
     }
 
@@ -583,9 +611,12 @@ StatusCode TestHepMC::execute() {
       //     std::cout << "hidt filled " << std::endl;
      }
       if (m_dumpEvent) (*itr)->print();
-      setFilterPassed(false);
+      if (m_energyImbalanceTest) {
+         setFilterPassed(false);
+         ++m_nFail;
+         }
       ++m_energyBalanceCheckRate;
-      ++m_nFail;
+      
       return StatusCode::SUCCESS;
     }
 
@@ -599,9 +630,12 @@ StatusCode TestHepMC::execute() {
       m_h_momentumImbalance_pz->Fill(fabs(totalPz)*1.E-03);
     }
       if (m_dumpEvent) (*itr)->print();
-      setFilterPassed(false);
+      if (m_momImbalanceTest) {
+         setFilterPassed(false);
+         ++m_nFail;
+         }
       ++m_momentumBalanceCheckRate;
-      ++m_nFail;
+      
       return StatusCode::SUCCESS;
     }
 
@@ -613,9 +647,12 @@ StatusCode TestHepMC::execute() {
         ss << " " << *b;
       ATH_MSG_WARNING(ss.str());
       if (m_dumpEvent) (*itr)->print();
-      setFilterPassed(false);
+      if (m_negativeEnergyTest) {
+         setFilterPassed(false);
+         ++m_nFail;
+         }
       ++m_negativeEnergyCheckRate;
-      ++m_nFail;
+      
       return StatusCode::SUCCESS;
     }
 
@@ -627,9 +664,12 @@ StatusCode TestHepMC::execute() {
         ss << " " << *b;
       ATH_MSG_WARNING(ss.str());
       if (m_dumpEvent) (*itr)->print();
-      setFilterPassed(false);
+      if (m_tachyonsTest) {
+         setFilterPassed(false);
+         ++m_nFail;
+         }
       ++m_energyBalanceCheckRate;
-      ++m_nFail;
+      
       return StatusCode::SUCCESS;
     }
 
@@ -641,9 +681,12 @@ StatusCode TestHepMC::execute() {
         ss << " " << *b;
       ATH_MSG_WARNING(ss.str());
       if (m_dumpEvent) (*itr)->print();
-      setFilterPassed(false);
+      if (m_unstableNoVtxTest) {
+         setFilterPassed(false);
+         ++m_nFail;
+         }
       ++m_unstablePartNoDecayVtxCheckRate;
-      ++m_nFail;
+      
       return StatusCode::SUCCESS;
     }
 
@@ -655,9 +698,12 @@ StatusCode TestHepMC::execute() {
         ss << " " << *b;
       ATH_MSG_WARNING(ss.str());
       if (m_dumpEvent) (*itr)->print();
-      setFilterPassed(false);
+      if (m_pi0NoVtxTest) {
+         setFilterPassed(false);
+         ++m_nFail;
+         }
       ++m_undecayedPi0CheckRate;
-      ++m_nFail;
+      
       return StatusCode::SUCCESS;
     }
 
@@ -669,9 +715,12 @@ StatusCode TestHepMC::execute() {
         ss << " " << *b;
       ATH_MSG_WARNING(ss.str());
       if (m_dumpEvent) (*itr)->print();
-      setFilterPassed(false);
+      if(m_undisplacedDaughtersTest) {
+         setFilterPassed(false);
+         ++m_nFail;
+         }
       ++m_undisplacedDecayDaughtersOfDisplacedVtxCheckRate;
-      ++m_nFail;
+      
       return StatusCode::SUCCESS;
     }
 
@@ -692,10 +741,12 @@ StatusCode TestHepMC::finalize() {
   ATH_MSG_INFO(" Event rate with beam particles and status not equal to 4 = " << m_beamParticleswithStatusNotFourCheckRate*100.0/double(m_nPass + m_nFail) << "% (not included in test efficiency)");
   ATH_MSG_INFO(" Event rate with incorrect beam particle energies = " << m_beamEnergyCheckRate*100.0/double(m_nPass + m_nFail) << "% (not included in test efficiency)");
   ATH_MSG_INFO(" Event rate with NaN (Not A Number) or inf found in the event record vertex positions = " << m_vtxNANandINFCheckRate*100.0/double(m_nPass + m_nFail) << "%");
-  ATH_MSG_INFO(" Event rate with vertices displaced more than " << m_max_dist_trans << "~mm in transverse direction for particles with status codes 1 and 2 = " << m_vtxDisplacedstatuscode12CheckRate*100.0/double(m_nPass + m_nFail) << "% (not included in test efficiency)");
+  if (!m_vtxNaNTest) ATH_MSG_INFO(" The check for NaN or inf in vtx. record is switched off, so is not included in the final TestHepMC efficiency ");
   ATH_MSG_INFO(" Event rate with vertices displaced more than " << m_max_dist_trans << "~mm in transverse direction for particles with status code other than 1 and 2 = " << m_vtxDisplacedstatuscodenot12CheckRate*100.0/double(m_nPass + m_nFail) << "% (not included in test efficiency)");
   ATH_MSG_INFO(" Event rate with vertices displaced more than " << m_max_dist << "~mm = " << m_vtxDisplacedMoreThan_1m_CheckRateCnt*100.0/double(m_nPass + m_nFail) << "%");
+  if (!m_vtxDisplacedTest) ATH_MSG_INFO(" The check for displaced vertices is switched off, so is not included in the final TestHepMC efficiency ");
   ATH_MSG_INFO(" Event rate with NAN (Not A Number) or inf found in particle momentum values = " << m_partMomentumNANandINFCheckRate*100.0/double(m_nPass + m_nFail) << "%");
+  if (!m_momNaNTest) ATH_MSG_INFO(" The check for NaN/inf in momentum record is switched off, so is not included in the final TestHepMC efficiency ");
   ATH_MSG_INFO(" Event rate with undecayed pi0's with status 1 or 2 = " << m_undecayedPi0statuscode12CheckRate*100.0/double(m_nPass + m_nFail) << "% (not included in test efficiency)");
   ATH_MSG_INFO(" Event rate with unstable particles with no end vertex = " << m_unstableNoEndVtxCheckRate*100.0/double(m_nPass + m_nFail) << "% (not included in test efficiency)");
   ATH_MSG_INFO(" Event rate with negative total energy like for tachyonic particles = " << m_negativeEnergyTachyonicCheckRate*100.0/double(m_nPass + m_nFail) << "% (not included in test efficiency)");
@@ -703,16 +754,25 @@ StatusCode TestHepMC::finalize() {
   ATH_MSG_INFO(" Event rate with undisplaced daughters of long lived hadrons = " << m_undisplacedLLHdaughtersCheckRate*100.0/double(m_nPass + m_nFail) << "% (not included in test efficiency)");
   ATH_MSG_INFO(" Event rate with non zero photon mass = " << m_nonZeroPhotonMassCheckRate*100.0/double(m_nPass + m_nFail) << "% (not included in test efficiency)");
   ATH_MSG_INFO(" Event rate with no energy balance = " << m_energyBalanceCheckRate*100.0/double(m_nPass + m_nFail) << "%");
+  if (!m_energyImbalanceTest) ATH_MSG_INFO(" The check for energy imbalance is switched off, so is not included in the final TestHepMC efficiency ");
   ATH_MSG_INFO(" Event rate with no momentum balance = " << m_momentumBalanceCheckRate*100.0/double(m_nPass + m_nFail) << "%");
+  if (!m_momImbalanceTest) ATH_MSG_INFO(" The check for momentum imbalance is switched off, so is not included in the final TestHepMC efficiency ");
   ATH_MSG_INFO(" Event rate with negative energy particles = " << m_negativeEnergyCheckRate*100.0/double(m_nPass + m_nFail) << "%");
+  if (!m_negativeEnergyTest) ATH_MSG_INFO(" The check for particles with negative energy is switched off, so is not included in the final TestHepMC efficiency ");
   ATH_MSG_INFO(" Event rate with tachyons = " << m_tachyonCheckRate*100.0/double(m_nPass + m_nFail) << "%");
+  if (!m_tachyonsTest) ATH_MSG_INFO(" The check for tachyons is switched off, so is not included in the final TestHepMC efficiency ");
   ATH_MSG_INFO(" Event rate with stable or unstable particles with no parents = " << m_stableUnstableNoParentCheckRate*100.0/double(m_nPass + m_nFail) << "%");
   ATH_MSG_INFO(" Event rate with unstable particle with no decay vertex = " << m_unstablePartNoDecayVtxCheckRate*100.0/double(m_nPass + m_nFail) << "%");
+  if (!m_unstableNoVtxTest) ATH_MSG_INFO(" The check for unstable part. without end vertex is switched off, so is not included in the final TestHepMC efficiency ");
   ATH_MSG_INFO(" Event rate with undecayed Pi0's = " << m_undecayedPi0CheckRate*100.0/double(m_nPass + m_nFail) << "%");
+  if (!m_pi0NoVtxTest) ATH_MSG_INFO(" The check for undecayed pi0's is switched off, so is not included in the final TestHepMC efficiency ");
   ATH_MSG_INFO(" Event rate with undisplaced decay daughters of displaced vertices = " << m_undisplacedDecayDaughtersOfDisplacedVtxCheckRate*100.0/double(m_nPass + m_nFail) << "%");
+  if (!m_undisplacedDaughtersTest) ATH_MSG_INFO(" The check for  undisplaced daughters is switched off, so is not included in the final TestHepMC efficiency ");
   ATH_MSG_INFO(" Event rate with particles with status 1 but lifetime < " << m_min_tau << "~ns = " << m_Status1ShortLifetime*100.0/double(m_nPass + m_nFail) << "%");
+  if (!m_lifeTimeTest) ATH_MSG_INFO(" The check for status 1 particles with too short lifetime is switched off, so is not included in the final TestHepMC efficiency ");
   ATH_MSG_INFO(" Event rate with energy sum of interacting particles non known by Geant4 above " << m_nonG4_energy_threshold << " MeV = " << m_nonG4_energyCheckRate*100.0/double(m_nPass + m_nFail) << "%");
- 
+  if (!m_energyG4Test) ATH_MSG_INFO(" The check for energy not known by G4 is switched off, so is not included in the final TestHepMC efficiency "); 
+
   const double tau_fastDrate = double(m_FastDecayedTau) / double(m_TotalTaus);
   if(tau_fastDrate > m_tau_eff_threshold){
     ATH_MSG_FATAL("MORE THAN " << 100.*m_tau_eff_threshold << "% OF TAUS DECAYING IMMEDIATELY! " << m_FastDecayedTau << " found, out of: " << m_TotalTaus);
-- 
GitLab