ATLAS Offline Software
PixelChargeCalibCondData.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
8 
9 
10 #include <stdexcept>
11 #include <sstream>
12 #include <cfloat> //for FLT_MAX
13 
14 
15 
16 using namespace PixelChargeCalib;
17 using InDetDD::enum2uint; //in PixelReadoutDefinitions.h; will use ADL anyway,but make it explicit
18 
19 namespace{
20  const std::out_of_range
21  generateError(const char * functionName, InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE){
22  std::stringstream error;
23  error << "PixelChargeCalibCondData::"<< functionName << "("<<enum2uint(type)<< ", " << moduleHash << ", " << FE << "): out of bounds";
24  return std::out_of_range(error.str());
25  }
26  const std::out_of_range
27  generateError(const char * functionName, unsigned int moduleHash, unsigned int FE, unsigned int val){
28  std::stringstream error;
29  error << "PixelChargeCalibCondData::"<< functionName << "(" << moduleHash << ", " << FE << ", "<< val << "): out of bounds";
30  return std::out_of_range(error.str());
31  }
32  const std::out_of_range
33  generateError(const char * functionName, unsigned int moduleHash, unsigned int FE){
34  std::stringstream error;
35  error << "PixelChargeCalibCondData::"<< functionName << "(" << moduleHash << ", " << FE << "): out of bounds";
36  return std::out_of_range(error.str());
37  }
38  const std::out_of_range
39  generateError(const char * functionName, unsigned int moduleHash){
40  std::stringstream error;
41  error << "PixelChargeCalibCondData::"<< functionName << "(" << moduleHash << "): out of bounds";
42  return std::out_of_range(error.str());
43  }
44 }
45 
46 PixelChargeCalibCondData::PixelChargeCalibCondData(std::size_t max_module_hash) : m_sizeOfHashVector(max_module_hash){
47  //nop
48 }
49 
50 void
52  //calibration strategy
53  setCalibrationStrategy(moduleHash, b.calibrationType);
54  // Normal pixel
55  setThresholds(InDetDD::PixelDiodeType::NORMAL, moduleHash, b.threshold);
58  setTotResolutions(moduleHash, b.totRes);
59  // Long pixel
60  setThresholds(InDetDD::PixelDiodeType::LONG, moduleHash, b.thresholdLong);
63  // Ganged/large pixel
64  setThresholds(InDetDD::PixelDiodeType::GANGED, moduleHash, b.thresholdGanged);
65  setLegacyFitParameters(InDetDD::PixelDiodeType::GANGED, moduleHash, b.paramsGanged);
67 }
68 
69 void
70 PixelChargeCalibCondData::setAllFromConfigData(unsigned int moduleHash, const PixelModuleData * configData, const std::pair<int, int> &becLayer, unsigned int numFE){
71  const auto & [barrel_ec, layer] = becLayer;
72  for (size_t i{}; i != s_NPixelDiodes; ++i) {
73  const auto t = static_cast<InDetDD::PixelDiodeType>(i);
74  const Thresholds thresholds{configData->getDefaultAnalogThreshold(barrel_ec, layer), configData->getDefaultAnalogThresholdSigma(barrel_ec, layer),
75  configData->getDefaultAnalogThresholdNoise(barrel_ec, layer), configData->getDefaultInTimeThreshold(barrel_ec, layer)};
76  setThresholds(t, moduleHash, std::vector<Thresholds>(numFE, thresholds));
77  //
78  const LegacyFitParameters defaultParams{configData->getDefaultQ2TotA(), configData->getDefaultQ2TotE(), configData->getDefaultQ2TotC()};
79  setLegacyFitParameters(t, moduleHash, std::vector<LegacyFitParameters>(numFE, defaultParams));
80  //
81  const auto zeroLinFit = PixelChargeCalib::LinearFitParameters();
82  setLinearFitParameters(t, moduleHash, std::vector<PixelChargeCalib::LinearFitParameters>(numFE, zeroLinFit));
83  }
84  const auto zeroResolution = PixelChargeCalib::Resolutions();
85  setTotResolutions(moduleHash, std::vector<PixelChargeCalib::Resolutions>(numFE, zeroResolution));
86 }
87 
88 void
89 PixelChargeCalibCondData::setThresholds(InDetDD::PixelDiodeType type, unsigned int moduleHash, const std::vector<PixelChargeCalib::Thresholds> & thresholds){
90  if (moduleHash >= m_sizeOfHashVector) throw generateError(__func__, moduleHash);
91  auto & hashIndexedVector = m_thresholds[enum2uint(type)];
92  if (hashIndexedVector.size()<=moduleHash){
93  hashIndexedVector.resize(m_sizeOfHashVector);
94  }
95  hashIndexedVector[moduleHash] = thresholds;
96 }
97 
99 PixelChargeCalibCondData::getThresholds(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE) const{
100  auto idx = enum2uint(type);
101  const auto & hashIndexedVector = m_thresholds[idx];
102  const auto &feIndexedVector = hashIndexedVector.at(moduleHash);
103  if (FE < feIndexedVector.size()) {
104  return feIndexedVector[FE];
105  }
106  throw generateError(__func__, type, moduleHash, FE);
107 }
108 
109 void
110 PixelChargeCalibCondData::setLegacyFitParameters(InDetDD::PixelDiodeType type, unsigned int moduleHash, const std::vector<PixelChargeCalib::LegacyFitParameters> &parameters){
111  if (moduleHash >= m_sizeOfHashVector) throw generateError(__func__, moduleHash);
112  auto & thisVector = m_legacyFit.at(enum2uint(type));
113  if (thisVector.size()<=moduleHash){
114  thisVector.resize(m_sizeOfHashVector);
115  }
116  thisVector[moduleHash] = parameters;
117 }
118 
120 PixelChargeCalibCondData::getLegacyFitParameters(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE) const{
121  if (moduleHash >= m_sizeOfHashVector) throw generateError(__func__, type, moduleHash, FE);
122  auto idx = enum2uint(type);
123  const auto & thisVector = m_legacyFit.at(idx);
124  const auto &v = thisVector.at(moduleHash);
125  if (FE < v.size()) {
126  return v[FE];
127  }
128  throw generateError(__func__, type, moduleHash, FE);
129 }
130 
131 void
132 PixelChargeCalibCondData::setLinearFitParameters(InDetDD::PixelDiodeType type, unsigned int moduleHash, const std::vector<PixelChargeCalib::LinearFitParameters> &parameters){
133  if (moduleHash >= m_sizeOfHashVector) throw generateError(__func__, moduleHash);
134  auto & thisVector = m_linFit.at(enum2uint(type));
135  if ( thisVector.size()<=moduleHash){
136  thisVector.resize(m_sizeOfHashVector);
137  }
138  thisVector[moduleHash] = parameters;
139 }
140 
141 
143 PixelChargeCalibCondData::getLinearFitParameters(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE) const{
144  auto idx = enum2uint(type);
145  const auto &typeMap = m_linFit.at(idx);
146  //
147  const auto &linFit = typeMap.at(moduleHash);
148  if (FE < linFit.size()) {
149  return typeMap.at(moduleHash).at(FE);
150  }
151  throw generateError(__func__, type, moduleHash, FE);
152 }
153 
154 void
155 PixelChargeCalibCondData::setTotResolutions(unsigned int moduleHash, const std::vector<PixelChargeCalib::Resolutions> &value){
156  if (moduleHash >= m_sizeOfHashVector) throw generateError(__func__, moduleHash);
157  if (moduleHash >= m_totRes.size()) m_totRes.resize(m_sizeOfHashVector);
158  m_totRes[moduleHash] = value;
159 }
160 
161 float
162 PixelChargeCalibCondData::getTotRes(unsigned int moduleHash, unsigned int FE, float Q) const{
163  Resolutions r;
164  if (const auto &res = m_totRes.at(moduleHash); FE < res.size()) {
165  r = res[FE];
166  } else {
167  throw generateError(__func__, moduleHash, FE);
168  }
169  return r.total(Q);
170 }
171 
172 float
173 PixelChargeCalibCondData::getToT(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE, float Q) const{
175  return getToTLUTFEI4(moduleHash, FE, Q);
176  }
177  const LegacyFitParameters & legacy = getLegacyFitParameters(type, moduleHash, FE);
178  float tot = legacy.ToT(Q);
179 
180  // Protection for large charge
181  float exth = 1e5f; // the calibration function is analytically connected at threshold exth.
182  if (Q>exth && getCalibrationStrategy(moduleHash)==CalibrationStrategy::RUN3PIX) {
183  const LinearFitParameters & lin = getLinearFitParameters(type, moduleHash, FE);
184  if ( float tot1 = lin.ToT(Q); tot1 != 0.f) return tot1;
185  }
186  return tot;
187 }
188 
189 float
190 PixelChargeCalibCondData::getCharge(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE, float ToT) const{
192  return getChargeLUTFEI4(moduleHash, FE, ToT);
193  }
194  const LegacyFitParameters & legacy = getLegacyFitParameters(type, moduleHash, FE);
195 
196  float charge = legacy.Q(ToT);
197 
198  // Protection for small charge
199  const auto & thresholds = getThresholds(type,moduleHash,FE);
200  const auto analogueThreshold = thresholds.value;
201  if (charge<analogueThreshold && getCalibrationStrategy(moduleHash)==CalibrationStrategy::RUN3PIX) { charge=analogueThreshold; }
202  // Protection for large charge
203  float exth = 1e5f; // the calibration function is analytically connected at threshold exth.
205  const LinearFitParameters & lin = getLinearFitParameters(type, moduleHash, FE);
206  if (float charge1 = lin.Q(ToT); charge1 != 0.f) return charge1;
207  }
208  return charge;
209 }
210 
211 void
213  if (moduleHash >= m_sizeOfHashVector) {
214  throw generateError(__func__, moduleHash, static_cast<int>(strategy));
215  }
216  m_calibrationStrategy[moduleHash] = strategy;
217 }
218 
221  if (moduleHash >= m_sizeOfHashVector){
222  throw generateError(__func__, moduleHash);
223  }
224  auto itr = m_calibrationStrategy.find(moduleHash);
225  if (itr != m_calibrationStrategy.end()) {
226  return itr->second;
227  }
229 }
230 
231 void
232 PixelChargeCalibCondData::setTot2Charges(unsigned int moduleHash, IBLModule charges){
233  if (moduleHash >= m_sizeOfHashVector){
234  throw generateError(__func__, moduleHash);
235  }
236  m_tot2Charges[moduleHash] = std::move(charges);
237 }
238 
240 PixelChargeCalibCondData::getTot2Charges(unsigned int moduleHash, unsigned int FE) const{
241  auto it = m_tot2Charges.find(moduleHash);
242  if (it != m_tot2Charges.end() && FE < it->second.size()) {
243  return it->second.at(FE);
244  }
245  throw generateError(__func__, moduleHash,FE);
246 }
247 
248 float
249 PixelChargeCalibCondData::getChargeLUTFEI4(unsigned int moduleHash, unsigned int FE, unsigned int ToT) const{
250  if (ToT < 1 || ToT > IBLCalibrationSize) {
251  throw generateError(__func__, moduleHash,FE, ToT);
252  }
253 
254  const IBLCalibration &charges = getTot2Charges(moduleHash,FE);
255  return charges[ToT - 1];
256 }
257 
258 float
259 PixelChargeCalibCondData::getToTLUTFEI4(unsigned int moduleHash, unsigned int FE, float Q) const{
260  int tot = -1;
261  float minDiff = FLT_MAX;
262  for (size_t t = 0; t < IBLCalibrationSize; t++) {
263  float charge = getChargeLUTFEI4(moduleHash, FE, t + 1);
264  float diff = std::fabs(charge - Q);
265  if (diff < minDiff) {
266  minDiff = diff;
267  tot = t + 1;
268  }
269  }
270  return tot;
271 }
xAOD::strategy
strategy
Definition: L2CombinedMuon_v1.cxx:107
PixelChargeCalibCondData::getLegacyFitParameters
PixelChargeCalib::LegacyFitParameters getLegacyFitParameters(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE) const
Definition: PixelChargeCalibCondData.cxx:120
PixelModuleData::getDefaultAnalogThresholdSigma
int getDefaultAnalogThresholdSigma(int barrel_ec, int layer) const
Definition: PixelModuleData.cxx:38
beamspotman.r
def r
Definition: beamspotman.py:676
python.SystemOfUnits.second
int second
Definition: SystemOfUnits.py:120
PixelChargeCalibCondData::getTot2Charges
const IBLCalibration & getTot2Charges(unsigned int moduleHash, unsigned int FE) const
Definition: PixelChargeCalibCondData.cxx:240
PixelChargeCalibCondData::m_thresholds
std::array< std::vector< std::vector< PixelChargeCalib::Thresholds > >, s_NPixelDiodes > m_thresholds
Definition: PixelChargeCalibCondData.h:114
PixelChargeCalibCondData::getToT
float getToT(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE, float Q) const
Definition: PixelChargeCalibCondData.cxx:173
PixelModuleData::getDefaultAnalogThreshold
int getDefaultAnalogThreshold(int barrel_ec, int layer) const
Definition: PixelModuleData.cxx:15
PixelModuleData::getDefaultAnalogThresholdNoise
int getDefaultAnalogThresholdNoise(int barrel_ec, int layer) const
Definition: PixelModuleData.cxx:61
PixelChargeCalib::Resolutions
Definition: ChargeCalibParameters.h:90
PixelModuleData::getDefaultInTimeThreshold
int getDefaultInTimeThreshold(int barrel_ec, int layer) const
Definition: PixelModuleData.cxx:84
PixelChargeCalibCondData::getThresholds
PixelChargeCalib::Thresholds getThresholds(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE) const
Definition: PixelChargeCalibCondData.cxx:99
PixelModuleData
Definition: PixelModuleData.h:22
InDetDD::PixelDiodeType
PixelDiodeType
Definition: PixelReadoutDefinitions.h:20
skel.it
it
Definition: skel.GENtoEVGEN.py:423
mc.diff
diff
Definition: mc.SFGenPy8_MuMu_DD.py:14
athena.value
value
Definition: athena.py:122
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
PixelChargeCalibCondData::getTotRes
float getTotRes(unsigned int moduleHash, unsigned int FE, float Q) const
Definition: PixelChargeCalibCondData.cxx:162
PixelChargeCalibCondData::m_legacyFit
std::array< std::vector< std::vector< PixelChargeCalib::LegacyFitParameters > >, s_NPixelDiodes > m_legacyFit
Definition: PixelChargeCalibCondData.h:115
PixelChargeCalibCondData::setAllFromConfigData
void setAllFromConfigData(unsigned int moduleHash, const PixelModuleData *configData, const std::pair< int, int > &becLayer, unsigned int numFE)
Definition: PixelChargeCalibCondData.cxx:70
PixelChargeCalibCondData::setLinearFitParameters
void setLinearFitParameters(InDetDD::PixelDiodeType type, unsigned int moduleHash, const std::vector< PixelChargeCalib::LinearFitParameters > &parameters)
Definition: PixelChargeCalibCondData.cxx:132
InDetDD::PixelDiodeType::GANGED
@ GANGED
PixelChargeCalib::LegacyFitParameters
Definition: ChargeCalibParameters.h:18
PixelModuleData::getDefaultQ2TotC
float getDefaultQ2TotC() const
Definition: PixelModuleData.cxx:329
PixelChargeCalib::Thresholds
Definition: ChargeCalibParameters.h:73
PixelChargeCalibCondData::m_totRes
std::vector< std::vector< PixelChargeCalib::Resolutions > > m_totRes
Definition: PixelChargeCalibCondData.h:117
PixelChargeCalibCondData::CalibrationStrategy::RUN3PIX
@ RUN3PIX
PixelChargeCalibCondData::setLegacyFitParameters
void setLegacyFitParameters(InDetDD::PixelDiodeType type, unsigned int moduleHash, const std::vector< PixelChargeCalib::LegacyFitParameters > &parameters)
Definition: PixelChargeCalibCondData.cxx:110
PixelChargeCalibCondData::s_NPixelDiodes
constexpr static std::size_t s_NPixelDiodes
Definition: PixelChargeCalibCondData.h:112
PixelChargeCalibCondData::getChargeLUTFEI4
float getChargeLUTFEI4(unsigned int moduleHash, unsigned int FE, unsigned int ToT) const
Definition: PixelChargeCalibCondData.cxx:249
PixelChargeCalibCondData::m_sizeOfHashVector
std::size_t m_sizeOfHashVector
Definition: PixelChargeCalibCondData.h:111
InDetDD::PixelDiodeType::LONG
@ LONG
PixelChargeCalibCondData::PixelChargeCalibCondData
PixelChargeCalibCondData()=default
lumiFormat.i
int i
Definition: lumiFormat.py:92
PixelChargeCalibCondData::m_calibrationStrategy
std::map< int, CalibrationStrategy > m_calibrationStrategy
Definition: PixelChargeCalibCondData.h:120
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
PixelChargeCalibCondData::setThresholds
void setThresholds(InDetDD::PixelDiodeType type, unsigned int moduleHash, const std::vector< PixelChargeCalib::Thresholds > &thresholds)
Definition: PixelChargeCalibCondData.cxx:89
res
std::pair< std::vector< unsigned int >, bool > res
Definition: JetGroupProductTest.cxx:14
PixelChargeCalibCondData::CalibrationStrategy::LUTFEI4
@ LUTFEI4
ChargeCalibrationBundle.h
Struct for holding vectors of charge calibration constants, with utility methods.
PixelChargeCalibCondData::setTot2Charges
void setTot2Charges(unsigned int moduleHash, IBLModule charges)
Definition: PixelChargeCalibCondData.cxx:232
PixelChargeCalibCondData::setCalibrationStrategy
void setCalibrationStrategy(unsigned int moduleHash, CalibrationStrategy strategy)
Definition: PixelChargeCalibCondData.cxx:212
PixelChargeCalibCondData::getCalibrationStrategy
CalibrationStrategy getCalibrationStrategy(unsigned int moduleHash) const
Definition: PixelChargeCalibCondData.cxx:220
PixelChargeCalibCondData::CalibrationStrategy
CalibrationStrategy
Definition: PixelChargeCalibCondData.h:34
InDetDD::enum2uint
constexpr std::size_t enum2uint(T n)
Convert an enum class to size_t for use as an array index.
Definition: PixelReadoutDefinitions.h:38
PixelChargeCalibCondData::m_tot2Charges
std::map< int, IBLModule > m_tot2Charges
Definition: PixelChargeCalibCondData.h:121
LB_AnalMapSplitter.tot
tot
Definition: LB_AnalMapSplitter.py:46
PixelChargeCalib::LinearFitParameters
Definition: ChargeCalibParameters.h:49
PixelChargeCalibCondData::setAllFromBundle
void setAllFromBundle(unsigned int moduleHash, const PixelChargeCalib::ChargeCalibrationBundle &b)
Definition: PixelChargeCalibCondData.cxx:51
PixelChargeCalib::LegacyFitParameters::ToT
float ToT(float Q) const
Return Time-over-threshold given charge Q.
Definition: ChargeCalibParameters.h:33
PixelChargeCalibCondData::IBLModule
std::vector< IBLCalibration > IBLModule
Definition: PixelChargeCalibCondData.h:31
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
charge
double charge(const T &p)
Definition: AtlasPID.h:494
python.PyAthena.v
v
Definition: PyAthena.py:157
PixelChargeCalibCondData::CalibrationStrategy::RUN1PIX
@ RUN1PIX
PixelChargeCalib::LinearFitParameters::Q
float Q(float tot) const
Definition: ChargeCalibParameters.h:68
PixelModuleData::getDefaultQ2TotA
float getDefaultQ2TotA() const
Definition: PixelModuleData.cxx:327
PixelChargeCalibCondData::getLinearFitParameters
PixelChargeCalib::LinearFitParameters getLinearFitParameters(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE) const
Definition: PixelChargeCalibCondData.cxx:143
Thresholds
Definition: LArCalorimeter/LArCalibDataQuality/python/Thresholds.py:1
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
PixelChargeCalib
Definition: IChargeCalibrationParser.h:30
physics_parameters.parameters
parameters
Definition: physics_parameters.py:144
PixelChargeCalibCondData::getCharge
float getCharge(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE, float ToT) const
Definition: PixelChargeCalibCondData.cxx:190
PixelModuleData::getDefaultQ2TotE
float getDefaultQ2TotE() const
Definition: PixelModuleData.cxx:328
PixelModuleData.h
Store pixel constant parameters in PixelModuleData.
PixelChargeCalibCondData::IBLCalibrationSize
static constexpr size_t IBLCalibrationSize
Definition: PixelChargeCalibCondData.h:29
PixelChargeCalib::ChargeCalibrationBundle
bundles of parameters used together in the PixelChargeCalibCondAlg
Definition: ChargeCalibrationBundle.h:24
InDetDD::PixelDiodeType::NORMAL
@ NORMAL
PixelChargeCalib::LegacyFitParameters::Q
float Q(float tot) const
Definition: ChargeCalibParameters.h:40
PixelChargeCalibCondData::getToTLUTFEI4
float getToTLUTFEI4(unsigned int moduleHash, unsigned int FE, float Q) const
Definition: PixelChargeCalibCondData.cxx:259
get_generator_info.error
error
Definition: get_generator_info.py:40
PixelChargeCalibCondData::setTotResolutions
void setTotResolutions(unsigned int moduleHash, const std::vector< PixelChargeCalib::Resolutions > &value)
Definition: PixelChargeCalibCondData.cxx:155
PixelChargeCalibCondData.h
error
Definition: IImpactPoint3dEstimator.h:70
PixelChargeCalibCondData::m_linFit
std::array< std::vector< std::vector< PixelChargeCalib::LinearFitParameters > >, s_NPixelDiodes > m_linFit
Definition: PixelChargeCalibCondData.h:116
PixelChargeCalib::LinearFitParameters::ToT
float ToT(float Q) const
Definition: ChargeCalibParameters.h:62
PixelChargeCalibCondData::IBLCalibration
std::array< float, IBLCalibrationSize > IBLCalibration
Definition: PixelChargeCalibCondData.h:30