ATLAS Offline Software
Loading...
Searching...
No Matches
ITkStripsRodEncoder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
12
13
14#include "Identifier/Identifier.h"
16
17namespace { // Anonymous namespace
18 template<unsigned int n>
19 unsigned long long
20 chunk(std::bitset<128> b){
21 static constexpr std::bitset<128> mask64(~0ULL);
22 static constexpr unsigned int shift{n * 64};
23 return ((b >>shift) & mask64).to_ullong();
24 }
25 std::vector<uint8_t>
26 split32bitWord(uint32_t word){
27 std::vector<uint8_t> out;
28 out.push_back(word>>24);
29 out.push_back(word>>16);
30 out.push_back(word>>8);
31 out.push_back(word);
32 return out;
33 }
34 int
35 rodLinkFromOnlineID(const ITkStripOnlineId onlineID){
36 const uint32_t fibre{onlineID.fibre()};
37 const int formatter{static_cast<int>((fibre/12) & 0x7)};
38 const int linkNum{static_cast<int>((fibre - (formatter*12)) & 0xF)};
39 const int rodLink{(formatter << 4) | linkNum};
40 return rodLink;
41 }
43 hccKey(int barrelEC, uint8_t side, uint8_t disk, uint8_t phi_mod, int eta_mod, uint8_t eta_group){
44
45 uint32_t hcckey = 0, mask = 1;
46 uint8_t sideAC = 0;
47 bool hasTwoHccs = false;
48
49 //Set barrel/endcap/side bit
50 if(barrelEC == 0){
51 hcckey = mask << 23;
52 if(eta_mod>0) sideAC=1;
53 } else if(barrelEC > 0) sideAC=1;
54
55 //Set Side-A/C bit
56 if(sideAC==1) hcckey = hcckey | (mask << 20);
57
58 //Set the layer/disk bits
59 hcckey = hcckey | (disk<<17);
60
61 //Set the inner/outer side bit
62 if(side==1) hcckey = hcckey | (mask << 16);
63
64 //Set the petal bit (0 for barrel)
65 if(barrelEC!=0) hcckey = hcckey | (mask << 15);
66
67 //Set the phi module number
68 hcckey = hcckey | (phi_mod<<8);
69
70 //Set the HCC number
71 if(disk<2 && barrelEC==0) {
72 hasTwoHccs = true;
73 }else if(eta_group!=2 && barrelEC!=0){
74 hasTwoHccs = true;
75 }
76
77 eta_mod = std::abs(eta_mod);
78 //This is to get the right Hcc number (1 or 2) per module algorithmically could try to improve this in the future
79 if ( hasTwoHccs && ( ((eta_mod-1)/2.0 >= 2*eta_group+1 && barrelEC==0) || ((((eta_mod/2.0 >= 2*eta_group+1) && eta_mod<=7) || ((eta_mod/2.0 >= 2*eta_group) && (eta_mod>=10 && eta_mod<=13))) && barrelEC!=0))){
80 hcckey = hcckey | (mask << 7);
81 }
82
83 barrelEC = (barrelEC == 0) ? 1 : 0;
84 //Set the eta group number
85 hcckey = hcckey | (eta_mod); // For now, use eta_mod. This should later be changed to eta_group
86
87 return hcckey << 8;
88 }
89
90} // End of anonymous namespace
91
92// Initialize
95 ATH_MSG_DEBUG("ITkStripsRodEncoder::initialize()");
96
97 // Retrieve cabling tool
98 ATH_CHECK(m_cabling.retrieve());
99 ATH_MSG_DEBUG("Retrieved tool " << m_cabling);
100 ATH_CHECK(detStore()->retrieve(m_itkStripsID, "SCT_ID"));
101 const InDetDD::SCT_DetectorManager* itkStripsDetManager{nullptr};
102 ATH_CHECK(detStore()->retrieve(itkStripsDetManager, "ITkStrip"));
103 const InDetDD::SiDetectorElementCollection* sctDetElementColl{itkStripsDetManager->getDetectorElementCollection()};
104 for (const InDetDD::SiDetectorElement* sctDetElement : *sctDetElementColl) {
105 if (sctDetElement->swapPhiReadoutDirection()) {
106 m_swapModuleID.insert(sctDetElement->identify());
107 }
108 }
109
110 if (not m_dataRateMonTool.empty())
111 ATH_CHECK(m_dataRateMonTool.retrieve());
112
113 ATH_MSG_DEBUG("Initialization was successful");
114 return StatusCode::SUCCESS;
115}
116
117
118
119void
120ITkStripsRodEncoder::fillROD(std::vector<uint32_t>& vec32Data, const uint32_t& robID,
121 const std::vector<const SCT_RDORawData*>& vecRDOs) const {
122 //code to be filled here
123
124 std::unordered_map<uint32_t, std::vector<std::bitset<256>>> allStripData;
125 std::unordered_map<uint32_t, IdentifierHash> keyToHash;
126
127 IdentifierHash offlineHash = 0;
128
129 for (const auto& rdo : vecRDOs) {
130 int barrelEC = getBarrelEC(rdo);
131 int eta_mod = getEtaModule(rdo);
132 uint8_t side = getSide(rdo);
133 uint8_t disk = getDiskLayer(rdo);
134 uint8_t phi_mod = getPhiModule(rdo);
135 uint16_t strip_max = getStripMax(rdo);
136
137 if (strip_max == 0xFFFF){
138 //To do: Implement workaround
139 const Identifier rdoID{rdo->identify()};
140 ATH_MSG_WARNING("Negative maximum number of strips found " << m_itkStripsID->strip_max(rdoID));
141 continue;
142 }
143
144 uint8_t sideAC = 0;
145 if((barrelEC == 0 && eta_mod > 0) || barrelEC > 0) sideAC = 1;
146
147 uint8_t eta_group=0;
148
149 if (barrelEC == 0) {
150 if(disk < 2){
151 eta_group = static_cast<uint8_t>(std::floor((std::abs(eta_mod)-1) / 4));
152 }else{
153 eta_group = static_cast<uint8_t>(std::floor((std::abs(eta_mod)-1) / 2));
154 }
155 }else {
156 if(eta_mod>=0 && eta_mod<=9) eta_group = static_cast<uint8_t>(std::floor(eta_mod / 4));
157 else if(eta_mod>=10 && eta_mod<=13) eta_group = static_cast<uint8_t>(std::floor((eta_mod+2)/4));
158 else if(eta_mod>13) eta_group = static_cast<uint8_t>(std::floor((eta_mod-6)/2));
159 }
160
161 uint8_t chips_per_module = (strip_max + 1) / 128;
162 uint32_t key = hccKey(barrelEC, side, disk, phi_mod, eta_mod, eta_group);
163
164 offlineHash = m_itkStripsID->wafer_hash(offlineID(rdo));
165 keyToHash.insert({key,offlineHash});
166 ATH_MSG_DEBUG("barrel: "<< barrelEC<<" sideAC: " << (uint32_t)sideAC << " disk: "<<(uint32_t)disk << " side: " << (uint32_t)side <<" phi_mod: "<<(uint32_t)phi_mod << " eta_mod: " << eta_mod << " eta group: "<<(uint32_t)eta_group << " chips per module: " << (uint32_t)chips_per_module << " " << (uint32_t)robID << " " << (uint32_t)m_itkStripsID->wafer_hash(offlineID(rdo)));
167 ATH_MSG_DEBUG("key: " << std::bitset<32>(key));
168 auto& StripData = allStripData[key];
169
170 if (StripData.empty()) {
171 StripData.resize(chips_per_module);
172 }
173
174 //Populate the bitset for each chip with active strips
175 int strip = getStrip(rdo);
176 int chip = static_cast<int>(std::floor(strip / 128));
177 int strip_position = strip % 128;
178 int strip_logical_channel = 2*strip_position + (isNear(eta_mod, barrelEC == 0)? 0 : 1);
179
180 ATH_MSG_DEBUG("strip N: "<< strip << " chip n: " << chip << " Strip position: " << strip_position << " Strip position logical: " << strip_logical_channel);
181 StripData[chip].set(strip_logical_channel);
182 }
183
184 std::vector<uint8_t> vec8Data;
185 uint32_t vectorSize = 0;
186 std::vector<uint16_t> clusters;
187
188 ATH_MSG_DEBUG("All strip data size: " << allStripData.size());
189
190 //Iterate over processed strip data and find clusters
191 for (const auto& [key, StripData] : allStripData) {
192
193 uint16_t ichannel = 0;
194 uint16_t size = 1;
195 int ptype = 1;
196 bool keyRecorded = false;
197 clusters.clear();
198
199 ATH_MSG_DEBUG("key is: " << std::bitset<32>(key) << " StripData size: " << StripData.size());
200
201 for (size_t i = 0; i < StripData.size(); ++i) {
202
203 std::bitset<256> hits = StripData[i];
204
205 if(hits==0){
206 ++ichannel;
207 continue;
208 }
209
210 //Use clusterFinder to extract clusters from the bitset
211 clusters = clusterFinder(hits);
212
213 if(clusters.empty()){
214 ++ichannel;
215 continue;
216 }
217 uint32_t hccKey = (keyRecorded) ? 0 : key;
218 encodeData(clusters, ichannel, vec8Data, ptype, m_l0tag , m_bcid, hccKey, size);
219 keyRecorded = true;
220 ++ichannel;++size;
221 }
222 vec8Data.push_back(0xed);
223 vec8Data.push_back(0x6f);
224 ATH_MSG_DEBUG("Add 16-0s: " << size % 2 << " " << vec8Data.size());
225
226 if(size % 2 == 0){
227 vec8Data.push_back(0);
228 vec8Data.push_back(0);
229 }
230 uint32_t packetLenght = (vec8Data.size()-vectorSize)+4;
231 ATH_MSG_DEBUG("Packet Lenght: " << (uint32_t)packetLenght << " " << std::bitset<32>(packetLenght));
232
233 std::vector<uint8_t> pktlenght = split32bitWord(packetLenght);
234
235 ATH_MSG_DEBUG("PktLenght: " << pktlenght.size() << " vec8Data size: " << vec8Data.size());
236
237 uint32_t offset = vectorSize + 4;
238 vec8Data.insert(vec8Data.begin()+offset, pktlenght.begin(), pktlenght.end());
239 vectorSize = vec8Data.size();
240
241 ATH_MSG_DEBUG("vec8Data size: " << vec8Data.size() << " size: " << size-1);
242 packFragments(vec8Data,vec32Data);
243 if (not m_dataRateMonTool.empty()) {
244 m_dataRateMonTool->fill(keyToHash[key], vec32Data, allStripData[key]);
245 }
246 vec32Data.clear();
247 }
248
249 //Update BCID and L0Tag counters
250 m_bcid = (m_bcid + 1) & 0x7F;
251 m_l0tag = (m_l0tag + 1) & 0x7F;
252
253 ATH_MSG_DEBUG("vec8Data size: " << vec8Data.size());
254
255 packFragments(vec8Data,vec32Data);
256
257 for(auto &word: vec32Data){
258 ATH_MSG_DEBUG("32-bit word: " << std::bitset<32>(word));
259 }
260 return;
261}
262
263void
264ITkStripsRodEncoder::encodeData(const std::vector<uint16_t>& clusters, const uint16_t ichannel,std::vector<uint8_t>& data_encode,
265 int ptyp, uint8_t l0tag, uint8_t bc_count, uint32_t hccKey, uint16_t& size) const {
266
267
268 if(hccKey!=0){
269 ATH_MSG_DEBUG("hccKey: " << std::bitset<32>(hccKey));
270 ATH_MSG_DEBUG("hccKey 8-bit word-4: "<<std::bitset<8>(hccKey));
271 ATH_MSG_DEBUG("hccKey 8-bit word-3: "<<std::bitset<8>(hccKey>>24));
272 ATH_MSG_DEBUG("hccKey 8-bit word-2: "<<std::bitset<8>(hccKey>>16));
273 ATH_MSG_DEBUG("hccKey 8-bit word-1: "<<std::bitset<8>(hccKey>>8));
274
275 data_encode.push_back(hccKey);
276 data_encode.push_back(hccKey>>24);
277 data_encode.push_back(hccKey>>16);
278 data_encode.push_back(hccKey>>8);
279
280 uint16_t header = getHeaderPhysicsPacket(ptyp, l0tag, bc_count);
281 ATH_MSG_DEBUG("header: " << std::bitset<16>(header));
282 data_encode.push_back((header>>8) & 0xff);
283 data_encode.push_back(header & 0xff);
284 }
285
286 for(size_t idx=0;auto &cluster : clusters){
287 if(cluster == 0x3fe) continue;
288 if(idx!=0) size++;
289
290 // cluster bits:
291 // "0" + 4-bit channel number + 11-bit cluster dropping the last cluster bit
292 uint16_t clusterbits = ((ichannel & 0xf) << 11) | (cluster & 0x7ff);
293 ATH_MSG_DEBUG("Clusters: " << idx << ": " << std::bitset<16>(clusterbits) << " size: " << size << " ichannel: " << ichannel);
294 data_encode.push_back((clusterbits>>8) & 0xff);
295 data_encode.push_back(clusterbits & 0xff);
296 idx++;
297 }
298
299 return;
300}
301
302
303std::vector<uint16_t>
304ITkStripsRodEncoder::clusterFinder(const std::bitset<256>& inputData, const uint8_t maxCluster) const {
305
306 std::vector<uint16_t> clusters;
307
308 // Split into far (odd) and near (even) strips
309 std::bitset<128> dataEven;
310 std::bitset<128> dataOdd;
311 for(int i=0; i<128; ++i){
312 dataEven[i] = inputData[2*i];
313 dataOdd[i] = inputData[2*i+1];
314 }
315
316 // Split the 128-bit Even and Odd data into four 64-bit chunks for processing
317 uint64_t d0l = chunk<0>(dataEven);
318 uint64_t d0h = chunk<1>(dataEven);
319
320 uint64_t d1l = chunk<0>(dataOdd);
321 uint64_t d1h = chunk<1>(dataOdd);
322
323 while (d0l or d0h or d1l or d1h){
324 if (clusters.size() > maxCluster) break;
325
326 uint16_t cluster1 = clusterFinder_sub(d1h, d1l, true);
327 if (cluster1 != 0x3ff) // No cluster was found
328 clusters.push_back(cluster1);
329
330 if (clusters.size() > maxCluster) break;
331
332 uint16_t cluster0 = clusterFinder_sub(d0h, d0l, false);
333 if (cluster0 != 0x3ff) // No cluster was found
334 clusters.push_back(cluster0);
335 }
336
337 if (clusters.empty()) {
338 clusters.push_back(0x3fe);
339 } else {
340 clusters.back() |=1 << 11;
341 }
342
343 return clusters;
344}
345
346inline bool
347ITkStripsRodEncoder::getBit_128b(uint8_t bit_addr, uint64_t data_high64, uint64_t data_low64) const {
348 if (bit_addr > 127) return false;
349
350 return bit_addr<64 ? data_low64>>bit_addr & 1 : data_high64>>(bit_addr-64) & 1;
351}
352
353inline void
354ITkStripsRodEncoder::setBit_128b(uint8_t bit_addr, bool value, uint64_t& data_high64, uint64_t& data_low64) const {
355 if (bit_addr < 64) {
356 data_low64 = (data_low64 & ~(1ULL << bit_addr)) | ((uint64_t)value << bit_addr);
357 } else if (bit_addr < 128) {
358 data_high64 =
359 (data_high64 & ~(1ULL << (bit_addr-64))) | ((uint64_t)value << (bit_addr-64));
360 }
361}
362
363
364uint16_t
365ITkStripsRodEncoder::clusterFinder_sub(uint64_t& hits_high64, uint64_t& hits_low64, bool isSecondRow) const {
366 uint8_t hit_addr = 128;
367 uint8_t hit_mask = 0;
368
369 if (hits_low64){
370 hit_addr = __builtin_ctzll(hits_low64);
371 } else if (hits_high64){
372 hit_addr = __builtin_ctzll(hits_high64) + 64;
373 }
374
375 hit_mask = getBit_128b(hit_addr+1, hits_high64, hits_low64) << 2
376 | getBit_128b(hit_addr+2, hits_high64, hits_low64) << 1
377 | getBit_128b(hit_addr+3, hits_high64, hits_low64);
378
379 for (int i=0; i<4; ++i)
380 setBit_128b(hit_addr+i, 0, hits_high64, hits_low64);
381
382 if (hit_addr == 128) {
383 return 0x3ff;
384 } else {
385 hit_addr += isSecondRow<<7;
386 return hit_addr << 3 | hit_mask;
387 }
388}
389
390void
391ITkStripsRodEncoder::packFragments(std::vector<uint8_t>& vec8Words, std::vector<uint32_t>& vec32Words) const {
392 int num8Words{static_cast<int>(vec8Words.size())};
393 if (num8Words % 4 != 0) {
394 // Just add additional 8-bit words to make the size a multiple of 4
395 while (num8Words % 4 != 0) {
396 vec8Words.push_back(0x40); // Padding byte
397 num8Words++;
398 }
399 }
400 // Now merge 4 consecutive 8-bit words into 32-bit words
401 const unsigned short int numWords{4};
402 const unsigned short int position[numWords]{0, 8, 16, 24};
403 unsigned short int arr8Words[numWords]{0, 0, 0, 0};
404
405 for (int i{0}; i<num8Words; i += numWords) {
406 for (int j{0}; j<numWords; j++) {
407 arr8Words[j] = vec8Words[i + j];
408 }
409 const uint32_t uint32Word{set32Bits(arr8Words, position, numWords)};
410 vec32Words.push_back(uint32Word);
411 }
412 return;
413}
414
415// set32Bits function
416// This function combines four 8-bit words into a 32-bit word
417uint32_t ITkStripsRodEncoder::set32Bits(const unsigned short int* arr8Words, const unsigned short int* position, const unsigned short int& numWords) const
418{
419 uint32_t uint32Word{0};
420 uint32_t pos{0};
421 uint32_t uint8Word{0};
422 for (uint16_t i{0}; i<numWords; i++) {
423 uint8Word = static_cast<uint32_t>(*(arr8Words + i));
424 pos = static_cast<uint32_t>(*(position + i));
425 uint32Word |= (uint8Word << pos); // Shift the 8-bit word to its correct position and merge
426 }
427 return uint32Word;
428}
429
430
431// Get RDO info functions
432int
434 const Identifier rdoID{rdo->identify()};
435 return m_itkStripsID->strip(rdoID);
436}
437
440 const Identifier rdoId{rdo->identify()};
441 return m_itkStripsID->wafer_id(rdoId);
442}
443
444uint32_t
445ITkStripsRodEncoder::onlineID(const SCT_RDORawData* rdo, const EventContext& ctx) const {
446 const Identifier waferID{offlineID(rdo)};
447 const IdentifierHash offlineIDHash{m_itkStripsID->wafer_hash(waferID)};
448 return static_cast<uint32_t>(m_cabling->getOnlineIdFromHash(offlineIDHash, ctx));
449}
450
451int
452ITkStripsRodEncoder::getRODLink(const SCT_RDORawData* rdo, const EventContext& ctx) const {
453 return rodLinkFromOnlineID(onlineID(rdo, ctx));
454}
455
456int
458 const Identifier rdoID{rdo->identify()};
459 int itkSide{m_itkStripsID->side(rdoID)};
460 return itkSide;
461}
462
463int
465 const Identifier rdoID{rdo->identify()};
466 return m_itkStripsID->barrel_ec(rdoID);
467}
468
469uint8_t
471 const Identifier rdoID{rdo->identify()};
472 return m_itkStripsID->layer_disk(rdoID);
473}
474
475uint8_t
477 const Identifier rdoID{rdo->identify()};
478 return m_itkStripsID->phi_module(rdoID);
479}
480
481int
483 const Identifier rdoID{rdo->identify()};
484 return m_itkStripsID->eta_module(rdoID);
485}
486
487uint16_t
489 const Identifier rdoID{rdo->identify()};
490 if(m_itkStripsID->strip_max(rdoID)<0) return 0xFFFF;
491 return m_itkStripsID->strip_max(rdoID);
492}
493
494bool
496 val ^= val >> 4;
497 val ^= val >> 2;
498 val ^= val >> 1;
499 return val&1;
500}
501
502uint16_t
503ITkStripsRodEncoder::getHeaderPhysicsPacket(int typ, uint8_t l0tag, uint8_t bc_cout) const {
504 uint8_t bcid_low = bc_cout & 0x7; // BCID[2:0]
505 bool bc_parity = getParity_8bits(bc_cout);
506 //TYPE (4 bits) + FlagBit (1 bit) + L0tag (7 bits) + BCID (3 bits) + Parity (1 bit)
507 const uint16_t Header{static_cast<uint16_t>(((uint8_t)typ << 12) | (0x1 << 11) | (l0tag & 0x7f) << 4 | (bcid_low) << 1 | bc_parity)};
508 return Header;
509
510}
511
512
513//the following may be needed for ITkStrips, but must have different implementation
514uint16_t
515ITkStripsRodEncoder::getHeaderUsingRDO(const SCT_RDORawData* rdo, const EventContext& ctx) const {
516 const int rodLink{getRODLink(rdo, ctx)};
517 const uint16_t linkHeader{static_cast<uint16_t>(0x2000 | (m_condensed.value() << 8) | rodLink)};
518 return linkHeader;
519}
520
521uint16_t
522ITkStripsRodEncoder::getHeaderUsingHash(const IdentifierHash& linkHash, const int& errorWord, const EventContext& ctx) const {
523 const int rodLink{rodLinkFromOnlineID(m_cabling->getOnlineIdFromHash(linkHash, ctx))};
524 const uint16_t linkHeader{static_cast<uint16_t>(0x2000 | errorWord | (m_condensed.value() << 8) | rodLink)};
525 return linkHeader;
526}
527
528uint16_t
529ITkStripsRodEncoder::getTrailer(const int& errorWord) const {
530 const uint16_t linkTrailer{static_cast<uint16_t>(0x4000 | errorWord)};
531 return linkTrailer;
532}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
This is an Identifier helper class for the SCT subdetector.
size_t size() const
Number of registered mappings.
std::uint32_t fibre() const
Return the fibre.
const SCT_ID * m_itkStripsID
Identifier helper class for the ITkStrips subdetector that creates compact Identifier objects and Ide...
uint16_t getStripMax(const SCT_RDORawData *rdo) const
Get the maxumum strip value info from the RDO.
ToolHandle< IITkStripCablingTool > m_cabling
Providing mappings of online and offline identifiers and also serial numbers.
Identifier offlineID(const SCT_RDORawData *rdo) const
Get the offline Identifier from the RDO.
uint16_t getHeaderPhysicsPacket(int typ, uint8_t l0tag, uint8_t bc_count) const
Get the 16-bit word for a header with Type (PR or LP), L0Tag event and BCID.
BooleanProperty m_condensed
Example Boolean used to determine decoding mode, maybe unused finally.
int getBarrelEC(const SCT_RDORawData *rdo) const
Get the barrel/endcape info from the RDO.
virtual void fillROD(std::vector< uint32_t > &vec32Data, const uint32_t &robID, const std::vector< const SCT_RDORawData * > &vecRDOs) const override
Main Convert method.
void setBit_128b(uint8_t bit_addr, bool value, uint64_t &data_high64, uint64_t &data_low64) const
uint16_t clusterFinder_sub(uint64_t &hits_high64, uint64_t &hits_low64, bool isSecondRow) const
uint16_t getHeaderUsingRDO(const SCT_RDORawData *rdo, const EventContext &ctx) const
Get the 16-bit word for a header for a hit.
bool getBit_128b(uint8_t bit_addr, uint64_t data_high64, uint64_t data_low64) const
uint16_t getHeaderUsingHash(const IdentifierHash &linkHash, const int &errorWord, const EventContext &ctx) const
Get the 16-bit word for a header for a link with a ByteStream error.
std::atomic< uint8_t > m_l0tag
int getEtaModule(const SCT_RDORawData *rdo) const
Get the eta value info from the RDO.
uint16_t getTrailer(const int &errorWord) const
Get the 16-bit word for a trailer, with or without ByteStream errors.
int getSide(const SCT_RDORawData *rdo) const
Get the side info from the RDO.
int getStrip(const SCT_RDORawData *rdo) const
Get the strip number info from the RDO.
std::vector< uint16_t > clusterFinder(const std::bitset< 256 > &inputData, const uint8_t maxCluster=63) const
@breif Method to set pairs of 8 bit words to a 32 bit word.
uint8_t getPhiModule(const SCT_RDORawData *rdo) const
Get the phi value info from the RDO.
uint8_t getDiskLayer(const SCT_RDORawData *rdo) const
Get disk/layer info from the RDO.
uint32_t set32Bits(const unsigned short int *arr8Words, const unsigned short int *position, const unsigned short int &numWords) const
void encodeData(const std::vector< uint16_t > &clusters, const uint16_t ichannel, std::vector< uint8_t > &data_encode, int typ, uint8_t l0tag, uint8_t bc_count, uint32_t hccKey, uint16_t &size) const
ToolHandle< ITkStripDataRateMonTool > m_dataRateMonTool
virtual StatusCode initialize() override
Initialize.
std::set< Identifier > m_swapModuleID
Swap Module identifier, set by SCTRawContByteStreamTool.
bool isNear(const int &eta_mod, bool isBarrel=false) const
uint32_t onlineID(const SCT_RDORawData *rdo, const EventContext &ctx) const
Get the online Identifier from the RDO.
int getRODLink(const SCT_RDORawData *rdo, const EventContext &ctx) const
Get the ROD link number info in the RDO header data.
void packFragments(std::vector< uint8_t > &vec8Words, std::vector< uint32_t > &vec32Words) const
Method to pack vector of 8 bit words intto a vector of 32 bit words.
bool getParity_8bits(uint8_t val) const
std::atomic< uint8_t > m_bcid
Method to encode RDO data to vector of 16 bin words.
This is a "hash" representation of an Identifier.
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated SCT in...
virtual const SiDetectorElementCollection * getDetectorElementCollection() const override
access to whole collectiom
Class to hold the SiDetectorElement objects to be put in the detector store.
Class to hold geometrical description of a silicon detector element.
virtual Identifier identify() const override final
::StatusCode StatusCode
StatusCode definition for legacy code.
virtual void shift(size_t pos, ptrdiff_t offs) override
Shift the elements of the container.
BySideTypeMod sideAC(0)
setEventNumber uint32_t