ATLAS Offline Software
Loading...
Searching...
No Matches
PileUpMTAlg Class Reference

#include <PileUpMTAlg.h>

Inheritance diagram for PileUpMTAlg:

Public Member Functions

 PileUpMTAlg (const std::string &name, ISvcLocator *pSvcLocator)
virtual ~PileUpMTAlg ()
virtual StatusCode initialize () override
 uncomment and implement methods as required
virtual StatusCode execute () override
virtual StatusCode finalize () override
virtual bool isClonable () const override
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

StatusCode get_ei (StoreGateSvc &sg, std::unique_ptr< const xAOD::EventInfo > &ei, std::unique_ptr< xAOD::EventAuxInfo > &eiAux, bool pileup=false) const
unsigned int get_BCID (int bc, unsigned int central_BCID) const
StatusCode add_subevt (const std::vector< std::uint32_t > &bcid, SG::WriteHandle< xAOD::EventInfo > &overlaidEvt, SG::WriteHandle< xAOD::EventInfoContainer > &puCont, ServiceHandle< IMinbiasSvc > &mbSvc, xAOD::EventInfo::PileUpType puType, int bc, const EventContext &ctx, unsigned long subevt_id, std::vector< std::uint64_t > &trace)
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

ServiceHandle< IMinbiasSvcm_lowptMBSvc
 Other useful methods provided by base class are: evtStore() : ServiceHandle to main event data storegate inputMetaStore() : ServiceHandle to input metadata storegate outputMetaStore() : ServiceHandle to output metadata storegate histSvc() : ServiceHandle to output ROOT service (writing TObjects) currentFile() : TFile* to the currently open input file retrieveMetadata(...): See twiki.cern.ch/twiki/bin/view/AtlasProtected/AthAnalysisBase#ReadingMetaDataInCpp.
ServiceHandle< IMinbiasSvcm_highptMBSvc
ServiceHandle< IMinbiasSvcm_cavernMBSvc
ServiceHandle< IMinbiasSvcm_beamhaloMBSvc
ServiceHandle< IMinbiasSvcm_beamgasMBSvc
ServiceHandle< IBeamIntensitym_beamInt
ServiceHandle< IBeamLuminositym_beamLumi
ServiceHandle< IAthRNGSvcm_rngSvc
ToolHandleArray< IPileUpToolm_puTools
Gaudi::Property< bool > m_writeTrace {this, "WriteTrace", false, "Write trace of pileup events used"}
Gaudi::Property< int > m_skippedHSEvents
Gaudi::Property< float > m_avgMu {this, "AverageMu", 200, "Average mu"}
Gaudi::Property< float > m_fracLowPt
Gaudi::Property< float > m_fracHighPt
Gaudi::Property< float > m_numCavern
Gaudi::Property< float > m_numBeamGas
Gaudi::Property< float > m_numBeamHalo
Gaudi::Property< int > m_BCSpacing
Gaudi::Property< int > m_earliestDeltaBC
Gaudi::Property< int > m_latestDeltaBC
ServiceHandle< ISkipEventIdxSvcm_skipEventIdxSvc
SG::ReadCondHandleKey< InDet::BeamSpotDatam_beamSpotKey
SG::WriteHandleKey< xAOD::EventInfom_evtInfoKey
SG::WriteHandleKey< xAOD::EventInfoContainerm_evtInfoContKey {""}
DataObjIDColl m_extendedExtraObjects
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Static Private Attributes

static atomic_output m_pileupTrace ATLAS_THREAD_SAFE {}
static bool m_skiptrace_written ATLAS_THREAD_SAFE = false

Detailed Description

Definition at line 71 of file PileUpMTAlg.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ PileUpMTAlg()

PileUpMTAlg::PileUpMTAlg ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 40 of file PileUpMTAlg.cxx.

41 : AthAlgorithm(name, pSvcLocator) {}
AthAlgorithm()
Default constructor:

◆ ~PileUpMTAlg()

PileUpMTAlg::~PileUpMTAlg ( )
virtual

Definition at line 43 of file PileUpMTAlg.cxx.

43{}

Member Function Documentation

◆ add_subevt()

StatusCode PileUpMTAlg::add_subevt ( const std::vector< std::uint32_t > & bcid,
SG::WriteHandle< xAOD::EventInfo > & overlaidEvt,
SG::WriteHandle< xAOD::EventInfoContainer > & puCont,
ServiceHandle< IMinbiasSvc > & mbSvc,
xAOD::EventInfo::PileUpType puType,
int bc,
const EventContext & ctx,
unsigned long subevt_id,
std::vector< std::uint64_t > & trace )
private

Definition at line 89 of file PileUpMTAlg.cxx.

95 {
96 // Keep the code to add and process a subevent in one place
97 const unsigned int bc_idx = bc - m_earliestDeltaBC;
98 StoreGateSvc* sg = mbSvc->getMinbias(ctx, subevt_id);
99 std::unique_ptr<const xAOD::EventInfo> ei;
100 std::unique_ptr<xAOD::EventAuxInfo> eiAux;
101 ATH_CHECK(get_ei(*sg, ei, eiAux, true));
102 xAOD::EventInfo mb_to_modify(*ei);
103 if (m_writeTrace) {
104 trace.push_back(mb_to_modify.eventNumber());
105 }
106 mb_to_modify.setBCID(bcid[bc_idx]);
107 try {
108 addSubEvent(overlaidEvt.ptr(), &mb_to_modify, bc * m_BCSpacing, puType,
109 puCont.ptr(), m_evtInfoContKey.key(), sg);
110 } catch (const std::exception& e) {
111 ATH_MSG_ERROR("Caught exception adding subevent: " << e.what());
112 return StatusCode::FAILURE;
113 }
114 return StatusCode::SUCCESS;
115}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
xAOD::EventInfo * addSubEvent(xAOD::EventInfo *targetEv, const xAOD::EventInfo::SubEvent &subev, xAOD::EventInfoContainer *eiContainer, const std::string &eiContKey, StoreGateSvc *subev_store=nullptr)
Gaudi::Property< int > m_earliestDeltaBC
Gaudi::Property< bool > m_writeTrace
SG::WriteHandleKey< xAOD::EventInfoContainer > m_evtInfoContKey
StatusCode get_ei(StoreGateSvc &sg, std::unique_ptr< const xAOD::EventInfo > &ei, std::unique_ptr< xAOD::EventAuxInfo > &eiAux, bool pileup=false) const
Gaudi::Property< int > m_BCSpacing
pointer_type ptr()
Dereference the pointer.
EventInfo_v1 EventInfo
Definition of the latest event info version.

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode PileUpMTAlg::execute ( )
overridevirtual

Definition at line 185 of file PileUpMTAlg.cxx.

185 {
186 using PUType = xAOD::EventInfo::PileUpType;
187 std::string trace_buf{}; // Hold trace of events.
188 auto trace = std::back_inserter(trace_buf);
189 ATH_MSG_DEBUG("Executing " << name() << "...");
190 const EventContext& ctx = Gaudi::Hive::currentContext();
191 const auto& evtID = ctx.eventID();
192
194 setFilterPassed(false); // optional: start with algorithm not passed
195
196 // Code based on PileUpEventLoopMgr and PileUpToolsAlg (trying to extract the
197 // core merging code) Read hard scatter
198 std::unique_ptr<const xAOD::EventInfo> hsEvt = nullptr;
199 std::unique_ptr<xAOD::EventAuxInfo> hsEvtAux = nullptr;
200 ATH_CHECK(get_ei(*evtStore(), hsEvt, hsEvtAux));
201
202 // Setup overlaid event
203 SG::WriteHandle<xAOD::EventInfo> overlaidEvt(m_evtInfoKey, ctx);
204 ATH_CHECK(overlaidEvt.record(std::make_unique<xAOD::EventInfo>(),
205 std::make_unique<xAOD::EventAuxInfo>()));
206 *overlaidEvt = *hsEvt; // copy in hard scatter
207 overlaidEvt->setEvtStore(evtStore().get());
208 overlaidEvt->clearSubEvents();
209
210 // This was the problem. Need to fix overlaidEvt using context run and lb
211 // number
212 overlaidEvt->setRunNumber(evtID.run_number());
213 overlaidEvt->setLumiBlock(evtID.lumi_block());
214 overlaidEvt->setEventNumber(evtID.event_number());
215 overlaidEvt->setBCID(evtID.bunch_crossing_id());
216 overlaidEvt->setTimeStamp(evtID.time_stamp());
217 overlaidEvt->setTimeStampNSOffset(evtID.time_stamp_ns_offset());
218 // Set beam spot info
219 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle{m_beamSpotKey, ctx};
220 if (!beamSpotHandle.isValid()) {
221 ATH_MSG_ERROR("Beam spot information not valid");
222 return StatusCode::FAILURE;
223 }
224
225 overlaidEvt->setBeamPos(beamSpotHandle->beamPos()[Amg::x],
226 beamSpotHandle->beamPos()[Amg::y],
227 beamSpotHandle->beamPos()[Amg::z]);
228 overlaidEvt->setBeamPosSigma(beamSpotHandle->beamSigma(0),
229 beamSpotHandle->beamSigma(1),
230 beamSpotHandle->beamSigma(2));
231 overlaidEvt->setBeamPosSigmaXY(beamSpotHandle->beamSigmaXY());
232 overlaidEvt->setBeamTiltXZ(beamSpotHandle->beamTilt(0));
233 overlaidEvt->setBeamTiltYZ(beamSpotHandle->beamTilt(1));
234 overlaidEvt->setBeamStatus(beamSpotHandle->beamStatus());
235
236 // Pileup container
237 SG::WriteHandle<xAOD::EventInfoContainer> puCont(m_evtInfoContKey, ctx);
238 ATH_CHECK(puCont.record(std::make_unique<xAOD::EventInfoContainer>(),
239 std::make_unique<xAOD::EventInfoAuxContainer>()));
240
241 // Get crossing number
242 m_beamInt->selectT0(evtID.run_number(), evtID.event_number());
243 overlaidEvt->setBCID(m_beamInt->getCurrentT0BunchCrossing());
244
245 // Set simulation bit
246 overlaidEvt->setEventTypeBitmask(hsEvt->eventTypeBitmask() |
248
249 // Set properties
250 bool sf_updated = false;
251 float lumi_sf = m_beamLumi->scaleFactor(evtID.run_number(),
252 evtID.lumi_block(), sf_updated);
253 float cur_avg_mu = lumi_sf * m_avgMu;
254 overlaidEvt->setAverageInteractionsPerCrossing(cur_avg_mu);
255 overlaidEvt->setActualInteractionsPerCrossing(m_beamInt->normFactor(0) *
256 cur_avg_mu);
257
258 // Trace
259 if (m_writeTrace) {
260 std::format_to(trace,
261 "Idx: {} Run: {} LB: {} EVT: {} "
262 "HS ID: {}\n",
263 ctx.evt(), evtID.run_number(), evtID.lumi_block(),
264 evtID.event_number(), m_lowptMBSvc->get_hs_id(ctx));
265 auto bunch_pattern =
266 rv::closed_iota(m_earliestDeltaBC.value(), m_latestDeltaBC.value()) |
267 rv::transform(
268 [this](int bc) { return int(m_beamInt->normFactor(bc)); }) |
269#if RANGE_V3_VERSION >= 1200
270 rv::chunk_by(std::equal_to{}) |
271#else
272 rv::group_by(std::equal_to{}) |
273#endif
274 rv::transform([](const auto& rng) {
275 return std::format("{}{}", rng.size(), rng[0] == 0 ? 'E' : 'F');
276 }) |
277 ranges::to<std::vector<std::string>>;
278 // Manual join using std::ostringstream as std::format does not support ranges
279 std::string joined_pattern;
280 for (size_t i = 0; i < bunch_pattern.size(); ++i) {
281 joined_pattern += bunch_pattern[i];
282 if (i + 1 < bunch_pattern.size()) {
283 joined_pattern += " ";
284 }
285 }
286
287 std::format_to(trace,
288 "mu = {}, central BCID = {}, bunch pattern = [{}]\n",
289 cur_avg_mu, m_beamInt->getCurrentT0BunchCrossing(),
290 joined_pattern);
291 }
292 // Copy subevents
293 if (!hsEvt->subEvents().empty()) {
294 for (const SubEvent& se : hsEvt->subEvents()) {
295 addSubEvent(overlaidEvt.ptr(), se, puCont.ptr(), m_evtInfoContKey.key(),
296 evtStore().get());
297 }
298 } else {
299 // if no subevents, add original event
300 addSubEvent(overlaidEvt.ptr(), hsEvt.get(), 0, xAOD::EventInfo::Signal,
301 puCont.ptr(), m_evtInfoContKey.key(), evtStore().get());
302 }
303
304 // Initialize MinbiasSvcs
305 if (m_fracLowPt != 0) {
306 ATH_CHECK(m_lowptMBSvc->beginHardScatter(ctx));
307 }
308 if (m_fracHighPt != 0) {
309 ATH_CHECK(m_highptMBSvc->beginHardScatter(ctx));
310 }
311 if (m_numCavern != 0) {
312 ATH_CHECK(m_cavernMBSvc->beginHardScatter(ctx));
313 }
314 if (m_numBeamHalo != 0) {
315 ATH_CHECK(m_beamhaloMBSvc->beginHardScatter(ctx));
316 }
317 if (m_numBeamGas != 0) {
318 ATH_CHECK(m_beamgasMBSvc->beginHardScatter(ctx));
319 }
320
321 std::uint32_t central_bcid = overlaidEvt->bcid();
322 std::vector<std::uint32_t> bcid{};
324
325 for (int bc = m_earliestDeltaBC; bc <= m_latestDeltaBC; ++bc) {
326 bcid.push_back(get_BCID(bc, central_bcid));
327 }
328
329 // Setup tools
330 for (auto&& tool : m_puTools) {
331 // Reset filter -- Don't know if this is necessary
332 tool->resetFilter();
333 }
334
335 // Now add the events
336 std::uint64_t low_pt_count = 0;
337 std::uint64_t high_pt_count = 0;
338 std::uint64_t cavern_count = 0;
339 std::uint64_t beam_halo_count = 0;
340 std::uint64_t beam_gas_count = 0;
341 auto now = std::chrono::high_resolution_clock::now();
342 for (int bc = m_earliestDeltaBC; bc <= m_latestDeltaBC; ++bc) {
343 if (m_beamInt->normFactor(bc) == 0.) {
344 // skip empty bunch crossings
345 continue;
346 }
347 std::vector<std::uint64_t> subevts_vec{};
348 if (m_fracLowPt != 0) {
349 if (m_writeTrace) {
350 std::format_to(trace, "\tBC {:03} : LOW PT {} ", bc,
351 m_lowptMBSvc->getNumForBunch(ctx, bc));
352 }
353 for (std::size_t i = 0; i < m_lowptMBSvc->getNumForBunch(ctx, bc); ++i) {
354 ATH_CHECK(add_subevt(bcid, overlaidEvt, puCont, m_lowptMBSvc,
355 PUType::MinimumBias, bc, ctx, low_pt_count,
356 subevts_vec));
357 ++low_pt_count;
358 }
359 }
360 if (m_fracHighPt != 0) {
361 if (m_writeTrace) {
362 std::format_to(trace, "HIGH PT {} | ",
363 m_highptMBSvc->getNumForBunch(ctx, bc));
364 }
365 for (std::size_t i = 0; i < m_highptMBSvc->getNumForBunch(ctx, bc); ++i) {
366 ATH_CHECK(add_subevt(bcid, overlaidEvt, puCont, m_highptMBSvc,
367 PUType::HighPtMinimumBias, bc, ctx, high_pt_count,
368 subevts_vec));
369 ++high_pt_count;
370 }
371 }
372 if (m_numCavern != 0) {
373 if (m_writeTrace) {
374 std::format_to(trace, "CAVERN {} | ",
375 m_cavernMBSvc->getNumForBunch(ctx, bc));
376 }
377 for (std::size_t i = 0; i < m_cavernMBSvc->getNumForBunch(ctx, bc); ++i) {
378 ATH_CHECK(add_subevt(bcid, overlaidEvt, puCont, m_cavernMBSvc,
379 PUType::Cavern, bc, ctx, cavern_count,
380 subevts_vec));
381 ++cavern_count;
382 }
383 }
384 if (m_numBeamHalo != 0) {
385 if (m_writeTrace) {
386 std::format_to(trace, "BEAM HALO {} | ",
387 m_beamhaloMBSvc->getNumForBunch(ctx, bc));
388 }
389 for (std::size_t i = 0; i < m_beamhaloMBSvc->getNumForBunch(ctx, bc);
390 ++i) {
391 ATH_CHECK(add_subevt(bcid, overlaidEvt, puCont, m_beamhaloMBSvc,
392 PUType::HaloGas, bc, ctx, beam_halo_count,
393 subevts_vec));
394 ++beam_halo_count;
395 }
396 }
397 if (m_numBeamGas != 0) {
398 if (m_writeTrace) {
399 std::format_to(trace, "BEAM GAS {} | ",
400 m_beamgasMBSvc->getNumForBunch(ctx, bc));
401 }
402 for (std::size_t i = 0; i < m_beamgasMBSvc->getNumForBunch(ctx, bc);
403 ++i) {
404 ATH_CHECK(add_subevt(bcid, overlaidEvt, puCont, m_beamgasMBSvc,
405 PUType::HaloGas, bc, ctx, beam_gas_count,
406 subevts_vec));
407 ++beam_gas_count;
408 }
409 }
410 if (m_writeTrace) {
411 std::format_to(trace, "TOTAL {} | HASH {:08X}\n", subevts_vec.size(),
412 xxh3::hash64(subevts_vec));
413 }
414 }
415 if (m_writeTrace) {
416 std::format_to(trace, "\n");
417 m_pileupTrace.print(trace_buf);
418 }
419
420 for (auto&& tool : m_puTools) {
421 try {
422 ATH_CHECK(tool->processAllSubEvents(ctx));
423 } catch (const std::exception& e) {
424 ATH_MSG_ERROR("Caught exception running " << tool.name() << ": "
425 << e.what());
426 return StatusCode::FAILURE;
427 }
428 // Propagate filter result
429 if (!tool->filterPassed()) {
430 setFilterPassed(false);
431 }
432 }
433 ATH_MSG_DEBUG(std::format("***** Took {:%OMm %OSs} to process all subevents",
434 std::chrono::high_resolution_clock::now() - now));
435 //
436 // Save hash (direct copy from PileUpEventLoopMgr)
437 PileUpHashHelper pileUpHashHelper;
438 pileUpHashHelper.addToHashSource(overlaidEvt.cptr());
439 ATH_MSG_VERBOSE("Pile-up hash source:" << pileUpHashHelper.hashSource());
440
441 // Calculate and set hash
442 uuid_t pileUpHash;
443 pileUpHashHelper.calculateHash(pileUpHash);
444 overlaidEvt->setPileUpMixtureID(
446 ATH_MSG_DEBUG("PileUpMixtureID = " << overlaidEvt->pileUpMixtureID());
447
448 setFilterPassed(true); // if got here, assume that means algorithm passed
449 if (m_fracLowPt != 0) {
450 ATH_CHECK(m_lowptMBSvc->endHardScatter(ctx));
451 }
452 if (m_fracHighPt != 0) {
453 ATH_CHECK(m_highptMBSvc->endHardScatter(ctx));
454 }
455 if (m_numCavern != 0) {
456 ATH_CHECK(m_cavernMBSvc->endHardScatter(ctx));
457 }
458 if (m_numBeamHalo != 0) {
459 ATH_CHECK(m_beamhaloMBSvc->endHardScatter(ctx));
460 }
461 if (m_numBeamGas != 0) {
462 ATH_CHECK(m_beamgasMBSvc->endHardScatter(ctx));
463 }
464 return StatusCode::SUCCESS;
465}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
xAOD::EventInfo::SubEvent SubEvent
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.
Gaudi::Property< int > m_latestDeltaBC
Gaudi::Property< float > m_avgMu
Gaudi::Property< float > m_numCavern
unsigned int get_BCID(int bc, unsigned int central_BCID) const
Gaudi::Property< float > m_fracLowPt
ServiceHandle< IBeamLuminosity > m_beamLumi
ToolHandleArray< IPileUpTool > m_puTools
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
ServiceHandle< IMinbiasSvc > m_beamgasMBSvc
ServiceHandle< IMinbiasSvc > m_highptMBSvc
Definition PileUpMTAlg.h:99
ServiceHandle< IMinbiasSvc > m_cavernMBSvc
Gaudi::Property< float > m_fracHighPt
SG::WriteHandleKey< xAOD::EventInfo > m_evtInfoKey
ServiceHandle< IBeamIntensity > m_beamInt
ServiceHandle< IMinbiasSvc > m_lowptMBSvc
Other useful methods provided by base class are: evtStore() : ServiceHandle to main event data storeg...
Definition PileUpMTAlg.h:97
Gaudi::Property< float > m_numBeamGas
Gaudi::Property< float > m_numBeamHalo
StatusCode add_subevt(const std::vector< std::uint32_t > &bcid, SG::WriteHandle< xAOD::EventInfo > &overlaidEvt, SG::WriteHandle< xAOD::EventInfoContainer > &puCont, ServiceHandle< IMinbiasSvc > &mbSvc, xAOD::EventInfo::PileUpType puType, int bc, const EventContext &ctx, unsigned long subevt_id, std::vector< std::uint64_t > &trace)
ServiceHandle< IMinbiasSvc > m_beamhaloMBSvc
PileUpType
Enumerator describing the types of pileup events.
@ Signal
The signal event.
@ IS_SIMULATION
true: simulation, false: data
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130
uint32_t rng()
Definition FillerAlg.cxx:40
retrieve(aClass, aKey=None)
Definition PyKernel.py:110
setEventNumber setTimeStamp bcid
std::uint64_t hash64(const void *data, std::size_t size)
Passthrough to XXH3_64bits.
Definition XXH.cxx:9

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthAlgorithm::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 50 of file AthAlgorithm.cxx.

51{
52 // If we didn't find any symlinks to add, just return the collection
53 // from the base class. Otherwise, return the extended collection.
54 if (!m_extendedExtraObjects.empty()) {
56 }
57 return Algorithm::extraOutputDeps();
58}
DataObjIDColl m_extendedExtraObjects

◆ finalize()

StatusCode PileUpMTAlg::finalize ( )
overridevirtual

Definition at line 176 of file PileUpMTAlg.cxx.

176 {
177 ATH_MSG_DEBUG("Finalizing " << name() << "...");
178 //
179 // Things that happen once at the end of the event loop go here
180 //
181
182 return StatusCode::SUCCESS;
183}

◆ get_BCID()

unsigned int PileUpMTAlg::get_BCID ( int bc,
unsigned int central_BCID ) const
inlineprivate

Definition at line 150 of file PileUpMTAlg.h.

150 {
151 constexpr int maxBCPerOrbit = 3564; // FIXME may need update
152 return static_cast<unsigned int>((bc + static_cast<int>(central_BCID)) %
153 maxBCPerOrbit);
154 }

◆ get_ei()

StatusCode PileUpMTAlg::get_ei ( StoreGateSvc & sg,
std::unique_ptr< const xAOD::EventInfo > & ei,
std::unique_ptr< xAOD::EventAuxInfo > & eiAux,
bool pileup = false ) const
private

Definition at line 45 of file PileUpMTAlg.cxx.

48 {
49 std::string key = pileup ? "EventInfo" : "HSEventInfo";
50 auto newEi = std::make_unique<xAOD::EventInfo>();
51 auto eiAux = std::make_unique<xAOD::EventAuxInfo>();
52 newEi->setStore(eiAux.get());
53 SG::ReadHandle<xAOD::EventInfo> ei_h(key, sg.name());
54 const xAOD::EventInfo* ei = ei_h.get();
55 if (ei != nullptr) {
56 *newEi = *ei;
57 } else {
58 ATH_MSG_ERROR("Couldn't find xAOD::EventInfo. " << sg.name());
59 ATH_MSG_ERROR(sg.dump());
60 return StatusCode::FAILURE;
61 }
62 // Use attribute list if EventInfo doesn't have event numbers set
63 if (newEi->eventNumber() == 0) {
64 const auto* attr_list_p = sg.tryConstRetrieve<AthenaAttributeList>("Input");
65 if (attr_list_p != nullptr) {
66 if (attr_list_p->size() <= 6) {
67 ATH_MSG_WARNING("Read Input attribute list but size <= 6");
68 } else {
69 const AthenaAttributeList& attr_list = *attr_list_p;
70 const auto runNum = attr_list["RunNumber"].data<unsigned>();
71 const auto evtNum = attr_list["EventNumber"].data<unsigned long long>();
72 const auto lbNum = attr_list["LumiBlockN"].data<unsigned>();
73 newEi->setRunNumber(runNum);
74 newEi->setLumiBlock(lbNum);
75 newEi->setEventNumber(evtNum);
76 }
77 } else {
79 "Could not read Input attribute list and EventInfo has no event "
80 "number");
81 }
82 }
83 newEi->setEvtStore(&sg);
84 ei_ = std::move(newEi);
85 ei_aux_ = std::move(eiAux);
86 return StatusCode::SUCCESS;
87}
#define ATH_MSG_WARNING(x)
std::string dump() const
dump objects in store.
const T * tryConstRetrieve() const

◆ initialize()

StatusCode PileUpMTAlg::initialize ( )
overridevirtual

uncomment and implement methods as required

Definition at line 117 of file PileUpMTAlg.cxx.

117 {
118 using namespace std::chrono;
119 ATH_MSG_DEBUG("Initializing " << name() << "...");
120 if (m_writeTrace) {
121 std::string filename = std::format("pileup_trace_skipping-{}_{:%Y-%m-%dT%H%M}.txt",
122 m_skippedHSEvents.value(),
123 system_clock::now());
124 if (!m_pileupTrace.init(filename)) {
125 ATH_MSG_ERROR("Cannot append to file " << filename);
126 return StatusCode::FAILURE;
127 }
128 }
129 ATH_CHECK(m_skipEventIdxSvc.retrieve());
130 ATH_CHECK(m_rngSvc.retrieve());
131 if (m_fracLowPt != 0) {
132 ATH_CHECK(m_lowptMBSvc.retrieve());
133 }
134 if (m_fracHighPt != 0) {
135 ATH_CHECK(m_highptMBSvc.retrieve());
136 }
137 if (m_numCavern != 0) {
138 ATH_CHECK(m_cavernMBSvc.retrieve());
139 }
140 if (m_numBeamGas != 0) {
141 ATH_CHECK(m_beamgasMBSvc.retrieve());
142 }
143 if (m_numBeamHalo != 0) {
144 ATH_CHECK(m_beamhaloMBSvc.retrieve());
145 }
146 ATH_CHECK(m_beamInt.retrieve());
147 ATH_CHECK(m_beamLumi.retrieve());
148 ATH_CHECK(m_puTools.retrieve());
149
150 m_evtInfoContKey = "PileUpEventInfo";
151 ATH_CHECK(m_evtInfoKey.initialize());
152 ATH_CHECK(m_evtInfoContKey.initialize());
153 ATH_CHECK(m_beamSpotKey.initialize());
154
155 // Trace skipped events
156 if (m_writeTrace) {
158 ISkipEventIdxSvc::EvtIter end) -> StatusCode {
159 std::string trace_buf{};
160 auto trace = std::back_inserter(trace_buf);
161 for (; it != end; ++it) {
162 std::format_to(trace, "SKIPPING Run: {} LB: {} EVT: {} HS ID: {}\n",
163 it->runNum, it->lbNum, it->evtNum, it->evtIdx);
164 }
165 m_pileupTrace.print(trace_buf);
166 return StatusCode::SUCCESS;
167 };
168 if (!m_skiptrace_written) {
169 ATH_CHECK(m_skipEventIdxSvc->registerCallback(handler));
170 m_skiptrace_written = true;
171 }
172 }
173 return StatusCode::SUCCESS;
174}
std::vector< EvtId >::const_iterator EvtIter
ServiceHandle< IAthRNGSvc > m_rngSvc
ServiceHandle< ISkipEventIdxSvc > m_skipEventIdxSvc
Gaudi::Property< int > m_skippedHSEvents
void handler(int sig)
signal handler
Definition rmain.cxx:99

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

virtual bool PileUpMTAlg::isClonable ( ) const
inlineoverridevirtual

Definition at line 84 of file PileUpMTAlg.h.

84{ return true; }

◆ msg()

MsgStream & AthCommonMsg< Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ sysInitialize()

StatusCode AthAlgorithm::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Algorithm > >.

Reimplemented in AthAnalysisAlgorithm, AthFilterAlgorithm, AthHistogramAlgorithm, and PyAthena::Alg.

Definition at line 66 of file AthAlgorithm.cxx.

66 {
68
69 if (sc.isFailure()) {
70 return sc;
71 }
72 ServiceHandle<ICondSvc> cs("CondSvc",name());
73 for (auto h : outputHandles()) {
74 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
75 // do this inside the loop so we don't create the CondSvc until needed
76 if ( cs.retrieve().isFailure() ) {
77 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
78 return StatusCode::SUCCESS;
79 }
80 if (cs->regHandle(this,*h).isFailure()) {
81 sc = StatusCode::FAILURE;
82 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
83 << " with CondSvc");
84 }
85 }
86 }
87 return sc;
88}
static Double_t sc
virtual StatusCode sysInitialize() override
Override sysInitialize.
AthCommonDataStore(const std::string &name, T... args)
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/2]

atomic_output m_pileupTrace PileUpMTAlg::ATLAS_THREAD_SAFE {}
inlinestaticprivate

Definition at line 162 of file PileUpMTAlg.h.

162{};

◆ ATLAS_THREAD_SAFE [2/2]

bool m_skiptrace_written PileUpMTAlg::ATLAS_THREAD_SAFE = false
inlinestaticprivate

Definition at line 163 of file PileUpMTAlg.h.

◆ m_avgMu

Gaudi::Property<float> PileUpMTAlg::m_avgMu {this, "AverageMu", 200, "Average mu"}
private

Definition at line 118 of file PileUpMTAlg.h.

118{this, "AverageMu", 200, "Average mu"};

◆ m_BCSpacing

Gaudi::Property<int> PileUpMTAlg::m_BCSpacing
private
Initial value:
{this, "BCSpacing", 25,
"Bunch crossing spacing in ns"}

Definition at line 129 of file PileUpMTAlg.h.

129 {this, "BCSpacing", 25,
130 "Bunch crossing spacing in ns"};

◆ m_beamgasMBSvc

ServiceHandle<IMinbiasSvc> PileUpMTAlg::m_beamgasMBSvc
private
Initial value:
{
this, "BeamGasMinbiasSvc", "", "MinbiasSvc for beam gas background"}

Definition at line 105 of file PileUpMTAlg.h.

105 {
106 this, "BeamGasMinbiasSvc", "", "MinbiasSvc for beam gas background"};

◆ m_beamhaloMBSvc

ServiceHandle<IMinbiasSvc> PileUpMTAlg::m_beamhaloMBSvc
private
Initial value:
{
this, "BeamHaloMinbiasSvc", "", "MinbiasSvc for beam halo background"}

Definition at line 103 of file PileUpMTAlg.h.

103 {
104 this, "BeamHaloMinbiasSvc", "", "MinbiasSvc for beam halo background"};

◆ m_beamInt

ServiceHandle<IBeamIntensity> PileUpMTAlg::m_beamInt
private
Initial value:
{this, "BeamIntSvc", "FlatBM",
"Beam intensity service"}

Definition at line 107 of file PileUpMTAlg.h.

107 {this, "BeamIntSvc", "FlatBM",
108 "Beam intensity service"};

◆ m_beamLumi

ServiceHandle<IBeamLuminosity> PileUpMTAlg::m_beamLumi
private
Initial value:
{
this, "BeamLumiSvc", "LumiProfileSvc", "Beam luminosity service"}

Definition at line 109 of file PileUpMTAlg.h.

109 {
110 this, "BeamLumiSvc", "LumiProfileSvc", "Beam luminosity service"};

◆ m_beamSpotKey

SG::ReadCondHandleKey<InDet::BeamSpotData> PileUpMTAlg::m_beamSpotKey
private
Initial value:
{
this, "BeamSpotKey", "BeamSpotData", "Beam spot info key"}

Definition at line 140 of file PileUpMTAlg.h.

140 {
141 this, "BeamSpotKey", "BeamSpotData", "Beam spot info key"};

◆ m_cavernMBSvc

ServiceHandle<IMinbiasSvc> PileUpMTAlg::m_cavernMBSvc
private
Initial value:
{this, "CavernMinbiasSvc", "",
"MinbiasSvc for cavern background"}

Definition at line 101 of file PileUpMTAlg.h.

101 {this, "CavernMinbiasSvc", "",
102 "MinbiasSvc for cavern background"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_earliestDeltaBC

Gaudi::Property<int> PileUpMTAlg::m_earliestDeltaBC
private
Initial value:
{
this, "EarliestDeltaBC", -32,
"Earliest bunch crossing to consider (as delta)"}

Definition at line 131 of file PileUpMTAlg.h.

131 {
132 this, "EarliestDeltaBC", -32,
133 "Earliest bunch crossing to consider (as delta)"};

◆ m_evtInfoContKey

SG::WriteHandleKey<xAOD::EventInfoContainer> PileUpMTAlg::m_evtInfoContKey {""}
private

Definition at line 144 of file PileUpMTAlg.h.

144{""};

◆ m_evtInfoKey

SG::WriteHandleKey<xAOD::EventInfo> PileUpMTAlg::m_evtInfoKey
private
Initial value:
{
this, "EventInfoKey", "OverlayEvent", "Overlay EventInfo key"}

Definition at line 142 of file PileUpMTAlg.h.

142 {
143 this, "EventInfoKey", "OverlayEvent", "Overlay EventInfo key"};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthAlgorithm::m_extendedExtraObjects
privateinherited

Definition at line 79 of file AthAlgorithm.h.

◆ m_fracHighPt

Gaudi::Property<float> PileUpMTAlg::m_fracHighPt
private
Initial value:
{this, "FracHighPt", 0.,
"Fraction of pileup that has high pT"}

Definition at line 121 of file PileUpMTAlg.h.

121 {this, "FracHighPt", 0.,
122 "Fraction of pileup that has high pT"};

◆ m_fracLowPt

Gaudi::Property<float> PileUpMTAlg::m_fracLowPt
private
Initial value:
{this, "FracLowPt", 0.,
"Fraction of pileup that has low pT"}

Definition at line 119 of file PileUpMTAlg.h.

119 {this, "FracLowPt", 0.,
120 "Fraction of pileup that has low pT"};

◆ m_highptMBSvc

ServiceHandle<IMinbiasSvc> PileUpMTAlg::m_highptMBSvc
private
Initial value:
{this, "HighPtMinbiasSvc", "",
"MinbiasSvc for high pT minbias"}

Definition at line 99 of file PileUpMTAlg.h.

99 {this, "HighPtMinbiasSvc", "",
100 "MinbiasSvc for high pT minbias"};

◆ m_latestDeltaBC

Gaudi::Property<int> PileUpMTAlg::m_latestDeltaBC
private
Initial value:
{
this, "LatestDeltaBC", +6,
"Latest bunch crossing to consider (as delta)"}

Definition at line 134 of file PileUpMTAlg.h.

134 {
135 this, "LatestDeltaBC", +6,
136 "Latest bunch crossing to consider (as delta)"};

◆ m_lowptMBSvc

ServiceHandle<IMinbiasSvc> PileUpMTAlg::m_lowptMBSvc
private
Initial value:
{this, "LowPtMinbiasSvc", "",
"MinbiasSvc for low pT minbias"}

Other useful methods provided by base class are: evtStore() : ServiceHandle to main event data storegate inputMetaStore() : ServiceHandle to input metadata storegate outputMetaStore() : ServiceHandle to output metadata storegate histSvc() : ServiceHandle to output ROOT service (writing TObjects) currentFile() : TFile* to the currently open input file retrieveMetadata(...): See twiki.cern.ch/twiki/bin/view/AtlasProtected/AthAnalysisBase#ReadingMetaDataInCpp.

Definition at line 97 of file PileUpMTAlg.h.

97 {this, "LowPtMinbiasSvc", "",
98 "MinbiasSvc for low pT minbias"};

◆ m_numBeamGas

Gaudi::Property<float> PileUpMTAlg::m_numBeamGas
private
Initial value:
{
this, "NumBeamGas", 0., "Number of beam gas background events per BC"}

Definition at line 125 of file PileUpMTAlg.h.

125 {
126 this, "NumBeamGas", 0., "Number of beam gas background events per BC"};

◆ m_numBeamHalo

Gaudi::Property<float> PileUpMTAlg::m_numBeamHalo
private
Initial value:
{
this, "NumBeamHalo", 0., "Number of beam halo background events per BC"}

Definition at line 127 of file PileUpMTAlg.h.

127 {
128 this, "NumBeamHalo", 0., "Number of beam halo background events per BC"};

◆ m_numCavern

Gaudi::Property<float> PileUpMTAlg::m_numCavern
private
Initial value:
{
this, "NumCavern", 0., "Number of cavern background events per BC"}

Definition at line 123 of file PileUpMTAlg.h.

123 {
124 this, "NumCavern", 0., "Number of cavern background events per BC"};

◆ m_puTools

ToolHandleArray<IPileUpTool> PileUpMTAlg::m_puTools
private
Initial value:
{
this, "PileUpTools", {}, "Pileup tools"}

Definition at line 113 of file PileUpMTAlg.h.

113 {
114 this, "PileUpTools", {}, "Pileup tools"};

◆ m_rngSvc

ServiceHandle<IAthRNGSvc> PileUpMTAlg::m_rngSvc
private
Initial value:
{this, "RNGSvc", "AthRNGSvc/PileupRNG",
"RNG service for pile-up digitization"}

Definition at line 111 of file PileUpMTAlg.h.

111 {this, "RNGSvc", "AthRNGSvc/PileupRNG",
112 "RNG service for pile-up digitization"};

◆ m_skipEventIdxSvc

ServiceHandle<ISkipEventIdxSvc> PileUpMTAlg::m_skipEventIdxSvc
private
Initial value:
{
this, "SkipEvtIdxSvc", "SkipEventIdxSvc",
"Skipped event index (run / lb num) provider"}

Definition at line 137 of file PileUpMTAlg.h.

137 {
138 this, "SkipEvtIdxSvc", "SkipEventIdxSvc",
139 "Skipped event index (run / lb num) provider"};

◆ m_skippedHSEvents

Gaudi::Property<int> PileUpMTAlg::m_skippedHSEvents
private
Initial value:
{this, "SkippedHSEvents", 0,
"Number of skipped HS events"}

Definition at line 116 of file PileUpMTAlg.h.

116 {this, "SkippedHSEvents", 0,
117 "Number of skipped HS events"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ m_writeTrace

Gaudi::Property<bool> PileUpMTAlg::m_writeTrace {this, "WriteTrace", false, "Write trace of pileup events used"}
private

Definition at line 115 of file PileUpMTAlg.h.

115{this, "WriteTrace", false, "Write trace of pileup events used"};

The documentation for this class was generated from the following files: