ATLAS Offline Software
Loading...
Searching...
No Matches
SCT_ReadCalibChipDataTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
8
12
13// Include Athena stuff
14#include "Identifier/Identifier.h"
20#include <stdexcept>
21
22using namespace SCT_ConditionsData;
23using namespace SCT_ReadCalibChipDefs;
24
25//----------------------------------------------------------------------
26SCT_ReadCalibChipDataTool::SCT_ReadCalibChipDataTool (const std::string& type, const std::string& name, const IInterface* parent) :
27 base_class(type, name, parent)
28{
29}
30
31//----------------------------------------------------------------------
32StatusCode
34 // Get SCT helper
35 ATH_CHECK(detStore()->retrieve(m_id_sct, "SCT_ID"));
36
37 // Read Cond Handle Key
38 ATH_CHECK(m_condKeyGain.initialize());
39 ATH_CHECK(m_condKeyNoise.initialize());
40
41 return StatusCode::SUCCESS;
42} // SCT_ReadCalibChipDataTool::initialize()
43
44//----------------------------------------------------------------------
45StatusCode
47 // Print where you are
48 return StatusCode::SUCCESS;
49} // SCT_ReadCalibChipDataTool::finalize()
50
51//----------------------------------------------------------------------
52//Can only report good/bad at side level
53bool
57
58//----------------------------------------------------------------------
59// Returns a bool summary of the data
60bool
61SCT_ReadCalibChipDataTool::isGood(const IdentifierHash& elementHashId, const EventContext& ctx) const {
62 // Retrieve SCT_NoiseCalibData pointer
63 const SCT_NoiseCalibData* condDataNoise{getCondDataNoise(ctx)};
64 if (condDataNoise==nullptr) {
65 ATH_MSG_ERROR("In isGood, SCT_NoiseCalibData cannot be retrieved");
66 return true;
67 }
68
69 const unsigned int moduleIdx{elementHashId/SIDES_PER_MODULE};
70 // Retrieve defect data from map
71 const SCT_ModuleNoiseCalibData& noiseOccData{(*condDataNoise)[moduleIdx]};
72
73 // Retrieve the data
74 const int i{noiseOccIndex("NoiseByChip")};
75 if (i<0) {
76 ATH_MSG_ERROR("This NoiseOccupancy noise data does not exist");
77 return true;
78 }
79 const SCT_ModuleCalibParameter& moduleNoiseData{noiseOccData[i]};
80
81 // Calcuate module status
82 // For now just simple check NO mean noise level
83 // Chip could be 0 if bypassed, need to check
84 const int side{static_cast<int>(elementHashId%2)};
85 int chip{side*CHIPS_PER_SIDE};
86 const int endChip{CHIPS_PER_SIDE+chip};
87 int nChips{0};
88 float sum{0.0};
89 for (; chip!=endChip; ++chip) {
90 float chipNoise{moduleNoiseData[chip]};
91 if (chipNoise!=0.0) {
92 sum+=chipNoise;
93 ++nChips;
94 }
95 }
96 if (nChips == 0)[[unlikely]]{
97 throw std::runtime_error("SCT_ReadCalibChipDataTool::isGood: nChips is zero.");
98 }
99 const float meanNoiseValue{sum/nChips};
100 ATH_MSG_DEBUG("Module mean noise: " << meanNoiseValue);
101 return (meanNoiseValue < m_noiseLevel);
102} //SCT_ReadCalibChipDataTool::summary()
103
104void
108 if (not condDataHandle.isValid() ) {
109 ATH_MSG_ERROR("Invalid cond data handle " << m_condKeyNoise.key() );
110 return;
111 }
112 if (whandle) {
113 whandle->addDependency (condDataHandle);
114 }
115 const SCT_NoiseCalibData* condDataNoise{condDataHandle.cptr() };
116 std::vector<bool> &status = element_status.getElementStatus();
117 if (status.empty()) {
118 status.resize(m_id_sct->wafer_hash_max(),true);
119 }
120 unsigned int element_i=0;
121 const int occ_index{noiseOccIndex("NoiseByChip")};
122 for (const SCT_ModuleNoiseCalibData& noiseOccData : *condDataNoise) {
123 if (occ_index<0) {
124 ATH_MSG_ERROR("This NoiseOccupancy noise data does not exist");
125 return;
126 }
127 const SCT_ModuleCalibParameter& moduleNoiseData{noiseOccData[occ_index]};
128
129 for (unsigned int side_i=0; side_i<2; ++side_i) {
130 unsigned int chip{side_i*CHIPS_PER_SIDE};
131 const unsigned int endChip{CHIPS_PER_SIDE+chip};
132 unsigned int nChips{0};
133 float sum{0.0};
134
135 for (; chip!=endChip; ++chip) {
136 float chipNoise{moduleNoiseData[chip]};
137 if (chipNoise!=0.0) {
138 sum+=chipNoise;
139 ++nChips;
140 }
141 }
142 const float meanNoiseValue{ nChips>0 ? sum/nChips : 0.f};
143 status.at(element_i) = status.at(element_i) && (meanNoiseValue < m_noiseLevel);
144
145 ++element_i;
146 }
147 }
148}
149
150//----------------------------------------------------------------------
151// Returns a bool summary of the data
152bool
153SCT_ReadCalibChipDataTool::isGood(const Identifier& elementId, const EventContext& ctx, InDetConditions::Hierarchy h) const {
154 if (h==InDetConditions::SCT_SIDE) { //Could do by chip too
155 const IdentifierHash elementIdHash{m_id_sct->wafer_hash(elementId)};
156 return isGood(elementIdHash, ctx);
157 } else{
158 // Not applicable for Calibration data
159 ATH_MSG_WARNING("summary(): " << h << "good/bad is not applicable for Calibration data");
160 return true;
161 }
162}
163
164//----------------------------------------------------------------------
165std::vector<float>
166SCT_ReadCalibChipDataTool::getNPtGainData(const Identifier& moduleId, const int side, const std::string& datatype, const EventContext& ctx) const {
167 // Print where you are
168 ATH_MSG_DEBUG("in getNPtGainData()");
169 std::vector<float> waferData;
170
171 // Retrieve SCT_GainCalibData pointer
172 const SCT_GainCalibData* condDataGain{getCondDataGain(ctx)};
173 if (condDataGain==nullptr) {
174 ATH_MSG_ERROR("In getNPtGainData, SCT_GainCalibData cannot be retrieved");
175 return waferData;
176 }
177
178 //find hash
179 const IdentifierHash hashId{m_id_sct->wafer_hash(moduleId)};
180 //make index
181 const unsigned int idx{hashId/SIDES_PER_MODULE};
182 //Retrieve defect data from map
183 try {
184 const SCT_ModuleGainCalibData& wantedNPGData{condDataGain->at(idx)};
185 //find the correct index for the required data
186 const int dataIdx{nPtGainIndex(datatype)};
187 if (dataIdx<0) {
188 ATH_MSG_ERROR("This N-point gain data: " << datatype << " does not exist");
189 return waferData;
190 }
191 const SCT_ModuleCalibParameter& moduleGains{wantedNPGData[dataIdx]};
192 const int startOffset{side*CHIPS_PER_SIDE};
193 const int endOffset{CHIPS_PER_SIDE+startOffset};
194 SCT_ModuleCalibParameter::const_iterator it{moduleGains.begin() + startOffset};
195 SCT_ModuleCalibParameter::const_iterator end{moduleGains.begin() + endOffset};
196 // Returns the data for the wanted wafer
197 if (*it != *it) return waferData;
198 //could use signaling NaN here and catch the exception instead, would be quicker: NO!
199 //see: http://stackoverflow.com/questions/235386/using-nan-in-c
200 waferData.assign(it, end);
201 return waferData;
202 } catch (const std::out_of_range& e) {
203 return waferData;
204 }
205} //SCT_ReadCalibChipDataTool::getNPtGainData()
206
207//----------------------------------------------------------------------
208std::vector<float>
209SCT_ReadCalibChipDataTool::getNoiseOccupancyData(const Identifier& moduleId, const int side, const std::string& datatype, const EventContext& ctx) const {
210 // Print where you are
211 ATH_MSG_DEBUG("in getNoiseOccupancyData()");
212 std::vector<float> waferData;
213
214 // Retrieve SCT_NoiseCalibData pointer
215 const SCT_NoiseCalibData* condDataNoise{getCondDataNoise(ctx)};
216 if (condDataNoise==nullptr) {
217 ATH_MSG_ERROR("In getNPtNoiseData, SCT_NoiseCalibData cannot be retrieved");
218 return waferData;
219 }
220
221 //find hash
222 const IdentifierHash hashId{m_id_sct->wafer_hash(moduleId)};
223 //make index
224 const unsigned int idx{hashId/SIDES_PER_MODULE};
225 try {
226 //Retrieve defect data from array
227 const SCT_ModuleNoiseCalibData& wantedNoiseData{condDataNoise->at(idx)};
228
229 //find the correct index for the required data
230 const int dataIdx{noiseOccIndex(datatype)};
231 if (dataIdx<0) {
232 ATH_MSG_ERROR("This Noise Occupancy data: " << datatype << " does not exist");
233 return waferData;
234 }
235 const SCT_ModuleCalibParameter& moduleNoise{wantedNoiseData[dataIdx]};
236 const int startOffset{side*CHIPS_PER_SIDE};
237 const int endOffset{CHIPS_PER_SIDE+startOffset};
238 SCT_ModuleCalibParameter::const_iterator it{moduleNoise.begin() + startOffset};
239 SCT_ModuleCalibParameter::const_iterator end{moduleNoise.begin() + endOffset};
240 // Returns the data for the wanted wafer
241 if (*it != *it) return waferData;
242 waferData.assign(it, end);
243 return waferData;
244 } catch (const std::out_of_range& e) {
245 return waferData;
246 }
247} // SCT_ReadCalibChipDataTool::getNoiseOccupancyData()
248
249int
250SCT_ReadCalibChipDataTool::nPtGainIndex(const std::string& dataName) {
251 int i{N_NPTGAIN};
252 while (i--) if (dataName==nPtGainParameterNames[i]) break;
253 return i;
254}
255
256int
257SCT_ReadCalibChipDataTool::noiseOccIndex(const std::string& dataName) {
258 int i{N_NOISEOCC};
259 while (i--) if (dataName==noiseOccParameterNames[i]) break;
260 return i;
261}
262
264SCT_ReadCalibChipDataTool::getCondDataGain(const EventContext& ctx) const {
266 return condData.retrieve();
267}
268
270SCT_ReadCalibChipDataTool::getCondDataNoise(const EventContext& ctx) const {
272 return condData.retrieve();
273}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
std::array< SCT_ModuleGainCalibData, SCT_ConditionsData::NUMBER_OF_MODULES > SCT_GainCalibData
Typedef for data object used in SCT_ReadCalibChipGainCondAlg and SCT_ReadCalibChipDataTool.
This is an Identifier helper class for the SCT subdetector.
header file for data object for a calibration parameter per chip of a module
std::array< float, SCT_ConditionsData::CHIPS_PER_MODULE > SCT_ModuleCalibParameter
typedef for SCT_ReadCalibChipGainCondAlg, SCT_ReadCalibChipNoiseCondAlg, SCT_ReadCalibChipDataTool.
std::array< SCT_ModuleCalibParameter, SCT_ConditionsData::N_NPTGAIN > SCT_ModuleGainCalibData
Typedef for data object used in SCT_ReadCalibChipGainCondAlg and SCT_ReadCalibChipDataTool.
std::array< SCT_ModuleCalibParameter, SCT_ConditionsData::N_NOISEOCC > SCT_ModuleNoiseCalibData
Typedef for data object used in SCT_ReadCalibChipNoiseCondAlg and SCT_ReadCalibChipDataTool.
std::array< SCT_ModuleNoiseCalibData, SCT_ConditionsData::NUMBER_OF_MODULES > SCT_NoiseCalibData
Class for data object used in SCT_ReadCalibChipNoiseCondAlg and SCT_ReadCalibChipDataTool.
Header file for SCT_ReadCalibChipDataTool.
This is a "hash" representation of an Identifier.
const std::vector< bool > & getElementStatus() const
const SCT_GainCalibData * getCondDataGain(const EventContext &ctx) const
virtual bool isGood(const Identifier &elementId, const EventContext &ctx, InDetConditions::Hierarchy h=InDetConditions::DEFAULT) const override
Summarise the result from the service as good/bad.
virtual std::vector< float > getNPtGainData(const Identifier &moduleId, const int side, const std::string &datatype, const EventContext &ctx) const override
Get NPtGain data per wafer.
SG::ReadCondHandleKey< SCT_NoiseCalibData > m_condKeyNoise
static int noiseOccIndex(const std::string &dataName)
virtual StatusCode initialize() override
Gaudi initialiser.
virtual void getDetectorElementStatus(const EventContext &ctx, InDet::SiDetectorElementStatus &element_status, SG::WriteCondHandle< InDet::SiDetectorElementStatus > *whandle) const override
virtual std::vector< float > getNoiseOccupancyData(const Identifier &moduleId, const int side, const std::string &datatype, const EventContext &ctx) const override
Get NoiseOccupancy data wafer.
SG::ReadCondHandleKey< SCT_GainCalibData > m_condKeyGain
static int nPtGainIndex(const std::string &dataName)
virtual StatusCode finalize() override
Gaudi finaliser.
const SCT_NoiseCalibData * getCondDataNoise(const EventContext &ctx) const
const SCT_ID * m_id_sct
Handle to SCT ID helper.
virtual bool canReportAbout(InDetConditions::Hierarchy h) const override
SCT_ReadCalibChipDataTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.
const_pointer_type retrieve()
const_pointer_type cptr()
void addDependency(const EventIDRange &range)
const std::array< std::string, SCT_ConditionsData::N_NPTGAIN > nPtGainParameterNames
const std::array< std::string, SCT_ConditionsData::N_NOISEOCC > noiseOccParameterNames
#define unlikely(x)