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