ATLAS Offline Software
Loading...
Searching...
No Matches
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
8
9// Athena includes
15
21
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
133 return MinimalEventLoopMgr::initialize();
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
144 ToolHandleArray<IBkgStreamsCache>::iterator cacheIterator(m_caches.begin());
145 ToolHandleArray<IBkgStreamsCache>::iterator endOfCaches(m_caches.end());
146 while (cacheIterator != endOfCaches) {
147 (*cacheIterator++)->release();
148 }
149 m_caches.clear();
150
151 //and to clean up the store the stream owns
152 CHECK(m_origStream.finalize());
153
154 return MinimalEventLoopMgr::finalize();
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//---------------------------------------------------------------------------
169void 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//=========================================================================
196StatusCode PileUpEventLoopMgr::nextEvent(int maxevt)
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
315 const AthenaAttributeList* pAttrList = m_origStream.store().tryConstRetrieve<AthenaAttributeList>("Input");
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.
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() );
402 ToolHandleArray<IBkgStreamsCache>::iterator cacheIterator(m_caches.begin());
403 ToolHandleArray<IBkgStreamsCache>::iterator endOfCaches(m_caches.end());
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
494StatusCode PileUpEventLoopMgr::seek(int evt)
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//=========================================================================
523StatusCode
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
540 ToolHandleArray<IBkgStreamsCache>::iterator cacheIterator(m_caches.begin());
541 ToolHandleArray<IBkgStreamsCache>::iterator endOfCaches(m_caches.end());
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//=========================================================================
556StatusCode PileUpEventLoopMgr::executeAlgorithms(const EventContext& ctx)
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//=========================================================================
581StatusCode PileUpEventLoopMgr::executeEvent( EventContext&& ctx )
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
600 StatusCode sc = executeAlgorithms( ctx );
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}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_ALWAYS(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
Assign a CLID to EventContext.
EventID eventIDFromxAOD(const xAOD::EventInfo *xaod)
Create EventID object from xAOD::EventInfo.
provides the relative beam intensity as a function of the bunch xing.
provides the relative beam luminosity as a function of the bunch xing.
Interface to in-memory cache for pileup events.
static Double_t sc
An AttributeList represents a logical row of attributes in a metadata table.
The ATLAS event loop for pile-up applications.
A helper class to compute a hash of pile-up events.
the preferred mechanism to access information from the different event stores in a pileup job.
xAOD::EventInfo * addSubEvent(xAOD::EventInfo *targetEv, const xAOD::EventInfo::SubEvent &subev, xAOD::EventInfoContainer *eiContainer, const std::string &eiContKey, StoreGateSvc *subev_store=nullptr)
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
An AttributeList represents a logical row of attributes in a metadata table.
This class provides a unique identification for each event, in terms of run/event number and/or a tim...
Definition EventID.h:35
ServiceHandle< StoreGateSvc > m_evtStore
output store
Gaudi::Property< bool > m_xingByXing
virtual StatusCode initialize() override
Gaudi::Property< float > m_xingFreq
virtual StatusCode nextEvent(int maxevt) override
ServiceHandle< IEvtIdModifierSvc > m_evtIdModSvc
Gaudi::Property< uint32_t > m_mcChannelNumber
Gaudi::Property< float > m_maxCollPerXing
Gaudi::Property< bool > m_allowSerialAndMPToDiffer
void modifyEventContext(EventContext &ctx, const EventID &eID, bool consume_modifier_stream)
PileUpStream m_origStream
Input Stream.
virtual StatusCode seek(int evt) override
ServiceHandle< IIncidentSvc > m_incidentSvc
Incident Service.
virtual ~PileUpEventLoopMgr()
Standard Destructor.
virtual int curEvent() const override
Gaudi::Property< std::string > m_evinfName
Gaudi::Property< int > m_firstXing
Gaudi::Property< int > m_failureMode
SmartIF< IAlgExecStateSvc > m_aess
Reference to the Algorithm Execution State Svc.
ServiceHandle< IEvtSelector > m_origSel
unsigned int getBCID(int bunchXing, unsigned int centralBCID) const
return the 'fake BCID' corresponding to bunchXing
virtual StatusCode executeEvent(EventContext &&ctx) override
Gaudi::Property< int > m_lastXing
ServiceHandle< IBeamLuminosity > m_beamLumi
ToolHandleArray< IBkgStreamsCache > m_caches
ServiceHandle< IBeamIntensity > m_beamInt
ServiceHandle< PileUpMergeSvc > m_mergeSvc
PileUpEventLoopMgr(const std::string &nam, ISvcLocator *svcLoc)
Standard Constructor.
virtual StatusCode finalize() override
Gaudi::Property< bool > m_allowSubEvtsEOF
virtual StatusCode executeAlgorithms(const EventContext &ctx)
Run the algorithms for the current event.
uint32_t m_currentRun
current run number
Gaudi::Property< std::string > m_evinfContName
StatusCode setupStreams()
setup input and overlay selectors and iters
std::string hashSource() const
Get the current hash base.
void addToHashSource(const std::string &string)
Add a plain string to the stream.
void calculateHash(uuid_t &hash) const
Calculate the hash.
static xAOD::EventInfo::PileUpMixtureID uuidToPileUpMixtureId(const uuid_t &hash)
Convert uuid_t to xAOD::EventInfo::PileUpMixtureID.
a triple selector/context/store defines a stream
uint64_t mcEventNumber() const
The MC generator's event number.
const std::vector< float > & mcEventWeights() const
The weights of all the MC events used in the simulation.
void setAverageInteractionsPerCrossing(float value)
Set average interactions per crossing for all BCIDs.
void setBCID(uint32_t value)
Set the bunch crossing ID of the event.
uint32_t lumiBlock() const
The current event's luminosity block number.
void setMCEventNumber(uint64_t value)
Set the MC generator's event number.
uint32_t eventTypeBitmask() const
The event type bitmask.
uint32_t bcid() const
The bunch crossing ID of the event.
void setTimeStamp(uint32_t value)
Set the POSIX time of the event.
void clearSubEvents()
Clear all the currently held sub-events.
void setEventNumber(uint64_t value)
Set the current event's event number.
float averageInteractionsPerCrossing() const
Average interactions per crossing for all BCIDs - for out-of-time pile-up.
PileUpMixtureID pileUpMixtureID() const
Unique pile-up mixture identifier.
float actualInteractionsPerCrossing() const
Average interactions per crossing for the current BCID - for in-time pile-up.
void setPileUpMixtureID(const PileUpMixtureID &value)
Set unique pile-up mixture identifier.
void setEventTypeBitmask(uint32_t value)
Set the event type bitmask.
void setMCChannelNumber(uint32_t value)
Set the MC generator's channel number.
const std::vector< SubEvent > & subEvents() const
Get the pileup events that were used in the simulation.
void setMCEventWeights(const std::vector< float > &value)
Set the weights of all the MC events used in the simulation.
void setRunNumber(uint32_t value)
Set the current event's run number.
void setEvtStore(StoreGateSvc *svc)
Set the pointer to the event store associated with this event.
@ Signal
The signal event.
@ IS_SIMULATION
true: simulation, false: data
uint32_t runNumber() const
The current event's run number.
uint32_t mcChannelNumber() const
The MC generator's channel number.
uint64_t eventNumber() const
The current event's event number.
void setLumiBlock(uint32_t value)
Set the current event's luminosity block number.
void setActualInteractionsPerCrossing(float value)
Set average interactions per crossing for the current BCID.
static std::string release
Definition computils.h:50
EventInfoContainer_v1 EventInfoContainer
Define the latest version of the container.
EventInfo_v1 EventInfo
Definition of the latest event info version.
EventInfoAuxContainer_v1 EventInfoAuxContainer
Define the latest version of the auxiliary container.