ATLAS Offline Software
Loading...
Searching...
No Matches
L1CaloSubBlock.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef TRIGT1CALOBYTESTREAM_L1CALOSUBBLOCK_H
6#define TRIGT1CALOBYTESTREAM_L1CALOSUBBLOCK_H
7
8#include <stdint.h>
9#include <vector>
10
12
13#include "L1CaloSrcIdMap.h"
14
15namespace LVL1BS {
16
23
25
26 public:
30 // Errors detected before unpacking
37 // Errors detected during unpacking
43
46
48 void clear();
49
51 int dataWords() const;
52
54 void setHeader(int wordId, int version, int format, int seqno, int crate,
55 int module, int slices2, int slices1);
56
57 // Return unpacked header data
58 int wordId() const;
59 int version() const;
60 int format() const;
61 int seqno() const;
62 int slice() const;
63 int crate() const;
64 int module() const;
65 int slices2() const;
66 int slices1() const;
67
68 // Return unpacked error status data
69 uint32_t failingBCN() const;
70 bool glinkTimeout() const;
71 bool glinkDown() const;
72 bool upstreamError() const;
73 bool daqOverflow() const;
74 bool bcnMismatch() const;
75 bool glinkProtocol() const;
76 bool glinkParity() const;
77
79 uint32_t subStatus() const;
80
82 void setBunchCrossing(int bc);
84 int bunchCrossing() const;
85
87 // (OFFLINE_FRAGMENTS_NAMESPACE::PointerType = uint32_t*)
91
93 // (FullEventAssembler<L1CaloSrcIdMap>::RODDATA = vector<uint32_t>)
95
97 void setStatus(uint32_t failingBCN, bool glinkTimeout, bool glinkDown,
98 bool upstreamError, bool daqOverflow, bool bcnMismatch,
99 bool glinkProtocol, bool glinkParity);
100
102 void setDaqOverflow(int bit = 1);
104 void setGlinkParity(int bit = 1);
105
107 static SubBlockWordType wordType(uint32_t word);
109 static int wordId(uint32_t word);
111 static int version(uint32_t word);
113 static int format(uint32_t word);
115 static int seqno(uint32_t word);
117 static int module(uint32_t word);
118
119 // Unpacking error code. Set by derived classes
121 void setUnpackErrorCode(int code);
123 int unpackErrorCode() const;
125 std::string unpackErrorMsg() const;
126
127 // Packing utilities
129 int minBits(uint32_t datum) const;
131 int parityBit(int init, uint32_t datum, int nbits) const;
133 void packer(uint32_t datum, int nbits);
135 void packerFlush();
137 void setStreamed();
139 uint32_t unpacker(int nbits);
140 uint32_t unpacker(int nbits, int align);
142 void unpackerInit();
144 bool unpackerSuccess() const;
145
146 // Neutral format packing utilities
148 void packerNeutral(int pin, uint32_t datum, int nbits);
150 void packerNeutralParity(int pin);
152 uint32_t unpackerNeutral(int pin, int nbits);
154 bool unpackerNeutralParityError(int pin);
156 int currentPinBit(int pin) const;
157
158 private:
159 // Constants.
160 // Header and status ID
161 static const int s_headerBit = 30;
162 static const int s_statusBit = 28;
163 static const uint32_t s_headerMask = 0x3;
164 static const uint32_t s_statusMask = 0x1;
165 static const uint32_t s_headerVal = 0x3;
166 static const uint32_t s_statusVal = 0x1;
167 // First non-PPM crate
168 static const int s_ppmCrates = 8;
169 // Header word data positions and masks
170 static const int s_wordIdBit = 28;
171 static const int s_versionBit = 25;
172 static const int s_formatBit = 22;
173 static const int s_seqnoBit = 16;
174 static const int s_crateBit = 12;
175 static const int s_moduleBit = 8;
176 static const int s_slices2Bit = 3;
177 static const int s_slices1Bit = 0;
178 static const uint32_t s_wordIdMask = 0xf;
179 static const uint32_t s_versionMask = 0x7;
180 static const uint32_t s_formatMask = 0x7;
181 static const uint32_t s_seqnoMask = 0x3f;
182 static const uint32_t s_crateMask = 0xf;
183 static const uint32_t s_moduleMask = 0xf;
184 static const uint32_t s_slices2Mask = 0x1f;
185 static const uint32_t s_slices1Mask = 0x7;
186 // Status word data positions and masks
187 static const int s_failingBcnBit = 22;
188 static const int s_glinkTimeoutBit = 7;
189 static const int s_glinkDownBit = 6;
190 static const int s_upstreamErrorBit = 4;
191 static const int s_daqOverflowBit = 3;
192 static const int s_bcnMismatchBit = 2;
193 static const int s_glinkProtocolBit = 1;
194 static const int s_glinkParityBit = 0;
195 static const uint32_t s_failingBcnMask = 0x3f;
196 // Packing word sizes and masks
197 static const int s_maxWordBits = 32;
198 static const int s_maxStreamedBits = 31;
199 static const uint32_t s_maxWordMask = 0xffffffff;
200 static const uint32_t s_maxStreamedMask = 0x7fffffff;
201 // Neutral packing
202 static const int s_maxPins = 20;
203 static const uint32_t s_glinkDavSet = 0x400000;
204
206 uint32_t m_header;
208 uint32_t m_trailer;
213 // Used for bit-packing
214 uint32_t m_bitword;
217 uint32_t m_maxMask;
219 std::vector<uint32_t>::const_iterator m_dataPos{};
220 std::vector<uint32_t>::const_iterator m_dataPosEnd{};
221 // Used for neutral bit packing
222 std::vector<int> m_currentPinBit;
223 std::vector<int> m_oddParity;
227 std::vector<uint32_t> m_data;
229 std::vector<uint32_t> m_unpackingMasks;
230
231};
232
234{
235 return m_dataWords;
236}
237
238inline int L1CaloSubBlock::wordId() const
239{
240 return (m_header >> s_wordIdBit) & s_wordIdMask;
241}
242
243inline int L1CaloSubBlock::version() const
244{
245 return (m_header >> s_versionBit) & s_versionMask;
246}
247
248inline int L1CaloSubBlock::format() const
249{
250 return (m_header >> s_formatBit) & s_formatMask;
251}
252
253inline int L1CaloSubBlock::seqno() const
254{
255 return (m_header >> s_seqnoBit) & s_seqnoMask;
256}
257
258inline int L1CaloSubBlock::slice() const
259{
260 return seqno();
261}
262
263inline int L1CaloSubBlock::crate() const
264{
265 return (m_header >> s_crateBit) & s_crateMask;
266}
267
268inline int L1CaloSubBlock::module() const
269{
270 return (m_header >> s_moduleBit) & s_moduleMask;
271}
272
273inline int L1CaloSubBlock::slices2() const
274{
275 return (m_header >> s_slices2Bit) & s_slices2Mask;
276}
277
278inline int L1CaloSubBlock::slices1() const
279{
280 return (m_header >> s_slices1Bit) & s_slices1Mask;
281}
282
283inline uint32_t L1CaloSubBlock::failingBCN() const
284{
286}
287
289{
290 return m_trailer & (0x1 << s_glinkTimeoutBit);
291}
292
293inline bool L1CaloSubBlock::glinkDown() const
294{
295 return m_trailer & (0x1 << s_glinkDownBit);
296}
297
299{
300 return m_trailer & (0x1 << s_upstreamErrorBit);
301}
302
304{
305 return m_trailer & (0x1 << s_daqOverflowBit);
306}
307
309{
310 return m_trailer & (0x1 << s_bcnMismatchBit);
311}
312
314{
315 return m_trailer & (0x1 << s_glinkProtocolBit);
316}
317
319{
320 return m_trailer & (0x1 << s_glinkParityBit);
321}
322
323inline uint32_t L1CaloSubBlock::subStatus() const
324{
325 return m_trailer;
326}
327
328inline void L1CaloSubBlock::setBunchCrossing(const int bc)
329{
330 if (bc) m_bunchCrossing = bc;
331}
332
334{
335 return m_bunchCrossing;
336}
337
338inline void L1CaloSubBlock::setUnpackErrorCode(const int code)
339{
340 m_unpackError = code;
341}
342
344{
345 return m_unpackError;
346}
347
353
355{
356 return m_unpackerFlag;
357}
358
359inline int L1CaloSubBlock::currentPinBit(int pin) const
360{
361 return m_currentPinBit[pin];
362}
363
364} // end namespace
365
366#endif
std::vector< uint32_t > RODDATA
ROD data as a vector of unsigned int.
static const int s_maxWordBits
uint32_t m_trailer
Sub-Block Status Trailer.
void setDaqOverflow(int bit=1)
Set DAQ FIFO Overflow bit in Sub-status word.
static const uint32_t s_failingBcnMask
void setGlinkParity(int bit=1)
Set G-Link Parity bit in Sub-status word.
static const int s_glinkProtocolBit
static const uint32_t s_wordIdMask
void packer(uint32_t datum, int nbits)
Pack given data into given number of bits.
void setStatus(uint32_t failingBCN, bool glinkTimeout, bool glinkDown, bool upstreamError, bool daqOverflow, bool bcnMismatch, bool glinkProtocol, bool glinkParity)
Store error status trailer.
static const int s_formatBit
std::vector< int > m_oddParity
static const int s_headerBit
std::vector< uint32_t >::const_iterator m_dataPos
static const uint32_t s_crateMask
std::vector< uint32_t > m_data
Sub-Block data.
static const int s_maxPins
int parityBit(int init, uint32_t datum, int nbits) const
Return the parity bit for given data.
int m_bunchCrossing
Bunch Crossing number (neutral format only)
uint32_t unpacker(int nbits)
Unpack given number of bits of data.
static const int s_upstreamErrorBit
void setUnpackErrorCode(int code)
Set the unpacking error code.
static const int s_glinkTimeoutBit
int unpackErrorCode() const
Return the unpacking error code.
static const uint32_t s_formatMask
uint32_t subStatus() const
Return Sub-status word.
bool unpackerSuccess() const
Return unpacker success flag.
static const int s_glinkParityBit
void setHeader(int wordId, int version, int format, int seqno, int crate, int module, int slices2, int slices1)
Store header data.
bool unpackerNeutralParityError(int pin)
Unpack and test G-Link parity bit for given pin.
uint32_t failingBCN() const
static const uint32_t s_maxWordMask
static const uint32_t s_seqnoMask
static const uint32_t s_headerVal
int dataWords() const
Return number of data words.
static const int s_ppmCrates
static SubBlockWordType wordType(uint32_t word)
Word identification.
void clear()
Clear all data.
static const uint32_t s_glinkDavSet
static const uint32_t s_slices1Mask
static const int s_slices2Bit
static const int s_crateBit
uint32_t unpacker(int nbits, int align)
static const int s_versionBit
void packerNeutralParity(int pin)
Pack current G-Link parity bit for given pin.
void write(FullEventAssembler< L1CaloSrcIdMap >::RODDATA *theROD) const
Output complete packed sub-block to ROD vector.
static const int s_daqOverflowBit
std::vector< uint32_t >::const_iterator m_dataPosEnd
std::vector< int > m_currentPinBit
static const int s_seqnoBit
void setStreamed()
Set continuous bit streaming for compressed formats.
std::vector< uint32_t > m_unpackingMasks
Unpacking masks.
static const int s_moduleBit
static const uint32_t s_statusVal
void packerFlush()
Flush the current data word padded with zeros.
static const int s_failingBcnBit
uint32_t unpackerNeutral(int pin, int nbits)
Unpack given number of bits of neutral data for given pin.
static const int s_statusBit
uint32_t m_header
Sub-Block Header.
static const uint32_t s_maxStreamedMask
int bunchCrossing() const
Return the Bunch Crossing number (neutral format only)
static const int s_maxStreamedBits
static const uint32_t s_moduleMask
void unpackerInit()
Initialise unpacker.
static const int s_slices1Bit
std::string unpackErrorMsg() const
Return the unpacking error message for printing.
int minBits(uint32_t datum) const
Return the minimum number of bits needed for given data.
int m_dataWords
Current number of data words.
OFFLINE_FRAGMENTS_NAMESPACE::PointerType read(const OFFLINE_FRAGMENTS_NAMESPACE::PointerType beg, const OFFLINE_FRAGMENTS_NAMESPACE::PointerType end)
Input complete packed sub-block from ROD array.
static const int s_wordIdBit
int m_unpackError
Unpacking error code.
int currentPinBit(int pin) const
Return current pin bit for given pin.
void packerNeutral(int pin, uint32_t datum, int nbits)
Pack given neutral data from given pin.
static const uint32_t s_versionMask
static const uint32_t s_statusMask
static const uint32_t s_headerMask
static const int s_bcnMismatchBit
static const uint32_t s_slices2Mask
static const int s_glinkDownBit
void setBunchCrossing(int bc)
Set the Bunch Crossing number (neutral format only)
const DataType * PointerType
Definition RawEvent.h:25