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

Tool that keeps track of modules that give rise to errors in the bytestram. More...

#include <SCT_ByteStreamErrorsTool.h>

Inheritance diagram for SCT_ByteStreamErrorsTool:
Collaboration diagram for SCT_ByteStreamErrorsTool:

Classes

struct  IDCCacheEntry

Public Member Functions

 SCT_ByteStreamErrorsTool (const std::string &type, const std::string &name, const IInterface *parent)
 header file for this class.
virtual ~SCT_ByteStreamErrorsTool ()=default
virtual StatusCode initialize () override
 Initialize.
virtual StatusCode finalize () override
 Finalize.
virtual bool canReportAbout (InDetConditions::Hierarchy h) const override
 Used by ConditionsSummayTool to decide whether to call isGood() for a particular detector element.
virtual bool isGood (const Identifier &elementId, InDetConditions::Hierarchy h=InDetConditions::DEFAULT) const override
 Is the detector element good?
virtual bool isGood (const Identifier &elementId, const EventContext &ctx, InDetConditions::Hierarchy h=InDetConditions::DEFAULT) const override
virtual bool isGood (const IdentifierHash &elementIdHash) const override
virtual bool isGood (const IdentifierHash &elementIdHash, const EventContext &ctx) const override
 this is the principle method which can be accessed via the ConditionsSummaryTool to decide if a wafer is good - in this case we want to return false if the wafer has an error that would result in bad hits or no hits for that event
virtual void getDetectorElementStatus (const EventContext &ctx, InDet::SiDetectorElementStatus &element_status, SG::WriteCondHandle< InDet::SiDetectorElementStatus > *whandle) const override
virtual std::set< IdentifierHashgetErrorSet (int errorType, const EventContext &ctx) const override
 The accessor method that can be used by clients to retrieve a set of IdHashes of wafers with a given type of error.
virtual std::set< IdentifierHashgetErrorSet (int errorType) const override
virtual unsigned int tempMaskedChips (const Identifier &moduleId, const EventContext &ctx) const override
virtual unsigned int tempMaskedChips (const Identifier &moduleId) const override
virtual unsigned int abcdErrorChips (const Identifier &moduleId) const override
virtual unsigned int abcdErrorChips (const Identifier &moduleId, const EventContext &ctx) const override

Private Types

enum  N_ELEMENTS { N_CHIPS_PER_SIDE = 6 , N_SIDES = 2 , N_STRIPS_PER_CHIP = 128 , N_STRIPS_PER_SIDE = N_STRIPS_PER_CHIP*N_CHIPS_PER_SIDE }

Private Member Functions

const IDCInDetBSErrContainergetContainer (const EventContext &ctx) const
 Obtains container form the SG, if it is missing it will complain (hard-coded 3 times per job) and return nullptr.
IDCCacheEntrygetCacheEntry (const EventContext &ctx) const
 Return cache for the current event If, for current slot, the cache is outdated it is retrieved from the IDC collection.
StatusCode fillData (const EventContext &ctx) const
 Updates information per module & ABCD chip.
bool isGoodChip (const Identifier &stripId, const EventContext &ctx) const
int getChip (const Identifier &stripId, const EventContext &ctx) const
const InDetDD::SiDetectorElementgetDetectorElement (const IdentifierHash &waferHash, const EventContext &ctx) const
std::pair< StatusCode, unsigned int > getErrorCodeWithCacheUpdate (const Identifier &id, const EventContext &ctx, std::unordered_map< size_t, unsigned int > &whereExected) const
 Method that returns BS Error code from the map passed @rag where-Expected If the information is initially missing, the cache update is triggered.

Private Attributes

ToolHandle< ISCT_ConfigurationConditionsToolm_config
SG::ReadHandleKey< IDCInDetBSErrContainerm_bsIDCErrContainerName {this, "IDCByteStreamErrContainer", "SCT_ByteStreamErrs", "SCT BS error key for IDC variant"}
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollectionm_SCTDetEleCollKey {this, "SCTDetEleCollKey", "SCT_DetectorElementCollection", "Key of SiDetectorElementCollection for SCT"}
const SCT_IDm_sct_id {nullptr}
IdContext m_cntx_sct
uint64_t m_badErrorMask {}
SG::SlotSpecificObj< std::mutex > m_cacheMutex ATLAS_THREAD_SAFE
SG::SlotSpecificObj< IDCCacheEntry > m_eventCache ATLAS_THREAD_SAFE
std::atomic_uint m_nRetrievalFailure {0}

Detailed Description

Tool that keeps track of modules that give rise to errors in the bytestram.

The API offers two levels of access, 1) by identifier 2) for "all event" In 1st case the information from entire event is used via the cache if IDC container that keeps an information about errors for so far decoded SCT data. That access pattern is identical for HLT and offline use-case. Missing data in the cache is sign of error.

The 2nd patter is to request error information for the whole event. In case of trigger these methods can in fact return information for the fragment of the detector data. This depends on the IDC container that the tool is configured to read.

There are two levels of caching involved in data access. First the IDC stores actual BS error codes in the event-wide container called cache. Even if the IDC container may be different, this cache remains the same for the whole event. Secondly the tool itself has a cache that is essentially needed to avoid going to the event store for the IDC container for each call. Inside this local cache object derived information is stored to speed up calls like isGood.

Definition at line 64 of file SCT_ByteStreamErrorsTool.h.

Member Enumeration Documentation

◆ N_ELEMENTS

Constructor & Destructor Documentation

◆ SCT_ByteStreamErrorsTool()

SCT_ByteStreamErrorsTool::SCT_ByteStreamErrorsTool ( const std::string & type,
const std::string & name,
const IInterface * parent )

header file for this class.

Athena includes Constructor

Definition at line 23 of file SCT_ByteStreamErrorsTool.cxx.

23 :
24 base_class(type, name, parent)
25{
26}

◆ ~SCT_ByteStreamErrorsTool()

virtual SCT_ByteStreamErrorsTool::~SCT_ByteStreamErrorsTool ( )
virtualdefault

Member Function Documentation

◆ abcdErrorChips() [1/2]

unsigned int SCT_ByteStreamErrorsTool::abcdErrorChips ( const Identifier & moduleId) const
overridevirtual

Definition at line 474 of file SCT_ByteStreamErrorsTool.cxx.

474 {
475 const EventContext& ctx{Gaudi::Hive::currentContext()};
476 return abcdErrorChips(moduleId, ctx);
477}
virtual unsigned int abcdErrorChips(const Identifier &moduleId) const override

◆ abcdErrorChips() [2/2]

unsigned int SCT_ByteStreamErrorsTool::abcdErrorChips ( const Identifier & moduleId,
const EventContext & ctx ) const
overridevirtual

Definition at line 457 of file SCT_ByteStreamErrorsTool.cxx.

457 {
458 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool abcdErrorChips");
459 std::scoped_lock<std::mutex> lock{*m_cacheMutex.get(ctx)};
460 auto *cacheEntry{getCacheEntry(ctx)};
461 if (cacheEntry->IDCCache == nullptr) {
462 ATH_MSG_VERBOSE("cacheEntry->IDCCache == nullptr");
463 return 0;
464 }
465
466 auto [status, v_abcdErrorChips] = getErrorCodeWithCacheUpdate(moduleId, ctx, cacheEntry->abcdErrorChips);
467 if (status.isFailure()) {
468 ATH_MSG_ERROR("SCT_ByteStreamErrorsTool Failure getting ABCD chip errors");
469 }
470 return v_abcdErrorChips; // 12 bits are used.
471 // Bit 0 is for chip 0 on side 0, bit 1 is for chip 1 on side 0, ..., and bit 11 is for chip 5 on side 1
472}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
IDCCacheEntry * getCacheEntry(const EventContext &ctx) const
Return cache for the current event If, for current slot, the cache is outdated it is retrieved from t...
std::pair< StatusCode, unsigned int > getErrorCodeWithCacheUpdate(const Identifier &id, const EventContext &ctx, std::unordered_map< size_t, unsigned int > &whereExected) const
Method that returns BS Error code from the map passed @rag where-Expected If the information is initi...
status
Definition merge.py:16

◆ canReportAbout()

bool SCT_ByteStreamErrorsTool::canReportAbout ( InDetConditions::Hierarchy h) const
overridevirtual

Used by ConditionsSummayTool to decide whether to call isGood() for a particular detector element.

In principle we could report about modules and/or strips too, and use the id helper to navigate up or down the hierarchy to the wafer, but in practice we don't want to do the time-consuming isGood() for every strip, so lets only report about wafers..

Definition at line 67 of file SCT_ByteStreamErrorsTool.cxx.

◆ fillData()

StatusCode SCT_ByteStreamErrorsTool::fillData ( const EventContext & ctx) const
private

Updates information per module & ABCD chip.

this function is used to populate the data of this tool from the InDetBSErrContainer in StoreGate

OK, so we found the StoreGate container, now lets iterate over it to populate the sets of errors owned by this Tool.

Definition at line 363 of file SCT_ByteStreamErrorsTool.cxx.

363 {
364 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool fillData");
365
366 const IDCInDetBSErrContainer* idcErrCont{getContainer(ctx)};
367 if (idcErrCont == nullptr) {
368 ATH_MSG_VERBOSE("idcErrCont == nullptr");
369 return StatusCode::SUCCESS;
370 }
371
372 auto *cacheEntry{getCacheEntry(ctx)};
373
374 unsigned int idcErrCont_set_number = idcErrCont->numberSet();
375
376 if (cacheEntry->m_set_number == idcErrCont_set_number){
377 ATH_MSG_VERBOSE("Same set number found, skip the next steps.");
378 return StatusCode::SUCCESS;
379 }else{
380 cacheEntry->m_set_number = idcErrCont_set_number; //update the set number in cacheEntry.
381 }
382
386 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool size of error container is " << idcErrCont->maxSize());
387 const std::vector<std::pair<size_t, uint64_t>> errorcodesforView{idcErrCont->getAll()};
388
389 for (const auto& [ hashId, errCode ] : errorcodesforView) {
390
391 Identifier wafer_id{m_sct_id->wafer_id(hashId)};
392 Identifier module_id{m_sct_id->module_id(wafer_id)};
393 size_t hash = static_cast<size_t>(module_id.get_compact());
394 if (errCode == uint64_t{0}) {
395 // That means this hashId was decoded but had no error
396 // In such case we want to fill the cache also with zero so we do not have to fill the cache again for a given view
397 // (see logic in: getErrorCodeWithCacheUpdate)
398 // Note: invocation of the [] operator on the map will create missing entry and set the value to default (here 0)
399 cacheEntry->abcdErrorChips[ hash ];
400 cacheEntry->tempMaskedChips[ hash ];
401 continue;
402 }
403
404
405 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool filling event cache for module " << module_id << " ec " << errCode);
406
407 const int side{m_sct_id->side(m_sct_id->wafer_id(hashId))};
408 // Each bit of errCode represents each SCT_ByteStreamErrors for one wafer
409 // Multiple bits can be true.
410 // Convert errCode to 12 bits of abcdErrorChips and 12 bits of tempMaskedChips for one module (=two wafers).
412 if (v_abcdErrorChips) {
413 v_abcdErrorChips >>= SCT_ByteStreamErrors::ABCDError_Chip0; // bit 0 (5) is for chip 0 (5) for both sides
414 v_abcdErrorChips <<= (side*N_CHIPS_PER_SIDE); // bit 0 (6) is for chip 0 on side 0 (1)
415 cacheEntry->abcdErrorChips[hash] |= v_abcdErrorChips;
416 } else {
417 cacheEntry->abcdErrorChips[hash] = 0;
418 }
420 if (v_tempMaskedChips) {
421 v_tempMaskedChips >>= SCT_ByteStreamErrors::TempMaskedChip0; // bit 0 (5) is for chip 0 (5) for both sides0
422 v_tempMaskedChips <<= (side*N_CHIPS_PER_SIDE); // bit 0 (6) is for chip 0 on side 0 (1)
423 cacheEntry->tempMaskedChips[hash] |= v_tempMaskedChips;
424 } else {
425 cacheEntry->tempMaskedChips[hash] = 0;
426 }
427
428 }
429
430 return StatusCode::SUCCESS;
431}
size_t maxSize() const
Return the maxSize of the collection.
size_t numberSet() const
Return the number of entries set and accessible according to the mask.
std::vector< std::pair< size_t, T > > getAll() const
Make a vector of hashes and values, convenient for iteration and other uses.
value_type get_compact() const
Get the compact id.
const IDCInDetBSErrContainer * getContainer(const EventContext &ctx) const
Obtains container form the SG, if it is missing it will complain (hard-coded 3 times per job) and ret...
static constexpr uint64_t ABCDErrorMask()
static constexpr uint64_t TempMaskedChipsMask()

◆ finalize()

StatusCode SCT_ByteStreamErrorsTool::finalize ( )
overridevirtual

Finalize.

Definition at line 52 of file SCT_ByteStreamErrorsTool.cxx.

52 {
53 return StatusCode::SUCCESS;
54}

◆ getCacheEntry()

SCT_ByteStreamErrorsTool::IDCCacheEntry * SCT_ByteStreamErrorsTool::getCacheEntry ( const EventContext & ctx) const
nodiscardprivate

Return cache for the current event If, for current slot, the cache is outdated it is retrieved from the IDC collection.

If the IDC is missing nullptr is returned.

Definition at line 94 of file SCT_ByteStreamErrorsTool.cxx.

94 {
95 IDCCacheEntry* cacheEntry{m_eventCache.get(ctx)};
96 if (cacheEntry->needsUpdate(ctx)) {
97 const auto *idcErrContPtr{getContainer(ctx)};
98 if (idcErrContPtr == nullptr) { // missing or not, the cache needs to be reset
99 cacheEntry->reset(ctx.evt(), nullptr);
100 } else {
101 cacheEntry->reset(ctx.evt(), idcErrContPtr->cache());
102 }
103 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool Cache for the event reset " << cacheEntry->eventId << " with IDC container" << idcErrContPtr);
104 }
105 return cacheEntry;
106}

◆ getChip()

int SCT_ByteStreamErrorsTool::getChip ( const Identifier & stripId,
const EventContext & ctx ) const
private

Definition at line 312 of file SCT_ByteStreamErrorsTool.cxx.

312 {
313 const Identifier waferId{m_sct_id->wafer_id(stripId)};
314 const IdentifierHash waferHash{m_sct_id->wafer_hash(waferId)};
315 const InDetDD::SiDetectorElement* siElement{getDetectorElement(waferHash, ctx)};
316 if (siElement==nullptr) {
317 ATH_MSG_DEBUG ("InDetDD::SiDetectorElement is not obtained from stripId " << stripId);
318 return -1;
319 }
320 return SCT::getChip(*m_sct_id, *siElement, stripId);
321}
#define ATH_MSG_DEBUG(x)
const InDetDD::SiDetectorElement * getDetectorElement(const IdentifierHash &waferHash, const EventContext &ctx) const
constexpr unsigned int getChip(unsigned int side, bool swap, unsigned int strip)
Get the physical chip ID for the given strip.

◆ getContainer()

const IDCInDetBSErrContainer * SCT_ByteStreamErrorsTool::getContainer ( const EventContext & ctx) const
nodiscardprivate

Obtains container form the SG, if it is missing it will complain (hard-coded 3 times per job) and return nullptr.

When running over ESD files without BSErr container stored, don't want to flood the user with error messages. Should just have a bunch of empty sets, and keep quiet.

Definition at line 71 of file SCT_ByteStreamErrorsTool.cxx.

71 {
72 SG::ReadHandle<IDCInDetBSErrContainer> idcErrCont(m_bsIDCErrContainerName, ctx);
77 if (not idcErrCont.isValid()) {
79 if (m_nRetrievalFailure<=3) {
80 ATH_MSG_INFO("SCT_ByteStreamErrorsTool Failed to retrieve BS error container "
82 << " from StoreGate.");
83 if (m_nRetrievalFailure==3) {
84 ATH_MSG_INFO("SCT_ByteStreamErrorsTool This message on retrieval failure of " << m_bsIDCErrContainerName.key() << " is suppressed.");
85 }
86 }
87 return nullptr;
88 }
89 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool IDC Container fetched " << m_bsIDCErrContainerName.key());
90 return idcErrCont.cptr();
91}
#define ATH_MSG_INFO(x)
SG::ReadHandleKey< IDCInDetBSErrContainer > m_bsIDCErrContainerName

◆ getDetectorElement()

const InDetDD::SiDetectorElement * SCT_ByteStreamErrorsTool::getDetectorElement ( const IdentifierHash & waferHash,
const EventContext & ctx ) const
private

Definition at line 509 of file SCT_ByteStreamErrorsTool.cxx.

509 {
510 SG::ReadCondHandle<InDetDD::SiDetectorElementCollection> condData{m_SCTDetEleCollKey, ctx};
511 if (not condData.isValid()) return nullptr;
512 return condData->getDetectorElement(waferHash);
513}
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_SCTDetEleCollKey

◆ getDetectorElementStatus()

void SCT_ByteStreamErrorsTool::getDetectorElementStatus ( const EventContext & ctx,
InDet::SiDetectorElementStatus & element_status,
SG::WriteCondHandle< InDet::SiDetectorElementStatus > * whandle ) const
overridevirtual

Definition at line 162 of file SCT_ByteStreamErrorsTool.cxx.

163 {
164 std::scoped_lock<std::mutex> lock{*m_cacheMutex.get(ctx)};
165
166 const auto *idcCachePtr{getCacheEntry(ctx)};
167 if (idcCachePtr == nullptr || !idcCachePtr->IDCCache) {
168 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool No cache! ");
169 return;
170 }
171 if (whandle) {
172 ATH_MSG_ERROR("SCT_ByteStreamErrorsTool is not for conditions objects");
174 }
175
176 if (fillData(ctx).isFailure()) {
177 return; // @TODO what is the correct way to handle this ? set status to false for all ?
178 }
179
180 std::vector<bool> &status = element_status.getElementStatus();
181 std::vector<InDet::ChipFlags_t> &chip_status = element_status.getElementChipStatus();
182 if (status.empty()) {
183 status.resize(idcCachePtr->IDCCache->rawReadAccess().size(),true);
184 }
185 SG::ReadCondHandle<InDetDD::SiDetectorElementCollection> si_element_list{m_SCTDetEleCollKey, ctx};
186 if (not si_element_list.isValid()) {
187 std::stringstream msg;
188 msg << "Failed to get SCT detector element collection with key " << m_SCTDetEleCollKey.key();
189 throw std::runtime_error(msg.str());
190 }
191 if (whandle) {
192 whandle->addDependency (si_element_list);
193 }
194
195 constexpr InDet::ChipFlags_t all_flags_set = static_cast<InDet::ChipFlags_t>((1ul<<(N_CHIPS_PER_SIDE)) - 1ul);
196 static_assert( (1ul<<(N_CHIPS_PER_SIDE*N_SIDES)) - 1ul <= std::numeric_limits<InDet::ChipFlags_t>::max());
197 if (chip_status.empty()) {
198 chip_status.resize(status.size(), all_flags_set);
199 }
200 unsigned int element_i=0;
201 for ( const auto &val : idcCachePtr->IDCCache->rawReadAccess()) {
203 bool is_bad = error_code & m_badErrorMask;
204 status.at(element_i) = status.at(element_i) & not is_bad;
205 if ( is_bad ) {
206 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool Bad Error " << error_code << " for ID " << element_i);
207 }
208 else {
209 IdentifierHash hash(element_i);
210 const InDetDD::SiDetectorElement *siElement = si_element_list->getDetectorElement(hash);
211 const Identifier wafer_id{m_sct_id->wafer_id(hash)};
212 const Identifier module_id{m_sct_id->module_id(wafer_id)};
213 size_t modhash = static_cast<size_t>(module_id.get_compact());
214
215 unsigned int badChips{m_config->badChips(module_id, ctx)}; // @todo only call once for all
216 unsigned int v_abcdErrorChips{ getValueOrZero( idcCachePtr->abcdErrorChips, modhash) };
217 unsigned int v_tempMaskedChips{ getValueOrZero( idcCachePtr->tempMaskedChips, modhash) };
218 const int side{m_sct_id->side(wafer_id)};
219 bool allChipsBad{true};
220 const int chipMax{static_cast<short>(side==0 ? N_CHIPS_PER_SIDE : N_CHIPS_PER_SIDE*N_SIDES)};
221 InDet::ChipFlags_t bad_chip_flags = 0;
222 for (int chip{chipMax-N_CHIPS_PER_SIDE}; chip<chipMax; chip++) {
223 bool issueABCDError{((v_abcdErrorChips >> chip) & 0x1) != 0};
224 bool isBadChip{((badChips >> chip) & 0x1) != 0};
225 bool isTempMaskedChip{((v_tempMaskedChips >> chip) & 0x1) != 0};
226 bool isBad = (issueABCDError or isBadChip or isTempMaskedChip);
227 bad_chip_flags |= static_cast<InDet::ChipFlags_t>(isBad) << SCT::getGeometricalFromPhysicalChipID(side, siElement->swapPhiReadoutDirection(), chip);
228 allChipsBad &= isBad;
229 }
230 status.at(element_i) = status.at(element_i) & not allChipsBad;
231 chip_status.at(element_i) &= (~bad_chip_flags) & all_flags_set;
232 }
233
234 ++element_i;
235 }
236}
bool swapPhiReadoutDirection() const
Determine if readout direction between online and offline needs swapping.
const std::vector< bool > & getElementStatus() const
const std::vector< ChipFlags_t > & getElementChipStatus() const
unsigned short ChipFlags_t
StatusCode fillData(const EventContext &ctx) const
Updates information per module & ABCD chip.
ToolHandle< ISCT_ConfigurationConditionsTool > m_config
void addDependency(const EventIDRange &range)
constexpr unsigned int getGeometricalFromPhysicalChipID(unsigned int side, bool swap, unsigned int physical_chip_id)
Get the geometrical chip ID from a physica chip ID.
MsgStream & msg
Definition testRead.cxx:32

◆ getErrorCodeWithCacheUpdate()

std::pair< StatusCode, unsigned int > SCT_ByteStreamErrorsTool::getErrorCodeWithCacheUpdate ( const Identifier & id,
const EventContext & ctx,
std::unordered_map< size_t, unsigned int > & whereExected ) const
private

Method that returns BS Error code from the map passed @rag where-Expected If the information is initially missing, the cache update is triggered.

Definition at line 479 of file SCT_ByteStreamErrorsTool.cxx.

480 {
481 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool getErrorCodeWithCacheUpdate " << moduleId);
482 size_t modhash = static_cast<size_t>(moduleId.get_compact());
483 auto it{whereExected.find(modhash)};
484 if (it != whereExected.end()) return std::make_pair(StatusCode::SUCCESS, it->second);
485
486 // even if there are no errors for this module at all filled
487 // we want the entry of value 0 so we know we walked over it and do not need to invoke filling again
488 // and and do not need to do it again
489
490 auto *cacheEntry{getCacheEntry(ctx)};
491 cacheEntry->abcdErrorChips[modhash] = 0;
492 cacheEntry->tempMaskedChips[modhash] = 0;
493
494 // the content is missing, look for actual errors
495 StatusCode sc{fillData(ctx)};
496 if (sc.isFailure()) {
497 return std::make_pair(StatusCode::FAILURE, 0);
498 }
499 // handle situation when the cache does not contain desired datum after the update
500 it = whereExected.find(modhash);
501 if (it == whereExected.end()) {
502 ATH_MSG_ERROR("After fillData in abcdErrorChips, cache does not have an infomation about the " << moduleId);
503 ATH_MSG_ERROR("Likely cause is a request for for different region");
504 return std::make_pair(StatusCode::FAILURE, 0);
505 }
506 return std::make_pair(StatusCode::SUCCESS, it->second);
507}
static Double_t sc
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ getErrorSet() [1/2]

std::set< IdentifierHash > SCT_ByteStreamErrorsTool::getErrorSet ( int errorType) const
overridevirtual

Definition at line 351 of file SCT_ByteStreamErrorsTool.cxx.

351 {
352 const EventContext& ctx{Gaudi::Hive::currentContext()};
353 return getErrorSet(errorType, ctx);
354}
virtual std::set< IdentifierHash > getErrorSet(int errorType, const EventContext &ctx) const override
The accessor method that can be used by clients to retrieve a set of IdHashes of wafers with a given ...

◆ getErrorSet() [2/2]

std::set< IdentifierHash > SCT_ByteStreamErrorsTool::getErrorSet ( int errorType,
const EventContext & ctx ) const
overridevirtual

The accessor method that can be used by clients to retrieve a set of IdHashes of wafers with a given type of error.

e.g. for monitoring plots.

Definition at line 331 of file SCT_ByteStreamErrorsTool.cxx.

331 {
332 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool getErrorSet " << errorType);
333 std::set<IdentifierHash> result;
334 if (errorType>=0 and errorType<SCT_ByteStreamErrors::NUM_ERROR_TYPES) {
335 const auto *idcErrCont{getContainer(ctx)};
336 if (idcErrCont != nullptr) {
337 const std::set<size_t>& Mask = idcErrCont->getMask();
338 const auto& raw = idcErrCont->wholeEventReadAccess();
339 for (const size_t hashId : Mask) {
340 auto errCode = raw[hashId].load(std::memory_order_relaxed);
341 if (SCT_ByteStreamErrors::hasError(errCode, static_cast<SCT_ByteStreamErrors::ErrorType>(errorType))) {
342 result.insert(hashId);
343 }
344 }
345 }
346 }
347 return result;
348}
ErrorType
SCT byte stream error type enums used in SCT_RodDecoder, SCT_ByteStreamErrorsTool,...

◆ initialize()

StatusCode SCT_ByteStreamErrorsTool::initialize ( )
overridevirtual

Initialize.

Definition at line 30 of file SCT_ByteStreamErrorsTool.cxx.

30 {
31 ATH_CHECK(detStore()->retrieve(m_sct_id, "SCT_ID"));
32 m_cntx_sct = m_sct_id->wafer_context();
33
34 ATH_CHECK(m_config.retrieve());
35
36 // Read (Cond)Handle Keys
38 ATH_CHECK(m_SCTDetEleCollKey.initialize());
40 for (auto badError : SCT_ByteStreamErrors::BadErrors) {
41 if (badError>=63) {
42 ATH_MSG_FATAL("Logic error: Error code too large and cannot represented as a bit.");
43 }
45 }
46
47 return StatusCode::SUCCESS;
48}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
IDCInDetBSErrContainer::ErrorCode makeError(ErrorType errType)
<
static const std::vector< ErrorType > BadErrors
Bad error enums used in SCT_ByteStreamErrorsTool and SCTErrMonAlg.
retrieve(aClass, aKey=None)
Definition PyKernel.py:110

◆ isGood() [1/4]

bool SCT_ByteStreamErrorsTool::isGood ( const Identifier & elementId,
const EventContext & ctx,
InDetConditions::Hierarchy h = InDetConditions::DEFAULT ) const
overridevirtual

Definition at line 247 of file SCT_ByteStreamErrorsTool.cxx.

247 {
248 if (not canReportAbout(h)) return true;
249
251 const IdentifierHash elementIdHash{m_sct_id->wafer_hash(elementId)};
252 return isGood(elementIdHash, ctx);
253 }
255 return isGoodChip(elementId, ctx);
256 }
257
258 return true;
259}
virtual bool isGood(const Identifier &elementId, InDetConditions::Hierarchy h=InDetConditions::DEFAULT) const override
Is the detector element good?
virtual bool canReportAbout(InDetConditions::Hierarchy h) const override
Used by ConditionsSummayTool to decide whether to call isGood() for a particular detector element.
bool isGoodChip(const Identifier &stripId, const EventContext &ctx) const

◆ isGood() [2/4]

bool SCT_ByteStreamErrorsTool::isGood ( const Identifier & elementId,
InDetConditions::Hierarchy h = InDetConditions::DEFAULT ) const
overridevirtual

Is the detector element good?

Definition at line 262 of file SCT_ByteStreamErrorsTool.cxx.

262 {
263 const EventContext& ctx{Gaudi::Hive::currentContext()};
264 return isGood(elementId, ctx, h);
265}

◆ isGood() [3/4]

bool SCT_ByteStreamErrorsTool::isGood ( const IdentifierHash & elementIdHash) const
overridevirtual

Definition at line 240 of file SCT_ByteStreamErrorsTool.cxx.

240 {
241 const EventContext& ctx{Gaudi::Hive::currentContext()};
242
243 return isGood(elementIdHash, ctx);
244}

◆ isGood() [4/4]

bool SCT_ByteStreamErrorsTool::isGood ( const IdentifierHash & elementIdHash,
const EventContext & ctx ) const
overridevirtual

this is the principle method which can be accessed via the ConditionsSummaryTool to decide if a wafer is good - in this case we want to return false if the wafer has an error that would result in bad hits or no hits for that event

Definition at line 113 of file SCT_ByteStreamErrorsTool.cxx.

113 {
114 {
115
116 std::scoped_lock<std::mutex> lock{*m_cacheMutex.get(ctx)};
117 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool isGood called for " << elementIdHash);
118 const auto *idcCachePtr{getCacheEntry(ctx)->IDCCache};
119 if (idcCachePtr == nullptr) {
120 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool No cache! ");
121 return true;
122 }
123
124 auto errorCode{idcCachePtr->retrieve(elementIdHash)};
125
126 bool is_bad = errorCode & m_badErrorMask;
127 if (is_bad) {
128 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool Bad Error " << errorCode << " for ID " << elementIdHash);
129 return false;
130 }
131
132 } // end of cache operations protection via m_cacheMutex, following code has own protection
133
134 // If all 6 chips of a link issue ABCD errors or are bad chips or temporarily masked chips, the link is treated as bad one.
135 const Identifier wafer_id{m_sct_id->wafer_id(elementIdHash)};
136 const Identifier module_id{m_sct_id->module_id(wafer_id)};
137 unsigned int badChips{m_config->badChips(module_id, ctx)};
138 unsigned int v_abcdErrorChips{abcdErrorChips(module_id, ctx)};
139 unsigned int v_tempMaskedChips{tempMaskedChips(module_id, ctx)};
140 const int side{m_sct_id->side(wafer_id)};
141 bool allChipsBad{true};
142 const int chipMax{static_cast<short>(side==0 ? N_CHIPS_PER_SIDE : N_CHIPS_PER_SIDE*N_SIDES)};
143 for (int chip{chipMax-N_CHIPS_PER_SIDE}; chip<chipMax; chip++) {
144 bool issueABCDError{((v_abcdErrorChips >> chip) & 0x1) != 0};
145 bool isBadChip{((badChips >> chip) & 0x1) != 0};
146 bool isTempMaskedChip{((v_tempMaskedChips >> chip) & 0x1) != 0};
147 allChipsBad = (issueABCDError or isBadChip or isTempMaskedChip);
148 if (not allChipsBad) break;
149 }
150 return !allChipsBad;
151}
virtual unsigned int tempMaskedChips(const Identifier &moduleId, const EventContext &ctx) const override
const IDCInDetBSErrContainer_Cache * IDCCache

◆ isGoodChip()

bool SCT_ByteStreamErrorsTool::isGoodChip ( const Identifier & stripId,
const EventContext & ctx ) const
private

Definition at line 268 of file SCT_ByteStreamErrorsTool.cxx.

268 {
269 // This check assumes present SCT.
270 // Get module number
271 const Identifier moduleId{m_sct_id->module_id(stripId)};
272 if (not moduleId.is_valid()) {
273 ATH_MSG_WARNING("moduleId obtained from stripId " << stripId << " is invalid.");
274 return false;
275 }
276
277 // tempMaskedChips and abcdErrorChips hold 12 bits.
278 // bit 0 (LSB) is chip 0 for side 0.
279 // bit 5 is chip 5 for side 0.
280 // bit 6 is chip 6 for side 1.
281 // bit 11 is chip 11 for side 1.
282 // Temporarily masked chip information
283 const unsigned int v_tempMaskedChips{tempMaskedChips(moduleId, ctx)};
284 // Information of chips with ABCD errors
285 const unsigned int v_abcdErrorChips{abcdErrorChips(moduleId, ctx)};
286 // Take 'OR' of tempMaskedChips and abcdErrorChips
287 const unsigned int badChips{v_tempMaskedChips | v_abcdErrorChips};
288
289 // If there is no bad chip, this check is done.
290 if (badChips==0) return true;
291
292 const int side{m_sct_id->side(stripId)};
293 // Check the six chips on the side
294 // 0x3F = 0000 0011 1111
295 // 0xFC0 = 1111 1100 0000
296 // If there is no bad chip on the side, this check is done.
297 if ((side==0 and (badChips & 0x3F)==0) or (side==1 and (badChips & 0xFC0)==0)) return true;
298
299 int chip{getChip(stripId, ctx)};
300 if (chip<0 or chip>=12) {
301 ATH_MSG_WARNING("chip number is invalid: " << chip);
302 return false;
303 }
304
305 // Check if the chip is bad
306 const bool badChip{static_cast<bool>(badChips & (1<<chip))};
307
308 return (not badChip);
309}
#define ATH_MSG_WARNING(x)
bool is_valid() const
Check if id is in a valid state.
int getChip(const Identifier &stripId, const EventContext &ctx) const

◆ tempMaskedChips() [1/2]

unsigned int SCT_ByteStreamErrorsTool::tempMaskedChips ( const Identifier & moduleId) const
overridevirtual

Definition at line 452 of file SCT_ByteStreamErrorsTool.cxx.

452 {
453 const EventContext& ctx{Gaudi::Hive::currentContext()};
454 return tempMaskedChips(moduleId, ctx);
455}

◆ tempMaskedChips() [2/2]

unsigned int SCT_ByteStreamErrorsTool::tempMaskedChips ( const Identifier & moduleId,
const EventContext & ctx ) const
overridevirtual

Definition at line 435 of file SCT_ByteStreamErrorsTool.cxx.

435 {
436 ATH_MSG_VERBOSE("SCT_ByteStreamErrorsTool tempMaskedChips");
437 std::scoped_lock<std::mutex> lock{*m_cacheMutex.get(ctx)};
438 auto *cacheEntry{getCacheEntry(ctx)};
439 if (cacheEntry->IDCCache == nullptr) {
440 ATH_MSG_VERBOSE("cacheEntry->IDCCache == nullptr");
441 return 0;
442 }
443
444 auto [status, v_tempMaskedChips] = getErrorCodeWithCacheUpdate(moduleId, ctx, cacheEntry->tempMaskedChips);
445 if (status.isFailure()) {
446 ATH_MSG_ERROR("SCT_ByteStreamErrorsTool Failure getting temp masked chip errors");
447 }
448 return v_tempMaskedChips; // 12 bits are used.
449 // Bit 0 is for chip 0 on side 0, bit 1 is for chip 1 on side 0, ..., and bit 11 is for chip 5 on side 1
450}

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/2]

SG::SlotSpecificObj<std::mutex> m_cacheMutex SCT_ByteStreamErrorsTool::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 107 of file SCT_ByteStreamErrorsTool.h.

◆ ATLAS_THREAD_SAFE [2/2]

SG::SlotSpecificObj<IDCCacheEntry> m_eventCache SCT_ByteStreamErrorsTool::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 136 of file SCT_ByteStreamErrorsTool.h.

◆ m_badErrorMask

uint64_t SCT_ByteStreamErrorsTool::m_badErrorMask {}
private

Definition at line 105 of file SCT_ByteStreamErrorsTool.h.

105{};

◆ m_bsIDCErrContainerName

SG::ReadHandleKey<IDCInDetBSErrContainer> SCT_ByteStreamErrorsTool::m_bsIDCErrContainerName {this, "IDCByteStreamErrContainer", "SCT_ByteStreamErrs", "SCT BS error key for IDC variant"}
private

Definition at line 100 of file SCT_ByteStreamErrorsTool.h.

100{this, "IDCByteStreamErrContainer", "SCT_ByteStreamErrs", "SCT BS error key for IDC variant"};

◆ m_cntx_sct

IdContext SCT_ByteStreamErrorsTool::m_cntx_sct
private

Definition at line 104 of file SCT_ByteStreamErrorsTool.h.

◆ m_config

ToolHandle<ISCT_ConfigurationConditionsTool> SCT_ByteStreamErrorsTool::m_config
private
Initial value:
{this, "ConfigTool",
"SCT_ConfigurationConditionsTool/InDetSCT_ConfigurationConditionsTool", "Tool to retrieve SCT Configuration Tool"}

Definition at line 97 of file SCT_ByteStreamErrorsTool.h.

97 {this, "ConfigTool",
98 "SCT_ConfigurationConditionsTool/InDetSCT_ConfigurationConditionsTool", "Tool to retrieve SCT Configuration Tool"};

◆ m_nRetrievalFailure

std::atomic_uint SCT_ByteStreamErrorsTool::m_nRetrievalFailure {0}
mutableprivate

Definition at line 142 of file SCT_ByteStreamErrorsTool.h.

142{0};

◆ m_sct_id

const SCT_ID* SCT_ByteStreamErrorsTool::m_sct_id {nullptr}
private

Definition at line 103 of file SCT_ByteStreamErrorsTool.h.

103{nullptr};

◆ m_SCTDetEleCollKey

SG::ReadCondHandleKey<InDetDD::SiDetectorElementCollection> SCT_ByteStreamErrorsTool::m_SCTDetEleCollKey {this, "SCTDetEleCollKey", "SCT_DetectorElementCollection", "Key of SiDetectorElementCollection for SCT"}
private

Definition at line 101 of file SCT_ByteStreamErrorsTool.h.

101{this, "SCTDetEleCollKey", "SCT_DetectorElementCollection", "Key of SiDetectorElementCollection for SCT"};

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