The Gaudi Framework  v30r3 (a5ef0a68)
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
 
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 500 of file HLTEventLoopMgr.cpp.

501 {
502  IOpaqueAddress* pAddr = nullptr;
504  if ( sc.isSuccess() ) {
505  // Create root address and assign address to data service
507  if ( !sc.isSuccess() ) {
509  if ( sc.isSuccess() ) {
511  if ( !sc.isSuccess() ) warning() << "Error creating IOpaqueAddress." << endmsg;
512  }
513  }
514  }
515  if ( !sc.isSuccess() ) {
516  info() << "No more events in event selection " << endmsg;
517  return StatusCode::FAILURE;
518  }
519  sc = m_evtDataMgrSvc->setRoot( "/Event", pAddr );
520  if ( !sc.isSuccess() ) {
521  warning() << "Error declaring event root address." << endmsg;
522  }
523  return StatusCode::SUCCESS;
524 }
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 531 of file HLTEventLoopMgr.cpp.

532 {
533  fatal() << "*** Event " << eventContext->evt() << " on slot " << eventContext->slot() << " failed! ***" << endmsg;
534  std::ostringstream ost;
535  m_algExecStateSvc->dump( ost, *eventContext );
536  info() << "Dumping Alg Exec State for slot " << eventContext->slot() << ":\n" << ost.str() << endmsg;
537  return StatusCode::FAILURE;
538 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
ContextID_t slot() const
Definition: EventContext.h:40
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:39
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 384 of file HLTEventLoopMgr.cpp.

385 {
386  // Leave the interface intact and swallow this C trick.
387  int& createdEvts = *reinterpret_cast<int*>( createdEvts_IntPtr );
388 
389  auto evtContext = std::make_unique<EventContext>();
390  evtContext->set( createdEvts, m_whiteboard->allocateStore( createdEvts ) );
391  m_algExecStateSvc->reset( *evtContext );
392 
393  StatusCode sc = m_whiteboard->selectStore( evtContext->slot() );
394  if ( sc.isFailure() ) {
395  fatal() << "Slot " << evtContext->slot() << " could not be selected for the WhiteBoard\n"
396  << "Impossible to create event context" << endmsg;
397  return StatusCode::FAILURE;
398  }
399 
400  StatusCode declEvtRootSc = declareEventRootAddress();
401  if ( declEvtRootSc.isFailure() ) { // We ran out of events!
402  createdEvts = -1; // Set created event to a negative value: we finished!
403  return StatusCode::SUCCESS;
404  }
405 
406  // Now add event to the scheduler
407  if ( msgLevel( MSG::DEBUG ) )
408  debug() << "Event " << evtContext->evt() << " submitting in slot " << evtContext->slot() << endmsg;
409 
410  // Event processing slot forced to be the same as the wb slot
411  tbb::task* task = new ( tbb::task::allocate_root() )
413  tbb::task::enqueue( *task );
414 
415  createdEvts++;
416  return StatusCode::SUCCESS;
417 }
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 349 of file HLTEventLoopMgr.cpp.

350 {
351  StatusCode sc;
352  // Save Histograms Now
353  if ( m_histoPersSvc ) {
354  HistogramAgent agent;
355  sc = m_histoDataMgrSvc->traverseTree( &agent );
356  if ( sc.isSuccess() ) {
357  const IDataSelector& objects = agent.selectedObjects();
358  // skip /stat entry!
359  sc = std::accumulate( begin( objects ), end( objects ), sc, [&]( StatusCode s, const auto& i ) {
360  IOpaqueAddress* pAddr = nullptr;
361  StatusCode iret = m_histoPersSvc->createRep( i, pAddr );
362  if ( iret.isSuccess() ) i->registry()->setAddress( pAddr );
363  return s.isFailure() ? s : iret;
364  } );
365  sc = std::accumulate( begin( objects ), end( objects ), sc, [&]( StatusCode s, const auto& i ) {
366  IRegistry* reg = i->registry();
367  StatusCode iret = m_histoPersSvc->fillRepRefs( reg->address(), i );
368  return s.isFailure() ? s : iret;
369  } );
370  if ( sc.isSuccess() ) {
371  info() << "Histograms converted successfully according to request." << endmsg;
372  } else {
373  error() << "Error while saving Histograms." << endmsg;
374  }
375  } else {
376  error() << "Error while traversing Histogram data store" << endmsg;
377  }
378  }
379 
381  return sc.isFailure() ? sc2.ignore(), sc : sc2;
382 }
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 refereces to DataObjects in a transient store tha...
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
IDataSelector * selectedObjects()
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 143 of file HLTEventLoopMgr.cpp.

144 {
146  if ( !sc.isSuccess() ) {
147  error() << "Failed to initialize Service Base class." << endmsg;
148  return StatusCode::FAILURE;
149  }
150  // Setup access to event data services
151  m_evtDataMgrSvc = serviceLocator()->service<IDataManagerSvc>( "EventDataSvc" );
152  if ( !m_evtDataMgrSvc ) {
153  fatal() << "Error retrieving EventDataSvc interface IDataManagerSvc." << endmsg;
154  return StatusCode::FAILURE;
155  }
156  m_whiteboard = serviceLocator()->service<IHiveWhiteBoard>( "EventDataSvc" );
157  if ( !m_whiteboard ) {
158  fatal() << "Error retrieving EventDataSvc interface IHiveWhiteBoard." << endmsg;
159  return StatusCode::FAILURE;
160  }
161  // Obtain the IProperty of the ApplicationMgr
162  IProperty* appMgrProperty = serviceLocator()->service<IProperty>( "ApplicationMgr" );
163  if ( !appMgrProperty ) {
164  fatal() << "IProperty interface not found in ApplicationMgr." << endmsg;
165  return StatusCode::FAILURE;
166  }
167  // We do not expect a Event Selector necessarily being declared
168  setProperty( appMgrProperty->getProperty( "EvtSel" ) ).ignore();
169 
170  if ( m_evtsel != "NONE" || m_evtsel.length() == 0 ) {
171  m_evtSelector = serviceLocator()->service<IEvtSelector>( "EventSelector" );
172  } else {
173  m_evtSelector = nullptr;
174  warning() << "Unable to locate service \"EventSelector\" " << endmsg;
175  warning() << "No events will be processed from external input." << endmsg;
176  }
177 
178  // Setup access to histogramming services
179  m_histoDataMgrSvc = serviceLocator()->service<IDataManagerSvc>( "HistogramDataSvc" );
180  if ( !m_histoDataMgrSvc ) {
181  fatal() << "Error retrieving HistogramDataSvc." << endmsg;
182  return sc;
183  }
184  // Setup histogram persistency
185  m_histoPersSvc = serviceLocator()->service<IConversionSvc>( "HistogramPersistencySvc" );
186  if ( !m_histoPersSvc ) {
187  warning() << "Histograms cannot not be saved - though required." << endmsg;
188  return sc;
189  }
190 
191  m_algExecStateSvc = serviceLocator()->service<IAlgExecStateSvc>( "AlgExecStateSvc" );
192  if ( !m_algExecStateSvc ) {
193  fatal() << "Error retrieving AlgExecStateSvc" << endmsg;
194  return StatusCode::FAILURE;
195  }
196 
197  m_algExecStateSvc = serviceLocator()->service<IAlgExecStateSvc>( "AlgExecStateSvc" );
198  if ( !m_algExecStateSvc ) {
199  fatal() << "Error retrieving AlgExecStateSvc" << endmsg;
200  return StatusCode::FAILURE;
201  }
202 
203  // Get the list of algorithms
204  IAlgResourcePool* algResourcePool = serviceLocator()->service<IAlgResourcePool>( "AlgResourcePool" );
205  if ( !algResourcePool ) {
206  fatal() << "Error retrieving AlgoResourcePool" << endmsg;
207  return StatusCode::FAILURE;
208  }
209  for ( auto alg : algResourcePool->getFlatAlgList() ) {
210  Algorithm* algoPtr = dynamic_cast<Algorithm*>( alg );
211  if ( !algoPtr ) {
212  fatal() << "Could not convert IAlgorithm into Algorithm: this will result in a crash." << endmsg;
213  }
214  m_algos.push_back( algoPtr );
215  }
216  /* Dependencies
217  1) Look for handles in algo, if none
218  2) Assume none are required
219  */
220  DataObjIDColl globalInp, globalOutp;
221 
222  boost::optional<std::ofstream> dot{boost::in_place_init_if, !m_dotfile.empty(), m_dotfile.value()};
223 
224  if ( dot ) {
225  *dot << "digraph G {\n";
226  for ( auto* a : m_algos ) {
227  bool is_consumer = a->outputDataObjs().empty();
228  *dot << '\"' << a->name() << "\" [shape=box" << ( is_consumer ? ",style=filled" : "" ) << "];\n";
229  }
230  }
231 
232  // figure out all outputs
234  for ( Algorithm* algoPtr : m_algos ) {
235  for ( auto id : algoPtr->outputDataObjs() ) {
236  auto r = globalOutp.insert( id );
237  producers[id] = algoPtr;
238  if ( !r.second ) {
239  warning() << "multiple algorithms declare " << id << " 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 ( 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() ) {
311  ost << "\n * " << i.first->name();
312  }
313  }
314  }
315  fatal() << "The following unmet INPUT dependencies were found:" << ost.str() << endmsg;
316  return StatusCode::FAILURE;
317  } else {
318  info() << "No unmet INPUT data dependencies were found" << endmsg;
319  }
320 
321  // Clearly inform about the level of concurrency
322  info() << "Concurrency level information:" << endmsg;
323  info() << " o Number of events slots: " << m_whiteboard->getNumberOfStores() << endmsg;
324  info() << " o TBB thread pool size: " << m_threadPoolSize << endmsg;
325 
326  // rework the flat algo list to respect data dependencies
327  auto start = m_algos.begin();
328  auto end = m_algos.end();
329  auto current =
330  std::partition( start, end, [&algo2Deps]( const Algorithm* algo ) { return algo2Deps[algo]->empty(); } );
331 
332  // Repeatedly put in front algos for which input are already fullfilled
333  while ( current != end ) {
334  current = std::partition( current, end, [start, current, &producers, &algo2Deps]( const Algorithm* algo ) {
335  return std::none_of( algo2Deps[algo]->begin(), algo2Deps[algo]->end(),
336  [start, current, &producers]( const DataObjID& id ) {
337  return std::find( start, current, producers[id] ) == current;
338  } );
339  } );
340  }
341 
342  // Fill the containers to convert algo names to index
343  debug() << "Order of algo execution :" << endmsg;
344  for ( const Algorithm* algo : m_algos ) debug() << " . " << algo->name() << endmsg;
345 
346  return sc;
347 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
StatusCode initialize() override
Definition: Service.cpp:63
T empty(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:765
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
The Event Selector Interface.
Definition: IEvtSelector.h:18
const DataObjIDColl & outputDataObjs() const override
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.
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 DataObjIDColl & inputDataObjs() const override
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:78
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 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.
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 429 of file HLTEventLoopMgr.cpp.

430 {
431  // Calculate runtime
433 
434  // Reset the application return code.
435  auto appmgr = serviceLocator()->as<IProperty>();
437 
438  // create m_evtSelContext used internally in executeEvent and more
439  // precisely in declareEventRootAddress. Cannot be passed through the interface
440  // without breaking other schedulers
442  if ( !sc.isSuccess() ) {
443  fatal() << "Can not create the event selector Context." << endmsg;
444  return sc;
445  }
446 
447  // create th tbb thread pool
448  tbb::task_scheduler_init tbbSchedInit( m_threadPoolSize.value() + 1 );
449 
450  int createdEvts = 0;
451  // Run the first event before spilling more than one
452  bool newEvtAllowed = false;
453 
454  info() << "Starting loop on events" << endmsg;
455  auto start_time = Clock::now();
456  while ( maxevt < 0 || m_finishedEvt < (unsigned int)maxevt ) {
457  // if the created events did not reach maxevt, create an event
458  if ( !( ( newEvtAllowed || createdEvts == 0 ) && // Launch the first event alone
459  // The events are not finished with an unlimited number of events
460  createdEvts >= 0 &&
461  // The events are not finished with a limited number of events
462  ( createdEvts < maxevt || maxevt < 0 ) &&
463  // There are still free slots in the whiteboard
464  m_whiteboard->freeSlots() > 0 ) ) {
465 
467  using namespace std::chrono_literals;
468  m_createEventCond.wait_for( lock, 1ms, [this, newEvtAllowed, createdEvts, maxevt] {
469  return ( newEvtAllowed || 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 }
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 540 of file HLTEventLoopMgr.cpp.

541 {
542  // Check if the execution failed
543  if ( m_algExecStateSvc->eventStatus( *eventContext ) != EventStatus::Success )
544  eventFailed( eventContext.get() ).ignore();
545  int si = eventContext->slot();
546 
547  // if ( msgLevel( MSG::DEBUG ) )
548  // debug() << "Event " << eventContext->evt() << " executed in slot " << si << "." << endmsg;
549 
550  // Schedule the cleanup of the event
551  if ( m_algExecStateSvc->eventStatus( *eventContext ) == EventStatus::Success ) {
552  if ( msgLevel( MSG::DEBUG ) )
553  debug() << "Event " << eventContext->evt() << " finished (slot " << si << ")." << endmsg;
554  } else {
555  fatal() << "Failed event detected on " << *eventContext << endmsg;
556  }
557 
558  debug() << "Clearing slot " << si << " (event " << eventContext->evt() << ") of the whiteboard" << endmsg;
559 
560  StatusCode sc = m_whiteboard->clearStore( si );
561  if ( !sc.isSuccess() ) warning() << "Clear of Event data store failed" << endmsg;
562  sc = m_whiteboard->freeStore( si );
563  if ( !sc.isSuccess() ) error() << "Whiteboard slot " << eventContext->slot() << " could not be properly cleared";
564  ++m_finishedEvt;
566 }
ContextID_t slot() const
Definition: EventContext.h:40
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:39
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 419 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 }
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 76 of file HLTEventLoopMgr.h.

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

Vector of algorithms to run for every event.

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

std::mutex HLTEventLoopMgr::m_createEventMutex
private

mutex assoiciated with m_createEventCond condition variable

Definition at line 83 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 66 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 86 of file HLTEventLoopMgr.h.

IEvtSelector* HLTEventLoopMgr::m_evtSelector = nullptr
private

Reference to the Event Selector.

Definition at line 68 of file HLTEventLoopMgr.h.

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

atomic count of the number of finished events

Definition at line 79 of file HLTEventLoopMgr.h.

IDataManagerSvc* HLTEventLoopMgr::m_histoDataMgrSvc = nullptr
private

Reference to the Histogram Data Service.

Definition at line 70 of file HLTEventLoopMgr.h.

IConversionSvc* HLTEventLoopMgr::m_histoPersSvc = nullptr
private

Reference to the Histogram Persistency Service.

Definition at line 72 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.

IHiveWhiteBoard* HLTEventLoopMgr::m_whiteboard = nullptr
private

Reference to the Whiteboard.

Definition at line 74 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: