ATLAS Offline Software
SCT_MonitorConditionsTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
19 
21 
22 #include "InDetIdentifier/SCT_ID.h"
23 
25 
26 #include <iterator>
27 #include <istream>
28 
29 using std::string;
30 
31 namespace {
32  bool doesNotHaveNumbers(const std::string& numberString) {
33  return (numberString.empty() or numberString.find_first_of("0123456789") == std::string::npos);
34  }
35 }
36 
38 
40 
41 SCT_MonitorConditionsTool::SCT_MonitorConditionsTool(const std::string& type, const std::string& name, const IInterface* parent):
42  base_class(type, name, parent)
43 {
44 }
45 
47 
50  if (detStore()->retrieve(m_pHelper,"SCT_ID").isFailure()) {
51  ATH_MSG_FATAL("SCT helper failed to retrieve");
52  return StatusCode::FAILURE;
53  }
54 
55  // Read Cond Handle Key
57 
58  return StatusCode::SUCCESS;
59 }
60 
62 
65  return StatusCode::SUCCESS;
66 }
67 
69 
70 bool
74 }
75 
77 
78 bool
79 SCT_MonitorConditionsTool::isGood(const Identifier& elementId, const EventContext& ctx, InDetConditions::Hierarchy h) const {
80  const Identifier waferId{m_pHelper->wafer_id(elementId)};
81  const Identifier moduleId{m_pHelper->module_id(waferId)};
82  const IdentifierHash waferHash{m_pHelper->wafer_hash(waferId)};
83  const IdentifierHash moduleHash{m_pHelper->wafer_hash(moduleId)};
84  const int strip{m_pHelper->strip(elementId)};
85 
86  const SCT_MonitorCondData* condData{getCondData(ctx)};
87  if (condData) {
88  switch (h) {
90  return not (condData->nBadStripsForModule(moduleHash)>=m_nhits_noisymodule);
92  return not (condData->nBadStripsForWafer(waferHash)>=m_nhits_noisywafer);
94  return not (condData->nBadStripsForChip(waferHash, strip)>=m_nhits_noisychip);
96  return not condData->isBadStrip(waferHash, strip);
97  }
98  default:
99  return true;
100  }//end of switch statement
101  }
102 
103  return true;
104 }
105 
107 
108 bool
110  const EventContext& ctx{Gaudi::Hive::currentContext()};
111 
112  return isGood(elementId, ctx, h);
113 }
114 
116 
117 bool
118 SCT_MonitorConditionsTool::isGood(const IdentifierHash& hashId, const EventContext& ctx) const {
119  Identifier elementId{m_pHelper->wafer_id(hashId)};
120  return isGood(elementId, ctx, InDetConditions::SCT_SIDE);
121 }
122 
124 
125 bool
127  const EventContext& ctx{Gaudi::Hive::currentContext()};
128 
129  return isGood(hashId, ctx);
130 }
131 
132 
136  if (not condDataHandle.isValid()) {
137  ATH_MSG_ERROR("Invalid cond data handle " << m_condKey.key() );
138  return;
139  }
140  const SCT_MonitorCondData* condData{condDataHandle.cptr() };
141  if (whandle) {
142  whandle->addDependency (condDataHandle);
143  }
144  if (condData) {
145  std::vector<bool> &status = element_status.getElementStatus();
146  if (status.empty()) {
147  status.resize(m_pHelper->wafer_hash_max(),true);
148  }
149  for (unsigned int hash=0; hash<status.size(); ++hash) {
150  status.at(hash) = status.at(hash) && not (condData->nBadStripsForWafer(hash)>=m_nhits_noisywafer);
151  }
152 
153  std::vector<InDet::ChipFlags_t> &chip_status = element_status.getElementChipStatus();
154  if (chip_status.empty()) {
155  constexpr InDet::ChipFlags_t all_chips_set = static_cast<InDet::ChipFlags_t>((1ul<<(SCT::N_CHIPS_PER_SIDE*SCT::N_SIDES)) - 1ul);
157  chip_status.resize(m_pHelper->wafer_hash_max(),all_chips_set);
158  }
159 
160  std::vector<std::vector<unsigned short> > &bad_strips = element_status.getBadCells();
161  if (bad_strips.empty()) {
162  bad_strips.resize(status.size());
163  }
164 
165  std::vector<std::pair<unsigned int, unsigned int> > tmp_bad_strips;
166  for (unsigned int module_hash=0; module_hash<status.size(); ++module_hash) {
167  IdentifierHash moduleHash(module_hash);
168 
169  std::vector<unsigned short> &bad_module_strips_out = bad_strips.at(module_hash);
170  std::array<unsigned int, SCT::N_CHIPS_PER_SIDE> bad_strip_counts{};
171 
172  const std::array<std::bitset<SCT_ConditionsData::STRIPS_PER_CHIP>,
174  &bad_module_strips_in = condData->badStripsForModule(moduleHash);
175 
176  unsigned int strip_i=0;
177  tmp_bad_strips.clear();
178  tmp_bad_strips.reserve(bad_module_strips_in.size()*SCT_ConditionsData::STRIPS_PER_CHIP);
179 
180  for (const auto& chip_i : bad_module_strips_in) {
181  unsigned int geoemtrical_chip_id = SCT::getGeometricalChipID(strip_i);
182 
183  for (unsigned int strip_per_chip_i=0; strip_per_chip_i<chip_i.size(); ++strip_per_chip_i) {
184  if (chip_i.test(strip_per_chip_i)) {
185  tmp_bad_strips.emplace_back(geoemtrical_chip_id,strip_i);
186  ++bad_strip_counts.at(geoemtrical_chip_id);
187  }
188  ++strip_i;
189  }
190  }
191 
192  InDet::ChipFlags_t bad_chips=0;
193  for (unsigned int the_chip=0; the_chip< bad_strip_counts.size(); ++the_chip) {
194  bad_chips |= static_cast<InDet::ChipFlags_t >((bad_strip_counts[the_chip]>=m_nhits_noisychip) << the_chip);
195  }
196  chip_status[module_hash] &= ~bad_chips;
197 
198  for (const std::pair<unsigned int, unsigned int> &chip_and_strip : tmp_bad_strips) {
199  unsigned int strip_i=chip_and_strip.second;
200  std::vector<unsigned short>::const_iterator iter = std::lower_bound(bad_module_strips_out.begin(),bad_module_strips_out.end(),strip_i);
201  if (iter == bad_module_strips_out.end() || *iter != strip_i) {
202  bad_module_strips_out.insert( iter, strip_i);
203  }
204  }
205  }
206  }
207 }
208 
210 
211 void
212 SCT_MonitorConditionsTool::badStrips(std::set<Identifier>& strips, const EventContext& ctx) const {
213  // Set of bad strip Identifers for all modules
215  // Loop over modules (side-0 of wafers)
216  for (; waferItr != waferEnd; ++waferItr) {
217  if (m_pHelper->side(*waferItr) != 0) continue;
218  Identifier moduleId{m_pHelper->module_id(*waferItr)};
219  badStrips(moduleId, strips, ctx);
220  }
221 }
222 
223 void
224 SCT_MonitorConditionsTool::badStrips(std::set<Identifier>& strips) const {
225  const EventContext& ctx{Gaudi::Hive::currentContext()};
226  badStrips(strips, ctx);
227 }
228 
230 
231 void
232 SCT_MonitorConditionsTool::badStrips(const Identifier& moduleId, std::set<Identifier>& strips, const EventContext& ctx) const {
233  // Set of bad strip Identifers for a given module
234  // Get defect string and check it is sensible, i.e. non-empty and contains numbers
235  std::string defectStr{getList(moduleId, ctx)};
236  if (doesNotHaveNumbers(defectStr)) return;
237 
238  // Expand the string
239  std::set<int> defectList;
240  expandList(defectStr, defectList);
241 
242  // Convert strip number to Identifier and add to list
243  std::set<int>::const_iterator defectItr{defectList.begin()}, defectEnd{defectList.end()};
244  for (; defectItr!=defectEnd; ++defectItr) {
245  // Strips in the DB are numbered 0-767 (side 0) and 768-1535 (side 1).
246  // This is different from the usual online/offline numbering schemes
247  int side{(*defectItr) > SCT_ConditionsData::STRIPS_PER_WAFER-1 ? 1 : 0};
248  int stripNum{side==1 ? (*defectItr) - SCT_ConditionsData::STRIPS_PER_WAFER : (*defectItr)};
249 
250  Identifier stripId{m_pHelper->strip_id(m_pHelper->barrel_ec(moduleId), m_pHelper->layer_disk(moduleId),
251  m_pHelper->phi_module(moduleId), m_pHelper->eta_module(moduleId),
252  side, stripNum)};
253 
254  ATH_MSG_DEBUG("Bad Strip: Strip number in DB = " << *defectItr<< ", side/offline strip number = " << side << "/" << stripNum<< ", Identifier = " << stripId);
255 
256  strips.insert(stripId);
257  }
258 }
259 
260 void
261 SCT_MonitorConditionsTool::badStrips(const Identifier& moduleId, std::set<Identifier>& strips) const {
262  const EventContext& ctx{Gaudi::Hive::currentContext()};
263  return badStrips(moduleId, strips, ctx);
264 }
265 
267 
268 std::string
269 SCT_MonitorConditionsTool::badStripsAsString(const Identifier& moduleId, const EventContext& ctx) const {
270  return getList(moduleId, ctx);
271 }
272 
273 std::string
275  const EventContext& ctx{Gaudi::Hive::currentContext()};
276  return badStripsAsString(moduleId, ctx);
277 }
278 
280 // Local stuff
282 
283 std::string
284 SCT_MonitorConditionsTool::getList(const Identifier& moduleId, const EventContext& ctx) const {
285  string currentDefectList{""};
286  const SCT_MonitorCondData* condData{getCondData(ctx)};
287  if (condData) {
288  const IdentifierHash moduleHash{m_pHelper->wafer_hash(moduleId)};
289  condData->find(moduleHash, currentDefectList);
290  } else {
291  ATH_MSG_ERROR("In getList - no data");
292  }
293  return currentDefectList;
294 }
295 
297 
298 void
299 SCT_MonitorConditionsTool::expandRange(const std::string& rangeStr, std::set<int>& rangeList) {
300  // Expand a given defect range
301  // Find separator
302  std::string::size_type sepPos{rangeStr.find(s_separator)};
303  // Check if it's a range
304  if (sepPos != std::string::npos) {
305  // Extract min and max
306  std::string::size_type len1{sepPos++}, len2{rangeStr.size()-sepPos};
307  int min{std::stoi(rangeStr.substr(0,len1))};
308  int max{std::stoi(rangeStr.substr(sepPos,len2))};
309  // Add all strips in range to list
310  while (min != (max+1)) rangeList.insert(min++);
311  } else {
312  // Assume single number
313  rangeList.insert(std::stoi(rangeStr));
314  }
315 }
316 
318 
319 void
320 SCT_MonitorConditionsTool::expandList(const std::string& defectStr, std::set<int>& defectList) {
321  // Expand a given defect list
322 
323  // Empty list or one without numbers
324  if (doesNotHaveNumbers(defectStr)) return;
325 
326  std::istringstream is{defectStr};
327  std::istream_iterator<std::string> defectItr{is};
328  std::istream_iterator<std::string> defectEnd; //relies on default constructor to produce eof
329 
330  // Loop over (space-seperated) defects and add to list
331  for (; defectItr != defectEnd; ++defectItr) expandRange(*defectItr, defectList);
332 }
333 
335 
336 const SCT_MonitorCondData*
337 SCT_MonitorConditionsTool::getCondData(const EventContext& ctx) const {
339  return condData.retrieve();
340 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
SCT_MonitorConditionsTool::isGood
virtual bool isGood(const Identifier &elementId, InDetConditions::Hierarchy h=InDetConditions::DEFAULT) const override
Is the detector element good?
Definition: SCT_MonitorConditionsTool.cxx:109
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
SCT_MonitorConditionsTool::SCT_MonitorConditionsTool
SCT_MonitorConditionsTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: SCT_MonitorConditionsTool.cxx:41
InDet::SiDetectorElementStatus::getElementStatus
const std::vector< bool > & getElementStatus() const
Definition: SiDetectorElementStatus.h:116
SiliconTech::strip
@ strip
max
#define max(a, b)
Definition: cfImp.cxx:41
SCT_MonitorConditionsTool::finalize
virtual StatusCode finalize() override
Definition: SCT_MonitorConditionsTool.cxx:64
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
SCT_ConditionsData::CHIPS_PER_SIDE
@ CHIPS_PER_SIDE
Definition: SCT_ConditionsParameters.h:20
SCT_MonitorConditionsTool::m_condKey
SG::ReadCondHandleKey< SCT_MonitorCondData > m_condKey
Definition: SCT_MonitorConditionsTool.h:86
SCT_MonitorConditionsTool::badStripsAsString
virtual std::string badStripsAsString(const Identifier &moduleId) const override
String of bad strip numbers for a given module.
Definition: SCT_MonitorConditionsTool.cxx:274
SCT_MonitorConditionsTool::canReportAbout
virtual bool canReportAbout(InDetConditions::Hierarchy h) const override
Can the service report about the given component? (chip, module...)
Definition: SCT_MonitorConditionsTool.cxx:71
InDetConditions::SCT_CHIP
@ SCT_CHIP
Definition: InDetHierarchy.h:14
SCT_DetectorElementStatus.h
SCT_ChipUtils.h
SCT::N_SIDES
constexpr unsigned int N_SIDES
Definition: SCT_ChipUtils.h:16
SCT_ID::wafer_begin
const_id_iterator wafer_begin(void) const
Iterators over full set of ids. Wafer iterator is sorted.
Definition: SCT_ID.cxx:648
SCT_ConditionsData::STRIPS_PER_WAFER
@ STRIPS_PER_WAFER
Definition: SCT_ConditionsParameters.h:21
InDet::SiDetectorElementStatus::getBadCells
const std::vector< std::vector< unsigned short > > & getBadCells() const
Definition: SiDetectorElementStatus.h:120
SCT_ID::const_id_iterator
std::vector< Identifier >::const_iterator const_id_iterator
Definition: SCT_ID.h:73
InDetConditions::Hierarchy
Hierarchy
Definition: InDetHierarchy.h:14
SCT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: SCT_ID.h:728
SCT_ID::phi_module
int phi_module(const Identifier &id) const
Definition: SCT_ID.h:740
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
SCT_MonitorConditionsTool::s_separator
static const std::string s_separator
Definition: SCT_MonitorConditionsTool.h:79
SCT_ConditionsParameters.h
header file containing the number of elements and enumerated type of parameters which may be retrieve...
SCT_ID::module_id
Identifier module_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
Definition: SCT_ID.h:416
SCT_MonitorConditionsTool::badStrips
virtual void badStrips(std::set< Identifier > &strips) const override
List of bad strip Identifiers.
Definition: SCT_MonitorConditionsTool.cxx:224
SCT_ConditionsData::STRIPS_PER_CHIP
@ STRIPS_PER_CHIP
Definition: SCT_ConditionsParameters.h:21
ReadCondHandle.h
TRT::Hit::side
@ side
Definition: HitInfo.h:83
SCT_MonitorConditionsTool.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
InDetConditions::SCT_MODULE
@ SCT_MODULE
Definition: InDetHierarchy.h:14
InDet::SiDetectorElementStatus
Definition: SiDetectorElementStatus.h:62
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
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
test_pyathena.parent
parent
Definition: test_pyathena.py:15
SCT_MonitorConditionsTool::getCondData
const SCT_MonitorCondData * getCondData(const EventContext &ctx) const
Definition: SCT_MonitorConditionsTool.cxx:337
SCT_MonitorConditionsTool::m_nhits_noisywafer
UnsignedIntegerProperty m_nhits_noisywafer
Definition: SCT_MonitorConditionsTool.h:82
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SCT_ID::wafer_hash
IdentifierHash wafer_hash(const Identifier &wafer_id) const
wafer hash from id - optimized
Definition: SCT_ID.h:492
SCT_MonitorConditionsTool::expandRange
static void expandRange(const std::string &rangeStr, std::set< int > &rangeList)
Definition: SCT_MonitorConditionsTool.cxx:299
min
#define min(a, b)
Definition: cfImp.cxx:40
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
SCT_ID::wafer_hash_max
size_type wafer_hash_max(void) const
Definition: SCT_ID.cxx:639
SCT_MonitorConditionsTool::getList
std::string getList(const Identifier &imodule, const EventContext &ctx) const
Definition: SCT_MonitorConditionsTool.cxx:284
SCT_ID::layer_disk
int layer_disk(const Identifier &id) const
Definition: SCT_ID.h:734
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
SiDetectorElementCollection.h
SCT_MonitorConditionsTool::expandList
static void expandList(const std::string &defectStr, std::set< int > &defectList)
Definition: SCT_MonitorConditionsTool.cxx:320
h
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
SCT_ID::strip
int strip(const Identifier &id) const
Definition: SCT_ID.h:764
InDet::SiDetectorElementStatus::getElementChipStatus
const std::vector< ChipFlags_t > & getElementChipStatus() const
Definition: SiDetectorElementStatus.h:118
SCT_MonitorCondData
Class for data object used in SCT_MonitorCondAlg and SCT_MonitorConditionsTool.
Definition: SCT_MonitorCondData.h:29
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
SCT_ID::eta_module
int eta_module(const Identifier &id) const
Definition: SCT_ID.h:746
SCT_MonitorConditionsTool::m_nhits_noisychip
UnsignedIntegerProperty m_nhits_noisychip
Definition: SCT_MonitorConditionsTool.h:81
SCT_MonitorConditionsTool::m_nhits_noisymodule
UnsignedIntegerProperty m_nhits_noisymodule
Definition: SCT_MonitorConditionsTool.h:83
SCT::getGeometricalChipID
constexpr unsigned int getGeometricalChipID(unsigned int strip)
Get the geometrical chip ID for the given strip.
Definition: SCT_ChipUtils.h:71
InDet::ChipFlags_t
unsigned short ChipFlags_t
Definition: SiDetectorElementStatus.h:60
SCT_ID::side
int side(const Identifier &id) const
Definition: SCT_ID.h:752
SCT_ID::wafer_end
const_id_iterator wafer_end(void) const
Definition: SCT_ID.cxx:652
merge.status
status
Definition: merge.py:17
SCT_ID::wafer_id
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int side) const
For a single side of module.
Definition: SCT_ID.h:464
IdentifierHash
Definition: IdentifierHash.h:38
InDetConditions::SCT_STRIP
@ SCT_STRIP
Definition: InDetHierarchy.h:14
InDetConditions::SCT_SIDE
@ SCT_SIDE
Definition: InDetHierarchy.h:14
SCT_MonitorConditionsTool::m_pHelper
const SCT_ID * m_pHelper
Definition: SCT_MonitorConditionsTool.h:84
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
SCT_MonitorConditionsTool::initialize
virtual StatusCode initialize() override
Definition: SCT_MonitorConditionsTool.cxx:49
SCT::N_CHIPS_PER_SIDE
constexpr unsigned int N_CHIPS_PER_SIDE
Definition: SCT_ChipUtils.h:15
SG::WriteCondHandle::addDependency
void addDependency(const EventIDRange &range)
Definition: WriteCondHandle.h:275
SCT_MonitorConditionsTool::getDetectorElementStatus
virtual void getDetectorElementStatus(const EventContext &ctx, InDet::SiDetectorElementStatus &element_status, SG::WriteCondHandle< InDet::SiDetectorElementStatus > *whandle) const override
Definition: SCT_MonitorConditionsTool.cxx:133
SCT_ID::strip_id
Identifier strip_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int side, int strip) const
For an individual strip.
Definition: SCT_ID.h:535