ATLAS Offline Software
Loading...
Searching...
No Matches
ITkStripsRodDecoder Class Reference

#include <ITkStripsRodDecoder.h>

Inheritance diagram for ITkStripsRodDecoder:
Collaboration diagram for ITkStripsRodDecoder:

Classes

struct  CacheHelper
 Temp object to help with trigger caching. More...
struct  SharedData
 Struct to hold data shared in methods used in fillCollection method. More...

Public Member Functions

virtual ~ITkStripsRodDecoder ()=default
 Destructor.
virtual StatusCode initialize () override
 Initialize.
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.

Private Types

enum  ITk_DecoderNumbers { N_SIDES = 2 , N_CHIPS_PER_SIDE = 6 , N_STRIPS_PER_CHIP = 128 , N_STRIPS_PER_SIDE = 9999 }
 Define frequently used magic numbers. More...

Private Member Functions

int makeRDO (SharedData &data, CacheHelper &cache, DataPool< SCT3_RawData > *dataItemsPool) const
 Builds RawData RDO and adds to RDO container.
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.
StatusCode addSingleError (const IdentifierHash &hashID, SCT_ByteStreamErrors::ErrorType error, SCT_RodDecoderErrorsHelper &errs) const
 Add single eror.
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 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.
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.

Private Attributes

const SCT_ID * m_itkStripsID {nullptr}
 Identifier helper class for the SCT subdetector that creates compact Identifier objects and IdentifierHash or hash IDs.
IdContext m_contextITk
 "Context" of an expanded identifier (ExpandedIdentifier) for compact or hash versions (Identifier32 or IdentifierHash)
ToolHandle< IITkStripCablingTool > m_cabling
 Providing mappings of online and offline identifiers and also serial numbers.
std::atomic_uint m_singleCondHitNumber {0}
 Total number of single strips with hit decoded in condensed mode.
std::atomic_uint m_pairedCondHitNumber {0}
 Total number of paired strips with hit decoded in condensed mode.
std::atomic_uint m_firstExpHitNumber {0}
 Total number of first strips with hit decoded in expanded mode.
std::atomic_uint m_evenExpHitNumber {0}
 Total number of consecutive paired strips with hit decoded in expanded mode.
std::atomic_uint m_lastExpHitNumber {0}
 Total number of last consecutive strips with hit decoded in expanded mode.
std::atomic_uint m_headNumber {0}
 Total number of decoded header data.
std::atomic_uint m_trailerNumber {0}
 Total number of decoded trailer data.
std::atomic_uint m_headErrorBCID {0}
 Total number of BCID errors in the header data.
std::atomic_uint m_headErrorLvl1ID {0}
 Total number of Lvl1ID errors in the header data.
std::atomic_uint m_headErrorTimeout {0}
 Total number of timeout errors in the header data.
std::atomic_uint m_headErrorFormatter {0}
 Total number of formatter errors in the header data.
std::atomic_uint m_headErrorPreamble {0}
 Total number of preamble errors in the header data.
std::atomic_uint m_trailerErrorOverflow {0}
 Total number of overflow errors in the trailer data.
std::atomic_uint m_trailerErrorLimit {0}
 Total number of header trailer limit errors in the trailer data.
std::atomic_uint m_trailerErrorBit {0}
 Total number of trailer bit errors.
std::atomic_uint m_configDataBit {0}
 Total number of configuration data for raw data.
std::atomic_uint m_flagErrorBit {0}
 Total number of flag error data.
std::atomic_uint m_condHit1Error {0}
 Total number of first hit data errors.
std::atomic_uint m_condHit2Error {0}
 Total number second hit data errors.
std::atomic_uint m_chipNumberError {0}
 Total number of chip number errors.
std::atomic_uint m_unknownDataFormat {0}
 Total number of unknown data formats.
std::atomic_uint m_nHits {0}
 Total number of SCT hits in ByteStream.
std::atomic_uint m_nRDOs {0}
 Total number of SCT RDOs created.
std::atomic_uint m_maskedLinkNumber {0}
 Total number of masked links in the header data.
std::atomic_uint m_maskedRODNumber {0}
 Total number of masked RDOs.
std::atomic_uint m_rodClockErrorNumber {0}
 Total number of ROD clock errors.
std::atomic_uint m_truncatedRODNumber {0}
 Total number of truncated ROBFragments.
std::atomic_uint m_numMissingLinkHeader {0}
 Total number of missing link headers.
std::vector< bool > m_swapPhiReadoutDirection {}
 Swap phi readout direction.

Detailed Description

Definition at line 72 of file ITkStripsRodDecoder.h.

Member Enumeration Documentation

◆ ITk_DecoderNumbers

Define frequently used magic numbers.

Enumerator
N_SIDES 
N_CHIPS_PER_SIDE 
N_STRIPS_PER_CHIP 
N_STRIPS_PER_SIDE 

Definition at line 114 of file ITkStripsRodDecoder.h.

Constructor & Destructor Documentation

◆ ~ITkStripsRodDecoder()

virtual ITkStripsRodDecoder::~ITkStripsRodDecoder ( )
virtualdefault

Destructor.

Member Function Documentation

◆ addRODError()

StatusCode ITkStripsRodDecoder::addRODError ( uint32_t rodID,
SCT_ByteStreamErrors::ErrorType error,
SCT_RodDecoderErrorsHelper & errs,
const std::unordered_set< IdentifierHash > * foundHashes = nullptr ) const
private

Add an error for each wafer in the problematic ROD.

Parameters
rodIDIdentifer of ROD.
errorTypeError type info.
errsByte stream error container.
foundHashesFE-links whose headers are found. Used only for MissingLinkHeaderError.

Definition at line 252 of file ITkStripsRodDecoder.cxx.

255{
256 return StatusCode::SUCCESS;
257}

◆ addSingleError()

StatusCode ITkStripsRodDecoder::addSingleError ( const IdentifierHash & hashID,
SCT_ByteStreamErrors::ErrorType error,
SCT_RodDecoderErrorsHelper & errs ) const
private

Add single eror.

Parameters
hashIDIdentifier for hash.
bsErrorTypeByte Stream error type info.
errsByte stream error container.

Definition at line 261 of file ITkStripsRodDecoder.cxx.

264{
265 return StatusCode::SUCCESS;
266}

◆ fillCollection()

StatusCode ITkStripsRodDecoder::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
overridevirtual

Fill SCT RDO Collection with decoded ROB data.

Decode the rob data fragment and fill the collection SCT_RDO_Collection with the RDO built by the makeRDO(..) method. rdoIdc, and errs are updated based on robFrag and vecHash.

Parameters
robFragROB fragment.
rdoIDContRDO ID Container to be filled.
errsByte stream error container.
vecHashVector of hashes.

Definition at line 42 of file ITkStripsRodDecoder.cxx.

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
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}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
static Double_t sc
StatusCode addSingleError(const IdentifierHash &hashID, SCT_ByteStreamErrors::ErrorType error, SCT_RodDecoderErrorsHelper &errs) const
Add single eror.
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.
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.
void removeIfEmpty(const IdentifierHash id)
::StatusCode StatusCode
StatusCode definition for legacy code.
const DataType * PointerType
Definition RawEvent.h:25
const IIntersectionCache * cache() const
Retrieve the associated cache block, if it exists.
setWord1 uint16_t
setEventNumber uint32_t
Temp object to help with trigger caching.
Struct to hold data shared in methods used in fillCollection method.

◆ initialize()

StatusCode ITkStripsRodDecoder::initialize ( )
overridevirtual

Initialize.

Definition at line 20 of file ITkStripsRodDecoder.cxx.

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}
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...
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.
virtual const SiDetectorElementCollection * getDetectorElementCollection() const override
access to whole collectiom

◆ makeRDO()

int ITkStripsRodDecoder::makeRDO ( SharedData & data,
CacheHelper & cache,
DataPool< SCT3_RawData > * dataItemsPool ) const
private

Builds RawData RDO and adds to RDO container.

Method that builds the RawData RDO and add it to the collection rdoIdc and cache are updated based on other arguments.

Returns
Method has 3 possible return values: 1 if RDO was successfully created 0 if collection was deliberately skipped (for trigger) -1 if there was an error in the decoding - will be passed on as StatusCode::RECOVERABLE by fillCollection()
Parameters
dataStruct to hold data shared in methods used in fillCollection method
cacheCache.

Definition at line 186 of file ITkStripsRodDecoder.cxx.

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}
#define ATH_MSG_VERBOSE(x,...)
InDetRawDataCollection< SCT_RDORawData > SCT_RDO_Collection
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)
std::atomic_uint m_nRDOs
Total number of SCT RDOs created.
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:140

◆ processHccHeader()

StatusCode ITkStripsRodDecoder::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
private

Process header word.

Parameters
inDatainput 16 bit data word for header
robIDROB ID
dataStruct to hold data shared in methods used in fillCollection method
rdoIDContRDO ID Container to be filled.
cacheCache.
errsSCT_RodDecoderErrorsHelper to fill IDCInDetBSErrContainer
hasErrorfalse means no error, true means at least one error
breakNowto tell if need to break after this method execution.

Definition at line 269 of file ITkStripsRodDecoder.cxx.

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}
etamod(flags, cells_name, *args, **kw)
phimod(flags, cells_name, *args, **kw)

◆ processHeader()

StatusCode ITkStripsRodDecoder::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
private

Process header word.

Parameters
inDatainput 16 bit data word for header
robIDROB ID
dataStruct to hold data shared in methods used in fillCollection method
rdoIDContRDO ID Container to be filled.
cacheCache.
errsSCT_RodDecoderErrorsHelper to fill IDCInDetBSErrContainer
hasErrorfalse means no error, true means at least one error
breakNowto tell if need to break after this method execution.

Definition at line 334 of file ITkStripsRodDecoder.cxx.

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}
std::atomic_uint m_headNumber
Total number of decoded header data.
MsgStream & msg
Definition testRead.cxx:32

◆ processHits()

StatusCode ITkStripsRodDecoder::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
private

Process raw data word.

Parameters
inDatainput 16 bit data word for header
robIDROB ID
dataStruct to hold data shared in methods used in fillCollection method
errsSCT_RodDecoderErrorsHelper to fill IDCInDetBSErrContainer
hasErrorfalse means no error, true means at least one error

Definition at line 426 of file ITkStripsRodDecoder.cxx.

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}
unsigned int uint

Member Data Documentation

◆ m_cabling

ToolHandle<IITkStripCablingTool> ITkStripsRodDecoder::m_cabling
private
Initial value:
{this,
"ITkStripCablingTool",
"ITkStripCablingTool",
"Tool to retrieve ITkStrip Cabling"}

Providing mappings of online and offline identifiers and also serial numbers.

Definition at line 321 of file ITkStripsRodDecoder.h.

321 {this,
322 "ITkStripCablingTool",
323 "ITkStripCablingTool",
324 "Tool to retrieve ITkStrip Cabling"};

◆ m_chipNumberError

std::atomic_uint ITkStripsRodDecoder::m_chipNumberError {0}
mutableprivate

Total number of chip number errors.

Definition at line 384 of file ITkStripsRodDecoder.h.

384{0};

◆ m_condHit1Error

std::atomic_uint ITkStripsRodDecoder::m_condHit1Error {0}
mutableprivate

Total number of first hit data errors.

Definition at line 378 of file ITkStripsRodDecoder.h.

378{0};

◆ m_condHit2Error

std::atomic_uint ITkStripsRodDecoder::m_condHit2Error {0}
mutableprivate

Total number second hit data errors.

Definition at line 381 of file ITkStripsRodDecoder.h.

381{0};

◆ m_configDataBit

std::atomic_uint ITkStripsRodDecoder::m_configDataBit {0}
mutableprivate

Total number of configuration data for raw data.

Definition at line 372 of file ITkStripsRodDecoder.h.

372{0};

◆ m_contextITk

IdContext ITkStripsRodDecoder::m_contextITk
private

"Context" of an expanded identifier (ExpandedIdentifier) for compact or hash versions (Identifier32 or IdentifierHash)

Definition at line 318 of file ITkStripsRodDecoder.h.

◆ m_evenExpHitNumber

std::atomic_uint ITkStripsRodDecoder::m_evenExpHitNumber {0}
mutableprivate

Total number of consecutive paired strips with hit decoded in expanded mode.

Definition at line 336 of file ITkStripsRodDecoder.h.

336{0};

◆ m_firstExpHitNumber

std::atomic_uint ITkStripsRodDecoder::m_firstExpHitNumber {0}
mutableprivate

Total number of first strips with hit decoded in expanded mode.

Definition at line 333 of file ITkStripsRodDecoder.h.

333{0};

◆ m_flagErrorBit

std::atomic_uint ITkStripsRodDecoder::m_flagErrorBit {0}
mutableprivate

Total number of flag error data.

Definition at line 375 of file ITkStripsRodDecoder.h.

375{0};

◆ m_headErrorBCID

std::atomic_uint ITkStripsRodDecoder::m_headErrorBCID {0}
mutableprivate

Total number of BCID errors in the header data.

Definition at line 348 of file ITkStripsRodDecoder.h.

348{0};

◆ m_headErrorFormatter

std::atomic_uint ITkStripsRodDecoder::m_headErrorFormatter {0}
mutableprivate

Total number of formatter errors in the header data.

Definition at line 357 of file ITkStripsRodDecoder.h.

357{0};

◆ m_headErrorLvl1ID

std::atomic_uint ITkStripsRodDecoder::m_headErrorLvl1ID {0}
mutableprivate

Total number of Lvl1ID errors in the header data.

Definition at line 351 of file ITkStripsRodDecoder.h.

351{0};

◆ m_headErrorPreamble

std::atomic_uint ITkStripsRodDecoder::m_headErrorPreamble {0}
mutableprivate

Total number of preamble errors in the header data.

Definition at line 360 of file ITkStripsRodDecoder.h.

360{0};

◆ m_headErrorTimeout

std::atomic_uint ITkStripsRodDecoder::m_headErrorTimeout {0}
mutableprivate

Total number of timeout errors in the header data.

Definition at line 354 of file ITkStripsRodDecoder.h.

354{0};

◆ m_headNumber

std::atomic_uint ITkStripsRodDecoder::m_headNumber {0}
mutableprivate

Total number of decoded header data.

Definition at line 342 of file ITkStripsRodDecoder.h.

342{0};

◆ m_itkStripsID

const SCT_ID* ITkStripsRodDecoder::m_itkStripsID {nullptr}
private

Identifier helper class for the SCT subdetector that creates compact Identifier objects and IdentifierHash or hash IDs.

Also allows decoding of these IDs.

Definition at line 314 of file ITkStripsRodDecoder.h.

314{nullptr};

◆ m_lastExpHitNumber

std::atomic_uint ITkStripsRodDecoder::m_lastExpHitNumber {0}
mutableprivate

Total number of last consecutive strips with hit decoded in expanded mode.

Definition at line 339 of file ITkStripsRodDecoder.h.

339{0};

◆ m_maskedLinkNumber

std::atomic_uint ITkStripsRodDecoder::m_maskedLinkNumber {0}
mutableprivate

Total number of masked links in the header data.

Definition at line 396 of file ITkStripsRodDecoder.h.

396{0};

◆ m_maskedRODNumber

std::atomic_uint ITkStripsRodDecoder::m_maskedRODNumber {0}
mutableprivate

Total number of masked RDOs.

Definition at line 399 of file ITkStripsRodDecoder.h.

399{0};

◆ m_nHits

std::atomic_uint ITkStripsRodDecoder::m_nHits {0}
mutableprivate

Total number of SCT hits in ByteStream.

Definition at line 390 of file ITkStripsRodDecoder.h.

390{0};

◆ m_nRDOs

std::atomic_uint ITkStripsRodDecoder::m_nRDOs {0}
mutableprivate

Total number of SCT RDOs created.

Definition at line 393 of file ITkStripsRodDecoder.h.

393{0};

◆ m_numMissingLinkHeader

std::atomic_uint ITkStripsRodDecoder::m_numMissingLinkHeader {0}
mutableprivate

Total number of missing link headers.

Definition at line 408 of file ITkStripsRodDecoder.h.

408{0};

◆ m_pairedCondHitNumber

std::atomic_uint ITkStripsRodDecoder::m_pairedCondHitNumber {0}
mutableprivate

Total number of paired strips with hit decoded in condensed mode.

Definition at line 330 of file ITkStripsRodDecoder.h.

330{0};

◆ m_rodClockErrorNumber

std::atomic_uint ITkStripsRodDecoder::m_rodClockErrorNumber {0}
mutableprivate

Total number of ROD clock errors.

Definition at line 402 of file ITkStripsRodDecoder.h.

402{0};

◆ m_singleCondHitNumber

std::atomic_uint ITkStripsRodDecoder::m_singleCondHitNumber {0}
mutableprivate

Total number of single strips with hit decoded in condensed mode.

Definition at line 327 of file ITkStripsRodDecoder.h.

327{0};

◆ m_swapPhiReadoutDirection

std::vector<bool> ITkStripsRodDecoder::m_swapPhiReadoutDirection {}
private

Swap phi readout direction.

Definition at line 411 of file ITkStripsRodDecoder.h.

411{};

◆ m_trailerErrorBit

std::atomic_uint ITkStripsRodDecoder::m_trailerErrorBit {0}
mutableprivate

Total number of trailer bit errors.

Definition at line 369 of file ITkStripsRodDecoder.h.

369{0};

◆ m_trailerErrorLimit

std::atomic_uint ITkStripsRodDecoder::m_trailerErrorLimit {0}
mutableprivate

Total number of header trailer limit errors in the trailer data.

Definition at line 366 of file ITkStripsRodDecoder.h.

366{0};

◆ m_trailerErrorOverflow

std::atomic_uint ITkStripsRodDecoder::m_trailerErrorOverflow {0}
mutableprivate

Total number of overflow errors in the trailer data.

Definition at line 363 of file ITkStripsRodDecoder.h.

363{0};

◆ m_trailerNumber

std::atomic_uint ITkStripsRodDecoder::m_trailerNumber {0}
mutableprivate

Total number of decoded trailer data.

Definition at line 345 of file ITkStripsRodDecoder.h.

345{0};

◆ m_truncatedRODNumber

std::atomic_uint ITkStripsRodDecoder::m_truncatedRODNumber {0}
mutableprivate

Total number of truncated ROBFragments.

Definition at line 405 of file ITkStripsRodDecoder.h.

405{0};

◆ m_unknownDataFormat

std::atomic_uint ITkStripsRodDecoder::m_unknownDataFormat {0}
mutableprivate

Total number of unknown data formats.

Definition at line 387 of file ITkStripsRodDecoder.h.

387{0};

The documentation for this class was generated from the following files: