The Gaudi Framework  v31r0 (aeb156f0)
HLTEventLoopMgr Class Reference

Basic event loop and scheduler for fast HLT reconstruction. More...

#include <src/HLTEventLoopMgr.h>

Inheritance diagram for HLTEventLoopMgr:
Collaboration diagram for HLTEventLoopMgr:

Classes

struct  HLTExecutionTask
 

Public Member Functions

StatusCode initialize () override
 implementation of IService::initialize More...
 
StatusCode reinitialize () override
 implementation of IService::reinitialize More...
 
StatusCode finalize () override
 implementation of IService::finalize More...
 
StatusCode nextEvent (int maxevt) override
 implementation of IEventProcessor::nextEvent More...
 
StatusCode executeEvent (void *par) override
 implementation of IEventProcessor::executeEvent(void* par) More...
 
StatusCode executeRun (int maxevt) override
 implementation of IEventProcessor::executeRun() More...
 
StatusCode stopRun () override
 implementation of IEventProcessor::stopRun() More...
 
- Public Member Functions inherited from extends< Service, IEventProcessor >
void * i_cast (const InterfaceID &tid) const override
 Implementation of IInterface::i_cast. More...
 
StatusCode queryInterface (const InterfaceID &ti, void **pp) override
 Implementation of IInterface::queryInterface. More...
 
std::vector< std::stringgetInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames. More...
 
- Public Member Functions inherited from Service
const std::stringname () const override
 Retrieve name of the service. More...
 
StatusCode configure () override
 
StatusCode initialize () override
 
StatusCode start () override
 
StatusCode stop () override
 
StatusCode finalize () override
 
StatusCode terminate () override
 
Gaudi::StateMachine::State FSMState () const override
 
Gaudi::StateMachine::State targetFSMState () const override
 
StatusCode reinitialize () override
 
StatusCode restart () override
 
StatusCode sysInitialize () override
 Initialize Service. More...
 
StatusCode sysStart () override
 Initialize Service. More...
 
StatusCode sysStop () override
 Initialize Service. More...
 
StatusCode sysFinalize () override
 Finalize Service. More...
 
StatusCode sysReinitialize () override
 Re-initialize the Service. More...
 
StatusCode sysRestart () override
 Re-initialize the Service. More...
 
 Service (std::string name, ISvcLocator *svcloc)
 Standard Constructor. More...
 
SmartIF< ISvcLocator > & serviceLocator () const override
 Retrieve pointer to service locator. More...
 
StatusCode setProperties ()
 Method for setting declared properties to the values specified for the job. More...
 
template<class T >
StatusCode service (const std::string &name, const T *&psvc, bool createIf=true) const
 Access a service by name, creating it if it doesn't already exist. More...
 
template<class T >
StatusCode service (const std::string &name, T *&psvc, bool createIf=true) const
 
template<typename IFace = IService>
SmartIF< IFace > service (const std::string &name, bool createIf=true) const
 
template<class T >
StatusCode service (const std::string &svcType, const std::string &svcName, T *&psvc) const
 Access a service by name and type, creating it if it doesn't already exist. More...
 
template<class T >
StatusCode declareTool (ToolHandle< T > &handle, std::string toolTypeAndName, bool createIf=true)
 Declare used tool. More...
 
SmartIF< IAuditorSvc > & auditorSvc () const
 The standard auditor service.May not be invoked before sysInitialize() has been invoked. More...
 
- Public Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 PropertyHolder ()=default
 
Gaudi::Details::PropertyBasedeclareProperty (Gaudi::Details::PropertyBase &prop)
 Declare a property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, TYPE &value, const std::string &doc="none")
 Helper to wrap a regular data member and use it as a regular property. More...
 
Gaudi::Details::PropertyBasedeclareProperty (const std::string &name, Gaudi::Property< TYPE, VERIFIER, HANDLERS > &prop, const std::string &doc="none")
 Declare a PropertyBase instance setting name and documentation. More...
 
Gaudi::Details::PropertyBasedeclareRemoteProperty (const std::string &name, IProperty *rsvc, const std::string &rname="")
 Declare a remote property. More...
 
StatusCode setProperty (const Gaudi::Details::PropertyBase &p) override
 set the property form another property More...
 
StatusCode setProperty (const std::string &s) override
 set the property from the formatted string More...
 
StatusCode setProperty (const std::string &n, const std::string &v) override
 set the property from name and the value More...
 
StatusCode setProperty (const std::string &name, const TYPE &value)
 set the property form the value More...
 
StatusCode getProperty (Gaudi::Details::PropertyBase *p) const override
 get the property More...
 
const Gaudi::Details::PropertyBasegetProperty (const std::string &name) const override
 get the property by name More...
 
StatusCode getProperty (const std::string &n, std::string &v) const override
 convert the property to the string More...
 
const std::vector< Gaudi::Details::PropertyBase * > & getProperties () const override
 get all properties More...
 
bool hasProperty (const std::string &name) const override
 Return true if we have a property with the given name. More...
 
 PropertyHolder (const PropertyHolder &)=delete
 
PropertyHolderoperator= (const PropertyHolder &)=delete
 
- Public Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
MSG::Level msgLevel () const
 get the cached level (originally extracted from the embedded MsgStream) More...
 
bool msgLevel (MSG::Level lvl) const
 get the output level from the embedded MsgStream More...
 
MSG::Level outputLevel () const
 Backward compatibility function for getting the output level. More...
 
- Public Member Functions inherited from CommonMessagingBase
virtual ~CommonMessagingBase ()=default
 Virtual destructor. More...
 
const SmartIF< IMessageSvc > & msgSvc () const
 The standard message service. More...
 
MsgStreammsgStream () const
 Return an uninitialized MsgStream. More...
 
MsgStreammsgStream (const MSG::Level level) const
 Predefined configurable message stream for the efficient printouts. More...
 
MsgStreamalways () const
 shortcut for the method msgStream(MSG::ALWAYS) More...
 
MsgStreamfatal () const
 shortcut for the method msgStream(MSG::FATAL) More...
 
MsgStreamerr () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamerror () const
 shortcut for the method msgStream(MSG::ERROR) More...
 
MsgStreamwarning () const
 shortcut for the method msgStream(MSG::WARNING) More...
 
MsgStreaminfo () const
 shortcut for the method msgStream(MSG::INFO) More...
 
MsgStreamdebug () const
 shortcut for the method msgStream(MSG::DEBUG) More...
 
MsgStreamverbose () const
 shortcut for the method msgStream(MSG::VERBOSE) More...
 
MsgStreammsg () const
 shortcut for the method msgStream(MSG::INFO) More...
 

Private Member Functions

StatusCode declareEventRootAddress ()
 Declare the root address of the event. More...
 
StatusCode eventFailed (EventContext *eventContext) const
 Method to check if an event failed and take appropriate actions. More...
 
void promoteToExecuted (std::unique_ptr< EventContext > eventContext) const
 

Private Attributes

friend HLTExecutionTask
 
Gaudi::Property< std::stringm_histPersName {this, "HistogramPersistency", "", ""}
 
Gaudi::Property< std::stringm_evtsel {this, "EvtSel", "", ""}
 
Gaudi::Property< int > m_threadPoolSize {this, "ThreadPoolSize", -1, "Size of the threadpool initialised by TBB"}
 
Gaudi::Property< std::stringm_whiteboardSvcName {this, "WhiteboardSvc", "EventDataSvc", "The whiteboard name"}
 
Gaudi::Property< std::stringm_dotfile
 
Gaudi::Property< std::vector< std::string > > m_topAlgs {this, "TopAlg", {}}
 
IDataManagerSvcm_evtDataMgrSvc = nullptr
 Reference to the Event Data Service's IDataManagerSvc interface. More...
 
IEvtSelectorm_evtSelector = nullptr
 Reference to the Event Selector. More...
 
IDataManagerSvcm_histoDataMgrSvc = nullptr
 Reference to the Histogram Data Service. More...
 
IConversionSvcm_histoPersSvc = nullptr
 Reference to the Histogram Persistency Service. More...
 
IHiveWhiteBoardm_whiteboard = nullptr
 Reference to the Whiteboard. More...
 
IAlgExecStateSvcm_algExecStateSvc = nullptr
 Reference to the AlgExecStateSvc. More...
 
std::atomic< unsigned int > m_finishedEvt {0}
 atomic count of the number of finished events More...
 
std::condition_variable m_createEventCond
 condition variable to wake up main thread when we need to create a new event More...
 
std::mutex m_createEventMutex
 mutex assoiciated with m_createEventCond condition variable More...
 
IEvtSelector::Contextm_evtSelContext {nullptr}
 event selector context More...
 
std::vector< Gaudi::Algorithm * > m_algos
 Vector of algorithms to run for every event. More...
 

Additional Inherited Members

- Public Types inherited from extends< Service, IEventProcessor >
using base_class = extends
 Typedef to this class. More...
 
using extend_interfaces_base = extend_interfaces< Interfaces... >
 Typedef to the base of this class. More...
 
- Public Types inherited from Service
using Factory = Gaudi::PluginService::Factory< IService *(const std::string &, ISvcLocator *)>
 
- Public Types inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
using PropertyHolderImpl = PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
 Typedef used to refer to this class from derived classes, as in. More...
 
- Public Types inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
using base_class = CommonMessaging
 
- Public Types inherited from extend_interfaces< Interfaces... >
using ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids... >::type
 take union of the ext_iids of all Interfaces... More...
 
- Protected Member Functions inherited from Service
 ~Service () override
 Standard Destructor. More...
 
int outputLevel () const
 get the Service's output level More...
 
- Protected Member Functions inherited from PropertyHolder< CommonMessaging< implements< IService, IProperty, IStateful > > >
Gaudi::Details::PropertyBaseproperty (const std::string &name) const
 
- Protected Member Functions inherited from CommonMessaging< implements< IService, IProperty, IStateful > >
MSG::Level setUpMessaging () const
 Set up local caches. More...
 
MSG::Level resetMessaging ()
 Reinitialize internal states. More...
 
void updateMsgStreamOutputLevel (int level)
 Update the output level of the cached MsgStream. More...
 
- Protected Attributes inherited from Service
Gaudi::StateMachine::State m_state = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::StateMachine::State m_targetState = Gaudi::StateMachine::OFFLINE
 Service state. More...
 
Gaudi::Property< int > m_outputLevel {this, "OutputLevel", MSG::NIL, "output level"}
 
Gaudi::Property< bool > m_auditInit {this, "AuditServices", false, "[[deprecated]] unused"}
 
Gaudi::Property< bool > m_auditorInitialize {this, "AuditInitialize", false, "trigger auditor on initialize()"}
 
Gaudi::Property< bool > m_auditorStart {this, "AuditStart", false, "trigger auditor on start()"}
 
Gaudi::Property< bool > m_auditorStop {this, "AuditStop", false, "trigger auditor on stop()"}
 
Gaudi::Property< bool > m_auditorFinalize {this, "AuditFinalize", false, "trigger auditor on finalize()"}
 
Gaudi::Property< bool > m_auditorReinitialize {this, "AuditReinitialize", false, "trigger auditor on reinitialize()"}
 
Gaudi::Property< bool > m_auditorRestart {this, "AuditRestart", false, "trigger auditor on restart()"}
 
SmartIF< IAuditorSvcm_pAuditorSvc
 Auditor Service. More...
 

Detailed Description

Basic event loop and scheduler for fast HLT reconstruction.

It uses one fifo queue per tbb thread and schedules full events on a given thread by putting all algos in the dedicated queue from the beginning.

Definition at line 21 of file HLTEventLoopMgr.h.

Member Function Documentation

StatusCode HLTEventLoopMgr::declareEventRootAddress ( )
private

Declare the root address of the event.

Definition at line 500 of file HLTEventLoopMgr.cpp.

500  {
501  IOpaqueAddress* pAddr = nullptr;
503  if ( sc.isSuccess() ) {
504  // Create root address and assign address to data service
506  if ( !sc.isSuccess() ) {
508  if ( sc.isSuccess() ) {
510  if ( !sc.isSuccess() ) warning() << "Error creating IOpaqueAddress." << endmsg;
511  }
512  }
513  }
514  if ( !sc.isSuccess() ) {
515  info() << "No more events in event selection " << endmsg;
516  return StatusCode::FAILURE;
517  }
518  sc = m_evtDataMgrSvc->setRoot( "/Event", pAddr );
519  if ( !sc.isSuccess() ) { warning() << "Error declaring event root address." << endmsg; }
520  return StatusCode::SUCCESS;
521 }
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
bool isSuccess() const
Definition: StatusCode.h:267
virtual StatusCode setRoot(std::string root_name, DataObject *pObject)=0
Initialize data store for new event by giving new event path.
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
IDataManagerSvc * m_evtDataMgrSvc
Reference to the Event Data Service&#39;s IDataManagerSvc interface.
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
IEvtSelector::Context * m_evtSelContext
event selector context
IEvtSelector * m_evtSelector
Reference to the Event Selector.
constexpr static const auto FAILURE
Definition: StatusCode.h:86
virtual StatusCode next(Context &c) const =0
Fetch the next event or the first event if it will be use soon after the creation of the context...
virtual StatusCode createAddress(const Context &c, IOpaqueAddress *&iop) const =0
Create an IOpaqueAddress object from the event fetched.
Opaque address interface definition.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
StatusCode HLTEventLoopMgr::eventFailed ( EventContext eventContext) const
private

Method to check if an event failed and take appropriate actions.

It can be possible that an event fails.

In this case this method is called. It dumps the state of the scheduler, drains the actions (without executing them) and events in the queues and returns a failure.

Definition at line 528 of file HLTEventLoopMgr.cpp.

528  {
529  fatal() << "*** Event " << eventContext->evt() << " on slot " << eventContext->slot() << " failed! ***" << endmsg;
530  std::ostringstream ost;
531  m_algExecStateSvc->dump( ost, *eventContext );
532  info() << "Dumping Alg Exec State for slot " << eventContext->slot() << ":\n" << ost.str() << endmsg;
533  return StatusCode::FAILURE;
534 }
ContextID_t slot() const
Definition: EventContext.h:48
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
virtual void dump(std::ostringstream &ost, const EventContext &ctx) const =0
ContextEvt_t evt() const
Definition: EventContext.h:47
constexpr static const auto FAILURE
Definition: StatusCode.h:86
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
IAlgExecStateSvc * m_algExecStateSvc
Reference to the AlgExecStateSvc.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
StatusCode HLTEventLoopMgr::executeEvent ( void *  par)
override

implementation of IEventProcessor::executeEvent(void* par)

Definition at line 382 of file HLTEventLoopMgr.cpp.

382  {
383  // Leave the interface intact and swallow this C trick.
384  int& createdEvts = *reinterpret_cast<int*>( createdEvts_IntPtr );
385 
386  auto evtContext = std::make_unique<EventContext>();
387  evtContext->set( createdEvts, m_whiteboard->allocateStore( createdEvts ) );
388  m_algExecStateSvc->reset( *evtContext );
389 
390  StatusCode sc = m_whiteboard->selectStore( evtContext->slot() );
391  if ( sc.isFailure() ) {
392  fatal() << "Slot " << evtContext->slot() << " could not be selected for the WhiteBoard\n"
393  << "Impossible to create event context" << endmsg;
394  return StatusCode::FAILURE;
395  }
396 
397  StatusCode declEvtRootSc = declareEventRootAddress();
398  if ( declEvtRootSc.isFailure() ) { // We ran out of events!
399  createdEvts = -1; // Set created event to a negative value: we finished!
400  return StatusCode::SUCCESS;
401  }
402 
403  // Now add event to the scheduler
404  if ( msgLevel( MSG::DEBUG ) )
405  debug() << "Event " << evtContext->evt() << " submitting in slot " << evtContext->slot() << endmsg;
406 
407  // Event processing slot forced to be the same as the wb slot
408  tbb::task* task = new ( tbb::task::allocate_root() )
410  tbb::task::enqueue( *task );
411 
412  if ( msgLevel( MSG::DEBUG ) )
413  debug() << "All algorithms were submitted on event " << evtContext->evt() << " in slot " << evtContext->slot()
414  << endmsg; // FIXME: use after std::move..
415 
416  createdEvts++;
417  return StatusCode::SUCCESS;
418 }
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
bool isFailure() const
Definition: StatusCode.h:130
virtual StatusCode selectStore(size_t partitionIndex)=0
Activate an given &#39;slot&#39; for all subsequent calls within the same thread id.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
IHiveWhiteBoard * m_whiteboard
Reference to the Whiteboard.
T move(T...args)
virtual void reset(const EventContext &ctx)=0
std::vector< Gaudi::Algorithm * > m_algos
Vector of algorithms to run for every event.
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
virtual size_t allocateStore(int evtnumber)=0
Allocate a store partition for new event.
constexpr static const auto FAILURE
Definition: StatusCode.h:86
StatusCode declareEventRootAddress()
Declare the root address of the event.
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
IAlgExecStateSvc * m_algExecStateSvc
Reference to the AlgExecStateSvc.
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:277
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)
StatusCode HLTEventLoopMgr::executeRun ( int  maxevt)
inlineoverride

implementation of IEventProcessor::executeRun()

Definition at line 39 of file HLTEventLoopMgr.h.

39 { return nextEvent( maxevt ); }
StatusCode nextEvent(int maxevt) override
implementation of IEventProcessor::nextEvent
int maxevt
Definition: Bootstrap.cpp:260
StatusCode HLTEventLoopMgr::finalize ( )
override

implementation of IService::finalize

Definition at line 348 of file HLTEventLoopMgr.cpp.

348  {
349  StatusCode sc;
350  // Save Histograms Now
351  if ( m_histoPersSvc ) {
352  HistogramAgent agent;
353  sc = m_histoDataMgrSvc->traverseTree( &agent );
354  if ( sc.isSuccess() ) {
355  const IDataSelector& objects = agent.selectedObjects();
356  // skip /stat entry!
357  sc = std::accumulate( begin( objects ), end( objects ), sc, [&]( StatusCode s, const auto& i ) {
358  IOpaqueAddress* pAddr = nullptr;
359  StatusCode iret = m_histoPersSvc->createRep( i, pAddr );
360  if ( iret.isSuccess() ) i->registry()->setAddress( pAddr );
361  return s.isFailure() ? s : iret;
362  } );
363  sc = std::accumulate( begin( objects ), end( objects ), sc, [&]( StatusCode s, const auto& i ) {
364  IRegistry* reg = i->registry();
365  StatusCode iret = m_histoPersSvc->fillRepRefs( reg->address(), i );
366  return s.isFailure() ? s : iret;
367  } );
368  if ( sc.isSuccess() ) {
369  info() << "Histograms converted successfully according to request." << endmsg;
370  } else {
371  error() << "Error while saving Histograms." << endmsg;
372  }
373  } else {
374  error() << "Error while traversing Histogram data store" << endmsg;
375  }
376  }
377 
379  return sc.isFailure() ? sc2.ignore(), sc : sc2;
380 }
virtual StatusCode traverseTree(IDataStoreAgent *pAgent)=0
Analyse by traversing all data objects in the data store.
IConversionSvc * m_histoPersSvc
Reference to the Histogram Persistency Service.
StatusCode finalize() override
Definition: Service.cpp:164
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
bool isSuccess() const
Definition: StatusCode.h:267
HistogramAgent base in charge of collecting all the references to DataObjects in a transient store th...
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress)=0
Convert the transient object to the requested representation.
bool isFailure() const
Definition: StatusCode.h:130
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
const IDataSelector & selectedObjects() const
Return the set of selected DataObjects.
IDataManagerSvc * m_histoDataMgrSvc
Reference to the Histogram Data Service.
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
string s
Definition: gaudirun.py:312
AttribStringParser::Iterator begin(const AttribStringParser &parser)
T accumulate(T...args)
Opaque address interface definition.
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
virtual StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the converted object.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
StatusCode HLTEventLoopMgr::initialize ( )
override

implementation of IService::initialize

Definition at line 137 of file HLTEventLoopMgr.cpp.

137  {
139  if ( !sc.isSuccess() ) {
140  error() << "Failed to initialize Service Base class." << endmsg;
141  return StatusCode::FAILURE;
142  }
143  // Setup access to event data services
144  m_evtDataMgrSvc = serviceLocator()->service<IDataManagerSvc>( "EventDataSvc" );
145  if ( !m_evtDataMgrSvc ) {
146  fatal() << "Error retrieving EventDataSvc interface IDataManagerSvc." << endmsg;
147  return StatusCode::FAILURE;
148  }
149  m_whiteboard = serviceLocator()->service<IHiveWhiteBoard>( "EventDataSvc" );
150  if ( !m_whiteboard ) {
151  fatal() << "Error retrieving EventDataSvc interface IHiveWhiteBoard." << endmsg;
152  return StatusCode::FAILURE;
153  }
154  // Obtain the IProperty of the ApplicationMgr
155  IProperty* appMgrProperty = serviceLocator()->service<IProperty>( "ApplicationMgr" );
156  if ( !appMgrProperty ) {
157  fatal() << "IProperty interface not found in ApplicationMgr." << endmsg;
158  return StatusCode::FAILURE;
159  }
160  // We do not expect a Event Selector necessarily being declared
161  setProperty( appMgrProperty->getProperty( "EvtSel" ) ).ignore();
162 
163  if ( m_evtsel != "NONE" || m_evtsel.length() == 0 ) {
164  m_evtSelector = serviceLocator()->service<IEvtSelector>( "EventSelector" );
165  } else {
166  m_evtSelector = nullptr;
167  warning() << "Unable to locate service \"EventSelector\" " << endmsg;
168  warning() << "No events will be processed from external input." << endmsg;
169  }
170 
171  // Setup access to histogramming services
172  m_histoDataMgrSvc = serviceLocator()->service<IDataManagerSvc>( "HistogramDataSvc" );
173  if ( !m_histoDataMgrSvc ) {
174  fatal() << "Error retrieving HistogramDataSvc." << endmsg;
175  return sc;
176  }
177  // Setup histogram persistency
178  m_histoPersSvc = serviceLocator()->service<IConversionSvc>( "HistogramPersistencySvc" );
179  if ( !m_histoPersSvc ) {
180  warning() << "Histograms cannot not be saved - though required." << endmsg;
181  return sc;
182  }
183 
184  m_algExecStateSvc = serviceLocator()->service<IAlgExecStateSvc>( "AlgExecStateSvc" );
185  if ( !m_algExecStateSvc ) {
186  fatal() << "Error retrieving AlgExecStateSvc" << endmsg;
187  return StatusCode::FAILURE;
188  }
189 
190  if ( !m_topAlgs.empty() ) {
191  auto databroker = serviceLocator()->service<IDataBroker>( "HiveDataBrokerSvc" );
192  // the only control flow supported here is to run the 'topAlgs' (and their depedencies) in a 'lazy_and' fashion
193  // as a result, we can just 'flatten' the list, and make sure algorithms appear only once (the latter is not
194  // strictly neccessary, but an optimization)
195  for ( const auto& alg : m_topAlgs.value() ) {
196  auto algs = databroker->algorithmsRequiredFor( alg );
197  std::copy_if( begin( algs ), end( algs ), std::back_inserter( m_algos ), [this]( const Gaudi::Algorithm* a ) {
198  return std::find( begin( this->m_algos ), end( this->m_algos ), a ) == end( this->m_algos );
199  } );
200  }
201  } else {
202  // Get the list of algorithms
203  IAlgResourcePool* algResourcePool = serviceLocator()->service<IAlgResourcePool>( "AlgResourcePool" );
204  if ( !algResourcePool ) {
205  fatal() << "Error retrieving AlgoResourcePool" << endmsg;
206  return StatusCode::FAILURE;
207  }
208  for ( auto alg : algResourcePool->getFlatAlgList() ) {
209  Algorithm* algoPtr = dynamic_cast<Algorithm*>( alg );
210  if ( !algoPtr ) {
211  fatal() << "Could not convert IAlgorithm into Algorithm: this will result in a crash." << endmsg;
212  }
213  m_algos.push_back( algoPtr );
214  }
215  /* Dependencies
216  1) Look for handles in algo, if none
217  2) Assume none are required
218  */
219  DataObjIDColl globalInp, globalOutp;
220 
221  boost::optional<std::ofstream> dot{boost::in_place_init_if, !m_dotfile.empty(), m_dotfile.value()};
222 
223  if ( dot ) {
224  *dot << "digraph G {\n";
225  for ( auto* a : m_algos ) {
226  bool is_consumer = a->outputDataObjs().empty();
227  *dot << '\"' << a->name() << "\" [shape=box" << ( is_consumer ? ",style=filled" : "" ) << "];\n";
228  }
229  }
230 
231  // figure out all outputs
233  for ( Gaudi::Algorithm* algoPtr : m_algos ) {
234  for ( auto id : algoPtr->outputDataObjs() ) {
235  auto r = globalOutp.insert( id );
236  producers[id] = algoPtr;
237  if ( !r.second ) {
238  warning() << "multiple algorithms declare " << id
239  << " as output! could be a single instance in multiple paths "
240  "though, or control flow may guarantee only one runs...!"
241  << endmsg;
242  }
243  }
244  }
245 
246  // Building and printing Data Dependencies
247  std::vector<DataObjIDColl> algosDependencies;
248  algosDependencies.reserve( m_algos.size() ); // reserve so that pointers into the vector do not get invalidated...
250  info() << "Data Dependencies for Algorithms:";
251 
252  for ( Gaudi::Algorithm* algoPtr : m_algos ) {
253  info() << "\n " << algoPtr->name();
254 
255  DataObjIDColl algoDependencies;
256  if ( !algoPtr->inputDataObjs().empty() || !algoPtr->outputDataObjs().empty() ) {
257  for ( const DataObjID* idp : sortedDataObjIDColl( algoPtr->inputDataObjs() ) ) {
258  DataObjID id = *idp;
259  info() << "\n o INPUT " << id;
260  if ( id.key().find( ":" ) != std::string::npos ) {
261  info() << " contains alternatives which require resolution...\n";
262  auto tokens = boost::tokenizer<boost::char_separator<char>>{id.key(), boost::char_separator<char>{":"}};
263  auto itok = std::find_if( tokens.begin(), tokens.end(), [&]( const std::string& t ) {
264  return globalOutp.find( DataObjID{t} ) != globalOutp.end();
265  } );
266  if ( itok != tokens.end() ) {
267  info() << "found matching output for " << *itok << " -- updating scheduler info\n";
268  id.updateKey( *itok );
269  } else {
270  error() << "failed to find alternate in global output list"
271  << " for id: " << id << " in Alg " << algoPtr->name() << endmsg;
272  }
273  }
274  algoDependencies.insert( id );
275  if ( dot ) *dot << DataObjIDDotRepr{id} << " -> \"" << algoPtr->name() << "\";\n";
276  globalInp.insert( id );
277  }
278  for ( const DataObjID* id : sortedDataObjIDColl( algoPtr->outputDataObjs() ) ) {
279  info() << "\n o OUTPUT " << *id;
280  if ( id->key().find( ":" ) != std::string::npos ) {
281  error() << " in Alg " << algoPtr->name() << " alternatives are NOT allowed for outputs! id: " << *id
282  << endmsg;
283  }
284  if ( dot ) *dot << '\"' << algoPtr->name() << "\" -> " << DataObjIDDotRepr{*id} << ";\n";
285  }
286  } else {
287  info() << "\n none";
288  }
289  algosDependencies.emplace_back( algoDependencies );
290  algo2Deps[algoPtr] = &algosDependencies.back();
291  }
292  if ( dot ) {
293  for ( const auto& t : globalOutp ) {
294  if ( globalInp.find( t ) == globalInp.end() ) *dot << DataObjIDDotRepr{t} << " [style=filled];\n";
295  }
296  *dot << "}\n";
297  }
298  info() << endmsg;
299 
300  // Check if we have unmet global input dependencies
301  DataObjIDColl unmetDep;
302  for ( auto o : globalInp ) {
303  if ( globalOutp.find( o ) == globalOutp.end() ) unmetDep.insert( o );
304  }
305  if ( unmetDep.size() > 0 ) {
306  std::ostringstream ost;
307  for ( const DataObjID* o : sortedDataObjIDColl( unmetDep ) ) {
308  ost << "\n o " << *o << " required by Algorithm: ";
309  for ( const auto& i : algo2Deps ) {
310  if ( i.second->find( *o ) != i.second->end() ) { ost << "\n * " << i.first->name(); }
311  }
312  }
313  fatal() << "The following unmet INPUT dependencies were found:" << ost.str() << endmsg;
314  return StatusCode::FAILURE;
315  } else {
316  info() << "No unmet INPUT data dependencies were found" << endmsg;
317  }
318 
319  // rework the flat algo list to respect data dependencies
320  auto start = m_algos.begin();
321  auto end = m_algos.end();
322  auto current =
323  std::partition( start, end, [&algo2Deps]( const Gaudi::Algorithm* algo ) { return algo2Deps[algo]->empty(); } );
324 
325  // Repeatedly put in front algos for which input are already fullfilled
326  while ( current != end ) {
327  current = std::partition( current, end, [start, current, &producers, &algo2Deps]( const Gaudi::Algorithm* algo ) {
328  return std::none_of( algo2Deps[algo]->begin(), algo2Deps[algo]->end(),
329  [start, current, &producers]( const DataObjID& id ) {
330  return std::find( start, current, producers[id] ) == current;
331  } );
332  } );
333  }
334  }
335 
336  // Clearly inform about the level of concurrency
337  info() << "Concurrency level information:" << endmsg;
338  info() << " o Number of events slots: " << m_whiteboard->getNumberOfStores() << endmsg;
339  info() << " o TBB thread pool size: " << m_threadPoolSize << endmsg;
340 
341  // Fill the containers to convert algo names to index
342  debug() << "Order of algo execution :" << endmsg;
343  for ( const Gaudi::Algorithm* algo : m_algos ) debug() << " . " << algo->name() << endmsg;
344 
345  return sc;
346 }
StatusCode initialize() override
Definition: Service.cpp:60
T empty(T...args)
T copy_if(T...args)
IConversionSvc * m_histoPersSvc
Reference to the Histogram Persistency Service.
StatusCode setProperty(const Gaudi::Details::PropertyBase &p) override
set the property form another property
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
StatusCode start() override
Definition: Service.cpp:129
const std::string & name() const override
The identifying name of the algorithm object.
Definition: Algorithm.cpp:635
The Event Selector Interface.
Definition: IEvtSelector.h:18
const DataObjIDColl & outputDataObjs() const override
bool isSuccess() const
Definition: StatusCode.h:267
virtual StatusCode getProperty(Gaudi::Details::PropertyBase *p) const =0
Get the property by property.
virtual std::list< IAlgorithm * > getFlatAlgList()=0
Get the flat list of algorithms.
IDataManagerSvc * m_evtDataMgrSvc
Reference to the Event Data Service&#39;s IDataManagerSvc interface.
STL class.
Gaudi::Property< std::vector< std::string > > m_topAlgs
T partition(T...args)
STL class.
The IAlgResourcePool is the interface for managing algorithm instances, in particular if clones of th...
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:76
T push_back(T...args)
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
Abstract interface for a service that manages the Algorithm execution states.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
const DataObjIDColl & inputDataObjs() const override
const std::string & key() const
Definition: DataObjID.h:48
IHiveWhiteBoard * m_whiteboard
Reference to the Whiteboard.
IDataManagerSvc * m_histoDataMgrSvc
Reference to the Histogram Data Service.
T insert(T...args)
std::vector< Gaudi::Algorithm * > m_algos
Vector of algorithms to run for every event.
Alias for backward compatibility.
Definition: Algorithm.h:56
T find(T...args)
T size(T...args)
Gaudi::Property< int > m_threadPoolSize
STL class.
Gaudi::Property< std::string > m_evtsel
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
T back_inserter(T...args)
T none_of(T...args)
IEvtSelector * m_evtSelector
Reference to the Event Selector.
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:79
T back(T...args)
constexpr static const auto FAILURE
Definition: StatusCode.h:86
virtual std::vector< Gaudi::Algorithm * > algorithmsRequiredFor(const DataObjIDColl &requested, const std::vector< std::string > &stoppers={}) const =0
Get the (ordered!) list of algorithms required to provide a given DataObjIDColl.
AttribStringParser::Iterator begin(const AttribStringParser &parser)
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
IAlgExecStateSvc * m_algExecStateSvc
Reference to the AlgExecStateSvc.
virtual size_t getNumberOfStores() const =0
Get the number of &#39;slots&#39;.
The IProperty is the basic interface for all components which have properties that can be set or get...
Definition: IProperty.h:20
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:277
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
Gaudi::Property< std::string > m_dotfile
T reserve(T...args)
T emplace_back(T...args)
StatusCode HLTEventLoopMgr::nextEvent ( int  maxevt)
override

implementation of IEventProcessor::nextEvent

Definition at line 429 of file HLTEventLoopMgr.cpp.

429  {
430  // Calculate runtime
432 
433  // Reset the application return code.
434  auto appmgr = serviceLocator()->as<IProperty>();
436 
437  // create m_evtSelContext used internally in executeEvent and more
438  // precisely in declareEventRootAddress. Cannot be passed through the interface
439  // without breaking other schedulers
441  if ( !sc.isSuccess() ) {
442  fatal() << "Can not create the event selector Context." << endmsg;
443  return sc;
444  }
445 
446  // create th tbb thread pool
447  tbb::task_scheduler_init tbbSchedInit( m_threadPoolSize.value() + 1 );
448 
449  int createdEvts = 0;
450  // Run the first event before spilling more than one
451  bool newEvtAllowed = false;
452 
453  info() << "Starting loop on events" << endmsg;
454  auto start_time = Clock::now();
455  while ( maxevt < 0 || m_finishedEvt < (unsigned int)maxevt ) {
456  // if the created events did not reach maxevt, create an event
457  if ( !( ( newEvtAllowed || createdEvts == 0 ) && // Launch the first event alone
458  // The events are not finished with an unlimited number of events
459  createdEvts >= 0 &&
460  // The events are not finished with a limited number of events
461  ( createdEvts < maxevt || maxevt < 0 ) &&
462  // There are still free slots in the whiteboard
463  m_whiteboard->freeSlots() > 0 ) ) {
464 
466  using namespace std::chrono_literals;
467  m_createEventCond.wait_for( lock, 1ms, [this, newEvtAllowed, createdEvts, maxevt] {
468  return ( newEvtAllowed ||
469  createdEvts == 0 ) && // Launch the first event alone
470  // The events are not finished with an unlimited number of events
471  createdEvts >= 0 &&
472  // The events are not finished with a limited number of events
473  ( createdEvts < maxevt || maxevt < 0 ) &&
474  // There are still free slots in the whiteboard
475  this->m_whiteboard->freeSlots() > 0;
476  } );
477  continue;
478  }
479  if ( 1 == createdEvts ) // reset counter to count from event 1
480  start_time = Clock::now();
481 
482  // TODO can we adapt the interface of executeEvent for a nicer solution?
484  sc = executeEvent( &createdEvts );
485  if ( !sc.isSuccess() ) return StatusCode::FAILURE; // else we have an success --> exit loop
486  newEvtAllowed = true;
487  } // end main loop on finished events
488  auto end_time = Clock::now();
489 
490  delete m_evtSelContext;
491  m_evtSelContext = nullptr;
492 
493  constexpr double oneOver1024 = 1. / 1024.;
494  info() << "---> Loop Finished (skipping 1st evt) - "
495  << " WSS " << System::mappedMemory( System::MemoryUnit::kByte ) * oneOver1024 << " total time "
496  << std::chrono::duration_cast<std::chrono::milliseconds>( end_time - start_time ).count() << " ms" << endmsg;
497  return StatusCode::SUCCESS;
498 }
std::mutex m_createEventMutex
mutex assoiciated with m_createEventCond condition variable
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
bool isSuccess() const
Definition: StatusCode.h:267
constexpr static const auto RECOVERABLE
Definition: StatusCode.h:87
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
std::condition_variable m_createEventCond
condition variable to wake up main thread when we need to create a new event
T duration_cast(T...args)
virtual size_t freeSlots()=0
Get free slots number.
SmartIF< IFace > as()
Definition: ISvcLocator.h:103
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
IEvtSelector::Context * m_evtSelContext
event selector context
T lock(T...args)
StatusCode setAppReturnCode(SmartIF< IProperty > &appmgr, int value, bool force=false)
Set the application return code.
Definition: AppReturnCode.h:49
IHiveWhiteBoard * m_whiteboard
Reference to the Whiteboard.
T count(T...args)
GAUDI_API long mappedMemory(MemoryUnit unit=kByte, InfoType fetch=Memory, long pid=-1)
Basic Process Information: priority boost.
Definition: Memory.cpp:187
Gaudi::Property< int > m_threadPoolSize
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
IEvtSelector * m_evtSelector
Reference to the Event Selector.
std::atomic< unsigned int > m_finishedEvt
atomic count of the number of finished events
constexpr static const auto FAILURE
Definition: StatusCode.h:86
StatusCode executeEvent(void *par) override
implementation of IEventProcessor::executeEvent(void* par)
virtual StatusCode createContext(Context *&c) const =0
Create and return a context object that will keep track of the state of selection.
int maxevt
Definition: Bootstrap.cpp:260
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
constexpr int Success
Definition: AppReturnCode.h:16
The IProperty is the basic interface for all components which have properties that can be set or get...
Definition: IProperty.h:20
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:277
constexpr double ms
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
void HLTEventLoopMgr::promoteToExecuted ( std::unique_ptr< EventContext eventContext) const
private

Definition at line 536 of file HLTEventLoopMgr.cpp.

536  {
537  // Check if the execution failed
538  if ( m_algExecStateSvc->eventStatus( *eventContext ) != EventStatus::Success )
539  eventFailed( eventContext.get() ).ignore();
540  int si = eventContext->slot();
541 
542  // if ( msgLevel( MSG::DEBUG ) )
543  // debug() << "Event " << eventContext->evt() << " executed in slot " << si << "." << endmsg;
544 
545  // Schedule the cleanup of the event
546  if ( m_algExecStateSvc->eventStatus( *eventContext ) == EventStatus::Success ) {
547  if ( msgLevel( MSG::DEBUG ) )
548  debug() << "Event " << eventContext->evt() << " finished (slot " << si << ")." << endmsg;
549  } else {
550  fatal() << "Failed event detected on " << *eventContext << endmsg;
551  }
552 
553  debug() << "Clearing slot " << si << " (event " << eventContext->evt() << ") of the whiteboard" << endmsg;
554 
555  StatusCode sc = m_whiteboard->clearStore( si );
556  if ( !sc.isSuccess() ) warning() << "Clear of Event data store failed" << endmsg;
557  sc = m_whiteboard->freeStore( si );
558  if ( !sc.isSuccess() ) error() << "Whiteboard slot " << eventContext->slot() << " could not be properly cleared";
559  ++m_finishedEvt;
561 }
ContextID_t slot() const
Definition: EventContext.h:48
bool isSuccess() const
Definition: StatusCode.h:267
std::condition_variable m_createEventCond
condition variable to wake up main thread when we need to create a new event
ContextEvt_t evt() const
Definition: EventContext.h:47
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
virtual StatusCode clearStore(size_t partitionIndex)=0
Clear an given &#39;slot&#39;.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
IHiveWhiteBoard * m_whiteboard
Reference to the Whiteboard.
T get(T...args)
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
virtual const EventStatus::Status & eventStatus(const EventContext &ctx) const =0
std::atomic< unsigned int > m_finishedEvt
atomic count of the number of finished events
virtual StatusCode freeStore(size_t partitionIndex)=0
Free a store partition.
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
IAlgExecStateSvc * m_algExecStateSvc
Reference to the AlgExecStateSvc.
StatusCode eventFailed(EventContext *eventContext) const
Method to check if an event failed and take appropriate actions.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)
StatusCode HLTEventLoopMgr::reinitialize ( )
inlineoverride

implementation of IService::reinitialize

Definition at line 30 of file HLTEventLoopMgr.h.

30 { return StatusCode::FAILURE; }
constexpr static const auto FAILURE
Definition: StatusCode.h:86
StatusCode HLTEventLoopMgr::stopRun ( )
override

implementation of IEventProcessor::stopRun()

Definition at line 420 of file HLTEventLoopMgr.cpp.

420  {
421  // Set the application return code
422  auto appmgr = serviceLocator()->as<IProperty>();
424  error() << "Could not set return code of the application (" << Gaudi::ReturnCode::ScheduledStop << ")" << endmsg;
425  }
426  return StatusCode::SUCCESS;
427 }
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
SmartIF< IFace > as()
Definition: ISvcLocator.h:103
bool isFailure() const
Definition: StatusCode.h:130
constexpr int ScheduledStop
Definition: AppReturnCode.h:25
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
StatusCode setAppReturnCode(SmartIF< IProperty > &appmgr, int value, bool force=false)
Set the application return code.
Definition: AppReturnCode.h:49
The IProperty is the basic interface for all components which have properties that can be set or get...
Definition: IProperty.h:20
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:277
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192

Member Data Documentation

Definition at line 49 of file HLTEventLoopMgr.h.

IAlgExecStateSvc* HLTEventLoopMgr::m_algExecStateSvc = nullptr
private

Reference to the AlgExecStateSvc.

Definition at line 73 of file HLTEventLoopMgr.h.

std::vector<Gaudi::Algorithm*> HLTEventLoopMgr::m_algos
private

Vector of algorithms to run for every event.

Definition at line 86 of file HLTEventLoopMgr.h.

std::condition_variable HLTEventLoopMgr::m_createEventCond
mutableprivate

condition variable to wake up main thread when we need to create a new event

Definition at line 78 of file HLTEventLoopMgr.h.

std::mutex HLTEventLoopMgr::m_createEventMutex
private

mutex assoiciated with m_createEventCond condition variable

Definition at line 80 of file HLTEventLoopMgr.h.

Gaudi::Property<std::string> HLTEventLoopMgr::m_dotfile
private
Initial value:
{
this, "DotFile", {}, "Name of file to dump dependency graph; if empty, do not dump"}

Definition at line 58 of file HLTEventLoopMgr.h.

IDataManagerSvc* HLTEventLoopMgr::m_evtDataMgrSvc = nullptr
private

Reference to the Event Data Service's IDataManagerSvc interface.

Definition at line 63 of file HLTEventLoopMgr.h.

Gaudi::Property<std::string> HLTEventLoopMgr::m_evtsel {this, "EvtSel", "", ""}
private

Definition at line 55 of file HLTEventLoopMgr.h.

IEvtSelector::Context* HLTEventLoopMgr::m_evtSelContext {nullptr}
private

event selector context

Definition at line 83 of file HLTEventLoopMgr.h.

IEvtSelector* HLTEventLoopMgr::m_evtSelector = nullptr
private

Reference to the Event Selector.

Definition at line 65 of file HLTEventLoopMgr.h.

std::atomic<unsigned int> HLTEventLoopMgr::m_finishedEvt {0}
mutableprivate

atomic count of the number of finished events

Definition at line 76 of file HLTEventLoopMgr.h.

IDataManagerSvc* HLTEventLoopMgr::m_histoDataMgrSvc = nullptr
private

Reference to the Histogram Data Service.

Definition at line 67 of file HLTEventLoopMgr.h.

IConversionSvc* HLTEventLoopMgr::m_histoPersSvc = nullptr
private

Reference to the Histogram Persistency Service.

Definition at line 69 of file HLTEventLoopMgr.h.

Gaudi::Property<std::string> HLTEventLoopMgr::m_histPersName {this, "HistogramPersistency", "", ""}
private

Definition at line 54 of file HLTEventLoopMgr.h.

Gaudi::Property<int> HLTEventLoopMgr::m_threadPoolSize {this, "ThreadPoolSize", -1, "Size of the threadpool initialised by TBB"}
private

Definition at line 56 of file HLTEventLoopMgr.h.

Gaudi::Property<std::vector<std::string> > HLTEventLoopMgr::m_topAlgs {this, "TopAlg", {}}
private

Definition at line 60 of file HLTEventLoopMgr.h.

IHiveWhiteBoard* HLTEventLoopMgr::m_whiteboard = nullptr
private

Reference to the Whiteboard.

Definition at line 71 of file HLTEventLoopMgr.h.

Gaudi::Property<std::string> HLTEventLoopMgr::m_whiteboardSvcName {this, "WhiteboardSvc", "EventDataSvc", "The whiteboard name"}
private

Definition at line 57 of file HLTEventLoopMgr.h.


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