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