ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
InnerDetector
InDetEventCnv
ITkPixelByteStreamCnv
src
ITkPixEncoder.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
/*EXTERNAL CODE PORTED FROM YARR MINIMALLY ADAPTED FOR ATHENA*/
6
7
/*
8
* Author: Ondra Kovanda, ondrej.kovanda at cern.ch
9
* Date: 03/2024
10
* Description: ITkPix* encoding base class
11
*/
12
13
#include "
ITkPixEncoder.h
"
14
#include "
ITkPixQCoreEncodingLUT.h
"
15
#include <bitset>
16
#include <limits>
17
18
//Constructor sets up the geometry for all future loops
19
20
ITkPixEncoder::ITkPixEncoder
(
const
bool
enableChipID,
const
unsigned
nCol,
const
unsigned
nRow,
const
unsigned
nColInCCol,
21
const
unsigned
nRowInQRow,
const
unsigned
nEventsPerStream,
const
bool
plainHitMap,
22
const
bool
dropToT):
m_nCol
(nCol/nColInCCol),
m_nRow
(nRow/nRowInQRow),
23
m_nColInCCol
(nColInCCol),
m_nRowInQRow
(nRowInQRow),
m_nEventsPerStream
(nEventsPerStream),
m_enableChipID
(enableChipID),
24
m_plainHitMap
(plainHitMap),
m_dropToT
(dropToT){
25
if
(
m_enableChipID
)
m_bitsPerWord
= 61;
26
else
m_bitsPerWord
= 63;
27
}
28
29
void
ITkPixEncoder::addBits64
(
const
uint64_t value,
const
uint8_t
length
)
const
{
30
31
//only called from mutex-protected function
32
33
//This adds 'length' lowest bits to the current block. If the current
34
//block gets filled, push it to the output and start a new block with
35
//the rest of the bits that didn't make it. Need to keep track of the
36
//remaining space in the current word. Also, we only have 63 bits for
37
//the added data, as the first bit is EoS.
38
//Case 1: there's enough space for the entire information to be added
39
if
(
length
<= (
m_bitsPerWord
- m_currBit)){
40
41
//The position at which the new bits should be inserted into the block
42
//is (length of the block - 1) - (currently last bit) - (length)
43
//We need to keep the first bit for EoS, hence the -1
44
m_currBlock |= (value << (
m_bitsPerWord
- m_currBit -
length
));
45
m_currBit +=
length
;
46
return
;
47
}
48
49
//Case 2: there's not enough space, so we put what we can, push the block
50
//to the output, and the rest to a new block
51
else
{
52
53
//How much space do we have?
54
uint8_t remainingBits =
m_bitsPerWord
- m_currBit;
55
56
//Add that many bits
57
m_currBlock |= ((value >> (
length
- remainingBits)));
58
59
//Push the current block to the output and reset it and the current
60
//bit counter. The block needs to be split in 32-bit halves before the output
61
pushWords32
();
62
63
//What are we left with?
64
uint8_t leftoverBits =
length
- remainingBits;
65
66
//Now we can add the remainder
67
//Make sure that the remainder we're adding is really only the bits we've not yet
68
//added, otherwise there can be a rogue "1" in the EoS bit, which was already added
69
//in the previous block
70
addBits64
((value & (0xFFFFFFFFFFFFFFFF >> (64 - leftoverBits))), leftoverBits);
71
72
}
73
}
74
75
void
ITkPixEncoder::pushWords32
()
const
{
76
//whenever the current block is ready for output,
77
//split it into two 32-bit words and push them to
78
//the output container. Reset the current bloc/bit
79
80
//only called from mutex-protected function
81
if
(
m_enableChipID
){
82
m_currBlock |= ((0x0ULL |
m_chipID
) << 61);
83
}
84
uint32_t word1 = m_currBlock >> 32;
85
uint32_t word2 = m_currBlock & 0xFFFFFFFF;
86
m_words.push_back(word1);
87
m_words.push_back(word2);
88
m_currBlock = 0x0ULL;
89
m_currBit = 0;
90
}
91
92
void
ITkPixEncoder::encodeQCore
(
const
unsigned
nCCol,
const
unsigned
nQRow)
const
{
93
94
//only called from mutex-protected function
95
96
//produce hit map and ToTs
97
//First, get the top-left pixel in the QCore
98
unsigned
col = nCCol *
m_nColInCCol
;
99
unsigned
row = nQRow *
m_nRowInQRow
;
100
101
//now loop, store ToTs, and build index of the
102
//compressed hit map in the LUT
103
uint16_t lutIndex = 0x0000;
104
std::vector<uint16_t> tots;
105
tots.reserve(16);
106
int
pix
= 0;
107
for
(
unsigned
pixRow = row; pixRow < row +
m_nRowInQRow
; pixRow++){
108
for
(
unsigned
pixCol = col; pixCol < col +
m_nColInCCol
; pixCol++){
109
if
(m_hitMap(pixCol, pixRow)){
110
lutIndex |= 0x1 <<
pix
;
111
tots.push_back(m_hitMap(pixCol, pixRow) - 1);
112
}
113
pix
++;
114
}
115
}
116
117
//now add the binary-tree encoded & compressed map
118
//from the LUT to the stream. If, instead, the plain
119
//hit map is requested, add the index (which is the
120
//plain hit map in fact)
121
m_plainHitMap
?
addBits64
(lutIndex, 16) :
addBits64
(
ITkPixEncoding::ITkPixV2QCoreEncodingLUT_Tree
[lutIndex],
ITkPixEncoding::ITkPixV2QCoreEncodingLUT_Length
[lutIndex]);
122
123
//if dropToT is requested, we can return here
124
if
(
m_dropToT
)
return
;
125
126
//and add the four-bit ToT information for each hit
127
for
(
auto
& tot : tots){
128
addBits64
(tot, 4);
129
}
130
}
131
132
bool
ITkPixEncoder::hitInQCore
(
const
unsigned
CCol,
const
unsigned
QRow)
const
{
133
//Was there a hit in this QCore?
134
135
unsigned
col = CCol *
m_nColInCCol
;
136
unsigned
row = QRow *
m_nRowInQRow
;
137
138
for
(
unsigned
pixRow = row; pixRow < row +
m_nRowInQRow
; pixRow++){
139
for
(
unsigned
pixCol = col; pixCol < col +
m_nColInCCol
; pixCol++){
140
if
(m_hitMap(pixCol, pixRow))
return
true
;
141
}
142
}
143
144
return
false
;
145
}
146
147
void
ITkPixEncoder::scanHitMap
()
const
{
148
149
//only called from mutex-protected function
150
151
//Fill in a helper map of hit QCores and a vector of last qrow in each ccol
152
m_hitQCores = std::vector<std::vector<bool>>(
m_nCCol
, std::vector<bool>(
m_nQRow
,
false
));
153
m_lastQRow = std::vector<unsigned> (
m_nCCol
, 0);
154
155
for
(
unsigned
CCol = 0; CCol <
m_nCCol
; CCol++){
156
for
(
unsigned
QRow = 0; QRow <
m_nQRow
; QRow++){
157
//if there's a hit in the qcore, flag the helper map
158
m_hitQCores[CCol][QRow] =
hitInQCore
(CCol, QRow);
159
160
//and keep track of the last qrow in each CCol, so that we can
161
//easily set the isLast bit. Numbering starts at 1, in order to
162
//keep the m_lastQRow[CCol] == 0 case denoting "no hit" in the CCol
163
//to save some looping/ifs later on
164
if
(m_hitQCores[CCol][QRow]) m_lastQRow[CCol] = QRow + 1;
165
}
166
}
167
168
}
169
170
void
ITkPixEncoder::encodeEvent
()
const
{
171
172
//only called from mutex-protected function
173
174
//This produces the bits for one event.
175
//First, scan the map and produce helpers
176
scanHitMap
();
177
178
for
(
unsigned
CCol = 0; CCol <
m_nCCol
; CCol++){
179
//if there are no hits in this CCol, continue
180
if
(m_lastQRow[CCol] == 0)
continue
;
181
//add the 6-bit (CCol + 1) address
182
addBits64
(CCol + 1, 6);
183
184
unsigned
previousQRow = std::numeric_limits<unsigned>::max();
185
for
(
unsigned
QRow = 0; QRow <
m_nQRow
; QRow++){
186
//if there's no hit in this row, continue
187
if
(!m_hitQCores[CCol][QRow])
continue
;
188
189
//add the isLast bit
190
QRow + 1 == m_lastQRow[CCol] ?
addBits64
(0x1, 1) :
addBits64
(0x0, 1);
191
192
//add the isNeighbor bit. If false, add the QRow address as well.
193
if
(previousQRow != std::numeric_limits<unsigned>::max() && QRow == previousQRow + 1) {
194
addBits64
(0x1, 1);
195
}
else
{
196
addBits64
(0x0, 1);
197
addBits64
(QRow, 8);
198
};
199
200
//add the map and ToT
201
encodeQCore
(CCol, QRow);
202
203
//update the previous QRow
204
previousQRow = QRow;
205
}
206
}
207
}
208
209
void
ITkPixEncoder::streamTag
(
const
uint8_t nStream)
const
{
210
211
//only called from mutex-protected function
212
213
//this adds the 8-bit 'global' stream tag
214
addBits64
(nStream, 8);
215
}
216
217
void
ITkPixEncoder::intTag
(
const
uint16_t nEvt)
const
{
218
219
//only called from mutex-protected function
220
221
//this adds 11 bits of interal tagging between events.
222
//does the tag always need to start with 111?
223
uint16_t tag = nEvt | (0b111 << 8);
224
addBits64
(tag, 11);
225
}
226
227
void
ITkPixEncoder::setChipID
(
const
uint8_t& chipID){
228
m_chipID
= chipID;
229
}
230
231
void
ITkPixEncoder::clear
()
const
{
232
std::lock_guard<std::mutex>
lock
(
m_mutex
);
233
m_words.clear();
234
}
length
double length(const pvec &v)
Definition
FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
lock
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
ITkPixEncoder.h
ITkPixQCoreEncodingLUT.h
ITkPixEncoder::pushWords32
void pushWords32() const
Definition
ITkPixEncoder.cxx:75
ITkPixEncoder::m_dropToT
bool m_dropToT
Definition
ITkPixEncoder.h:77
ITkPixEncoder::m_nCol
unsigned m_nCol
Definition
ITkPixEncoder.h:62
ITkPixEncoder::m_bitsPerWord
size_t m_bitsPerWord
Definition
ITkPixEncoder.h:78
ITkPixEncoder::encodeQCore
void encodeQCore(const unsigned nCCol, const unsigned nQRow) const
Definition
ITkPixEncoder.cxx:92
ITkPixEncoder::m_nRowInQRow
unsigned m_nRowInQRow
Definition
ITkPixEncoder.h:62
ITkPixEncoder::m_chipID
uint8_t m_chipID
Definition
ITkPixEncoder.h:79
ITkPixEncoder::m_plainHitMap
bool m_plainHitMap
Definition
ITkPixEncoder.h:77
ITkPixEncoder::scanHitMap
void scanHitMap() const
Definition
ITkPixEncoder.cxx:147
ITkPixEncoder::encodeEvent
void encodeEvent() const
Definition
ITkPixEncoder.cxx:170
ITkPixEncoder::hitInQCore
bool hitInQCore(const unsigned CCol, const unsigned QRow) const
Definition
ITkPixEncoder.cxx:132
ITkPixEncoder::m_nQRow
unsigned m_nQRow
Definition
ITkPixEncoder.h:62
ITkPixEncoder::m_nCCol
unsigned m_nCCol
Definition
ITkPixEncoder.h:62
ITkPixEncoder::addBits64
void addBits64(const uint64_t value, const uint8_t length) const
Definition
ITkPixEncoder.cxx:29
ITkPixEncoder::m_mutex
std::mutex m_mutex
Definition
ITkPixEncoder.h:84
ITkPixEncoder::m_nColInCCol
unsigned m_nColInCCol
Definition
ITkPixEncoder.h:62
ITkPixEncoder::streamTag
void streamTag(const uint8_t nStream) const
Definition
ITkPixEncoder.cxx:209
ITkPixEncoder::m_nEventsPerStream
unsigned m_nEventsPerStream
Definition
ITkPixEncoder.h:66
ITkPixEncoder::setChipID
void setChipID(const uint8_t &chipID)
Definition
ITkPixEncoder.cxx:227
ITkPixEncoder::clear
void clear() const
Definition
ITkPixEncoder.cxx:231
ITkPixEncoder::m_nRow
unsigned m_nRow
Definition
ITkPixEncoder.h:62
ITkPixEncoder::ITkPixEncoder
ITkPixEncoder(const bool enableChipID=true, const unsigned nCol=400, const unsigned nRow=384, const unsigned nColInCCol=8, const unsigned nRowInQRow=2, const unsigned nEventsPerStream=16, const bool plainHitMap=false, const bool dropToT=false)
Definition
ITkPixEncoder.cxx:20
ITkPixEncoder::m_enableChipID
bool m_enableChipID
Definition
ITkPixEncoder.h:77
ITkPixEncoder::intTag
void intTag(const uint16_t nEvt) const
Definition
ITkPixEncoder.cxx:217
ITkPixEncoding::ITkPixV2QCoreEncodingLUT_Length
constexpr std::array< uint32_t, LookUpTableSize > ITkPixV2QCoreEncodingLUT_Length
Definition
ITkPixQCoreEncodingLUT.h:122
ITkPixEncoding::ITkPixV2QCoreEncodingLUT_Tree
constexpr std::array< uint32_t, LookUpTableSize > ITkPixV2QCoreEncodingLUT_Tree
Definition
ITkPixQCoreEncodingLUT.h:121
pix
Definition
PixelMapping.cxx:16
Generated on
for ATLAS Offline Software by
1.17.0