ATLAS Offline Software
PileUpEventLoopMgr.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 
6 // Class header
7 #include "PileUpEventLoopMgr.h"
8 
9 // Athena includes
15 
16 #include "EventInfo/EventID.h" // OLD EDM
17 #include "EventInfo/EventType.h" // OLD EDM
18 #include "EventInfo/EventInfo.h" // OLD EDM
19 
24 #include "PileUpTools/PileUpMisc.h"
26 
27 #include "StoreGate/StoreGateSvc.h"
28 
29 #include "xAODEventInfo/EventInfo.h" // NEW EDM
30 #include "xAODEventInfo/EventAuxInfo.h" // NEW EDM
31 #include "xAODEventInfo/EventInfoContainer.h" // NEW EDM
32 #include "xAODEventInfo/EventInfoAuxContainer.h" // NEW EDM
33 
34 // xAOD include(s):
36 
37 // Gaudi headers
38 #include "GaudiKernel/IAlgorithm.h"
39 #include "GaudiKernel/IEvtSelector.h"
40 #include "GaudiKernel/IIncidentSvc.h"
41 #include "GaudiKernel/Incident.h"
42 #include "GaudiKernel/DataIncident.h" // For ContextIncident
43 #include "GaudiKernel/EventContext.h"
44 #include "GaudiKernel/ThreadLocalContext.h"
45 #include "GaudiKernel/Algorithm.h"
46 
47 // std library headers
48 #include <cmath>
49 
50 //=========================================================================
51 // Standard Constructor
52 //=========================================================================
54  ISvcLocator* svcLoc)
55  : MinimalEventLoopMgr(name, svcLoc)
56  , AthMessaging (name)
57  , m_incidentSvc("IncidentSvc", name) //FIXME should this be configurable?
58  , m_mergeSvc("PileUpMergeSvc", name)
59  , m_evtStore("StoreGateSvc/StoreGateSvc", name)
60  , m_evtIdModSvc("", name)
61  , m_origSel("EventSelector", name)
62  , m_signalSel("", name)
63  , m_caches(this)
64  , m_maxCollPerXing(23.0)
65  , m_xingFreq(25)
66  , m_firstXing(-2)
67  , m_lastXing(+1)
68  , m_allowSubEvtsEOF(true)
69  , m_xingByXing(false)
70  , m_failureMode(1)
71  , m_evinfName( c_pileUpEventInfoObjName )
72  , m_evinfContName( c_pileUpEventInfoContName )
73  , m_beamInt("FlatBM", name)
74  , m_beamLumi("LumiProfileSvc", name)
75  , m_currentRun(0)
76  , m_firstRun(true)
77  , m_maxBunchCrossingPerOrbit(3564)
78  , m_nevt(0)
79  , m_ncurevt(0)
80  , m_skipExecAlgs(false)
81  , m_loadProxies(true)
82  , m_allowSerialAndMPToDiffer(true)
83 {
84  declareProperty("MaxBunchCrossingPerOrbit", m_maxBunchCrossingPerOrbit, "The number of slots in each LHC beam. Default: 3564.");
85  declareProperty("OrigSelector", m_origSel, "EventSelector for original (physics) events stream" );
86  declareProperty("SignalSelector", m_signalSel, "EventSelector for signal (hard-scatter) events stream" );
87  declareProperty("XingFrequency", m_xingFreq, "ns");
88  declareProperty("firstXing", m_firstXing, "time of first xing / XingFrequency (0th xing is 1st after trigger)");
89  declareProperty("lastXing", m_lastXing, "time of last xing / XingFrequency (0th xing is 1st after trigger)");
90  declareProperty("MaxMinBiasCollPerXing", m_maxCollPerXing, "Set to digitization numberOfCollisions prop. for variable-mu and RunDMC jobs.");
91  declareProperty("bkgCaches", m_caches, "list of tools managing bkg events");
92  declareProperty("AllowSubEvtsEOF", m_allowSubEvtsEOF, "if true(default) an EOF condition in the BkgStreamsCaches is not considered to be an error IF maxevt=-1 (loop over all available events)");
93  declareProperty("XingByXing", m_xingByXing, "if set to true we will not cache bkg events from one xing to then next. This greatly increases the amount of I/O and greatly reduces the memory required to run a job");
94  declareProperty("FailureMode", m_failureMode,
95  "Controls behaviour of event loop depending on return code of"
96  " Algorithms. 0: all non-SUCCESSes terminate job. "
97  "1: RECOVERABLE skips to next event, FAILURE terminates job "
98  "(DEFAULT). 2: RECOVERABLE and FAILURE skip to next events");
99 
100  declareProperty("BeamInt", m_beamInt,
101  "The service providing the beam intensity distribution");
102  declareProperty("BeamLuminosity", m_beamLumi,
103  "The service providing the beam luminosity distribution vs. run");
104  declareProperty("PileUpMergeSvc", m_mergeSvc, "PileUp Merge Service");
105  declareProperty("EvtIdModifierSvc", m_evtIdModSvc, "ServiceHandle for EvtIdModifierSvc");
106  declareProperty("AllowSerialAndMPToDiffer", m_allowSerialAndMPToDiffer, "When set to False, this will allow the code to reproduce serial output in an AthenaMP job, albeit with a significant performance penalty.");
107  declareProperty("EventInfoName", m_evinfName, "SG key for the EventInfo object");
108  declareProperty("EventInfoContName", m_evinfContName, "SG key for the EventInfoContainer object");
109  // m_caches.push_back("BkgStreamsCache/MinBiasCache");
110 }
111 
112 //=========================================================================
113 // Standard Destructor
114 //=========================================================================
116 
117 //=========================================================================
118 // implementation of IAppMgrUI::initialize
119 //=========================================================================
121 {
122  ATH_MSG_INFO ( "Initializing " << this->name() ) ;
124  ATH_MSG_WARNING ( "AllowSerialAndMPToDiffer=False! This will incur serious performance penalties! But Serial and MP output will be the same." );
125  }
126 
127  //locate the StoreGateSvc and initialize our local ptr
128  CHECK(m_evtStore.retrieve());
129 
130  //reset output store proxy provider: we don't want to have one!
131  m_evtStore->setProxyProviderSvc(nullptr);
132 
133  //locate the IncidentSvc and initialize our local ptr
134  CHECK(m_incidentSvc.retrieve());
135 
136  //locate the PileUpMergeSvc and initialize our local ptr
137  CHECK(m_mergeSvc.retrieve());
138 
139  //-------------------------------------------------------------------------
140  // Setup Event Selector
141  //-------------------------------------------------------------------------
142  CHECK(this->setupStreams());
143 
144  // Get the value of SkipEvents. It is needed for seeking
145  SmartIF<IProperty> prpMgr(serviceLocator());
146  IEvtSelector* evtSelector{};
147  if (prpMgr.isValid()) {
148  // Get event selector name. Retrieve EventSelector
149  std::string evtSelName = prpMgr->getProperty("EvtSel").toString();
150  CHECK(serviceLocator()->service(evtSelName,evtSelector));
151  }
152  else {
153  ATH_MSG_ERROR ( "IProperty interface not found in ApplicationMgr" );
154  return StatusCode::FAILURE;
155  }
156 
157  SmartIF<IProperty> prpMgr1(evtSelector);
158  if (prpMgr1.isValid()) {
159  std::string skipEventsStr = prpMgr1->getProperty("SkipEvents").toString();
160  m_ncurevt = std::atoi(skipEventsStr.c_str());
161  }
162  else {
163  ATH_MSG_ERROR ( "IProperty interface not found on the event selector" );
164  return StatusCode::FAILURE;
165  }
166 
167  // Get the AlgExecStateSvc
168  m_aess = serviceLocator()->service("AlgExecStateSvc");
169  if (!m_aess.isValid()) {
170  ATH_MSG_FATAL ( "Error retrieving AlgExecStateSvc" );
171  return StatusCode::FAILURE;
172  }
173 
174  //--------------------------------------------------------------------------
175  // Set up the EventID modifier Service
176  //--------------------------------------------------------------------------
177  if( m_evtIdModSvc.empty() ) {
178  ATH_MSG_DEBUG ( "EventID modifier Service not set. No run number, ... overrides will be applied." );
179  }
180  else if ( !m_evtIdModSvc.retrieve().isSuccess() ) {
181  ATH_MSG_INFO ( "Could not find EventID modifier Service. No run number, ... overrides will be applied." );
182  }
183 
184  //-------------------------------------------------------------------------
185  // Base class initialize (done at the end to allow algs to access stores)
186  //-------------------------------------------------------------------------
187 
189 }
190 
191 //=========================================================================
192 // implementation of IAppMgrUI::finalize
193 //=========================================================================
195 {
196  ATH_MSG_INFO ( "Finalizing " << this->name() );
197 
198  //we need to release all our BkgStreamCaches
201  while (cacheIterator != endOfCaches) {
202  (*cacheIterator++)->release();
203  }
204  m_caches.clear();
205 
206  //and to clean up the store the stream owns
208 
210 }
211 
212 //=========================================================================
213 // implementation of IAppMgrUI::terminate
214 //=========================================================================
215 // StatusCode PileUpEventLoopMgr::terminate()
216 // {
217 // m_histoDataMgrSvc = releaseInterface(m_histoDataMgrSvc);
218 // m_histoPersSvc = releaseInterface(m_histoPersSvc);
219 // return MinimalEventLoopMgr::terminate();
220 // }
221 
222 
223 //---------------------------------------------------------------------------
224 void PileUpEventLoopMgr::modifyEventContext(EventContext& ctx, const EventID& eID, bool consume_modifier_stream) {
225 
226  if (m_evtIdModSvc.isSet()) {
227  EventID new_eID(eID);
228  // m_nevt - 1 because the PileUpEventLoopMgr increments it rather early
229  m_evtIdModSvc->modify_evtid(new_eID, m_ncurevt - 1, consume_modifier_stream);
230  if (msgLevel(MSG::DEBUG)) {
231  unsigned int oldrunnr=eID.run_number();
232  unsigned int oldLB=eID.lumi_block();
233  unsigned int oldTS=eID.time_stamp();
234  unsigned int oldTSno=eID.time_stamp_ns_offset();
235  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc runnr=" << oldrunnr << " -> " << new_eID.run_number() );
236  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc LB=" << oldLB << " -> " << new_eID.lumi_block() );
237  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc TimeStamp=" << oldTS << " -> " << new_eID.time_stamp() );
238  ATH_MSG_DEBUG ( "modifyEventContext: use evtIdModSvc TimeStamp ns Offset=" << oldTSno << " -> " << new_eID.time_stamp_ns_offset() );
239  }
240  ctx.setEventID(new_eID);
241  return;
242  }
243 
244  ctx.setEventID( eID );
245 }
246 
247 
248 //=========================================================================
249 // implementation of IAppMgrUI::nextEvent
250 //=========================================================================
252 {
253  // make nextEvent(0) a dummy call, as needed by athenaMP
254  if (0 == maxevt) {
255  return StatusCode::SUCCESS;
256  }
257 
258 
259  // These following two initialization loops are performed here in case new
260  // Top level Algorithms or Output Streams have been created interactively
261  // at run-time instead of configuration time. Note also that it is possible
262  // that some newly created Algorithms are still not initialized as a result
263  // of these loops (e.g. where the membership of an existing Sequencer is
264  // changed at run-time. In this case, the Algorithm::sysExecute() function
265  // will ensure that the Algorithm is correctly initialized. This mechanism
266  // actually makes loops redundant, but they do provide a well defined
267  // location for the initialization to take place in the non-interactive case.
268 
269  // Initialize the list of Algorithms. Note that existing Algorithms
270  // are protected against multiple initialization attempts.
271  ListAlg::iterator ita;
272  for ( ita = m_topAlgList.begin(); ita != m_topAlgList.end(); ++ita ) {
273  if( !((*ita)->sysInitialize()).isSuccess() ) {
274  ATH_MSG_ERROR ( "Unable to initialize Algorithm: " <<
275  (*ita)->name() );
276  return StatusCode::FAILURE;
277  }
278  }
279 
280  // Initialize the list of Output Streams. Note that existing Output Streams
281  // are protected against multiple initialization attempts.
282  for (ita = m_outStreamList.begin(); ita != m_outStreamList.end(); ++ita ) {
283  if( !((*ita)->sysInitialize()).isSuccess() ) {
284  ATH_MSG_ERROR ( "Unable to initialize Output Stream: " <<
285  (*ita)->name() );
286  return StatusCode::FAILURE;
287  }
288  }
289 
290  const xAOD::EventInfo *inputEventInfo{};
291 
292  // loop over events if the maxevt (received as input) is different from -1.
293  // if evtmax is -1 it means infinite loop
294  while( (maxevt == -1 || m_nevt < maxevt) &&
295  0 != (inputEventInfo = m_origStream.nextEventPre()) ) {
296  // Check if there is a scheduled stop issued by some algorithm/sevice
297  if ( m_scheduledStop ) {
298  m_scheduledStop = false;
299  ATH_MSG_ALWAYS ( "A stopRun was requested. Terminating event loop." );
300  break;
301  }
302  ++m_nevt; ++m_ncurevt;
303 
304  //-----------------------------------------------------------------------
305  // Setup overlaid event in the event store
306  //-----------------------------------------------------------------------
307 
308  xAOD::EventInfo *pOverEvent = new xAOD::EventInfo();
309  xAOD::EventAuxInfo *pOverEventAux = new xAOD::EventAuxInfo();
310  pOverEvent->setStore( pOverEventAux );
311  ATH_MSG_DEBUG(" #subevents in the signal event =" << inputEventInfo->subEvents().size());
312 
313  // Copy the eventInfo data from origStream event
314  *pOverEvent = *inputEventInfo;
315  pOverEvent->clearSubEvents(); // start clean without any subevents
316 
317  // Propagate MC metadata
318  if (pOverEvent->mcChannelNumber() == 0) {
319  if (m_mcChannelNumber.value() != 0) {
320  ATH_MSG_WARNING("Input mcChannelNumber is 0, setting it to " << m_mcChannelNumber.value());
321  pOverEvent->setMCChannelNumber(m_mcChannelNumber.value());
322  } else {
323  ATH_MSG_WARNING("Input mcChannelNumber is 0");
324  }
325  } else {
326  if (m_mcChannelNumber.value() != 0 && pOverEvent->mcChannelNumber() != m_mcChannelNumber.value()) {
327  ATH_MSG_WARNING("Input mcChannelNumber (" << pOverEvent->mcChannelNumber()
328  << ") and provided mcChannelNumber (" << m_mcChannelNumber.value() << ") do not match.");
329  }
330  }
331 
332  if (pOverEvent->mcEventNumber() == 0) {
333  if (pOverEvent->eventNumber() != 0) {
334  ATH_MSG_WARNING("Input mcEventNumber is 0, setting it to match the eventNumber (" << pOverEvent->eventNumber() << ")");
335  pOverEvent->setMCEventNumber(pOverEvent->eventNumber());
336  } else {
337  ATH_MSG_ERROR("Input eventNumber and mcEventNumber are 0");
338  return StatusCode::FAILURE;
339  }
340  }
341 
342  if (pOverEvent->mcEventWeights().empty()) {
343  ATH_MSG_ERROR("Input mcEventWeights are empty. This should not happen.");
344  return StatusCode::FAILURE;
345  }
346 
347  // Record the xAOD object(s):
348  CHECK( m_evtStore->record( pOverEventAux, m_evinfName + "Aux." ) );
349  CHECK( m_evtStore->record( pOverEvent, m_evinfName ) );
350  pOverEvent->setEvtStore( &*m_evtStore );
351  // Create an EventInfoContainer for the pileup events:
354  puei->setStore( puaux );
355 
356  // Record the EI container object(s):
357  CHECK( m_evtStore->record( puei, m_evinfContName ) );
358  CHECK( m_evtStore->record( puaux, m_evinfContName+"Aux." ) );
359 
360  // Setup the EventContext.
361  // Ensure that the overridden run number etc. is being used
362  EventContext ctx;
363  EventID ev_id = eventIDFromxAOD( pOverEvent );
364  bool consume_modifier_stream = false; // FIXME/CHECK: was true inside TP converter and checks for active storegate
365  // kludge FIXME
367  if ( pAttrList != nullptr && pAttrList->size() > 6 ) {
368  // Ideally we would create the initial EventID from the TAG
369  // information, but not doing that (yet?). For now using the
370  // presence of TAG information in the HITS file to indicate that
371  // the EvtIdModifierSvc has not already been called for this
372  // Athena event.
373  consume_modifier_stream = true;
374  }
375  ctx.set(m_nevt,0);
376  modifyEventContext(ctx, ev_id, consume_modifier_stream);
378  ctx.setExtension( Atlas::ExtendedEventContext(m_evtStore->hiveProxyDict(),
379  ctx.eventID().run_number()) );
380  Gaudi::Hive::setCurrentContext( ctx );
381  m_aess->reset(ctx);
382  // make copy to std::move into store
383  auto puctx =std::make_unique<EventContext> ( ctx );
384  if (m_evtStore->record( std::move(puctx) ,"EventContext").isFailure()) {
385  ATH_MSG_ERROR ( "Error recording event context object" );
386  return StatusCode::FAILURE;
387  }
388 
389  //Update run number, event number, lumi block and timestamp from EventContext
390  pOverEvent->setRunNumber( ctx.eventID().run_number() );
391  pOverEvent->setEventNumber( ctx.eventID().event_number() );
392  pOverEvent->setLumiBlock( ctx.eventID().lumi_block() );
393  pOverEvent->setTimeStamp( ctx.eventID().time_stamp() );
394  ATH_MSG_DEBUG( "Updated pOverEvent " << *pOverEvent );
395 
396  ATH_MSG_INFO ( "nextEvent(): overlaying original event " <<
397  pOverEvent->runNumber() << '/' <<
398  pOverEvent->eventNumber() << '/' <<
399  pOverEvent->lumiBlock() );
400 
401  //ask the BeamIntensitySvc to choose (and remember)
402  //in which xing this event will be wrto the beam int distribution
403  m_beamInt->selectT0(ctx.eventID().run_number(), ctx.eventID().event_number());
404 
405  // Use the position in the beam intensity array to set a BCID-like quantity
406  pOverEvent->setBCID( m_beamInt->getCurrentT0BunchCrossing() );
407 
408  unsigned int t0BCID = pOverEvent->bcid();
409  ATH_MSG_VERBOSE ( "BCID =" << t0BCID );
410 
411  // pOvrEt->set_user_type("Overlaid"); //FIXME ?? MN: ?? what to do with that
412 
413  // Overlay RDO files should be treated like data for reco
414  // purposes, so only set this for SimHit level pile-up.
415  pOverEvent->setEventTypeBitmask( inputEventInfo->eventTypeBitmask() | xAOD::EventInfo::IS_SIMULATION );
416 
417  // register as sub event of the overlaid
418  bool addpEvent(true);
419 
420  ATH_MSG_DEBUG( "inputEventInfo->evtStore()="<<inputEventInfo->evtStore()<<", pOverEvent->evtStore()=" << pOverEvent->evtStore()<<", &m_origStream.store()="<<&m_origStream.store() );
421  if ( addpEvent ) {
422  xAOD::EventInfo* newEv=addSubEvent(pOverEvent, inputEventInfo, 0, xAOD::EventInfo::Signal, puei, m_evinfContName );
423  if(newEv->evtStore()==nullptr) newEv->setEvtStore(&m_origStream.store());
424  newEv->setRunNumber( ctx.eventID().run_number() );
425  newEv->setEventNumber( ctx.eventID().event_number() );
426  newEv->setLumiBlock( ctx.eventID().lumi_block() );
427  newEv->setTimeStamp( ctx.eventID().time_stamp() );
428  ATH_MSG_DEBUG( "Added inputEventInfo="<<inputEventInfo<<" as subEvent "<<newEv<<" to pOverEvent " << pOverEvent );
429  ATH_MSG_DEBUG( " afterwards: newEv->evtStore()="<<newEv->evtStore()<<", pOverEvent->evtStore()=" << pOverEvent->evtStore() );
430  ATH_MSG_DEBUG( " pOverEvent->subEvents()[0].ptr()="<<pOverEvent->subEvents()[0].ptr()<<" content="<<*pOverEvent->subEvents()[0].ptr()<<" store="<< pOverEvent->subEvents()[0].ptr()->evtStore() );
431  }
432 
433  ATH_MSG_INFO ( "set aliases" );
434  //add an alias to "OverlayEvent" (backward compatibility)
435  CHECK(m_evtStore->setAlias(pOverEvent, "OverlayEvent"));
436 
437  //FIXME at this point one may want to look into the original event
438  //FIXME to decide whether to skip it or to do the pile-up
439 
441  bool needupdate;
442  float sf = m_beamLumi->scaleFactor( pOverEvent->runNumber(), pOverEvent->lumiBlock(), needupdate );
443  float currentaveragemu(sf*m_maxCollPerXing);
444  pOverEvent->setAverageInteractionsPerCrossing(currentaveragemu);
445  //FIXME check whether actualInteractionsPerCrossing should be set
446  //to mu for the central bunch crossing, as below, or whether it
447  //should be set to the actual number of minbias piled-up in the
448  //central bunch crossing for this particular event.
449  pOverEvent->setActualInteractionsPerCrossing(m_beamInt->normFactor(0)*currentaveragemu);
450  ATH_MSG_DEBUG ( "BCID = "<< t0BCID <<
451  ", mu =" << pOverEvent->actualInteractionsPerCrossing() <<
452  ", <mu> =" << pOverEvent->averageInteractionsPerCrossing() );
455  while (cacheIterator != endOfCaches) {
456  if (needupdate) {
457  (*cacheIterator)->resetEvtsPerXingScaleFactor(sf);//set cache scale factor. some caches should ignore it?
458  }
459  (*cacheIterator++)->newEvent(); //inform cache we overlay a new event
460  }
461  //-----------------------------------------------------------------------
462  // loop over x-ings
463  //-----------------------------------------------------------------------
464  for (int iXing=m_firstXing; iXing<=m_lastXing; iXing++) {
465  // if (m_xingByXing.value()) test that PileUpToolsAlg is there?
466  //-----------------------------------------------------------------------
467  // Read input events in bkg stores and link them to overlay store
468  //-----------------------------------------------------------------------
469  int t0BinCenter((int)m_xingFreq*iXing);
470  unsigned int currentBCID = getBCID((t0BinCenter/25), t0BCID); //Should account for m_xingFreq>25. FIXME - hardcoded 25ns
471  ATH_MSG_VERBOSE ( "Background BCID =" << currentBCID );
472  cacheIterator = m_caches.begin();
473  while (cacheIterator != endOfCaches) {
474  // Now set the BCID for background events - also requires changes to PileUpEventInfo, SubEvent
475  if (((*cacheIterator)->addSubEvts(iXing-m_firstXing, pOverEvent, t0BinCenter, m_loadProxies, currentBCID)).isFailure()) {
476  //if (((*cacheIterator)->addSubEvts(iXing-m_firstXing, *pOverEvent, t0BinCenter)).isFailure()) {
477  if (maxevt == -1 && m_allowSubEvtsEOF) {
478  ATH_MSG_INFO ( "No more sub events for " << cacheIterator->name() );
479  return StatusCode::SUCCESS;
480  }
481  else {
482  ATH_MSG_FATAL ( "Error adding sub events to " << cacheIterator->name() );
483  return StatusCode::FAILURE;
484  }
485  }
486  ++cacheIterator;
487  }
488  } //loop over xings
489 
490  // Calculate/copy pile-up hash
491  PileUpHashHelper pileUpHashHelper;
492 
493  pileUpHashHelper.addToHashSource(pOverEvent);
494 
495  ATH_MSG_VERBOSE ( "Pile-up hash source:" << pileUpHashHelper.hashSource() );
496 
497  // Calculate and set hash
498  uuid_t pileUpHash;
499  pileUpHashHelper.calculateHash(pileUpHash);
500 
502 
503  ATH_MSG_DEBUG("PileUpMixtureID = " << pOverEvent->pileUpMixtureID());
504 
505  //set active store back to the overlaid one
506  m_evtStore->makeCurrent();
507 
508  // Execute event for all required algorithms. The overlaid event
509  // (PileUpEventInfo) is considered to be current
510  if (m_skipExecAlgs) {
511  ATH_MSG_INFO ( "Firing reseed incident (" << pOverEvent->eventNumber() << "," << pOverEvent->runNumber() << ")" );
512  m_incidentSvc->fireIncident(ContextIncident<std::pair<unsigned,unsigned> >(this->name(),"ReseedIncident",std::pair<unsigned,unsigned>(pOverEvent->eventNumber(),pOverEvent->runNumber())));
513  m_incidentSvc->fireIncident(Incident(this->name(),"AfterReseedIncident"));
514  ATH_MSG_INFO ( "Not going to process this event" );
515  }
516  else {
517  if ( !(executeEvent( std::move(ctx) ).isSuccess()) ) {
518  ATH_MSG_ERROR ( "Terminating event processing loop due to errors" );
519  return StatusCode::FAILURE;
520  }
521  else {
522  ATH_MSG_INFO ( "Event processing successful." );
523  }
524  }
525  //if we are not doing overlap xing by xing clean up all stores at the end
526  //the clean up is done object by object and controlled by
527  //PileUpXingFolder.CacheRefreshFrequency property
528  if (!m_xingByXing.value()) {
529  // FIXME test that PileUpToolsAlg is NOT there?
530  //clear all stores as configured in
531  CHECK(m_mergeSvc->clearDataCaches());
532  ATH_MSG_DEBUG ( "Cleared data caches" );
533  }
534  CHECK(m_evtStore->clearStore());
535  } //end of event loop
536 
537  if (m_skipExecAlgs) {
538  m_nevt--;
539  }
540 
541  return StatusCode::SUCCESS;
542 
543 }
544 
546 {
547  int nevtsToAdvance = evt-m_ncurevt;
548  int nParam = m_nevt+1;
549  ATH_MSG_INFO ( "In PileUpEventLoopMgr::seek. m_ncurevt=" << m_ncurevt <<
550  " nevtsToAdvance=" << nevtsToAdvance );
551 
552  m_skipExecAlgs = true;
553  for (int i=0; i<nevtsToAdvance; ++i) {
555  m_loadProxies = (nevtsToAdvance==(i+1));
556  }
557  if (this->nextEvent(nParam).isFailure()) {
558  ATH_MSG_ERROR ( "Seek error! Failed to advance to evt=" << m_ncurevt+1 );
559  return StatusCode::FAILURE;
560  }
561  }
562  m_skipExecAlgs = false;
563  return StatusCode::SUCCESS;
564 }
565 
567 {
568  return m_nevt;
569 }
570 
571 //=========================================================================
572 // setup input and overlay selctors and iterators
573 //=========================================================================
576 {
577  //OK now we can run
578  // retrieve selector and setup iterator (the selector has been setup as an ExtService)
579  CHECK(m_origSel.retrieve());
580 
581  m_origStream = PileUpStream("OriginalEvent", serviceLocator(), &*m_origSel);
582  if (!m_origStream.setupStore()) {
583  ATH_MSG_ERROR ( "Can not setup original evt store " << m_origSel );
584  return StatusCode::FAILURE;
585  }
586 
587  //now get the bkg stream caches, and set them up
588  CHECK(m_caches.retrieve());
589  ATH_MSG_DEBUG ( "retrieved BkgStreamsCaches " << m_caches );
590 
593  unsigned int nXings(m_lastXing-m_firstXing+1);
594  unsigned int firstStore(0);
595  StatusCode sc(StatusCode::SUCCESS);
596  while ((cacheIterator != endOfCaches) && sc.isSuccess()) {
597  sc = (*cacheIterator)->setup(m_firstXing, nXings, firstStore, &*m_beamInt);
598  firstStore += (*cacheIterator)->nStores() ;
599  ++cacheIterator;
600  }
601  return sc;
602 }
603 
604 //=========================================================================
605 // Run the algorithms for the current event
606 //=========================================================================
608 {
609  // Call the execute() method of all top algorithms
610  for ( ListAlg::iterator ita = m_topAlgList.begin();
611  ita != m_topAlgList.end();
612  ++ita ) {
613  StatusCode sc = (*ita)->sysExecute( ctx );
614  // this duplicates what is already done in Algorithm::sysExecute, which
615  // calls Algorithm::setExecuted, but eventually we plan to remove that
616  // function
617  m_aess->algExecState(*ita, ctx ).setState(AlgExecState::State::Done, sc);
618  if ( !sc.isSuccess() ) {
619  ATH_MSG_INFO ( "Execution of algorithm " <<
620  (*ita)->name() << " failed with StatusCode::" << sc );
621  return sc;
622  }
623  }
624 
625  return StatusCode::SUCCESS;
626 }
627 
628 
629 //=========================================================================
630 // executeEvent(EventContext&& ctx)
631 //=========================================================================
633 {
635  if (m_firstRun || (m_currentRun != ctx.eventID().run_number())) {
636  // Fire EndRun incident unless this is the first run
637  if (!m_firstRun) {
638  m_incidentSvc->fireIncident(Incident(this->name(),IncidentType::EndRun));
639  }
640  m_firstRun = false;
641  m_currentRun = ctx.eventID().run_number();
642 
643  ATH_MSG_INFO ( " ===>>> start of run " << m_currentRun << " <<<===" );
644 
645  // Fire BeginRun "Incident"
646  m_incidentSvc->fireIncident(Incident(this->name(),IncidentType::BeginRun,ctx));
647  }
648 
649  bool eventFailed(false);
650  // Call the execute() method of all top algorithms
652 
653  if (!sc.isSuccess()) {
654  eventFailed = true;
655  m_aess->setEventStatus( EventStatus::AlgFail, ctx );
656 
660  if (m_failureMode == 1 && sc.isRecoverable()) {
661  ATH_MSG_WARNING ( "RECOVERABLE error returned by algorithm. " <<
662  "Skipping remaining algorithms." << std::endl <<
663  "\tNo output will be written for this event, " <<
664  "but job will continue to next event" );
665  eventFailed = false;
666  }
667 
669  if (m_failureMode >= 2) {
670  ATH_MSG_INFO ( "Skipping remaining algorithms." << std::endl <<
671  "\tNo output will be written for this event, " <<
672  "but job will continue to next event" );
673  eventFailed = false;
674  }
675  }
676  else {
677  m_aess->setEventStatus( EventStatus::Success, ctx );
678 
679  // Call the execute() method of all output streams
680  for (ListAlg::iterator ito = m_outStreamList.begin();
681  ito != m_outStreamList.end(); ++ito ) {
682  sc = (*ito)->sysExecute( ctx );
683  if ( !sc.isSuccess() ) {
684  eventFailed = true;
685  }
686  }
687  }
688 
689  //------------------------------------------------------------------------
690  // Check if there was an error processing current event
691  //------------------------------------------------------------------------
692  return eventFailed?StatusCode::FAILURE:StatusCode::SUCCESS;
693 }
694 
695 StatusCode PileUpEventLoopMgr::queryInterface(const InterfaceID& riid,void** ppvInterface)
696 {
697  if (IEventSeek::interfaceID().versionMatch(riid)) {
698  *ppvInterface = dynamic_cast<IEventSeek*>(this);
699  }
700  else {
701  // Interface is not directly available : try out a base class
702  return MinimalEventLoopMgr::queryInterface(riid, ppvInterface);
703  }
704  addRef();
705  return StatusCode::SUCCESS;
706 }
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
c_pileUpEventInfoContName
const std::string c_pileUpEventInfoContName
default value for the EventInfoContainer storing subevents for PileUp
Definition: PileUpMisc.h:15
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:53
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:97
xAOD::EventInfo
EventInfo_v1 EventInfo
Definition of the latest event info version.
Definition: IEventInfoCnvTool.h:17
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:115
xAOD::EventInfo_v1::mcEventWeights
const std::vector< float > & mcEventWeights() const
The weights of all the MC events used in the simulation.
PileUpEventLoopMgr::m_allowSerialAndMPToDiffer
Gaudi::Property< bool > m_allowSerialAndMPToDiffer
property: Default true.
Definition: PileUpEventLoopMgr.h:170
ExtendedEventContext.h
PileUpEventLoopMgr::m_signalSel
ServiceHandle< IEvtSelector > m_signalSel
Signal Event selector (for overlay).
Definition: PileUpEventLoopMgr.h:120
initialize
void initialize()
Definition: run_EoverP.cxx:894
xAOD::EventAuxInfo_v3
Auxiliary information about the event.
Definition: EventAuxInfo_v3.h:28
xAOD::EventInfo_v1::clearSubEvents
void clearSubEvents()
Clear all the currently held sub-events.
Definition: EventInfo_v1.cxx:647
EventInfoAuxContainer.h
PileUpEventLoopMgr::nextEvent
virtual StatusCode nextEvent(int maxevt)
implementation of IAppMgreUI::terminate
Definition: PileUpEventLoopMgr.cxx:251
PileUpEventLoopMgr::m_origSel
ServiceHandle< IEvtSelector > m_origSel
Original (Physics) Event selector (background for overlay).
Definition: PileUpEventLoopMgr.h:118
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
Xing frequency(ns);.
Definition: PileUpEventLoopMgr.h:127
EventType.h
This class provides general information about an event. It extends EventInfo with a list of sub-evts ...
LArG4FSStartPointFilter.evt
evt
Definition: LArG4FSStartPointFilter.py:42
PileUpEventLoopMgr::m_skipExecAlgs
bool m_skipExecAlgs
Definition: PileUpEventLoopMgr.h:164
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
PileUpEventLoopMgr::m_evtStore
ServiceHandle< StoreGateSvc > m_evtStore
output store
Definition: PileUpEventLoopMgr.h:106
PileUpEventLoopMgr::m_evinfName
Gaudi::Property< std::string > m_evinfName
SG key for the EventInfoContainer.
Definition: PileUpEventLoopMgr.h:143
PileUpEventLoopMgr::executeAlgorithms
virtual StatusCode executeAlgorithms(const EventContext &ctx)
Run the algorithms for the current event.
Definition: PileUpEventLoopMgr.cxx:607
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:103
xAOD::EventInfo_v1::runNumber
uint32_t runNumber() const
The current event's run number.
PileUpEventLoopMgr::m_maxBunchCrossingPerOrbit
unsigned int m_maxBunchCrossingPerOrbit
max bunch crossings per orbit
Definition: PileUpEventLoopMgr.h:159
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
EventID.h
This class provides a unique identification for each event, in terms of run/event number and/or a tim...
PileUpStream::nextEventPre
const xAOD::EventInfo * nextEventPre(bool readRecord=true)
return next Event, load store with next Event
Definition: PileUpStream.cxx:223
PileUpStream::finalize
StatusCode finalize()
finalize and release store. To be called on ... finalize()
Definition: PileUpStream.cxx:262
IEvtIdModifierSvc.h
PileUpEventLoopMgr::m_ncurevt
int m_ncurevt
Definition: PileUpEventLoopMgr.h:163
PileUpEventLoopMgr::m_mergeSvc
ServiceHandle< PileUpMergeSvc > m_mergeSvc
PileUp Merge Service.
Definition: PileUpEventLoopMgr.h:100
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
property: allow sub evts EOF condition when maxevt==-1
Definition: PileUpEventLoopMgr.h:134
lumiFormat.i
int i
Definition: lumiFormat.py:92
SG::AuxElement::setStore
void setStore(const SG::IConstAuxStore *store)
Set the store associated with this object.
Definition: AuxElement.cxx:221
PileUpEventLoopMgr::PileUpEventLoopMgr
PileUpEventLoopMgr(const std::string &nam, ISvcLocator *svcLoc)
Standard Constructor.
Definition: PileUpEventLoopMgr.cxx:53
PileUpStream::setupStore
bool setupStore()
setup input and overlay selectors and iters
Definition: PileUpStream.cxx:113
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::m_beamInt
ServiceHandle< IBeamIntensity > m_beamInt
property: beam intensity service handle for beam profile in local time
Definition: PileUpEventLoopMgr.h:149
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:161
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:33
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::seek
virtual StatusCode seek(int evt)
Seek to a given event.
Definition: PileUpEventLoopMgr.cxx:545
PileUpEventLoopMgr::m_evinfContName
Gaudi::Property< std::string > m_evinfContName
SG key for the EventInfoContainer.
Definition: PileUpEventLoopMgr.h:146
PileUpEventLoopMgr::setupStreams
StatusCode setupStreams()
setup input and overlay selectors and iters
Definition: PileUpEventLoopMgr.cxx:575
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:581
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:172
PileUpStream::store
StoreGateSvc & store()
Definition: PileUpStream.h:61
xAOD::EventAuxInfo
EventAuxInfo_v3 EventAuxInfo
Definition of the latest event auxiliary info version.
Definition: EventAuxInfo.h:15
PileUpEventLoopMgr::m_firstXing
Gaudi::Property< int > m_firstXing
first xing to be simulated (0th xing is 1st after trigger)
Definition: PileUpEventLoopMgr.h:129
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:91
PileUpEventLoopMgr::executeEvent
virtual StatusCode executeEvent(EventContext &&ctx)
implementation of IEventProcessor::executeEvent(void* par)
Definition: PileUpEventLoopMgr.cxx:632
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
(max) minBias interactions per Xing, for setting MC luminosity
Definition: PileUpEventLoopMgr.h:124
EventAuxInfo.h
PileUpEventLoopMgr::m_firstRun
bool m_firstRun
Definition: PileUpEventLoopMgr.h:156
PileUpEventLoopMgr::m_evtIdModSvc
IEvtIdModifierSvc_t m_evtIdModSvc
Definition: PileUpEventLoopMgr.h:110
PileUpEventLoopMgr::queryInterface
virtual StatusCode queryInterface(const InterfaceID &riid, void **ppvInterface)
Definition: PileUpEventLoopMgr.cxx:695
python.EventInfoMgtInit.release
release
Definition: EventInfoMgtInit.py:24
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
PileUpEventLoopMgr::curEvent
virtual int curEvent() const
Return the current event count.
Definition: PileUpEventLoopMgr.cxx:566
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.
StoreGateSvc::tryConstRetrieve
const T * tryConstRetrieve() const
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
BkgStreamsCaches managing background events.
Definition: PileUpEventLoopMgr.h:122
xAOD::EventInfo_v1::Signal
@ Signal
The signal event.
Definition: EventInfo_v1.h:266
PileUpEventLoopMgr::m_xingByXing
Gaudi::Property< bool > m_xingByXing
property: process bkg events xing by xing without caching them
Definition: PileUpEventLoopMgr.h:137
PileUpEventLoopMgr::finalize
virtual StatusCode finalize()
implementation of IAppMgrUI::finalize
Definition: PileUpEventLoopMgr.cxx:194
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.
c_pileUpEventInfoObjName
const std::string c_pileUpEventInfoObjName
default value for the EventInfoContainer storing subevents for PileUp
Definition: PileUpMisc.h:12
PileUpEventLoopMgr::m_currentRun
uint32_t m_currentRun
current run number
Definition: PileUpEventLoopMgr.h:155
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:82
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
PileUpMisc.h
IEventSeek
Abstract interface for seeking within an event stream.
Definition: IEventSeek.h:27
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
PileUpEventLoopMgr::m_lastXing
Gaudi::Property< int > m_lastXing
last xing to be simulated (0th xing is 1st after trigger)
Definition: PileUpEventLoopMgr.h:131
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
property: control behaviour of event loop on algorithm failure
Definition: PileUpEventLoopMgr.h:140
PileUpEventLoopMgr::initialize
virtual StatusCode initialize()
implementation of IAppMgrUI::initialize
Definition: PileUpEventLoopMgr.cxx:120
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:17
PileUpEventLoopMgr::modifyEventContext
virtual void modifyEventContext(EventContext &ctx, const EventID &eID, bool consume_modifier_stream)
Definition: PileUpEventLoopMgr.cxx:224
xAOD::EventInfo_v1::mcEventNumber
uint64_t mcEventNumber() const
The MC generator's event number.
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
property: beam intensity service handle for luminosity profile in iovtime
Definition: PileUpEventLoopMgr.h:151
PileUpEventLoopMgr::m_loadProxies
bool m_loadProxies
Definition: PileUpEventLoopMgr.h:165