ATLAS Offline Software
Loading...
Searching...
No Matches
ITkStripsRodDecoder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
11
13
14#include <algorithm>
15#include <array>
16#include <utility>
17
18// Initialize
19
21{
22
23 // Retrieve cabling tool
24 ATH_CHECK(m_cabling.retrieve());
25 ATH_MSG_DEBUG("Retrieved tool " << m_cabling);
26 ATH_CHECK(detStore()->retrieve(m_itkStripsID,"SCT_ID"));
27 m_contextITk = m_itkStripsID->wafer_context();
28 m_swapPhiReadoutDirection.resize(m_itkStripsID->wafer_hash_max(), false);
29 const InDetDD::SCT_DetectorManager* itkStripsDetManager{nullptr};
30 ATH_CHECK(detStore()->retrieve(itkStripsDetManager, "ITkStrip"));
31 const InDetDD::SiDetectorElementCollection* sctDetElementColl{itkStripsDetManager->getDetectorElementCollection()};
32 for (const InDetDD::SiDetectorElement* element: *sctDetElementColl) {
33 if (element->swapPhiReadoutDirection()) {
34 m_swapPhiReadoutDirection[element->identifyHash()] = true;
35 }
36 }
37 ATH_MSG_DEBUG("Initialization was successful");
38 return StatusCode::SUCCESS;
39}
40
41// fillCollection method
43 SCT_RDO_Container& rdoIDCont,
44 IDCInDetBSErrContainer& errorsIDC,
45 DataPool<SCT3_RawData>* dataItemsPool,
46 const EventContext& ctx,
47 const std::vector<IdentifierHash>* vecHash) const
48{
49 SCT_RodDecoderErrorsHelper errs = errorsIDC; // on destruction will fill the IDC
50
51 const uint32_t robID=robFrag.rod_source_id();
52
53 StatusCode sc = StatusCode::SUCCESS;
54
55 SharedData data;
56 data.reset();
57
58 CacheHelper cache; // For the trigger
59 cache.vecHash = vecHash;
60
62 const unsigned long int vecROBDataSize{robFrag.rod_ndata()};
63 if (vecROBDataSize > robFrag.payload_size_word()) {
64 ATH_MSG_WARNING("The ROB data does not seem to fit in the payload. Rejecting fragment (ndata size " << vecROBDataSize << " !< payload size " << robFrag.payload_size_word()
65 << " header size: " << robFrag.rod_header_size_word()
66 << " trailer size: " << robFrag.rod_trailer_size_word()
67 << " fragment size: " << robFrag.rod_fragment_size_word()
68 << ")");
69 return StatusCode::RECOVERABLE;
70 }
71 robFrag.rod_data(vecROBData);
72
73 ATH_MSG_DEBUG("vecROBDataSize: " << vecROBDataSize);
74
75 // Loop over header, hit element, flagged ABCD error, raw data, trailer words
76 for (uint32_t i=0; i<vecROBDataSize; i++) {
77 // The data is 16-bits wide packed to a 32-bit word (rob_it1). So we unpack it here.
78 ATH_MSG_DEBUG("ROB: "<< std::bitset<32>(vecROBData[i]));
79 }
80
81 const uint8_t* vecROBData_8bits = reinterpret_cast<const uint8_t*>(vecROBData);
82 const size_t total_bytes = vecROBDataSize * sizeof(uint32_t);
83
84 uint32_t nclusters = 0;
85 uint8_t isHCCHeader = 0;
86 int nPacket = 0;
87 uint16_t hccword1 = 0;
88 uint8_t word8 = 0;
89 uint8_t HccHeadFound = 0;
90 uint16_t packetSize = 0;
91 bool noClusterTag = false;
92
93 for (size_t i=0; i < total_bytes; i+=2) {
94 //Read Header
95 bool hasError = false;
96 bool breakNow = false;
97 uint16_t psize=packetSize/4;
98 uint16_t word16 = (vecROBData_8bits[i] << 8) | vecROBData_8bits[i + 1];
99 ATH_MSG_DEBUG(" 16-bit word: " << std::bitset<16>(word16) << " " << (uint32_t)i << " " << total_bytes );
100
101 if(i==total_bytes-2) ATH_MSG_DEBUG("nClusters found (this): " << (uint32_t)nclusters);
102
103 ATH_MSG_DEBUG("Check: " << nPacket << " Packets: " << packetSize/4 << " isHCCHeader: " << (uint32_t)isHCCHeader << " " << nPacket);
104
105 if(psize != 0 && nPacket != 0){
106 ATH_MSG_DEBUG("check: " << (nPacket+1) % (packetSize/2));
107 if((nPacket+1) % (packetSize/2)==0) nPacket=-1;
108 }
109
110 if(word16 == 0 && noClusterTag && nPacket != 0){
111 ATH_MSG_DEBUG("Skip empty end of packet 16-bit word: ");
112 nPacket++;
113 }else if((vecROBData_8bits[i] == 0 || isHCCHeader == 1) && HccHeadFound == 0 && nPacket<2){
114 //HCC header found
115 ATH_MSG_DEBUG("HCC header found, will decode the next three 8-bit words: " <<(uint32_t)isHCCHeader);
116 if(isHCCHeader == 0){
117 hccword1 = (vecROBData_8bits[i + 1] << 8) | vecROBData_8bits[i+2];
118 ATH_MSG_DEBUG("HCC header: "<<std::bitset<16>(hccword1));
119 } else if(isHCCHeader == 1){
120 word8 = vecROBData_8bits[i + 1];
121 ATH_MSG_DEBUG("HCC header: "<<std::bitset<8>(word8));
122 }
123 ATH_CHECK(processHccHeader(hccword1, word8, isHCCHeader, robID, data, rdoIDCont, dataItemsPool, cache, errs, hasError, breakNow,ctx));
124 if(isHCCHeader==0) HccHeadFound = 1;
125 nPacket++;
126 noClusterTag=false;
127 }else if((HccHeadFound==1 && vecROBData_8bits[i] == 0) || HccHeadFound==2){
128 if(HccHeadFound==1) HccHeadFound=2;
129 else if(HccHeadFound==2){
130 packetSize = word16;
131 ATH_MSG_DEBUG("Packet size is: " << packetSize );
132 HccHeadFound=0;
133 }
134 nPacket++;
135 }else if(packetSize!=0 && ((vecROBData_8bits[i] & 0xF8) == 0x18) && (((nPacket+1) % (packetSize/2)) == 5)){
136 nPacket++;
137 ATH_MSG_DEBUG("Header found: " << std::bitset<16>(word16));
138 nclusters=0;
139 ATH_CHECK(processHeader(word16, robID, data, rdoIDCont, dataItemsPool, cache, errs, hasError, breakNow,ctx));
140 }else{
141 nPacket++;
142 if(word16 == 0xed6f){
143 ATH_MSG_DEBUG("No more clusters found");
144 noClusterTag=true;
145 continue;
146 }else{
147 nclusters+=1;
148 ATH_CHECK(processHits(word16, robID, data, rdoIDCont, dataItemsPool, cache, errs, hasError, ctx));
149 }
150 }
151 }
152
153 // Create the last RDO of the last link of the event
154 if (data.isStripValid()) {
155 if (not data.isSaved()) {
156 ATH_MSG_DEBUG("Strip is not saved");
157 const int rdoMade{makeRDO(data, cache, dataItemsPool)};
158 if (rdoMade == -1) {
159 sc = StatusCode::RECOVERABLE;
160 ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs));
161 }
162 else {
163 data.setSaved(rdoMade);
164 }
165 }
166 }
167
168 for (auto& [hash, rdoColl] : data.rdoCollMap) {
169 if (rdoColl==nullptr) continue; // nullptr means the collection is already filled.
170
171 if (rdoColl->empty()) { // Empty collection is not filled.
172 rdoColl.reset();
173 errs.removeIfEmpty(hash); // To get the same result as before. Not sure whether we need this.
174 continue;
175 }
176
177 ATH_CHECK(data.writeHandleMap[hash].addOrDelete(std::move(rdoColl)));
178 }
179
180 if (sc.isFailure()) ATH_MSG_DEBUG("One or more ByteStream errors found ");
181 return sc;
182}
183
184// makeRDO method
185
187 CacheHelper& cache,
188 DataPool<SCT3_RawData>* dataItemsPool) const
189{
190 // If the link is already decoded, RDO will not be created.
191 SCT_RDO_Collection* rdoColl{data.rdoCollMap[data.linkIDHash].get()};
192 if (rdoColl==nullptr) {
193 ATH_MSG_WARNING("Null rdoCollection pointer found for linkIDHash: " << (uint32_t)data.linkIDHash);
194 return 0;
195 }
196
197 int strip = data.strip;
198 if (((strip & 0x7F) + (data.groupSize-1) >= 9999) or (strip<0) or (strip>=9999)) {
199 ATH_MSG_WARNING("Cluster with " << data.groupSize << " strips, starting at strip " << strip
200 << " in collection " << data.linkIDHash << " out of range. Will not make RDO");
201 return -1;
202 }
203
204 // This option is for the trigger, if there is a vecHash* given, test it!
205 if (cache.vecHash) {
206 if (data.linkIDHash == cache.skipHash) {
207 ATH_MSG_VERBOSE("Collection for Hash not to be decoded, skip");
208 return 0;
209 }
210 else if (data.linkIDHash != cache.lastHash) {
211 cache.lastHash = data.linkIDHash;
212 // Maybe the new hash is not in the list, so test it
213 std::vector<IdentifierHash>::const_iterator hashIDIterator{find(cache.vecHash->begin(),
214 cache.vecHash->end(),
215 data.linkIDHash)};
216 if (hashIDIterator == cache.vecHash->end()) {
217 ATH_MSG_VERBOSE("Collection for Hash not to be decoded, skip");
218 // Remember this one, so that we do not find(...) forever
219 cache.skipHash = data.linkIDHash;
220 return 0;
221 }
222 }
223 }
224
225 // Get identifier from the hash, this is not nice
226 const Identifier digitID{m_itkStripsID->strip_id(data.collID, strip)};
227 if (not m_itkStripsID->is_sct(digitID)) {
228 ATH_MSG_WARNING("Cluster with invalid Identifier. Will not make RDO");
229 return -1;
230 }
231
232 const unsigned int rawDataWord{static_cast<unsigned int>(data.groupSize | (strip << 11) | (data.timeBin <<22) | (data.errors << 25))};
233
234 ATH_MSG_DEBUG("Output Raw Data " << std::hex << " Coll " << data.collID.getString()
235 << ":-> " << m_itkStripsID->print_to_string(digitID) << std::dec);
236
237 // Now the Collection is there for sure. Create RDO and push it into Collection.
238 m_nRDOs++;
239
240 if(dataItemsPool){
241 SCT3_RawData* sct_rdo = dataItemsPool->nextElementPtr();
242 (*sct_rdo) = SCT3_RawData(digitID, rawDataWord, &(data.errorHit));
243 rdoColl->push_back(sct_rdo);
244 }else{
245 rdoColl->push_back(std::make_unique<SCT3_RawData>(digitID, rawDataWord, &(data.errorHit)));
246 }
247 return 1;
248}
249
250// addRODError method
251
254 const std::unordered_set<IdentifierHash>* /*foundHashes*/) const
255{
256 return StatusCode::SUCCESS;
257}
258
259// addSingleError method
260
263 SCT_RodDecoderErrorsHelper& /*errs*/) const
264{
265 return StatusCode::SUCCESS;
266}
267
268
269StatusCode ITkStripsRodDecoder::processHccHeader(const uint16_t hccword1,
270 const uint8_t word8,
271 uint8_t &isHCCHeader,
272 const uint32_t /*robID*/,
273 SharedData& data,
274 SCT_RDO_Container& rdoIDCont,
275 DataPool<SCT3_RawData>* dataItemsPool,
276 CacheHelper& /*cache*/,
278 bool& /*hasError*/,
279 bool& /*breakNow*/,
280 const EventContext& /*ctx*/) const
281{
282
283 StatusCode sc{StatusCode::SUCCESS};
284
285 if(isHCCHeader == 1){
286 isHCCHeader = 0;
287 ATH_MSG_DEBUG("Decoding HCC bits");
288 /*24 bits in total
289 bits from 24-8 are in hccword1
290 Last 8bits are in word8
291 */
292 uint8_t barrel = ((hccword1 >> 8) & 0x80);
293 ATH_MSG_DEBUG("is barrel: " << std::bitset<16>(hccword1 >> 8) << " " << std::bitset<8>(barrel));
294 uint8_t side = ((hccword1 >> 5) & 0x80);
295 ATH_MSG_DEBUG("side : " << std::bitset<16>(hccword1 >> 5) << " " << std::bitset<8>(side));
296 uint8_t disk = ((hccword1 >> 9) & 0x7);
297 ATH_MSG_DEBUG("disk : " << std::bitset<16>((hccword1 >> 9) & 0x7) << " " << std::bitset<8>(disk));
298 uint8_t inout = ((hccword1 >> 8) & 0x1);
299 ATH_MSG_DEBUG("inout : " << std::bitset<16>((hccword1 >> 8) & 0x1) << " " << std::bitset<8>(inout));
300 uint8_t petal = ((hccword1 >> 7) & 0x1);
301 ATH_MSG_DEBUG("petal : " << std::bitset<16>((hccword1 >> 7) & 0x1) << " " << std::bitset<8>(petal));
302 uint8_t phimod = hccword1 & 0x7F;
303 ATH_MSG_DEBUG("phimod : " << std::bitset<16>(hccword1 & 0x7F) << " " << std::bitset<8>(phimod));
304 uint8_t hccnum = word8 & 0x80;
305 ATH_MSG_DEBUG("hccnum : " << std::bitset<16>(word8 & 0x80) << " " << std::bitset<8>(hccnum));
306 uint8_t etamod = word8 & 0x3F;
307 ATH_MSG_DEBUG("etamod : " << std::bitset<16>(word8 & 0x3F) << " " << std::bitset<8>(etamod));
308
309 bool isbarrel = (barrel != 0x0);
310 bool issideA = (side != 0x0);
311 bool isinout = (inout == 0x1);
312 bool ispetal = (petal == 0x1);
313 uint8_t hccN = (hccnum == 0x80) ? 2 : 1;
314
315 ATH_MSG_DEBUG("isBarrel: " << isbarrel << " isSideA: " << issideA << " disk: " << (uint32_t)disk);
316 ATH_MSG_DEBUG("isInOut: " << isinout << " isPetal: " << ispetal << " phimod: " << (uint32_t)phimod);
317 ATH_MSG_DEBUG("HCCNum: " << (uint32_t)hccN << " etamod: " << (uint32_t)etamod);
318
319 int barrel_ec = isbarrel ? 0 : (issideA ? 2 : -2);
320
321 const Identifier waferID = m_itkStripsID -> wafer_id(barrel_ec, disk, phimod, etamod, inout);
322 const IdentifierHash offlinehash = m_itkStripsID -> wafer_hash(waferID);
323 data.setCollection(m_itkStripsID, offlinehash, rdoIDCont, dataItemsPool, errs);
324
325 data.side = inout;
326 ATH_MSG_DEBUG("hccheader " << isbarrel << " " << issideA << " " << (uint32_t)disk << " " << (uint32_t)inout << " " << (uint32_t)phimod << " " << (uint32_t)etamod << " " << (uint32_t)hccN );
327 }
328 else isHCCHeader++;
329
330 return sc;
331}
332
333
334StatusCode ITkStripsRodDecoder::processHeader(const uint16_t word16,
335 const uint32_t robID,
336 SharedData& data,
337 SCT_RDO_Container& /*rdoIDCont*/,
338 DataPool<SCT3_RawData>* dataItemsPool,
339 CacheHelper& cache,
341 bool& hasError,
342 bool& breakNow,
343 const EventContext& ctx) const
344{
345 StatusCode sc = StatusCode::SUCCESS;
346
347 data.foundHeader = true;
348 m_headNumber++;
349
350 uint8_t type = (word16 >> 12) & 0xF; // bits [15:12]
351 // Useful information
352 uint8_t l0tag = (word16 >> 4) & 0x7F; // bits [10:4]
353 uint8_t bcid_low = (word16 >> 1) & 0x7; // bits [3:1]
354 uint8_t bcid_xor = word16 & 0x1; // bits [0]
355
356 ATH_MSG_DEBUG("l0tag: " << (uint32_t)l0tag << " bcid_low: " << (uint32_t)bcid_low << " bcid_xor: " << (uint32_t)bcid_xor << " type: " << (uint32_t)type << " word16: " << std::bitset<16>(word16));
357
358 if (type == 0x01) { // PR Header
359 constexpr bool breakHere{false};
360 ATH_MSG_DEBUG("PR Packet Found");
361 if (hasError) sc = StatusCode::RECOVERABLE;
362 if (breakHere) return sc;
363 } else {
364 ATH_MSG_WARNING("Unexpected packet type (not PR): 0x" << std::hex << int(type));
365 return sc;
366 }
367
368 // Create the last RDO of the previous link if any
369 if (data.isStripValid()) {
370 if (not data.isSaved()) {
371
372 const int rdoMade{makeRDO(data, cache, dataItemsPool)};
373 if (rdoMade == -1) {
374 hasError = true;
375 ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs));
376 }
377 else {
378 data.setSaved(rdoMade);
379 }
380 }
381 }
382
383 // Everything is set to default for a new hunt of RDO
384 data.reset();
385
386 // Link Number (or stream) in the ROD fragment
387 const int rodlinkNumber{static_cast<int>(word16 & 0x7F)};
388
389 // This is the real calculation for the offline
390 data.linkNumber = (((rodlinkNumber >>4)&0x7)*12+(rodlinkNumber &0xF));
391 const uint32_t onlineID{(robID & 0xFFFFFF) | (data.linkNumber << 24)};
392 ATH_MSG_DEBUG("OnlineID: " << (uint32_t)onlineID << " Link number: " << data.linkNumber);
393 IdentifierHash hash;
394 if ((onlineID ==0) or (data.linkNumber > 95)) {
395 ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs));
396 hasError = true;
397 ATH_MSG_DEBUG("Header: xxx Link number out of range (skipping following data)"
398 << std::dec << data.linkNumber);
399 breakNow = true;
400 return sc;
401 }
402 else {
403 hash = m_cabling->getHashFromOnlineId(onlineID, ctx);
404 if (hash.is_valid()) {
405 ATH_MSG_DEBUG("setCollectionCall");
406 //data.setCollection(m_itkStripsID, hash, rdoIDCont, dataItemsPool, errs);
407 }
408 else {
409 std::stringstream msg;
410 msg <<std::hex << onlineID;
411 ATH_MSG_WARNING("Rob fragment (rob=" << robID << ") with invalid onlineID " << msg.str() << " -> " << hash << ".");
412 }
413 }
414 if (!hasError and not hash.is_valid()) {
415 std::stringstream msg;
416 msg <<std::hex << onlineID;
417 ATH_MSG_WARNING("Rob fragment (rob=" << robID << ") with invalid onlineID " << msg.str() << " -> " << hash << ".");
418 hasError = true;
419 }
420
421 data.condensedMode = static_cast<bool>(word16 & 0x100);
422
423 return sc;
424}
425
426StatusCode ITkStripsRodDecoder::processHits(const uint16_t word16,
427 const uint32_t /*robID*/,
428 SharedData& data,
429 SCT_RDO_Container& /*rdoIDCont*/,
430 DataPool<SCT3_RawData>* dataItemsPool,
431 CacheHelper& cache,
433 bool& hasError,
434 const EventContext& /*ctx*/) const
435{
436 StatusCode sc = StatusCode::SUCCESS;
437
438 uint nchip = (word16 >> 11) & 0xF;
439 bool isSecondRow = (word16 >> 10) & 0x01; // Near/Far Strip selector (0 = Near, 1 = Far)
440 uint8_t address = (word16 >> 3) & 0x7F; // Strip local address in the selected row [0,127]
441
442 //Get the next three strips in the cluster
443 uint8_t firsthit = (word16 >> 2) & 0x1;
444 uint8_t secondhit = (word16 >> 1) & 0x1;
445 uint8_t thirdhit = (word16) & 0x1;
446
447 ATH_MSG_DEBUG("First hit: " << std::bitset<16>(firsthit));
448 ATH_MSG_DEBUG("Second hit: " << std::bitset<16>(secondhit));
449 ATH_MSG_DEBUG("Third hit: " << std::bitset<16>(thirdhit));
450
451 uint8_t stripN1 = 0,stripN2 = 0,stripN3=0;
452 uint8_t addr = 0;
453
454 if(firsthit) {
455 addr = address+1;
456 stripN1 = 2*addr + (isSecondRow ? 1 : 0);
457 }
458 if(secondhit) {
459 addr = address+2;
460 stripN2 = 2*addr + (isSecondRow ? 1 : 0);
461 }
462 if(thirdhit) {
463 addr = address+3;
464 stripN3 = 2*addr + (isSecondRow ? 1 : 0);
465 }
466
467 //int strip_logical_channel = 2*address + (isSecondRow ? 1 : 0); // May be needed later
468 data.strip = nchip * 128 + address;
469
470 ATH_MSG_DEBUG("abcclusters " << (uint32_t)nchip << " " << (uint32_t)data.strip << " " << (uint32_t)(stripN1) << " " << (uint32_t)(stripN2) << " " << (uint32_t)(stripN3));
471
472 data.groupSize = 1;
473 if (thirdhit) data.groupSize = 4;
474 else if (secondhit) data.groupSize = 3;
475 else if (firsthit) data.groupSize = 2;
476
477 const int rdoMade = makeRDO(data, cache, dataItemsPool);
478 if (rdoMade == -1) {
479 hasError = true;
480 ATH_CHECK(addSingleError(data.linkIDHash, SCT_ByteStreamErrors::ByteStreamParseError, errs));
481 } else {
482 data.setSaved(rdoMade);
483 }
484 return sc;
485}
486
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
unsigned int uint
static Double_t sc
InDetRawDataCollection< SCT_RDORawData > SCT_RDO_Collection
InDetRawDataContainer< InDetRawDataCollection< SCT_RDORawData > > SCT_RDO_Container
a typed memory pool that saves time spent allocation small object.
Definition DataPool.h:63
pointer nextElementPtr()
obtain the next available element in pool by pointer pool is resized if its limit has been reached On...
value_type push_back(value_type pElem)
IDC like storage for BS errors, TODO, customise implementation further so that we store int rather th...
StatusCode addSingleError(const IdentifierHash &hashID, SCT_ByteStreamErrors::ErrorType error, SCT_RodDecoderErrorsHelper &errs) const
Add single eror.
std::atomic_uint m_headNumber
Total number of decoded header data.
int makeRDO(SharedData &data, CacheHelper &cache, DataPool< SCT3_RawData > *dataItemsPool) const
Builds RawData RDO and adds to RDO container.
StatusCode processHeader(const uint16_t inData, const uint32_t robID, SharedData &data, SCT_RDO_Container &rdoIDCont, DataPool< SCT3_RawData > *dataItemsPool, CacheHelper &cache, SCT_RodDecoderErrorsHelper &errs, bool &hasError, bool &breakNow, const EventContext &ctx) const
Process header word.
StatusCode processHits(const uint16_t inData, const uint32_t robID, SharedData &data, SCT_RDO_Container &rdoIDCont, DataPool< SCT3_RawData > *dataItemsPool, CacheHelper &cache, SCT_RodDecoderErrorsHelper &errs, bool &hasError, const EventContext &ctx) const
Process raw data word.
virtual StatusCode initialize() override
Initialize.
std::atomic_uint m_nRDOs
Total number of SCT RDOs created.
ToolHandle< IITkStripCablingTool > m_cabling
Providing mappings of online and offline identifiers and also serial numbers.
const SCT_ID * m_itkStripsID
Identifier helper class for the SCT subdetector that creates compact Identifier objects and Identifie...
StatusCode processHccHeader(const uint16_t inData, const uint8_t data8, uint8_t &isHCCHeader, const uint32_t robID, SharedData &data, SCT_RDO_Container &rdoIDCont, DataPool< SCT3_RawData > *dataItemsPool, CacheHelper &cache, SCT_RodDecoderErrorsHelper &errs, bool &hasError, bool &breakNow, const EventContext &ctx) const
Process header word.
virtual StatusCode fillCollection(const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment &robFrag, SCT_RDO_Container &rdoIDCont, IDCInDetBSErrContainer &errs, DataPool< SCT3_RawData > *dataItemsPool, const EventContext &ctx, const std::vector< IdentifierHash > *vecHash=nullptr) const override
Fill SCT RDO Collection with decoded ROB data.
IdContext m_contextITk
"Context" of an expanded identifier (ExpandedIdentifier) for compact or hash versions (Identifier32 o...
std::vector< bool > m_swapPhiReadoutDirection
Swap phi readout direction.
StatusCode addRODError(uint32_t rodID, SCT_ByteStreamErrors::ErrorType error, SCT_RodDecoderErrorsHelper &errs, const std::unordered_set< IdentifierHash > *foundHashes=nullptr) const
Add an error for each wafer in the problematic ROD.
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.
allows to accumulate errors in one fillColection call
void removeIfEmpty(const IdentifierHash id)
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:140
const DataType * PointerType
Definition RawEvent.h:25
eformat::ROBFragment< PointerType > ROBFragment
Definition RawEvent.h:27
ErrorType
SCT byte stream error type enums used in SCT_RodDecoder, SCT_ByteStreamErrorsTool,...
Temp object to help with trigger caching.
Struct to hold data shared in methods used in fillCollection method.
MsgStream & msg
Definition testRead.cxx:32