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

Reject-all hypo algorithm sleeping for some time and doing nothing else. More...

#include <TimeBurner.h>

Inheritance diagram for TimeBurner:
Collaboration diagram for TimeBurner:

Public Member Functions

 TimeBurner (const std::string &name, ISvcLocator *svcLoc)
 Standard constructor.
virtual StatusCode initialize () override
virtual StatusCode execute (const EventContext &eventContext) const override
virtual StatusCode sysInitialize () override
 initialise this base class
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual unsigned int cardinality () const override
 Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
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
virtual void setFilterPassed (bool state, const EventContext &ctx) const
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

Static Public Member Functions

static StatusCode runtimeValidation (SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle, MsgStream &msg, bool onlyValidateOneStep=true, bool runTwoConversion=false)
 Executes all individual runtime tests.

Protected Member Functions

const SG::ReadHandleKey< TrigCompositeUtils::DecisionContainer > & decisionInput () const
 methods for derived classes to access handles of the base class input other read/write handles may be implemented by derived classes
const SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > & decisionOutput () const
 methods for derived classes to access handles of the base class output other read/write handles may be implemented by derived classes
StatusCode hypoBaseOutputProcessing (SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle, MSG::Level lvl=MSG::DEBUG) const
 Base class function to be called once slice specific code has finished. Handles debug printing and validation.
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

StatusCode printDebugInformation (SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle, MSG::Level lvl) const
 Common base function to print information on chains passed by objects considered in the hypo.
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

Gaudi::Property< unsigned int > m_sleepTimeMillisec
ToolHandleArray< IAlgTool > m_hypoTools {this, "HypoTools", {}}
SG::ReadHandleKey< TrigCompositeUtils::DecisionContainerm_input { this, "HypoInputDecisions", "UNSPECIFIED_INPUT", "Input Decision (implicit)" }
 input decisions
SG::WriteHandleKey< TrigCompositeUtils::DecisionContainerm_output { this, "HypoOutputDecisions", "UNSPECIFIED_OUTPUT", "Ouput Decision" }
 output decisions
Gaudi::Property< bool > m_runtimeValidation { this, "RuntimeValidation", false, "Enable detailed runtime validation of HypoAlg output, and upstream Decisions." }
 Enabling of detailed validation checks for use during development.
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

Runtime validation methods

enum  LogicalFlowCheckMode { kRequireOne , kRequireAll }
static StatusCode validateHasLinks (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
 Ensure all Decisions have the named ElementLink graph edges which they are required to by spec.
static StatusCode validateLogicalFlow (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, const LogicalFlowCheckMode mode)
 Ensure that all DecisionIDs have propagated correctly from their parent.
static StatusCode validateDuplicatedDecisionID (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
 Ensure that no space is being wasted by duplicated DecisionIDs in any Decision objects.
static StatusCode validateDecisionIDs (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
 Ensure that all present IDs correspond to configured chains.
static StatusCode validateParentLinking (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, bool runTwoConversion)
 Ensure that the Decision has at least one valid parent, unless it is a initial Decision from the HLTSeeding.
static StatusCode recursiveValidateGraph (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, bool onlyValidateOneStep, bool runTwoConversion, size_t callDepth, std::set< const TrigCompositeUtils::Decision * > &fullyExploredFrom)
 Execute all checks on one node in the graph, d, then recursive call self on all parent nodes up to L1.
static void printBangs (MsgStream &msg)
 Print header line.
static void printErrorHeader (const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
 A problem was found, print common output data.

Detailed Description

Reject-all hypo algorithm sleeping for some time and doing nothing else.

Definition at line 15 of file TimeBurner.h.

Member Typedef Documentation

◆ StoreGateSvc_t

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

Definition at line 388 of file AthCommonDataStore.h.

Member Enumeration Documentation

◆ LogicalFlowCheckMode

enum HypoBase::LogicalFlowCheckMode
privateinherited
Enumerator
kRequireOne 

Require all DecisionIDs to be present in at least one of my parent Decision objects.

kRequireAll 

Definition at line 52 of file HypoBase.h.

52 {
54 kRequireAll //<! Require all DecisionIDs to be present in all of my parent Decision objects
55 };
@ kRequireOne
Require all DecisionIDs to be present in at least one of my parent Decision objects.
Definition HypoBase.h:53
@ kRequireAll
Definition HypoBase.h:54

Constructor & Destructor Documentation

◆ TimeBurner()

TimeBurner::TimeBurner ( const std::string & name,
ISvcLocator * svcLoc )

Standard constructor.

Definition at line 10 of file TimeBurner.cxx.

11: ::HypoBase(name, pSvcLocator) {}
HypoBase(const std::string &name, ISvcLocator *pSvcLocator)
constructor, to be called by sub-class constructors
Definition HypoBase.cxx:12

Member Function Documentation

◆ cardinality()

unsigned int AthCommonReentrantAlgorithm< Gaudi::Algorithm >::cardinality ( ) const
overridevirtualinherited

Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.

Override this to return 0 for reentrant algorithms.

Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.

64{
65 return 0;
66}

◆ decisionInput()

const SG::ReadHandleKey< TrigCompositeUtils::DecisionContainer > & HypoBase::decisionInput ( ) const
protectedinherited

methods for derived classes to access handles of the base class input other read/write handles may be implemented by derived classes

Definition at line 18 of file HypoBase.cxx.

18 {
19 return m_input;
20}
SG::ReadHandleKey< TrigCompositeUtils::DecisionContainer > m_input
input decisions
Definition HypoBase.h:101

◆ decisionOutput()

const SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > & HypoBase::decisionOutput ( ) const
protectedinherited

methods for derived classes to access handles of the base class output other read/write handles may be implemented by derived classes

Definition at line 22 of file HypoBase.cxx.

22 {
23 return m_output;
24}
SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > m_output
output decisions
Definition HypoBase.h:103

◆ 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 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ 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.

◆ 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 TimeBurner::execute ( const EventContext & eventContext) const
overridevirtual

Definition at line 19 of file TimeBurner.cxx.

19 {
20 // Create a reject decision
22
23 std::this_thread::sleep_for(std::chrono::milliseconds(m_sleepTimeMillisec.value()));
24
25 return StatusCode::SUCCESS;
26}
const SG::WriteHandleKey< TrigCompositeUtils::DecisionContainer > & decisionOutput() const
methods for derived classes to access handles of the base class output other read/write handles may b...
Definition HypoBase.cxx:22
Gaudi::Property< unsigned int > m_sleepTimeMillisec
Definition TimeBurner.h:24
SG::WriteHandle< DecisionContainer > createAndStore(const SG::WriteHandleKey< DecisionContainer > &key, const EventContext &ctx)
Creates and right away records the DecisionContainer with the key.

◆ 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 & AthCommonReentrantAlgorithm< 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 94 of file AthCommonReentrantAlgorithm.cxx.

90{
91 // If we didn't find any symlinks to add, just return the collection
92 // from the base class. Otherwise, return the extended collection.
93 if (!m_extendedExtraObjects.empty()) {
95 }
97}
An algorithm that can be simultaneously executed in multiple threads.

◆ filterPassed()

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

Definition at line 96 of file AthCommonReentrantAlgorithm.h.

96 {
97 return execState( ctx ).filterPassed();
98 }
virtual bool filterPassed(const EventContext &ctx) const

◆ hypoBaseOutputProcessing()

StatusCode HypoBase::hypoBaseOutputProcessing ( SG::WriteHandle< TrigCompositeUtils::DecisionContainer > & outputHandle,
MSG::Level lvl = MSG::DEBUG ) const
protectedinherited

Base class function to be called once slice specific code has finished. Handles debug printing and validation.

Definition at line 35 of file HypoBase.cxx.

35 {
36
37 ATH_CHECK( printDebugInformation(outputHandle, lvl) );
38
40 ATH_CHECK( runtimeValidation(outputHandle, msg()) );
41 }
42
43 return StatusCode::SUCCESS;
44}
#define ATH_CHECK
Evaluate an expression and check for errors.
StatusCode printDebugInformation(SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle, MSG::Level lvl) const
Common base function to print information on chains passed by objects considered in the hypo.
Definition HypoBase.cxx:406
Gaudi::Property< bool > m_runtimeValidation
Enabling of detailed validation checks for use during development.
Definition HypoBase.h:105
static StatusCode runtimeValidation(SG::WriteHandle< TrigCompositeUtils::DecisionContainer > &outputHandle, MsgStream &msg, bool onlyValidateOneStep=true, bool runTwoConversion=false)
Executes all individual runtime tests.
Definition HypoBase.cxx:47

◆ initialize()

StatusCode TimeBurner::initialize ( )
overridevirtual

Definition at line 13 of file TimeBurner.cxx.

13 {
14 // we don't actually need the HypoTool
15 for (auto& tool : m_hypoTools) tool.disable();
16 return StatusCode::SUCCESS;
17}
ToolHandleArray< IAlgTool > m_hypoTools
Definition TimeBurner.h:29

◆ 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()

◆ 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.

◆ printBangs()

void HypoBase::printBangs ( MsgStream & msg)
staticprivateinherited

Print header line.

Definition at line 390 of file HypoBase.cxx.

390 {
391 msg << MSG::ERROR << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endmsg;
392}
#define endmsg

◆ printDebugInformation()

StatusCode HypoBase::printDebugInformation ( SG::WriteHandle< TrigCompositeUtils::DecisionContainer > & outputHandle,
MSG::Level lvl ) const
privateinherited

Common base function to print information on chains passed by objects considered in the hypo.

Definition at line 406 of file HypoBase.cxx.

406 {
407 if (msgLvl(lvl)) {
408 msg() << lvl;
409 msg() << "Exiting with " << outputHandle->size() <<" Decision objects" << endmsg;
410 size_t count = 0;
411 for (const Decision* d : *outputHandle){
412 DecisionIDContainer objDecisions;
413 decisionIDs( d, objDecisions );
414 msg() << "Number of positive decisions for Decision object #" << count++ << ": " << objDecisions.size() << endmsg;
415 for (const TrigCompositeUtils::DecisionID id : objDecisions ) {
416 msg() << " --- Passes: " << HLT::Identifier( id ) << endmsg;
417 }
418 }
419 }
420 return StatusCode::SUCCESS;
421}
bool msgLvl(const MSG::Level lvl) const
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
unsigned int DecisionID
std::set< DecisionID > DecisionIDContainer
void decisionIDs(const Decision *d, DecisionIDContainer &destination)
Extracts DecisionIDs stored in the Decision object.

◆ printErrorHeader()

void HypoBase::printErrorHeader ( const ElementLink< TrigCompositeUtils::DecisionContainer > & dEL,
MsgStream & msg )
staticprivateinherited

A problem was found, print common output data.

Definition at line 395 of file HypoBase.cxx.

397{
399 msg << MSG::ERROR << "! RUNTIME TRIGGER NAVIGATION VALIDATION ERROR" << endmsg;
400 msg << MSG::ERROR << "! Caused by Decision with index:" << (*dEL)->index() << endmsg;
401 msg << MSG::ERROR << "! From collection:" << dEL.dataID() << endmsg;
402 msg << MSG::ERROR << "! " << **dEL << endmsg;
403}
static void printBangs(MsgStream &msg)
Print header line.
Definition HypoBase.cxx:390

◆ recursiveValidateGraph()

StatusCode HypoBase::recursiveValidateGraph ( const ElementLink< TrigCompositeUtils::DecisionContainer > & dEL,
MsgStream & msg,
bool onlyValidateOneStep,
bool runTwoConversion,
size_t callDepth,
std::set< const TrigCompositeUtils::Decision * > & fullyExploredFrom )
staticprivateinherited

Execute all checks on one node in the graph, d, then recursive call self on all parent nodes up to L1.

Definition at line 71 of file HypoBase.cxx.

77{
78 if (onlyValidateOneStep && callDepth > 0) {
79 if ((*dEL)->name() == hypoAlgNodeName()) {
80 // Validation is called from HypoAlg nodes. So if we have reached the _previous_ HypoAlg node, then we have already
81 // validated back from here in the past. Can stop at this point.
82 return StatusCode::SUCCESS;
83 }
84 }
85
86 // Check logical flow at this place in the graph
87 if ((*dEL)->name() == hypoAlgNodeName()) {
88 // Check that all Hypo Decisions produced here satisfy the more-strict all-parent logical flow
89 if ( validateLogicalFlow(dEL, msg, kRequireAll).isFailure() ) {
90 return StatusCode::FAILURE;
91 }
92 } else {
93 // (looser requirement of one-valid-parent-with-decision than we had when we knew that d corresponded to a HypoAlg output)
94 if ( validateLogicalFlow(dEL, msg, kRequireOne).isFailure() ) {
95 return StatusCode::FAILURE;
96 }
97 }
98
99 // Check my IDs
100 if ( validateDecisionIDs(dEL, msg).isFailure() ) {
101 return StatusCode::FAILURE;
102 }
103 if ( validateDuplicatedDecisionID(dEL, msg).isFailure() ) {
104 return StatusCode::FAILURE;
105 }
106
107 // Check my linking
108 if( validateParentLinking(dEL, msg, runTwoConversion).isFailure() ) {
109 return StatusCode::FAILURE;
110 }
111 if ( validateHasLinks(dEL, msg).isFailure() ) {
112 return StatusCode::FAILURE;
113 }
114
115 // Continue upstream
116 const std::vector<ElementLink<DecisionContainer>> seeds = (*dEL)->objectCollectionLinks<DecisionContainer>(seedString());
117 for (const ElementLink<DecisionContainer>& seed : seeds) {
118 if (fullyExploredFrom.count( (*seed) ) == 1) {
119 continue; // Already fully explored from this seed and up
120 }
121 if ( not seed.isValid() ) {
122 msg << MSG::ERROR << "Invalid seed element link in recursiveValidateGraph" << endmsg;
123 return StatusCode::FAILURE;
124 }
125 if ( recursiveValidateGraph(seed, msg, onlyValidateOneStep, runTwoConversion, callDepth + 1, fullyExploredFrom).isFailure() ) {
126 return StatusCode::FAILURE;
127 }
128 }
129
130 fullyExploredFrom.insert( *dEL );
131 return StatusCode::SUCCESS;
132}
static StatusCode validateDecisionIDs(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
Ensure that all present IDs correspond to configured chains.
Definition HypoBase.cxx:209
static StatusCode validateParentLinking(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, bool runTwoConversion)
Ensure that the Decision has at least one valid parent, unless it is a initial Decision from the HLTS...
Definition HypoBase.cxx:135
static StatusCode recursiveValidateGraph(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, bool onlyValidateOneStep, bool runTwoConversion, size_t callDepth, std::set< const TrigCompositeUtils::Decision * > &fullyExploredFrom)
Execute all checks on one node in the graph, d, then recursive call self on all parent nodes up to L1...
Definition HypoBase.cxx:71
static StatusCode validateHasLinks(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
Ensure all Decisions have the named ElementLink graph edges which they are required to by spec.
Definition HypoBase.cxx:338
static StatusCode validateDuplicatedDecisionID(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
Ensure that no space is being wasted by duplicated DecisionIDs in any Decision objects.
Definition HypoBase.cxx:229
static StatusCode validateLogicalFlow(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg, const LogicalFlowCheckMode mode)
Ensure that all DecisionIDs have propagated correctly from their parent.
Definition HypoBase.cxx:247
const std::string & hypoAlgNodeName()
const std::string & seedString()

◆ 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 }

◆ runtimeValidation()

StatusCode HypoBase::runtimeValidation ( SG::WriteHandle< TrigCompositeUtils::DecisionContainer > & outputHandle,
MsgStream & msg,
bool onlyValidateOneStep = true,
bool runTwoConversion = false )
staticinherited

Executes all individual runtime tests.

Definition at line 47 of file HypoBase.cxx.

51{
52 // Detailed checks on the output container of this HypoAlg
53 std::set<const Decision*> fullyExploredFrom; // Cache used to avoid exploring regions of the graph more than once
54 for (const Decision* d : *outputHandle) {
55 const DecisionContainer* dContainer = dynamic_cast<const DecisionContainer*>( d->container() );
56 const ElementLink<DecisionContainer> dEL = ElementLink<DecisionContainer>(*dContainer, d->index());
57 if (not dEL.isValid()) {
58 msg << MSG::ERROR << "Invalid seed element link in recursiveValidateGraph" << endmsg;
59 return StatusCode::FAILURE;
60 }
61 // Check that we can reach L1 along all navigation paths up from each Decision
62 // and validate these Decisions on the way up too.
63 if (recursiveValidateGraph(dEL, msg, onlyValidateOneStep, runTwoConversion, 0, fullyExploredFrom).isFailure()) {
64 return StatusCode::FAILURE;
65 }
66 }
67 return StatusCode::SUCCESS;
68}

◆ setFilterPassed()

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

Definition at line 100 of file AthCommonReentrantAlgorithm.h.

100 {
102 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const

◆ sysExecute()

StatusCode AthCommonReentrantAlgorithm< 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.

Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.

77{
78 return BaseAlg::sysExecute (ctx);
79}

◆ sysInitialize()

StatusCode HypoBase::sysInitialize ( )
overridevirtualinherited

initialise this base class

Reimplemented from AthCommonReentrantAlgorithm< Gaudi::Algorithm >.

Definition at line 26 of file HypoBase.cxx.

26 {
27 CHECK( AthReentrantAlgorithm::sysInitialize() ); // initialise base class
28 CHECK( m_input.initialize() );
29 ATH_MSG_DEBUG("HypoBase::sysInitialize() Will consume decision: " << m_input.key() );
30 CHECK( m_output.initialize() );
31 ATH_MSG_DEBUG("HypoBase::sysInitialize() And produce decision: " << m_output.key() );
32 return StatusCode::SUCCESS;
33}
#define ATH_MSG_DEBUG(x)
#define CHECK(...)
Evaluate an expression and check for errors.

◆ 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 }

◆ validateDecisionIDs()

StatusCode HypoBase::validateDecisionIDs ( const ElementLink< TrigCompositeUtils::DecisionContainer > & dEL,
MsgStream & msg )
staticprivateinherited

Ensure that all present IDs correspond to configured chains.

Definition at line 209 of file HypoBase.cxx.

211{
212 // All numeric IDs must correspond to a know, configured, HLT chain
213 DecisionIDContainer decisionIDSet;
214 decisionIDs(*dEL, decisionIDSet);
215 for (const DecisionID id : decisionIDSet) {
216 const std::string chain = HLT::Identifier( id ).name();
217 if (!isChainId(chain) and !isLegId(chain)) {
218 printErrorHeader(dEL, msg);
219 msg << MSG::ERROR << "! Decision contains an ID which does not correspond to a configured chain or a configured chain-leg: " << HLT::Identifier( id ) << endmsg;
220 msg << MSG::ERROR << "! SOLUTION: Locate the producer of the collection, investigate how this bad ID could have been added." << endmsg;
222 return StatusCode::FAILURE;
223 }
224 }
225 return StatusCode::SUCCESS;
226}
static void printErrorHeader(const ElementLink< TrigCompositeUtils::DecisionContainer > &dEL, MsgStream &msg)
A problem was found, print common output data.
Definition HypoBase.cxx:395
bool isChainId(const HLT::Identifier &chainIdentifier)
Recognise whether the HLT identifier corresponds to a whole chain.
bool isLegId(const HLT::Identifier &legIdentifier)
Recognise whether the chain ID is a leg ID.

◆ validateDuplicatedDecisionID()

StatusCode HypoBase::validateDuplicatedDecisionID ( const ElementLink< TrigCompositeUtils::DecisionContainer > & dEL,
MsgStream & msg )
staticprivateinherited

Ensure that no space is being wasted by duplicated DecisionIDs in any Decision objects.

Definition at line 229 of file HypoBase.cxx.

231{
232 // Persistent vector storage does not guarantee against duplicate entries
233 DecisionIDContainer decisionIDSet;
234 decisionIDs(*dEL, decisionIDSet);
235 if (decisionIDSet.size() != (*dEL)->decisions().size()) {
236 printErrorHeader(dEL, msg);
237 msg << MSG::ERROR << "! Decision contains duplicate DecisionIDs." << endmsg;
238 msg << MSG::ERROR << "! SOLUTION: If combining DecisionIDs from multiple parents, de-duplicate the internal std::vector<DecisionID> of 'Decision* d' with:" << endmsg;
239 msg << MSG::ERROR << "! TrigCompositeUtils::insertDecisionIDs(DecisionIDContainer(), d);" << endmsg;
241 return StatusCode::FAILURE;
242 }
243 return StatusCode::SUCCESS;
244}

◆ validateHasLinks()

StatusCode HypoBase::validateHasLinks ( const ElementLink< TrigCompositeUtils::DecisionContainer > & dEL,
MsgStream & msg )
staticprivateinherited

Ensure all Decisions have the named ElementLink graph edges which they are required to by spec.

Definition at line 338 of file HypoBase.cxx.

340{
341 const std::string& name = (*dEL)->name();
342 if (name == hypoAlgNodeName()) {
343
344 // Check that I have a "feature"
345 if ((*dEL)->hasObjectLink( featureString() )) {
346 return StatusCode::SUCCESS;
347 }
348 printErrorHeader(dEL, msg);
349 msg << MSG::ERROR << "! Decision has no '" << featureString() << "' ElementLink." << endmsg;
350 msg << MSG::ERROR << "! Every Decision created by a HypoAlg must correspond to some physics object, and be linked to the object." << endmsg;
351 msg << MSG::ERROR << "! SOLUTION: Ensure that all produced Decision objects are assigned their feature:" << endmsg;
352 msg << MSG::ERROR << "! SOLUTION: decision->setObjectLink<MY_FEATURE_CONTANER_TYPE>(featureString(), MY_FEATURE_ELEMENT_LINK);" << endmsg;
354 return StatusCode::FAILURE;
355
356 } else if (name == inputMakerNodeName()) {
357
358 // This requirement is dropped for empty input makers to avoid unnecessary graph clutter.
359 bool exempt = false;
360 if ((*dEL)->hasDetail<int32_t>("isEmpty") and (*dEL)->getDetail<int32_t>("isEmpty") == 1) {
361 exempt = true;
362 }
363
364 if (not (*dEL)->hasObjectLink( roiString() ) and not exempt) {
365 printErrorHeader(dEL, msg);
366 msg << MSG::ERROR << "! Decision has no '" << roiString() << "' ElementLink." << endmsg;
367 msg << MSG::ERROR << "! Every Decision created by a InputMaker must link to the ROI which reconstruction will run on for that Decision object in this Step." << endmsg;
368 msg << MSG::ERROR << "! It can be the FullScan ROI created by the HLTSeeding (FSNOSEED) if no other suitable ROI exists." << endmsg;
369 msg << MSG::ERROR << "! SOLUTION: Check the configuration of InputMakerForRoI or EventViewCreatorAlgorithm responsible for creating this Decision Object" << endmsg;
370 msg << MSG::ERROR << "! SOLUTION: The algorithm must have an ROITool which must attach an '"<< roiString() <<"' link to each Decision Object" << endmsg;
372 }
373
374 } else if (name == hltSeedingNodeName()) {
375
376 if (not (*dEL)->hasObjectLink( initialRoIString() )) {
377 printErrorHeader(dEL, msg);
378 msg << MSG::ERROR << "! Decision has no '" << initialRoIString() << "' ElementLink." << endmsg;
379 msg << MSG::ERROR << "! Every Decision created by the HLTSeeding must link to the initial ROI which caused it to be created." << endmsg;
380 msg << MSG::ERROR << "! This includes the Decision Object created to represent the Full-Scan/NoSeed (FSNOSEED) ROI." << endmsg;
381 msg << MSG::ERROR << "! SOLUTION: Check the configuration of the HLTSeeding tool responsible for creating this Decision Object" << endmsg;
383 }
384
385 }
386 return StatusCode::SUCCESS;
387}
const std::string & inputMakerNodeName()
const std::string & roiString()
const std::string & featureString()
const std::string & initialRoIString()
const std::string & hltSeedingNodeName()

◆ validateLogicalFlow()

StatusCode HypoBase::validateLogicalFlow ( const ElementLink< TrigCompositeUtils::DecisionContainer > & dEL,
MsgStream & msg,
const LogicalFlowCheckMode mode )
staticprivateinherited

Ensure that all DecisionIDs have propagated correctly from their parent.

Definition at line 247 of file HypoBase.cxx.

250{
251 // Do not need to validate for L1 Decisions as these have no parents
252 if ((*dEL)->name() == hltSeedingNodeName()) {
253 return StatusCode::SUCCESS;
254 }
255
256 // Get all my passed DecisionIDs
257 DecisionIDContainer decisionIDSet;
258 decisionIDs(*dEL, decisionIDSet);
259 const std::vector<ElementLink<DecisionContainer>> seeds = (*dEL)->objectCollectionLinks<DecisionContainer>(seedString());
260 for (const DecisionID id : decisionIDSet) {
261 // For each chain that I'm passing, check how many of my parents were also passing the chain
262 size_t parentsWithDecision = 0;
263 for (const ElementLink<DecisionContainer>& seed : seeds) {
264 if ( not seed.isValid() ) {
265 msg << MSG::ERROR << "Invalid seed element link in recursiveValidateGraph" << endmsg;
266 return StatusCode::FAILURE;
267 }
268 DecisionIDContainer seedIDSet;
269 decisionIDs(*seed, seedIDSet);
270 // Id may be a chain-ID (represents a whole chain) or a leg-ID (represents just a single leg of a multi-leg chain)
271 // Is ID is in this parent's set of passed IDs?
272 // Or, (if ID is a leg-ID) is the chain-ID of leg-ID in the parent's set of passed IDs?
273 if (passed(id, seedIDSet) or passed(getIDFromLeg(id).numeric(), seedIDSet)) {
274 ++parentsWithDecision;
275 }
276 else{ // Or, for each of the seed IDs, if the seed ID is a leg-ID, is the seed chain-ID of the seed leg-ID the same as ID?
277 for (auto sid: seedIDSet){
278 if (getIDFromLeg(sid).numeric() == id){
279 ++parentsWithDecision;
280 break;
281 }
282 }
283 }
284 }
285
286 if (mode == kRequireOne && parentsWithDecision == 0) {
287 // InputMakers may merge multiple of their input collections in order to run reconstruction on a common set of ROI (for example)
288 // So the DecisionIDs may have come from any one or more of the inputs. But zero is not allowed.
289 printErrorHeader(dEL, msg);
290 msg << MSG::ERROR << "! This Decision object is not respecting logical flow of DecisionIDs for chain: " << HLT::Identifier( id ) << endmsg;
291 msg << MSG::ERROR << "! This chain's DecisionID can not be found in any parents of this Decision object:" << endmsg;
292 size_t seed_n = 0;
293 for (const ElementLink<DecisionContainer>& seed : seeds) {
294 msg << MSG::ERROR << "! Index:" << (*seed)->index() << " from collection:" << seed.dataID() << endmsg;
295 msg << MSG::ERROR << "! " << **seed << endmsg;
296 DecisionIDContainer objDecisions;
297 decisionIDs(*seed, objDecisions);
298 for (const TrigCompositeUtils::DecisionID id : objDecisions ) {
299 msg << "! --- Passing in parent #" << seed_n << ": " << HLT::Identifier( id ) << endmsg;
300 }
301 ++seed_n;
302 }
303 msg << MSG::ERROR << "! SOLUTION: Ensure that the producer of this Decision object only adds DecisionIDs"
304 " which were present in at least one of its parents." << endmsg;
306 return StatusCode::FAILURE;
307 } else if (mode == kRequireAll && parentsWithDecision != seeds.size()) {
308 // HypoAlgs may form a new physics object from multiple objects in the previous step
309 // (think a BPhysics object whose parents are two Decisions which each correspond to a different L1 MU RoI,
310 // both ROI need to be in active state for the chain, if the chain's HypoTool considers the BPhysics object)
311 // This case requires *all* of the physics objects which are being combined together to be active for the chain
312 // in order to preserve logical flow
313 printErrorHeader(dEL, msg);
314 msg << MSG::ERROR << "! This Decision object is not respecting logical flow of DecisionIDs for chain: " << HLT::Identifier( id ) << endmsg;
315 msg << MSG::ERROR << "! As this Decision object represents the output of a HypoAlg, it must respect logical flow on all "
316 << seeds.size() << " of its parent(s):" << endmsg;
317 size_t seed_n = 0;
318 for (const ElementLink<DecisionContainer>& seed : seeds) {
319 msg << MSG::ERROR << "! Index:" << (*seed)->index() << " from collection:" << seed.dataID() << endmsg;
320 msg << MSG::ERROR << "! " << **seed << endmsg;
321 DecisionIDContainer objDecisions;
322 decisionIDs(*seed, objDecisions);
323 for (const TrigCompositeUtils::DecisionID id : objDecisions ) {
324 msg << "! --- Passing in parent #" << seed_n << ": " << HLT::Identifier( id ) << endmsg;
325 }
326 ++seed_n;
327 }
328 msg << MSG::ERROR << "! SOLUTION: Ensure that the HypoTool responsible for " << HLT::Identifier( id )
329 << " in this HypoAlg only runs if this ID is present in all parent decisions." << endmsg;
331 return StatusCode::FAILURE;
332 }
333 }
334 return StatusCode::SUCCESS;
335}
HLT::Identifier getIDFromLeg(const HLT::Identifier &legIdentifier)
Generate the HLT::Identifier which corresponds to the chain name from the leg name.
bool passed(DecisionID id, const DecisionIDContainer &idSet)
checks if required decision ID is in the set of IDs in the container

◆ validateParentLinking()

StatusCode HypoBase::validateParentLinking ( const ElementLink< TrigCompositeUtils::DecisionContainer > & dEL,
MsgStream & msg,
bool runTwoConversion )
staticprivateinherited

Ensure that the Decision has at least one valid parent, unless it is a initial Decision from the HLTSeeding.

Definition at line 135 of file HypoBase.cxx.

138{
139 const std::vector<ElementLink<DecisionContainer>> seeds = (*dEL)->objectCollectionLinks<DecisionContainer>(seedString());
140 // All Decision object must have at least one parent, unless they are the initial set of objects created by the HLTSeeding
141 const std::string& name = (*dEL)->name();
142 if (seeds.size() == 0 && name != hltSeedingNodeName()) {
143 printErrorHeader(dEL, msg);
144 msg << MSG::ERROR << "! Decision has zero parents. This is only allowed for the initial Decisions created by the HLTSeeding." << endmsg;
145 msg << MSG::ERROR << "! SOLUTION: Attach parent Decision(s) with TrigCompositeUtils::linkToPrevious" << endmsg;
147 return StatusCode::FAILURE;
148 }
149
150 if (name == hltSeedingNodeName()) {
151 if (seeds.size() > 0) {
152 printErrorHeader(dEL, msg);
153 msg << MSG::ERROR << "! Decision has parents. This is not allowed for the initial Decisions created by the HLTSeeding." << endmsg;
154 msg << MSG::ERROR << "! SOLUTION: Check HLTSeeding, no where should it be adding a parent link." << endmsg;
156 return StatusCode::FAILURE;
157 }
158 return StatusCode::SUCCESS;
159 }
160
161 static const std::set<std::string> expectedParentsFilter = {hypoAlgNodeName(), comboHypoAlgNodeName(), hltSeedingNodeName()};
162 static const std::set<std::string> expectedParentsInputMaker = {filterNodeName()};
163 static const std::set<std::string> expectedParentsHypoAlg = {inputMakerNodeName()};
164 static const std::set<std::string> expectedParentsComboHypoAlg = {hypoAlgNodeName(), inputMakerNodeName(), hltSeedingNodeName()}; // TODO check hltSeedingNodeName(), needed for newJO
165 static const std::set<std::string> expectedParentsSummaryFilter = {hypoAlgNodeName(), comboHypoAlgNodeName(), hltSeedingNodeName()};
166 static const std::set<std::string> expectedParentsSummaryPassed = {summaryFilterNodeName()};
167
168 const std::set<std::string>* expectedParentsPtr = nullptr;
169 if (name == filterNodeName()) {
170 expectedParentsPtr = &expectedParentsFilter;
171 } else if (name == inputMakerNodeName() and !runTwoConversion) {
172 expectedParentsPtr = &expectedParentsInputMaker;
173 } else if (name == inputMakerNodeName() and runTwoConversion) {
174 expectedParentsPtr = &expectedParentsFilter; // We don't have Filter nodes in the R2->R3 conversion
175 } else if (name == hypoAlgNodeName()) {
176 expectedParentsPtr = &expectedParentsHypoAlg;
177 } else if (name == comboHypoAlgNodeName()) {
178 expectedParentsPtr = &expectedParentsComboHypoAlg;
179 } else if (name == summaryFilterNodeName()) {
180 expectedParentsPtr = &expectedParentsSummaryFilter;
181 } else if (name == summaryPassNodeName()) {
182 expectedParentsPtr = &expectedParentsSummaryPassed;
183 } else {
184 printErrorHeader(dEL, msg);
185 msg << MSG::ERROR << "! Invalid Node name '" << name << "'." << endmsg;
186 msg << MSG::ERROR << "! SOLUTION: Find the alg which made a node with this name. Allowed named may be found in TrigCompositeUtils.h, See:'Constant string literals used within the HLT'." << endmsg;
188 return StatusCode::FAILURE;
189 }
190
191 for (const ElementLink<DecisionContainer>& seed : seeds) {
192 if (!expectedParentsPtr->contains( (*seed)->name() )) {
193 printErrorHeader(dEL, msg);
194 msg << MSG::ERROR << "! Invalid linking from node with name '" << name << "' to one with name '"<< (*seed)->name() << "'." << endmsg;
195 msg << MSG::ERROR << "! Allowed seed names are:" << endmsg;
196 for (const std::string& allowed : *expectedParentsPtr) {
197 msg << MSG::ERROR << "! " << allowed << endmsg;
198 }
199 msg << MSG::ERROR << "! SOLUTION: Find where this invalid parent was added and correct it." << endmsg;
201 return StatusCode::FAILURE;
202 }
203 }
204
205 return StatusCode::SUCCESS;
206}
const std::string & summaryFilterNodeName()
const std::string & filterNodeName()
const std::string & comboHypoAlgNodeName()
const std::string & summaryPassNodeName()

Member Data Documentation

◆ 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_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 AthCommonReentrantAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

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

Empty if no symlinks were found.

Definition at line 114 of file AthCommonReentrantAlgorithm.h.

◆ m_hypoTools

ToolHandleArray<IAlgTool> TimeBurner::m_hypoTools {this, "HypoTools", {}}
private

Definition at line 29 of file TimeBurner.h.

29{this, "HypoTools", {}};

◆ m_input

SG::ReadHandleKey<TrigCompositeUtils::DecisionContainer> HypoBase::m_input { this, "HypoInputDecisions", "UNSPECIFIED_INPUT", "Input Decision (implicit)" }
privateinherited

input decisions

Definition at line 101 of file HypoBase.h.

101{ this, "HypoInputDecisions", "UNSPECIFIED_INPUT", "Input Decision (implicit)" };

◆ m_output

SG::WriteHandleKey<TrigCompositeUtils::DecisionContainer> HypoBase::m_output { this, "HypoOutputDecisions", "UNSPECIFIED_OUTPUT", "Ouput Decision" }
privateinherited

output decisions

Definition at line 103 of file HypoBase.h.

103{ this, "HypoOutputDecisions", "UNSPECIFIED_OUTPUT", "Ouput Decision" };

◆ m_runtimeValidation

Gaudi::Property<bool> HypoBase::m_runtimeValidation { this, "RuntimeValidation", false, "Enable detailed runtime validation of HypoAlg output, and upstream Decisions." }
privateinherited

Enabling of detailed validation checks for use during development.

Definition at line 105 of file HypoBase.h.

105{ this, "RuntimeValidation", false, "Enable detailed runtime validation of HypoAlg output, and upstream Decisions." };

◆ m_sleepTimeMillisec

Gaudi::Property<unsigned int> TimeBurner::m_sleepTimeMillisec
private
Initial value:
{
this, "SleepTimeMillisec", 0, "Time to sleep in each execution [ms]"
}

Definition at line 24 of file TimeBurner.h.

24 {
25 this, "SleepTimeMillisec", 0, "Time to sleep in each execution [ms]"
26 };

◆ m_varHandleArraysDeclared

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

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

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

Definition at line 398 of file AthCommonDataStore.h.


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