ATLAS Offline Software
Loading...
Searching...
No Matches
PixelConditionsSummaryTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
8
9PixelConditionsSummaryTool::PixelConditionsSummaryTool(const std::string& type, const std::string& name, const IInterface* parent)
10 :AthAlgTool(type, name, parent),
11 m_pixelID(nullptr)
12{
13 m_isActiveStatus.emplace_back("OK");
14 m_isActiveStates.emplace_back("READY");
15
16 declareProperty("IsActiveStatus", m_isActiveStatus);
17 declareProperty("IsActiveStates", m_isActiveStates);
18}
19
21
23 ATH_MSG_DEBUG("PixelConditionsSummaryTool::initialize()");
24
25 ATH_CHECK(m_condDCSStateKey.initialize());
26 ATH_CHECK(m_condDCSStatusKey.initialize());
27
29 ATH_CHECK(m_BSErrContReadKey.initialize(useByteStream && !m_BSErrContReadKey.empty()));
30 ATH_CHECK(detStore()->retrieve(m_pixelID,"PixelID"));
31 ATH_CHECK(m_condTDAQKey.initialize( !m_condTDAQKey.empty() ));
32 ATH_CHECK(m_condDeadMapKey.initialize());
33 ATH_CHECK(m_pixelDetEleCollKey.initialize());
35 ATH_MSG_FATAL("The event data (PixelDetElStatusEventDataBaseKey) and cond data (PixelDetElStatusCondDataBaseKey) keys cannot be set at the same time.");
36 }
39
41 for (unsigned int istate=0; istate<m_isActiveStates.size(); istate++) {
43 else if (m_isActiveStates[istate]=="ON") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::ON); }
44 else if (m_isActiveStates[istate]=="UNKNOWN") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::UNKNOWN); }
45 else if (m_isActiveStates[istate]=="TRANSITION") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::TRANSITION); }
46 else if (m_isActiveStates[istate]=="UNDEFINED") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::UNDEFINED); }
47 else if (m_isActiveStates[istate]=="DISABLED") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::DISABLED); }
48 else if (m_isActiveStates[istate]=="LOCKED_OUT") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::LOCKED_OUT); }
49 else if (m_isActiveStates[istate]=="OFF") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::OFF); }
50 else if (m_isActiveStates[istate]=="NOSTATE") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::NOSTATE); }
51 else {
52 ATH_MSG_ERROR("No matching DCS state " << m_isActiveStates[istate] << " in DCSModuleState");
53 return StatusCode::FAILURE;
54 }
55 if (m_activeState.back()<0 || m_activeState.back()>31) {
56 ATH_MSG_FATAL("Logic error: status id too large. Cannot be represented by a bit");
57 return StatusCode::FAILURE;
58 }
59 m_activeStateMask |= (1u<<m_activeState.back());
60 }
61
63 for (auto & isActiveStatus : m_isActiveStatus) {
64 if (isActiveStatus=="OK") { m_activeStatus.push_back(PixelDCSStatusData::DCSModuleStatus::OK); }
65 else if (isActiveStatus=="WARNING") { m_activeStatus.push_back(PixelDCSStatusData::DCSModuleStatus::WARNING); }
66 else if (isActiveStatus=="ERROR") { m_activeStatus.push_back(PixelDCSStatusData::DCSModuleStatus::ERROR); }
67 else if (isActiveStatus=="FATAL") { m_activeStatus.push_back(PixelDCSStatusData::DCSModuleStatus::FATAL); }
68 else if (isActiveStatus=="NOSTATUS") { m_activeStatus.push_back(PixelDCSStatusData::DCSModuleStatus::NOSTATUS); }
69 else {
70 ATH_MSG_ERROR("No matching DCS status " << isActiveStatus << " in DCSModuleStatus");
71 return StatusCode::FAILURE;
72 }
73 if (m_activeStatus.back()<0 || m_activeStatus.back()>31) {
74 ATH_MSG_FATAL("Logic error: status id too large. Cannot be represented by a bit");
75 return StatusCode::FAILURE;
76 }
77 m_activeStatusMask |= (1u<<m_activeStatus.back());
78 }
79
80 return StatusCode::SUCCESS;
81}
82
85 if (!useByteStream || m_BSErrContReadKey.empty() ) {
86 return nullptr;
87 }
89 if (not idcErrCont.isValid()) { return nullptr; }
90 ATH_MSG_VERBOSE("PixelConditionsSummaryTool IDC Container fetched " << m_BSErrContReadKey.key());
91 return idcErrCont.cptr();
92}
93
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 }
101 else {
102 cacheEntry->reset(ctx.evt(), idcErrContPtr->cache());
103 }
104 ATH_MSG_VERBOSE("PixelConditionsSummaryTool Cache for the event reset " << cacheEntry->eventId << " with IDC container" << idcErrContPtr);
105 }
106 return cacheEntry;
107}
108
110 std::scoped_lock<std::mutex> lock{*m_cacheMutex.get(ctx)};
111 IDCCacheEntry* cacheEntry = getCacheEntry(ctx);
112 return cacheEntry;
113}
114
115uint64_t PixelConditionsSummaryTool::getBSErrorWord(const IdentifierHash& moduleHash, const EventContext& ctx, const IInDetConditionsTool::IDCCacheEntry* cacheEntry) const {
116 return getBSErrorWord(moduleHash, moduleHash, ctx, cacheEntry);
117}
118
119const InDetDD::SiDetectorElement *PixelConditionsSummaryTool::getDetectorEelement(const IdentifierHash& moduleHash, const EventContext& ctx) const {
120 if (moduleHash>=m_pixelID->wafer_hash_max()) {
121 ATH_MSG_ERROR("invalid moduleHash : " << moduleHash << " exceed maximum hash id: " << m_pixelID->wafer_hash_max());
122 return nullptr;
123 }
124
126 const InDetDD::SiDetectorElementCollection* elements(*pixelDetEleHandle);
127 if (not pixelDetEleHandle.isValid() or elements==nullptr) {
128 ATH_MSG_ERROR(m_pixelDetEleCollKey.fullKey() << " is not available.");
129 return nullptr;
130 }
131 return elements->getDetectorElement(moduleHash);
132}
133
135 const int index,
136 const EventContext& ctx,
137 const IInDetConditionsTool::IDCCacheEntry* cacheEntry) const {
138 const InDetDD::SiDetectorElement *element = getDetectorEelement(moduleHash,ctx);
139 const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
140 return getBSErrorWord(p_design,index,ctx,cacheEntry);
141}
142
144 const int index,
145 const EventContext& ctx,
146 const IInDetConditionsTool::IDCCacheEntry* cacheEntry) const {
147
151
152 if (cacheEntry == nullptr){
153 std::scoped_lock<std::mutex> lock{*m_cacheMutex.get(ctx)};
154 cacheEntry=getCacheEntry(ctx);
155 }
156 const auto *idcCachePtr = cacheEntry->IDCCache;
157 if (idcCachePtr==nullptr) {
158 ATH_MSG_ERROR("PixelConditionsSummaryTool No cache! " );
159 return 0;
160 }
161 uint64_t word = (uint64_t)idcCachePtr->retrieve(index);
162 return word<m_missingErrorInfo ? word : 0;
163}
164
165bool PixelConditionsSummaryTool::hasBSError(const IdentifierHash& moduleHash, const EventContext& ctx, const IInDetConditionsTool::IDCCacheEntry* cacheEntry) const {
166 const InDetDD::SiDetectorElement *element = getDetectorEelement(moduleHash,ctx);
167 const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
168 return hasBSError(p_design,moduleHash, ctx,cacheEntry);
169}
170
172 const IdentifierHash& moduleHash,
173 const EventContext& ctx,
174 const IInDetConditionsTool::IDCCacheEntry* cacheEntry) const {
175 uint64_t word = getBSErrorWord(p_design,moduleHash, ctx,cacheEntry);
176 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::TruncatedROB)) { return true; }
177 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MaskedROB)) { return true; }
178 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::Preamble)) { return true; }
179 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::TimeOut)) { return true; }
180 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::LVL1ID)) { return true; }
181 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::BCID)) { return true; }
182 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::Trailer)) { return true; }
183 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCLVL1IDEoECheck)) { return true; }
184 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCBCIDEoECheck)) { return true; }
185 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCLVL1IDCheck)) { return true; }
186 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCEoEOverflow)) { return true; }
187 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCHitOverflow)) { return true; }
188 return false;
189}
190
191bool PixelConditionsSummaryTool::hasBSError(const IdentifierHash& moduleHash, Identifier pixid, const EventContext& ctx, const IInDetConditionsTool::IDCCacheEntry* cacheEntry) const {
192 const InDetDD::SiDetectorElement *element = getDetectorEelement(moduleHash,ctx);
193 const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
194
195 if (hasBSError(p_design, moduleHash, ctx, cacheEntry)) { return true; }
196
197 int maxHash = m_pixelID->wafer_hash_max();
198
199 std::array<InDetDD::PixelDiodeTree::CellIndexType,2> diode_idx
201 m_pixelID->eta_index(pixid));
202 InDetDD::PixelDiodeTree::DiodeProxy si_param ( p_design->diodeProxyFromIdx(diode_idx));
203 std::uint32_t chFE = p_design->getFE(si_param);
204
205 int indexFE = (1+chFE)*maxHash+static_cast<int>(moduleHash); // (FE_channel+1)*2048 + moduleHash
206 uint64_t word = getBSErrorWord(p_design,indexFE,ctx,cacheEntry);
207 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::Preamble)) { return true; }
208 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::TimeOut)) { return true; }
209 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::LVL1ID)) { return true; }
210 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::BCID)) { return true; }
211 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::Trailer)) { return true; }
212 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCLVL1IDEoECheck)) { return true; }
213 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCBCIDEoECheck)) { return true; }
214 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCLVL1IDCheck)) { return true; }
215 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCEoEOverflow)) { return true; }
216 if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCHitOverflow)) { return true; }
217 return false;
218}
219
220bool PixelConditionsSummaryTool::isActive(const Identifier& /*elementId*/, const InDetConditions::Hierarchy /*h*/, const EventContext& /*ctx*/) const {
221 return true;
222}
223
224bool PixelConditionsSummaryTool::isActive(const IdentifierHash& moduleHash, const EventContext& ctx) const {
225
226 // The index array is defined in PixelRawDataProviderTool::SizeOfIDCInDetBSErrContainer()
227 // Here, 52736 is a separator beween error flags and isActive flags.
229 if (useByteStream && getBSErrorWord(moduleHash,moduleHash+52736,ctx)!=1) { return false; }
230
232 bool isDCSActive = false;
233 for (int istate : m_activeState) {
234 if (istate==dcsstate_data->getModuleStatus(moduleHash)) { isDCSActive=true; }
235 }
236 if (!isDCSActive) { return false; }
237
238 if (!m_condTDAQKey.empty() && SG::ReadCondHandle<PixelTDAQData>(m_condTDAQKey,ctx)->getModuleStatus(moduleHash)) { return false; }
239
240 if (SG::ReadCondHandle<PixelDeadMapCondData>(m_condDeadMapKey,ctx)->getModuleStatus(moduleHash)) { return false; }
241
242 return true;
243}
244
245bool PixelConditionsSummaryTool::isActive(const IdentifierHash& moduleHash, const Identifier& elementId, const EventContext& ctx) const {
246
247 // The index array is defined in PixelRawDataProviderTool::SizeOfIDCInDetBSErrContainer()
248 // Here, 52736 is a separator beween error flags and isActive flags.
250 if (useByteStream && getBSErrorWord(moduleHash,moduleHash+52736,ctx)!=1) { return false; }
251
253 bool isDCSActive = false;
254 for (int istate : m_activeState) {
255 if (istate==dcsstate_data->getModuleStatus(moduleHash)) { isDCSActive=true; }
256 }
257 if (!isDCSActive) { return false; }
258
259 if (!m_condTDAQKey.empty() && SG::ReadCondHandle<PixelTDAQData>(m_condTDAQKey,ctx)->getModuleStatus(moduleHash)) { return false; }
260
261 if (SG::ReadCondHandle<PixelDeadMapCondData>(m_condDeadMapKey,ctx)->getModuleStatus(moduleHash)) { return false; }
262
263 return checkChipStatus(moduleHash, elementId, ctx);
264}
265
266double PixelConditionsSummaryTool::activeFraction(const IdentifierHash & /*moduleHash*/, const Identifier & /*idStart*/, const Identifier & /*idEnd*/, const EventContext& /*ctx*/) const {
267 return 1.0;
268}
269
270bool PixelConditionsSummaryTool::isGood(const Identifier& elementId, const InDetConditions::Hierarchy h, const EventContext& ctx) const {
271 Identifier moduleID = m_pixelID->wafer_id(elementId);
272 IdentifierHash moduleHash = m_pixelID->wafer_hash(moduleID);
273
274 if (hasBSError(moduleHash, ctx)) { return false; }
275
277 bool isDCSActive = false;
278 for (int istate : m_activeState) {
279 if (istate==dcsstate_data->getModuleStatus(moduleHash)) { isDCSActive=true; }
280 }
281 if (!isDCSActive) { return false; }
282
284 bool isDCSGood = false;
285 for (int activeStatus : m_activeStatus) {
286 if (activeStatus==dcsstatus_data->getModuleStatus(moduleHash)) { isDCSGood=true; }
287 }
288 if (!isDCSGood) { return false; }
289
290 if (!m_condTDAQKey.empty() && SG::ReadCondHandle<PixelTDAQData>(m_condTDAQKey,ctx)->getModuleStatus(moduleHash)) { return false; }
291
292 if (SG::ReadCondHandle<PixelDeadMapCondData>(m_condDeadMapKey, ctx)->getModuleStatus(moduleHash)) { return false; }
293
295 if (!checkChipStatus(moduleHash, elementId,ctx)) { return false; }
296 if (hasBSError(moduleHash, elementId, ctx)) { return false; }
297 }
298
299 return true;
300}
301
302namespace {
303 inline void andStatus(const std::unordered_map<int, int> &status_map, unsigned int status_mask, std::vector<bool> &module_status) {
304 for (const std::pair<const int, int> &elm : status_map ) {
305 // set modules good if the module status passes the mask.
306 module_status.at(elm.first) = module_status.at(elm.first) && (status_mask & (1<<elm.second));
307 }
308 }
309 inline void andNotStatus(const std::unordered_map<int, int> &status_map, std::vector<bool> &module_status) {
310 for (const std::pair<const int, int> &elm : status_map ) {
311 // set modules good if the module status passes the mask.
312 module_status.at(elm.first) = module_status.at(elm.first) && (elm.second==0);
313 }
314 }
315 bool isBSError(uint64_t error, uint64_t max_error, uint64_t mask) {
316 return error<max_error && (error & mask);
317 }
318}
319
320namespace {
321 const InDet::PixelDetectorElementStatus *castToDerived(const InDet::SiDetectorElementStatus *input) {
323 if (!ret) {
324 throw std::runtime_error("Object is not of expected type InDet::PixelDetectorElementStatus");
325 }
326 return ret;
327 }
328}
329std::unique_ptr<InDet::SiDetectorElementStatus>
332 if (!m_pixelDetElStatusCondKey.empty()) {
334 if (whandle) {
335 whandle->addDependency (input_element_status);
336 }
337 return std::make_unique<InDet::PixelDetectorElementStatus>(*castToDerived(input_element_status.cptr()));
338 }
339 else if (!m_pixelDetElStatusEventKey.empty()) {
341 return std::make_unique<InDet::PixelDetectorElementStatus>(*castToDerived(input_element_status.cptr()));
342 }
343 else {
345 if (not pixelDetEleHandle.isValid() ) {
346 std::stringstream msg;
347 msg << m_pixelDetEleCollKey.fullKey() << " is not available.";
348 throw std::runtime_error(msg.str());
349 }
350 if (whandle) {
351 whandle->addDependency (pixelDetEleHandle);
352 }
353 const InDetDD::SiDetectorElementCollection* elements(*pixelDetEleHandle);
354 return std::make_unique<InDet::PixelDetectorElementStatus>(*elements);
355 }
356}
357
358std::unique_ptr<InDet::SiDetectorElementStatus>
361 std::unique_ptr<InDet::SiDetectorElementStatus> element_status( createDetectorElementStatus(ctx, whandle));
362 std::vector<bool> &status=element_status->getElementStatus();
363 status.resize(m_pixelID->wafer_hash_max(),
364 ((1<<0) & m_activeStateMask) // default value of PixelDCSStateData is 0
365 );
366 std::vector<InDet::ChipFlags_t> &chip_status=element_status->getElementChipStatus();
367 chip_status.resize(status.size(),0);
368
369 // module state
370 {
372 andStatus(dcs_state_handle->moduleStatusMap(), m_activeStateMask, status);
373 if (whandle) {
374 whandle->addDependency (dcs_state_handle);
375 }
376 }
377 const bool active_only = m_activeOnly;
378 if (!active_only) {
380 andStatus(dcs_status_handle->moduleStatusMap(), m_activeStatusMask, status);
381 if (whandle) {
382 whandle->addDependency (dcs_status_handle);
383 }
384 }
385 if (!m_condTDAQKey.empty()) {
387 andNotStatus(tdaq_handle->moduleStatusMap(), status);
388 if (whandle) {
389 whandle->addDependency (tdaq_handle);
390 }
391 }
392 {
394 andNotStatus(dead_map_handle->moduleStatusMap(), status);
395 if (whandle) {
396 whandle->addDependency (dead_map_handle);
397 }
398
399 const PixelDeadMapCondData *dead_map = dead_map_handle.cptr();
400 unsigned int element_i=0;
401 for (const InDetDD::SiDetectorElement *element : element_status->getDetectorElements()) {
402 if (status[element_i]) {
403 const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
404 InDetDD::PixelReadoutTechnology readout_technology = p_design->getReadoutTechnology();
405 unsigned int number_of_chips = readout_technology == InDetDD::PixelReadoutTechnology::FEI3 ? 2*p_design->numberOfCircuits() : p_design->numberOfCircuits();
406 InDet::ChipFlags_t chip_mask = (1ul<<number_of_chips)-1ul;
407 assert( chip_mask != 0 );
408 std::bitset<16> dead_chip_mask(dead_map->getChipStatus(element_i));
409 chip_status[element_i] = chip_mask & (~static_cast<InDet::ChipFlags_t>(dead_chip_mask.to_ulong()));
410 }
411 ++element_i;
412 }
413 }
414
415
416 static_assert( static_cast<unsigned int>(InDetDD::PixelReadoutTechnology::FEI4) < 32u) ;
417 static_assert( static_cast<unsigned int>(InDetDD::PixelReadoutTechnology::FEI3) < 32u) ;
418 static_assert( static_cast<unsigned int>(InDetDD::PixelReadoutTechnology::RD53) < 32u) ;
422 if (readout_technology_mask) {
423 if (whandle) {
424 ATH_MSG_ERROR("PixelConditionsSummaryTool not configured for use with conditions objects");
426 }
427 std::scoped_lock<std::mutex> lock{*m_cacheMutex.get(ctx)};
428 const IDCInDetBSErrContainer_Cache *idcCachePtr = nullptr;
429 idcCachePtr = getCacheEntry(ctx)->IDCCache;
430 if (idcCachePtr==nullptr) {
431 ATH_MSG_ERROR("PixelConditionsSummaryTool No cache! " );
432 }
433 else {
434
447
448 constexpr uint64_t chip_error_mask = PixelByteStreamErrors::makeError(PixelByteStreamErrors::Preamble)
458
459 // The index array is defined in PixelRawDataProviderTool::SizeOfIDCInDetBSErrContainer()
460 // Here, 52736 is a separator beween error flags and isActive flags.
461 unsigned int element_offset_i = (active_only ? 52736 : 0);
462
463 unsigned int element_i=0;
464 unsigned int maxHash = m_pixelID->wafer_hash_max();
465 for (const InDetDD::SiDetectorElement *element : element_status->getDetectorElements()) {
466 const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
467 InDetDD::PixelReadoutTechnology readout_technology = p_design->getReadoutTechnology();
468 unsigned int readout_technology_flags = readout_technology_mask & Pixel::makeReadoutTechnologyBit(readout_technology);
469
470 // set to false if has one of the considered errors and the readout technology is considered.
471 status.at(element_i) = status.at(element_i) && not ( readout_technology_flags
472 && ( !active_only
473 ? isBSError(static_cast<uint64_t>(idcCachePtr->retrieve(element_i)), m_missingErrorInfo, error_mask)
474 : idcCachePtr->retrieve(element_i+element_offset_i)!=1 ));
475
476 // compute the status for the individual front-ends
477 if (status[element_i]) {
478 unsigned int number_of_chips = readout_technology == InDetDD::PixelReadoutTechnology::FEI3 ? 2*p_design->numberOfCircuits() : p_design->numberOfCircuits();
479 InDet::ChipFlags_t chip_mask = status[element_i] ? (1ul<<number_of_chips)-1ul : 0;
480 assert( chip_mask != 0 );
481 InDet::ChipFlags_t bs_status_flags = active_only ? chip_mask : 0;
482 if (!active_only) {
483 for (unsigned int chip_i =0; chip_i < number_of_chips; ++chip_i) {
484 // get bytestream error for chip
485 unsigned int indexFE = (1+chip_i)*maxHash + element_i; // (FE_channel+1)*2048 + moduleHash
486 InDet::ChipFlags_t chip_flag =not ( readout_technology_flags
487 && (isBSError(static_cast<uint64_t>(idcCachePtr->retrieve(indexFE)), m_missingErrorInfo, chip_error_mask)));
488 bs_status_flags |= (chip_flag << chip_i);
489 }
490 }
491 chip_status[element_i] &= (bs_status_flags & chip_mask);
492 }
493 else {
494 chip_status[element_i] = 0;
495 }
496 ++element_i;
497 }
498 }
499 }
500 return element_status;
501}
502
503bool PixelConditionsSummaryTool::isGood(const IdentifierHash& moduleHash, const EventContext& ctx) const {
504
505 if (hasBSError(moduleHash, ctx)) { return false; }
506
508 bool isDCSActive = false;
509 for (int istate : m_activeState) {
510 if (istate==dcsstate_data->getModuleStatus(moduleHash)) { isDCSActive=true; }
511 }
512 if (!isDCSActive) { return false; }
513
515 bool isDCSGood = false;
516 for (int activeStatus : m_activeStatus) {
517 if (activeStatus==dcsstatus_data->getModuleStatus(moduleHash)) { isDCSGood=true; }
518 }
519 if (!isDCSGood) { return false; }
520
521 if (!m_condTDAQKey.empty() && SG::ReadCondHandle<PixelTDAQData>(m_condTDAQKey,ctx)->getModuleStatus(moduleHash)) { return false; }
522
523 if (SG::ReadCondHandle<PixelDeadMapCondData>(m_condDeadMapKey, ctx)->getModuleStatus(moduleHash)) { return false; }
524
525 return true;
526}
527
528bool PixelConditionsSummaryTool::isGood(const IdentifierHash & moduleHash, const Identifier &elementId, const EventContext& ctx, const IInDetConditionsTool::IDCCacheEntry* cacheEntry) const {
529
530 if (hasBSError(moduleHash, ctx, cacheEntry)) { return false; }
531
533 bool isDCSActive = false;
534 for (int istate : m_activeState) {
535 if (istate==dcsstate_data->getModuleStatus(moduleHash)) { isDCSActive=true; }
536 }
537 if (!isDCSActive) { return false; }
538
540 bool isDCSGood = false;
541 for (int activeStatus : m_activeStatus) {
542 if (activeStatus==dcsstatus_data->getModuleStatus(moduleHash)) { isDCSGood=true; }
543 }
544 if (!isDCSGood) { return false; }
545
546 if (!m_condTDAQKey.empty() && SG::ReadCondHandle<PixelTDAQData>(m_condTDAQKey,ctx)->getModuleStatus(moduleHash)) { return false; }
547
548 if (SG::ReadCondHandle<PixelDeadMapCondData>(m_condDeadMapKey, ctx)->getModuleStatus(moduleHash)) { return false; }
549
550 if (!checkChipStatus(moduleHash, elementId, ctx)) { return false; }
551
552 if (hasBSError(moduleHash, elementId, ctx, cacheEntry)) { return false; }
553
554 return true;
555}
556
557double PixelConditionsSummaryTool::goodFraction(const IdentifierHash & moduleHash, const Identifier & idStart, const Identifier & idEnd, const EventContext& ctx) const {
558
559 if (!isGood(moduleHash, ctx)) { return 0.0; }
560
561 Identifier moduleID = m_pixelID->wafer_id(moduleHash);
562
563 int phiStart = m_pixelID->phi_index(idStart);
564 int etaStart = m_pixelID->eta_index(idStart);
565
566 int phiEnd = m_pixelID->phi_index(idEnd);
567 int etaEnd = m_pixelID->eta_index(idEnd);
568
569 double nTotal = (std::abs(phiStart-phiEnd)+1.0)*(std::abs(etaStart-etaEnd)+1.0);
570
571 double nGood = 0.0;
573 for (int i=std::min(phiStart,phiEnd); i<=std::max(phiStart,phiEnd); i++) {
574 for (int j=std::min(etaStart,etaEnd); j<=std::max(etaStart,etaEnd); j++) {
575 if (checkChipStatus(moduleHash, m_pixelID->pixel_id(moduleID,i,j), ctx)) {
576 if (!hasBSError(moduleHash, m_pixelID->pixel_id(moduleID,i,j), ctx, cacheEntry)) { nGood++; }
577 }
578 }
579 }
580 return nGood/nTotal;
581}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
IdentifiableValueCache< IDCInDetBSErrContainer::ErrorCode > IDCInDetBSErrContainer_Cache
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
MsgStream & msg() const
Header file for AthHistogramAlgorithm.
IDC like storage for BS errors, TODO, customise implementation further so that we store int rather th...
T retrieve(size_t i)
Retrieve the Value stored in that hash.
This is a "hash" representation of an Identifier.
static constexpr std::array< PixelDiodeTree::CellIndexType, 2 > makeCellIndex(T local_x_idx, T local_y_idx)
Create a 2D cell index from the indices in local-x (phi, row) and local-y (eta, column) direction.
Class used to describe the design of a module (diode segmentation and readout scheme)
PixelReadoutTechnology getReadoutTechnology() const
PixelDiodeTree::DiodeProxy diodeProxyFromIdx(const std::array< PixelDiodeTree::IndexType, 2 > &idx) const
int numberOfCircuits() const
Total number of circuits:
static unsigned int getFE(const PixelDiodeTree::DiodeProxy &diode_proxy)
Class to hold the SiDetectorElement objects to be put in the detector store.
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Class to hold geometrical description of a silicon detector element.
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
Event data to hold the status information for Pixel modules.
Gaudi::Property< bool > m_useByteStreamFEI3
SG::ReadCondHandleKey< PixelDCSStatusData > m_condDCSStatusKey
std::vector< std::string > m_isActiveStates
virtual ~PixelConditionsSummaryTool()
Gaudi::Property< bool > m_useByteStreamFEI4
virtual std::unique_ptr< InDet::SiDetectorElementStatus > getDetectorElementStatus(const EventContext &ctx, SG::WriteCondHandle< InDet::SiDetectorElementStatus > *whandle) const override
get the module and chip status of Si detector elements
virtual bool isActive(const Identifier &elementId, const InDetConditions::Hierarchy h, const EventContext &ctx) const override final
virtual IDCCacheEntry * getCacheEntryOut(const EventContext &ctx) const override final
unsigned int m_activeStateMask
mask in which each state is represented by a bit and for states which are cnsidered active the corres...
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::unique_ptr< InDet::SiDetectorElementStatus > createDetectorElementStatus(const EventContext &ctx, SG::WriteCondHandle< InDet::SiDetectorElementStatus > *whandle) const
Create a new detector element status element container.
SG::ReadCondHandleKey< PixelDCSStateData > m_condDCSStateKey
virtual double goodFraction(const IdentifierHash &moduleHash, const Identifier &idStart, const Identifier &idEnd, const EventContext &ctx) const override final
bool checkChipStatus(IdentifierHash moduleHash, Identifier pixid, const EventContext &ctx) const
virtual double activeFraction(const IdentifierHash &moduleHash, const Identifier &idStart, const Identifier &idEnd, const EventContext &ctx) const override final
virtual uint64_t getBSErrorWord(const IdentifierHash &moduleHash, const EventContext &ctx, const IDCCacheEntry *cacheEntry=nullptr) const override final
SG::ReadHandleKey< IDCInDetBSErrContainer > m_BSErrContReadKey
std::vector< std::string > m_isActiveStatus
SG::ReadCondHandleKey< PixelDeadMapCondData > m_condDeadMapKey
SG::ReadHandleKey< InDet::SiDetectorElementStatus > m_pixelDetElStatusEventKey
SG::ReadCondHandleKey< InDet::SiDetectorElementStatus > m_pixelDetElStatusCondKey
virtual bool isGood(const Identifier &elementId, const InDetConditions::Hierarchy h, const EventContext &ctx) const override final
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...
virtual bool hasBSError(const IdentifierHash &moduleHash, const EventContext &ctx, const IDCCacheEntry *cacheEntry=nullptr) const override final
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
const InDetDD::SiDetectorElement * getDetectorEelement(const IdentifierHash &moduleHash, const EventContext &ctx) const
Gaudi::Property< bool > m_useByteStreamRD53
PixelConditionsSummaryTool(const std::string &type, const std::string &name, const IInterface *parent)
SG::ReadCondHandleKey< PixelTDAQData > m_condTDAQKey
unsigned int m_activeStatusMask
mask in which each status is represented by a bit and for status values which are cnsidered active th...
virtual StatusCode initialize() override
int getChipStatus(const int chanNum) const
const_pointer_type cptr()
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
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.
Definition index.py:1
bool needsUpdate(const EventContext &ctx) const
void reset(EventContext::ContextEvt_t evtId, const IDCInDetBSErrContainer_Cache *cache)
const IDCInDetBSErrContainer_Cache * IDCCache
Helper class to access parameters of a diode.