ATLAS Offline Software
Loading...
Searching...
No Matches
PixelRodDecoder.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef PIXELRAWDATABYTESTREAM_PIXEL_RODDECODER_H
6#define PIXELRAWDATABYTESTREAM_PIXEL_RODDECODER_H
7
8
11
12#include "GaudiKernel/ServiceHandle.h"
13#include "eformat/SourceIdentifier.h"
14
20#include <atomic>
21class PixelID;
22
23class PixelRodDecoder : virtual public IPixelRodDecoder, public AthAlgTool {
24
25 public:
26
27 // Collection type
30
31 // constructor
32 PixelRodDecoder(const std::string& type, const std::string& name,
33 const IInterface* parent ) ;
34
35 // destructor
37
38 StatusCode initialize() override;
39 StatusCode finalize() override;
40
42 IPixelRDO_Container* rdoIdc,
43 IDCInDetBSErrContainer& decodingErrors,
44 std::vector<IdentifierHash>* vecHash, const EventContext& ctx) const override;
45
46 uint32_t getDataType(unsigned int rawDataWord, bool link_start) const; // determine module word type
47
49 uint32_t decodeBCID_IBL(const uint32_t word) const; // decode IBL BCID from header word
50 uint32_t decodeL1ID_IBL(const uint32_t word) const; // decode IBL L1ID from header word
51 uint32_t decodeFeI4Bflag_IBL(const uint32_t word) const; // decode IBL FeI4 flag bit
52 uint32_t decodeModule_IBL(const uint32_t word) const; // decode IBL module link number from header word
53
55 uint32_t decodeBCID(const uint32_t word) const; // decode BCID from header word
56 uint32_t decodeL1ID(const uint32_t word) const; // decode L1ID from header word
57 uint32_t decodeL1IDskip(const uint32_t word) const; // decode L1ID skips from header word
58 uint32_t decodeModule(const uint32_t word) const; // decode module link number from header word
59 uint32_t decodeHeaderErrors(const uint32_t word) const; // decode header errors from header word
60
61
63 uint32_t decodeRow(const uint32_t word, bool isIBLorDBM ) const; // decode row number from hit word
64 uint32_t decodeColumn(const uint32_t word, bool isIBLorDBM) const; // decode column number from hit word
65 uint32_t decodeToT(const uint32_t word, bool isIBLorDBM ) const; // decode TimeOverThreshold value from hit word
66
67
69 uint32_t decodeLinkNumHit_IBL(const uint32_t word) const; // decode Link Number in the IBL not-condensed Hit word // At least temporarily not used, because IBL data format is not clear (Franconi, 17.06.2014)
70
71
73 uint32_t decodeFE(const uint32_t word) const; // decode FE number from hit word
74
75
77 uint32_t decodeSkippedTrigTrailer_IBL(const uint32_t word) const; // decode the skipped trigger counter in the IBL trailer
78 uint32_t decodeTrailerErrors_IBL (const uint32_t word) const; // decode IBL trailer errors, all together
79 uint32_t decodeLinkNumTrailer_IBL(const uint32_t word) const; // decode the link number in the IBL trailer // At least temporarily not used, because IBL data format is not clear (Franconi, 17.06.2014)
80 uint32_t decodeCondensedModeBit_IBL(const uint32_t word) const; // decode the Condensed mode bit in the IBL trailer
81
82
84 uint32_t decodeTrailerErrors(const uint32_t word) const; // decode trailer errors from trailer word
85 uint32_t decodeTrailerBitflips(const uint32_t word) const; // search for bitflips in wordparts supposed to be empty
86 uint32_t decodeBcidTrailer_IBL(const uint32_t word) const;
87
88
90 uint32_t decodeFEFlags2(const uint32_t word) const; // decode FE flags from flag type 2 word
91 uint32_t decodeMCCFlags(const uint32_t word) const; // decode MCC flags from flag type 2 word
92
93
95 uint32_t decodeServiceCodeCounter_IBL(const uint32_t word) const; // decode the Service Code Counter from the "non-short" IBL FE flag word
96 uint32_t decodeServiceCode_IBL(const uint32_t word) const; // decode the Service code from the "non-short" IBL FE Flag word
97 uint32_t decodeLinkNumFEFlag_IBL(const uint32_t word) const; // decode the Link Number present in the IBL FE Flag word // At least temporarily not used, because IBL data format is not clear (Franconi, 17.06.2014)
98 // uint32_t decodeFEFlagBitFlips_IBL(const uint32_t word); // search for bitflips in word partes supposed to be empty // At least temporarily not used, because IBL data format is not clear (Franconi, 17.06.2014)
99
100
102 uint32_t decodeRawData(const uint32_t word) const; // decode raw data word for IBL and Pixel
103
104 uint32_t extractFefromLinkNum (const uint32_t linkNum) const;
105 uint32_t extractSLinkfromLinkNum (const uint32_t linkNum) const;
106
107 bool CheckLinkStart(const bool Link_start, const int rodId, const unsigned int mLink, const unsigned int mBCID, const unsigned int mLVL1ID, const int LVL1A);
108
109 uint32_t treatmentFEFlagInfo(unsigned int serviceCode, unsigned int serviceCodeCounter) const;
110
111 constexpr static size_t ERROR_CONTAINER_MAX = 56506; // see explanation in PixelRawDataProviderTool.cxx. Increased to accommodate space for the SvcCounter
112 private:
113 mutable std::atomic_uint m_masked_errors{};
114 mutable std::atomic_uint m_numGenWarnings{};
115 mutable std::atomic_uint m_numDuplicatedPixels{0};
116
117 const unsigned m_maxNumGenWarnings{200}; // Maximum number of general warnings to print
118 mutable std::atomic_uint m_numBCIDWarnings{};
119 const unsigned m_maxNumBCIDWarnings{50}; // Maximum number of BCID and LVL1ID warnings to print
120 BooleanProperty m_checkDuplicatedPixel{this, "CheckDuplicatedPixel", true, "Check duplicated pixels in fillCollection method"};
121
122 mutable std::atomic_uint m_numInvalidIdentifiers{0};
123 mutable std::atomic_uint m_numPreambleErrors{0};
124 mutable std::atomic_uint m_numTimeOutErrors{0};
125 mutable std::atomic_uint m_numLVL1IDErrors{0};
126 mutable std::atomic_uint m_numBCIDErrors{0};
127 mutable std::atomic_uint m_numFlaggedErrors{0};
128 mutable std::atomic_uint m_numTrailerErrors{0};
129 mutable std::atomic_uint m_numDisabledFEErrors{0};
130 mutable std::atomic_uint m_numDecodingErrors{0};
131 mutable std::atomic_uint m_numRODErrors{0};
132 mutable std::atomic_uint m_numLinkMaskedByPPC{0};
133 mutable std::atomic_uint m_numLimitError{0};
134
135 const PixelID* m_pixel_id=nullptr;
136
138 {this, "PixelReadoutManager", "PixelReadoutManager", "Pixel readout manager" };
139
141 {this, "PixelCablingCondData", "PixelCablingCondData", "Pixel cabling key"};
142
144 {this, "PixelHitDiscCnfgData", "PixelHitDiscCnfgData", "Pixel FEI4 HitDiscConfig key"};
145
147 bool checkDataWordsCorruption( uint32_t word ) const;
148
153
155 StatusCode updateEventInfoIfEventCorrupted( bool isCorrupted ) const;
156
158 void checkUnequalNumberOfHeaders( const unsigned int nFragmentsPerFE[8], uint32_t robId ) const;
159
161 inline bool thisRdoIsUnique(const Identifier & pixelRdo, std::unordered_set<Identifier> & pixelRdosSeenSoFar) const;
162
164 unsigned int getLocalFEI4(const uint32_t fe, const uint64_t onlineId) const;
165
168 uint32_t robId,
169 std::array<uint64_t, PixelRodDecoder::ERROR_CONTAINER_MAX> &bsErrWord,
170 IDCInDetBSErrContainer& decodingErrors,
172 const char *error_description) const;
173};
174
175bool
176PixelRodDecoder::thisRdoIsUnique(const Identifier & pixelRdo, std::unordered_set<Identifier> & pixelRdosSeenSoFar) const{
177 //The 'second' element of the pair returned by a set insert indicates whether the insert was successful.
178 //If the element is NOT already in the set (has not been seen already), then this element is true.
179 return (m_checkDuplicatedPixel and pixelRdosSeenSoFar.insert(pixelRdo).second);
180}
181
182
183#endif
EventContainers::IIdentifiableCont< InDetRawDataCollection< PixelRDORawData > > IPixelRDO_Container
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
IDC like storage for BS errors, TODO, customise implementation further so that we store int rather th...
This is an Identifier helper class for the Pixel subdetector.
Definition PixelID.h:67
std::atomic_uint m_numLVL1IDErrors
uint32_t extractFefromLinkNum(const uint32_t linkNum) const
std::atomic_uint m_numPreambleErrors
InDetRawDataCollection< PixelRDORawData > PixelRawCollection
std::atomic_uint m_numLinkMaskedByPPC
std::atomic_uint m_numTimeOutErrors
std::atomic_uint m_numDecodingErrors
const unsigned m_maxNumBCIDWarnings
uint32_t getDataType(unsigned int rawDataWord, bool link_start) const
uint32_t decodeTrailerBitflips(const uint32_t word) const
bool m_is_dbm_module
if the flag is set to true appropriate bits are set in event info
uint32_t decodeTrailerErrors_IBL(const uint32_t word) const
StatusCode fillCollection(const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment *robFrag, IPixelRDO_Container *rdoIdc, IDCInDetBSErrContainer &decodingErrors, std::vector< IdentifierHash > *vecHash, const EventContext &ctx) const override
void propagateROBErrorsToModules(const PixelCablingCondData *pixCabling, uint32_t robId, std::array< uint64_t, PixelRodDecoder::ERROR_CONTAINER_MAX > &bsErrWord, IDCInDetBSErrContainer &decodingErrors, PixelByteStreamErrors::PixelErrorsEnum error_code, const char *error_description) const
std::atomic_uint m_numBCIDWarnings
ServiceHandle< InDetDD::IPixelReadoutManager > m_pixelReadout
StatusCode finalize() override
StatusCode updateEventInfoIfEventCorrupted(bool isCorrupted) const
checks if all FEs have sent the same number of headers, if not, generate warning message
uint32_t decodeSkippedTrigTrailer_IBL(const uint32_t word) const
uint32_t decodeHeaderErrors(const uint32_t word) const
uint32_t decodeCondensedModeBit_IBL(const uint32_t word) const
std::atomic_uint m_numBCIDErrors
std::atomic_uint m_numDuplicatedPixels
Pixel1RawData RDO
uint32_t decodeFeI4Bflag_IBL(const uint32_t word) const
uint32_t treatmentFEFlagInfo(unsigned int serviceCode, unsigned int serviceCodeCounter) const
static constexpr size_t ERROR_CONTAINER_MAX
uint32_t decodeMCCFlags(const uint32_t word) const
bool thisRdoIsUnique(const Identifier &pixelRdo, std::unordered_set< Identifier > &pixelRdosSeenSoFar) const
get local FEI4
uint32_t decodeRow(const uint32_t word, bool isIBLorDBM) const
uint32_t decodeModule_IBL(const uint32_t word) const
void checkUnequalNumberOfHeaders(const unsigned int nFragmentsPerFE[8], uint32_t robId) const
if the check duplicated RDO flag is true, check that this RDO is unique (returns true if unique)
StatusCode initialize() override
uint32_t decodeFE(const uint32_t word) const
std::atomic_uint m_numLimitError
SG::ReadCondHandleKey< PixelHitDiscCnfgData > m_condHitDiscCnfgKey
uint32_t decodeTrailerErrors(const uint32_t word) const
std::atomic_uint m_numGenWarnings
SG::ReadCondHandleKey< PixelCablingCondData > m_condCablingKey
const unsigned m_maxNumGenWarnings
uint32_t decodeServiceCode_IBL(const uint32_t word) const
std::atomic_uint m_numFlaggedErrors
const PixelID * m_pixel_id
uint32_t decodeColumn(const uint32_t word, bool isIBLorDBM) const
uint32_t decodeToT(const uint32_t word, bool isIBLorDBM) const
uint32_t decodeModule(const uint32_t word) const
unsigned int getLocalFEI4(const uint32_t fe, const uint64_t onlineId) const
in case of invalid ROB fragments set corresponding error flags in all linked modules.
uint32_t decodeL1IDskip(const uint32_t word) const
uint32_t decodeFEFlags2(const uint32_t word) const
uint32_t decodeLinkNumHit_IBL(const uint32_t word) const
uint32_t decodeL1ID_IBL(const uint32_t word) const
uint32_t decodeBcidTrailer_IBL(const uint32_t word) const
std::atomic_uint m_numRODErrors
uint32_t decodeRawData(const uint32_t word) const
uint32_t decodeServiceCodeCounter_IBL(const uint32_t word) const
uint32_t decodeBCID_IBL(const uint32_t word) const
uint32_t extractSLinkfromLinkNum(const uint32_t linkNum) const
uint32_t decodeLinkNumFEFlag_IBL(const uint32_t word) const
std::atomic_uint m_numTrailerErrors
std::atomic_uint m_numDisabledFEErrors
bool CheckLinkStart(const bool Link_start, const int rodId, const unsigned int mLink, const unsigned int mBCID, const unsigned int mLVL1ID, const int LVL1A)
std::atomic_uint m_numInvalidIdentifiers
PixelRodDecoder(const std::string &type, const std::string &name, const IInterface *parent)
std::atomic_uint m_masked_errors
BooleanProperty m_checkDuplicatedPixel
bool checkDataWordsCorruption(uint32_t word) const
checks if data words do not look like header & trailer markers, return true if so,...
uint32_t decodeL1ID(const uint32_t word) const
uint32_t decodeLinkNumTrailer_IBL(const uint32_t word) const
uint32_t decodeBCID(const uint32_t word) const
eformat::ROBFragment< PointerType > ROBFragment
Definition RawEvent.h:27
PixelErrorsEnum
< Possible errors in pixel data decoding