ATLAS Offline Software
AthenaEventLoopMgr.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #define GAUDISVC_EVENTLOOPMGR_CPP
6 
8 ATLAS_NO_CHECK_FILE_THREAD_SAFETY; // non-MT EventLoopMgr
9 
10 #include <cassert>
11 #include <ios>
12 #include <iostream>
13 #include <fstream> /* ofstream */
14 #include <iomanip>
15 #include <memory>
16 #include <stdexcept>
17 
18 // Athena includes
26 
27 #include "GaudiKernel/IAlgManager.h"
28 #include "GaudiKernel/IAlgorithm.h"
29 #include "GaudiKernel/SmartIF.h"
30 #include "GaudiKernel/Incident.h"
31 #include "GaudiKernel/DataObject.h"
32 #include "GaudiKernel/IIncidentSvc.h"
33 #include "GaudiKernel/IEvtSelector.h"
34 #include "GaudiKernel/IDataManagerSvc.h"
35 #include "GaudiKernel/IConversionSvc.h"
36 #include "GaudiKernel/GaudiException.h"
37 #include "GaudiKernel/EventContext.h"
38 #include "GaudiKernel/EventIDBase.h"
39 #include "GaudiKernel/ThreadLocalContext.h"
40 #include "GaudiKernel/Algorithm.h"
41 
42 #include "StoreGate/StoreGateSvc.h"
43 
44 #include "EventInfo/EventInfo.h"
45 #include "EventInfo/EventID.h"
46 #include "EventInfo/EventType.h"
47 
48 #include "xAODEventInfo/EventInfo.h"
53 
54 #include "ClearStorePolicy.h"
55 
56 #include "AthenaEventLoopMgr.h"
58 
59 
60 //=========================================================================
61 // Standard Constructor
62 //=========================================================================
64  ISvcLocator* svcLoc)
65  : base_class(nam, svcLoc),
66  AthMessaging (nam),
67  m_incidentSvc ( "IncidentSvc", nam ),
68  m_eventStore( "StoreGateSvc", nam ),
69  m_evtSelector(nullptr), m_evtSelCtxt(nullptr),
70  m_histoDataMgrSvc( "HistogramDataSvc", nam ),
71  m_histoPersSvc ( "HistogramPersistencySvc", nam ),
72  m_evtIdModSvc ( "", nam ),
73  m_execAtPreFork(),
74  m_currentRun(0), m_firstRun(true), m_tools(this),
75  m_nevt(0), m_writeHists(false),
76  m_nev(0), m_proc(0), m_useTools(false),
77  m_chronoStatSvc( "ChronoStatSvc", nam ),
78  m_conditionsCleaner( "Athena::ConditionsCleanerSvc", nam )
79 {
80  declareProperty("EvtStore", m_eventStore, "The StoreGateSvc instance to interact with for event payload" );
81  declareProperty("EvtSel", m_evtsel,
82  "Name of Event Selector to use. If empty string (default) "
83  "take value from ApplicationMgr");
84  declareProperty("HistogramPersistency", m_histPersName="",
85  "Histogram persistency technology to use: ROOT, HBOOK, NONE. "
86  "By default (empty string) get property value from "
87  "ApplicationMgr");
88  declareProperty("HistWriteInterval", m_writeInterval=0 ,
89  "histogram write/update interval");
90  declareProperty("FailureMode", m_failureMode=1 ,
91  "Controls behaviour of event loop depending on return code of"
92  " Algorithms. 0: all non-SUCCESSes terminate job. "
93  "1: RECOVERABLE skips to next event, FAILURE terminates job "
94  "(DEFAULT). 2: RECOVERABLE and FAILURE skip to next events");
95  declareProperty("EventPrintoutInterval", m_eventPrintoutInterval=1,
96  "Print event heartbeat printouts every m_eventPrintoutInterval events");
97  declareProperty("IntervalInSeconds", m_intervalInSeconds = 0,
98  "heartbeat time interval is seconds rather than events"
99  "you also get a nice event rate printout then");
100  declareProperty("DoLiteLoop",m_liteLoop=false,"Runs the bare minimum during executeEvent");
101  declareProperty("UseDetailChronoStat",m_doChrono=false);
102  declareProperty("ClearStorePolicy",
103  m_clearStorePolicy = "EndEvent",
104  "Configure the policy wrt handling of when the "
105  "'clear-the-event-store' event shall happen: at EndEvent "
106  "(default as it is makes things easier for memory management"
107  ") or at BeginEvent (easier e.g. for interactive use)");
108  declareProperty("PreSelectTools",m_tools,"AlgTools for event pre-selection")->
109  declareUpdateHandler( &AthenaEventLoopMgr::setupPreSelectTools, this );
110  declareProperty("RequireInputAttributeList", m_requireInputAttributeList = false,
111  "Require valid input attribute list to be present");
112  declareProperty("UseSecondaryEventNumber", m_useSecondaryEventNumber = false,
113  "In case of DoubleEventSelector use event number from secondary input");
114  declareProperty("EvtIdModifierSvc", m_evtIdModSvc,
115  "ServiceHandle for EvtIdModifierSvc");
116  declareProperty("ExecAtPreFork", m_execAtPreFork,
117  "List of algorithms/sequences to execute during PreFork");
118 }
119 
120 //=========================================================================
121 // Standard Destructor
122 //=========================================================================
124 {
125 }
126 
127 //=========================================================================
128 // implementation of IAppMgrUI::initalize
129 //=========================================================================
131 {
132  ATH_MSG_INFO ( "Initializing " << name() ) ;
133 
134  m_autoRetrieveTools = false;
135  m_checkToolDeps = false;
136 
138  if ( !sc.isSuccess() )
139  {
140  ATH_MSG_ERROR ( "Failed to initialize base class MinimalEventLoopMgr" );
141  return sc;
142  }
143 
144 //-------------------------------------------------------------------------
145 // Setup access to event data services
146 //-------------------------------------------------------------------------
147 
148  sc = m_eventStore.retrieve();
149  if( !sc.isSuccess() )
150  {
151  ATH_MSG_FATAL ( "Error retrieving pointer to StoreGateSvc" );
152  return sc;
153  }
154 
155 //--------------------------------------------------------------------------
156 // Get the references to the services that are needed by the ApplicationMgr
157 // itself
158 //--------------------------------------------------------------------------
159  sc = m_incidentSvc.retrieve();
160  if( !sc.isSuccess() )
161  {
162  ATH_MSG_FATAL ( "Error retrieving IncidentSvc." );
163  return sc;
164  }
165 
166 //--------------------------------------------------------------------------
167 // Access Property Manager interface:
168 //--------------------------------------------------------------------------
169  SmartIF<IProperty> prpMgr(serviceLocator());
170  if ( !prpMgr.isValid() )
171  {
172  ATH_MSG_FATAL ( "IProperty interface not found in ApplicationMgr." );
173  return StatusCode::FAILURE;
174  }
175 
176 
177 //--------------------------------------------------------------------------
178 // Set up the Histogram Service
179 //--------------------------------------------------------------------------
180  sc = m_histoDataMgrSvc.retrieve();
181  if( !sc.isSuccess() )
182  {
183  ATH_MSG_FATAL ( "Error retrieving HistogramDataSvc" );
184  return sc;
185  }
186 
187  const std::string& histPersName(m_histPersName.value());
188  if ( histPersName.length() == 0 )
189  {
190  CHECK(setProperty(prpMgr->getProperty("HistogramPersistency")));
191  }
192 
193  if ( histPersName != "NONE" ) {
194 
195  m_histoPersSvc = IConversionSvc_t( "HistogramPersistencySvc",
196  this->name() );
197 
198  if( !sc.isSuccess() ) {
199  ATH_MSG_WARNING ( "Histograms cannot not be saved - though required." );
200  } else {
201 
202  SmartIF<IProperty> histSvc;
203  if (histPersName == "ROOT") {
204  histSvc = serviceLocator()->service("RootHistSvc");
205  } else if ( histPersName == "HBOOK" ) {
206  histSvc = serviceLocator()->service("HbookHistSvc");
207  }
208 
209  if (!histSvc) {
210  ATH_MSG_ERROR ( "could not locate actual Histogram persistency service" );
211  } else {
212  const Gaudi::Details::PropertyBase &prop = histSvc->getProperty("OutputFile");
213  std::string val;
214  try {
215  const StringProperty &sprop = dynamic_cast<const StringProperty&>( prop );
216 
217  val = sprop.value();
218 
219  } catch (...) {
220  ATH_MSG_VERBOSE ( "could not dcast OutputFile property to a StringProperty."
221  << " Need to fix Gaudi." );
222 
223  val = prop.toString();
224 
225  }
226 
227  if (val != "" &&
228  val != "UndefinedROOTOutputFileName" &&
229  val != "UndefinedHbookOutputFileName" ) {
230  m_writeHists = true;
231  }
232  }
233  }
234 
235  } else {
236  ATH_MSG_DEBUG ( "Histograms saving not required." );
237  }
238 
239 //--------------------------------------------------------------------------
240 // Set up the EventID modifier Service
241 //--------------------------------------------------------------------------
242  if( m_evtIdModSvc.empty() ) {
243  ATH_MSG_DEBUG ( "EventID modifier Service not set. No run number, ... overrides will be applied." );
244  }
245  else if ( !m_evtIdModSvc.retrieve().isSuccess() ) {
246  ATH_MSG_INFO ( "Could not find EventID modifier Service. No run number, ... overrides will be applied." );
247  }
248 
249 //-------------------------------------------------------------------------
250 // Setup EventSelector service
251 //-------------------------------------------------------------------------
252  const std::string& selName(m_evtsel.value());
253  // the evt sel is usually specified as a property of ApplicationMgr
254  if (selName.empty())
255  sc = setProperty(prpMgr->getProperty("EvtSel"));
256  if (sc.isFailure()) ATH_MSG_WARNING ( "Unable to set EvtSel property" );
257 
258  // We do not expect a Event Selector necessarily being declared
259  if( !selName.empty() && selName != "NONE") {
260  SmartIF<IEvtSelector> theEvtSel{serviceLocator()->service( selName )};
261  if( theEvtSel && ( theEvtSel != m_evtSelector ) ) {
262  // Event Selector changed (or setup for the first time)
263  m_evtSelector = theEvtSel;
264 
265  // reset iterator
266  if (m_evtSelector->createContext(m_evtSelCtxt).isFailure()) {
267  ATH_MSG_FATAL ( "Can not create the event selector Context."
268  );
269  return StatusCode::FAILURE;
270  }
271  if (msgLevel(MSG::INFO)) {
272  SmartIF<INamedInterface> named(theEvtSel);
273  if (named) {
274  ATH_MSG_INFO ( "Setup EventSelector service " << named->name( )
275  );
276  }
277  }
278  } else if (sc.isFailure()) {
279  ATH_MSG_FATAL ( "No valid event selector called " << selName
280  );
281  return StatusCode::FAILURE;
282  }
283  }
284 
285 //-------------------------------------------------------------------------
286 // Setup 'Clear-Store' policy
287 //-------------------------------------------------------------------------
288  try {
290  } catch(...) {
291  return StatusCode::FAILURE;
292  }
293 
294  // Get the AlgExecStateSvc
295  m_aess = serviceLocator()->service("AlgExecStateSvc");
296  if( !m_aess.isValid() ) {
297  ATH_MSG_FATAL ( "Error retrieving AlgExecStateSvc" );
298  return StatusCode::FAILURE;
299  }
300 
301  // Listen to the BeforeFork incident
302  m_incidentSvc->addListener(this,"BeforeFork",0);
303 
304  CHECK( m_conditionsCleaner.retrieve() );
305 
306  // Print if we override the event number using the one from secondary event
308  {
309  ATH_MSG_INFO ( "Using secondary event number." );
310  }
311 
312  return sc;
313 }
314 
315 //=========================================================================
316 // property handlers
317 //=========================================================================
318 void
319 AthenaEventLoopMgr::setClearStorePolicy(Gaudi::Details::PropertyBase&) {
320  const std::string& policyName = m_clearStorePolicy.value();
321 
322  if ( policyName != "BeginEvent" &&
323  policyName != "EndEvent" ) {
324 
325  ATH_MSG_FATAL ( "Unknown policy [" << policyName
326  << "] for the 'ClearStore-policy !"
327  << endmsg
328  << "Valid values are: BeginEvent, EndEvent"
329  );
330  throw GaudiException("Can not setup 'ClearStore'-policy",
331  name(),
332  StatusCode::FAILURE);
333  }
334 
335  return;
336 }
337 
338 void
339 AthenaEventLoopMgr::setupPreSelectTools(Gaudi::Details::PropertyBase&) {
340 
341  m_toolInvoke.clear();
342  m_toolReject.clear();
343  m_toolAccept.clear();
344 
345  m_tools.retrieve().ignore();
346  if(m_tools.size() > 0) {
347  m_useTools=true;
348  m_toolInvoke.resize(m_tools.size());
349  m_toolReject.resize(m_tools.size());
350  m_toolAccept.resize(m_tools.size());
351 
352  tool_iterator firstTool = m_tools.begin();
353  tool_iterator lastTool = m_tools.end();
354  unsigned int toolCtr = 0;
355  for ( ; firstTool != lastTool; ++firstTool )
356  {
357  // reset statistics
358  m_toolInvoke[toolCtr] = 0;
359  m_toolReject[toolCtr] = 0;
360  m_toolAccept[toolCtr] = 0;
361  toolCtr++;
362  }
363  }
364 
365  return;
366 
367 }
368 
369 //=========================================================================
370 // implementation of IAppMgrUI::finalize
371 //=========================================================================
373 {
374 
376  if (sc.isFailure()) {
377  ATH_MSG_ERROR ( "Error in Algorithm Finalize" );
378  }
379 
380  StatusCode sc2 = writeHistograms(true);
381  if (sc2.isFailure()) {
382  ATH_MSG_ERROR ( "Error in writing Histograms" );
383  }
384 
385  // Release all interfaces (ignore StatusCodes)
386  m_histoDataMgrSvc.release().ignore();
387  m_histoPersSvc.release().ignore();
388 
389  if (m_evtSelector) m_evtSelector->release();
390  m_incidentSvc.release().ignore();
391 
392  delete m_evtSelCtxt; m_evtSelCtxt = nullptr;
393 
394  if(m_useTools) {
395  tool_iterator firstTool = m_tools.begin();
396  tool_iterator lastTool = m_tools.end();
397  unsigned int toolCtr = 0;
398  ATH_MSG_INFO ( "Summary of AthenaEvtLoopPreSelectTool invocation: (invoked/success/failure)" );
399  ATH_MSG_INFO ( "-----------------------------------------------------" );
400 
401  for ( ; firstTool != lastTool; ++firstTool ) {
402  ATH_MSG_INFO ( std::setw(2) << std::setiosflags(std::ios_base::right)
403  << toolCtr+1 << ".) " << std::resetiosflags(std::ios_base::right)
404  << std::setw(48) << std::setfill('.')
405  << std::setiosflags(std::ios_base::left)
406  << (*firstTool)->name() << std::resetiosflags(std::ios_base::left)
407  << std::setfill(' ')
408  << " ("
409  << std::setw(6) << std::setiosflags(std::ios_base::right)
410  << m_toolInvoke[toolCtr]
411  << "/"
412  << m_toolAccept[toolCtr]
413  << "/"
414  << m_toolReject[toolCtr]
415  << ")"
416  );
417  toolCtr++;
418  }
419  }
420  return ( sc.isFailure() || sc2.isFailure() ) ? StatusCode::FAILURE :
421  StatusCode::SUCCESS;
422 
423 }
424 
425 //=========================================================================
426 // write out the histograms
427 //=========================================================================
429 
430  StatusCode sc (StatusCode::SUCCESS);
431 
432  if ( 0 != m_histoPersSvc && m_writeHists ) {
433  std::vector<DataObject*> objects;
434  sc = m_histoDataMgrSvc->traverseTree( [&objects]( IRegistry* reg, int ) {
435  DataObject* obj = reg->object();
436  if ( !obj || obj->clID() == CLID_StatisticsFile ) return false;
437  objects.push_back( obj );
438  return true;
439  } );
440 
441  if ( !sc.isSuccess() ) {
442  ATH_MSG_ERROR ( "Error while traversing Histogram data store" );
443  return sc;
444  }
445 
446  if ( objects.size() > 0) {
447  int writeInterval(m_writeInterval.value());
448 
449  if ( m_nevt == 1 || force ||
450  (writeInterval != 0 && m_nevt%writeInterval == 0) ) {
451 
452  // skip /stat entry!
453  sc = std::accumulate( begin( objects ), end( objects ), sc, [&]( StatusCode isc, auto& i ) {
454  IOpaqueAddress* pAddr = nullptr;
455  StatusCode iret = m_histoPersSvc->createRep( i, pAddr );
456  if ( iret.isFailure() ) return iret;
457  i->registry()->setAddress( pAddr );
458  return isc;
459  } );
460  sc = std::accumulate( begin( objects ), end( objects ), sc, [&]( StatusCode isc, auto& i ) {
461  IRegistry* reg = i->registry();
462  StatusCode iret = m_histoPersSvc->fillRepRefs( reg->address(), i );
463  return iret.isFailure() ? iret : isc;
464  } );
465  if ( ! sc.isSuccess() ) {
466  ATH_MSG_ERROR ( "Error while saving Histograms." );
467  }
468  }
469 
470  if (force || (writeInterval != 0 && m_nevt%writeInterval == 0) ) {
471  ATH_MSG_DEBUG ( "committing Histograms" );
472  m_histoPersSvc->conversionSvc()->commitOutput("",true).ignore();
473  }
474  }
475 
476  }
477 
478  return sc;
479 }
480 
481 //=========================================================================
482 // Call sysInitialize() on all algorithms and output streams
483 //=========================================================================
485 
486  // Initialize the list of Algorithms. Note that existing Algorithms
487  // are protected against multiple initialization attempts.
488  ListAlg::iterator ita;
489  for ( ita = m_topAlgList.begin(); ita != m_topAlgList.end(); ++ita )
490  {
491  StatusCode sc = (*ita)->sysInitialize();
492  if( sc.isFailure() )
493  {
494  ATH_MSG_ERROR ( "Unable to initialize Algorithm: "
495  << (*ita)->name() );
496  return sc;
497  }
498  }
499 
500  // Initialize the list of Output Streams. Note that existing Output Streams
501  // are protected against multiple initialization attempts.
502  for (ita = m_outStreamList.begin(); ita != m_outStreamList.end(); ++ita )
503  {
504  StatusCode sc = (*ita)->sysInitialize();
505  if( sc.isFailure() ) {
506  ATH_MSG_ERROR ( "Unable to initialize Output Stream: "
507  << (*ita)->name() );
508  return sc;
509  }
510 
511  }
512 
513  return StatusCode::SUCCESS;
514 }
515 
516 //=========================================================================
517 // Run the algorithms for the current event
518 //=========================================================================
520 
521  // Call the execute() method of all top algorithms
522  for ( ListAlg::iterator ita = m_topAlgList.begin();
523  ita != m_topAlgList.end();
524  ++ita )
525  {
526  const StatusCode& sc = (*ita)->sysExecute(ctx);
527  // this duplicates what is already done in Algorithm::sysExecute, which
528  // calls Algorithm::setExecuted, but eventually we plan to remove that
529  // function
530  m_aess->algExecState(*ita,ctx).setState(AlgExecState::State::Done, sc);
531  if ( !sc.isSuccess() ) {
532  ATH_MSG_INFO ( "Execution of algorithm "
533  << (*ita)->name() << " failed with StatusCode::" << sc );
534  return sc;
535  }
536  }
537 
538  return StatusCode::SUCCESS;
539 }
540 
541 
542 //=========================================================================
543 // Execute one event
544 //=========================================================================
546 {
547  //This is a lightweight implementation of the executeEvent, used when e.g. processing TTrees with RootNtupleEventSelector
548  if(m_liteLoop) {
549  m_incidentSvc->fireIncident(Incident("BeginEvent",IncidentType::BeginEvent));
551  m_incidentSvc->fireIncident(Incident("EndEvent",IncidentType::EndEvent));
552  ++m_proc;
553  ++m_nev;
554  return sc;
555  }
556 
557  CHECK( installEventContext(ctx) );
558 
560  if (m_firstRun || (m_currentRun != ctx.eventID().run_number()) ) {
561  // Fire EndRun incident unless this is the first run
562  if (!m_firstRun) {
563  m_incidentSvc->fireIncident(Incident(name(),IncidentType::EndRun));
564  }
565  m_firstRun=false;
566  m_currentRun = ctx.eventID().run_number();
567 
568  ATH_MSG_INFO ( " ===>>> start of run " << m_currentRun << " <<<===" );
569 
570  m_incidentSvc->fireIncident(Incident(name(),IncidentType::BeginRun,ctx));
571  }
572 
573  bool toolsPassed=true;
574  bool eventFailed = false;
575  // Call any attached tools to reject events early
576  unsigned int toolCtr=0;
577  if(m_useTools) {
578  //note: pEvent cannot be nullptr here, it has already been dereferenced
579  tool_store::iterator theTool = m_tools.begin();
580  tool_store::iterator lastTool = m_tools.end();
581  while(toolsPassed && theTool!=lastTool )
582  {
583  toolsPassed = (*theTool)->passEvent(ctx.eventID());
584  m_toolInvoke[toolCtr]++;
585  {toolsPassed ? m_toolAccept[toolCtr]++ : m_toolReject[toolCtr]++;}
586  ++toolCtr;
587  ++theTool;
588  }
589  }
590 
591 
592  uint64_t evtNumber = ctx.eventID().event_number();
593  bool doEvtHeartbeat(m_eventPrintoutInterval.value() > 0 &&
594  ( (!m_intervalInSeconds && 0 == (m_nev % m_eventPrintoutInterval.value())) ||
596  if (doEvtHeartbeat) {
597  if(!m_useTools) {
598  ATH_MSG_INFO ( " ===>>> start processing event #" << evtNumber << ", run #" << m_currentRun << " " << m_nev << " events processed so far <<<===" );
599  if(m_intervalInSeconds) {
600  ATH_MSG_INFO(" ===>>> Event processing rate = " << double(m_nev-m_lastNev)/(time(nullptr)-m_lastTime) << " Hz <<<===");
601  m_lastNev = m_nev; m_lastTime = time(nullptr);
602  }
603  }
604 
605  else ATH_MSG_INFO ( " ===>>> start processing event #" << evtNumber << ", run #" << m_currentRun
606  << " " << m_nev << " events read and " << m_proc
607  << " events processed so far <<<===" );
608  }
609 
610  // Reset the timeout singleton
612  if(toolsPassed) {
613  // Fire BeginEvent "Incident"
614  //m_incidentSvc->fireIncident(Incident(*pEvent, name(),"BeginEvent"));
615 
616  // An incident may schedule a stop, in which case is better to exit before the actual execution.
617  if ( m_scheduledStop ) {
618  ATH_MSG_ALWAYS ( "A stopRun was requested by an incidentListener. "
619  << "Do not process this event." );
620  return (StatusCode::SUCCESS);
621  }
622 
623  CHECK( m_conditionsCleaner->event (ctx, false) );
624 
625  // Call the execute() method of all top algorithms
627 
628  if(!sc.isSuccess()) {
629  eventFailed = true;
630  m_aess->setEventStatus( EventStatus::AlgFail, ctx );
631 
635  if (m_failureMode == 1 && sc.isRecoverable() ) {
636  ATH_MSG_WARNING ( "RECOVERABLE error returned by algorithm. "
637  << "Skipping remaining algorithms." << std::endl
638  << "\tNo output will be written for this event, "
639  << "but job will continue to next event" );
640  eventFailed = false;
641  }
642 
644  if (m_failureMode >= 2) {
645  ATH_MSG_INFO ( "Skipping remaining algorithms." << std::endl
646  << "\tNo output will be written for this event, "
647  << "but job will continue to next event" );
648  eventFailed = false;
649  }
650 
651  } else {
652 
653  m_aess->setEventStatus( EventStatus::Success, ctx );
654 
655  // Call the execute() method of all output streams
656  for (ListAlg::iterator ito = m_outStreamList.begin();
657  ito != m_outStreamList.end(); ++ito ) {
658  sc = (*ito)->sysExecute(ctx);
659  if( !sc.isSuccess() ) {
660  eventFailed = true;
661  }
662  }
663 
664  writeHistograms().ignore();
665 
666  }
667 
668  // Fire EndEvent "Incident"
669  //m_incidentSvc->fireIncident(Incident(*pEvent, name(),"EndEvent"));
670  ++m_proc;
671  } // end of toolsPassed test
672  ++m_nev;
673  if (doEvtHeartbeat) {
674  if(!m_intervalInSeconds) {
675  if (!m_useTools)
676  ATH_MSG_INFO(" ===>>> done processing event #" << evtNumber << ", run #" << m_currentRun
677  << " " << m_nev << " events processed so far <<<===");
678  else
679  ATH_MSG_INFO(" ===>>> done processing event #" << evtNumber << ", run #" << m_currentRun
680  << " " << m_nev << " events read and " << m_proc
681  << " events processed so far <<<===");
682  }
683  std::ofstream outfile( "eventLoopHeartBeat.txt");
684  if ( !outfile ) {
685  ATH_MSG_ERROR ( " unable to open: eventLoopHeartBeat.txt" );
686  } else {
687  outfile << " done processing event #" << evtNumber << ", run #" << m_currentRun
688  << " " << m_nev << " events read so far <<<===" << std::endl;
689  outfile.close();
690  }
691 
692  }
693 
694  //------------------------------------------------------------------------
695  // Check if there was an error processing current event
696  //------------------------------------------------------------------------
697  return eventFailed?StatusCode::FAILURE:StatusCode::SUCCESS;
698 
699 }
700 
701 //=========================================================================
702 // implementation of IEventProcessor::executeRun
703 //=========================================================================
705 {
706  if (!(this->nextEvent(maxevt)).isSuccess()) return StatusCode::FAILURE;
707  m_incidentSvc->fireIncident(Incident(name(),"EndEvtLoop"));
708  m_incidentSvc->fireIncident(Incident(name(),IncidentType::EndRun));
709 
710  return StatusCode::SUCCESS;
711 }
712 
713 //=========================================================================
714 // implementation of IAppMgrUI::nextEvent
715 //=========================================================================
717 {
718  // make nextEvent(0) a dummy call
719  if (0 == maxevt) return StatusCode::SUCCESS;
720 
721  static int total_nevt = 0;
722 
723  // the current 'clear-store' policy
724  static const ClearStorePolicy::Type s_clearStore =
725  clearStorePolicy( m_clearStorePolicy.value(), msgStream() );
726 
727 
728  // These following two initialization loops are performed here in case new
729  // Top level Algorithms or Output Streams have been created interactively
730  // at run-time instead of configuration time. Note also that it is possible
731  // that some newly created Algorithms are still not initialized as a result
732  // of these loops (e.g. where the membership of an existing Sequencer is
733  // changed at run-time. In this case, the Algorithm::sysExecute() function
734  // will ensure that the Algorithm is correctly initialized. This mechanism
735  // actually makes loops redundant, but they do provide a well defined
736  // location for the initialization to take place in the non-interactive case.
737 
739  if(sc.isFailure())
740  return sc;
741 
742  // loop over events if the maxevt (received as input) is different from -1.
743  // if evtmax is -1 it means infinite loop
744 
745  while(maxevt == -1 || m_nevt < maxevt) {
746 
747  if(m_doChrono && total_nevt>0) m_chronoStatSvc->chronoStart("EventLoopMgr"); //start after first event
748  if(m_doChrono && total_nevt>0) m_chronoStatSvc->chronoStart("EventLoopMgr_preexec");
749 
750  // Check if there is a scheduled stop issued by some algorithm/sevice
751  if ( m_scheduledStop ) {
752  m_scheduledStop = false;
753  ATH_MSG_ALWAYS ( "A stopRun was requested. Terminating event loop." );
754  break;
755  }
756 
757 
758 
759  ++m_nevt; ++total_nevt;
760  //-----------------------------------------------------------------------
761  // Clear the event store, if used in the event loop
762  //-----------------------------------------------------------------------
763  if( s_clearStore == ClearStorePolicy::BeginEvent &&
764  0 != total_nevt ) {
765  sc = eventStore()->clearStore();
766  if( !sc.isSuccess() ) {
767  ATH_MSG_ERROR ( "Clear of Event data store failed" );
768  m_incidentSvc->fireIncident(Incident(name(),"EndEvtLoop"));
769  return sc;
770  }
771  }
772 
773 
774 
775  //-----------------------------------------------------------------------
776  // we need an EventInfo Object to fire the incidents.
777  //-----------------------------------------------------------------------
778  if ( m_evtSelCtxt )
779  { // Deal with the case when an EventSelector is provided
780 
781  IOpaqueAddress* addr = nullptr;
782 
783  sc = m_evtSelector->next(*m_evtSelCtxt);
784 
785  if ( !sc.isSuccess() )
786  {
787  // This is the end of the loop. No more events in the selection
788  ATH_MSG_INFO ( "No more events in event selection " );
789  sc = StatusCode::SUCCESS;
790  break;
791  }
792 
793  if (m_evtSelector->createAddress(*m_evtSelCtxt, addr).isFailure()) {
794  ATH_MSG_ERROR ( "Could not create an IOpaqueAddress" );
795  break;
796  }
797 
798 
799  // Most iterators provide the IOA of an event header (EventInfo, DataHeader)
800  if (nullptr != addr) {
801  //create its proxy
802  sc = eventStore()->recordAddress(addr);
803  if( !sc.isSuccess() ) {
804  ATH_MSG_WARNING ( "Error declaring Event object" );
805  continue;
806  }
807  }
808  if ((sc=eventStore()->loadEventProxies()).isFailure()) {
809  ATH_MSG_ERROR ( "Error loading Event proxies" );
810  continue;
811  }
812  }
813  if(m_doChrono && total_nevt>1) m_chronoStatSvc->chronoStop("EventLoopMgr_preexec");
814  if(m_doChrono && total_nevt>1) m_chronoStatSvc->chronoStart("EventLoopMgr_execute");
815  // create an empty EventContext that will get set inside executeEvent
816  EventContext ctx;
817  // Execute event for all required algorithms
818  sc = executeEvent( std::move( ctx ) );
819  if(m_doChrono && total_nevt>1) m_chronoStatSvc->chronoStop("EventLoopMgr_execute");
820  if(m_doChrono && total_nevt>1) m_chronoStatSvc->chronoStart("EventLoopMgr_postexec");
821  if( !sc.isSuccess() )
822  {
823  ATH_MSG_ERROR ( "Terminating event processing loop due to errors" );
824  break;
825  }
826 
827  //-----------------------------------------------------------------------
828  // Clear the event store, if used in the event loop
829  //-----------------------------------------------------------------------
830  if ( s_clearStore == ClearStorePolicy::EndEvent ) {
831  sc = eventStore()->clearStore();
832  if( !sc.isSuccess() ) {
833  ATH_MSG_ERROR ( "Clear of Event data store failed" );
834  break;
835  }
836  }
837  if(m_doChrono && total_nevt>1) m_chronoStatSvc->chronoStop("EventLoopMgr_postexec");
838  if(m_doChrono && total_nevt>1) m_chronoStatSvc->chronoStop("EventLoopMgr");
839  } //event loop
840 
841 
842 
843  return sc;
844 
845 }
846 
847 
848 //=========================================================================
849 // Seek to a given event.
850 // The event selector must support the IEvtSelectorSeek interface for this to work.
851 //=========================================================================
853 {
854  IEvtSelectorSeek* is = dynamic_cast<IEvtSelectorSeek*> (m_evtSelector);
855  if (is == nullptr) {
856  ATH_MSG_ERROR ( "Seek failed; unsupported by event selector" );
857  return StatusCode::FAILURE;
858  }
859  //cppcheck-suppress nullPointerRedundantCheck
860  if (!m_evtSelCtxt) {
861  if (m_evtSelector->createContext(m_evtSelCtxt).isFailure()) {
862  ATH_MSG_FATAL ( "Can not create the event selector Context." );
863  return StatusCode::FAILURE;
864  }
865  }
866  //m_evtSelCtxt cannot be null if createContext succeeded
867  //cppcheck-suppress nullPointerRedundantCheck
868  StatusCode sc = is->seek (*m_evtSelCtxt, evt);
869  if (sc.isSuccess()) {
870  m_nevt = evt;
871  }
872  else {
873  ATH_MSG_ERROR ( "Seek failed." );
874  }
875  return sc;
876 }
877 
878 
879 //=========================================================================
880 // Return the current event count.
881 //=========================================================================
883 {
884  return m_nevt;
885 }
886 
887 //=========================================================================
888 // Return the collection size
889 //=========================================================================
891 {
892  IEvtSelectorSeek* cs = dynamic_cast<IEvtSelectorSeek*> (m_evtSelector);
893  if (cs == nullptr) {
894  ATH_MSG_ERROR ( "Collection size unsupported by event selector" );
895  return -1;
896  }
897  //cppcheck-suppress nullPointerRedundantCheck
898  if (!m_evtSelCtxt) {
899  if (m_evtSelector->createContext(m_evtSelCtxt).isFailure()) {
900  ATH_MSG_FATAL ( "Can not create the event selector Context." );
901  return -1;
902  }
903  }
904  //m_evtSelCtxt cannot be null if createContext succeeded
905  //cppcheck-suppress nullPointerRedundantCheck
906  return cs->size (*m_evtSelCtxt);
907 }
908 
909 //=========================================================================
910 // Handle incidents
911 //=========================================================================
912 void AthenaEventLoopMgr::handle(const Incident& inc)
913 {
914  if(inc.type()!="BeforeFork")
915  return;
916 
917  if(!m_firstRun) {
918  ATH_MSG_WARNING ( "Skipping BeforeFork handler. Begin run has already passed" );
919  return;
920  }
921 
922  // Initialize Algorithms and Output Streams
924  if(sc.isFailure()) {
925  ATH_MSG_ERROR ( "Failed to initialize Algorithms" );
926  return;
927  }
928 
929  if(!m_evtSelCtxt) {
930  ATH_MSG_WARNING ( "Skipping BeforeFork handler. No event selector is provided" );
931  return;
932  }
933 
934  // Construct EventInfo
935  IOpaqueAddress* addr = nullptr;
936  sc = m_evtSelector->next(*m_evtSelCtxt);
937  if(!sc.isSuccess()) {
938  ATH_MSG_INFO ( "No more events in event selection " );
939  return;
940  }
941  sc = m_evtSelector->createAddress(*m_evtSelCtxt, addr);
942  if (sc.isFailure()) {
943  ATH_MSG_ERROR ( "Could not create an IOpaqueAddress" );
944  return;
945  }
946  if (nullptr != addr) {
947  //create its proxy
948  sc = eventStore()->recordAddress(addr);
949  if(!sc.isSuccess()) {
950  ATH_MSG_ERROR ( "Error declaring Event object" );
951  return;
952  }
953  }
954 
955  if(eventStore()->loadEventProxies().isFailure()) {
956  ATH_MSG_WARNING ( "Error loading Event proxies" );
957  return;
958  }
959 
960  // Need to make sure we have a valid EventContext in place before
961  // doing anything that could fire incidents.
962  EventContext ctx;
963  // In the case of the BeginRun incident, we just want to take the
964  // next IoV from the list in the EvtIdModifierSvc, but leave it to
965  // be used for the next executeEvent call. TODO CHECK
966  if( installEventContext(ctx).isFailure() ) {
967  throw std::runtime_error( "Error installing event context object" );
968  }
969 
970  m_incidentSvc->fireIncident(Incident(name(),IncidentType::BeginRun,ctx));
971  m_firstRun=false;
972  m_currentRun = ctx.eventID().run_number();
973 
974  // Execute requested algorithms/sequences
975  if ( execAtPreFork(ctx).isFailure() ) {
976  ATH_MSG_ERROR ( "Unable to execute requested algorithms/sequences during PreFork!" );
977  return;
978  }
979 
980  // Clear Store
981  const ClearStorePolicy::Type s_clearStore = clearStorePolicy( m_clearStorePolicy.value(), msgStream() );
982  if(s_clearStore==ClearStorePolicy::EndEvent) {
983  sc = eventStore()->clearStore();
984  if(!sc.isSuccess()) {
985  ATH_MSG_ERROR ( "Clear of Event data store failed" );
986  }
987  }
988 }
989 
990 //=========================================================================
991 // Execute certain algorithms/sequence in PreFork
992 //=========================================================================
993 StatusCode AthenaEventLoopMgr::execAtPreFork(const EventContext& ctx) const {
994  IAlgManager* algMgr = Gaudi::svcLocator()->as<IAlgManager>();
995 
996  StatusCode sc;
997  for (const std::string& name : m_execAtPreFork) {
998  SmartIF<IAlgorithm>& alg = algMgr->algorithm(name, /*createIf*/false);
999  if ( alg ) {
1000  ATH_MSG_INFO("Executing " << alg->name() << "...");
1001  sc &= alg->sysExecute(ctx);
1002  }
1003  else ATH_MSG_WARNING("Cannot find algorithm or sequence " << name);
1004  }
1005  return sc;
1006 }
1007 
1008 
1009 StoreGateSvc*
1011  return m_eventStore.get();
1012 }
1013 
1014 
1015 //=========================================================================
1016 // Fill in our EventContext object and make it current.
1017 //=========================================================================
1019  // first get EventInfo and conditionsRun
1020  std::unique_ptr<EventInfo> eventInfo;
1021  EventID eventID;
1022  unsigned int conditionsRun = EventIDBase::UNDEFNUM;
1023  bool consume_modifier_stream = false; // FIXME/CHECK: was true inside TP converter and checks for active storegate
1024 
1025  if (m_evtSelCtxt) { // Deal with the case when an EventSelector is provided
1026  // First try to build a legacy EventInfo object from the TAG information
1027  // Read the attribute list
1028  const AthenaAttributeList* pAttrList =
1030  if (pAttrList != nullptr && pAttrList->size() > 6) {
1031  // Try making EventID-only EventInfo object from in-file TAG
1032  try {
1033  unsigned int runNumber = (*pAttrList)["RunNumber"].data<unsigned int>();
1034  unsigned long long eventNumber = (*pAttrList)["EventNumber"].data<unsigned long long>();
1035  unsigned int eventTime = (*pAttrList)["EventTime"].data<unsigned int>();
1036  unsigned int eventTimeNS = (*pAttrList)["EventTimeNanoSec"].data<unsigned int>();
1037  unsigned int lumiBlock = (*pAttrList)["LumiBlockN"].data<unsigned int>();
1038  unsigned int bunchId = (*pAttrList)["BunchId"].data<unsigned int>();
1039 
1040  ATH_MSG_DEBUG("use TAG with runNumber=" << runNumber);
1041  consume_modifier_stream = true;
1042  // an option to override primary eventNumber with the secondary one in
1043  // case of DoubleEventSelector
1045  unsigned long long eventNumberSecondary{};
1046  if (!(pAttrList->exists("hasSecondaryInput") &&
1047  (*pAttrList)["hasSecondaryInput"].data<bool>())) {
1048  ATH_MSG_FATAL("Secondary EventNumber requested, but secondary input does not exist!");
1049  return StatusCode::FAILURE;
1050  }
1051  if (pAttrList->exists("EventNumber_secondary")) {
1052  eventNumberSecondary = (*pAttrList)["EventNumber_secondary"].data<unsigned long long>();
1053  } else {
1054  // try legacy EventInfo if secondary input did not have attribute
1055  // list primary input should not have this EventInfo type
1056  const EventInfo* pEventSecondary = eventStore()->tryConstRetrieve<EventInfo>();
1057  if (pEventSecondary) {
1058  eventNumberSecondary = pEventSecondary->event_ID()->event_number();
1059  } else {
1060  ATH_MSG_FATAL("Secondary EventNumber requested, but it does not exist!");
1061  return StatusCode::FAILURE;
1062  }
1063  }
1064  if (eventNumberSecondary != 0) {
1065  bool doEvtHeartbeat(m_eventPrintoutInterval.value() > 0 &&
1066  0 == (m_nev % m_eventPrintoutInterval.value()));
1067  if (doEvtHeartbeat) {
1068  ATH_MSG_INFO(" ===>>> using secondary event #"
1069  << eventNumberSecondary << " instead of #"
1070  << eventNumber << " <<<===");
1071  }
1072  eventNumber = eventNumberSecondary;
1073  }
1074  }
1075 
1076  eventInfo = std::make_unique<EventInfo>(
1077  std::make_unique<EventID>(runNumber, eventNumber, eventTime,
1078  eventTimeNS, lumiBlock, bunchId),
1079  nullptr);
1080  eventID = *(eventInfo->event_ID());
1081 
1082  if (!m_evtIdModSvc.isSet() && pAttrList->exists("ConditionsRun")) {
1083  conditionsRun = (*pAttrList)["ConditionsRun"].data<unsigned int>();
1084  } else {
1085  conditionsRun = runNumber;
1086  }
1087 
1088  } catch (...) {
1089  }
1090  /* FIXME: PvG, not currently written
1091  if( pEvent != 0 && pAttrList->size() > 7 ) {
1092  // Try adding EventType information
1093  try {
1094  float eventWeight = (*pAttrList)["EventWeight"].data<float>();
1095  const EventType* pType = new EventType(); pEvent->setEventType(pType);
1096  pEvent->event_type()->set_mc_event_weight(eventWeight);
1097  } catch (...) {
1098  pEvent->setEventType(0);
1099  }
1100  }
1101  */
1102  } else if (m_requireInputAttributeList) {
1103  ATH_MSG_FATAL("Valid input attribute list required but not present!");
1104  return StatusCode::FAILURE;
1105  }
1106  // In the case that there is no TAG information
1107  if( !eventInfo ) {
1108  // Secondly try to retrieve a legacy EventInfo object from the input file
1109  // m_nevt - 1 because it's incremented early
1111  const EventInfo* pei = eventStore()->tryConstRetrieve<EventInfo>();
1112  if( pei ) {
1113  eventID = *(pei->event_ID());
1114  } else {
1115  // Finally try to retrieve an xAOD::EventInfo object from the
1116  // input file and build a legacy EventInfo object from that.
1118  if (xAODEvent == nullptr) {
1119  ATH_MSG_ERROR("Failed to get EventID from input. Tried old-style and xAOD::EventInfo");
1120  return StatusCode::FAILURE;
1121  }
1122  ATH_MSG_DEBUG("use xAOD::EventInfo with runNumber=" << xAODEvent->runNumber());
1123  // Record the old-style object for those clients that still need it
1124  eventInfo = std::make_unique<EventInfo>(
1125  std::make_unique<EventID>(eventIDFromxAOD(xAODEvent)),
1126  std::make_unique<EventType>(eventTypeFromxAOD(xAODEvent)));
1127  eventID = *(eventInfo->event_ID());
1128  StatusCode sc = eventStore()->record(std::move(eventInfo), "");
1129  if (!sc.isSuccess()) {
1130  ATH_MSG_ERROR("Error declaring event data object");
1131  return StatusCode::FAILURE;
1132  }
1133  }
1134  }
1135  } else {
1136  // No EventSelector is provided, so with no iterator it's up to us
1137  // to create an EventInfo
1138  eventInfo = std::make_unique<EventInfo>(
1139  std::make_unique<EventID>(1, m_nevt, 0), std::make_unique<EventType>());
1140  eventInfo->event_ID()->set_lumi_block(m_nevt);
1141  eventID = *(eventInfo->event_ID());
1142  StatusCode sc = eventStore()->record(std::move(eventInfo), "");
1143  if (!sc.isSuccess()) {
1144  ATH_MSG_ERROR("Error declaring event data object");
1145  return (StatusCode::FAILURE);
1146  }
1147  }
1148 
1149  ctx.setEventID( eventID );
1150  ctx.set(m_nev,0);
1152  Atlas::ExtendedEventContext( eventStore()->hiveProxyDict(),
1153  conditionsRun) );
1154  modifyEventContext(ctx, eventID, consume_modifier_stream);
1155  Gaudi::Hive::setCurrentContext( ctx );
1156 
1157  m_aess->reset( ctx );
1158  if (eventStore()->record(std::make_unique<EventContext> ( ctx ),
1159  "EventContext").isFailure())
1160  {
1161  ATH_MSG_ERROR ( "Error recording event context object" );
1162  return (StatusCode::FAILURE);
1163  }
1164 
1165  return StatusCode::SUCCESS;
1166 }
1167 
1168 //---------------------------------------------------------------------------
1169 
1170 void AthenaEventLoopMgr::modifyEventContext(EventContext& ctx, const EventID& eID, bool consume_modifier_stream) {
1171  if (m_evtIdModSvc.isSet()) {
1172  EventID new_eID(eID);
1173  // m_nevt - 1 because it's incremented early
1174  m_evtIdModSvc->modify_evtid(new_eID, m_nevt - 1, consume_modifier_stream);
1175  if (msgLevel(MSG::DEBUG)) {
1176  unsigned int oldrunnr=eID.run_number();
1177  unsigned int oldLB=eID.lumi_block();
1178  unsigned int oldTS=eID.time_stamp();
1179  unsigned int oldTSno=eID.time_stamp_ns_offset();
1180  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc runnr=" << oldrunnr << " -> " << new_eID.run_number() );
1181  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc LB=" << oldLB << " -> " << new_eID.lumi_block() );
1182  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc TimeStamp=" << oldTS << " -> " << new_eID.time_stamp() );
1183  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc TimeStamp ns Offset=" << oldTSno << " -> " << new_eID.time_stamp_ns_offset() );
1184  }
1185  ctx.setEventID( new_eID );
1186  Atlas::getExtendedEventContext(ctx).setConditionsRun( ctx.eventID().run_number() );
1187  return;
1188  }
1189 
1190  ctx.setEventID( eID );
1191 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
StoreGateSvc::record
StatusCode record(T *p2BRegistered, const TKEY &key)
Record an object with a key.
AthenaEventLoopMgr::m_lastTime
time_t m_lastTime
Definition: AthenaEventLoopMgr.h:211
AthenaEventLoopMgr::curEvent
virtual int curEvent() const
Return the current event count.
Definition: AthenaEventLoopMgr.cxx:882
AthenaEventLoopMgr::size
virtual int size()
Return the size of the collection.
Definition: AthenaEventLoopMgr.cxx:890
AthenaEventLoopMgr::m_evtIdModSvc
IEvtIdModifierSvc_t m_evtIdModSvc
Definition: AthenaEventLoopMgr.h:96
ClearStorePolicy::EndEvent
@ EndEvent
Definition: ClearStorePolicy.h:15
python.tests.PyTestsLib.finalize
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
Definition: PyTestsLib.py:50
AthenaEventLoopMgr::m_toolAccept
tool_stats m_toolAccept
tool returns StatusCode::SUCCESS counter
Definition: AthenaEventLoopMgr.h:124
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
AthenaEventLoopMgr::m_tools
tool_store m_tools
internal tool store
Definition: AthenaEventLoopMgr.h:125
SGout2dot.alg
alg
Definition: SGout2dot.py:243
LArConditions2Ntuple.objects
objects
Definition: LArConditions2Ntuple.py:59
AthenaEventLoopMgr::m_evtSelCtxt
IEvtSelector::Context * m_evtSelCtxt
Gaudi EventSelector Context (may be used as a cursor by the evt selector)
Definition: AthenaEventLoopMgr.h:82
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AthMsgStreamMacros.h
calibdata.force
bool force
Definition: calibdata.py:19
IEventSeek.h
Abstract interface for seeking within an event stream.
ExtendedEventContext.h
AthenaEventLoopMgr::eventStore
StoreGateSvc * eventStore() const
Definition: AthenaEventLoopMgr.cxx:1010
AthenaEventLoopMgr::name
virtual const std::string & name() const
Definition: AthenaEventLoopMgr.h:188
initialize
void initialize()
Definition: run_EoverP.cxx:894
AthenaEventLoopMgr::initialize
virtual StatusCode initialize()
implementation of IAppMgrUI::initalize
Definition: AthenaEventLoopMgr.cxx:130
AthenaEventLoopMgr::m_conditionsCleaner
ServiceHandle< Athena::IConditionsCleanerSvc > m_conditionsCleaner
Definition: AthenaEventLoopMgr.h:219
accumulate
bool accumulate(AccumulateMap &map, std::vector< module_t > const &modules, FPGATrackSimMatrixAccumulator const &acc)
Accumulates an accumulator (e.g.
Definition: FPGATrackSimMatrixAccumulator.cxx:22
AthenaEventLoopMgr.h
The default ATLAS batch event loop manager.
AthenaEventLoopMgr::m_histPersName
StringProperty m_histPersName
Definition: AthenaEventLoopMgr.h:102
EventInfoAuxContainer.h
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
AthenaEventLoopMgr::m_proc
unsigned int m_proc
Definition: AthenaEventLoopMgr.h:206
clearStorePolicy
ClearStorePolicy::Type clearStorePolicy(const std::string &policyName, MsgStream &msg)
returns the enum-version of the policy (by name)
Definition: ClearStorePolicy.cxx:7
AthenaEventLoopMgr::executeRun
virtual StatusCode executeRun(int maxevt)
implementation of IEventProcessor::executeRun(int maxevt)
Definition: AthenaEventLoopMgr.cxx:704
AthenaEventLoopMgr::m_evtSelector
IEvtSelector * m_evtSelector
Reference to the Event Selector.
Definition: AthenaEventLoopMgr.h:80
EventType.h
This class provides general information about an event. It extends EventInfo with a list of sub-evts ...
AthenaEventLoopMgr::m_failureMode
IntegerProperty m_failureMode
Definition: AthenaEventLoopMgr.h:110
LArG4FSStartPointFilter.evt
evt
Definition: LArG4FSStartPointFilter.py:42
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
AthenaEventLoopMgr::m_incidentSvc
IIncidentSvc_t m_incidentSvc
Reference to the incident service.
Definition: AthenaEventLoopMgr.h:73
EventContextClid.h
Assign a CLID to EventContext.
AthenaEventLoopMgr::m_eventStore
StoreGateSvc_t m_eventStore
Reference to StoreGateSvc;.
Definition: AthenaEventLoopMgr.h:77
xAOD::EventInfo_v1::runNumber
uint32_t runNumber() const
The current event's run number.
AthenaEventLoopMgr::m_writeInterval
IntegerProperty m_writeInterval
Definition: AthenaEventLoopMgr.h:201
AthenaEventLoopMgr::m_currentRun
number_type m_currentRun
current run number
Definition: AthenaEventLoopMgr.h:106
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
EventInfoContainer.h
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
AthenaEventLoopMgr::m_nev
unsigned int m_nev
events processed
Definition: AthenaEventLoopMgr.h:205
python.HLT.Jet.JetMenuSequencesConfig.selName
def selName(recoSequenceName, hypoType=JetHypoAlgType.STANDARD)
Definition: JetMenuSequencesConfig.py:136
AthenaEventLoopMgr::~AthenaEventLoopMgr
virtual ~AthenaEventLoopMgr()
Standard Destructor.
Definition: AthenaEventLoopMgr.cxx:123
AthenaEventLoopMgr::modifyEventContext
virtual void modifyEventContext(EventContext &ctx, const EventID &eID, bool consume_modifier_stream)
Definition: AthenaEventLoopMgr.cxx:1170
AthenaEventLoopMgr::installEventContext
StatusCode installEventContext(EventContext &ctx)
Definition: AthenaEventLoopMgr.cxx:1018
ATLAS_NO_CHECK_FILE_THREAD_SAFETY
ATLAS_NO_CHECK_FILE_THREAD_SAFETY
Definition: AthenaEventLoopMgr.cxx:8
Atlas::getExtendedEventContext
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
Definition: ExtendedEventContext.cxx:32
EventInfoFromxAOD.h
IEvtSelectorSeek::seek
virtual StatusCode seek(IEvtSelector::Context &c, int evtnum) const =0
Seek to a given event number.
AthenaEventLoopMgr::nextEvent
virtual StatusCode nextEvent(int maxevt)
implementation of IAppMgrUI::nextEvent. maxevt==0 returns immediately
Definition: AthenaEventLoopMgr.cxx:716
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:125
AthenaEventLoopMgr::initializeAlgorithms
StatusCode initializeAlgorithms()
Initialize all algorithms and output streams.
Definition: AthenaEventLoopMgr.cxx:484
EventID.h
This class provides a unique identification for each event, in terms of run/event number and/or a tim...
IEvtIdModifierSvc.h
AthenaEventLoopMgr::IConversionSvc_t
ServiceHandle< IConversionSvc > IConversionSvc_t
Definition: AthenaEventLoopMgr.h:90
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
AthenaEventLoopMgr::m_doChrono
bool m_doChrono
Definition: AthenaEventLoopMgr.h:217
AthenaEventLoopMgr::execAtPreFork
StatusCode execAtPreFork(const EventContext &ctx) const
Execute certain algorithms/sequences in PreFork.
Definition: AthenaEventLoopMgr.cxx:993
AthenaEventLoopMgr::handle
void handle(const Incident &inc)
IIncidentListenet interfaces.
Definition: AthenaEventLoopMgr.cxx:912
AthenaEventLoopMgr::m_requireInputAttributeList
bool m_requireInputAttributeList
require input attribute list
Definition: AthenaEventLoopMgr.h:128
lumiFormat.i
int i
Definition: lumiFormat.py:85
AthenaEventLoopMgr::m_histoPersSvc
IConversionSvc_t m_histoPersSvc
Definition: AthenaEventLoopMgr.h:92
Atlas::ExtendedEventContext
Definition: ExtendedEventContext.h:23
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
AthenaEventLoopMgr::m_aess
SmartIF< IAlgExecStateSvc > m_aess
Reference to the Algorithm Execution State Svc.
Definition: AthenaEventLoopMgr.h:156
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
EventInfo::event_ID
EventID * event_ID()
the unique identification of the event.
Definition: EventInfo/EventInfo/EventInfo.h:224
ClearStorePolicy::Type
Type
Definition: ClearStorePolicy.h:13
IEvtSelectorSeek::size
virtual int size(IEvtSelector::Context &c) const =0
Return the size of the collection, or -1 if we can't get the size.
AthenaEventLoopMgr::m_useTools
bool m_useTools
Definition: AthenaEventLoopMgr.h:207
IAthenaEvtLoopPreSelectTool.h
This file contains the class definition for the IAthenaEvtLoopPreSelectTool class.
AthenaEventLoopMgr::m_lastNev
unsigned int m_lastNev
Definition: AthenaEventLoopMgr.h:209
AthenaEventLoopMgr::seek
virtual StatusCode seek(int evt)
Seek to a given event.
Definition: AthenaEventLoopMgr.cxx:852
MuonSegmentReaderConfig.histSvc
histSvc
Definition: MuonSegmentReaderConfig.py:96
AthenaEventLoopMgr::m_execAtPreFork
StringArrayProperty m_execAtPreFork
Definition: AthenaEventLoopMgr.h:99
AthMessaging
Class to provide easy MsgStream access and capabilities.
Definition: AthMessaging.h:55
ATH_MSG_ALWAYS
#define ATH_MSG_ALWAYS(x)
Definition: AthMsgStreamMacros.h:35
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
AthenaEventLoopMgr::finalize
virtual StatusCode finalize()
implementation of IAppMgrUI::finalize
Definition: AthenaEventLoopMgr.cxx:372
AthenaAttributeList
An AttributeList represents a logical row of attributes in a metadata table. The name and type of eac...
Definition: PersistentDataModel/PersistentDataModel/AthenaAttributeList.h:45
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
AthenaEventLoopMgr::m_eventPrintoutInterval
UnsignedIntegerProperty m_eventPrintoutInterval
Definition: AthenaEventLoopMgr.h:113
xAOD::eventNumber
eventNumber
Definition: EventInfo_v1.cxx:124
StoreGateSvc::clearStore
virtual StatusCode clearStore(bool forceRemove=false) override final
clear DataStore contents: called by the event loop mgrs
Definition: StoreGateSvc.cxx:450
Athena::Timeout::instance
static Timeout & instance()
Get reference to Timeout singleton.
Definition: Timeout.h:64
AthenaEventLoopMgr::executeEvent
virtual StatusCode executeEvent(EventContext &&ctx)
implementation of IEventProcessor::executeEvent(EventContext&& ctx)
Definition: AthenaEventLoopMgr.cxx:545
AthenaEventLoopMgr::m_toolInvoke
tool_stats m_toolInvoke
tool called counter
Definition: AthenaEventLoopMgr.h:122
Atlas::ExtendedEventContext::setConditionsRun
void setConditionsRun(EventIDBase::number_type conditionsRun)
Definition: ExtendedEventContext.h:36
AthenaEventLoopMgr::m_toolReject
tool_stats m_toolReject
tool returns StatusCode::FAILURE counter
Definition: AthenaEventLoopMgr.h:123
AthenaEventLoopMgr::setupPreSelectTools
void setupPreSelectTools(Gaudi::Details::PropertyBase &)
property update handler:sets up the Pre-selection tools
Definition: AthenaEventLoopMgr.cxx:339
EventAuxInfo.h
AthenaEventLoopMgr::m_clearStorePolicy
StringProperty m_clearStorePolicy
Definition: AthenaEventLoopMgr.h:139
errorcheck.h
Helpers for checking error return status codes and reporting errors.
EventInfo
This class provides general information about an event. Event information is provided by the accessor...
Definition: EventInfo/EventInfo/EventInfo.h:43
AthenaEventLoopMgr::m_liteLoop
bool m_liteLoop
Definition: AthenaEventLoopMgr.h:213
AthenaEventLoopMgr::m_chronoStatSvc
ServiceHandle< IChronoStatSvc > m_chronoStatSvc
Definition: AthenaEventLoopMgr.h:218
StoreGateSvc::recordAddress
StatusCode recordAddress(const std::string &skey, IOpaqueAddress *pAddress, bool clearAddressFlag=true)
Create a proxy object using an IOpaqueAddress and a transient key.
StoreGateSvc::tryConstRetrieve
const T * tryConstRetrieve() const
AthenaAttributeList.h
An AttributeList represents a logical row of attributes in a metadata table. The name and type of eac...
EventInfo.h
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
AthenaEventLoopMgr::m_useSecondaryEventNumber
bool m_useSecondaryEventNumber
read event number from secondary input
Definition: AthenaEventLoopMgr.h:131
DeMoAtlasDataLoss.runNumber
string runNumber
Definition: DeMoAtlasDataLoss.py:64
AthenaEventLoopMgr::setClearStorePolicy
void setClearStorePolicy(Gaudi::Details::PropertyBase &clearStorePolicy)
property update handler:set the clear-store policy value and check its value.
Definition: AthenaEventLoopMgr.cxx:319
ClearStorePolicy::BeginEvent
@ BeginEvent
Definition: ClearStorePolicy.h:14
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
AthenaEventLoopMgr::m_intervalInSeconds
unsigned int m_intervalInSeconds
Definition: AthenaEventLoopMgr.h:210
AthenaEventLoopMgr::m_firstRun
bool m_firstRun
Definition: AthenaEventLoopMgr.h:107
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
AthenaEventLoopMgr::m_writeHists
bool m_writeHists
Definition: AthenaEventLoopMgr.h:202
AthenaEventLoopMgr::m_evtsel
StringProperty m_evtsel
Definition: AthenaEventLoopMgr.h:84
DEBUG
#define DEBUG
Definition: page_access.h:11
eventIDFromxAOD
EventID eventIDFromxAOD(const xAOD::EventInfo *xaod)
Create EventID object from xAOD::EventInfo.
Definition: EventInfoFromxAOD.cxx:16
EventID
This class provides a unique identification for each event, in terms of run/event number and/or a tim...
Definition: EventID.h:35
AthenaEventLoopMgr::writeHistograms
virtual StatusCode writeHistograms(bool force=false)
Dump out histograms as needed.
Definition: AthenaEventLoopMgr.cxx:428
AthenaEventLoopMgr::tool_iterator
tool_store::const_iterator tool_iterator
Definition: AthenaEventLoopMgr.h:118
AthenaEventLoopMgr::AthenaEventLoopMgr
AthenaEventLoopMgr()
no implementation
ClearStorePolicy.h
AthenaEventLoopMgr::m_nevt
int m_nevt
Definition: AthenaEventLoopMgr.h:199
Athena::TimeoutMaster::resetTimeout
void resetTimeout(Timeout &instance)
Reset timeout.
Definition: Timeout.h:83
xAOD::lumiBlock
setTeId lumiBlock
Definition: L2StandAloneMuon_v1.cxx:327
checker_macros.h
Define macros for attributes used to control the static checker.
python.PyAthena.obj
obj
Definition: PyAthena.py:132
eventTypeFromxAOD
EventType eventTypeFromxAOD(const xAOD::EventInfo *xaod)
Create EventType object from xAOD::EventInfo.
Definition: EventInfoFromxAOD.cxx:34
PrepareReferenceFile.outfile
outfile
Definition: PrepareReferenceFile.py:42
StoreGateSvc.h
AthenaEventLoopMgr::executeAlgorithms
virtual StatusCode executeAlgorithms(const EventContext &)
Run the algorithms for the current event.
Definition: AthenaEventLoopMgr.cxx:519
Atlas::setExtendedEventContext
void setExtendedEventContext(EventContext &ctx, ExtendedEventContext &&ectx)
Move an extended context into a context object.
Definition: ExtendedEventContext.cxx:50
AthenaEventLoopMgr::m_histoDataMgrSvc
IDataManagerSvc_t m_histoDataMgrSvc
Reference to the Histogram Data Service.
Definition: AthenaEventLoopMgr.h:88
IEvtSelectorSeek
Abstract interface for seeking for an event selector.
Definition: IEvtSelectorSeek.h:28
EventInfoCnvParams::eventIndex
thread_local event_number_t eventIndex
Definition: IEvtIdModifierSvc.h:34