ATLAS Offline Software
SCT_ReadCalibChipDataTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
12 
13 // Include Athena stuff
14 #include "Identifier/Identifier.h"
15 #include "InDetIdentifier/SCT_ID.h"
20 
21 using namespace SCT_ConditionsData;
22 using namespace SCT_ReadCalibChipDefs;
23 
24 //----------------------------------------------------------------------
25 SCT_ReadCalibChipDataTool::SCT_ReadCalibChipDataTool (const std::string& type, const std::string& name, const IInterface* parent) :
26  base_class(type, name, parent)
27 {
28 }
29 
30 //----------------------------------------------------------------------
33  // Get SCT helper
34  ATH_CHECK(detStore()->retrieve(m_id_sct, "SCT_ID"));
35 
36  // Read Cond Handle Key
39 
40  return StatusCode::SUCCESS;
41 } // SCT_ReadCalibChipDataTool::initialize()
42 
43 //----------------------------------------------------------------------
46  // Print where you are
47  return StatusCode::SUCCESS;
48 } // SCT_ReadCalibChipDataTool::finalize()
49 
50 //----------------------------------------------------------------------
51 //Can only report good/bad at side level
52 bool
54  return (h==InDetConditions::SCT_SIDE);
55 }
56 
57 //----------------------------------------------------------------------
58 // Returns a bool summary of the data
59 bool
60 SCT_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 
100 void
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 
146 bool
147 SCT_ReadCalibChipDataTool::isGood(const IdentifierHash& elementHashId) const {
148  const EventContext& ctx{Gaudi::Hive::currentContext()};
149 
150  return isGood(elementHashId, ctx);
151 }
152 
153 //----------------------------------------------------------------------
154 // Returns a bool summary of the data
155 bool
156 SCT_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 
167 bool
169  const EventContext& ctx{Gaudi::Hive::currentContext()};
170 
171  return isGood(elementId, ctx, h);
172 }
173 
174 //----------------------------------------------------------------------
175 std::vector<float>
176 SCT_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 
217 std::vector<float>
218 SCT_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 //----------------------------------------------------------------------
224 std::vector<float>
225 SCT_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 
265 std::vector<float>
266 SCT_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 
271 int
272 SCT_ReadCalibChipDataTool::nPtGainIndex(const std::string& dataName) {
273  int i{N_NPTGAIN};
274  while (i--) if (dataName==nPtGainParameterNames[i]) break;
275  return i;
276 }
277 
278 int
279 SCT_ReadCalibChipDataTool::noiseOccIndex(const std::string& dataName) {
280  int i{N_NOISEOCC};
281  while (i--) if (dataName==noiseOccParameterNames[i]) break;
282  return i;
283 }
284 
285 const SCT_GainCalibData*
286 SCT_ReadCalibChipDataTool::getCondDataGain(const EventContext& ctx) const {
288  return condData.retrieve();
289 }
290 
291 const SCT_NoiseCalibData*
292 SCT_ReadCalibChipDataTool::getCondDataNoise(const EventContext& ctx) const {
294  return condData.retrieve();
295 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
SCT_ModuleNoiseCalibData
std::array< SCT_ModuleCalibParameter, SCT_ConditionsData::N_NOISEOCC > SCT_ModuleNoiseCalibData
Typedef for data object used in SCT_ReadCalibChipNoiseCondAlg and SCT_ReadCalibChipDataTool.
Definition: SCT_ModuleNoiseCalibData.h:26
SCT_ReadCalibChipDataTool::isGood
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.
Definition: SCT_ReadCalibChipDataTool.cxx:156
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
SCT_NoiseCalibData
std::array< SCT_ModuleNoiseCalibData, SCT_ConditionsData::NUMBER_OF_MODULES > SCT_NoiseCalibData
Class for data object used in SCT_ReadCalibChipNoiseCondAlg and SCT_ReadCalibChipDataTool.
Definition: SCT_NoiseCalibData.h:26
InDet::SiDetectorElementStatus::getElementStatus
const std::vector< bool > & getElementStatus() const
Definition: SiDetectorElementStatus.h:116
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
SCT_ConditionsData::CHIPS_PER_SIDE
@ CHIPS_PER_SIDE
Definition: SCT_ConditionsParameters.h:20
SCT_DetectorElementStatus.h
skel.it
it
Definition: skel.GENtoEVGEN.py:423
SCT_ConditionsData::SIDES_PER_MODULE
@ SIDES_PER_MODULE
Definition: SCT_ConditionsParameters.h:18
SCT_ConditionsData::N_NPTGAIN
@ N_NPTGAIN
Definition: SCT_ConditionsParameters.h:22
InDetConditions::Hierarchy
Hierarchy
Definition: InDetHierarchy.h:14
SCT_ConditionsData::N_NOISEOCC
@ N_NOISEOCC
Definition: SCT_ConditionsParameters.h:22
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
SCT_ReadCalibChipDataTool::initialize
virtual StatusCode initialize() override
Gaudi initialiser.
Definition: SCT_ReadCalibChipDataTool.cxx:32
TRT::Hit::side
@ side
Definition: HitInfo.h:83
SCT_ReadCalibChipDataTool::getNoiseOccupancyData
virtual std::vector< float > getNoiseOccupancyData(const Identifier &moduleId, const int side, const std::string &datatype, const EventContext &ctx) const override
Get NoiseOccupancy data wafer.
Definition: SCT_ReadCalibChipDataTool.cxx:225
SCT_ReadCalibChipDataTool::getCondDataNoise
const SCT_NoiseCalibData * getCondDataNoise(const EventContext &ctx) const
Definition: SCT_ReadCalibChipDataTool.cxx:292
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
convertTimingResiduals.sum
sum
Definition: convertTimingResiduals.py:55
SCT_ConditionsData
Definition: SCT_ConditionsParameters.h:17
lumiFormat.i
int i
Definition: lumiFormat.py:92
SCT_ModuleGainCalibData.h
InDet::SiDetectorElementStatus
Definition: SiDetectorElementStatus.h:62
h
SCT_ModuleCalibParameter
std::array< float, SCT_ConditionsData::CHIPS_PER_MODULE > SCT_ModuleCalibParameter
typedef for SCT_ReadCalibChipGainCondAlg, SCT_ReadCalibChipNoiseCondAlg, SCT_ReadCalibChipDataTool.
Definition: SCT_ModuleCalibParameter.h:27
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_ModuleCalibParameter.h
header file for data object for a calibration parameter per chip of a module
SCT_ReadCalibChipDataTool::finalize
virtual StatusCode finalize() override
Gaudi finaliser.
Definition: SCT_ReadCalibChipDataTool.cxx:45
SCT_ModuleGainCalibData
std::array< SCT_ModuleCalibParameter, SCT_ConditionsData::N_NPTGAIN > SCT_ModuleGainCalibData
Typedef for data object used in SCT_ReadCalibChipGainCondAlg and SCT_ReadCalibChipDataTool.
Definition: SCT_ModuleGainCalibData.h:26
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_ModuleNoiseCalibData.h
SCT_ReadCalibChipDataTool::m_condKeyGain
SG::ReadCondHandleKey< SCT_GainCalibData > m_condKeyGain
Definition: SCT_ReadCalibChipDataTool.h:80
SCT_ReadCalibChipDataTool::SCT_ReadCalibChipDataTool
SCT_ReadCalibChipDataTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.
Definition: SCT_ReadCalibChipDataTool.cxx:25
SCT_ReadCalibChipDataTool::nPtGainIndex
static int nPtGainIndex(const std::string &dataName)
Definition: SCT_ReadCalibChipDataTool.cxx:272
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
SCT_ReadCalibChipDefs::noiseOccParameterNames
const std::array< std::string, SCT_ConditionsData::N_NOISEOCC > noiseOccParameterNames
Definition: SCT_ReadCalibChipDefs.h:24
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
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
SCT_ReadCalibChipDataTool::getNPtGainData
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.
Definition: SCT_ReadCalibChipDataTool.cxx:176
SiDetectorElementCollection.h
SCT_ReadCalibChipDataTool::m_condKeyNoise
SG::ReadCondHandleKey< SCT_NoiseCalibData > m_condKeyNoise
Definition: SCT_ReadCalibChipDataTool.h:81
SCT_ReadCalibChipDataTool::noiseOccIndex
static int noiseOccIndex(const std::string &dataName)
Definition: SCT_ReadCalibChipDataTool.cxx:279
SCT_ReadCalibChipDefs::nPtGainParameterNames
const std::array< std::string, SCT_ConditionsData::N_NPTGAIN > nPtGainParameterNames
Definition: SCT_ReadCalibChipDefs.h:18
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
SCT_ReadCalibChipDataTool::getCondDataGain
const SCT_GainCalibData * getCondDataGain(const EventContext &ctx) const
Definition: SCT_ReadCalibChipDataTool.cxx:286
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
SCT_ReadCalibChipDataTool::m_id_sct
const SCT_ID * m_id_sct
Handle to SCT ID helper.
Definition: SCT_ReadCalibChipDataTool.h:77
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
merge.status
status
Definition: merge.py:17
SCT_ReadCalibChipDefs
Definition: SCT_ReadCalibChipDefs.h:14
InDetConditions::SCT_SIDE
@ SCT_SIDE
Definition: InDetHierarchy.h:14
SCT_ReadCalibChipDataTool::getDetectorElementStatus
virtual void getDetectorElementStatus(const EventContext &ctx, InDet::SiDetectorElementStatus &element_status, SG::WriteCondHandle< InDet::SiDetectorElementStatus > *whandle) const override
Definition: SCT_ReadCalibChipDataTool.cxx:101
SCT_ReadCalibChipDataTool::m_noiseLevel
FloatProperty m_noiseLevel
Definition: SCT_ReadCalibChipDataTool.h:84
SCT_ReadCalibChipDefs.h
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
SCT_GainCalibData
std::array< SCT_ModuleGainCalibData, SCT_ConditionsData::NUMBER_OF_MODULES > SCT_GainCalibData
Typedef for data object used in SCT_ReadCalibChipGainCondAlg and SCT_ReadCalibChipDataTool.
Definition: SCT_GainCalibData.h:26
SCT_ReadCalibChipDataTool.h
SG::WriteCondHandle::addDependency
void addDependency(const EventIDRange &range)
Definition: WriteCondHandle.h:275
SCT_ReadCalibChipDataTool::canReportAbout
virtual bool canReportAbout(InDetConditions::Hierarchy h) const override
Definition: SCT_ReadCalibChipDataTool.cxx:53