ATLAS Offline Software
Loading...
Searching...
No Matches
SCT_RodDecoder.h
Go to the documentation of this file.
1// -*- C++ -*-
2
3/*
4 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
5*/
6
7#ifndef INDETRAWDATABYTESTREAM_SCT_RODDECODER_H
8#define INDETRAWDATABYTESTREAM_SCT_RODDECODER_H
9
12
20
21#include "GaudiKernel/ToolHandle.h"
22
23#include <atomic>
24#include <cstdint>
25#include <string>
26#include <unordered_map>
27#include <unordered_set>
28#include <vector>
29#include <array>
30
31class IdentifierHash;
32
33
42public:
44 : errorsIDC{ idcContainer } {}
46 for (auto [id, err]: accumulatedErrors) {
47 errorsIDC.setOrDrop(id, err);
48 }
49 }
50 void noerror(const IdentifierHash id) {
51 accumulatedErrors[id]; // this adds 0 (no error) for an ID
52 }
53
57
59 if (accumulatedErrors[id]==0) {
60 accumulatedErrors.erase(id);
61 }
62 }
63
64 std::map<IdentifierHash, IDCInDetBSErrContainer::ErrorCode> accumulatedErrors;
66};
67
68
76class SCT_RodDecoder : public extends<AthAlgTool, ISCT_RodDecoder>
77{
79 struct CacheHelper {
81 const std::vector<IdentifierHash>* vecHash = nullptr;
82 };
83
84 public:
85
87 SCT_RodDecoder(const std::string& type, const std::string& name, const IInterface* parent);
88
90 virtual ~SCT_RodDecoder() = default;
91
93 virtual StatusCode initialize() override;
94
96 virtual StatusCode finalize() override;
97
109 virtual StatusCode fillCollection(const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment& robFrag,
110 SCT_RDO_Container& rdoIDCont,
112 DataPool<SCT3_RawData>* dataItemsPool,
113 const EventContext& ctx,
114 const std::vector<IdentifierHash>* vecHash = nullptr) const override;
115
116 private:
117
126 };
127
129 struct SharedData {
130 static constexpr int INVALID_STRIP = N_STRIPS_PER_SIDE;
131
132 bool condensedMode{true}; // Condensed mode or Expanded mode for each link if superCondensedMode is false
133
134 // Variables necessary for makeRDO
136 int groupSize{0};
137 int timeBin{0};
138 IdentifierHash linkIDHash; // Determined from header and changed for links using Rx redundancy (waferHash)
139 Identifier collID; // Determined from linkIDHash (waferID)
140 int errors{0}; // Encodes the errors on the header (bit 4: error in condensed mode 1st hit, bit 5: error in condensed mode 2nd hit)
141 CacheHelper cache{}; // For the trigger
142 std::vector<int> errorHit;
143
144 int side {-1};
145 int oldSide {-1};
147 int linkNumber{0}; // Determined from header and may be changed for links using Rx redundancy
148
149 std::array<bool, N_STRIPS_PER_SIDE*N_SIDES> saved{};//defaults to false
150
151 // For MissingLinkHeaderError
153 std::unordered_set<IdentifierHash> foundHashes;
154 struct Hasher {
155 std::size_t operator()(const IdentifierHash &hash) const { return hash.value();}
156 };
157 std::unordered_map<IdentifierHash, std::unique_ptr<SCT_RDO_Collection>, Hasher> rdoCollMap; // If SCT_RDO_Collection* is nullptr, it means the collection is already present in the container.
158 std::unordered_map<IdentifierHash, SCT_RDO_Container::IDC_WriteHandle, Hasher> writeHandleMap;
159
160 bool foundHeader{false};
161
163 writeHandleMap.reserve( 72);
164 rdoCollMap.reserve( 72 );
165 }
166
167 void reset() {
170 oldSide = -1;
171 groupSize = 0;
172 errors = 0;
173 saved.fill(false);
174 errorHit.clear();
175 };
176 void setOld() {
177 oldStrip = strip;
178 oldSide = side;
179 groupSize = 0;
180 }
181 void setSaved(const bool isOld, const int code) {
182 if (isOld) {
184 }
185 else {
186 saved.at( side*N_STRIPS_PER_SIDE + strip) = code;
187 }
188 }
189 bool isSaved(const bool isOld) {
190 if (isOld) {
191 unsigned int idx = static_cast<std::size_t>(oldSide*N_STRIPS_PER_SIDE + oldStrip);
192 return idx < saved.size() ? saved[idx] : true;
193 }
194 else {
195 const unsigned int idx = static_cast<unsigned int>(side*N_STRIPS_PER_SIDE + strip);
196 return idx < saved.size() ? saved[idx] : true;
197 }
198 }
199 bool isStripValid() const {
200 return static_cast<unsigned int>(strip) < N_STRIPS_PER_SIDE;
201 }
202 bool isOldStripValid() const {
203 return static_cast<unsigned int>(oldStrip) < N_STRIPS_PER_SIDE;
204 }
207 }
208 void setCollection(const SCT_ID* sctID,
209 const IdentifierHash& waferHash,
210 SCT_RDO_Container& rdoIDCont,
211 DataPool<SCT3_RawData>* dataItemsPool,
213 linkIDHash = waferHash;
214 collID = sctID->wafer_id(linkIDHash);
215 foundHashes.insert(linkIDHash);
216 if (rdoCollMap.count(linkIDHash)==0) { // The collection is not in the local map.
217 writeHandleMap.insert(std::pair<IdentifierHash, SCT_RDO_Container::IDC_WriteHandle>(linkIDHash, rdoIDCont.getWriteHandle(linkIDHash)));
218 if (writeHandleMap[linkIDHash].alreadyPresent()) { // The collection is already in the container.
219 rdoCollMap[linkIDHash] = nullptr;
220 writeHandleMap.erase(linkIDHash); // lock is released
221 }
222 else { // Create a new collection for linkIDHash
223 std::unique_ptr<SCT_RDO_Collection> rdoColl{std::make_unique<SCT_RDO_Collection>(linkIDHash)};
224 rdoColl->setIdentifier(collID);
225 if(dataItemsPool){
226 //pool will own
227 rdoColl->clear(SG::VIEW_ELEMENTS);
228 }
229 rdoCollMap[linkIDHash] = std::move(rdoColl);
230 errs.noerror(linkIDHash); // make sure the error information is filled for this hash
231 }
232 }
233 }
234 };
235
250 int makeRDO(const bool isOld,
251 SharedData& data,
252 CacheHelper& cache,
253 DataPool<SCT3_RawData>* dataItemsPool) const;
254
264 StatusCode addRODError(uint32_t rodID, SCT_ByteStreamErrors::ErrorType error,
266 const EventContext& ctx,
267 const std::unordered_set<IdentifierHash>* foundHashes=nullptr) const;
276 StatusCode addSingleError(const IdentifierHash& hashID,
279 const EventContext& ctx) const;
280
289 StatusCode setFirstTempMaskedChip(const IdentifierHash& hashID,
290 unsigned int firstTempMaskedChip,
292 const EventContext& ctx) const;
293
307 StatusCode processHeader(const uint16_t inData,
308 const uint32_t robID,
309 SharedData& data,
310 SCT_RDO_Container& rdoIDCont,
311 DataPool<SCT3_RawData>* dataItemsPool,
312 CacheHelper& cache,
314 bool& hasError,
315 bool& breakNow,
316 const EventContext& ctx) const;
317
330 StatusCode processSuperCondensedHit(const uint16_t inData,
331 const uint32_t robID,
332 SharedData& data,
333 SCT_RDO_Container& rdoIDCont,
334 DataPool<SCT3_RawData>* dataItemsPool,
335 CacheHelper& cache,
337 bool& hasError,
338 const EventContext& ctx) const;
339
352 StatusCode processCondensedHit(const uint16_t inData,
353 const uint32_t robID,
354 SharedData& data,
355 SCT_RDO_Container& rdoIDCont,
356 DataPool<SCT3_RawData>* dataItemsPool,
357 CacheHelper& cache,
359 bool& hasError,
360 const EventContext& ctx) const;
361
374 StatusCode processExpandedHit(const uint16_t inData,
375 const uint32_t robID,
376 SharedData& data,
377 SCT_RDO_Container& rdoIDCont,
378 DataPool<SCT3_RawData>* dataItemsPool,
379 CacheHelper& cache,
381 bool& hasError,
382 const EventContext& ctx) const;
383
394 StatusCode processABCDError(const uint16_t inData,
395 const uint32_t robID,
396 SharedData& data,
398 bool& hasError,
399 const EventContext& ctx) const;
400
411 StatusCode processRawData(const uint16_t inData,
412 const uint32_t robID,
413 SharedData& data,
415 bool& hasError,
416 const EventContext& ctx) const;
417
428 StatusCode processTrailer(const uint16_t inData,
429 const uint32_t robID,
430 SharedData& data,
432 bool& hasError,
433 const EventContext& ctx) const;
434
437 const SCT_ID* m_sctID{nullptr};
438
442
444 ToolHandle<ISCT_CablingTool> m_cabling{this,
445 "SCT_CablingTool",
446 "SCT_CablingTool",
447 "Tool to retrieve SCT Cabling"};
448
450 ToolHandle<ISCT_ConfigurationConditionsTool> m_configTool{this,
451 "ConfigTool",
452 "SCT_ConfigurationConditionsTool/InDetSCT_ConfigurationConditionsTool",
453 "Tool to retrieve SCT Configuration Tool"};
454
456 mutable std::atomic_uint m_singleCondHitNumber{0};
457
459 mutable std::atomic_uint m_pairedCondHitNumber{0};
460
462 mutable std::atomic_uint m_firstExpHitNumber{0};
463
465 mutable std::atomic_uint m_evenExpHitNumber{0};
466
468 mutable std::atomic_uint m_lastExpHitNumber{0};
469
471 mutable std::atomic_uint m_headNumber{0};
472
474 mutable std::atomic_uint m_trailerNumber{0};
475
477 mutable std::atomic_uint m_headErrorBCID{0};
478
480 mutable std::atomic_uint m_headErrorLvl1ID{0};
481
483 mutable std::atomic_uint m_headErrorTimeout{0};
484
486 mutable std::atomic_uint m_headErrorFormatter{0};
487
489 mutable std::atomic_uint m_headErrorPreamble{0};
490
492 mutable std::atomic_uint m_trailerErrorOverflow{0};
493
495 mutable std::atomic_uint m_trailerErrorLimit{0};
496
498 mutable std::atomic_uint m_trailerErrorBit{0};
499
501 mutable std::atomic_uint m_configDataBit{0};
502
504 mutable std::atomic_uint m_flagErrorBit{0};
505
507 mutable std::atomic_uint m_condHit1Error{0};
508
510 mutable std::atomic_uint m_condHit2Error{0};
511
513 mutable std::atomic_uint m_chipNumberError{0};
514
516 mutable std::atomic_uint m_unknownDataFormat{0};
517
519 mutable std::atomic_uint m_nHits{0};
520
522 mutable std::atomic_uint m_nRDOs{0};
523
525 mutable std::atomic_uint m_maskedLinkNumber{0};
526
528 mutable std::atomic_uint m_maskedRODNumber{0};
529
531 mutable std::atomic_uint m_rodClockErrorNumber{0};
532
534 mutable std::atomic_uint m_truncatedRODNumber{0};
535
537 mutable std::atomic_uint m_numMissingLinkHeader{0};
538
540 std::vector<bool> m_swapPhiReadoutDirection{};
541};
542
543#endif //SCT_RAWDATABYTESTREAM_SCT_RODDECODER_H
interface file for tool that keeps track of errors in the bytestream.
Header file for abstract interface to SCT cabling tool.
interface file for service that keeps track of configuration conditions
Define SCT byte stream errors and utility methods.
This is an Identifier helper class for the SCT subdetector.
InDetRawDataContainer< InDetRawDataCollection< SCT_RDORawData > > SCT_RDO_Container
a typed memory pool that saves time spent allocation small object.
Definition DataPool.h:63
IDC like storage for BS errors, TODO, customise implementation further so that we store int rather th...
This class saves the "context" of an expanded identifier (ExpandedIdentifier) for compact or hash ver...
Definition IdContext.h:26
IDC_WriteHandle getWriteHandle(IdentifierHash hash)
This is a "hash" representation of an Identifier.
This is an Identifier helper class for the SCT subdetector.
Definition SCT_ID.h:68
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int side) const
For a single side of module.
Definition SCT_ID.h:459
allows to accumulate errors in one fillColection call
void add(const IdentifierHash id, SCT_ByteStreamErrors::ErrorType etype)
std::map< IdentifierHash, IDCInDetBSErrContainer::ErrorCode > accumulatedErrors
SCT_RodDecoderErrorsHelper(IDCInDetBSErrContainer &idcContainer)
void removeIfEmpty(const IdentifierHash id)
IDCInDetBSErrContainer & errorsIDC
void noerror(const IdentifierHash id)
std::atomic_uint m_firstExpHitNumber
Total number of first strips with hit decoded in expanded mode.
std::atomic_uint m_singleCondHitNumber
Total number of single strips with hit decoded in condensed mode.
std::atomic_uint m_nHits
Total number of SCT hits in ByteStream.
ToolHandle< ISCT_ConfigurationConditionsTool > m_configTool
Service that keeps track of configuration conditions.
SCT_DecoderNumbers
Define frequently used magic numbers.
std::atomic_uint m_pairedCondHitNumber
Total number of paired strips with hit decoded in condensed mode.
StatusCode processCondensedHit(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 hit word in Condensed mode.
std::atomic_uint m_headNumber
Total number of decoded header data.
IdContext m_contextSCT
"Context" of an expanded identifier (ExpandedIdentifier) for compact or hash versions (Identifier32 o...
StatusCode processTrailer(const uint16_t inData, const uint32_t robID, SharedData &data, SCT_RodDecoderErrorsHelper &errs, bool &hasError, const EventContext &ctx) const
Process trailer word.
std::atomic_uint m_headErrorFormatter
Total number of formatter errors in the header data.
std::atomic_uint m_headErrorLvl1ID
Total number of Lvl1ID errors in the header data.
StatusCode processSuperCondensedHit(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 hit word in Super-Condensed mode.
std::atomic_uint m_truncatedRODNumber
Total number of truncated ROBFragments.
std::atomic_uint m_flagErrorBit
Total number of flag error data.
std::atomic_uint m_maskedRODNumber
Total number of masked RDOs.
std::atomic_uint m_headErrorTimeout
Total number of timeout errors in the header data.
std::atomic_uint m_trailerErrorBit
Total number of trailer bit errors.
SCT_RodDecoder(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.
StatusCode addRODError(uint32_t rodID, SCT_ByteStreamErrors::ErrorType error, SCT_RodDecoderErrorsHelper &errs, const EventContext &ctx, const std::unordered_set< IdentifierHash > *foundHashes=nullptr) const
Add an error for each wafer in the problematic ROD.
std::atomic_uint m_rodClockErrorNumber
Total number of ROD clock errors.
std::atomic_uint m_trailerErrorOverflow
Total number of overflow errors in the trailer data.
const SCT_ID * m_sctID
Identifier helper class for the SCT subdetector that creates compact Identifier objects and Identifie...
std::atomic_uint m_headErrorPreamble
Total number of preamble errors in the header data.
std::vector< bool > m_swapPhiReadoutDirection
Swap phi readout direction.
std::atomic_uint m_condHit1Error
Total number of first hit data errors.
virtual StatusCode finalize() override
Finalize.
std::atomic_uint m_chipNumberError
Total number of chip number errors.
virtual StatusCode initialize() override
Initialize.
std::atomic_uint m_maskedLinkNumber
Total number of masked links in the header data.
StatusCode setFirstTempMaskedChip(const IdentifierHash &hashID, unsigned int firstTempMaskedChip, SCT_RodDecoderErrorsHelper &errs, const EventContext &ctx) const
Set first temporarily masked chip information from byte stream trailer.
StatusCode processExpandedHit(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 hit word in Expanded mode.
std::atomic_uint m_nRDOs
Total number of SCT RDOs created.
std::atomic_uint m_unknownDataFormat
Total number of unknown data formats.
StatusCode addSingleError(const IdentifierHash &hashID, SCT_ByteStreamErrors::ErrorType error, SCT_RodDecoderErrorsHelper &errs, const EventContext &ctx) const
Add single eror.
std::atomic_uint m_headErrorBCID
Total number of BCID errors in the header data.
std::atomic_uint m_lastExpHitNumber
Total number of last consecutive strips with hit decoded in expanded mode.
ToolHandle< ISCT_CablingTool > m_cabling
Providing mappings of online and offline identifiers and also serial numbers.
std::atomic_uint m_trailerNumber
Total number of decoded trailer data.
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.
std::atomic_uint m_configDataBit
Total number of configuration data for raw data.
virtual ~SCT_RodDecoder()=default
Destructor.
int makeRDO(const bool isOld, SharedData &data, CacheHelper &cache, DataPool< SCT3_RawData > *dataItemsPool) const
Builds RawData RDO and adds to RDO container.
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.
std::atomic_uint m_evenExpHitNumber
Total number of consecutive paired strips with hit decoded in expanded mode.
std::atomic_uint m_numMissingLinkHeader
Total number of missing link headers.
StatusCode processRawData(const uint16_t inData, const uint32_t robID, SharedData &data, SCT_RodDecoderErrorsHelper &errs, bool &hasError, const EventContext &ctx) const
Process raw data word.
std::atomic_uint m_trailerErrorLimit
Total number of header trailer limit errors in the trailer data.
std::atomic_uint m_condHit2Error
Total number second hit data errors.
StatusCode processABCDError(const uint16_t inData, const uint32_t robID, SharedData &data, SCT_RodDecoderErrorsHelper &errs, bool &hasError, const EventContext &ctx) const
Process ABCD error.
eformat::ROBFragment< PointerType > ROBFragment
Definition RawEvent.h:27
ErrorType
SCT byte stream error type enums used in SCT_RodDecoder, SCT_ByteStreamErrorsTool,...
void addError(IDCInDetBSErrContainer::ErrorCode &errWord, ErrorType errType)
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Temp object to help with trigger caching.
const std::vector< IdentifierHash > * vecHash
std::size_t operator()(const IdentifierHash &hash) const
std::vector< int > errorHit
void setSaved(const bool isOld, const int code)
std::array< bool, N_STRIPS_PER_SIDE *N_SIDES > saved
std::unordered_set< IdentifierHash > foundHashes
std::unordered_map< IdentifierHash, SCT_RDO_Container::IDC_WriteHandle, Hasher > writeHandleMap
bool isSaved(const bool isOld)
std::unordered_map< IdentifierHash, std::unique_ptr< SCT_RDO_Collection >, Hasher > rdoCollMap
static constexpr int INVALID_STRIP
void setCollection(const SCT_ID *sctID, const IdentifierHash &waferHash, SCT_RDO_Container &rdoIDCont, DataPool< SCT3_RawData > *dataItemsPool, SCT_RodDecoderErrorsHelper &errs)