The Gaudi Framework  v30r5 (c7afbd0d)
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 513 of file HLTEventLoopMgr.cpp.

514 {
515  IOpaqueAddress* pAddr = nullptr;
517  if ( sc.isSuccess() ) {
518  // Create root address and assign address to data service
520  if ( !sc.isSuccess() ) {
522  if ( sc.isSuccess() ) {
524  if ( !sc.isSuccess() ) warning() << "Error creating IOpaqueAddress." << endmsg;
525  }
526  }
527  }
528  if ( !sc.isSuccess() ) {
529  info() << "No more events in event selection " << endmsg;
530  return StatusCode::FAILURE;
531  }
532  sc = m_evtDataMgrSvc->setRoot( "/Event", pAddr );
533  if ( !sc.isSuccess() ) {
534  warning() << "Error declaring event root address." << endmsg;
535  }
536  return StatusCode::SUCCESS;
537 }
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 544 of file HLTEventLoopMgr.cpp.

545 {
546  fatal() << "*** Event " << eventContext->evt() << " on slot " << eventContext->slot() << " failed! ***" << endmsg;
547  std::ostringstream ost;
548  m_algExecStateSvc->dump( ost, *eventContext );
549  info() << "Dumping Alg Exec State for slot " << eventContext->slot() << ":\n" << ost.str() << endmsg;
550  return StatusCode::FAILURE;
551 }
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 393 of file HLTEventLoopMgr.cpp.

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

359 {
360  StatusCode sc;
361  // Save Histograms Now
362  if ( m_histoPersSvc ) {
363  HistogramAgent agent;
364  sc = m_histoDataMgrSvc->traverseTree( &agent );
365  if ( sc.isSuccess() ) {
366  const IDataSelector& objects = agent.selectedObjects();
367  // skip /stat entry!
368  sc = std::accumulate( begin( objects ), end( objects ), sc, [&]( StatusCode s, const auto& i ) {
369  IOpaqueAddress* pAddr = nullptr;
370  StatusCode iret = m_histoPersSvc->createRep( i, pAddr );
371  if ( iret.isSuccess() ) i->registry()->setAddress( pAddr );
372  return s.isFailure() ? s : iret;
373  } );
374  sc = std::accumulate( begin( objects ), end( objects ), sc, [&]( StatusCode s, const auto& i ) {
375  IRegistry* reg = i->registry();
376  StatusCode iret = m_histoPersSvc->fillRepRefs( reg->address(), i );
377  return s.isFailure() ? s : iret;
378  } );
379  if ( sc.isSuccess() ) {
380  info() << "Histograms converted successfully according to request." << endmsg;
381  } else {
382  error() << "Error while saving Histograms." << endmsg;
383  }
384  } else {
385  error() << "Error while traversing Histogram data store" << endmsg;
386  }
387  }
388 
390  return sc.isFailure() ? sc2.ignore(), sc : sc2;
391 }
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  boost::optional<std::ofstream> dot{boost::in_place_init_if, !m_dotfile.empty(), m_dotfile.value()};
230 
231  if ( dot ) {
232  *dot << "digraph G {\n";
233  for ( auto* a : m_algos ) {
234  bool is_consumer = a->outputDataObjs().empty();
235  *dot << '\"' << a->name() << "\" [shape=box" << ( is_consumer ? ",style=filled" : "" ) << "];\n";
236  }
237  }
238 
239  // figure out all outputs
241  for ( Algorithm* algoPtr : m_algos ) {
242  for ( auto id : algoPtr->outputDataObjs() ) {
243  auto r = globalOutp.insert( id );
244  producers[id] = algoPtr;
245  if ( !r.second ) {
246  warning() << "multiple algorithms declare " << id
247  << " as output! could be a single instance in multiple paths "
248  "though, or control flow may guarantee only one runs...!"
249  << endmsg;
250  }
251  }
252  }
253 
254  // Building and printing Data Dependencies
255  std::vector<DataObjIDColl> algosDependencies;
256  algosDependencies.reserve( m_algos.size() ); // reserve so that pointers into the vector do not get invalidated...
258  info() << "Data Dependencies for Algorithms:";
259 
260  for ( Algorithm* algoPtr : m_algos ) {
261  info() << "\n " << algoPtr->name();
262 
263  DataObjIDColl algoDependencies;
264  if ( !algoPtr->inputDataObjs().empty() || !algoPtr->outputDataObjs().empty() ) {
265  for ( const DataObjID* idp : sortedDataObjIDColl( algoPtr->inputDataObjs() ) ) {
266  DataObjID id = *idp;
267  info() << "\n o INPUT " << id;
268  if ( id.key().find( ":" ) != std::string::npos ) {
269  info() << " contains alternatives which require resolution...\n";
270  auto tokens = boost::tokenizer<boost::char_separator<char>>{id.key(), boost::char_separator<char>{":"}};
271  auto itok = std::find_if( tokens.begin(), tokens.end(), [&]( const std::string& t ) {
272  return globalOutp.find( DataObjID{t} ) != globalOutp.end();
273  } );
274  if ( itok != tokens.end() ) {
275  info() << "found matching output for " << *itok << " -- updating scheduler info\n";
276  id.updateKey( *itok );
277  } else {
278  error() << "failed to find alternate in global output list"
279  << " for id: " << id << " in Alg " << algoPtr->name() << endmsg;
280  }
281  }
282  algoDependencies.insert( id );
283  if ( dot ) *dot << DataObjIDDotRepr{id} << " -> \"" << algoPtr->name() << "\";\n";
284  globalInp.insert( id );
285  }
286  for ( const DataObjID* id : sortedDataObjIDColl( algoPtr->outputDataObjs() ) ) {
287  info() << "\n o OUTPUT " << *id;
288  if ( id->key().find( ":" ) != std::string::npos ) {
289  error() << " in Alg " << algoPtr->name() << " alternatives are NOT allowed for outputs! id: " << *id
290  << endmsg;
291  }
292  if ( dot ) *dot << '\"' << algoPtr->name() << "\" -> " << DataObjIDDotRepr{*id} << ";\n";
293  }
294  } else {
295  info() << "\n none";
296  }
297  algosDependencies.emplace_back( algoDependencies );
298  algo2Deps[algoPtr] = &algosDependencies.back();
299  }
300  if ( dot ) {
301  for ( const auto& t : globalOutp ) {
302  if ( globalInp.find( t ) == globalInp.end() ) *dot << DataObjIDDotRepr{t} << " [style=filled];\n";
303  }
304  *dot << "}\n";
305  }
306  info() << endmsg;
307 
308  // Check if we have unmet global input dependencies
309  DataObjIDColl unmetDep;
310  for ( auto o : globalInp ) {
311  if ( globalOutp.find( o ) == globalOutp.end() ) unmetDep.insert( o );
312  }
313  if ( unmetDep.size() > 0 ) {
314  std::ostringstream ost;
315  for ( const DataObjID* o : sortedDataObjIDColl( unmetDep ) ) {
316  ost << "\n o " << *o << " required by Algorithm: ";
317  for ( const auto& i : algo2Deps ) {
318  if ( i.second->find( *o ) != i.second->end() ) {
319  ost << "\n * " << i.first->name();
320  }
321  }
322  }
323  fatal() << "The following unmet INPUT dependencies were found:" << ost.str() << endmsg;
324  return StatusCode::FAILURE;
325  } else {
326  info() << "No unmet INPUT data dependencies were found" << endmsg;
327  }
328 
329  // rework the flat algo list to respect data dependencies
330  auto start = m_algos.begin();
331  auto end = m_algos.end();
332  auto current =
333  std::partition( start, end, [&algo2Deps]( const Algorithm* algo ) { return algo2Deps[algo]->empty(); } );
334 
335  // Repeatedly put in front algos for which input are already fullfilled
336  while ( current != end ) {
337  current = std::partition( current, end, [start, current, &producers, &algo2Deps]( const Algorithm* algo ) {
338  return std::none_of( algo2Deps[algo]->begin(), algo2Deps[algo]->end(),
339  [start, current, &producers]( const DataObjID& id ) {
340  return std::find( start, current, producers[id] ) == current;
341  } );
342  } );
343  }
344  }
345 
346  // Clearly inform about the level of concurrency
347  info() << "Concurrency level information:" << endmsg;
348  info() << " o Number of events slots: " << m_whiteboard->getNumberOfStores() << endmsg;
349  info() << " o TBB thread pool size: " << m_threadPoolSize << endmsg;
350 
351  // Fill the containers to convert algo names to index
352  debug() << "Order of algo execution :" << endmsg;
353  for ( const Algorithm* algo : m_algos ) debug() << " . " << algo->name() << endmsg;
354 
355  return sc;
356 }
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:759
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.
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 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: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.
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 442 of file HLTEventLoopMgr.cpp.

443 {
444  // Calculate runtime
446 
447  // Reset the application return code.
448  auto appmgr = serviceLocator()->as<IProperty>();
450 
451  // create m_evtSelContext used internally in executeEvent and more
452  // precisely in declareEventRootAddress. Cannot be passed through the interface
453  // without breaking other schedulers
455  if ( !sc.isSuccess() ) {
456  fatal() << "Can not create the event selector Context." << endmsg;
457  return sc;
458  }
459 
460  // create th tbb thread pool
461  tbb::task_scheduler_init tbbSchedInit( m_threadPoolSize.value() + 1 );
462 
463  int createdEvts = 0;
464  // Run the first event before spilling more than one
465  bool newEvtAllowed = false;
466 
467  info() << "Starting loop on events" << endmsg;
468  auto start_time = Clock::now();
469  while ( maxevt < 0 || m_finishedEvt < (unsigned int)maxevt ) {
470  // if the created events did not reach maxevt, create an event
471  if ( !( ( newEvtAllowed || createdEvts == 0 ) && // Launch the first event alone
472  // The events are not finished with an unlimited number of events
473  createdEvts >= 0 &&
474  // The events are not finished with a limited number of events
475  ( createdEvts < maxevt || maxevt < 0 ) &&
476  // There are still free slots in the whiteboard
477  m_whiteboard->freeSlots() > 0 ) ) {
478 
480  using namespace std::chrono_literals;
481  m_createEventCond.wait_for( lock, 1ms, [this, newEvtAllowed, createdEvts, maxevt] {
482  return ( newEvtAllowed || createdEvts == 0 ) && // Launch the first event alone
483  // The events are not finished with an unlimited number of events
484  createdEvts >= 0 &&
485  // The events are not finished with a limited number of events
486  ( createdEvts < maxevt || maxevt < 0 ) &&
487  // There are still free slots in the whiteboard
488  this->m_whiteboard->freeSlots() > 0;
489  } );
490  continue;
491  }
492  if ( 1 == createdEvts ) // reset counter to count from event 1
493  start_time = Clock::now();
494 
495  // TODO can we adapt the interface of executeEvent for a nicer solution?
497  sc = executeEvent( &createdEvts );
498  if ( !sc.isSuccess() ) return StatusCode::FAILURE; // else we have an success --> exit loop
499  newEvtAllowed = true;
500  } // end main loop on finished events
501  auto end_time = Clock::now();
502 
503  delete m_evtSelContext;
504  m_evtSelContext = nullptr;
505 
506  constexpr double oneOver1024 = 1. / 1024.;
507  info() << "---> Loop Finished (skipping 1st evt) - "
508  << " WSS " << System::mappedMemory( System::MemoryUnit::kByte ) * oneOver1024 << " total time "
509  << std::chrono::duration_cast<std::chrono::milliseconds>( end_time - start_time ).count() << " ms" << endmsg;
510  return StatusCode::SUCCESS;
511 }
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 553 of file HLTEventLoopMgr.cpp.

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

433 {
434  // Set the application return code
435  auto appmgr = serviceLocator()->as<IProperty>();
437  error() << "Could not set return code of the application (" << Gaudi::ReturnCode::ScheduledStop << ")" << endmsg;
438  }
439  return StatusCode::SUCCESS;
440 }
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: