7#include "eformat/SourceIdentifier.h"
8#include "eformat/Status.h"
16 const SG::AuxElement::Accessor<uint64_t> acc_pileUpMixtureLow(
"pileUpMixtureIDLowBits");
17 const SG::AuxElement::Accessor<uint64_t> acc_pileUpMixtureHigh(
"pileUpMixtureIDHighBits");
24 const std::string& name,
25 const IInterface* parent)
26 : base_class(
type, name, parent) {}
36 ATH_MSG_DEBUG(
"Decoding mode: will decode MC EventInfo from ROB fragment");
40 return StatusCode::SUCCESS;
44 const EventContext& eventContext) {
48 ATH_MSG_ERROR(
"EventInfoReadKey not configured for encoding");
49 return StatusCode::FAILURE;
54 if (!evtInfoHandle.isValid()) {
56 return StatusCode::FAILURE;
62 ATH_MSG_DEBUG(
"Event is not simulation, skipping MC EventInfo encoding");
63 return StatusCode::SUCCESS;
79 uint64_t pileUpMixtureLow = 0;
80 uint64_t pileUpMixtureHigh = 0;
81 if (acc_pileUpMixtureLow.isAvailable(*evtInfo)) {
82 pileUpMixtureLow = acc_pileUpMixtureLow(*evtInfo);
84 if (acc_pileUpMixtureHigh.isAvailable(*evtInfo)) {
85 pileUpMixtureHigh = acc_pileUpMixtureHigh(*evtInfo);
90 uint32_t nWeights =
static_cast<uint32_t
>(
weights.size());
95 ATH_MSG_DEBUG(
"Encoding MC EventInfo: mcChannelNumber=" << mcChannelNumber
96 <<
", mcEventNumber=" << mcEventNumber
97 <<
", actualMu=" << actualMu
98 <<
", averageMu=" << averageMu
99 <<
", eventTypeBitmask=0x" << std::hex << eventTypeBitmask << std::dec
100 <<
", extendedLevel1ID=" << extendedLevel1ID
101 <<
", backgroundFlags=0x" << std::hex << backgroundFlags << std::dec
102 <<
", nWeights=" << nWeights);
114 data[idx++] = mcChannelNumber;
117 data[idx++] =
static_cast<uint32_t
>(mcEventNumber & 0xFFFFFFFF);
118 data[idx++] =
static_cast<uint32_t
>(mcEventNumber >> 32);
121 data[idx++] = std::bit_cast<uint32_t>(actualMu);
124 data[idx++] = std::bit_cast<uint32_t>(averageMu);
127 data[idx++] = eventTypeBitmask;
130 data[idx++] =
static_cast<uint32_t
>(pileUpMixtureLow & 0xFFFFFFFF);
131 data[idx++] =
static_cast<uint32_t
>(pileUpMixtureLow >> 32);
134 data[idx++] =
static_cast<uint32_t
>(pileUpMixtureHigh & 0xFFFFFFFF);
135 data[idx++] =
static_cast<uint32_t
>(pileUpMixtureHigh >> 32);
138 data[idx++] = extendedLevel1ID;
141 data[idx++] = backgroundFlags;
144 data[idx++] = nWeights;
147 for (
size_t i = 0; i < nWeights; ++i) {
154 ATH_MSG_DEBUG(
"Created MC EventInfo ROB fragment with " << ndata <<
" words");
155 return StatusCode::SUCCESS;
162 return StatusCode::FAILURE;
166 const uint32_t ndata = rob->rod_ndata();
167 const uint32_t*
data = rob->rod_data();
169 ATH_MSG_DEBUG(
"Decoding MC EventInfo ROB fragment with " << ndata <<
" words");
173 return StatusCode::FAILURE;
177 uint32_t version =
data[0];
179 ATH_MSG_ERROR(
"Unsupported MC EventInfo format version: 0x" << std::hex << version << std::dec);
180 return StatusCode::FAILURE;
184 uint32_t mcChannelNumber =
data[1];
185 uint64_t mcEventNumber =
static_cast<uint64_t
>(
data[2]) | (
static_cast<uint64_t
>(
data[3]) << 32);
186 float actualMu = std::bit_cast<float>(
data[4]);
187 float averageMu = std::bit_cast<float>(
data[5]);
188 uint32_t eventTypeBitmask =
data[6];
189 uint64_t pileUpMixtureLow =
static_cast<uint64_t
>(
data[7]) | (
static_cast<uint64_t
>(
data[8]) << 32);
190 uint64_t pileUpMixtureHigh =
static_cast<uint64_t
>(
data[9]) | (
static_cast<uint64_t
>(
data[10]) << 32);
191 uint32_t extendedLevel1ID =
data[11];
192 uint32_t backgroundFlags =
data[12];
193 uint32_t nWeights =
data[13];
197 ATH_MSG_ERROR(
"ROB data too short for " << nWeights <<
" weights: " << ndata <<
" words");
198 return StatusCode::FAILURE;
202 std::vector<float>
weights(nWeights);
203 for (
size_t i = 0; i < nWeights; ++i) {
207 ATH_MSG_DEBUG(
"Decoded MC EventInfo: mcChannelNumber=" << mcChannelNumber
208 <<
", mcEventNumber=" << mcEventNumber
209 <<
", actualMu=" << actualMu
210 <<
", averageMu=" << averageMu
211 <<
", eventTypeBitmask=0x" << std::hex << eventTypeBitmask << std::dec
212 <<
", extendedLevel1ID=" << std::dec << extendedLevel1ID
213 <<
", backgroundFlags=0x" << std::hex << backgroundFlags << std::dec
214 <<
", nWeights=" << nWeights);
227 acc_pileUpMixtureLow(evtInfo) = pileUpMixtureLow;
228 acc_pileUpMixtureHigh(evtInfo) = pileUpMixtureHigh;
230 return StatusCode::SUCCESS;
234 m_cache.get(eventContext)->clear();
239 cache->rodData.push_back(std::make_unique<uint32_t[]>(
size));
240 return cache->rodData.back().get();
246 const uint32_t*
data) {
248 const EventIDBase& eid = eventContext.eventID();
249 cache->robFragments.push_back(std::make_unique<WROBF>(
253 eid.bunch_crossing_id(),
260 return cache->robFragments.back().get();
#define ATH_CHECK
Evaluate an expression and check for errors.
Base class for elements of a container that can have aux data.
OFFLINE_FRAGMENTS_NAMESPACE_WRITE::ROBFragment ROBF
char data[hepevt_bytes_allocation_ATLAS]
size_t size() const
Number of registered mappings.
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 setMCEventNumber(uint64_t value)
Set the MC generator's event number.
bool eventType(EventType type) const
Check for one particular bitmask value.
uint32_t eventTypeBitmask() const
The event type bitmask.
@ Background
The beam background detectors.
bool setEventFlags(EventFlagSubDet subDet, uint32_t flags)
Set the event flags for a particular sub-detector.
float averageInteractionsPerCrossing() const
Average interactions per crossing for all BCIDs - for out-of-time pile-up.
float actualInteractionsPerCrossing() const
Average interactions per crossing for the current BCID - for in-time pile-up.
void setEventTypeBitmask(uint32_t value)
Set the event type bitmask.
void setMCChannelNumber(uint32_t value)
Set the MC generator's channel number.
void setExtendedLevel1ID(uint32_t value)
Set the extended Level-1 identifier.
uint32_t eventFlags(EventFlagSubDet subDet) const
Get the event flags for a particular sub-detector.
void setMCEventWeights(const std::vector< float > &value)
Set the weights of all the MC events used in the simulation.
@ IS_SIMULATION
true: simulation, false: data
uint32_t mcChannelNumber() const
The MC generator's channel number.
uint32_t extendedLevel1ID() const
The extended Level-1 identifier.
void setActualInteractionsPerCrossing(float value)
Set average interactions per crossing for the current BCID.
eformat::write::ROBFragment ROBFragment
eformat::ROBFragment< PointerType > ROBFragment
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
EventInfo_v1 EventInfo
Definition of the latest event info version.
Simplified version of the C++20 std::span.