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

Class for keeping track of errors caught by the monitoring. More...

#include <SCT_MonitorConditionsTool.h>

Inheritance diagram for SCT_MonitorConditionsTool:
Collaboration diagram for SCT_MonitorConditionsTool:

Public Member Functions

 SCT_MonitorConditionsTool (const std::string &type, const std::string &name, const IInterface *parent)
virtual ~SCT_MonitorConditionsTool ()=default
virtual StatusCode initialize () override
virtual StatusCode finalize () override
virtual bool canReportAbout (InDetConditions::Hierarchy h) const override
 Can the service report about the given component? (chip, module...)
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 &hashId) const override
 is it good?, using wafer hash
virtual bool isGood (const IdentifierHash &hashId, const EventContext &ctx) const override
virtual void getDetectorElementStatus (const EventContext &ctx, InDet::SiDetectorElementStatus &element_status, SG::WriteCondHandle< InDet::SiDetectorElementStatus > *whandle) const override
virtual void badStrips (std::set< Identifier > &strips) const override
 List of bad strip Identifiers.
virtual void badStrips (std::set< Identifier > &strips, const EventContext &ctx) const override
virtual void badStrips (const Identifier &moduleId, std::set< Identifier > &strips) const override
 List of bad strip Identifiers for a given module.
virtual void badStrips (const Identifier &moduleId, std::set< Identifier > &strips, const EventContext &ctx) const override
virtual std::string badStripsAsString (const Identifier &moduleId) const override
 String of bad strip numbers for a given module.
virtual std::string badStripsAsString (const Identifier &moduleId, const EventContext &ctx) const override

Private Member Functions

std::string getList (const Identifier &imodule, const EventContext &ctx) const
const SCT_MonitorCondDatagetCondData (const EventContext &ctx) const

Static Private Member Functions

static void expandRange (const std::string &rangeStr, std::set< int > &rangeList)
static void expandList (const std::string &defectStr, std::set< int > &defectList)

Private Attributes

UnsignedIntegerProperty m_nhits_noisychip {this, "Nnoisychip", 64}
UnsignedIntegerProperty m_nhits_noisywafer {this, "Nnoisywafer", 384}
UnsignedIntegerProperty m_nhits_noisymodule {this, "Nnoisycmodule", 768}
const SCT_IDm_pHelper {nullptr}
SG::ReadCondHandleKey< SCT_MonitorCondDatam_condKey {this, "CondKey", "SCT_MonitorCondData", "SCT noisy strips"}

Static Private Attributes

static const std::string s_separator {"-"}

Detailed Description

Class for keeping track of errors caught by the monitoring.

Definition at line 32 of file SCT_MonitorConditionsTool.h.

Constructor & Destructor Documentation

◆ SCT_MonitorConditionsTool()

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

Definition at line 41 of file SCT_MonitorConditionsTool.cxx.

41 :
42 base_class(type, name, parent)
43{
44}

◆ ~SCT_MonitorConditionsTool()

virtual SCT_MonitorConditionsTool::~SCT_MonitorConditionsTool ( )
virtualdefault

Member Function Documentation

◆ badStrips() [1/4]

void SCT_MonitorConditionsTool::badStrips ( const Identifier & moduleId,
std::set< Identifier > & strips ) const
overridevirtual

List of bad strip Identifiers for a given module.

Definition at line 261 of file SCT_MonitorConditionsTool.cxx.

261 {
262 const EventContext& ctx{Gaudi::Hive::currentContext()};
263 return badStrips(moduleId, strips, ctx);
264}
virtual void badStrips(std::set< Identifier > &strips) const override
List of bad strip Identifiers.

◆ badStrips() [2/4]

void SCT_MonitorConditionsTool::badStrips ( const Identifier & moduleId,
std::set< Identifier > & strips,
const EventContext & ctx ) const
overridevirtual

Definition at line 232 of file SCT_MonitorConditionsTool.cxx.

232 {
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}
#define ATH_MSG_DEBUG(x)
static void expandList(const std::string &defectStr, std::set< int > &defectList)
std::string getList(const Identifier &imodule, const EventContext &ctx) const

◆ badStrips() [3/4]

void SCT_MonitorConditionsTool::badStrips ( std::set< Identifier > & strips) const
overridevirtual

List of bad strip Identifiers.

Definition at line 224 of file SCT_MonitorConditionsTool.cxx.

224 {
225 const EventContext& ctx{Gaudi::Hive::currentContext()};
226 badStrips(strips, ctx);
227}

◆ badStrips() [4/4]

void SCT_MonitorConditionsTool::badStrips ( std::set< Identifier > & strips,
const EventContext & ctx ) const
overridevirtual

Definition at line 212 of file SCT_MonitorConditionsTool.cxx.

212 {
213 // Set of bad strip Identifers for all modules
214 SCT_ID::const_id_iterator waferItr{m_pHelper->wafer_begin()}, waferEnd{m_pHelper->wafer_end()};
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}
std::vector< Identifier >::const_iterator const_id_iterator
Definition SCT_ID.h:73

◆ badStripsAsString() [1/2]

std::string SCT_MonitorConditionsTool::badStripsAsString ( const Identifier & moduleId) const
overridevirtual

String of bad strip numbers for a given module.

Definition at line 274 of file SCT_MonitorConditionsTool.cxx.

274 {
275 const EventContext& ctx{Gaudi::Hive::currentContext()};
276 return badStripsAsString(moduleId, ctx);
277}
virtual std::string badStripsAsString(const Identifier &moduleId) const override
String of bad strip numbers for a given module.

◆ badStripsAsString() [2/2]

std::string SCT_MonitorConditionsTool::badStripsAsString ( const Identifier & moduleId,
const EventContext & ctx ) const
overridevirtual

Definition at line 269 of file SCT_MonitorConditionsTool.cxx.

269 {
270 return getList(moduleId, ctx);
271}

◆ canReportAbout()

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

Can the service report about the given component? (chip, module...)

Definition at line 71 of file SCT_MonitorConditionsTool.cxx.

◆ expandList()

void SCT_MonitorConditionsTool::expandList ( const std::string & defectStr,
std::set< int > & defectList )
staticprivate

Definition at line 320 of file SCT_MonitorConditionsTool.cxx.

320 {
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}
static void expandRange(const std::string &rangeStr, std::set< int > &rangeList)

◆ expandRange()

void SCT_MonitorConditionsTool::expandRange ( const std::string & rangeStr,
std::set< int > & rangeList )
staticprivate

Definition at line 299 of file SCT_MonitorConditionsTool.cxx.

299 {
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}
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
static const std::string s_separator

◆ finalize()

StatusCode SCT_MonitorConditionsTool::finalize ( )
overridevirtual

Definition at line 64 of file SCT_MonitorConditionsTool.cxx.

64 {
65 return StatusCode::SUCCESS;
66}

◆ getCondData()

const SCT_MonitorCondData * SCT_MonitorConditionsTool::getCondData ( const EventContext & ctx) const
private

Definition at line 337 of file SCT_MonitorConditionsTool.cxx.

337 {
338 SG::ReadCondHandle<SCT_MonitorCondData> condData{m_condKey, ctx};
339 return condData.retrieve();
340}
SG::ReadCondHandleKey< SCT_MonitorCondData > m_condKey
const_pointer_type retrieve()

◆ getDetectorElementStatus()

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

Definition at line 133 of file SCT_MonitorConditionsTool.cxx.

134 {
135 SG::ReadCondHandle<SCT_MonitorCondData> condDataHandle{m_condKey, ctx};
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);
156 static_assert( (1ul<<(SCT::N_CHIPS_PER_SIDE*SCT::N_SIDES)) - 1ul <= std::numeric_limits<InDet::ChipFlags_t>::max());
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}
#define ATH_MSG_ERROR(x)
const std::vector< bool > & getElementStatus() const
const std::vector< ChipFlags_t > & getElementChipStatus() const
const std::vector< std::vector< unsigned short > > & getBadCells() const
unsigned short ChipFlags_t
const std::array< std::bitset< SCT_ConditionsData::STRIPS_PER_CHIP >, SCT_ConditionsData::CHIPS_PER_SIDE > & badStripsForModule(const IdentifierHash &waferHash) const
std::size_t nBadStripsForWafer(const IdentifierHash &waferHash) const
Get the number of bad strips for a wafer.
UnsignedIntegerProperty m_nhits_noisywafer
UnsignedIntegerProperty m_nhits_noisychip
const_pointer_type cptr()
void addDependency(const EventIDRange &range)
constexpr unsigned int N_CHIPS_PER_SIDE
constexpr unsigned int getGeometricalChipID(unsigned int strip)
Get the geometrical chip ID for the given strip.
constexpr unsigned int N_SIDES
status
Definition merge.py:16

◆ getList()

std::string SCT_MonitorConditionsTool::getList ( const Identifier & imodule,
const EventContext & ctx ) const
private

Definition at line 284 of file SCT_MonitorConditionsTool.cxx.

284 {
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}
bool find(const IdentifierHash &hash, std::string &defectList) const
Check if a module has a defect (a list of bad strips). If it does not have defect return false.
const SCT_MonitorCondData * getCondData(const EventContext &ctx) const

◆ initialize()

StatusCode SCT_MonitorConditionsTool::initialize ( )
overridevirtual

Definition at line 49 of file SCT_MonitorConditionsTool.cxx.

49 {
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
56 ATH_CHECK(m_condKey.initialize());
57
58 return StatusCode::SUCCESS;
59}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
retrieve(aClass, aKey=None)
Definition PyKernel.py:110

◆ isGood() [1/4]

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

Definition at line 79 of file SCT_MonitorConditionsTool.cxx.

79 {
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}
std::size_t nBadStripsForModule(const IdentifierHash &moduleHash) const
Get the number of bad strips for a module.
bool isBadStrip(const IdentifierHash &waferHash, const int strip) const
Check if a strip is bad.
std::size_t nBadStripsForChip(const IdentifierHash &waferHash, const int strip) const
Get the number of bad strips for the chip, where a strip locates.
UnsignedIntegerProperty m_nhits_noisymodule

◆ isGood() [2/4]

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

Is the detector element good?

Definition at line 109 of file SCT_MonitorConditionsTool.cxx.

109 {
110 const EventContext& ctx{Gaudi::Hive::currentContext()};
111
112 return isGood(elementId, ctx, h);
113}
virtual bool isGood(const Identifier &elementId, InDetConditions::Hierarchy h=InDetConditions::DEFAULT) const override
Is the detector element good?

◆ isGood() [3/4]

bool SCT_MonitorConditionsTool::isGood ( const IdentifierHash & hashId) const
overridevirtual

is it good?, using wafer hash

Definition at line 126 of file SCT_MonitorConditionsTool.cxx.

126 {
127 const EventContext& ctx{Gaudi::Hive::currentContext()};
128
129 return isGood(hashId, ctx);
130}

◆ isGood() [4/4]

bool SCT_MonitorConditionsTool::isGood ( const IdentifierHash & hashId,
const EventContext & ctx ) const
overridevirtual

Definition at line 118 of file SCT_MonitorConditionsTool.cxx.

118 {
119 Identifier elementId{m_pHelper->wafer_id(hashId)};
120 return isGood(elementId, ctx, InDetConditions::SCT_SIDE);
121}

Member Data Documentation

◆ m_condKey

SG::ReadCondHandleKey<SCT_MonitorCondData> SCT_MonitorConditionsTool::m_condKey {this, "CondKey", "SCT_MonitorCondData", "SCT noisy strips"}
private

Definition at line 86 of file SCT_MonitorConditionsTool.h.

86{this, "CondKey", "SCT_MonitorCondData", "SCT noisy strips"};

◆ m_nhits_noisychip

UnsignedIntegerProperty SCT_MonitorConditionsTool::m_nhits_noisychip {this, "Nnoisychip", 64}
private

Definition at line 81 of file SCT_MonitorConditionsTool.h.

81{this, "Nnoisychip", 64};

◆ m_nhits_noisymodule

UnsignedIntegerProperty SCT_MonitorConditionsTool::m_nhits_noisymodule {this, "Nnoisycmodule", 768}
private

Definition at line 83 of file SCT_MonitorConditionsTool.h.

83{this, "Nnoisycmodule", 768};

◆ m_nhits_noisywafer

UnsignedIntegerProperty SCT_MonitorConditionsTool::m_nhits_noisywafer {this, "Nnoisywafer", 384}
private

Definition at line 82 of file SCT_MonitorConditionsTool.h.

82{this, "Nnoisywafer", 384};

◆ m_pHelper

const SCT_ID* SCT_MonitorConditionsTool::m_pHelper {nullptr}
private

Definition at line 84 of file SCT_MonitorConditionsTool.h.

84{nullptr};

◆ s_separator

const string SCT_MonitorConditionsTool::s_separator {"-"}
staticprivate

Definition at line 39 of file SCT_MonitorConditionsTool.h.


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