ATLAS Offline Software
Loading...
Searching...
No Matches
PixelByteStreamErrorDetectorElementStatusTool.cxx
Go to the documentation of this file.
5
22
23namespace {
24 inline constexpr bool isBSError(uint64_t error, uint64_t max_error, uint64_t mask) {
25 return error<max_error && (error & mask);
26 }
27
28}
29
30std::unique_ptr<InDet::SiDetectorElementStatus>
33 std::unique_ptr<InDet::SiDetectorElementStatus> element_status( createDetectorElementStatus(ctx, whandle));
34 std::vector<bool> &status=element_status->getElementStatus();
35 if (status.empty()) {
36 status.resize(m_pixelID->wafer_hash_max(),true );
37 }
38 std::vector<InDet::ChipFlags_t> &chip_status=element_status->getElementChipStatus();
39 if (chip_status.empty()) {
40 chip_status.resize(status.size(),0xffff);
41 }
42
43 if (whandle) {
44 ATH_MSG_ERROR("PixelByteStreamErrorDetectorStatusTool is not for use with conditions objects");
46 }
47
50 if (!idcErrCont.isValid()) {
51 ATH_MSG_ERROR("Did not get bytestream error container with key " << m_BSErrContReadKey);
52 }
53 else {
54
55 const IDCInDetBSErrContainer_Cache *idcCachePtr = idcErrCont->cache();
56
69
70 constexpr uint64_t chip_error_mask = PixelByteStreamErrors::makeError(PixelByteStreamErrors::Preamble)
80
81 // The index array is defined in PixelRawDataProviderTool::SizeOfIDCInDetBSErrContainer()
82 // Here, 52736 is a separator beween error flags and isActive flags.
83 const bool active_only = m_activeOnly;
84 unsigned int element_offset_i = (active_only ? 52736 : 0);
85
86 unsigned int element_i=0;
87 unsigned int maxHash = m_pixelID->wafer_hash_max();
88
89 constexpr uint64_t missingErrorInfo{std::numeric_limits<uint64_t>::max()-3000000000};
90
91 for (const InDetDD::SiDetectorElement *element : element_status->getDetectorElements()) {
92 const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
93 InDetDD::PixelReadoutTechnology readout_technology = p_design->getReadoutTechnology();
94 unsigned int readout_technology_flags = m_readoutTechnologyMask & Pixel::makeReadoutTechnologyBit(readout_technology);
95
96 // set to false if has one of the considered errors and the readout technology is considered.
97 status.at(element_i) = status.at(element_i) && not ( readout_technology_flags
98 && ( !active_only
99 ? isBSError(static_cast<uint64_t>(idcCachePtr->retrieve(element_i)), missingErrorInfo, error_mask)
100 : idcCachePtr->retrieve(element_i+element_offset_i)!=1 ));
101
102 // compute the status for the individual front-ends
103 if (status[element_i]) {
104 unsigned int number_of_chips = readout_technology == InDetDD::PixelReadoutTechnology::FEI3 ? 2*p_design->numberOfCircuits() : p_design->numberOfCircuits();
105 InDet::ChipFlags_t chip_mask = status[element_i] ? (1ul<<number_of_chips)-1ul : 0;
106 assert( chip_mask != 0 );
107 InDet::ChipFlags_t bs_status_flags = active_only ? chip_mask : 0;
108 if (!active_only) {
109 for (unsigned int chip_i =0; chip_i < number_of_chips; ++chip_i) {
110 // get bytestream error for chip
111 unsigned int indexFE = (1+chip_i)*maxHash + element_i; // (FE_channel+1)*2048 + moduleHash
112 InDet::ChipFlags_t chip_flag =not ( readout_technology_flags
113 && (isBSError(static_cast<uint64_t>(idcCachePtr->retrieve(indexFE)), missingErrorInfo, chip_error_mask)));
114 bs_status_flags |= (chip_flag << chip_i);
115 }
116 }
117 chip_status[element_i] &= (bs_status_flags & chip_mask);
118 }
119 else {
120 chip_status[element_i] = 0;
121 }
122 ++element_i;
123 }
124 }
125 }
126
127 return element_status;
128}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
IdentifiableValueCache< IDCInDetBSErrContainer::ErrorCode > IDCInDetBSErrContainer_Cache
T retrieve(size_t i)
Retrieve the Value stored in that hash.
Class used to describe the design of a module (diode segmentation and readout scheme)
PixelReadoutTechnology getReadoutTechnology() const
int numberOfCircuits() const
Total number of circuits:
Class to hold geometrical description of a silicon detector element.
unsigned int m_readoutTechnologyMask
Mask where each bit represents a readout technology;.
virtual std::unique_ptr< InDet::SiDetectorElementStatus > getDetectorElementStatus(const EventContext &ctx, SG::WriteCondHandle< InDet::SiDetectorElementStatus > *whandle) const override
std::unique_ptr< InDet::SiDetectorElementStatus > createDetectorElementStatus(const EventContext &ctx, SG::WriteCondHandle< InDet::SiDetectorElementStatus > *whandle) const
Create a new detector element status element container.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
void addDependency(const EventIDRange &range)
constexpr IDCInDetBSErrContainer::ErrorCode makeError(PixelErrorsEnum errType)
helper to be used in clients to fetch error information
unsigned int makeReadoutTechnologyBit(InDetDD::PixelReadoutTechnology technology, unsigned int bit_val=1)
Create a word with a bit representing the given readout technology to the given value.