The Gaudi Framework  v30r4 (9b837755)
HLTEventLoopMgr Class Reference

#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< 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

Definition at line 24 of file HLTEventLoopMgr.h.

Member Function Documentation

StatusCode HLTEventLoopMgr::declareEventRootAddress ( )
private

Declare the root address of the event.

Definition at line 516 of file HLTEventLoopMgr.cpp.

517 {
518  IOpaqueAddress* pAddr = nullptr;
520  if ( sc.isSuccess() ) {
521  // Create root address and assign address to data service
523  if ( !sc.isSuccess() ) {
525  if ( sc.isSuccess() ) {
527  if ( !sc.isSuccess() ) warning() << "Error creating IOpaqueAddress." << endmsg;
528  }
529  }
530  }
531  if ( !sc.isSuccess() ) {
532  info() << "No more events in event selection " << endmsg;
533  return StatusCode::FAILURE;
534  }
535  sc = m_evtDataMgrSvc->setRoot( "/Event", pAddr );
536  if ( !sc.isSuccess() ) {
537  warning() << "Error declaring event root address." << endmsg;
538  }
539  return StatusCode::SUCCESS;
540 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
bool isSuccess() const
Definition: StatusCode.h:287
virtual StatusCode setRoot(std::string root_name, DataObject *pObject)=0
Initialize data store for new event by giving new event path.
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:51
IEvtSelector::Context * m_evtSelContext
event selector context
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
IEvtSelector * m_evtSelector
Reference to the Event Selector.
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:209
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 547 of file HLTEventLoopMgr.cpp.

548 {
549  fatal() << "*** Event " << eventContext->evt() << " on slot " << eventContext->slot() << " failed! ***" << endmsg;
550  std::ostringstream ost;
551  m_algExecStateSvc->dump( ost, *eventContext );
552  info() << "Dumping Alg Exec State for slot " << eventContext->slot() << ":\n" << ost.str() << endmsg;
553  return StatusCode::FAILURE;
554 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
ContextID_t slot() const
Definition: EventContext.h:50
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:49
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:209
StatusCode HLTEventLoopMgr::executeEvent ( void *  par)
override

implementation of IEventProcessor::executeEvent(void* par)

Definition at line 396 of file HLTEventLoopMgr.cpp.

397 {
398  // Leave the interface intact and swallow this C trick.
399  int& createdEvts = *reinterpret_cast<int*>( createdEvts_IntPtr );
400 
401  auto evtContext = std::make_unique<EventContext>();
402  evtContext->set( createdEvts, m_whiteboard->allocateStore( createdEvts ) );
403  m_algExecStateSvc->reset( *evtContext );
404 
405  StatusCode sc = m_whiteboard->selectStore( evtContext->slot() );
406  if ( sc.isFailure() ) {
407  fatal() << "Slot " << evtContext->slot() << " could not be selected for the WhiteBoard\n"
408  << "Impossible to create event context" << endmsg;
409  return StatusCode::FAILURE;
410  }
411 
412  StatusCode declEvtRootSc = declareEventRootAddress();
413  if ( declEvtRootSc.isFailure() ) { // We ran out of events!
414  createdEvts = -1; // Set created event to a negative value: we finished!
415  return StatusCode::SUCCESS;
416  }
417 
418  // Now add event to the scheduler
419  if ( msgLevel( MSG::DEBUG ) )
420  debug() << "Event " << evtContext->evt() << " submitting in slot " << evtContext->slot() << endmsg;
421 
422  // Event processing slot forced to be the same as the wb slot
423  tbb::task* task = new ( tbb::task::allocate_root() )
425  tbb::task::enqueue( *task );
426 
427  if ( msgLevel( MSG::DEBUG ) )
428  debug() << "All algorithms were submitted on event " << evtContext->evt() << " in slot " << evtContext->slot()
429  << endmsg; // FIXME: use after std::move..
430 
431  createdEvts++;
432  return StatusCode::SUCCESS;
433 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
bool isFailure() const
Definition: StatusCode.h:139
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:51
IHiveWhiteBoard * m_whiteboard
Reference to the Whiteboard.
T move(T...args)
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
virtual void reset(const EventContext &ctx)=0
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
virtual size_t allocateStore(int evtnumber)=0
Allocate a store partition for new event.
std::vector< Algorithm * > m_algos
Vector of algorithms to run for every event.
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:291
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
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 43 of file HLTEventLoopMgr.h.

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

implementation of IService::finalize

Definition at line 361 of file HLTEventLoopMgr.cpp.

362 {
363  StatusCode sc;
364  // Save Histograms Now
365  if ( m_histoPersSvc ) {
366  HistogramAgent agent;
367  sc = m_histoDataMgrSvc->traverseTree( &agent );
368  if ( sc.isSuccess() ) {
369  const IDataSelector& objects = agent.selectedObjects();
370  // skip /stat entry!
371  sc = std::accumulate( begin( objects ), end( objects ), sc, [&]( StatusCode s, const auto& i ) {
372  IOpaqueAddress* pAddr = nullptr;
373  StatusCode iret = m_histoPersSvc->createRep( i, pAddr );
374  if ( iret.isSuccess() ) i->registry()->setAddress( pAddr );
375  return s.isFailure() ? s : iret;
376  } );
377  sc = std::accumulate( begin( objects ), end( objects ), sc, [&]( StatusCode s, const auto& i ) {
378  IRegistry* reg = i->registry();
379  StatusCode iret = m_histoPersSvc->fillRepRefs( reg->address(), i );
380  return s.isFailure() ? s : iret;
381  } );
382  if ( sc.isSuccess() ) {
383  info() << "Histograms converted successfully according to request." << endmsg;
384  } else {
385  error() << "Error while saving Histograms." << endmsg;
386  }
387  } else {
388  error() << "Error while traversing Histogram data store" << endmsg;
389  }
390  }
391 
393  return sc.isFailure() ? sc2.ignore(), sc : sc2;
394 }
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:173
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
bool isSuccess() const
Definition: StatusCode.h:287
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:139
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
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:165
string s
Definition: gaudirun.py:253
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:209
StatusCode HLTEventLoopMgr::initialize ( )
override

implementation of IService::initialize

Definition at line 144 of file HLTEventLoopMgr.cpp.

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

446 {
447  // Calculate runtime
449 
450  // Reset the application return code.
451  auto appmgr = serviceLocator()->as<IProperty>();
453 
454  // create m_evtSelContext used internally in executeEvent and more
455  // precisely in declareEventRootAddress. Cannot be passed through the interface
456  // without breaking other schedulers
458  if ( !sc.isSuccess() ) {
459  fatal() << "Can not create the event selector Context." << endmsg;
460  return sc;
461  }
462 
463  // create th tbb thread pool
464  tbb::task_scheduler_init tbbSchedInit( m_threadPoolSize.value() + 1 );
465 
466  int createdEvts = 0;
467  // Run the first event before spilling more than one
468  bool newEvtAllowed = false;
469 
470  info() << "Starting loop on events" << endmsg;
471  auto start_time = Clock::now();
472  while ( maxevt < 0 || m_finishedEvt < (unsigned int)maxevt ) {
473  // if the created events did not reach maxevt, create an event
474  if ( !( ( newEvtAllowed || createdEvts == 0 ) && // Launch the first event alone
475  // The events are not finished with an unlimited number of events
476  createdEvts >= 0 &&
477  // The events are not finished with a limited number of events
478  ( createdEvts < maxevt || maxevt < 0 ) &&
479  // There are still free slots in the whiteboard
480  m_whiteboard->freeSlots() > 0 ) ) {
481 
483  using namespace std::chrono_literals;
484  m_createEventCond.wait_for( lock, 1ms, [this, newEvtAllowed, createdEvts, maxevt] {
485  return ( newEvtAllowed || createdEvts == 0 ) && // Launch the first event alone
486  // The events are not finished with an unlimited number of events
487  createdEvts >= 0 &&
488  // The events are not finished with a limited number of events
489  ( createdEvts < maxevt || maxevt < 0 ) &&
490  // There are still free slots in the whiteboard
491  this->m_whiteboard->freeSlots() > 0;
492  } );
493  continue;
494  }
495  if ( 1 == createdEvts ) // reset counter to count from event 1
496  start_time = Clock::now();
497 
498  // TODO can we adapt the interface of executeEvent for a nicer solution?
500  sc = executeEvent( &createdEvts );
501  if ( !sc.isSuccess() ) return StatusCode::FAILURE; // else we have an success --> exit loop
502  newEvtAllowed = true;
503  } // end main loop on finished events
504  auto end_time = Clock::now();
505 
506  delete m_evtSelContext;
507  m_evtSelContext = nullptr;
508 
509  constexpr double oneOver1024 = 1. / 1024.;
510  info() << "---> Loop Finished (skipping 1st evt) - "
511  << " WSS " << System::mappedMemory( System::MemoryUnit::kByte ) * oneOver1024 << " total time "
512  << std::chrono::duration_cast<std::chrono::milliseconds>( end_time - start_time ).count() << " ms" << endmsg;
513  return StatusCode::SUCCESS;
514 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
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:287
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:109
constexpr static const auto RECOVERABLE
Definition: StatusCode.h:89
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
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:51
IHiveWhiteBoard * m_whiteboard
Reference to the Whiteboard.
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
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:204
Gaudi::Property< int > m_threadPoolSize
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:165
IEvtSelector * m_evtSelector
Reference to the Event Selector.
std::atomic< unsigned int > m_finishedEvt
atomic count of the number of finished events
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:276
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
constexpr int Success
Definition: AppReturnCode.h:18
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:291
constexpr double ms
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
void HLTEventLoopMgr::promoteToExecuted ( std::unique_ptr< EventContext eventContext) const
private

Definition at line 556 of file HLTEventLoopMgr.cpp.

557 {
558  // Check if the execution failed
559  if ( m_algExecStateSvc->eventStatus( *eventContext ) != EventStatus::Success )
560  eventFailed( eventContext.get() ).ignore();
561  int si = eventContext->slot();
562 
563  // if ( msgLevel( MSG::DEBUG ) )
564  // debug() << "Event " << eventContext->evt() << " executed in slot " << si << "." << endmsg;
565 
566  // Schedule the cleanup of the event
567  if ( m_algExecStateSvc->eventStatus( *eventContext ) == EventStatus::Success ) {
568  if ( msgLevel( MSG::DEBUG ) )
569  debug() << "Event " << eventContext->evt() << " finished (slot " << si << ")." << endmsg;
570  } else {
571  fatal() << "Failed event detected on " << *eventContext << endmsg;
572  }
573 
574  debug() << "Clearing slot " << si << " (event " << eventContext->evt() << ") of the whiteboard" << endmsg;
575 
576  StatusCode sc = m_whiteboard->clearStore( si );
577  if ( !sc.isSuccess() ) warning() << "Clear of Event data store failed" << endmsg;
578  sc = m_whiteboard->freeStore( si );
579  if ( !sc.isSuccess() ) error() << "Whiteboard slot " << eventContext->slot() << " could not be properly cleared";
580  ++m_finishedEvt;
582 }
ContextID_t slot() const
Definition: EventContext.h:50
bool isSuccess() const
Definition: StatusCode.h:287
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:49
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:51
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:209
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 34 of file HLTEventLoopMgr.h.

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

implementation of IEventProcessor::stopRun()

Definition at line 435 of file HLTEventLoopMgr.cpp.

436 {
437  // Set the application return code
438  auto appmgr = serviceLocator()->as<IProperty>();
440  error() << "Could not set return code of the application (" << Gaudi::ReturnCode::ScheduledStop << ")" << endmsg;
441  }
442  return StatusCode::SUCCESS;
443 }
SmartIF< IFace > as()
Definition: ISvcLocator.h:109
bool isFailure() const
Definition: StatusCode.h:139
constexpr int ScheduledStop
Definition: AppReturnCode.h:27
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:51
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
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:291
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209

Member Data Documentation

Definition at line 53 of file HLTEventLoopMgr.h.

IAlgExecStateSvc* HLTEventLoopMgr::m_algExecStateSvc = nullptr
private

Reference to the AlgExecStateSvc.

Definition at line 77 of file HLTEventLoopMgr.h.

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

Vector of algorithms to run for every event.

Definition at line 90 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 82 of file HLTEventLoopMgr.h.

std::mutex HLTEventLoopMgr::m_createEventMutex
private

mutex assoiciated with m_createEventCond condition variable

Definition at line 84 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 62 of file HLTEventLoopMgr.h.

IDataManagerSvc* HLTEventLoopMgr::m_evtDataMgrSvc = nullptr
private

Reference to the Event Data Service's IDataManagerSvc interface.

Definition at line 67 of file HLTEventLoopMgr.h.

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

Definition at line 59 of file HLTEventLoopMgr.h.

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

event selector context

Definition at line 87 of file HLTEventLoopMgr.h.

IEvtSelector* HLTEventLoopMgr::m_evtSelector = nullptr
private

Reference to the Event Selector.

Definition at line 69 of file HLTEventLoopMgr.h.

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

atomic count of the number of finished events

Definition at line 80 of file HLTEventLoopMgr.h.

IDataManagerSvc* HLTEventLoopMgr::m_histoDataMgrSvc = nullptr
private

Reference to the Histogram Data Service.

Definition at line 71 of file HLTEventLoopMgr.h.

IConversionSvc* HLTEventLoopMgr::m_histoPersSvc = nullptr
private

Reference to the Histogram Persistency Service.

Definition at line 73 of file HLTEventLoopMgr.h.

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

Definition at line 58 of file HLTEventLoopMgr.h.

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

Definition at line 60 of file HLTEventLoopMgr.h.

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

Definition at line 64 of file HLTEventLoopMgr.h.

IHiveWhiteBoard* HLTEventLoopMgr::m_whiteboard = nullptr
private

Reference to the Whiteboard.

Definition at line 75 of file HLTEventLoopMgr.h.

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

Definition at line 61 of file HLTEventLoopMgr.h.


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