ATLAS Offline Software
Loading...
Searching...
No Matches
TestHepMC Class Reference

Filtering algorithm to sanity check HepMC event features. More...

#include <TestHepMC.h>

Inheritance diagram for TestHepMC:
Collaboration diagram for TestHepMC:

Public Member Functions

 TestHepMC (const std::string &name, ISvcLocator *pSvcLocator)
StatusCode initialize ()
StatusCode execute (const EventContext &ctx)
 Execute method.
StatusCode finalize ()
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
 Get filter decision:
virtual void setFilterPassed (bool state, const EventContext &ctx) const
 Set filter decision:
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const
Event collection accessors (const and non-const)
HepMC::GenEvent *event ATLAS_NOT_CONST_THREAD_SAFE ()
 Access the current signal event (first in the McEventCollection).
McEventCollection *events ATLAS_NOT_CONST_THREAD_SAFE ()
 Access the current event's McEventCollection.
const HepMC::GenEventevent_const (const EventContext &ctx) const
 Access the current signal event (const).
const McEventCollectionevents_const (const EventContext &ctx) const
 Access the current event's McEventCollection (const).

Protected Member Functions

virtual bool isReEntrant () const override final
 Legacy algorithms are not thread-safe.
void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

int m_maxloops
int m_pdg
double m_cm_energy
double m_cme_diff
double m_energy_diff
double m_max_energy_diff
bool m_dumpEvent
bool m_allowMissingXSec
double m_min_dist_trans
double m_max_dist_trans
double m_max_dist
double m_min_tau
double m_nonG4_energy_threshold
double m_eff_warn_threshold
double m_eff_fail_threshold
double m_tau_eff_threshold
double m_accur_margin
bool m_doHist
bool m_beamEnergyTest
bool m_vtxNaNTest
bool m_vtxDisplacedTest
bool m_momNaNTest
bool m_lifeTimeTest
bool m_energyG4Test
bool m_energyImbalanceTest
bool m_momImbalanceTest
bool m_negativeEnergyTest
bool m_tachyonsTest
bool m_unstableNoVtxTest
bool m_pi0NoVtxTest
bool m_undisplacedDaughtersTest
bool m_unknownPDGIDTest
std::vector< int > m_vertexStatuses
int m_nPass
int m_nFail
int m_noXSECset
int m_TotalTaus
int m_FastDecayedTau
int m_invalidBeamParticlesCheckRate
int m_beamParticleswithStatusNotFourCheckRate
int m_beamEnergyCheckRate
int m_vtxNANandINFCheckRate
int m_vtxDisplacedstatuscode12CheckRate
int m_vtxDisplacedstatuscodenot12CheckRate
int m_vtxDisplacedMoreThan_1m_CheckRate
int m_partMomentumNANandINFCheckRate
int m_undecayedPi0statuscode12CheckRate
int m_unstableNoEndVtxCheckRate
int m_negativeEnergyTachyonicCheckRate
int m_decayCheckRate
int m_undisplacedLLHdaughtersCheckRate
int m_nonZeroPhotonMassCheckRate
int m_energyBalanceCheckRate
int m_momentumBalanceCheckRate
int m_negativeEnergyCheckRate
int m_tachyonCheckRate
int m_stableUnstableNoParentCheckRate
int m_unstablePartNoDecayVtxCheckRate
int m_undecayedPi0CheckRate
int m_Status1ShortLifetime
int m_undisplacedDecayDaughtersOfDisplacedVtxCheckRate
int m_nonG4_energyCheckRate
int m_unknownPDGIDCheckRate
std::string m_paramFile
std::string m_unknownPDGIDFile
std::vector< int > m_G4pdgID_tab
std::vector< int > m_SusyPdgID_tab
std::vector< int > m_uknownPDGID_tab
ServiceHandle< ITHistSvc > m_thistSvc
TH1F * m_h_energy_dispVtxCheck
TH1F * m_h_energy_dispVtxCheck_lt10
TH1F * m_h_pdgid_dispVtxCheck
TH1F * m_h_status_dispVtxCheck
TH1F * m_h_px_dispVtxCheck
TH1F * m_h_py_dispVtxCheck
TH1F * m_h_pz_dispVtxCheck
TH1F * m_h_vx_dispVtxCheck
TH1F * m_h_vy_dispVtxCheck
TH1F * m_h_vz_dispVtxCheck
TH1F * m_h_vxprod_dispVtxCheck
TH1F * m_h_vyprod_dispVtxCheck
TH1F * m_h_vzprod_dispVtxCheck
TH1F * m_h_vtxend_dispVtxCheck
TH1F * m_h_vtxprod_dispVtxCheck
TH1F * m_h_photon_mass
TH1F * m_h_photon_energy
TH1F * m_h_photon_e2_p2_e2
TH1F * m_h_energyImbalance
TH1F * m_h_momentumImbalance_px
TH1F * m_h_momentumImbalance_py
TH1F * m_h_momentumImbalance_pz
TH1F * m_h_beamparticle1_Energy
TH1F * m_h_beamparticle2_Energy
TH1F * m_h_cmEnergyDiff
MC::Loops< HepMC::GenEvent, HepMC::ConstGenParticlePtr, HepMC::ConstGenVertexPtrm_looper
 member to detect loops
std::shared_ptr< GenDatam_gendata {nullptr}
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Properties

SG::ReadHandleKey< McEventCollectionm_mcevents_const { this, "McEventKey", "GEN_EVENT", "StoreGate key of the MC event collection" }
 Const handle to the MC event collection.
std::string m_mcEventKey {}
 StoreGate key for the MC event collection (defaults to GEN_EVENT).
BooleanProperty m_mkMcEvent {this, "MakeMcEvent", false, "Create a new MC event collection if it doesn't exist"}
 Flag to determine if a new MC event collection should be made if it doesn't exist.

Detailed Description

Filtering algorithm to sanity check HepMC event features.

The TestHepMC algorithm is used in MC production to ensure that only events with valid final state particles, properly balanced initial-final state momentum and energy, etc. are accepted for further processing. A too-high failure rate results in a warning or algorithm failure to flag up to production that there is a fundamental problem and that the sanity check may be unphysically biasing the resulting events.

Todo
Inherit from GenFilter? It is a filter

Definition at line 34 of file TestHepMC.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ TestHepMC()

TestHepMC::TestHepMC ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 17 of file TestHepMC.cxx.

18 : GenBase(name, pSvcLocator),
19 m_thistSvc("THistSvc", name)
20{
21 declareProperty("MaxLoops", m_maxloops = -1); //< Maximal number of particles allowed in the loops. -1 == any number
22 declareProperty("PdgToSearch", m_pdg = 15); //< @todo This test is a bit weirdly specific to taus
23 declareProperty("CmEnergy", m_cm_energy = -1); // in MeV, -1 = get from event
24 declareProperty("MinTransVtxDisp", m_min_dist_trans = 0.); // mm
25 declareProperty("MaxTransVtxDisp", m_max_dist_trans = 100.); // mm
26 declareProperty("MaxVtxDisp", m_max_dist = 1000.); // mm;
27 declareProperty("EnergyDifference", m_energy_diff = 1000.); // MeV
28 declareProperty("EnergyDifferenceError", m_max_energy_diff = 100000.); // MeV
29 declareProperty("CmeDifference", m_cme_diff = 1.); // MeV
30 declareProperty("DumpEvent", m_dumpEvent = false);
31 declareProperty("MinTau", m_min_tau = 1/300.); // ns; corresponds to 1mm
32 declareProperty("MaxNonG4Energy", m_nonG4_energy_threshold = 100.); //MeV
33 declareProperty("TauEffThreshold", m_tau_eff_threshold = 0.1); // fraction
34 declareProperty("EffWarnThreshold", m_eff_warn_threshold=0.99); // fraction
35 declareProperty("EffFailThreshold", m_eff_fail_threshold=0.98); // fraction
36 declareProperty("AccuracyMargin", m_accur_margin=0.); //MeV
37
38 declareProperty("G4ExtraWhiteFile", m_paramFile = "g4_extrawhite.param" );
39 // a list of allowed pdgid which however might not follow the official rules
40 declareProperty("UnknownPDGIDFile", m_unknownPDGIDFile = "pdgid_extras.txt" );
41
42 declareProperty("NoDecayVertexStatuses", m_vertexStatuses );
43
44 declareProperty("BeamEnergyTest", m_beamEnergyTest = true); //switching off inactive
45 declareProperty("VtxNaNTest", m_vtxNaNTest = true);
46 declareProperty("VtxDisplacedTest", m_vtxDisplacedTest = true);
47 declareProperty("MomNaNTest", m_momNaNTest = true);
48 declareProperty("LifeTimeTest", m_lifeTimeTest = true);
49 declareProperty("EnergyG4Test", m_energyG4Test = true);
50 declareProperty("EnergyImbalanceTest", m_energyImbalanceTest = true);
51 declareProperty("MomImbalanceTest", m_momImbalanceTest = true);
52 declareProperty("NegativeEnergyTest", m_negativeEnergyTest = true);
53 declareProperty("TachyonsTest", m_tachyonsTest = true);
54 declareProperty("UnstableNoVtxTest", m_unstableNoVtxTest = true);
55 declareProperty("Pi0NoVtxTest", m_pi0NoVtxTest = true);
56 declareProperty("UndisplacedDaughtersTest", m_undisplacedDaughtersTest = true);
57 declareProperty("UknownPDGIDTest", m_unknownPDGIDTest = true);
58 declareProperty("AllowMissingCrossSection", m_allowMissingXSec = false);
59
60 m_vertexStatuses.push_back( 1 );
61 m_vertexStatuses.push_back( 3 );
62 m_vertexStatuses.push_back( 4 );
63
64
65 declareProperty("THistSvc", m_thistSvc);
66
67 declareProperty("DoHist", m_doHist=false); //histograming yes/no true/false
68
69 m_nPass = 0;
70 m_nFail = 0;
71
72 m_TotalTaus = 0;
74
75 // Check counters
101 m_noXSECset = 0;
102
118 m_h_photon_mass = 0;
128}
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
GenBase(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Definition GenBase.cxx:11
int m_momentumBalanceCheckRate
Definition TestHepMC.h:81
int m_tachyonCheckRate
Definition TestHepMC.h:83
bool m_energyImbalanceTest
Definition TestHepMC.h:54
double m_cm_energy
Definition TestHepMC.h:46
TH1F * m_h_py_dispVtxCheck
Definition TestHepMC.h:107
int m_nFail
Definition TestHepMC.h:60
int m_stableUnstableNoParentCheckRate
Definition TestHepMC.h:84
int m_nonZeroPhotonMassCheckRate
Definition TestHepMC.h:79
TH1F * m_h_vyprod_dispVtxCheck
Definition TestHepMC.h:113
TH1F * m_h_energyImbalance
Definition TestHepMC.h:122
int m_vtxDisplacedMoreThan_1m_CheckRate
Definition TestHepMC.h:72
ServiceHandle< ITHistSvc > m_thistSvc
Definition TestHepMC.h:100
TH1F * m_h_vz_dispVtxCheck
Definition TestHepMC.h:111
int m_unknownPDGIDCheckRate
Definition TestHepMC.h:90
double m_nonG4_energy_threshold
Definition TestHepMC.h:49
int m_vtxDisplacedstatuscodenot12CheckRate
Definition TestHepMC.h:71
int m_beamParticleswithStatusNotFourCheckRate
Definition TestHepMC.h:67
bool m_dumpEvent
Definition TestHepMC.h:48
TH1F * m_h_beamparticle1_Energy
Definition TestHepMC.h:127
int m_nPass
Definition TestHepMC.h:59
double m_eff_fail_threshold
Definition TestHepMC.h:50
TH1F * m_h_momentumImbalance_py
Definition TestHepMC.h:124
TH1F * m_h_vxprod_dispVtxCheck
Definition TestHepMC.h:112
int m_unstablePartNoDecayVtxCheckRate
Definition TestHepMC.h:85
std::string m_unknownPDGIDFile
Definition TestHepMC.h:93
double m_min_dist_trans
Definition TestHepMC.h:49
int m_vtxDisplacedstatuscode12CheckRate
Definition TestHepMC.h:70
TH1F * m_h_vx_dispVtxCheck
Definition TestHepMC.h:109
TH1F * m_h_pz_dispVtxCheck
Definition TestHepMC.h:108
double m_max_dist_trans
Definition TestHepMC.h:49
TH1F * m_h_pdgid_dispVtxCheck
Definition TestHepMC.h:104
bool m_doHist
Definition TestHepMC.h:52
int m_maxloops
Definition TestHepMC.h:44
int m_undisplacedLLHdaughtersCheckRate
Definition TestHepMC.h:78
bool m_tachyonsTest
Definition TestHepMC.h:54
std::vector< int > m_vertexStatuses
Definition TestHepMC.h:57
TH1F * m_h_vy_dispVtxCheck
Definition TestHepMC.h:110
bool m_momImbalanceTest
Definition TestHepMC.h:54
int m_beamEnergyCheckRate
Definition TestHepMC.h:68
TH1F * m_h_photon_mass
Definition TestHepMC.h:118
int m_Status1ShortLifetime
Definition TestHepMC.h:87
double m_eff_warn_threshold
Definition TestHepMC.h:50
int m_noXSECset
Definition TestHepMC.h:61
bool m_allowMissingXSec
Definition TestHepMC.h:48
double m_tau_eff_threshold
Definition TestHepMC.h:50
int m_undecayedPi0statuscode12CheckRate
Definition TestHepMC.h:74
bool m_undisplacedDaughtersTest
Definition TestHepMC.h:55
bool m_vtxNaNTest
Definition TestHepMC.h:53
int m_unstableNoEndVtxCheckRate
Definition TestHepMC.h:75
double m_energy_diff
Definition TestHepMC.h:47
double m_accur_margin
Definition TestHepMC.h:51
bool m_lifeTimeTest
Definition TestHepMC.h:53
TH1F * m_h_energy_dispVtxCheck_lt10
Definition TestHepMC.h:103
TH1F * m_h_momentumImbalance_pz
Definition TestHepMC.h:125
bool m_negativeEnergyTest
Definition TestHepMC.h:54
TH1F * m_h_vtxprod_dispVtxCheck
Definition TestHepMC.h:116
int m_pdg
Definition TestHepMC.h:45
TH1F * m_h_vzprod_dispVtxCheck
Definition TestHepMC.h:114
int m_partMomentumNANandINFCheckRate
Definition TestHepMC.h:73
bool m_momNaNTest
Definition TestHepMC.h:53
int m_negativeEnergyCheckRate
Definition TestHepMC.h:82
TH1F * m_h_photon_energy
Definition TestHepMC.h:119
int m_undecayedPi0CheckRate
Definition TestHepMC.h:86
TH1F * m_h_energy_dispVtxCheck
Definition TestHepMC.h:102
TH1F * m_h_momentumImbalance_px
Definition TestHepMC.h:123
int m_energyBalanceCheckRate
Definition TestHepMC.h:80
bool m_unknownPDGIDTest
Definition TestHepMC.h:55
int m_TotalTaus
Definition TestHepMC.h:63
bool m_energyG4Test
Definition TestHepMC.h:53
TH1F * m_h_vtxend_dispVtxCheck
Definition TestHepMC.h:115
int m_FastDecayedTau
Definition TestHepMC.h:64
TH1F * m_h_beamparticle2_Energy
Definition TestHepMC.h:128
int m_decayCheckRate
Definition TestHepMC.h:77
double m_max_dist
Definition TestHepMC.h:49
double m_min_tau
Definition TestHepMC.h:49
int m_vtxNANandINFCheckRate
Definition TestHepMC.h:69
bool m_vtxDisplacedTest
Definition TestHepMC.h:53
int m_invalidBeamParticlesCheckRate
Definition TestHepMC.h:66
TH1F * m_h_status_dispVtxCheck
Definition TestHepMC.h:105
bool m_pi0NoVtxTest
Definition TestHepMC.h:55
double m_cme_diff
Definition TestHepMC.h:46
TH1F * m_h_px_dispVtxCheck
Definition TestHepMC.h:106
TH1F * m_h_cmEnergyDiff
Definition TestHepMC.h:129
TH1F * m_h_photon_e2_p2_e2
Definition TestHepMC.h:120
double m_max_energy_diff
Definition TestHepMC.h:47
int m_undisplacedDecayDaughtersOfDisplacedVtxCheckRate
Definition TestHepMC.h:88
bool m_unstableNoVtxTest
Definition TestHepMC.h:54
int m_negativeEnergyTachyonicCheckRate
Definition TestHepMC.h:76
int m_nonG4_energyCheckRate
Definition TestHepMC.h:89
std::string m_paramFile
Definition TestHepMC.h:92
bool m_beamEnergyTest
Definition TestHepMC.h:53

Member Function Documentation

◆ ATLAS_NOT_CONST_THREAD_SAFE() [1/2]

McEventCollection *events GenBase::ATLAS_NOT_CONST_THREAD_SAFE ( )
inherited

Access the current event's McEventCollection.

Note
This function will make a new McEventCollection if there is not already a valid one and MakeMcEvent=True.

◆ ATLAS_NOT_CONST_THREAD_SAFE() [2/2]

HepMC::GenEvent *event GenBase::ATLAS_NOT_CONST_THREAD_SAFE ( )
inlineinherited

Access the current signal event (first in the McEventCollection).

Note
This function will make a new McEventCollection if there is not already a valid one and MakeMcEvent=True.

Definition at line 72 of file GenBase.h.

72 {
73 if (events()->empty())
74 ATH_MSG_ERROR("McEventCollection is empty during first event access");
75 return *(events()->begin());
76 }
#define ATH_MSG_ERROR(x)
static const Attributes_t empty

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ event_const()

const HepMC::GenEvent * GenBase::event_const ( const EventContext & ctx) const
inlineinherited

Access the current signal event (const).

Definition at line 79 of file GenBase.h.

79 {
80 const McEventCollection* coll = events_const(ctx);
81 if (coll->empty())
82 ATH_MSG_ERROR("Const McEventCollection is empty during first event access");
83 return *(coll->begin());
84 }
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
bool empty() const noexcept
Returns true if the collection is empty.
const McEventCollection * events_const(const EventContext &ctx) const
Access the current event's McEventCollection (const).
Definition GenBase.h:93

◆ events_const()

const McEventCollection * GenBase::events_const ( const EventContext & ctx) const
inlineinherited

Access the current event's McEventCollection (const).

Definition at line 93 of file GenBase.h.

93 {
94 SG::ReadHandle<McEventCollection> ret = SG::makeHandle(m_mcevents_const, ctx);
95 if (!ret.isValid())
96 ATH_MSG_ERROR("No McEventCollection found in StoreGate with key " << m_mcevents_const.key());
97 return ret.cptr();
98 }
SG::ReadHandleKey< McEventCollection > m_mcevents_const
Const handle to the MC event collection.
Definition GenBase.h:117
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode TestHepMC::execute ( const EventContext & ctx)
virtual

Execute method.

Uncomment for full debug HepMC3::Print::content(*evt);

Todo
Clean up / improve / apply to all decaying species
Todo
Persuade generator authors to set proper generated masses in HepMC, then really require mass = 0

Reimplemented from GenBase.

Definition at line 271 of file TestHepMC.cxx.

271 {
272
273 // Holder for filter outcome; allows us to check all filters on each event and diagnose multiple problems at once
274 bool filter_pass = true;
275
276 // Loop over all events in McEventCollection
277 for(const HepMC::GenEvent* evt : *events_const(ctx)) {
278 double totalPx = 0;
279 double totalPy = 0;
280 double totalPz = 0;
281 double totalE = 0;
282 double nonG4_energy = 0;
283 std::vector<HepMC::ConstGenParticlePtr> negEnPart;
284 std::vector<HepMC::ConstGenParticlePtr> tachyons;
285 std::vector<HepMC::ConstGenParticlePtr> unstNoEnd;
286 std::vector<HepMC::ConstGenParticlePtr> unDecPi0;
287 std::vector<HepMC::ConstGenParticlePtr> undisplaceds;
288
289 m_looper.findLoops(evt,true);
290 if (!m_looper.loop_particles().empty() || !m_looper.loop_vertices().empty()) {
291 ATH_MSG_DEBUG("Found " << m_looper.loop_vertices().size() << " vertices in loops");
292 ATH_MSG_DEBUG("Found " << m_looper.loop_particles().size() << " particles in loops");
293 ATH_MSG_DEBUG("Please use MC::Loops::findLoops for this event to obtain all particles and vertices in the loops");
294 if (m_maxloops > 0 && m_looper.loop_particles().size() > static_cast<std::size_t>(m_maxloops) ) filter_pass = false;
295 }
296
297 const auto xsec = evt->cross_section();
298 if (!xsec) {
299 ATH_MSG_WARNING("WATCH OUT: event is missing the generator cross-section!");
300 ++m_noXSECset;
301 if (m_allowMissingXSec) {
302 ATH_MSG_WARNING("-> Adding a dummy cross-section for debugging purposes.");
303 // for debugging purposes only -> set a dummy cross-section to make TestHepMC happy
304 std::shared_ptr<HepMC3::GenCrossSection> dummy_xsec = std::make_shared<HepMC3::GenCrossSection>();
305 dummy_xsec->set_cross_section(1.0,0.0);
306 HepMC::GenEvent* evt_nonconst = const_cast<HepMC::GenEvent*>(evt);
307 evt_nonconst->set_cross_section(std::move(dummy_xsec));
308 }
309 else {
310 ATH_MSG_WARNING("-> Will report this as failure.");
311 }
312 }
313
314 // Check beams and work out per-event beam energy
315 std::vector<std::shared_ptr<const HepMC3::GenParticle>> beams_t;
316 for (auto p : evt->beams()) { if (p->status() == 4) beams_t.push_back(std::move(p)); }
317 std::pair<std::shared_ptr<const HepMC3::GenParticle>,std::shared_ptr<const HepMC3::GenParticle>> beams;
318 if (beams_t.size() == 2) {
319 beams.first=beams_t.at(0);
320 beams.second=beams_t.at(1);
321 } else {
322 ATH_MSG_WARNING("Invalid number of beam particles " << beams_t.size() << " this generator interface should be fixed");
324 for (const auto& part: beams_t) HepMC3::Print::line(part);
325 }
326 double cmenergy = m_cm_energy;
327 if (!HepMC::valid_beam_particles(evt)) {
328 ATH_MSG_WARNING("Invalid beam particle pointers -- this generator interface should be fixed");
329 if (cmenergy < 0) ATH_MSG_WARNING("Invalid expected beam energy: " << cmenergy << " MeV");
331 } else {
332 if (!MC::isBeam(beams.first) || !MC::isBeam(beams.second)) {
333 ATH_MSG_WARNING("Beam particles have incorrectly set status -- this generator interface should be fixed");
335 }
336 const double sumE = beams.first->momentum().e() + beams.second->momentum().e();
337 const double sumP = beams.first->momentum().pz() + beams.second->momentum().pz();
338 cmenergy = std::sqrt(sumE*sumE - sumP*sumP);
339
340 if(beams.first->pdg_id() == MC::OXYGEN && beams.second->pdg_id() == MC::OXYGEN){//OO collisions
341 cmenergy /= MC::baryonNumber(MC::OXYGEN); // divided by the total number of nucleons per nucleus
342 }
343 if(beams.first->pdg_id() == MC::LEAD && beams.second->pdg_id() == MC::LEAD){//PbPb collisions
344 cmenergy /= MC::baryonNumber(MC::LEAD); // divided by the total number of nucleons per nucleus
345 }
346 if(beams.first->pdg_id() == MC::OXYGEN && beams.second->pdg_id() == MC::PROTON){//Op collisions
347 cmenergy = -2.0*beams.second->momentum().pz()*std::sqrt(static_cast<double>(MC::numberOfProtons(MC::OXYGEN))/MC::baryonNumber(MC::OXYGEN));
348 }
349 if(beams.first->pdg_id() == MC::PROTON && beams.second->pdg_id() == MC::OXYGEN){//pO collisions
350 cmenergy = 2.0*beams.first->momentum().pz()*std::sqrt(static_cast<double>(MC::numberOfProtons(MC::OXYGEN))/MC::baryonNumber(MC::OXYGEN));
351 }
352 if(beams.first->pdg_id() == MC::LEAD && beams.second->pdg_id() == MC::PROTON){//Pbp collisions
353 cmenergy = -2.0*beams.second->momentum().pz()*std::sqrt(static_cast<double>(MC::numberOfProtons(MC::LEAD))/MC::baryonNumber(MC::LEAD));
354 }
355 if(beams.first->pdg_id() == MC::PROTON && beams.second->pdg_id() == MC::LEAD){//pPb collisions
356 cmenergy = 2.0*beams.first->momentum().pz()*std::sqrt(static_cast<double>(MC::numberOfProtons(MC::LEAD))/MC::baryonNumber(MC::LEAD));
357 }
358 if(beams.first->pdg_id() == MC::OXYGEN && beams.second->pdg_id() == MC::HELIUM){//OHe collisions
359 cmenergy /= std::sqrt(static_cast<double>(MC::baryonNumber(MC::OXYGEN)*MC::baryonNumber(MC::HELIUM)));
360 }
361 if(beams.first->pdg_id() == MC::HELIUM && beams.second->pdg_id() == MC::OXYGEN){//HeO collisions
362 cmenergy /= std::sqrt(static_cast<double>(MC::baryonNumber(MC::OXYGEN)*MC::baryonNumber(MC::HELIUM)));
363 }
364
365 if (m_cm_energy > 0 && std::abs(cmenergy - m_cm_energy) > m_cme_diff) {
366 ATH_MSG_FATAL("Beam particles have incorrect energy: " << m_cm_energy/Gaudi::Units::GeV << " GeV expected, vs. " << cmenergy/Gaudi::Units::GeV << " GeV found");
367 setFilterPassed(false, ctx);
368 if (m_doHist){
369 m_h_beamparticle1_Energy->Fill(beams.first->momentum().e()/Gaudi::Units::GeV);
370 m_h_beamparticle2_Energy->Fill(beams.second->momentum().e()/Gaudi::Units::GeV);
371 m_h_cmEnergyDiff->Fill((cmenergy-m_cm_energy)/Gaudi::Units::GeV);
372 }
374 // Special case: this is so bad that we immediately fail out
375 return StatusCode::FAILURE;
376 }
377 }
378
379 // Check vertices
380 int vtxDisplacedstatuscode12CheckRateCnt=0;
381 int vtxDisplacedstatuscodenot12CheckRateCnt=0;
382 int vtxDisplacedMoreThan_1m_CheckRateCnt=0;
383 for (const auto& vtx: evt->vertices()) {
384 const HepMC::FourVector pos = vtx->position();
385
386 // Check for NaNs and infs in vertex position components
387 if ( std::isnan(pos.x()) || std::isinf(pos.x()) ||
388 std::isnan(pos.y()) || std::isinf(pos.y()) ||
389 std::isnan(pos.z()) || std::isinf(pos.z()) ) {
390 ATH_MSG_WARNING("NaN (Not A Number) or inf found in the event record vertex positions");
391
393 if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
394 if (m_vtxNaNTest) {
395 filter_pass = false;
396 }
397 } // Done of checking for nans and infinities
398
399 // Check for too-far-displaced vertices
400 // Anything which propagates macroscopically should be set stable in evgen for G4 to handle
401 const double dist_trans2 = pos.x()*pos.x() + pos.y()*pos.y(); // in mm2
402 const double dist2 = dist_trans2 + pos.z()*pos.z(); // in mm2
403 const double dist_trans = std::sqrt(dist_trans2); // in mm
404 const double dist = std::sqrt(dist2); // in mm
405 if (dist2 > m_max_dist*m_max_dist) {
406 ATH_MSG_WARNING("Found vertex position displaced by more than " << m_max_dist << "mm: " << dist << "mm");
407 ++vtxDisplacedMoreThan_1m_CheckRateCnt;
408
409 if (m_vtxDisplacedTest) {
410 filter_pass = false;
411 }
412 }
413 if (dist_trans2 < m_min_dist_trans*m_min_dist_trans) {
414 ATH_MSG_WARNING("Found vertex position displaced by less than " << m_min_dist_trans
415 << "mm in transverse distance: " << dist_trans << "mm");
416
417 for (const auto& part: vtx->particles_in()) {
418 if (m_dumpEvent){
419 ATH_MSG_WARNING("Incoming particle : ");
420 HepMC::Print::line(msg( MSG::WARNING ).stream(), part);
421 }
422 }
423
424 if (m_vtxDisplacedTest) {
425 filter_pass = false;
426 }
427 }
428
429 if (dist_trans2 > m_max_dist_trans*m_max_dist_trans) {
430 ATH_MSG_WARNING("Found vertex position displaced by more than " << m_max_dist_trans << "mm in transverse distance: " << dist_trans << "mm");
431
432 for (const auto& part: vtx->particles_in()) {
433 if (m_dumpEvent){
434 ATH_MSG_WARNING("Outgoing particle : ");
435 HepMC::Print::line(msg( MSG::WARNING ).stream(),part);
436 }
437 ATH_MSG_WARNING("production vertex = " << part->production_vertex()->position().x() << ", " << part->production_vertex()->position().y() << ", " << part->production_vertex()->position().z());
438 ATH_MSG_WARNING("end vertex = " << part->end_vertex()->position().x() << ", " << part->end_vertex()->position().y() << ", " << part->end_vertex()->position().z());
439 if (m_dumpEvent) ATH_MSG_WARNING("parents info: ");
440 if (part->production_vertex()) {
441 for(const auto& p_parents: part->production_vertex()->particles_in()) {
442 if (m_dumpEvent){
443 msg(MSG::WARNING) << "\t";
444 HepMC::Print::line( msg( MSG::WARNING ).stream() , p_parents );
445 }
446 }
447 } // Done with fancy print
448
449 if (part->status() == 1 || part->status() == 2){
450 vtxDisplacedstatuscode12CheckRateCnt += 1;
451 } else {
452 vtxDisplacedstatuscodenot12CheckRateCnt += 1;
453 }
454
455 if (m_doHist){
456 m_h_energy_dispVtxCheck->Fill(part->momentum().e()/Gaudi::Units::GeV);
457 if (part->momentum().e()/Gaudi::Units::GeV < 10.) {
458 m_h_energy_dispVtxCheck_lt10->Fill(part->momentum().e()/Gaudi::Units::GeV);
459 }
460 m_h_pdgid_dispVtxCheck->Fill(part->pdg_id());
461 m_h_status_dispVtxCheck->Fill(part->status());
462 m_h_px_dispVtxCheck->Fill(part->momentum().px()/Gaudi::Units::GeV);
463 m_h_py_dispVtxCheck->Fill(part->momentum().py()/Gaudi::Units::GeV);
464 m_h_pz_dispVtxCheck->Fill(part->momentum().pz()/Gaudi::Units::GeV);
465 m_h_vx_dispVtxCheck->Fill(part->end_vertex()->position().x());
466 m_h_vy_dispVtxCheck->Fill(part->end_vertex()->position().y());
467 m_h_vz_dispVtxCheck->Fill(part->end_vertex()->position().z());
468 m_h_vxprod_dispVtxCheck->Fill(part->production_vertex()->position().x());
469 m_h_vyprod_dispVtxCheck->Fill(part->production_vertex()->position().y());
470 m_h_vzprod_dispVtxCheck->Fill(part->production_vertex()->position().z());
471 double endvx = part->end_vertex()->position().x();
472 double endvy = part->end_vertex()->position().y();
473 double endvz = part->end_vertex()->position().z();
474 double prodvx = part->production_vertex()->position().x();
475 double prodvy = part->production_vertex()->position().y();
476 double prodvz = part->production_vertex()->position().z();
477 double enddis = std::sqrt(endvx*endvx + endvy*endvy + endvz*endvz);
478 double proddis = std::sqrt(prodvx*prodvx + prodvy*prodvy + prodvz*prodvz);
479 m_h_vtxend_dispVtxCheck->Fill(enddis);
480 m_h_vtxprod_dispVtxCheck->Fill(proddis);
481 } // End of the filling of histograms for bad vertices
482 } // End of a loop over theparents of the bad vertex
483 } // Found a bad vertex
484 } // Loop over all vertices
485 if (vtxDisplacedstatuscode12CheckRateCnt>0) ++m_vtxDisplacedstatuscode12CheckRate;
486 if (vtxDisplacedstatuscodenot12CheckRateCnt>0) ++m_vtxDisplacedstatuscodenot12CheckRate;
487 if (vtxDisplacedMoreThan_1m_CheckRateCnt>0) ++m_vtxDisplacedMoreThan_1m_CheckRate;
488
489 // Check particles
490 for (auto pitr: *evt) {
491
492 // Local loop variables to clean up the check code
493 const HepMC::FourVector pmom = pitr->momentum();
494 const int pstatus = pitr->status();
495 const int ppdgid = pitr->pdg_id();
496 // Check for NaNs and infs in momentum components
497 if ( std::isnan(pmom.px()) || std::isinf(pmom.px()) ||
498 std::isnan(pmom.py()) || std::isinf(pmom.py()) ||
499 std::isnan(pmom.pz()) || std::isinf(pmom.pz()) ||
500 std::isnan(pmom.e()) || std::isinf(pmom.e()) ) {
501 ATH_MSG_WARNING("NaN (Not A Number) or inf found in the event record momenta");
503
504 if (m_dumpEvent) HepMC::Print::line(std::cout,pitr);
505 if (m_momNaNTest) {
506 filter_pass = false;
507 }
508 } // End of check for NaNs and infinities
509
510 // Check for undecayed pi0s
511 if (MC::isStable(pstatus) || MC::isDecayed(pstatus)) {
512 if (ppdgid == 111 && !pitr->end_vertex() ) {
513 unDecPi0.push_back( pitr);
515 }
516 } // End of check for undecayed pi0s
517
518 //check stable particle lifetimes
519 if (MC::isStable(pstatus)) {
520 const auto plifetime = m_gendata->particleLifetime(ppdgid);
521 if (plifetime) {
522 double lifetime = plifetime.value()*1e+12; // why lifetime doesn't come in common units???
523 if (lifetime != 0 && lifetime < m_min_tau) { // particles with infinite lifetime get a 0 in the PDT
524 ATH_MSG_WARNING("Stable particle found with lifetime = " << lifetime << "~ns!!");
525 if (m_dumpEvent) HepMC::Print::line(std::cout,pitr);
526
528
529 if (m_lifeTimeTest) {
530 filter_pass = false;
531 }
532 } // Particle did not have infinite lifetime
533 } // The particle has a data table (so a lifetime)
534 else{
535 int susyPart = 0;
536 std::vector<int>::size_type count = 0;
537 while (susyPart==0 && (count < m_SusyPdgID_tab.size() )){
538 // no warning for SUSY particles from the list susyParticlePdgid.txt
539 if (m_SusyPdgID_tab[count] == std::abs(ppdgid)) {
540 susyPart=1;
541 }
542 count++;
543 } // Look through the SUSY table to see if this one should be counted
544 if (susyPart==0){
545 ATH_MSG_WARNING("Stable particle not found in PDT, no lifetime check done");
546 if (m_dumpEvent) HepMC::Print::line(std::cout,pitr);
547 } // It's a SUSY particle -- skip the lifetime check
548 } // The particle has no data table
549 } // Test if the particle is stable
550
551 //Check that stable particles are known by G4 or they are non-interacting
552 const MC::DecodedPID decodedPID(ppdgid);
553 const int first_dig = decodedPID(0);
554
555 if (MC::isStable(pstatus) && (!pitr->end_vertex()) && (MC::isSimInteracting(pitr)) && (!MC::isNucleus(ppdgid)) && (first_dig != 9) ) {
556
557 int known_byG4 = 0;
558 std::vector<int>::size_type count =0;
559
560 while (known_byG4==0 && count < m_G4pdgID_tab.size()){
561 if(ppdgid == m_G4pdgID_tab[count]) known_byG4=1;
562 count++;
563 }
564 if(known_byG4==0){
565 nonG4_energy += pmom.e();
566 ATH_MSG_WARNING("Interacting particle not known by Geant4 with ID " << ppdgid);
567 }
568 } // End of check that stable particles are known to G4 or are non-interacting
569
570 // Check for bad PDG IDs
571 if (!MC::isValid(ppdgid)){
572 ATH_MSG_DEBUG("Invalid PDG ID found: " << ppdgid);
573 if (m_unknownPDGIDTest && std::find(m_uknownPDGID_tab.begin(),m_uknownPDGID_tab.end(),ppdgid)==m_uknownPDGID_tab.end()){
574 ATH_MSG_WARNING("Invalid and unmasked PDG ID found: " << ppdgid);
575 filter_pass = false;
577 }
578 } // End of check for invalid PDG IDs
579
580 // Check for unstables with no end vertex,
581 if (!pitr->end_vertex() && MC::isDecayed(pstatus)) {
582 unstNoEnd.push_back(pitr);
584 } // End of check for unstable with no end vertex
585
586 // Sum final state mom/energy, and note negative energy / tachyonic particles
587 // std::cout << "status " << pstatus << " e " << pmom.e() << " pz " << pmom.pz()<< std::endl;
588 if ( MC::isStable(pstatus) && !pitr->end_vertex() ) {
589 totalPx += pmom.px();
590 totalPy += pmom.py();
591 totalPz += pmom.pz();
592 totalE += pmom.e();
593 if (pmom.e() < 0) {
594 negEnPart.push_back(pitr);
596 }
597 const double aener = std::abs(pmom.e());
598 if ( aener+m_accur_margin < std::abs(pmom.px()) || aener+m_accur_margin < std::abs(pmom.py()) || aener+m_accur_margin < std::abs(pmom.pz()) ) {
599 tachyons.push_back(pitr);
601 }
602 } // End of sums for momentum and energy conservation
603
604 // Decay checks (uses PdgToSearch attr value, for tau by default)
606 int tau_child = 0;
607 if (std::abs(ppdgid) == m_pdg && (MC::isStable(pstatus) || MC::isDecayed(pstatus))) {
608 ++m_TotalTaus;
609 auto vtx = pitr->end_vertex();
610 if (vtx) {
611 double p_energy = 0;
612 for (auto desc: HepMC::descendant_particles(vtx)) {
613 if (std::abs(desc->pdg_id()) == m_pdg) tau_child = 1;
614 if ( MC::isStable(desc) ) p_energy += desc->momentum().e();
615 }
616 if (std::abs( p_energy - pmom.e()) > m_energy_diff && !tau_child) {
617 ATH_MSG_WARNING("Energy sum (decay products): "
618 << "Energy (original particle) > " << m_energy_diff << " MeV, "
619 << "Event #" << evt->event_number() << ", "
620 << "The original particle = " << pitr);
622 if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
623 }
624 //most taus should not decay immediately
625 const HepMC::FourVector tau_decaypos = vtx->position();
626 const double tau_displacement = tau_decaypos.x()*tau_decaypos.x() + tau_decaypos.y()*tau_decaypos.y() + tau_decaypos.z()*tau_decaypos.z();
627 //tau_child != 1 exclude cases in which a tau is copied to another vertex or emits a photon
628 if ((tau_displacement < 1.e-6) && (tau_child!=1)) ++m_FastDecayedTau;
629 } else {
630 ATH_MSG_WARNING("UNDECAYED PARTICLE WITH PDG_ID = " << m_pdg);
632 if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
633 }
634 } // End of checks for specific particle (tau by default)
635
636 // Check for undisplaced decay daughters from long-lived hadrons
637 if (pitr->end_vertex()) {
638 auto decayvtx = pitr->end_vertex();
639 const HepMC::FourVector decaypos = decayvtx->position();
640 const double displacement = decaypos.x()*decaypos.x() + decaypos.y()*decaypos.y() + decaypos.z()*decaypos.z();
641 if (displacement > 1e-6) {
642 for (auto ip: *decayvtx) {
643 const HepMC::FourVector pos2 = ip->production_vertex()->position();
644 const double displacement2 = pos2.x()*pos2.x() + pos2.y()*pos2.y() + pos2.z()*pos2.z();
645 if (displacement2 < 1e-6) {
646 ATH_MSG_WARNING("Decay child " << ip << " from " << pitr
647 << " has undisplaced vertex (" << ip->production_vertex()
648 << " @ " << displacement2 << "mm) "
649 << " but parent vertex is displaced (" << decayvtx
650 << " @ " << displacement << "mm)");
651 undisplaceds.push_back(std::move(ip));
653 } // Check for displacement below 1 um
654 } // Loop over all particles coming from the decay vertex
655 } // Displacement of greater than 1 um
656 } // End of check for undisplaced decay daughters from long-lived hadrons
657
658 // Check for photons with non-zero masses
660 if (MC::isPhoton(ppdgid) && MC::isStable(pstatus)) {
661 const double mass = pitr->generated_mass();
662 if (std::abs(mass) > 1.0) { // in MeV
663 ATH_MSG_WARNING("Photon with non-zero mass found! Mass: " << mass << " MeV" << pitr);
665 }
666 } // End check for photons with too-large a mass
667
668 } // End of loop over particles in the event
669
670 // Energy of interacting particles not known by Geant4
671 if(nonG4_energy > m_nonG4_energy_threshold) {
672 ATH_MSG_WARNING("The energy of interacting particles not known by Geant4 is = " << nonG4_energy << " MeV");
673 if (m_energyG4Test) {
674 filter_pass = false;
675 }
677 } // End of check for interacting particles not known by G4
678
679 // Energy balance
680 double lostE = std::abs(totalE - cmenergy);
681 if (lostE > m_energy_diff) {
682 ATH_MSG_WARNING("ENERGY BALANCE FAILED : E-difference = " << lostE << " MeV");
683
684 ATH_MSG_WARNING("balance " << totalPx << " " << totalPy << " " << totalPz << " " << totalE);
685
686 if (m_doHist){
687 m_h_energyImbalance->Fill(lostE/Gaudi::Units::GeV);
688 }
689 if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
691 filter_pass = false;
692 }
694 } // End of energy balance check
695
696 // Momentum balance
697 if ( std::abs(totalPx) > m_energy_diff || std::abs(totalPy) > m_energy_diff || std::abs(totalPz) > m_energy_diff ) {
698 ATH_MSG_WARNING("MOMENTUM BALANCE FAILED : SumPx = " << totalPx << " SumPy = " << totalPy << " SumPz = " << totalPz << " MeV");
699 if (m_doHist){
700 m_h_momentumImbalance_px->Fill(std::abs(totalPx)/Gaudi::Units::GeV);
701 m_h_momentumImbalance_py->Fill(std::abs(totalPy)/Gaudi::Units::GeV);
702 m_h_momentumImbalance_pz->Fill(std::abs(totalPz)/Gaudi::Units::GeV);
703 }
704 if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
705 if (m_momImbalanceTest) {
706 filter_pass = false;
707 }
709 } // End of momentum balance check
710
711 // Negative energy particles
712 if (!negEnPart.empty()) {
713 std::stringstream ss;
714 ss << "NEGATIVE ENERGY PARTICLES FOUND :";
715 for (const auto &b: negEnPart){
716 ss << " " << b;
717 }
718 ATH_MSG_WARNING(ss.str());
719 if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
721 filter_pass = false;
722 }
724 } // End of negative energy particle chedk
725
726 // Tachyons
727 if (!tachyons.empty()) {
728 std::stringstream ss;
729 ss << "PARTICLES WITH |E| < |Pi| (i=x,y,z) FOUND :";
730 for (auto b: tachyons){
731 ss << " " << b;
732 }
733 ATH_MSG_WARNING(ss.str());
734 if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
735 if (m_tachyonsTest) {
736 filter_pass = false;
737 }
739 } // End of tachyon check
740
741 // Unstable particles with no decay vertex
742 if (!unstNoEnd.empty()) {
743 std::stringstream ss;
744 ss << "Unstable particle with no decay vertex found: ";
745 for (auto b: unstNoEnd){
746 ss << " " << b;
747 }
748 ATH_MSG_WARNING(ss.str());
749 if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
751 filter_pass = false;
752 }
754 } // End of unstable particle with no decay vertex check
755
756 // Undecayed pi0
757 if (!unDecPi0.empty()) {
758 std::stringstream ss;
759 ss << "pi0 with no decay vertex found:";
760 for (auto b: unDecPi0){
761 ss << " " << b;
762 }
763 ATH_MSG_WARNING(ss.str());
764 if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
765 if (m_pi0NoVtxTest) {
766 filter_pass = false;
767 }
769 } // End of undecayed pi0 check
770
771 // Undisplaced decay daughters of displaced vertices
772 if (!undisplaceds.empty()) {
773 std::stringstream ss{"Undisplaced decay vertices from displaced particle: "};
774 for (HepMC::ConstGenParticlePtr b: undisplaceds){
775 // coverity[COPY_INSTEAD_OF_MOVE]
776 ss << " " << b;
777 }
778 ATH_MSG_WARNING(ss.str());
779 if (m_dumpEvent) HepMC::Print::content(std::cout,*evt);
781 filter_pass = false;
782 }
784 } // End of undisplaced decay daughter of displaced vertices check
785
786 } // End of loop over MCEventCollection
787
788 // End of execution for each event - update filter value
789 if (!filter_pass){
790 setFilterPassed(false, ctx);
791 ++m_nFail;
792 } else {
793 ++m_nPass;
794 }
795
796 // If the efficiency after 100 events is below 10%, there is an important bug going on:
797 // we fail the job immediately so it doesn't run for ever
798 const double tmp_efficiency = double(m_nPass) / double(m_nPass + m_nFail);
799 if ((m_nPass + m_nFail) > 100 && tmp_efficiency < 0.1) {
800 ATH_MSG_FATAL("The efficiency after " << m_nPass + m_nFail << " events is " << tmp_efficiency*100. << "% !!!");
801 return StatusCode::FAILURE;
802 }
803
804 return StatusCode::SUCCESS;
805}
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
static Double_t ss
virtual void setFilterPassed(bool state, const EventContext &ctx) const
std::vector< int > m_uknownPDGID_tab
Definition TestHepMC.h:97
MC::Loops< HepMC::GenEvent, HepMC::ConstGenParticlePtr, HepMC::ConstGenVertexPtr > m_looper
member to detect loops
Definition TestHepMC.h:131
std::vector< int > m_G4pdgID_tab
Definition TestHepMC.h:95
std::shared_ptr< GenData > m_gendata
Definition TestHepMC.h:133
std::vector< int > m_SusyPdgID_tab
Definition TestHepMC.h:96
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:148
HepMC3::FourVector FourVector
HepMC3::ConstGenParticlePtr ConstGenParticlePtr
Definition GenParticle.h:20
bool valid_beam_particles(const GenEvent *e)
Definition GenEvent.h:599
HepMC3::GenEvent GenEvent
Definition GenEvent.h:39
int numberOfProtons(const T &p)
static const int HELIUM
static const int OXYGEN
bool isPhoton(const T &p)
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
bool isSimInteracting(const T &p)
Identify if the particle could interact with the detector during the simulation, e....
static const int LEAD
bool isDecayed(const T &p)
Identify if the particle decayed.
bool isBeam(const T &p)
Identify if the particle is beam particle.
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
bool isNucleus(const T &p)
PDG rule 16 Nuclear codes are given as 10-digit numbers ±10LZZZAAAI.
double baryonNumber(const T &p)
static const int PROTON

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 89 of file AthCommonAlgorithm.cxx.

54{
55 // If we didn't find any symlinks to add, just return the collection
56 // from the base class. Otherwise, return the extended collection.
57 if (!m_extendedExtraObjects.empty()) {
59 }
61}
Common base class for algorithms.

◆ filterPassed()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Get filter decision:

Definition at line 93 of file AthCommonAlgorithm.h.

93 {
94 return execState( ctx ).filterPassed();
95 }
virtual bool filterPassed(const EventContext &ctx) const
Get filter decision:

◆ finalize()

StatusCode TestHepMC::finalize ( )

Definition at line 808 of file TestHepMC.cxx.

808 {
809
810 ATH_MSG_INFO("Events passed = " << m_nPass << ", Events Failed = " << m_nFail);
811 // Keep a denominator for all the fractions, to ensure we don't get a bunch of nans.
812 // If nothing passed or failed, all the other counters should be zero; this is just avoiding FPEs etc.
813 double denom = m_nPass + m_nFail > 0. ? m_nPass + m_nFail : 1.;
814
815 ATH_MSG_INFO(" Event rate with invalid Beam Particles = " << m_invalidBeamParticlesCheckRate*100.0/denom << "% (not included in test efficiency)");
816 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)");
817 ATH_MSG_INFO(" Event rate with incorrect beam particle energies = " << m_beamEnergyCheckRate*100.0/denom << "% (not included in test efficiency)");
818 ATH_MSG_INFO(" Configured minimum transverse vertex displacement = " << m_min_dist_trans << "~mm");
819 ATH_MSG_INFO(" Event rate with NaN (Not A Number) or inf found in the event record vertex positions = " << m_vtxNANandINFCheckRate*100.0/denom << "%");
820 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 ");
821 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/denom << "% (not included in test efficiency)");
822 ATH_MSG_INFO(" Event rate with vertices displaced more than " << m_max_dist << "~mm = " << m_vtxDisplacedMoreThan_1m_CheckRate*100.0/denom << "%");
823 if (!m_vtxDisplacedTest) ATH_MSG_INFO(" The check for displaced vertices is switched off, so is not included in the final TestHepMC efficiency ");
824 ATH_MSG_INFO(" Event rate with NAN (Not A Number) or inf found in particle momentum values = " << m_partMomentumNANandINFCheckRate*100.0/denom << "%");
825 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 ");
826 ATH_MSG_INFO(" Event rate with undecayed pi0's with status 1 or 2 = " << m_undecayedPi0statuscode12CheckRate*100.0/denom << "% (not included in test efficiency)");
827 ATH_MSG_INFO(" Event rate with unstable particles with no end vertex = " << m_unstableNoEndVtxCheckRate*100.0/denom << "% (not included in test efficiency)");
828 ATH_MSG_INFO(" Event rate with negative total energy like for tachyonic particles = " << m_negativeEnergyTachyonicCheckRate*100.0/denom << "% (not included in test efficiency)");
829 ATH_MSG_INFO(" Event rate with particles with improper decay properties = " << m_decayCheckRate*100.0/denom << "% (not included in test efficiency)");
830 ATH_MSG_INFO(" Event rate with undisplaced daughters of long lived hadrons = " << m_undisplacedLLHdaughtersCheckRate*100.0/denom << "% (not included in test efficiency)");
831 ATH_MSG_INFO(" Event rate with non zero photon mass = " << m_nonZeroPhotonMassCheckRate*100.0/denom << "% (not included in test efficiency)");
832 ATH_MSG_INFO(" Event rate with no energy balance = " << m_energyBalanceCheckRate*100.0/denom << "%");
833 if (!m_energyImbalanceTest) ATH_MSG_INFO(" The check for energy imbalance is switched off, so is not included in the final TestHepMC efficiency ");
834 ATH_MSG_INFO(" Event rate with no momentum balance = " << m_momentumBalanceCheckRate*100.0/denom << "%");
835 if (!m_momImbalanceTest) ATH_MSG_INFO(" The check for momentum imbalance is switched off, so is not included in the final TestHepMC efficiency ");
836 ATH_MSG_INFO(" Event rate with negative energy particles = " << m_negativeEnergyCheckRate*100.0/denom << "%");
837 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 ");
838 ATH_MSG_INFO(" Event rate with tachyons = " << m_tachyonCheckRate*100.0/denom << "%");
839 if (!m_tachyonsTest) ATH_MSG_INFO(" The check for tachyons is switched off, so is not included in the final TestHepMC efficiency ");
840 ATH_MSG_INFO(" Event rate with stable or unstable particles with no parents = " << m_stableUnstableNoParentCheckRate*100.0/denom << "%");
841 ATH_MSG_INFO(" Event rate with unstable particle with no decay vertex = " << m_unstablePartNoDecayVtxCheckRate*100.0/denom << "%");
842 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 ");
843 ATH_MSG_INFO(" Event rate with undecayed Pi0's = " << m_undecayedPi0CheckRate*100.0/denom << "%");
844 if (!m_pi0NoVtxTest) ATH_MSG_INFO(" The check for undecayed pi0's is switched off, so is not included in the final TestHepMC efficiency ");
845 ATH_MSG_INFO(" Event rate with undisplaced decay daughters of displaced vertices = " << m_undisplacedDecayDaughtersOfDisplacedVtxCheckRate*100.0/denom << "%");
846 if (!m_undisplacedDaughtersTest) ATH_MSG_INFO(" The check for undisplaced daughters is switched off, so is not included in the final TestHepMC efficiency ");
847 ATH_MSG_INFO(" Event rate with particles with status 1 but lifetime < " << m_min_tau << "~ns = " << m_Status1ShortLifetime*100.0/denom << "%");
848 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 ");
849 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/denom << "%");
850 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 ");
851 ATH_MSG_INFO(" Event rate with unknown PDG IDs = " << m_unknownPDGIDCheckRate*100.0/denom << "%");
852 if (!m_unknownPDGIDTest) ATH_MSG_INFO(" The check for unknown PDG IDs is sitched off, so it is not included in the final TestHepMC efficiency ");
853
854 const double tau_fastDrate = double(m_FastDecayedTau) / double(m_TotalTaus);
855 if(tau_fastDrate > m_tau_eff_threshold){
856 ATH_MSG_FATAL("MORE THAN " << 100.*m_tau_eff_threshold << "% OF TAUS DECAYING IMMEDIATELY! " << m_FastDecayedTau << " found, out of: " << m_TotalTaus);
857 return StatusCode::FAILURE;
858 }
859
860 if (m_noXSECset) {
861 if (m_allowMissingXSec) {
862 ATH_MSG_WARNING(m_noXSECset << " EVENTS WITHOUT CROSS-SECTION!!! Added dummy cross-section instead.");
863 }
864 else {
865 ATH_MSG_FATAL(m_noXSECset << " EVENTS WITHOUT CROSS-SECTION!! Check the setup before production!");
866 return StatusCode::FAILURE;
867 }
868 }
869
870 const double efficiency = double(m_nPass) / double(m_nPass + m_nFail);
871 ATH_MSG_INFO("Efficiency = " << efficiency * 100 << "%");
872
873 // Check efficiency, and fail (to kill production jobs) if the pass rate is too low
875 ATH_MSG_FATAL("EFFICIENCY ABOVE ERROR THRESHOLD! " << 100*efficiency << "% found, but at least: " << 100*m_eff_fail_threshold << "% required");
876 return StatusCode::FAILURE;
877 } else if (efficiency <= m_eff_warn_threshold) {
878 ATH_MSG_WARNING("EFFICIENCY ABOVE WARNING THRESHOLD! " << 100*efficiency << "% found, but at least: " << 100*m_eff_warn_threshold << "% expected");
879 }
880
881 return StatusCode::SUCCESS;
882}
#define ATH_MSG_INFO(x)
void efficiency(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")

◆ initialize()

StatusCode TestHepMC::initialize ( )
virtual

Reimplemented from GenBase.

Definition at line 131 of file TestHepMC.cxx.

131 {
133 m_gendata = std::make_shared<GenData>();
134
135 if (m_doHist){
136 CHECK(m_thistSvc.retrieve());
137
138 m_h_energy_dispVtxCheck = new TH1F("h_energy_dispVtxCheck", "h_energy_dispVtxCheck", 2000, 0., 2000.);
139 m_h_energy_dispVtxCheck_lt10 = new TH1F("h_energy_dispVtxCheck_lt10", "h_energy_dispVtxCheck_lt10", 1000, 0., 10.);
140 m_h_pdgid_dispVtxCheck = new TH1F("h_pdgid_dispVtxCheck", "h_pdgid_dispVtxCheck", 10000, 0., 10000.);
141 m_h_status_dispVtxCheck = new TH1F("h_status_dispVtxCheck", "h_status_dispVtxCheck", 10000, 0., 10000.);
142 m_h_px_dispVtxCheck = new TH1F("h_px_dispVtxCheck", "h_px_dispVtxCheck", 4000, -2000., 2000.);
143 m_h_py_dispVtxCheck = new TH1F("h_py_dispVtxCheck", "h_py_dispVtxCheck", 4000, -2000., 2000.);
144 m_h_pz_dispVtxCheck = new TH1F("h_pz_dispVtxCheck", "h_pz_dispVtxCheck", 4000, -2000., 2000.);
145 m_h_vx_dispVtxCheck = new TH1F("h_vx_dispVtxCheck", "h_vx_dispVtxCheck", 40000, -200., 200);
146 m_h_vy_dispVtxCheck = new TH1F("h_vy_dispVtxCheck", "h_vy_dispVtxCheck", 40000, -200., 200);
147 m_h_vz_dispVtxCheck = new TH1F("h_vz_dispVtxCheck", "h_vz_dispVtxCheck", 40000, -200., 200);
148 m_h_vxprod_dispVtxCheck = new TH1F("h_vxprod_dispVtxCheck", "h_vxprod_dispVtxCheck", 40000, -200., 200.);
149 m_h_vyprod_dispVtxCheck = new TH1F("h_vyprod_dispVtxCheck", "h_vyprod_dispVtxCheck", 40000, -200., 200.);
150 m_h_vzprod_dispVtxCheck = new TH1F("h_vzprod_dispVtxCheck", "h_vzprod_dispVtxCheck", 40000, -200., 200.);
151 m_h_vtxprod_dispVtxCheck = new TH1F("h_vtxprod_dispVtxCheck", "h_vtxprod_dispVtxCheck", 20000, 0., 200.);
152 m_h_vtxend_dispVtxCheck = new TH1F("h_vtxend_dispVtxCheck", "h_vtxend_dispVtxCheck", 20000, 0., 200.);
153 m_h_photon_mass = new TH1F("h_photon_mass", "h_photon_mass", 20000, -10000., 10000);
154 m_h_photon_energy = new TH1F("h_photon_energy", "h_photon_energy", 20000, -10000., 10000);
155 m_h_photon_e2_p2_e2 = new TH1F("h_photon_e2_p2_e2", "h_photon_e2_p2_e2", 20000, -10., 10);
156 m_h_energyImbalance = new TH1F("h_energyImbalance", "h_energyImbalance", 2000, 0., 2000.);
157 m_h_momentumImbalance_px = new TH1F("h_momentumImbalance_px", "h_momentumImbalance_px", 2000,0., 2000.);
158 m_h_momentumImbalance_py = new TH1F("h_momentumImbalance_py", "h_momentumImbalance_py", 2000,0., 2000.);
159 m_h_momentumImbalance_pz = new TH1F("h_momentumImbalance_pz", "h_momentumImbalance_pz", 2000,0., 2000.);
160 m_h_beamparticle1_Energy = new TH1F("h_beamparticle1_Energy", "h_beamparticle1_Energy", 14000,0., 14000.);
161 m_h_beamparticle2_Energy = new TH1F("h_beamparticle2_Energy", "h_beamparticle2_Energy", 14000,0., 14000.);
162 m_h_cmEnergyDiff = new TH1F("h_cmEnergyDiff", "h_cmEnergyDiff", 8000, -4000., 4000.);
163
164 CHECK(m_thistSvc->regHist("/TestHepMCname/h_energy_dispVtxCheck", m_h_energy_dispVtxCheck));
165 CHECK(m_thistSvc->regHist("/TestHepMCname/h_energy_dispVtxCheck_lt10", m_h_energy_dispVtxCheck_lt10));
166 CHECK(m_thistSvc->regHist("/TestHepMCname/h_pdgid_dispVtxCheck", m_h_pdgid_dispVtxCheck));
167 CHECK(m_thistSvc->regHist("/TestHepMCname/h_status_dispVtxCheck", m_h_status_dispVtxCheck));
168 CHECK(m_thistSvc->regHist("/TestHepMCname/h_px_dispVtxCheck", m_h_px_dispVtxCheck));
169 CHECK(m_thistSvc->regHist("/TestHepMCname/h_py_dispVtxCheck", m_h_py_dispVtxCheck));
170 CHECK(m_thistSvc->regHist("/TestHepMCname/h_pz_dispVtxCheck", m_h_pz_dispVtxCheck));
171 CHECK(m_thistSvc->regHist("/TestHepMCname/h_vx_dispVtxCheck", m_h_vx_dispVtxCheck));
172 CHECK(m_thistSvc->regHist("/TestHepMCname/h_vy_dispVtxCheck", m_h_vy_dispVtxCheck));
173 CHECK(m_thistSvc->regHist("/TestHepMCname/h_vz_dispVtxCheck", m_h_vz_dispVtxCheck));
174 CHECK(m_thistSvc->regHist("/TestHepMCname/h_vxprod_dispVtxCheck", m_h_vxprod_dispVtxCheck));
175 CHECK(m_thistSvc->regHist("/TestHepMCname/h_vyprod_dispVtxCheck", m_h_vyprod_dispVtxCheck));
176 CHECK(m_thistSvc->regHist("/TestHepMCname/h_vzprod_dispVtxCheck", m_h_vzprod_dispVtxCheck));
177 CHECK(m_thistSvc->regHist("/TestHepMCname/h_vtxprod_dispVtxCheck", m_h_vtxprod_dispVtxCheck));
178 CHECK(m_thistSvc->regHist("/TestHepMCname/h_vtxend_dispVtxCheck", m_h_vtxend_dispVtxCheck));
179 CHECK(m_thistSvc->regHist("/TestHepMCname/h_photon_mass", m_h_photon_mass));
180 CHECK(m_thistSvc->regHist("/TestHepMCname/h_photon_energy", m_h_photon_energy));
181 CHECK(m_thistSvc->regHist("/TestHepMCname/h_photon_e2_p2_e2", m_h_photon_e2_p2_e2));
182 CHECK(m_thistSvc->regHist("/TestHepMCname/h_energyImbalance", m_h_energyImbalance));
183 CHECK(m_thistSvc->regHist("/TestHepMCname/h_momentumImbalance_px", m_h_momentumImbalance_px));
184 CHECK(m_thistSvc->regHist("/TestHepMCname/h_momentumImbalance_py", m_h_momentumImbalance_py));
185 CHECK(m_thistSvc->regHist("/TestHepMCname/h_momentumImbalance_pz", m_h_momentumImbalance_pz));
186 CHECK(m_thistSvc->regHist("/TestHepMCname/h_beamparticle1_Energy", m_h_beamparticle1_Energy));
187 CHECK(m_thistSvc->regHist("/TestHepMCname/h_beamparticle2_Energy", m_h_beamparticle2_Energy));
188 CHECK(m_thistSvc->regHist("/TestHepMCname/h_cmEnergyDiff", m_h_cmEnergyDiff));
189
190 ATH_MSG_INFO("No decay vertex - is ignored for particles with status (list):" );
191 for ( unsigned int i = 0; i < m_vertexStatuses.size(); i++ ) ATH_MSG_INFO(" : " << m_vertexStatuses.at(i) );
192 ATH_MSG_INFO("Vertex statuses finished");
193
194 } // End of histogramming setup
195
196 // open the files and read G4particle_acceptlist.txt
197
198 const std::string& fileLocation = PathResolverFindDataFile ( "G4particle_acceptlist.txt" );
199 std::ifstream G4file;
200 G4file.open(fileLocation);
201 std::string line;
202 int G4pdgID;
203 if (!G4file.fail()){
204 while(std::getline(G4file,line)){
205 std::stringstream ss(line);
206 ss >> G4pdgID;
207 m_G4pdgID_tab.push_back(G4pdgID);
208 }
209 G4file.close();
210 }
211 else {
212 ATH_MSG_WARNING("Failed to open G4particle_acceptlist.txt, checking that all particles are known by Genat4 cannot be performed");
213 }
214
215 // Open the param file (G4 accept list)
216 G4file.open(m_paramFile.c_str());
217 if (!G4file.fail()){
218 ATH_MSG_INFO("extra accept list for G4 found " << m_paramFile.c_str());
219 while(std::getline(G4file,line)){
220 std::stringstream ss(line);
221 ss >> G4pdgID;
222 m_G4pdgID_tab.push_back(G4pdgID);
223 }
224 G4file.close();
225 }
226 else {
227 ATH_MSG_INFO("extra accept list for G4 not provided ");
228 }
229
230 // Open the files and read susyParticlePdgid.txt
231 std::ifstream susyFile;
232 susyFile.open("susyParticlePdgid.txt");
233 int susyPdgID;
234 if (!susyFile.fail()){
235 while(getline(susyFile,line)){
236 std::stringstream ss1(line);
237 ss1 >> susyPdgID;
238 m_SusyPdgID_tab.push_back(susyPdgID);
239 }
240 susyFile.close();
241 }
242 else{
243 ATH_MSG_WARNING("Failed to open susyParticlePdgid.txt, listing particles not present in PDTTable");
244 }
245
246 // Open the file of extra PDG IDs that don't need to obey the rules
247 std::ifstream pdgFile;
248 pdgFile.open(m_unknownPDGIDFile.c_str());
249 int pdgID;
250 if (!pdgFile.fail()){
251 ATH_MSG_INFO("extra accept list for PDG IDs found " << m_unknownPDGIDFile.c_str());
252 while(std::getline(pdgFile,line)){
253 std::stringstream ss(line);
254 ss >> pdgID;
255 m_uknownPDGID_tab.push_back(pdgID);
256 }
257 pdgFile.close();
258 }
259 else {
260 ATH_MSG_INFO("extra accept list for PDG IDs not provided");
261 }
262
263 // Print Efficiency warning and error thresholds
264 ATH_MSG_INFO("EffWarnThreshold = " << m_eff_warn_threshold * 100 << " %");
265 ATH_MSG_INFO("EffFailThreshold = " << m_eff_fail_threshold * 100 << " %");
266
267 return StatusCode::SUCCESS;
268}
#define CHECK(...)
Evaluate an expression and check for errors.
std::string PathResolverFindDataFile(const std::string &logical_file_name)
virtual StatusCode initialize() override
Definition GenBase.cxx:17
TH1F(name, title, nxbins, bins_par2, bins_par3=None, path='', **kwargs)

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::isClonable ( ) const
inlineoverridevirtualinherited

Specify if the algorithm is clonable.

Only relevant for non-reentrant algorithms. Actual number of clones needs to be set via the "Cardinality" property.

Reimplemented in AFP_DigiTop, AlgB, AlgT, BCM_Digitization, CscDigitBuilder, CscDigitToCscRDO, G4AtlasAlg, G4RunAlg, HGTD_Digitization, HiveAlgBase, InDet::GNNSeedingTrackMaker, InDet::SCT_Clusterization, InDet::SiSPGNNTrackMaker, InDet::SiSPSeededTrackFinder, InDet::SiTrackerSpacePointFinder, ISF::SimKernelMT, ITk::StripDigitization, ITkPixelCablingAlg, ITkStripCablingAlg, LArHitEMapMaker, LArTTL1Maker, LUCID_DigiTop, LVL1::L1TopoSimulation, MergeCalibHits, MergeGenericMuonSimHitColl, MergeHijingPars, MergeMcEventCollection, MergeTrackRecordCollection, MergeTruthJets, MergeTruthParticles, MuonDigitizer, PileUpMTAlg, PixelDigitization, RoIBResultToxAOD, SCT_ByteStreamErrorsTestAlg, SCT_CablingCondAlgFromCoraCool, SCT_CablingCondAlgFromText, SCT_ConditionsParameterTestAlg, SCT_ConditionsSummaryTestAlg, SCT_ConfigurationConditionsTestAlg, SCT_Digitization, SCT_FlaggedConditionTestAlg, SCT_LinkMaskingTestAlg, SCT_MajorityConditionsTestAlg, SCT_ModuleVetoTestAlg, SCT_MonitorConditionsTestAlg, SCT_PrepDataToxAOD, SCT_RawDataToxAOD, SCT_ReadCalibChipDataTestAlg, SCT_ReadCalibDataTestAlg, SCT_RODVetoTestAlg, SCT_SensorsTestAlg, SCT_SiliconConditionsTestAlg, SCT_StripVetoTestAlg, SCT_TdaqEnabledTestAlg, SCT_TestCablingAlg, SCTEventFlagWriter, SCTRawDataProvider, SCTSiLorentzAngleTestAlg, SCTSiPropertiesTestAlg, SGInputLoader, Simulation::BeamEffectsAlg, TileHitVecToCnt, TileMuonFitter, TilePulseForTileMuonReceiver, TileRawChannelMaker, TRTDigitization, and ZDC_DigiTop.

Definition at line 68 of file AthCommonAlgorithm.h.

68 {
69 return true;
70 }

◆ isReEntrant()

virtual bool AthAlgorithm::isReEntrant ( ) const
inlinefinaloverrideprotectedvirtualinherited

Legacy algorithms are not thread-safe.

Definition at line 47 of file AthAlgorithm.h.

47{ return false; }

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

virtual void AthCommonAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Set filter decision:

Reimplemented in AthFilterAlgorithm.

Definition at line 99 of file AthCommonAlgorithm.h.

99 {
101 }

◆ sysExecute()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Reimplemented in AthAnalysisAlgorithm.

Definition at line 80 of file AthCommonAlgorithm.cxx.

41{
42 return BaseAlg::sysExecute (ctx);
43}

◆ sysInitialize()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in AthAnalysisAlgorithm, AthFilterAlgorithm, AthHistogramAlgorithm, HypoBase, InputMakerBase, and PyAthena::Alg.

Definition at line 60 of file AthCommonAlgorithm.cxx.

71 {
73
74 if (sc.isFailure()) {
75 return sc;
76 }
77
78 ServiceHandle<ICondSvc> cs("CondSvc",name());
79 for (auto h : outputHandles()) {
80 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
81 // do this inside the loop so we don't create the CondSvc until needed
82 if ( cs.retrieve().isFailure() ) {
83 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
85 }
86 if (cs->regHandle(this,*h).isFailure()) {
88 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
89 << " with CondSvc");
90 }
91 }
92 }
93 return sc;
94}
virtual StatusCode sysInitialize() override
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ m_accur_margin

double TestHepMC::m_accur_margin
private

Definition at line 51 of file TestHepMC.h.

◆ m_allowMissingXSec

bool TestHepMC::m_allowMissingXSec
private

Definition at line 48 of file TestHepMC.h.

◆ m_beamEnergyCheckRate

int TestHepMC::m_beamEnergyCheckRate
private

Definition at line 68 of file TestHepMC.h.

◆ m_beamEnergyTest

bool TestHepMC::m_beamEnergyTest
private

Definition at line 53 of file TestHepMC.h.

◆ m_beamParticleswithStatusNotFourCheckRate

int TestHepMC::m_beamParticleswithStatusNotFourCheckRate
private

Definition at line 67 of file TestHepMC.h.

◆ m_cm_energy

double TestHepMC::m_cm_energy
private

Definition at line 46 of file TestHepMC.h.

◆ m_cme_diff

double TestHepMC::m_cme_diff
private

Definition at line 46 of file TestHepMC.h.

◆ m_decayCheckRate

int TestHepMC::m_decayCheckRate
private

Definition at line 77 of file TestHepMC.h.

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 393 of file AthCommonDataStore.h.

◆ m_doHist

bool TestHepMC::m_doHist
private

Definition at line 52 of file TestHepMC.h.

◆ m_dumpEvent

bool TestHepMC::m_dumpEvent
private

Definition at line 48 of file TestHepMC.h.

◆ m_eff_fail_threshold

double TestHepMC::m_eff_fail_threshold
private

Definition at line 50 of file TestHepMC.h.

◆ m_eff_warn_threshold

double TestHepMC::m_eff_warn_threshold
private

Definition at line 50 of file TestHepMC.h.

◆ m_energy_diff

double TestHepMC::m_energy_diff
private

Definition at line 47 of file TestHepMC.h.

◆ m_energyBalanceCheckRate

int TestHepMC::m_energyBalanceCheckRate
private

Definition at line 80 of file TestHepMC.h.

◆ m_energyG4Test

bool TestHepMC::m_energyG4Test
private

Definition at line 53 of file TestHepMC.h.

◆ m_energyImbalanceTest

bool TestHepMC::m_energyImbalanceTest
private

Definition at line 54 of file TestHepMC.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 108 of file AthCommonAlgorithm.h.

◆ m_FastDecayedTau

int TestHepMC::m_FastDecayedTau
private

Definition at line 64 of file TestHepMC.h.

◆ m_G4pdgID_tab

std::vector<int> TestHepMC::m_G4pdgID_tab
private

Definition at line 95 of file TestHepMC.h.

◆ m_gendata

std::shared_ptr<GenData> TestHepMC::m_gendata {nullptr}
private

Definition at line 133 of file TestHepMC.h.

133{nullptr};

◆ m_h_beamparticle1_Energy

TH1F* TestHepMC::m_h_beamparticle1_Energy
private

Definition at line 127 of file TestHepMC.h.

◆ m_h_beamparticle2_Energy

TH1F* TestHepMC::m_h_beamparticle2_Energy
private

Definition at line 128 of file TestHepMC.h.

◆ m_h_cmEnergyDiff

TH1F* TestHepMC::m_h_cmEnergyDiff
private

Definition at line 129 of file TestHepMC.h.

◆ m_h_energy_dispVtxCheck

TH1F* TestHepMC::m_h_energy_dispVtxCheck
private

Definition at line 102 of file TestHepMC.h.

◆ m_h_energy_dispVtxCheck_lt10

TH1F* TestHepMC::m_h_energy_dispVtxCheck_lt10
private

Definition at line 103 of file TestHepMC.h.

◆ m_h_energyImbalance

TH1F* TestHepMC::m_h_energyImbalance
private

Definition at line 122 of file TestHepMC.h.

◆ m_h_momentumImbalance_px

TH1F* TestHepMC::m_h_momentumImbalance_px
private

Definition at line 123 of file TestHepMC.h.

◆ m_h_momentumImbalance_py

TH1F* TestHepMC::m_h_momentumImbalance_py
private

Definition at line 124 of file TestHepMC.h.

◆ m_h_momentumImbalance_pz

TH1F* TestHepMC::m_h_momentumImbalance_pz
private

Definition at line 125 of file TestHepMC.h.

◆ m_h_pdgid_dispVtxCheck

TH1F* TestHepMC::m_h_pdgid_dispVtxCheck
private

Definition at line 104 of file TestHepMC.h.

◆ m_h_photon_e2_p2_e2

TH1F* TestHepMC::m_h_photon_e2_p2_e2
private

Definition at line 120 of file TestHepMC.h.

◆ m_h_photon_energy

TH1F* TestHepMC::m_h_photon_energy
private

Definition at line 119 of file TestHepMC.h.

◆ m_h_photon_mass

TH1F* TestHepMC::m_h_photon_mass
private

Definition at line 118 of file TestHepMC.h.

◆ m_h_px_dispVtxCheck

TH1F* TestHepMC::m_h_px_dispVtxCheck
private

Definition at line 106 of file TestHepMC.h.

◆ m_h_py_dispVtxCheck

TH1F* TestHepMC::m_h_py_dispVtxCheck
private

Definition at line 107 of file TestHepMC.h.

◆ m_h_pz_dispVtxCheck

TH1F* TestHepMC::m_h_pz_dispVtxCheck
private

Definition at line 108 of file TestHepMC.h.

◆ m_h_status_dispVtxCheck

TH1F* TestHepMC::m_h_status_dispVtxCheck
private

Definition at line 105 of file TestHepMC.h.

◆ m_h_vtxend_dispVtxCheck

TH1F* TestHepMC::m_h_vtxend_dispVtxCheck
private

Definition at line 115 of file TestHepMC.h.

◆ m_h_vtxprod_dispVtxCheck

TH1F* TestHepMC::m_h_vtxprod_dispVtxCheck
private

Definition at line 116 of file TestHepMC.h.

◆ m_h_vx_dispVtxCheck

TH1F* TestHepMC::m_h_vx_dispVtxCheck
private

Definition at line 109 of file TestHepMC.h.

◆ m_h_vxprod_dispVtxCheck

TH1F* TestHepMC::m_h_vxprod_dispVtxCheck
private

Definition at line 112 of file TestHepMC.h.

◆ m_h_vy_dispVtxCheck

TH1F* TestHepMC::m_h_vy_dispVtxCheck
private

Definition at line 110 of file TestHepMC.h.

◆ m_h_vyprod_dispVtxCheck

TH1F* TestHepMC::m_h_vyprod_dispVtxCheck
private

Definition at line 113 of file TestHepMC.h.

◆ m_h_vz_dispVtxCheck

TH1F* TestHepMC::m_h_vz_dispVtxCheck
private

Definition at line 111 of file TestHepMC.h.

◆ m_h_vzprod_dispVtxCheck

TH1F* TestHepMC::m_h_vzprod_dispVtxCheck
private

Definition at line 114 of file TestHepMC.h.

◆ m_invalidBeamParticlesCheckRate

int TestHepMC::m_invalidBeamParticlesCheckRate
private

Definition at line 66 of file TestHepMC.h.

◆ m_lifeTimeTest

bool TestHepMC::m_lifeTimeTest
private

Definition at line 53 of file TestHepMC.h.

◆ m_looper

member to detect loops

Definition at line 131 of file TestHepMC.h.

◆ m_max_dist

double TestHepMC::m_max_dist
private

Definition at line 49 of file TestHepMC.h.

◆ m_max_dist_trans

double TestHepMC::m_max_dist_trans
private

Definition at line 49 of file TestHepMC.h.

◆ m_max_energy_diff

double TestHepMC::m_max_energy_diff
private

Definition at line 47 of file TestHepMC.h.

◆ m_maxloops

int TestHepMC::m_maxloops
private

Definition at line 44 of file TestHepMC.h.

◆ m_mcEventKey

std::string GenBase::m_mcEventKey {}
protectedinherited

StoreGate key for the MC event collection (defaults to GEN_EVENT).

Definition at line 108 of file GenBase.h.

108{};

◆ m_mcevents_const

SG::ReadHandleKey<McEventCollection> GenBase::m_mcevents_const { this, "McEventKey", "GEN_EVENT", "StoreGate key of the MC event collection" }
privateinherited

Const handle to the MC event collection.

Definition at line 117 of file GenBase.h.

117{ this, "McEventKey", "GEN_EVENT", "StoreGate key of the MC event collection" };

◆ m_min_dist_trans

double TestHepMC::m_min_dist_trans
private

Definition at line 49 of file TestHepMC.h.

◆ m_min_tau

double TestHepMC::m_min_tau
private

Definition at line 49 of file TestHepMC.h.

◆ m_mkMcEvent

BooleanProperty GenBase::m_mkMcEvent {this, "MakeMcEvent", false, "Create a new MC event collection if it doesn't exist"}
protectedinherited

Flag to determine if a new MC event collection should be made if it doesn't exist.

Definition at line 110 of file GenBase.h.

110{this, "MakeMcEvent", false, "Create a new MC event collection if it doesn't exist"};

◆ m_momentumBalanceCheckRate

int TestHepMC::m_momentumBalanceCheckRate
private

Definition at line 81 of file TestHepMC.h.

◆ m_momImbalanceTest

bool TestHepMC::m_momImbalanceTest
private

Definition at line 54 of file TestHepMC.h.

◆ m_momNaNTest

bool TestHepMC::m_momNaNTest
private

Definition at line 53 of file TestHepMC.h.

◆ m_negativeEnergyCheckRate

int TestHepMC::m_negativeEnergyCheckRate
private

Definition at line 82 of file TestHepMC.h.

◆ m_negativeEnergyTachyonicCheckRate

int TestHepMC::m_negativeEnergyTachyonicCheckRate
private

Definition at line 76 of file TestHepMC.h.

◆ m_negativeEnergyTest

bool TestHepMC::m_negativeEnergyTest
private

Definition at line 54 of file TestHepMC.h.

◆ m_nFail

int TestHepMC::m_nFail
private

Definition at line 60 of file TestHepMC.h.

◆ m_nonG4_energy_threshold

double TestHepMC::m_nonG4_energy_threshold
private

Definition at line 49 of file TestHepMC.h.

◆ m_nonG4_energyCheckRate

int TestHepMC::m_nonG4_energyCheckRate
private

Definition at line 89 of file TestHepMC.h.

◆ m_nonZeroPhotonMassCheckRate

int TestHepMC::m_nonZeroPhotonMassCheckRate
private

Definition at line 79 of file TestHepMC.h.

◆ m_noXSECset

int TestHepMC::m_noXSECset
private

Definition at line 61 of file TestHepMC.h.

◆ m_nPass

int TestHepMC::m_nPass
private

Definition at line 59 of file TestHepMC.h.

◆ m_paramFile

std::string TestHepMC::m_paramFile
private

Definition at line 92 of file TestHepMC.h.

◆ m_partMomentumNANandINFCheckRate

int TestHepMC::m_partMomentumNANandINFCheckRate
private

Definition at line 73 of file TestHepMC.h.

◆ m_pdg

int TestHepMC::m_pdg
private

Definition at line 45 of file TestHepMC.h.

◆ m_pi0NoVtxTest

bool TestHepMC::m_pi0NoVtxTest
private

Definition at line 55 of file TestHepMC.h.

◆ m_stableUnstableNoParentCheckRate

int TestHepMC::m_stableUnstableNoParentCheckRate
private

Definition at line 84 of file TestHepMC.h.

◆ m_Status1ShortLifetime

int TestHepMC::m_Status1ShortLifetime
private

Definition at line 87 of file TestHepMC.h.

◆ m_SusyPdgID_tab

std::vector<int> TestHepMC::m_SusyPdgID_tab
private

Definition at line 96 of file TestHepMC.h.

◆ m_tachyonCheckRate

int TestHepMC::m_tachyonCheckRate
private

Definition at line 83 of file TestHepMC.h.

◆ m_tachyonsTest

bool TestHepMC::m_tachyonsTest
private

Definition at line 54 of file TestHepMC.h.

◆ m_tau_eff_threshold

double TestHepMC::m_tau_eff_threshold
private

Definition at line 50 of file TestHepMC.h.

◆ m_thistSvc

ServiceHandle<ITHistSvc> TestHepMC::m_thistSvc
private
Todo
Can we use the GenAnalysis / AthHistoAlg methods for histo management?

Definition at line 100 of file TestHepMC.h.

◆ m_TotalTaus

int TestHepMC::m_TotalTaus
private

Definition at line 63 of file TestHepMC.h.

◆ m_uknownPDGID_tab

std::vector<int> TestHepMC::m_uknownPDGID_tab
private

Definition at line 97 of file TestHepMC.h.

◆ m_undecayedPi0CheckRate

int TestHepMC::m_undecayedPi0CheckRate
private

Definition at line 86 of file TestHepMC.h.

◆ m_undecayedPi0statuscode12CheckRate

int TestHepMC::m_undecayedPi0statuscode12CheckRate
private

Definition at line 74 of file TestHepMC.h.

◆ m_undisplacedDaughtersTest

bool TestHepMC::m_undisplacedDaughtersTest
private

Definition at line 55 of file TestHepMC.h.

◆ m_undisplacedDecayDaughtersOfDisplacedVtxCheckRate

int TestHepMC::m_undisplacedDecayDaughtersOfDisplacedVtxCheckRate
private

Definition at line 88 of file TestHepMC.h.

◆ m_undisplacedLLHdaughtersCheckRate

int TestHepMC::m_undisplacedLLHdaughtersCheckRate
private

Definition at line 78 of file TestHepMC.h.

◆ m_unknownPDGIDCheckRate

int TestHepMC::m_unknownPDGIDCheckRate
private

Definition at line 90 of file TestHepMC.h.

◆ m_unknownPDGIDFile

std::string TestHepMC::m_unknownPDGIDFile
private

Definition at line 93 of file TestHepMC.h.

◆ m_unknownPDGIDTest

bool TestHepMC::m_unknownPDGIDTest
private

Definition at line 55 of file TestHepMC.h.

◆ m_unstableNoEndVtxCheckRate

int TestHepMC::m_unstableNoEndVtxCheckRate
private

Definition at line 75 of file TestHepMC.h.

◆ m_unstableNoVtxTest

bool TestHepMC::m_unstableNoVtxTest
private

Definition at line 54 of file TestHepMC.h.

◆ m_unstablePartNoDecayVtxCheckRate

int TestHepMC::m_unstablePartNoDecayVtxCheckRate
private

Definition at line 85 of file TestHepMC.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vertexStatuses

std::vector<int> TestHepMC::m_vertexStatuses
private

Definition at line 57 of file TestHepMC.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ m_vtxDisplacedMoreThan_1m_CheckRate

int TestHepMC::m_vtxDisplacedMoreThan_1m_CheckRate
private

Definition at line 72 of file TestHepMC.h.

◆ m_vtxDisplacedstatuscode12CheckRate

int TestHepMC::m_vtxDisplacedstatuscode12CheckRate
private

Definition at line 70 of file TestHepMC.h.

◆ m_vtxDisplacedstatuscodenot12CheckRate

int TestHepMC::m_vtxDisplacedstatuscodenot12CheckRate
private

Definition at line 71 of file TestHepMC.h.

◆ m_vtxDisplacedTest

bool TestHepMC::m_vtxDisplacedTest
private

Definition at line 53 of file TestHepMC.h.

◆ m_vtxNANandINFCheckRate

int TestHepMC::m_vtxNANandINFCheckRate
private

Definition at line 69 of file TestHepMC.h.

◆ m_vtxNaNTest

bool TestHepMC::m_vtxNaNTest
private

Definition at line 53 of file TestHepMC.h.


The documentation for this class was generated from the following files: