ATLAS Offline Software
PixelConditionsSummaryTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
11 
12 PixelConditionsSummaryTool::PixelConditionsSummaryTool(const std::string& type, const std::string& name, const IInterface* parent)
14  m_pixelID(nullptr)
15 {
16  m_isActiveStatus.emplace_back("OK");
17  m_isActiveStates.emplace_back("READY");
18 
19  declareProperty("IsActiveStatus", m_isActiveStatus);
20  declareProperty("IsActiveStates", m_isActiveStates);
21 }
22 
24 
26  ATH_MSG_DEBUG("PixelConditionsSummaryTool::initialize()");
27 
30 
31  bool useByteStream = (m_useByteStreamFEI4 || m_useByteStreamFEI3 || m_useByteStreamRD53);
33  ATH_CHECK(detStore()->retrieve(m_pixelID,"PixelID"));
36  ATH_CHECK(m_pixelReadout.retrieve());
39  ATH_MSG_FATAL("The event data (PixelDetElStatusEventDataBaseKey) and cond data (PixelDetElStatusCondDataBaseKey) keys cannot be set at the same time.");
40  }
43 
45  for (unsigned int istate=0; istate<m_isActiveStates.size(); istate++) {
46  if (m_isActiveStates[istate]=="READY") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::READY); }
47  else if (m_isActiveStates[istate]=="ON") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::ON); }
48  else if (m_isActiveStates[istate]=="UNKNOWN") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::UNKNOWN); }
49  else if (m_isActiveStates[istate]=="TRANSITION") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::TRANSITION); }
50  else if (m_isActiveStates[istate]=="UNDEFINED") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::UNDEFINED); }
51  else if (m_isActiveStates[istate]=="DISABLED") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::DISABLED); }
52  else if (m_isActiveStates[istate]=="LOCKED_OUT") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::LOCKED_OUT); }
53  else if (m_isActiveStates[istate]=="OFF") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::OFF); }
54  else if (m_isActiveStates[istate]=="NOSTATE") { m_activeState.push_back(PixelDCSStateData::DCSModuleState::NOSTATE); }
55  else {
56  ATH_MSG_ERROR("No matching DCS state " << m_isActiveStates[istate] << " in DCSModuleState");
57  return StatusCode::FAILURE;
58  }
59  if (m_activeState.back()<0 || m_activeState.back()>31) {
60  ATH_MSG_FATAL("Logic error: status id too large. Cannot be represented by a bit");
61  return StatusCode::FAILURE;
62  }
63  m_activeStateMask |= (1u<<m_activeState.back());
64  }
65 
67  for (auto & isActiveStatus : m_isActiveStatus) {
68  if (isActiveStatus=="OK") { m_activeStatus.push_back(PixelDCSStatusData::DCSModuleStatus::OK); }
69  else if (isActiveStatus=="WARNING") { m_activeStatus.push_back(PixelDCSStatusData::DCSModuleStatus::WARNING); }
70  else if (isActiveStatus=="ERROR") { m_activeStatus.push_back(PixelDCSStatusData::DCSModuleStatus::ERROR); }
71  else if (isActiveStatus=="FATAL") { m_activeStatus.push_back(PixelDCSStatusData::DCSModuleStatus::FATAL); }
72  else if (isActiveStatus=="NOSTATUS") { m_activeStatus.push_back(PixelDCSStatusData::DCSModuleStatus::NOSTATUS); }
73  else {
74  ATH_MSG_ERROR("No matching DCS status " << isActiveStatus << " in DCSModuleStatus");
75  return StatusCode::FAILURE;
76  }
77  if (m_activeStatus.back()<0 || m_activeStatus.back()>31) {
78  ATH_MSG_FATAL("Logic error: status id too large. Cannot be represented by a bit");
79  return StatusCode::FAILURE;
80  }
81  m_activeStatusMask |= (1u<<m_activeStatus.back());
82  }
83 
84  return StatusCode::SUCCESS;
85 }
86 
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 
109 uint64_t PixelConditionsSummaryTool::getBSErrorWord(const IdentifierHash& moduleHash, const EventContext& ctx) const {
110  return getBSErrorWord(moduleHash, moduleHash, ctx);
111 }
112 
113 uint64_t PixelConditionsSummaryTool::getBSErrorWord(const IdentifierHash& moduleHash, const int index, const EventContext& ctx) const {
114 
115  if (moduleHash>=m_pixelID->wafer_hash_max()) {
116  ATH_MSG_WARNING("invalid moduleHash : " << moduleHash << " exceed maximum hash id: " << m_pixelID->wafer_hash_max());
117  return 0;
118  }
119 
121  const InDetDD::SiDetectorElementCollection* elements(*pixelDetEleHandle);
122  if (not pixelDetEleHandle.isValid() or elements==nullptr) {
123  ATH_MSG_WARNING(m_pixelDetEleCollKey.fullKey() << " is not available.");
124  return 0;
125  }
126  const InDetDD::SiDetectorElement *element = elements->getDetectorElement(moduleHash);
127  const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
128 
132 
133  std::scoped_lock<std::mutex> lock{*m_cacheMutex.get(ctx)};
134  const auto *idcCachePtr = getCacheEntry(ctx)->IDCCache;
135  if (idcCachePtr==nullptr) {
136  ATH_MSG_ERROR("PixelConditionsSummaryTool No cache! " );
137  return 0;
138  }
139  uint64_t word = (uint64_t)idcCachePtr->retrieve(index);
140  return word<m_missingErrorInfo ? word : 0;
141 }
142 
143 bool PixelConditionsSummaryTool::hasBSError(const IdentifierHash& moduleHash, const EventContext& ctx) const {
144  uint64_t word = getBSErrorWord(moduleHash,ctx);
145  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::TruncatedROB)) { return true; }
146  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MaskedROB)) { return true; }
147  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::Preamble)) { return true; }
148  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::TimeOut)) { return true; }
149  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::LVL1ID)) { return true; }
150  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::BCID)) { return true; }
151  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::Trailer)) { return true; }
152  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCLVL1IDEoECheck)) { return true; }
153  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCBCIDEoECheck)) { return true; }
154  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCLVL1IDCheck)) { return true; }
155  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCEoEOverflow)) { return true; }
156  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCHitOverflow)) { return true; }
157  return false;
158 }
159 
160 bool PixelConditionsSummaryTool::hasBSError(const IdentifierHash& moduleHash, Identifier pixid, const EventContext& ctx) const {
161  if (hasBSError(moduleHash, ctx)) { return true; }
162 
163  int maxHash = m_pixelID->wafer_hash_max();
164  Identifier moduleID = m_pixelID->wafer_id(pixid);
165  int chFE = m_pixelReadout->getFE(pixid, moduleID);
166  if (m_pixelReadout->getModuleType(moduleID)==InDetDD::PixelModuleType::IBL_3D) { chFE=0; }
167 
168  int indexFE = (1+chFE)*maxHash+static_cast<int>(moduleHash); // (FE_channel+1)*2048 + moduleHash
169  uint64_t word = getBSErrorWord(moduleHash,indexFE,ctx);
170  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::Preamble)) { return true; }
171  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::TimeOut)) { return true; }
172  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::LVL1ID)) { return true; }
173  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::BCID)) { return true; }
174  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::Trailer)) { return true; }
175  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCLVL1IDEoECheck)) { return true; }
176  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCBCIDEoECheck)) { return true; }
177  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCLVL1IDCheck)) { return true; }
178  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCEoEOverflow)) { return true; }
179  if (PixelByteStreamErrors::hasError(word,PixelByteStreamErrors::MCCHitOverflow)) { return true; }
180  return false;
181 }
182 
183 bool PixelConditionsSummaryTool::isActive(const Identifier& /*elementId*/, const InDetConditions::Hierarchy /*h*/, const EventContext& /*ctx*/) const {
184  return true;
185 }
186 
187 bool PixelConditionsSummaryTool::isActive(const IdentifierHash& moduleHash, const EventContext& ctx) const {
188 
189  // The index array is defined in PixelRawDataProviderTool::SizeOfIDCInDetBSErrContainer()
190  // Here, 52736 is a separator beween error flags and isActive flags.
191  bool useByteStream = (m_useByteStreamFEI4 || m_useByteStreamFEI3 || m_useByteStreamRD53);
192  if (useByteStream && getBSErrorWord(moduleHash,moduleHash+52736,ctx)!=1) { return false; }
193 
195  bool isDCSActive = false;
196  for (int istate : m_activeState) {
197  if (istate==dcsstate_data->getModuleStatus(moduleHash)) { isDCSActive=true; }
198  }
199  if (!isDCSActive) { return false; }
200 
201  if (!m_condTDAQKey.empty() && SG::ReadCondHandle<PixelTDAQData>(m_condTDAQKey,ctx)->getModuleStatus(moduleHash)) { return false; }
202 
203  if (SG::ReadCondHandle<PixelDeadMapCondData>(m_condDeadMapKey,ctx)->getModuleStatus(moduleHash)) { return false; }
204 
205  return true;
206 }
207 
208 bool PixelConditionsSummaryTool::isActive(const IdentifierHash& moduleHash, const Identifier& elementId, const EventContext& ctx) const {
209 
210  // The index array is defined in PixelRawDataProviderTool::SizeOfIDCInDetBSErrContainer()
211  // Here, 52736 is a separator beween error flags and isActive flags.
212  bool useByteStream = (m_useByteStreamFEI4 || m_useByteStreamFEI3 || m_useByteStreamRD53);
213  if (useByteStream && getBSErrorWord(moduleHash,moduleHash+52736,ctx)!=1) { return false; }
214 
216  bool isDCSActive = false;
217  for (int istate : m_activeState) {
218  if (istate==dcsstate_data->getModuleStatus(moduleHash)) { isDCSActive=true; }
219  }
220  if (!isDCSActive) { return false; }
221 
222  if (!m_condTDAQKey.empty() && SG::ReadCondHandle<PixelTDAQData>(m_condTDAQKey,ctx)->getModuleStatus(moduleHash)) { return false; }
223 
224  if (SG::ReadCondHandle<PixelDeadMapCondData>(m_condDeadMapKey,ctx)->getModuleStatus(moduleHash)) { return false; }
225 
226  return checkChipStatus(moduleHash, elementId, ctx);
227 }
228 
229 double PixelConditionsSummaryTool::activeFraction(const IdentifierHash & /*moduleHash*/, const Identifier & /*idStart*/, const Identifier & /*idEnd*/, const EventContext& /*ctx*/) const {
230  return 1.0;
231 }
232 
233 bool PixelConditionsSummaryTool::isGood(const Identifier& elementId, const InDetConditions::Hierarchy h, const EventContext& ctx) const {
234  Identifier moduleID = m_pixelID->wafer_id(elementId);
235  IdentifierHash moduleHash = m_pixelID->wafer_hash(moduleID);
236 
237  if (hasBSError(moduleHash, ctx)) { return false; }
238 
240  bool isDCSActive = false;
241  for (int istate : m_activeState) {
242  if (istate==dcsstate_data->getModuleStatus(moduleHash)) { isDCSActive=true; }
243  }
244  if (!isDCSActive) { return false; }
245 
247  bool isDCSGood = false;
248  for (int activeStatus : m_activeStatus) {
249  if (activeStatus==dcsstatus_data->getModuleStatus(moduleHash)) { isDCSGood=true; }
250  }
251  if (!isDCSGood) { return false; }
252 
253  if (!m_condTDAQKey.empty() && SG::ReadCondHandle<PixelTDAQData>(m_condTDAQKey,ctx)->getModuleStatus(moduleHash)) { return false; }
254 
255  if (SG::ReadCondHandle<PixelDeadMapCondData>(m_condDeadMapKey, ctx)->getModuleStatus(moduleHash)) { return false; }
256 
258  if (!checkChipStatus(moduleHash, elementId,ctx)) { return false; }
259  if (hasBSError(moduleHash, elementId, ctx)) { return false; }
260  }
261 
262  return true;
263 }
264 
265 namespace {
266  inline void andStatus(const std::unordered_map<int, int> &status_map, unsigned int status_mask, std::vector<bool> &module_status) {
267  for (const std::pair<const int, int> &elm : status_map ) {
268  // set modules good if the module status passes the mask.
269  module_status.at(elm.first) = module_status.at(elm.first) && (status_mask & (1<<elm.second));
270  }
271  }
272  inline void andNotStatus(const std::unordered_map<int, int> &status_map, std::vector<bool> &module_status) {
273  for (const std::pair<const int, int> &elm : status_map ) {
274  // set modules good if the module status passes the mask.
275  module_status.at(elm.first) = module_status.at(elm.first) && (elm.second==0);
276  }
277  }
278  bool isBSError(uint64_t error, uint64_t max_error, uint64_t mask) {
279  return error<max_error && (error & mask);
280  }
281 }
282 
283 namespace {
286  if (!ret) {
287  throw std::runtime_error("Object is not of expected type InDet::PixelDetectorElementStatus");
288  }
289  return ret;
290  }
291 }
292 std::unique_ptr<InDet::SiDetectorElementStatus>
297  if (whandle) {
298  whandle->addDependency (input_element_status);
299  }
300  return std::make_unique<InDet::PixelDetectorElementStatus>(*castToDerived(input_element_status.cptr()));
301  }
302  else if (!m_pixelDetElStatusEventKey.empty()) {
304  return std::make_unique<InDet::PixelDetectorElementStatus>(*castToDerived(input_element_status.cptr()));
305  }
306  else {
308  if (not pixelDetEleHandle.isValid() ) {
309  std::stringstream msg;
310  msg << m_pixelDetEleCollKey.fullKey() << " is not available.";
311  throw std::runtime_error(msg.str());
312  }
313  if (whandle) {
314  whandle->addDependency (pixelDetEleHandle);
315  }
316  const InDetDD::SiDetectorElementCollection* elements(*pixelDetEleHandle);
317  return std::make_unique<InDet::PixelDetectorElementStatus>(*elements);
318  }
319 }
320 
321 std::unique_ptr<InDet::SiDetectorElementStatus>
324  std::unique_ptr<InDet::SiDetectorElementStatus> element_status( createDetectorElementStatus(ctx, whandle));
325  std::vector<bool> &status=element_status->getElementStatus();
326  status.resize(m_pixelID->wafer_hash_max(),
327  ((1<<0) & m_activeStateMask) // default value of PixelDCSStateData is 0
328  );
329  std::vector<InDet::ChipFlags_t> &chip_status=element_status->getElementChipStatus();
330  chip_status.resize(status.size(),0);
331 
332  // module state
333  {
335  andStatus(dcs_state_handle->moduleStatusMap(), m_activeStateMask, status);
336  if (whandle) {
337  whandle->addDependency (dcs_state_handle);
338  }
339  }
340  const bool active_only = m_activeOnly;
341  if (!active_only) {
343  andStatus(dcs_status_handle->moduleStatusMap(), m_activeStatusMask, status);
344  if (whandle) {
345  whandle->addDependency (dcs_status_handle);
346  }
347  }
348  if (!m_condTDAQKey.empty()) {
350  andNotStatus(tdaq_handle->moduleStatusMap(), status);
351  if (whandle) {
352  whandle->addDependency (tdaq_handle);
353  }
354  }
355  {
357  andNotStatus(dead_map_handle->moduleStatusMap(), status);
358  if (whandle) {
359  whandle->addDependency (dead_map_handle);
360  }
361 
362  const PixelDeadMapCondData *dead_map = dead_map_handle.cptr();
363  unsigned int element_i=0;
364  for (const InDetDD::SiDetectorElement *element : element_status->getDetectorElements()) {
365  if (status[element_i]) {
366  const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
367  InDetDD::PixelReadoutTechnology readout_technology = p_design->getReadoutTechnology();
368  unsigned int number_of_chips = readout_technology == InDetDD::PixelReadoutTechnology::FEI3 ? 2*p_design->numberOfCircuits() : p_design->numberOfCircuits();
369  InDet::ChipFlags_t chip_mask = (1ul<<number_of_chips)-1ul;
370  assert( chip_mask != 0 );
371  std::bitset<16> dead_chip_mask(dead_map->getChipStatus(element_i));
372  chip_status[element_i] = chip_mask & (~static_cast<InDet::ChipFlags_t>(dead_chip_mask.to_ulong()));
373  }
374  ++element_i;
375  }
376  }
377 
378 
379  static_assert( static_cast<unsigned int>(InDetDD::PixelReadoutTechnology::FEI4) < 32u) ;
380  static_assert( static_cast<unsigned int>(InDetDD::PixelReadoutTechnology::FEI3) < 32u) ;
381  static_assert( static_cast<unsigned int>(InDetDD::PixelReadoutTechnology::RD53) < 32u) ;
385  if (readout_technology_mask) {
386  if (whandle) {
387  ATH_MSG_ERROR("PixelConditionsSummaryTool not configured for use with conditions objects");
389  }
390  std::scoped_lock<std::mutex> lock{*m_cacheMutex.get(ctx)};
391  const IDCInDetBSErrContainer_Cache *idcCachePtr = nullptr;
392  idcCachePtr = getCacheEntry(ctx)->IDCCache;
393  if (idcCachePtr==nullptr) {
394  ATH_MSG_ERROR("PixelConditionsSummaryTool No cache! " );
395  }
396  else {
397 
410 
421 
422  // The index array is defined in PixelRawDataProviderTool::SizeOfIDCInDetBSErrContainer()
423  // Here, 52736 is a separator beween error flags and isActive flags.
424  unsigned int element_offset_i = (active_only ? 52736 : 0);
425 
426  unsigned int element_i=0;
427  unsigned int maxHash = m_pixelID->wafer_hash_max();
428  for (const InDetDD::SiDetectorElement *element : element_status->getDetectorElements()) {
429  const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
430  InDetDD::PixelReadoutTechnology readout_technology = p_design->getReadoutTechnology();
431  unsigned int readout_technology_flags = readout_technology_mask & Pixel::makeReadoutTechnologyBit(readout_technology);
432 
433  // set to false if has one of the considered errors and the readout technology is considered.
434  status.at(element_i) = status.at(element_i) && not ( readout_technology_flags
435  && ( !active_only
436  ? isBSError(static_cast<uint64_t>(idcCachePtr->retrieve(element_i)), m_missingErrorInfo, error_mask)
437  : idcCachePtr->retrieve(element_i+element_offset_i)!=1 ));
438 
439  // compute the status for the individual front-ends
440  if (status[element_i]) {
441  unsigned int number_of_chips = readout_technology == InDetDD::PixelReadoutTechnology::FEI3 ? 2*p_design->numberOfCircuits() : p_design->numberOfCircuits();
442  InDet::ChipFlags_t chip_mask = status[element_i] ? (1ul<<number_of_chips)-1ul : 0;
443  assert( chip_mask != 0 );
444  InDet::ChipFlags_t bs_status_flags = active_only ? chip_mask : 0;
445  if (!active_only) {
446  for (unsigned int chip_i =0; chip_i < number_of_chips; ++chip_i) {
447  // get bytestream error for chip
448  unsigned int indexFE = (1+chip_i)*maxHash + element_i; // (FE_channel+1)*2048 + moduleHash
449  InDet::ChipFlags_t chip_flag =not ( readout_technology_flags
450  && (isBSError(static_cast<uint64_t>(idcCachePtr->retrieve(indexFE)), m_missingErrorInfo, chip_error_mask)));
451  bs_status_flags |= (chip_flag << chip_i);
452  }
453  }
454  chip_status[element_i] &= (bs_status_flags & chip_mask);
455  }
456  else {
457  chip_status[element_i] = 0;
458  }
459  ++element_i;
460  }
461  }
462  }
463  return element_status;
464 }
465 
466 bool PixelConditionsSummaryTool::isGood(const IdentifierHash& moduleHash, const EventContext& ctx) const {
467 
468  if (hasBSError(moduleHash, ctx)) { return false; }
469 
471  bool isDCSActive = false;
472  for (int istate : m_activeState) {
473  if (istate==dcsstate_data->getModuleStatus(moduleHash)) { isDCSActive=true; }
474  }
475  if (!isDCSActive) { return false; }
476 
478  bool isDCSGood = false;
479  for (int activeStatus : m_activeStatus) {
480  if (activeStatus==dcsstatus_data->getModuleStatus(moduleHash)) { isDCSGood=true; }
481  }
482  if (!isDCSGood) { return false; }
483 
484  if (!m_condTDAQKey.empty() && SG::ReadCondHandle<PixelTDAQData>(m_condTDAQKey,ctx)->getModuleStatus(moduleHash)) { return false; }
485 
486  if (SG::ReadCondHandle<PixelDeadMapCondData>(m_condDeadMapKey, ctx)->getModuleStatus(moduleHash)) { return false; }
487 
488  return true;
489 }
490 
491 bool PixelConditionsSummaryTool::isGood(const IdentifierHash & moduleHash, const Identifier &elementId, const EventContext& ctx) const {
492 
493  if (hasBSError(moduleHash, ctx)) { return false; }
494 
496  bool isDCSActive = false;
497  for (int istate : m_activeState) {
498  if (istate==dcsstate_data->getModuleStatus(moduleHash)) { isDCSActive=true; }
499  }
500  if (!isDCSActive) { return false; }
501 
503  bool isDCSGood = false;
504  for (int activeStatus : m_activeStatus) {
505  if (activeStatus==dcsstatus_data->getModuleStatus(moduleHash)) { isDCSGood=true; }
506  }
507  if (!isDCSGood) { return false; }
508 
509  if (!m_condTDAQKey.empty() && SG::ReadCondHandle<PixelTDAQData>(m_condTDAQKey,ctx)->getModuleStatus(moduleHash)) { return false; }
510 
511  if (SG::ReadCondHandle<PixelDeadMapCondData>(m_condDeadMapKey, ctx)->getModuleStatus(moduleHash)) { return false; }
512 
513  if (!checkChipStatus(moduleHash, elementId, ctx)) { return false; }
514 
515  if (hasBSError(moduleHash, elementId, ctx)) { return false; }
516 
517  return true;
518 }
519 
520 double PixelConditionsSummaryTool::goodFraction(const IdentifierHash & moduleHash, const Identifier & idStart, const Identifier & idEnd, const EventContext& ctx) const {
521 
522  if (!isGood(moduleHash, ctx)) { return 0.0; }
523 
524  Identifier moduleID = m_pixelID->wafer_id(moduleHash);
525 
526  int phiStart = m_pixelID->phi_index(idStart);
527  int etaStart = m_pixelID->eta_index(idStart);
528 
529  int phiEnd = m_pixelID->phi_index(idEnd);
530  int etaEnd = m_pixelID->eta_index(idEnd);
531 
532  double nTotal = (std::abs(phiStart-phiEnd)+1.0)*(std::abs(etaStart-etaEnd)+1.0);
533 
534  double nGood = 0.0;
535  for (int i=std::min(phiStart,phiEnd); i<=std::max(phiStart,phiEnd); i++) {
536  for (int j=std::min(etaStart,etaEnd); j<=std::max(etaStart,etaEnd); j++) {
537  if (checkChipStatus(moduleHash, m_pixelID->pixel_id(moduleID,i,j), ctx)) {
538  if (!hasBSError(moduleHash, m_pixelID->pixel_id(moduleID,i,j), ctx)) { nGood++; }
539  }
540  }
541  }
542  return nGood/nTotal;
543 }
544 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
PixelFEUtils.h
python.StoreID.UNKNOWN
int UNKNOWN
Definition: StoreID.py:16
PixelConditionsSummaryTool::hasBSError
virtual bool hasBSError(const IdentifierHash &moduleHash, const EventContext &ctx) const override final
Definition: PixelConditionsSummaryTool.cxx:143
PixelDCSStatusData::moduleStatusMap
const IntConditions & moduleStatusMap() const
Definition: PixelDCSStatusData.h:25
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
PixelID::phi_index
int phi_index(const Identifier &id) const
Definition: PixelID.h:658
InDetDD::PixelReadoutTechnology
PixelReadoutTechnology
Definition: PixelReadoutDefinitions.h:28
InDet::SiDetectorElementStatus::getElementStatus
const std::vector< bool > & getElementStatus() const
Definition: SiDetectorElementStatus.h:116
max
#define max(a, b)
Definition: cfImp.cxx:41
InDetDD::SiDetectorElementCollection
Definition: SiDetectorElementCollection.h:30
python.Constants.FATAL
int FATAL
Definition: Control/AthenaCommon/python/Constants.py:19
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
InDetDD::PixelModuleDesign
Definition: PixelModuleDesign.h:48
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
PixelConditionsSummaryTool::checkChipStatus
bool checkChipStatus(IdentifierHash moduleHash, Identifier pixid, const EventContext &ctx) const
Definition: PixelConditionsSummaryTool.h:172
PixelConditionsSummaryTool::m_activeStatusMask
unsigned int m_activeStatusMask
mask in which each status is represented by a bit and for status values which are cnsidered active th...
Definition: PixelConditionsSummaryTool.h:86
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
index
Definition: index.py:1
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
PixelConditionsSummaryTool::IDCCacheEntry
Definition: PixelConditionsSummaryTool.h:130
IDCInDetBSErrContainer
IDC like storage for BS errors, TODO, customise implementation further so that we store int rather th...
Definition: IDCInDetBSErrContainer.h:19
python.Constants.ERROR
int ERROR
Definition: Control/AthenaCommon/python/Constants.py:18
Pixel::makeReadoutTechnologyBit
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: PixelFEUtils.h:60
PixelConditionsSummaryTool::m_isActiveStates
std::vector< std::string > m_isActiveStates
Definition: PixelConditionsSummaryTool.h:82
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:205
PixelConditionsSummaryTool::~PixelConditionsSummaryTool
virtual ~PixelConditionsSummaryTool()
InDetConditions::PIXEL_CHIP
@ PIXEL_CHIP
Definition: InDetHierarchy.h:15
PixelByteStreamErrors::MCCBCIDEoECheck
@ MCCBCIDEoECheck
Definition: PixelByteStreamErrors.h:15
InDetDD::PixelReadoutTechnology::FEI3
@ FEI3
InDetConditions::Hierarchy
Hierarchy
Definition: InDetHierarchy.h:14
PixelConditionsSummaryTool::isGood
virtual bool isGood(const Identifier &elementId, const InDetConditions::Hierarchy h, const EventContext &ctx) const override final
Definition: PixelConditionsSummaryTool.cxx:233
PixelByteStreamErrors::makeError
constexpr IDCInDetBSErrContainer::ErrorCode makeError(PixelErrorsEnum errType)
helper to be used in clients to fetch error information
Definition: PixelByteStreamErrors.h:21
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
PixelConditionsSummaryTool::m_condDCSStateKey
SG::ReadCondHandleKey< PixelDCSStateData > m_condDCSStateKey
Definition: PixelConditionsSummaryTool.h:98
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:83
PixelID::wafer_id
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
Definition: PixelID.h:364
PixelByteStreamErrors::TimeOut
@ TimeOut
Definition: PixelByteStreamErrors.h:13
python.utils.AtlRunQueryLookup.mask
string mask
Definition: AtlRunQueryLookup.py:460
IdentifiableValueCache::retrieve
T retrieve(size_t i)
Retrieve the Value stored in that hash.
Definition: IdentifiableValueCache.h:49
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
PixelConditionsSummaryTool.h
PixelConditionsSummaryTool::m_condDCSStatusKey
SG::ReadCondHandleKey< PixelDCSStatusData > m_condDCSStatusKey
Definition: PixelConditionsSummaryTool.h:101
InDetDD::PixelReadoutTechnology::RD53
@ RD53
PixelByteStreamErrors::BCID
@ BCID
Definition: PixelByteStreamErrors.h:13
PixelDetectorElementStatus.h
PixelConditionsSummaryTool::isActive
virtual bool isActive(const Identifier &elementId, const InDetConditions::Hierarchy h, const EventContext &ctx) const override final
Definition: PixelConditionsSummaryTool.cxx:183
InDet::PixelDetectorElementStatus
Event data to hold the status information for Pixel modules.
Definition: PixelDetectorElementStatus.h:14
PixelConditionsSummaryTool::m_pixelDetElStatusEventKey
SG::ReadHandleKey< InDet::SiDetectorElementStatus > m_pixelDetElStatusEventKey
Definition: PixelConditionsSummaryTool.h:119
PixelID::wafer_hash
IdentifierHash wafer_hash(Identifier wafer_id) const
wafer hash from id
Definition: PixelID.h:387
PixelConditionsSummaryTool::m_BSErrContReadKey
SG::ReadHandleKey< IDCInDetBSErrContainer > m_BSErrContReadKey
Definition: PixelConditionsSummaryTool.h:113
PixelConditionsSummaryTool::m_activeStateMask
unsigned int m_activeStateMask
mask in which each state is represented by a bit and for states which are cnsidered active the corres...
Definition: PixelConditionsSummaryTool.h:85
PixelConditionsSummaryTool::m_useByteStreamFEI4
Gaudi::Property< bool > m_useByteStreamFEI4
Definition: PixelConditionsSummaryTool.h:89
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
UNDEFINED
@ UNDEFINED
Definition: sTGCenumeration.h:18
lumiFormat.i
int i
Definition: lumiFormat.py:92
PixelConditionsSummaryTool::initialize
virtual StatusCode initialize() override
Definition: PixelConditionsSummaryTool.cxx:25
InDet::SiDetectorElementStatus
Definition: SiDetectorElementStatus.h:62
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
ret
T ret(T t)
Definition: rootspy.cxx:260
PixelByteStreamErrors::Preamble
@ Preamble
Definition: PixelByteStreamErrors.h:13
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
PixelConditionsSummaryTool::IDCCacheEntry::reset
void reset(EventContext::ContextEvt_t evtId, const IDCInDetBSErrContainer_Cache *cache)
Definition: PixelConditionsSummaryTool.h:134
IDetectorElementStatusTool::getInvalidRange
static EventIDRange getInvalidRange()
Definition: IDetectorElementStatusTool.h:33
InDetDD::PixelModuleDesign::numberOfCircuits
int numberOfCircuits() const
Total number of circuits:
Definition: PixelModuleDesign.h:297
PixelConditionsSummaryTool::PixelConditionsSummaryTool
PixelConditionsSummaryTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: PixelConditionsSummaryTool.cxx:12
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
PixelByteStreamErrors::MCCLVL1IDEoECheck
@ MCCLVL1IDEoECheck
Definition: PixelByteStreamErrors.h:15
PixelTDAQData::moduleStatusMap
const IntConditions & moduleStatusMap() const
Definition: PixelTDAQData.h:25
test_pyathena.parent
parent
Definition: test_pyathena.py:15
PixelID::eta_index
int eta_index(const Identifier &id) const
Definition: PixelID.h:664
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
PixelDeadMapCondData::getChipStatus
int getChipStatus(const int chanNum) const
Definition: PixelDeadMapCondData.cxx:31
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
PixelConditionsSummaryTool::m_pixelID
const PixelID * m_pixelID
Definition: PixelConditionsSummaryTool.h:79
python.Constants.WARNING
int WARNING
Definition: Control/AthenaCommon/python/Constants.py:17
PixelConditionsSummaryTool::getBSErrorWord
virtual uint64_t getBSErrorWord(const IdentifierHash &moduleHash, const EventContext &ctx) const override final
Definition: PixelConditionsSummaryTool.cxx:109
python.compareNtuple.nGood
nGood
Definition: compareNtuple.py:55
PixelByteStreamErrors::MaskedROB
@ MaskedROB
Definition: PixelByteStreamErrors.h:14
PixelConditionsSummaryTool::m_activeState
std::vector< int > m_activeState
Definition: PixelConditionsSummaryTool.h:83
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
min
#define min(a, b)
Definition: cfImp.cxx:40
PixelConditionsSummaryTool::m_pixelReadout
ServiceHandle< InDetDD::IPixelReadoutManager > m_pixelReadout
Definition: PixelConditionsSummaryTool.h:110
PixelByteStreamErrors::MCCHitOverflow
@ MCCHitOverflow
Definition: PixelByteStreamErrors.h:15
PixelByteStreamErrors::MCCLVL1IDCheck
@ MCCLVL1IDCheck
Definition: PixelByteStreamErrors.h:15
PixelConditionsSummaryTool::m_condTDAQKey
SG::ReadCondHandleKey< PixelTDAQData > m_condTDAQKey
Definition: PixelConditionsSummaryTool.h:104
PixelConditionsSummaryTool::activeFraction
virtual double activeFraction(const IdentifierHash &moduleHash, const Identifier &idStart, const Identifier &idEnd, const EventContext &ctx) const override final
Definition: PixelConditionsSummaryTool.cxx:229
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
PixelByteStreamErrors::MCCEoEOverflow
@ MCCEoEOverflow
Definition: PixelByteStreamErrors.h:15
PixelDCSStateData::getModuleStatus
int getModuleStatus(const int chanNum) const
Definition: PixelDCSStateData.cxx:11
PixelConditionsSummaryTool::m_pixelDetElStatusCondKey
SG::ReadCondHandleKey< InDet::SiDetectorElementStatus > m_pixelDetElStatusCondKey
Definition: PixelConditionsSummaryTool.h:121
PixelDCSStateData::moduleStatusMap
const IntConditions & moduleStatusMap() const
Definition: PixelDCSStateData.h:28
InDet::SiDetectorElementStatus::getDetectorElements
const std::vector< InDetDD::SiDetectorElement * > & getDetectorElements() const
Definition: SiDetectorElementStatus.h:94
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
PixelID::wafer_hash_max
size_type wafer_hash_max(void) const
Definition: PixelID.cxx:912
InDetDD::PixelReadoutTechnology::FEI4
@ FEI4
InDetDD::PixelModuleDesign::getReadoutTechnology
PixelReadoutTechnology getReadoutTechnology() const
Definition: PixelModuleDesign.h:368
SiDetectorElement.h
PixelConditionsSummaryTool::goodFraction
virtual double goodFraction(const IdentifierHash &moduleHash, const Identifier &idStart, const Identifier &idEnd, const EventContext &ctx) const override final
Definition: PixelConditionsSummaryTool.cxx:520
PixelDCSStatusData::getModuleStatus
int getModuleStatus(const int chanNum) const
Definition: PixelDCSStatusData.cxx:11
h
PixelConditionsSummaryTool::getContainer
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...
Definition: PixelConditionsSummaryTool.cxx:87
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
PixelModuleDesign.h
InDet::SiDetectorElementStatus::getElementChipStatus
const std::vector< ChipFlags_t > & getElementChipStatus() const
Definition: SiDetectorElementStatus.h:118
PixelConditionsSummaryTool::getDetectorElementStatus
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
Definition: PixelConditionsSummaryTool.cxx:322
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
PixelID::pixel_id
Identifier pixel_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int phi_index, int eta_index) const
For an individual pixel.
Definition: PixelID.h:432
PixelConditionsSummaryTool::m_condDeadMapKey
SG::ReadCondHandleKey< PixelDeadMapCondData > m_condDeadMapKey
Definition: PixelConditionsSummaryTool.h:107
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
PixelConditionsSummaryTool::createDetectorElementStatus
std::unique_ptr< InDet::SiDetectorElementStatus > createDetectorElementStatus(const EventContext &ctx, SG::WriteCondHandle< InDet::SiDetectorElementStatus > *whandle) const
Create a new detector element status element container.
Definition: PixelConditionsSummaryTool.cxx:293
PixelConditionsSummaryTool::m_useByteStreamFEI3
Gaudi::Property< bool > m_useByteStreamFEI3
Definition: PixelConditionsSummaryTool.h:92
InDet::ChipFlags_t
unsigned short ChipFlags_t
Definition: SiDetectorElementStatus.h:60
PixelDeadMapCondData
Definition: PixelDeadMapCondData.h:11
merge.status
status
Definition: merge.py:17
PixelByteStreamErrors.h
PixelConditionsSummaryTool::IDCCacheEntry::needsUpdate
bool needsUpdate(const EventContext &ctx) const
Definition: PixelConditionsSummaryTool.h:139
PixelConditionsSummaryTool::m_pixelDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
Definition: PixelConditionsSummaryTool.h:116
PixelConditionsSummaryTool::m_useByteStreamRD53
Gaudi::Property< bool > m_useByteStreamRD53
Definition: PixelConditionsSummaryTool.h:95
PixelConditionsSummaryTool::m_missingErrorInfo
const uint64_t m_missingErrorInfo
Definition: PixelConditionsSummaryTool.h:126
AthAlgTool
Definition: AthAlgTool.h:26
IdentifierHash
Definition: IdentifierHash.h:38
InDetDD::SiDetectorElement::design
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
PixelConditionsSummaryTool::m_activeOnly
Gaudi::Property< bool > m_activeOnly
Definition: PixelConditionsSummaryTool.h:124
error
Definition: IImpactPoint3dEstimator.h:70
PixelConditionsSummaryTool::getCacheEntry
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...
Definition: PixelConditionsSummaryTool.cxx:94
InDetDD::PixelModuleType::IBL_3D
@ IBL_3D
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
IdentifiableValueCache
This class is to provide an event wide MT container for concurrent storing of basic types,...
Definition: IdentifiableValueCache.h:19
InDetDD::SiDetectorElementCollection::getDetectorElement
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Definition: SiDetectorElementCollection.cxx:15
PixelByteStreamErrors::TruncatedROB
@ TruncatedROB
Definition: PixelByteStreamErrors.h:14
PixelByteStreamErrors::Trailer
@ Trailer
Definition: PixelByteStreamErrors.h:13
PixelConditionsSummaryTool::IDCCacheEntry::IDCCache
const IDCInDetBSErrContainer_Cache * IDCCache
Definition: PixelConditionsSummaryTool.h:132
PixelConditionsSummaryTool::IDCCacheEntry::eventId
EventContext::ContextEvt_t eventId
Definition: PixelConditionsSummaryTool.h:131
PixelConditionsSummaryTool::m_activeStatus
std::vector< int > m_activeStatus
Definition: PixelConditionsSummaryTool.h:84
PixelConditionsSummaryTool::m_isActiveStatus
std::vector< std::string > m_isActiveStatus
Definition: PixelConditionsSummaryTool.h:81
SG::WriteCondHandle::addDependency
void addDependency(const EventIDRange &range)
Definition: WriteCondHandle.h:275
PixelDeadMapCondData::moduleStatusMap
const IntConditions & moduleStatusMap() const
Definition: PixelDeadMapCondData.h:19
SG::ReadCondHandle::cptr
const_pointer_type cptr()
Definition: ReadCondHandle.h:67
PixelByteStreamErrors::LVL1ID
@ LVL1ID
Definition: PixelByteStreamErrors.h:13