5#include <GaudiKernel/DataIncident.h>
8#define ATHENASERVICES_ATHENAHIVEEVENTLOOPMGR_CPP
29#include "GaudiKernel/IAlgorithm.h"
30#include "GaudiKernel/SmartIF.h"
31#include "GaudiKernel/Incident.h"
32#include "GaudiKernel/DataObject.h"
33#include "GaudiKernel/IIncidentSvc.h"
34#include "GaudiKernel/IEvtSelector.h"
35#include "GaudiKernel/IDataManagerSvc.h"
36#include "GaudiKernel/IDataProviderSvc.h"
37#include "GaudiKernel/IConversionSvc.h"
38#include "GaudiKernel/GaudiException.h"
39#include "GaudiKernel/AppReturnCode.h"
40#include "GaudiKernel/MsgStream.h"
41#include "Gaudi/Property.h"
42#include "GaudiKernel/EventIDBase.h"
43#include "GaudiKernel/ThreadLocalContext.h"
47#include "EventInfo/EventInfo.h"
55#include <GaudiKernel/IScheduler.h>
57#include "tbb/tick_count.h"
66 : base_class(nam, svcLoc),
79 "Name of Event Selector to use. If empty string (default) "
80 "take value from ApplicationMgr");
82 "Histogram persistency technology to use: ROOT, HBOOK, NONE. "
83 "By default (empty string) get property value from "
86 "histogram write/update interval");
88 "Controls behaviour of event loop depending on return code of"
89 " Algorithms. 0: all non-SUCCESSes terminate job. "
90 "1: RECOVERABLE skips to next event, FAILURE terminates job "
91 "(DEFAULT). 2: RECOVERABLE and FAILURE skip to next events");
93 "Print event heartbeat printouts every m_eventPrintoutInterval events");
94 declareProperty(
"PreSelectTools",
m_tools,
"AlgTools for event pre-selection")->
98 "Name of the scheduler to be used");
101 "Name of the Whiteboard to be used");
106 "ServiceHandle for EvtIdModifierSvc");
108 declareProperty(
"FakeLumiBlockInterval",
m_flmbi = 0,
109 "Event interval at which to increment lumiBlock# when "
110 "creating events without an EventSelector. Zero means "
111 "don't increment it");
113 "timestamp interval between events when creating Events "
114 "without an EventSelector");
116 "Require valid input attribute list to be present");
118 "In case of DoubleEventSelector use event number from secondary input");
121 "process all of first event before scheduling any more");
143 StatusCode
sc = MinimalEventLoopMgr::initialize();
144 if ( !
sc.isSuccess() )
146 ATH_MSG_ERROR (
"Failed to initialize base class MinimalEventLoopMgr" );
157 return StatusCode::FAILURE;
162 ATH_MSG_FATAL (
"Error retrieving SchedulerSvc interface ISchedulerSvc." );
163 return StatusCode::FAILURE;
169 return StatusCode::FAILURE;
172 m_aess = serviceLocator()->service(
"AlgExecStateSvc");
175 return StatusCode::FAILURE;
179 if( !
sc.isSuccess() )
181 ATH_MSG_FATAL (
"Error retrieving pointer to StoreGateSvc" );
190 if( !
sc.isSuccess() )
199 SmartIF<IProperty> prpMgr(serviceLocator());
200 if ( !prpMgr.isValid() )
202 ATH_MSG_FATAL (
"IProperty interface not found in ApplicationMgr." );
203 return StatusCode::FAILURE;
211 if( !
sc.isSuccess() )
218 if ( histPersName.length() == 0 )
223 if ( histPersName !=
"NONE" ) {
228 SmartIF<IProperty> histSvc;
229 if (histPersName ==
"ROOT") {
230 histSvc = serviceLocator()->service(
"RootHistSvc");
231 }
else if ( histPersName ==
"HBOOK" ) {
232 histSvc = serviceLocator()->service(
"HbookHistSvc");
236 ATH_MSG_ERROR (
"could not locate actual Histogram persistency service" );
238 const Gaudi::Details::PropertyBase &prop = histSvc->getProperty(
"OutputFile");
241 const StringProperty &sprop =
dynamic_cast<const StringProperty&
>( prop );
244 ATH_MSG_VERBOSE (
"could not dcast OutputFile property to a StringProperty."
245 " Need to fix Gaudi." );
246 val = prop.toString();
250 val !=
"UndefinedROOTOutputFileName" &&
251 val !=
"UndefinedHbookOutputFileName" ) {
264 ATH_MSG_DEBUG (
"EventID modifier Service not set. No run number, ... overrides will be applied." );
267 ATH_MSG_INFO (
"Could not find EventID modifier Service. No run number, ... overrides will be applied." );
273 const std::string& selName(
m_evtsel.value());
280 if( !selName.empty() && selName !=
"NONE") {
281 SmartIF<IEvtSelector> theEvtSel{serviceLocator()->service( selName )};
288 ATH_MSG_FATAL (
"Can not create the event selector Context." );
289 return StatusCode::FAILURE;
291 if (msgLevel(MSG::INFO)) {
292 SmartIF<INamedInterface> named(theEvtSel);
294 ATH_MSG_INFO (
"Setup EventSelector service {}", named->name( ) );
297 }
else if (
sc.isFailure()) {
298 ATH_MSG_FATAL (
"No valid event selector called {}", selName );
299 return StatusCode::FAILURE;
337 unsigned int toolCtr = 0;
338 for ( ; firstTool != lastTool; ++firstTool )
358 StatusCode
sc = MinimalEventLoopMgr::finalize();
392 unsigned int toolCtr = 0;
393 ATH_MSG_INFO (
"Summary of AthenaEvtLoopPreSelectTool invocation: (invoked/success/failure)" );
394 ATH_MSG_INFO (
"-----------------------------------------------------" );
396 for ( ; firstTool != lastTool; ++firstTool ) {
399 (*firstTool)->name(),
406 return (
sc.isFailure() || sc2.isFailure() ) ? StatusCode::FAILURE :
416 StatusCode
sc (StatusCode::SUCCESS);
419 std::vector<DataObject*> objects;
421 DataObject* obj = reg->object();
422 if ( !obj || obj->clID() == CLID_StatisticsFile )
return false;
423 objects.push_back( obj );
427 if ( !
sc.isSuccess() ) {
428 ATH_MSG_ERROR (
"Error while traversing Histogram data store" );
432 if ( objects.size() > 0) {
435 if (
m_nevt == 1 || force ||
436 (writeInterval != 0 &&
m_nevt%writeInterval == 0) ) {
439 sc = std::accumulate( begin( objects ), end( objects ),
sc, [&]( StatusCode isc,
auto& i ) {
440 IOpaqueAddress* pAddr =
nullptr;
442 if ( iret.isFailure() )
return iret;
443 i->registry()->setAddress( pAddr );
446 sc = std::accumulate( begin( objects ), end( objects ),
sc, [&]( StatusCode isc,
auto& i ) {
447 IRegistry* reg = i->registry();
448 StatusCode iret =
m_histoPersSvc->fillRepRefs( reg->address(), i );
449 return iret.isFailure() ? iret : isc;
451 if ( !
sc.isSuccess() ) {
456 if (force || (writeInterval != 0 &&
m_nevt%writeInterval == 0) ) {
472 return StatusCode::SUCCESS;
480 return StatusCode::SUCCESS;
492 ATH_MSG_ALWAYS (
"A stopRun was requested by an incidentListener. "
493 "Do not process this event." );
495 return (StatusCode::SUCCESS);
501 Gaudi::Hive::setCurrentContext ( ctx );
504 if (declEvtRootSc == 0 ) {
506 return StatusCode::SUCCESS;
507 }
else if ( declEvtRootSc == -1) {
509 ATH_MSG_ERROR (
"declareEventRootAddress for context " << ctx <<
" failed" );
510 return StatusCode::FAILURE;
513 EventID::event_number_t evtNumber = ctx.eventID().event_number();
514 unsigned int conditionsRun = ctx.eventID().run_number();
519 if (attr->exists (
"ConditionsRun")) {
520 conditionsRun = (*attr)[
"ConditionsRun"].data<
unsigned int>();
525 Gaudi::Hive::setCurrentContext ( ctx );
528 if (
m_eventStore->record(std::make_unique<EventContext> (ctx),
529 "EventContext").isFailure())
532 return (StatusCode::FAILURE);
552 bool toolsPassed=
true;
557 unsigned int toolCtr=0;
559 tool_store::iterator theTool =
m_tools.begin();
560 tool_store::iterator lastTool =
m_tools.end();
561 while(toolsPassed && theTool!=lastTool )
563 toolsPassed = (*theTool)->passEvent(ctx.eventID());
575 ATH_MSG_INFO (
" ===>>> start processing event #{}, run #{} on slot {}, {} events processed so far <<<===",
579 ATH_MSG_INFO (
" ===>>> start processing event #{}, run #{} on slot {}, {} events read and {} events processed so far <<<===",
595 ctx.evt(), ctx.slot());
599 StatusCode addEventStatus =
m_schedulerSvc->pushNewEvent(
new EventContext{ std::move(ctx) } );
602 if (!addEventStatus.isSuccess()){
603 ATH_MSG_FATAL (
"An event processing slot should be now free in the scheduler, but it appears not to be the case." );
613 Gaudi::Hive::setCurrentContext( EventContext() );
615 return StatusCode::SUCCESS;
626 bool eventfailed =
false;
634 return StatusCode::FAILURE;
637 return StatusCode::SUCCESS;
644 SmartIF<IProperty> appmgr(serviceLocator());
645 if(Gaudi::setAppReturnCode(appmgr, Gaudi::ReturnCode::ScheduledStop,
true).isFailure()) {
646 ATH_MSG_ERROR (
"Could not set return code of the application ({})",
647 Gaudi::ReturnCode::ScheduledStop);
650 return StatusCode::SUCCESS;
664 StatusCode
sc = MinimalEventLoopMgr::stop();
671 for (
size_t islot = 0; islot < nslot; islot++) {
675 Gaudi::Hive::setCurrentContext( EventContext() );
686 if (0 == maxevt)
return StatusCode::SUCCESS;
689 Gaudi::setAppReturnCode(
m_appMgrProperty, Gaudi::ReturnCode::Success,
true).ignore();
700 bool loop_ended=
false;
701 StatusCode
sc(StatusCode::SUCCESS);
706 auto start_time = tbb::tick_count::now();
707 auto secsFromStart = [&start_time]()->
double{
708 return (tbb::tick_count::now()-start_time).seconds();
711 while ( !loop_ended and ( (maxevt < 0) or (finishedEvts < maxevt) ) ){
716 (newEvtAllowed || createdEvts == 0) &&
717 ( (createdEvts < maxevt) or (maxevt<0) ) &&
725 if ( !ctx.valid() ) {
726 sc = StatusCode::FAILURE;
731 if (
sc.isFailure()) {
732 ATH_MSG_ERROR (
"Terminating event processing loop due to errors" );
751 sc = StatusCode::FAILURE;
752 }
else if (
ir == 0) {
755 sc = StatusCode::SUCCESS;
759 newEvtAllowed =
true;
764 ATH_MSG_INFO (
"---> Loop Finished (seconds): {}", secsFromStart() );
781 ATH_MSG_ERROR (
"Seek failed; unsupported by event selector" );
782 return StatusCode::FAILURE;
787 ATH_MSG_FATAL (
"Can not create the event selector Context." );
788 return StatusCode::FAILURE;
794 if (
sc.isSuccess()) {
795 m_incidentSvc->fireIncident(ContextIncident<std::tuple<int, int>>(
796 name(),
"SkipEvents", std::tuple<int, int>(
m_nevt, evt)));
821 ATH_MSG_ERROR (
"Collection size unsupported by event selector" );
827 ATH_MSG_FATAL (
"Can not create the event selector Context." );
842 if(inc.type() ==
"EndAlgorithms") {
847 if( !
sc.isSuccess() ) {
853 if(inc.type()!=
"BeforeFork")
857 ATH_MSG_WARNING (
"Skipping BeforeFork handler. Either no event selector is provided or begin run has already passed" );
869 if(!
sc.isSuccess()) {
873 IOpaqueAddress* addr{
nullptr};
875 if (
sc.isFailure()) {
882 if(!
sc.isSuccess()) {
896 if(!
sc.isSuccess()) {
906 if(!
sc.isSuccess()) {
917 if ( !
sc.isSuccess() ) {
922 if( !
sc.isSuccess() ) {
924 if (
sc.isSuccess() ) {
926 if ( !
sc.isSuccess() ) {
943 StatusCode
sc(StatusCode::SUCCESS);
948 std::unique_ptr<const EventInfo> pEvent{};
955 IOpaqueAddress* addr{};
959 if ( !
sc.isSuccess() ) {
975 if( !
sc.isSuccess() ) {
985 bool consume_modifier_stream =
false;
989 if ( pAttrList !=
nullptr && pAttrList->size() > 6 ) {
991 unsigned int runNumber = (*pAttrList)[
"RunNumber"].data<
unsigned int>();
992 unsigned long long eventNumber = (*pAttrList)[
"EventNumber"].data<
unsigned long long>();
993 unsigned int eventTime = (*pAttrList)[
"EventTime"].data<
unsigned int>();
994 unsigned int eventTimeNS = (*pAttrList)[
"EventTimeNanoSec"].data<
unsigned int>();
995 unsigned int lumiBlock = (*pAttrList)[
"LumiBlockN"].data<
unsigned int>();
996 unsigned int bunchId = (*pAttrList)[
"BunchId"].data<
unsigned int>();
999 consume_modifier_stream =
true;
1002 unsigned long long eventNumberSecondary{};
1003 if ( !(pAttrList->exists(
"hasSecondaryInput") && (*pAttrList)[
"hasSecondaryInput"].data<
bool>()) ) {
1004 ATH_MSG_FATAL (
"Secondary EventNumber requested, but secondary input does not exist!" );
1007 if ( pAttrList->exists(
"EventNumber_secondary") ) {
1008 eventNumberSecondary = (*pAttrList)[
"EventNumber_secondary"].data<
unsigned long long>();
1014 if (pEventSecondary) {
1015 eventNumberSecondary = pEventSecondary->
event_ID()->event_number();
1018 ATH_MSG_FATAL (
"Secondary EventNumber requested, but it does not exist!" );
1022 if (eventNumberSecondary != 0) {
1026 ATH_MSG_INFO (
" ===>>> using secondary event #{} instead of #{} <<<===",
1027 eventNumberSecondary, eventNumber);
1029 eventNumber = eventNumberSecondary;
1033 pEvent = std::make_unique<EventInfo>(
1034 std::make_unique<EventID>(runNumber, eventNumber, eventTime,
1035 eventTimeNS, lumiBlock, bunchId),
1040 ATH_MSG_FATAL (
"Valid input attribute list required but not present!" );
1044 const EventInfo* pEventObserver{pEvent.get()};
1045 if (!pEventObserver) {
1050 if (pEventObserver) {
1051 consume_modifier_stream =
false;
1058 if( !
sc.isSuccess() ) {
1062 consume_modifier_stream =
true;
1065 pEvent = std::make_unique<EventInfo>(
1068 pEventObserver = pEvent.get();
1070 if( !
sc.isSuccess() ) {
1078 consume_modifier_stream);
1085 unsigned int runNmb{1}, evtNmb{
m_nevt + 1};
1092 auto eid = std::make_unique<EventID> (runNmb,evtNmb,
m_timeStamp);
1094 eid->set_lumi_block( runNmb );
1098 pEvent = std::make_unique<EventInfo>(std::move(eid),
1099 std::make_unique<EventType>());
1101 bool consume_modifier_stream =
true;
1112 ATH_MSG_DEBUG (
"recording EventInfo " << *pEvent->event_ID() <<
" in "
1116 if( !
sc.isSuccess() ) {
1133 m_evtIdModSvc->modify_evtid(new_eID, ctx.evt(), consume_modifier_stream);
1134 if (msgLevel(MSG::DEBUG)) {
1135 unsigned int oldrunnr=eID.run_number();
1136 unsigned int oldLB=eID.lumi_block();
1137 unsigned int oldTS=eID.time_stamp();
1138 unsigned int oldTSno=eID.time_stamp_ns_offset();
1139 ATH_MSG_DEBUG (
"modifyEventContext: use evtIdModSvc runnr={} -> {}",
1140 oldrunnr, new_eID.run_number());
1141 ATH_MSG_DEBUG (
"modifyEventContext: use evtIdModSvc LB={} -> {}",
1142 oldLB, new_eID.lumi_block());
1143 ATH_MSG_DEBUG (
"modifyEventContext: use evtIdModSvc TimeStamp={} -> {}",
1144 oldTS, new_eID.time_stamp());
1145 ATH_MSG_DEBUG (
"modifyEventContext: use evtIdModSvc TimeStamp ns Offset={} -> {}",
1146 oldTSno, new_eID.time_stamp_ns_offset());
1148 ctx.setEventID( new_eID );
1153 ctx.setEventID( eID );
1162 if (
sc.isFailure()) {
1163 ATH_MSG_FATAL (
"Slot {} could not be selected for the WhiteBoard",
1165 return EventContext{};
1170 ATH_MSG_DEBUG (
"created EventContext, num: {} in slot: {}",
1171 ctx.evt(), ctx.slot());
1182 StatusCode
sc(StatusCode::SUCCESS);
1185 std::vector<std::unique_ptr<EventContext>> finishedEvtContexts;
1187 EventContext* finishedEvtContext(
nullptr);
1190 ATH_MSG_DEBUG (
"drainScheduler: [{}] Waiting for a context", finishedEvts);
1194 if (
sc.isSuccess()){
1196 ATH_MSG_DEBUG (
"drainScheduler: scheduler not empty: Context "
1197 << finishedEvtContext );
1198 finishedEvtContexts.emplace_back(finishedEvtContext);
1206 while (
m_schedulerSvc->tryPopFinishedEvent(finishedEvtContext).isSuccess()){
1207 finishedEvtContexts.emplace_back(finishedEvtContext);
1212 for (
auto& thisFinishedEvtContext : finishedEvtContexts){
1213 if (!thisFinishedEvtContext) {
1214 ATH_MSG_FATAL (
"Detected nullptr ctxt while clearing WB!");
1219 if (
m_aess->eventStatus(*thisFinishedEvtContext) != EventStatus::Success) {
1221 ATH_MSG_FATAL (
"Failed event detected on " << thisFinishedEvtContext
1222 <<
" w/ fail mode: "
1223 <<
m_aess->eventStatus(*thisFinishedEvtContext) );
1229 EventID::event_number_t n_evt(0);
1231 if (
m_whiteboard->selectStore(thisFinishedEvtContext->slot()).isSuccess()) {
1232 n_run = thisFinishedEvtContext->eventID().run_number();
1233 n_evt = thisFinishedEvtContext->eventID().event_number();
1236 thisFinishedEvtContext->slot() );
1245 Gaudi::Hive::setCurrentContext( *thisFinishedEvtContext );
1246 m_incidentSvc->fireIncident(Incident(
name(), IncidentType::EndProcessing, *thisFinishedEvtContext ));
1248 ATH_MSG_DEBUG(
"Clearing slot {} (event {}) of the whiteboard",
1249 thisFinishedEvtContext->slot(),
1250 thisFinishedEvtContext->evt() );
1252 StatusCode
sc =
clearWBSlot(thisFinishedEvtContext->slot());
1253 if (!
sc.isSuccess()) {
1254 ATH_MSG_ERROR (
"Whiteboard slot {} could not be properly cleared",
1255 thisFinishedEvtContext->slot() );
1267 ATH_MSG_INFO (
" ===>>> done processing event #{}, run #{} on slot {}, {} events processed so far <<<===",
1268 n_evt, n_run, thisFinishedEvtContext->slot(),
m_proc);
1270 ATH_MSG_INFO (
" ===>>> done processing event #{}, run #{} on slot {}, {} events read and {} events processed so far <<<===",
1271 n_evt, n_run, thisFinishedEvtContext->slot(),
m_nev,
m_proc);
1272 std::ofstream outfile(
"eventLoopHeartBeat.txt");
1274 ATH_MSG_ERROR (
" unable to open: eventLoopHeartBeat.txt" );
1278 std::print (outfile,
" done processing event #{}, run # {} events read so far <<<===",
1279 n_evt, n_run,
m_nev);
1285 ATH_MSG_DEBUG (
"drainScheduler thisFinishedEvtContext: " << thisFinishedEvtContext );
1288 return ( fail ? -1 : 1 );
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_ALWAYS(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
The default ATLAS batch event loop manager.
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
Assign a CLID to EventContext.
This class provides a unique identification for each event, in terms of run/event number and/or a tim...
EventID eventIDFromxAOD(const xAOD::EventInfo *xaod)
Create EventID object from xAOD::EventInfo.
EventType eventTypeFromxAOD(const xAOD::EventInfo *xaod)
Create EventType object from xAOD::EventInfo.
This class provides general information about an event.
Abstract interface for seeking within an event stream.
Extension to IEvtSelector to allow for seeking.
void setProperty(columnar::PythonToolHandle &self, const std::string &key, nb::object value)
An AttributeList represents a logical row of attributes in a metadata table.
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
An AttributeList represents a logical row of attributes in a metadata table.
UnsignedIntegerProperty m_eventPrintoutInterval
IEvtSelector * m_evtSelector
Reference to the Event Selector.
virtual StatusCode stopRun() override
implementation of IEventProcessor::stopRun()
virtual void handle(const Incident &inc) override
IIncidentListenet interfaces.
ServiceHandle< IConversionSvc > IConversionSvc_t
virtual StatusCode initialize() override
implementation of IAppMgrUI::initalize
IntegerProperty m_failureMode
SmartIF< IHiveWhiteBoard > m_whiteboard
Reference to the Whiteboard interface.
StatusCode getEventRoot(IOpaqueAddress *&refpAddr)
Create event address using event selector.
IConversionSvc_t m_histoPersSvc
int drainScheduler(int &finishedEvents)
Drain the scheduler from all actions that may be queued.
number_type m_currentRun
current run number
virtual int size() override
Return the size of the collection.
SmartIF< IAlgExecStateSvc > m_aess
Reference to the Algorithm Execution State Svc.
virtual const std::string & name() const override
std::string m_schedulerName
Name of the scheduler to be used.
UnsignedIntegerProperty m_writeInterval
std::string m_whiteboardName
Name of the Whiteboard to be used.
tool_stats m_toolAccept
tool returns StatusCode::SUCCESS counter
virtual StatusCode executeRun(int maxevt) override
implementation of IEventProcessor::executeRun(int maxevt)
tool_store::const_iterator tool_iterator
unsigned int m_nev
events processed
tool_stats m_toolInvoke
tool called counter
IIncidentSvc_t m_incidentSvc
Reference to the incident service.
virtual StatusCode stop() override
implementation of IService::stop
bool m_useSecondaryEventNumber
read event number from secondary input
bool m_requireInputAttributeList
require input attribute list
SmartIF< IProperty > m_appMgrProperty
Property interface of ApplicationMgr.
StoreGateSvc_t m_eventStore
Reference to StoreGateSvc;.
StringProperty m_histPersName
EvtContext * m_evtContext
Gaudi event selector Context (may be used as a cursor by the evt selector).
virtual StatusCode seek(int evt) override
Seek to a given event.
int declareEventRootAddress(EventContext &)
Declare the root address of the event.
AthenaHiveEventLoopMgr()=delete
virtual StatusCode finalize() override
implementation of IAppMgrUI::finalize
virtual StatusCode executeEvent(EventContext &&ctx) override
implementation of IEventProcessor::executeEvent(void* par)
IDataManagerSvc_t m_histoDataMgrSvc
Reference to the Histogram Data Service.
EventContext m_lastEventContext
bool m_scheduledStop
Scheduled stop of event processing.
virtual EventContext createEventContext() override
Create event context.
StatusCode initializeAlgorithms()
Initialize all algorithms and output streams.
virtual ~AthenaHiveEventLoopMgr()
Standard Destructor.
StatusCode clearWBSlot(int evtSlot)
Clear a slot in the WB.
ServiceHandle< Athena::IConditionsCleanerSvc > m_conditionsCleaner
tool_store m_tools
internal tool store
virtual void modifyEventContext(EventContext &ctx, const EventID &eID, bool consume_modifier_stream)
virtual StatusCode writeHistograms(bool force=false)
Dump out histograms as needed.
void setupPreSelectTools(Gaudi::Details::PropertyBase &)
property update handler:sets up the Pre-selection tools
SmartIF< IScheduler > m_schedulerSvc
A shortcut for the scheduler.
virtual int curEvent() const override
Return the current event count.
tool_stats m_toolReject
tool returns StatusCode::FAILURE counter
IEvtIdModifierSvc_t m_evtIdModSvc
SmartIF< IAlgResourcePool > m_algResourcePool
Reference to the Algorithm resource pool.
virtual StatusCode nextEvent(int maxevt) override
implementation of IAppMgrUI::nextEvent. maxevt==0 returns immediately
virtual StatusCode executeAlgorithms()
Run the algorithms for the current event.
unsigned int m_timeStampInt
void resetTimeout(Timeout &instance)
Reset timeout.
static Timeout & instance()
Get reference to Timeout singleton.
void setConditionsRun(EventIDBase::number_type conditionsRun)
This class provides a unique identification for each event, in terms of run/event number and/or a tim...
EventIDBase::number_type number_type
This class provides general information about an event.
EventID * event_ID()
the unique identification of the event.
Abstract interface for seeking for an event selector.
virtual StatusCode seek(IEvtSelector::Context &c, int evtnum) const =0
Seek to a given event number.
virtual int size(IEvtSelector::Context &c) const =0
Return the size of the collection, or -1 if we can't get the size.
uint32_t runNumber() const
The current event's run number.
int ir
counter of the current depth
void setExtendedEventContext(EventContext &ctx, ExtendedEventContext &&ectx)
Move an extended context into a context object.
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
event_number_t eventIndex
EventInfo_v1 EventInfo
Definition of the latest event info version.