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