ATLAS Offline Software
OnDemandMinbiasSvc.h
Go to the documentation of this file.
1 /* -*- C++ -*- */
2 /*
3  Copyright (C) 2023 CERN for the benefit of the ATLAS collaboration
4 */
5 
6 #ifndef PILEUPMT_ONDEMANDMINBIASSVC_H
7 #define PILEUPMT_ONDEMANDMINBIASSVC_H
8 
9 #include <fmt/format.h>
10 
11 #include <atomic>
12 #include <deque>
13 #include <map>
14 #include <memory>
15 #include <mutex>
16 #include <string>
17 #include <vector>
18 
20 #include "Gaudi/Property.h"
21 #include "GaudiKernel/IEvtSelector.h"
22 #include "GaudiKernel/ServiceHandle.h"
23 #include "PileUpMT/IMinbiasSvc.h"
26 #include "StoreGate/StoreGateSvc.h"
27 #include "src/ISkipEventIdxSvc.h"
28 
29 class OnDemandMinbiasSvc final : public extends<AthService, IMinbiasSvc> {
30  public:
32  OnDemandMinbiasSvc(const std::string& name, ISvcLocator* svc);
34  ~OnDemandMinbiasSvc() final;
35 
37  StatusCode initialize() final;
38 
39  StatusCode beginHardScatter(const EventContext& ctx) override;
40  StoreGateSvc* getMinbias(const EventContext& ctx,
41  std::uint64_t mb_id) override;
42  std::size_t getNumForBunch(const EventContext& ctx, int bunch) const override;
43  inline virtual
44  std::int64_t get_hs_id(const EventContext& ctx) const override {
45  return m_skippedHSEvents.value() + ctx.evt();
46  }
47 
48  StatusCode endHardScatter(const EventContext& ctx) override;
49 
50  private:
52 
53  Gaudi::Property<std::uint64_t> m_seed{this, "Seed", 0,
54  "Additional seed for PRNGs"};
55  Gaudi::Property<bool> m_onDemandMB{
56  this, "OnDemandMB", false,
57  "Should minbias event contents be read on demand"};
58  Gaudi::Property<int> m_skippedHSEvents{this, "SkippedHSEvents", 0,
59  "Number of skipped HS events"};
60  Gaudi::Property<float> m_nPerBunch{
61  this, "AvgMBPerBunch", 0.f,
62  "Average (max) number of minbias events per bunch"};
63  Gaudi::Property<bool> m_usePoisson{this, "UsePoisson", true,
64  "Whether to use a Poisson distribution "
65  "(if False, use a delta distribution)"};
66  Gaudi::Property<bool> m_useBeamInt{
67  this, "UseBeamInt", true, "Whether to use the beam intensity service"};
68  Gaudi::Property<bool> m_useBeamLumi{
69  this, "UseBeamLumi", true, "Whether to use the beam luminosity service"};
70  Gaudi::Property<int> m_earliestDeltaBC{
71  this, "EarliestDeltaBC", -32,
72  "Earliest bunch crossing to consider (as delta)"};
73  Gaudi::Property<int> m_latestDeltaBC{
74  this, "LatestDeltaBC", +6,
75  "Latest bunch crossing to consider (as delta)"};
77  this, "SkipEvtIdxSvc", "SkipEventIdxSvc",
78  "Skipped event index (run / lb num) provider"};
80  this, "BkgEventSelector", {}, "Event selector for minbias events"};
81  ServiceHandle<IBeamIntensity> m_beamInt{this, "BeamIntSvc", "FlatBM",
82  "Beam intensity service"};
84  this, "BeamLumiSvc", "LumiProfileSvc", "Beam luminosity service"};
86  this, "ActiveStoreSvc", "ActiveStoreSvc", "ActiveStoreSvc"};
87 
88  SGHandle m_spare_store{this, "StoreGateSvc",
89  fmt::format("StoreGateSvc/discards_{}", name()),
90  "StoreGate for discarding events"};
91  IEvtSelector::Context* m_bkg_evt_sel_ctx;
93 
94  std::vector<std::vector<SGHandle>> m_stores;
95  std::vector<std::vector<std::uint64_t>> m_num_mb_by_bunch;
96  std::vector<std::vector<std::uint64_t>> m_idx_lists;
97  // prevents attempting to read multiple batches at once
99  std::atomic_int64_t m_last_loaded_hs{-1};
100 
101  static constexpr std::size_t s_NoSlot =
102  std::numeric_limits<std::size_t>::max(); // "slot" to pass when we don't
103  // have a slot
104  std::size_t calcMBRequired(std::int64_t hs_id, std::size_t slot,
105  unsigned int run, unsigned int lumi,
107 };
108 
109 #endif // PILEUPMT_ONDEMANDMINBIASSVC_H
ISkipEventIdxSvc.h
OnDemandMinbiasSvc::m_beamLumi
ServiceHandle< IBeamLuminosity > m_beamLumi
Definition: OnDemandMinbiasSvc.h:83
max
#define max(a, b)
Definition: cfImp.cxx:41
vtune_athena.format
format
Definition: vtune_athena.py:14
BeamSpot::mutex
std::mutex mutex
Definition: InDetBeamSpotVertex.cxx:18
OnDemandMinbiasSvc::m_useBeamInt
Gaudi::Property< bool > m_useBeamInt
Definition: OnDemandMinbiasSvc.h:66
OnDemandMinbiasSvc::m_num_mb_by_bunch
std::vector< std::vector< std::uint64_t > > m_num_mb_by_bunch
Definition: OnDemandMinbiasSvc.h:95
OnDemandMinbiasSvc::OnDemandMinbiasSvc
OnDemandMinbiasSvc(const std::string &name, ISvcLocator *svc)
Constructor.
Definition: OnDemandMinbiasSvc.cxx:35
OnDemandMinbiasSvc::m_skipEventIdxSvc
ServiceHandle< ISkipEventIdxSvc > m_skipEventIdxSvc
Definition: OnDemandMinbiasSvc.h:76
OnDemandMinbiasSvc::calcMBRequired
std::size_t calcMBRequired(std::int64_t hs_id, std::size_t slot, unsigned int run, unsigned int lumi, std::uint64_t event)
Definition: OnDemandMinbiasSvc.cxx:155
OnDemandMinbiasSvc::m_bkgEventSelector
ServiceHandle< IEvtSelector > m_bkgEventSelector
Definition: OnDemandMinbiasSvc.h:79
OnDemandMinbiasSvc::m_idx_lists
std::vector< std::vector< std::uint64_t > > m_idx_lists
Definition: OnDemandMinbiasSvc.h:96
OnDemandMinbiasSvc::m_usePoisson
Gaudi::Property< bool > m_usePoisson
Definition: OnDemandMinbiasSvc.h:63
OnDemandMinbiasSvc::m_proxyProviderSvc
IProxyProviderSvc * m_proxyProviderSvc
Definition: OnDemandMinbiasSvc.h:92
OnDemandMinbiasSvc::~OnDemandMinbiasSvc
~OnDemandMinbiasSvc() final
Destructor.
Definition: OnDemandMinbiasSvc.cxx:39
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:128
OnDemandMinbiasSvc::get_hs_id
virtual std::int64_t get_hs_id(const EventContext &ctx) const override
Definition: OnDemandMinbiasSvc.h:44
IMinbiasSvc.h
OnDemandMinbiasSvc::getMinbias
StoreGateSvc * getMinbias(const EventContext &ctx, std::uint64_t mb_id) override
Definition: OnDemandMinbiasSvc.cxx:300
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
OnDemandMinbiasSvc::m_last_loaded_hs
std::atomic_int64_t m_last_loaded_hs
Definition: OnDemandMinbiasSvc.h:99
OnDemandMinbiasSvc::m_onDemandMB
Gaudi::Property< bool > m_onDemandMB
Definition: OnDemandMinbiasSvc.h:55
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
OnDemandMinbiasSvc::m_useBeamLumi
Gaudi::Property< bool > m_useBeamLumi
Definition: OnDemandMinbiasSvc.h:68
OnDemandMinbiasSvc::s_NoSlot
static constexpr std::size_t s_NoSlot
Definition: OnDemandMinbiasSvc.h:101
OnDemandMinbiasSvc::beginHardScatter
StatusCode beginHardScatter(const EventContext &ctx) override
Definition: OnDemandMinbiasSvc.cxx:220
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
OnDemandMinbiasSvc::m_stores
std::vector< std::vector< SGHandle > > m_stores
Definition: OnDemandMinbiasSvc.h:94
run
Definition: run.py:1
Handler::svc
AthROOTErrorHandlerSvc * svc
Definition: AthROOTErrorHandlerSvc.cxx:10
OnDemandMinbiasSvc::m_bkg_evt_sel_ctx
IEvtSelector::Context * m_bkg_evt_sel_ctx
Definition: OnDemandMinbiasSvc.h:91
OnDemandMinbiasSvc::initialize
StatusCode initialize() final
AthService initialize.
Definition: OnDemandMinbiasSvc.cxx:41
OnDemandMinbiasSvc::m_nPerBunch
Gaudi::Property< float > m_nPerBunch
Definition: OnDemandMinbiasSvc.h:60
OnDemandMinbiasSvc::m_latestDeltaBC
Gaudi::Property< int > m_latestDeltaBC
Definition: OnDemandMinbiasSvc.h:73
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
IProxyProviderSvc
Definition: IProxyProviderSvc.h:34
OnDemandMinbiasSvc::endHardScatter
StatusCode endHardScatter(const EventContext &ctx) override
Definition: OnDemandMinbiasSvc.cxx:317
OnDemandMinbiasSvc::m_skippedHSEvents
Gaudi::Property< int > m_skippedHSEvents
Definition: OnDemandMinbiasSvc.h:58
OnDemandMinbiasSvc::m_beamInt
ServiceHandle< IBeamIntensity > m_beamInt
Definition: OnDemandMinbiasSvc.h:81
lumiFormat.lumi
lumi
Definition: lumiFormat.py:113
IBeamIntensity.h
provides the relative beam intensity as a function of the bunch xing.
OnDemandMinbiasSvc::getNumForBunch
std::size_t getNumForBunch(const EventContext &ctx, int bunch) const override
Definition: OnDemandMinbiasSvc.cxx:307
AthService.h
OnDemandMinbiasSvc::m_reading_batch_mtx
std::mutex m_reading_batch_mtx
Definition: OnDemandMinbiasSvc.h:98
OnDemandMinbiasSvc::m_earliestDeltaBC
Gaudi::Property< int > m_earliestDeltaBC
Definition: OnDemandMinbiasSvc.h:70
OnDemandMinbiasSvc
Definition: OnDemandMinbiasSvc.h:29
OnDemandMinbiasSvc::m_activeStoreSvc
ServiceHandle< ActiveStoreSvc > m_activeStoreSvc
Definition: OnDemandMinbiasSvc.h:85
StoreGateSvc.h
OnDemandMinbiasSvc::m_spare_store
SGHandle m_spare_store
Definition: OnDemandMinbiasSvc.h:88
IBeamLuminosity.h
provides the relative beam luminosity as a function of the bunch xing.
OnDemandMinbiasSvc::m_seed
Gaudi::Property< std::uint64_t > m_seed
Definition: OnDemandMinbiasSvc.h:53
ServiceHandle< StoreGateSvc >