ATLAS Offline Software
PileUpEventLoopMgr.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 
6 // Class header
7 #include "PileUpEventLoopMgr.h"
8 
9 // Athena includes
15 
21 
22 #include "StoreGate/StoreGateSvc.h"
23 
28 
29 // xAOD include(s):
31 
32 // Gaudi headers
33 #include "GaudiKernel/IAlgorithm.h"
34 #include "GaudiKernel/IEvtSelector.h"
35 #include "GaudiKernel/IIncidentSvc.h"
36 #include "GaudiKernel/Incident.h"
37 #include "GaudiKernel/DataIncident.h" // For ContextIncident
38 #include "GaudiKernel/EventContext.h"
39 #include "GaudiKernel/ThreadLocalContext.h"
40 
41 // std library headers
42 #include <cmath>
43 
44 //=========================================================================
45 // Standard Constructor
46 //=========================================================================
48  ISvcLocator* svcLoc)
49  : base_class(name, svcLoc)
50  , AthMessaging (name)
51  , m_incidentSvc("IncidentSvc", name)
52  , m_evtStore("StoreGateSvc/StoreGateSvc", name)
53 {
54  // m_caches.push_back("BkgStreamsCache/MinBiasCache");
55 }
56 
57 //=========================================================================
58 // Standard Destructor
59 //=========================================================================
61 
62 //=========================================================================
63 // implementation of IAppMgrUI::initialize
64 //=========================================================================
66 {
67  ATH_MSG_INFO ( "Initializing " << this->name() ) ;
69  ATH_MSG_WARNING ( "AllowSerialAndMPToDiffer=False! This will incur serious performance penalties! But Serial and MP output will be the same." );
70  }
71 
72  //locate the StoreGateSvc and initialize our local ptr
73  CHECK(m_evtStore.retrieve());
74 
75  //reset output store proxy provider: we don't want to have one!
76  m_evtStore->setProxyProviderSvc(nullptr);
77 
78  //locate the IncidentSvc and initialize our local ptr
79  CHECK(m_incidentSvc.retrieve());
80 
81  //locate the PileUpMergeSvc and initialize our local ptr
82  CHECK(m_mergeSvc.retrieve());
83 
84  //-------------------------------------------------------------------------
85  // Setup Event Selector
86  //-------------------------------------------------------------------------
87  CHECK(this->setupStreams());
88 
89  // Get the value of SkipEvents. It is needed for seeking
90  SmartIF<IProperty> prpMgr(serviceLocator());
91  SmartIF<IEvtSelector> evtSelector;
92  if (prpMgr.isValid()) {
93  // Get event selector name. Retrieve EventSelector
94  evtSelector = serviceLocator()->service(prpMgr->getProperty("EvtSel").toString());
95  CHECK(evtSelector.isValid());
96  }
97  else {
98  ATH_MSG_ERROR ( "IProperty interface not found in ApplicationMgr" );
99  return StatusCode::FAILURE;
100  }
101 
102  SmartIF<IProperty> prpMgr1(evtSelector);
103  if (prpMgr1.isValid()) {
104  std::string skipEventsStr = prpMgr1->getProperty("SkipEvents").toString();
105  m_ncurevt = std::atoi(skipEventsStr.c_str());
106  }
107  else {
108  ATH_MSG_ERROR ( "IProperty interface not found on the event selector" );
109  return StatusCode::FAILURE;
110  }
111 
112  // Get the AlgExecStateSvc
113  m_aess = serviceLocator()->service("AlgExecStateSvc");
114  if (!m_aess.isValid()) {
115  ATH_MSG_FATAL ( "Error retrieving AlgExecStateSvc" );
116  return StatusCode::FAILURE;
117  }
118 
119  //--------------------------------------------------------------------------
120  // Set up the EventID modifier Service
121  //--------------------------------------------------------------------------
122  if( m_evtIdModSvc.empty() ) {
123  ATH_MSG_DEBUG ( "EventID modifier Service not set. No run number, ... overrides will be applied." );
124  }
125  else if ( !m_evtIdModSvc.retrieve().isSuccess() ) {
126  ATH_MSG_INFO ( "Could not find EventID modifier Service. No run number, ... overrides will be applied." );
127  }
128 
129  //-------------------------------------------------------------------------
130  // Base class initialize (done at the end to allow algs to access stores)
131  //-------------------------------------------------------------------------
132 
134 }
135 
136 //=========================================================================
137 // implementation of IAppMgrUI::finalize
138 //=========================================================================
140 {
141  ATH_MSG_INFO ( "Finalizing " << this->name() );
142 
143  //we need to release all our BkgStreamCaches
146  while (cacheIterator != endOfCaches) {
147  (*cacheIterator++)->release();
148  }
149  m_caches.clear();
150 
151  //and to clean up the store the stream owns
153 
155 }
156 
157 //=========================================================================
158 // implementation of IAppMgrUI::terminate
159 //=========================================================================
160 // StatusCode PileUpEventLoopMgr::terminate()
161 // {
162 // m_histoDataMgrSvc = releaseInterface(m_histoDataMgrSvc);
163 // m_histoPersSvc = releaseInterface(m_histoPersSvc);
164 // return MinimalEventLoopMgr::terminate();
165 // }
166 
167 
168 //---------------------------------------------------------------------------
169 void PileUpEventLoopMgr::modifyEventContext(EventContext& ctx, const EventID& eID, bool consume_modifier_stream) {
170 
171  if (m_evtIdModSvc.isSet()) {
172  EventID new_eID(eID);
173  // m_nevt - 1 because the PileUpEventLoopMgr increments it rather early
174  m_evtIdModSvc->modify_evtid(new_eID, m_ncurevt - 1, consume_modifier_stream);
175  if (msgLevel(MSG::DEBUG)) {
176  unsigned int oldrunnr=eID.run_number();
177  unsigned int oldLB=eID.lumi_block();
178  unsigned int oldTS=eID.time_stamp();
179  unsigned int oldTSno=eID.time_stamp_ns_offset();
180  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc runnr=" << oldrunnr << " -> " << new_eID.run_number() );
181  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc LB=" << oldLB << " -> " << new_eID.lumi_block() );
182  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc TimeStamp=" << oldTS << " -> " << new_eID.time_stamp() );
183  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc TimeStamp ns Offset=" << oldTSno << " -> " << new_eID.time_stamp_ns_offset() );
184  }
185  ctx.setEventID(new_eID);
186  return;
187  }
188 
189  ctx.setEventID( eID );
190 }
191 
192 
193 //=========================================================================
194 // implementation of IAppMgrUI::nextEvent
195 //=========================================================================
197 {
198  // make nextEvent(0) a dummy call, as needed by athenaMP
199  if (0 == maxevt) {
200  return StatusCode::SUCCESS;
201  }
202 
203 
204  // These following two initialization loops are performed here in case new
205  // Top level Algorithms or Output Streams have been created interactively
206  // at run-time instead of configuration time. Note also that it is possible
207  // that some newly created Algorithms are still not initialized as a result
208  // of these loops (e.g. where the membership of an existing Sequencer is
209  // changed at run-time. In this case, the Algorithm::sysExecute() function
210  // will ensure that the Algorithm is correctly initialized. This mechanism
211  // actually makes loops redundant, but they do provide a well defined
212  // location for the initialization to take place in the non-interactive case.
213 
214  // Initialize the list of Algorithms. Note that existing Algorithms
215  // are protected against multiple initialization attempts.
216  ListAlg::iterator ita;
217  for ( ita = m_topAlgList.begin(); ita != m_topAlgList.end(); ++ita ) {
218  if( !((*ita)->sysInitialize()).isSuccess() ) {
219  ATH_MSG_ERROR ( "Unable to initialize Algorithm: " <<
220  (*ita)->name() );
221  return StatusCode::FAILURE;
222  }
223  }
224 
225  // Initialize the list of Output Streams. Note that existing Output Streams
226  // are protected against multiple initialization attempts.
227  for (ita = m_outStreamList.begin(); ita != m_outStreamList.end(); ++ita ) {
228  if( !((*ita)->sysInitialize()).isSuccess() ) {
229  ATH_MSG_ERROR ( "Unable to initialize Output Stream: " <<
230  (*ita)->name() );
231  return StatusCode::FAILURE;
232  }
233  }
234 
235  const xAOD::EventInfo *inputEventInfo{};
236 
237  // loop over events if the maxevt (received as input) is different from -1.
238  // if evtmax is -1 it means infinite loop
239  while( (maxevt == -1 || m_nevt < maxevt) &&
240  0 != (inputEventInfo = m_origStream.nextEventPre()) ) {
241  // Check if there is a scheduled stop issued by some algorithm/sevice
242  if ( m_scheduledStop ) {
243  m_scheduledStop = false;
244  ATH_MSG_ALWAYS ( "A stopRun was requested. Terminating event loop." );
245  break;
246  }
247  ++m_nevt; ++m_ncurevt;
248 
249  //-----------------------------------------------------------------------
250  // Setup overlaid event in the event store
251  //-----------------------------------------------------------------------
252 
253  auto upOverEvent = std::make_unique<xAOD::EventInfo>();
254  auto upOverEventAux = std::make_unique<xAOD::EventAuxInfo>();
255  upOverEvent->setStore( upOverEventAux.get() );
256  xAOD::EventInfo* pOverEvent = upOverEvent.get();
257  ATH_MSG_DEBUG(" #subevents in the signal event =" << inputEventInfo->subEvents().size());
258 
259  // Copy the eventInfo data from origStream event
260  *pOverEvent = *inputEventInfo;
261  pOverEvent->clearSubEvents(); // start clean without any subevents
262 
263  // Need to copy this explicitly as it may be marked as a decoration.
264  pOverEvent->setMCEventWeights(inputEventInfo->mcEventWeights());
265 
266  // Propagate MC metadata
267  if (pOverEvent->mcChannelNumber() == 0) {
268  if (m_mcChannelNumber.value() != 0) {
269  ATH_MSG_WARNING("Input mcChannelNumber is 0, setting it to " << m_mcChannelNumber.value());
270  pOverEvent->setMCChannelNumber(m_mcChannelNumber.value());
271  } else {
272  ATH_MSG_WARNING("Input mcChannelNumber is 0");
273  }
274  } else {
275  if (m_mcChannelNumber.value() != 0 && pOverEvent->mcChannelNumber() != m_mcChannelNumber.value()) {
276  ATH_MSG_WARNING("Input mcChannelNumber (" << pOverEvent->mcChannelNumber()
277  << ") and provided mcChannelNumber (" << m_mcChannelNumber.value() << ") do not match.");
278  }
279  }
280 
281  if (pOverEvent->mcEventNumber() == 0) {
282  if (pOverEvent->eventNumber() != 0) {
283  ATH_MSG_WARNING("Input mcEventNumber is 0, setting it to match the eventNumber (" << pOverEvent->eventNumber() << ")");
284  pOverEvent->setMCEventNumber(pOverEvent->eventNumber());
285  } else {
286  ATH_MSG_ERROR("Input eventNumber and mcEventNumber are 0");
287  return StatusCode::FAILURE;
288  }
289  }
290 
291  if (pOverEvent->mcEventWeights().empty()) {
292  ATH_MSG_ERROR("Input mcEventWeights are empty. This should not happen.");
293  return StatusCode::FAILURE;
294  }
295 
296  // Record the xAOD object(s):
297  CHECK( m_evtStore->record( std::move(upOverEventAux), m_evinfName + "Aux." ) );
298  CHECK( m_evtStore->record( std::move(upOverEvent), m_evinfName ) );
299  pOverEvent->setEvtStore( m_evtStore.get() );
300  // Create an EventInfoContainer for the pileup events:
303  puei->setStore( puaux );
304 
305  // Record the EI container object(s):
306  CHECK( m_evtStore->record( puei, m_evinfContName ) );
307  CHECK( m_evtStore->record( puaux, m_evinfContName+"Aux." ) );
308 
309  // Setup the EventContext.
310  // Ensure that the overridden run number etc. is being used
311  EventContext ctx;
312  EventID ev_id = eventIDFromxAOD( pOverEvent );
313  bool consume_modifier_stream = false; // FIXME/CHECK: was true inside TP converter and checks for active storegate
314  // kludge FIXME
316  if ( pAttrList != nullptr && pAttrList->size() > 6 ) {
317  // Ideally we would create the initial EventID from the TAG
318  // information, but not doing that (yet?). For now using the
319  // presence of TAG information in the HITS file to indicate that
320  // the EvtIdModifierSvc has not already been called for this
321  // Athena event.
322  consume_modifier_stream = true;
323  }
324  ctx.set(m_nevt,0);
325  modifyEventContext(ctx, ev_id, consume_modifier_stream);
327  ctx.setExtension( Atlas::ExtendedEventContext(m_evtStore->hiveProxyDict(),
328  ctx.eventID().run_number()) );
329  Gaudi::Hive::setCurrentContext( ctx );
330  m_aess->reset(ctx);
331  // make copy to std::move into store
332  auto puctx =std::make_unique<EventContext> ( ctx );
333  if (m_evtStore->record( std::move(puctx) ,"EventContext").isFailure()) {
334  ATH_MSG_ERROR ( "Error recording event context object" );
335  return StatusCode::FAILURE;
336  }
337 
338  //Update run number, event number, lumi block and timestamp from EventContext
339  pOverEvent->setRunNumber( ctx.eventID().run_number() );
340  pOverEvent->setEventNumber( ctx.eventID().event_number() );
341  pOverEvent->setLumiBlock( ctx.eventID().lumi_block() );
342  pOverEvent->setTimeStamp( ctx.eventID().time_stamp() );
343  ATH_MSG_DEBUG( "Updated pOverEvent " << *pOverEvent );
344 
345  ATH_MSG_INFO ( "nextEvent(): overlaying original event " <<
346  pOverEvent->runNumber() << '/' <<
347  pOverEvent->eventNumber() << '/' <<
348  pOverEvent->lumiBlock() );
349 
350  //ask the BeamIntensitySvc to choose (and remember)
351  //in which xing this event will be wrto the beam int distribution
352  m_beamInt->selectT0(ctx.eventID().run_number(), ctx.eventID().event_number());
353 
354  // Use the position in the beam intensity array to set a BCID-like quantity
355  pOverEvent->setBCID( m_beamInt->getCurrentT0BunchCrossing() );
356 
357  unsigned int t0BCID = pOverEvent->bcid();
358  ATH_MSG_VERBOSE ( "BCID =" << t0BCID );
359 
360  // pOvrEt->set_user_type("Overlaid"); //FIXME ?? MN: ?? what to do with that
361 
362  // Overlay RDO files should be treated like data for reco
363  // purposes, so only set this for SimHit level pile-up.
364  pOverEvent->setEventTypeBitmask( inputEventInfo->eventTypeBitmask() | xAOD::EventInfo::IS_SIMULATION );
365 
366  // register as sub event of the overlaid
367  bool addpEvent(true);
368 
369  ATH_MSG_DEBUG( "inputEventInfo->evtStore()="<<inputEventInfo->evtStore()<<", pOverEvent->evtStore()=" << pOverEvent->evtStore()<<", &m_origStream.store()="<<&m_origStream.store() );
370  if ( addpEvent ) {
371  xAOD::EventInfo* newEv=addSubEvent(pOverEvent, inputEventInfo, 0, xAOD::EventInfo::Signal, puei, m_evinfContName );
372  if(newEv->evtStore()==nullptr) newEv->setEvtStore(&m_origStream.store());
373  newEv->setRunNumber( ctx.eventID().run_number() );
374  newEv->setEventNumber( ctx.eventID().event_number() );
375  newEv->setLumiBlock( ctx.eventID().lumi_block() );
376  newEv->setTimeStamp( ctx.eventID().time_stamp() );
377  ATH_MSG_DEBUG( "Added inputEventInfo="<<inputEventInfo<<" as subEvent "<<newEv<<" to pOverEvent " << pOverEvent );
378  ATH_MSG_DEBUG( " afterwards: newEv->evtStore()="<<newEv->evtStore()<<", pOverEvent->evtStore()=" << pOverEvent->evtStore() );
379  ATH_MSG_DEBUG( " pOverEvent->subEvents()[0].ptr()="<<pOverEvent->subEvents()[0].ptr()<<" content="<<*pOverEvent->subEvents()[0].ptr()<<" store="<< pOverEvent->subEvents()[0].ptr()->evtStore() );
380  }
381 
382  ATH_MSG_INFO ( "set aliases" );
383  //add an alias to "OverlayEvent" (backward compatibility)
384  CHECK(m_evtStore->setAlias(pOverEvent, "OverlayEvent"));
385 
386  //FIXME at this point one may want to look into the original event
387  //FIXME to decide whether to skip it or to do the pile-up
388 
390  bool needupdate;
391  float sf = m_beamLumi->scaleFactor( pOverEvent->runNumber(), pOverEvent->lumiBlock(), needupdate );
392  float currentaveragemu(sf*m_maxCollPerXing);
393  pOverEvent->setAverageInteractionsPerCrossing(currentaveragemu);
394  //FIXME check whether actualInteractionsPerCrossing should be set
395  //to mu for the central bunch crossing, as below, or whether it
396  //should be set to the actual number of minbias piled-up in the
397  //central bunch crossing for this particular event.
398  pOverEvent->setActualInteractionsPerCrossing(m_beamInt->normFactor(0)*currentaveragemu);
399  ATH_MSG_DEBUG ( "BCID = "<< t0BCID <<
400  ", mu =" << pOverEvent->actualInteractionsPerCrossing() <<
401  ", <mu> =" << pOverEvent->averageInteractionsPerCrossing() );
404  while (cacheIterator != endOfCaches) {
405  if (needupdate) {
406  (*cacheIterator)->resetEvtsPerXingScaleFactor(sf);//set cache scale factor. some caches should ignore it?
407  }
408  (*cacheIterator++)->newEvent(); //inform cache we overlay a new event
409  }
410  //-----------------------------------------------------------------------
411  // loop over x-ings
412  //-----------------------------------------------------------------------
413  for (int iXing=m_firstXing; iXing<=m_lastXing; iXing++) {
414  // if (m_xingByXing.value()) test that PileUpToolsAlg is there?
415  //-----------------------------------------------------------------------
416  // Read input events in bkg stores and link them to overlay store
417  //-----------------------------------------------------------------------
418  int t0BinCenter((int)m_xingFreq*iXing);
419  unsigned int currentBCID = getBCID((t0BinCenter/25), t0BCID); //Should account for m_xingFreq>25. FIXME - hardcoded 25ns
420  ATH_MSG_VERBOSE ( "Background BCID =" << currentBCID );
421  cacheIterator = m_caches.begin();
422  while (cacheIterator != endOfCaches) {
423  // Now set the BCID for background events - also requires changes to PileUpEventInfo, SubEvent
424  if (((*cacheIterator)->addSubEvts(iXing-m_firstXing, pOverEvent, t0BinCenter, m_loadProxies, currentBCID)).isFailure()) {
425  //if (((*cacheIterator)->addSubEvts(iXing-m_firstXing, *pOverEvent, t0BinCenter)).isFailure()) {
426  if (maxevt == -1 && m_allowSubEvtsEOF) {
427  ATH_MSG_INFO ( "No more sub events for " << cacheIterator->name() );
428  return StatusCode::SUCCESS;
429  }
430  else {
431  ATH_MSG_FATAL ( "Error adding sub events to " << cacheIterator->name() );
432  return StatusCode::FAILURE;
433  }
434  }
435  ++cacheIterator;
436  }
437  } //loop over xings
438 
439  // Calculate/copy pile-up hash
440  PileUpHashHelper pileUpHashHelper;
441 
442  pileUpHashHelper.addToHashSource(pOverEvent);
443 
444  ATH_MSG_VERBOSE ( "Pile-up hash source:" << pileUpHashHelper.hashSource() );
445 
446  // Calculate and set hash
447  uuid_t pileUpHash;
448  pileUpHashHelper.calculateHash(pileUpHash);
449 
451 
452  ATH_MSG_DEBUG("PileUpMixtureID = " << pOverEvent->pileUpMixtureID());
453 
454  //set active store back to the overlaid one
455  m_evtStore->makeCurrent();
456 
457  // Execute event for all required algorithms. The overlaid event
458  // (PileUpEventInfo) is considered to be current
459  if (m_skipExecAlgs) {
460  ATH_MSG_INFO ( "Firing reseed incident (" << pOverEvent->eventNumber() << "," << pOverEvent->runNumber() << ")" );
461  m_incidentSvc->fireIncident(ContextIncident<std::pair<unsigned,unsigned> >(this->name(),"ReseedIncident",std::pair<unsigned,unsigned>(pOverEvent->eventNumber(),pOverEvent->runNumber())));
462  m_incidentSvc->fireIncident(Incident(this->name(),"AfterReseedIncident"));
463  ATH_MSG_INFO ( "Not going to process this event" );
464  }
465  else {
466  if ( !(executeEvent( std::move(ctx) ).isSuccess()) ) {
467  ATH_MSG_ERROR ( "Terminating event processing loop due to errors" );
468  return StatusCode::FAILURE;
469  }
470  else {
471  ATH_MSG_INFO ( "Event processing successful." );
472  }
473  }
474  //if we are not doing overlap xing by xing clean up all stores at the end
475  //the clean up is done object by object and controlled by
476  //PileUpXingFolder.CacheRefreshFrequency property
477  if (!m_xingByXing.value()) {
478  // FIXME test that PileUpToolsAlg is NOT there?
479  //clear all stores as configured in
480  CHECK(m_mergeSvc->clearDataCaches());
481  ATH_MSG_DEBUG ( "Cleared data caches" );
482  }
483  CHECK(m_evtStore->clearStore());
484  } //end of event loop
485 
486  if (m_skipExecAlgs) {
487  m_nevt--;
488  }
489 
490  return StatusCode::SUCCESS;
491 
492 }
493 
495 {
496  int nevtsToAdvance = evt-m_ncurevt;
497  int nParam = m_nevt+1;
498  ATH_MSG_INFO ( "In PileUpEventLoopMgr::seek. m_ncurevt=" << m_ncurevt <<
499  " nevtsToAdvance=" << nevtsToAdvance );
500 
501  m_skipExecAlgs = true;
502  for (int i=0; i<nevtsToAdvance; ++i) {
504  m_loadProxies = (nevtsToAdvance==(i+1));
505  }
506  if (this->nextEvent(nParam).isFailure()) {
507  ATH_MSG_ERROR ( "Seek error! Failed to advance to evt=" << m_ncurevt+1 );
508  return StatusCode::FAILURE;
509  }
510  }
511  m_skipExecAlgs = false;
512  return StatusCode::SUCCESS;
513 }
514 
516 {
517  return m_nevt;
518 }
519 
520 //=========================================================================
521 // setup input and overlay selctors and iterators
522 //=========================================================================
525 {
526  //OK now we can run
527  // retrieve selector and setup iterator (the selector has been setup as an ExtService)
528  CHECK(m_origSel.retrieve());
529 
530  m_origStream = PileUpStream("OriginalEvent", serviceLocator(), &*m_origSel);
531  if (!m_origStream.setupStore()) {
532  ATH_MSG_ERROR ( "Can not setup original evt store " << m_origSel );
533  return StatusCode::FAILURE;
534  }
535 
536  //now get the bkg stream caches, and set them up
537  CHECK(m_caches.retrieve());
538  ATH_MSG_DEBUG ( "retrieved BkgStreamsCaches " << m_caches );
539 
542  unsigned int nXings(m_lastXing-m_firstXing+1);
543  unsigned int firstStore(0);
544  StatusCode sc(StatusCode::SUCCESS);
545  while ((cacheIterator != endOfCaches) && sc.isSuccess()) {
546  sc = (*cacheIterator)->setup(m_firstXing, nXings, firstStore, &*m_beamInt);
547  firstStore += (*cacheIterator)->nStores() ;
548  ++cacheIterator;
549  }
550  return sc;
551 }
552 
553 //=========================================================================
554 // Run the algorithms for the current event
555 //=========================================================================
557 {
558  // Call the execute() method of all top algorithms
559  for ( ListAlg::iterator ita = m_topAlgList.begin();
560  ita != m_topAlgList.end();
561  ++ita ) {
562  StatusCode sc = (*ita)->sysExecute( ctx );
563  // this duplicates what is already done in Algorithm::sysExecute, which
564  // calls Algorithm::setExecuted, but eventually we plan to remove that
565  // function
566  m_aess->algExecState(*ita, ctx ).setState(AlgExecState::State::Done, sc);
567  if ( !sc.isSuccess() ) {
568  ATH_MSG_INFO ( "Execution of algorithm " <<
569  (*ita)->name() << " failed with StatusCode::" << sc );
570  return sc;
571  }
572  }
573 
574  return StatusCode::SUCCESS;
575 }
576 
577 
578 //=========================================================================
579 // executeEvent(EventContext&& ctx)
580 //=========================================================================
582 {
584  if (m_firstRun || (m_currentRun != ctx.eventID().run_number())) {
585  // Fire EndRun incident unless this is the first run
586  if (!m_firstRun) {
587  m_incidentSvc->fireIncident(Incident(this->name(),IncidentType::EndRun));
588  }
589  m_firstRun = false;
590  m_currentRun = ctx.eventID().run_number();
591 
592  ATH_MSG_INFO ( " ===>>> start of run " << m_currentRun << " <<<===" );
593 
594  // Fire BeginRun "Incident"
595  m_incidentSvc->fireIncident(Incident(this->name(),IncidentType::BeginRun,ctx));
596  }
597 
598  bool eventFailed(false);
599  // Call the execute() method of all top algorithms
601 
602  if (!sc.isSuccess()) {
603  eventFailed = true;
604  m_aess->setEventStatus( EventStatus::AlgFail, ctx );
605 
609  if (m_failureMode == 1 && sc.isRecoverable()) {
610  ATH_MSG_WARNING ( "RECOVERABLE error returned by algorithm. " <<
611  "Skipping remaining algorithms." << std::endl <<
612  "\tNo output will be written for this event, " <<
613  "but job will continue to next event" );
614  eventFailed = false;
615  }
616 
618  if (m_failureMode >= 2) {
619  ATH_MSG_INFO ( "Skipping remaining algorithms." << std::endl <<
620  "\tNo output will be written for this event, " <<
621  "but job will continue to next event" );
622  eventFailed = false;
623  }
624  }
625  else {
626  m_aess->setEventStatus( EventStatus::Success, ctx );
627 
628  // Call the execute() method of all output streams
629  for (ListAlg::iterator ito = m_outStreamList.begin();
630  ito != m_outStreamList.end(); ++ito ) {
631  sc = (*ito)->sysExecute( ctx );
632  if ( !sc.isSuccess() ) {
633  eventFailed = true;
634  }
635  }
636  }
637 
638  //------------------------------------------------------------------------
639  // Check if there was an error processing current event
640  //------------------------------------------------------------------------
641  return eventFailed?StatusCode::FAILURE:StatusCode::SUCCESS;
642 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
PileUpHashHelper.h
A helper class to compute a hash of pile-up events.
xAOD::EventInfo_v1::setActualInteractionsPerCrossing
void setActualInteractionsPerCrossing(float value)
Set average interactions per crossing for the current BCID.
Definition: EventInfo_v1.cxx:391
python.tests.PyTestsLib.finalize
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
Definition: PyTestsLib.py:50
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
xAOD::EventInfo_v1::setEventNumber
void setEventNumber(uint64_t value)
Set the current event's event number.
PileUpEventLoopMgr::m_incidentSvc
ServiceHandle< IIncidentSvc > m_incidentSvc
Incident Service.
Definition: PileUpEventLoopMgr.h:86
PileUpEventLoopMgr::executeEvent
virtual StatusCode executeEvent(EventContext &&ctx) override
Definition: PileUpEventLoopMgr.cxx:581
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
xAOD::EventInfo_v1::eventNumber
uint64_t eventNumber() const
The current event's event number.
AthMsgStreamMacros.h
PileUpEventLoopMgr::~PileUpEventLoopMgr
virtual ~PileUpEventLoopMgr()
Standard Destructor.
Definition: PileUpEventLoopMgr.cxx:60
xAOD::EventInfo_v1::mcEventWeights
const std::vector< float > & mcEventWeights() const
The weights of all the MC events used in the simulation.
PileUpEventLoopMgr::curEvent
virtual int curEvent() const override
Definition: PileUpEventLoopMgr.cxx:515
PileUpEventLoopMgr::m_allowSerialAndMPToDiffer
Gaudi::Property< bool > m_allowSerialAndMPToDiffer
Definition: PileUpEventLoopMgr.h:130
ExtendedEventContext.h
initialize
void initialize()
Definition: run_EoverP.cxx:894
xAOD::EventInfo_v1::clearSubEvents
void clearSubEvents()
Clear all the currently held sub-events.
Definition: EventInfo_v1.cxx:647
EventInfoAuxContainer.h
PileUpEventLoopMgr::m_origSel
ServiceHandle< IEvtSelector > m_origSel
Definition: PileUpEventLoopMgr.h:94
PileUpHashHelper::uuidToPileUpMixtureId
static xAOD::EventInfo::PileUpMixtureID uuidToPileUpMixtureId(const uuid_t &hash)
Convert uuid_t to xAOD::EventInfo::PileUpMixtureID.
Definition: PileUpHashHelper.cxx:57
PileUpHashHelper
Definition: PileUpHashHelper.h:21
PileUpHashHelper::hashSource
std::string hashSource() const
Get the current hash base.
Definition: PileUpHashHelper.h:35
PileUpEventLoopMgr::m_xingFreq
Gaudi::Property< float > m_xingFreq
Definition: PileUpEventLoopMgr.h:109
LArG4FSStartPointFilter.evt
evt
Definition: LArG4FSStartPointFilter.py:42
PileUpEventLoopMgr::m_skipExecAlgs
bool m_skipExecAlgs
Definition: PileUpEventLoopMgr.h:146
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
PileUpEventLoopMgr::m_evtStore
ServiceHandle< StoreGateSvc > m_evtStore
output store
Definition: PileUpEventLoopMgr.h:92
PileUpEventLoopMgr::m_evinfName
Gaudi::Property< std::string > m_evinfName
Definition: PileUpEventLoopMgr.h:133
PileUpEventLoopMgr::executeAlgorithms
virtual StatusCode executeAlgorithms(const EventContext &ctx)
Run the algorithms for the current event.
Definition: PileUpEventLoopMgr.cxx:556
xAOD::EventInfo_v1::IS_SIMULATION
@ IS_SIMULATION
true: simulation, false: data
Definition: EventInfo_v1.h:151
EventContextClid.h
Assign a CLID to EventContext.
PileUpEventLoopMgr::m_origStream
PileUpStream m_origStream
Input Stream.
Definition: PileUpEventLoopMgr.h:89
xAOD::EventInfo_v1::runNumber
uint32_t runNumber() const
The current event's run number.
xAOD::EventInfo_v1::pileUpMixtureID
PileUpMixtureID pileUpMixtureID() const
Unique pile-up mixture identifier.
Definition: EventInfo_v1.cxx:421
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
EventInfoContainer.h
xAOD::EventInfo_v1::mcChannelNumber
uint32_t mcChannelNumber() const
The MC generator's channel number.
EventInfoFromxAOD.h
xAOD::EventInfo_v1::setPileUpMixtureID
void setPileUpMixtureID(const PileUpMixtureID &value)
Set unique pile-up mixture identifier.
Definition: EventInfo_v1.cxx:436
PileUpStream::nextEventPre
const xAOD::EventInfo * nextEventPre(bool readRecord=true)
return next Event, load store with next Event
Definition: PileUpStream.cxx:193
PileUpStream::finalize
StatusCode finalize()
finalize and release store. To be called on ... finalize()
Definition: PileUpStream.cxx:232
PileUpEventLoopMgr::m_ncurevt
int m_ncurevt
Definition: PileUpEventLoopMgr.h:145
PileUpEventLoopMgr::m_mergeSvc
ServiceHandle< PileUpMergeSvc > m_mergeSvc
Definition: PileUpEventLoopMgr.h:102
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
xAOD::EventInfo_v1::setMCEventNumber
void setMCEventNumber(uint64_t value)
Set the MC generator's event number.
xAOD::EventInfo_v1::setEventTypeBitmask
void setEventTypeBitmask(uint32_t value)
Set the event type bitmask.
PileUpEventLoopMgr::m_allowSubEvtsEOF
Gaudi::Property< bool > m_allowSubEvtsEOF
Definition: PileUpEventLoopMgr.h:119
lumiFormat.i
int i
Definition: lumiFormat.py:85
PileUpEventLoopMgr::PileUpEventLoopMgr
PileUpEventLoopMgr(const std::string &nam, ISvcLocator *svcLoc)
Standard Constructor.
Definition: PileUpEventLoopMgr.cxx:47
PileUpStream::setupStore
bool setupStore()
setup input and overlay selectors and iters
Definition: PileUpStream.cxx:98
Atlas::ExtendedEventContext
Definition: ExtendedEventContext.h:23
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
PileUpEventLoopMgr::seek
virtual StatusCode seek(int evt) override
Definition: PileUpEventLoopMgr.cxx:494
PileUpEventLoopMgr::m_evtIdModSvc
ServiceHandle< IEvtIdModifierSvc > m_evtIdModSvc
Definition: PileUpEventLoopMgr.h:104
PileUpEventLoopMgr::m_beamInt
ServiceHandle< IBeamIntensity > m_beamInt
Definition: PileUpEventLoopMgr.h:98
PileUpHashHelper::addToHashSource
void addToHashSource(const std::string &string)
Add a plain string to the stream.
Definition: PileUpHashHelper.cxx:11
PileUpEventLoopMgr::m_nevt
int m_nevt
Definition: PileUpEventLoopMgr.h:144
PileUpEventLoopMgr::nextEvent
virtual StatusCode nextEvent(int maxevt) override
Definition: PileUpEventLoopMgr.cxx:196
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
PileUpStream
a triple selector/context/store defines a stream
Definition: PileUpStream.h:32
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
PileUpEventLoopMgr::m_evinfContName
Gaudi::Property< std::string > m_evinfContName
Definition: PileUpEventLoopMgr.h:135
PileUpEventLoopMgr::setupStreams
StatusCode setupStreams()
setup input and overlay selectors and iters
Definition: PileUpEventLoopMgr.cxx:524
xAOD::EventInfo_v1::setTimeStamp
void setTimeStamp(uint32_t value)
Set the POSIX time of the event.
xAOD::EventInfo_v1::setBCID
void setBCID(uint32_t value)
Set the bunch crossing ID of the event.
DataVector
Derived DataVector<T>.
Definition: DataVector.h:795
xAOD::EventInfo_v1::lumiBlock
uint32_t lumiBlock() const
The current event's luminosity block number.
PileUpEventLoopMgr::m_mcChannelNumber
Gaudi::Property< uint32_t > m_mcChannelNumber
Definition: PileUpEventLoopMgr.h:137
PileUpStream::store
StoreGateSvc & store()
Definition: PileUpStream.h:57
PileUpEventLoopMgr::m_firstXing
Gaudi::Property< int > m_firstXing
Definition: PileUpEventLoopMgr.h:111
xAOD::EventInfoAuxContainer_v1
Auxiliary information about the pileup events.
Definition: EventInfoAuxContainer_v1.h:31
PileUpEventLoopMgr::getBCID
unsigned int getBCID(int bunchXing, unsigned int centralBCID) const
return the 'fake BCID' corresponding to bunchXing
Definition: PileUpEventLoopMgr.h:80
xAOD::EventInfo_v1::averageInteractionsPerCrossing
float averageInteractionsPerCrossing() const
Average interactions per crossing for all BCIDs - for out-of-time pile-up.
Definition: EventInfo_v1.cxx:397
PileUpEventLoopMgr::m_maxCollPerXing
Gaudi::Property< float > m_maxCollPerXing
Definition: PileUpEventLoopMgr.h:115
EventAuxInfo.h
PileUpEventLoopMgr::m_firstRun
bool m_firstRun
Definition: PileUpEventLoopMgr.h:142
python.EventInfoMgtInit.release
release
Definition: EventInfoMgtInit.py:23
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
errorcheck.h
Helpers for checking error return status codes and reporting errors.
xAOD::EventInfo_v1::setAverageInteractionsPerCrossing
void setAverageInteractionsPerCrossing(float value)
Set average interactions per crossing for all BCIDs.
Definition: EventInfo_v1.cxx:408
PileUpEventLoopMgr.h
The ATLAS event loop for pile-up applications.
PileUpEventLoopMgr::finalize
virtual StatusCode finalize() override
Definition: PileUpEventLoopMgr.cxx:139
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
xAOD::EventInfo_v1::setMCChannelNumber
void setMCChannelNumber(uint32_t value)
Set the MC generator's channel number.
PileUpEventLoopMgr::m_caches
ToolHandleArray< IBkgStreamsCache > m_caches
Definition: PileUpEventLoopMgr.h:117
xAOD::EventInfo_v1::Signal
@ Signal
The signal event.
Definition: EventInfo_v1.h:266
PileUpEventLoopMgr::initialize
virtual StatusCode initialize() override
Definition: PileUpEventLoopMgr.cxx:65
PileUpEventLoopMgr::m_xingByXing
Gaudi::Property< bool > m_xingByXing
Definition: PileUpEventLoopMgr.h:122
mapkey::sf
@ sf
Definition: TElectronEfficiencyCorrectionTool.cxx:38
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAOD::EventInfo_v1::setRunNumber
void setRunNumber(uint32_t value)
Set the current event's run number.
PileUpMergeSvc.h
the preferred mechanism to access information from the different event stores in a pileup job.
IBeamIntensity.h
provides the relative beam intensity as a function of the bunch xing.
PileUpEventLoopMgr::m_currentRun
uint32_t m_currentRun
current run number
Definition: PileUpEventLoopMgr.h:141
DEBUG
#define DEBUG
Definition: page_access.h:11
PileUpEventLoopMgr::m_aess
SmartIF< IAlgExecStateSvc > m_aess
Reference to the Algorithm Execution State Svc.
Definition: PileUpEventLoopMgr.h:69
PileUpHashHelper::calculateHash
void calculateHash(uuid_t &hash) const
Calculate the hash.
Definition: PileUpHashHelper.cxx:49
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
PileUpEventLoopMgr::m_lastXing
Gaudi::Property< int > m_lastXing
Definition: PileUpEventLoopMgr.h:113
CxxUtils::atoi
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...
Definition: Control/CxxUtils/Root/StringUtils.cxx:85
IBkgStreamsCache.h
Interface to in-memory cache for pileup events.
xAOD::EventInfo_v1::setLumiBlock
void setLumiBlock(uint32_t value)
Set the current event's luminosity block number.
xAOD::EventInfo_v1::subEvents
const std::vector< SubEvent > & subEvents() const
Get the pileup events that were used in the simulation.
Definition: EventInfo_v1.cxx:596
xAOD::EventInfo_v1::bcid
uint32_t bcid() const
The bunch crossing ID of the event.
StoreGateSvc.h
PileUpEventLoopMgr::m_failureMode
Gaudi::Property< int > m_failureMode
Definition: PileUpEventLoopMgr.h:125
IBeamLuminosity.h
provides the relative beam luminosity as a function of the bunch xing.
addSubEvent
xAOD::EventInfo * addSubEvent(xAOD::EventInfo *targetEv, const xAOD::EventInfo::SubEvent &subev, xAOD::EventInfoContainer *eiContainer, const std::string &eiContKey, StoreGateSvc *subev_store=nullptr)
Definition: PileUpMisc.cxx:18
PileUpEventLoopMgr::modifyEventContext
void modifyEventContext(EventContext &ctx, const EventID &eID, bool consume_modifier_stream)
Definition: PileUpEventLoopMgr.cxx:169
xAOD::EventInfo_v1::mcEventNumber
uint64_t mcEventNumber() const
The MC generator's event number.
xAOD::EventInfo_v1::setMCEventWeights
void setMCEventWeights(const std::vector< float > &value)
Set the weights of all the MC events used in the simulation.
xAOD::EventInfo_v1::actualInteractionsPerCrossing
float actualInteractionsPerCrossing() const
Average interactions per crossing for the current BCID - for in-time pile-up.
Definition: EventInfo_v1.cxx:380
PileUpEventLoopMgr::m_beamLumi
ServiceHandle< IBeamLuminosity > m_beamLumi
Definition: PileUpEventLoopMgr.h:100
PileUpEventLoopMgr::m_loadProxies
bool m_loadProxies
Definition: PileUpEventLoopMgr.h:147