ATLAS Offline Software
LUTChargeCalibParser.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 #include "LUTChargeCalibParser.h"
6 #include "Identifier/Identifier.h"
12 
13 namespace{
14  constexpr size_t FEStringSize{20};
15 } // namespace
16 
19 
20 namespace PixelChargeCalib{
21 
22  ChargeCalibrationBundle
23  LUTChargeCalibParser::parseImpl(unsigned int moduleHash, const nlohmann::json & data, int inputSource){
24  IdentifierHash wafer_hash = IdentifierHash(moduleHash);
25  const InDetDD::SiDetectorElement *element = m_elements->getDetectorElement(wafer_hash);
26  const auto & [numFE, technology] = numChipsAndTechnology(element);
27  bool isLUTEnabled = (inputSource == 1);
28  bool isChargeCalibrationFromJson = (inputSource == 2);
29  //
30  ChargeCalibrationBundle b(numFE,isLUTEnabled,isChargeCalibrationFromJson);
31  //
32  for (unsigned int j{}; j < numFE; j++) {
33  //Retrieve calibArrays in different formats for Run4 (based on ITKPixV2 chip settings) and Run3
34  const auto &calibArray = (isLUTEnabled || isChargeCalibrationFromJson) ? data.at(0) : data.at(j);
35  if (!calibArray.empty()) {
36  // new charge calibration for RUN-3
37  if ((technology == InDetDD::PixelReadoutTechnology::FEI4 && !(element->isDBM())) || ((b.useLUT || b.useTXT) && technology == InDetDD::PixelReadoutTechnology::RD53)) {
38  if (calibArray.size() != FEStringSize) {
39  std::cout<<"Parameter size is not consistent(" << FEStringSize << ") " << calibArray.size() << " at (i,j)=(" << moduleHash << "," << j << ")\n";
40  b.isValid = false;
41  return b;
42  }
43  auto getInt = getFunc<int>(calibArray);
44  auto getFloat = getFunc<float>(calibArray);
45  auto &charges = b.tot2Charges.emplace_back(PixelChargeCalibCondData::IBLCalibration());
46  for (size_t k{}; k < PixelChargeCalibCondData::IBLCalibrationSize; k++) {
47  charges[k] = getFloat(k + 4ul);
48  }
50  b.threshold.emplace_back(getInt(0), 0.f, getInt(1), 0.f);
51  b.thresholdLong.emplace_back(getInt(2), 0.f, getInt(3), 0.f);
52  b.thresholdGanged.emplace_back(getInt(2), 0.f, getInt(3), 0.f);
53  b.params.emplace_back(0.f, 0.f, 0.f);
54  b.paramsGanged.emplace_back(0.f, 0.f, 0.f);
55  b.totRes.emplace_back(0.f, 0.f);
56  } else { //normal CalibrationStrategy
57  if (calibArray.size() != FEStringSize) {
58  std::cout<<"Parameter size is not consistent(" << FEStringSize << ") " << calibArray.size() << " at (i,j)=(" << moduleHash << "," << j << ")\n";
59  b.isValid = false;
60  return b;
61  }
62  auto getInt = getFunc<int>(calibArray);
63  auto getFloat = getFunc<float>(calibArray);
64  b.threshold.emplace_back(getInt(0), getInt(1), getInt(2), getInt(3));
65  b.thresholdLong.emplace_back(getInt(4), getInt(5), getInt(6), getInt(7));
66  b.thresholdGanged.emplace_back(getInt(8), getInt(9), getInt(10), getInt(11));
67  b.params.emplace_back(getFloat(12), getFloat(13), getFloat(14));
68  b.paramsGanged.emplace_back(getFloat(15), getFloat(16), getFloat(17));
69  b.totRes.emplace_back(getFloat(18), getFloat(19));
70 
71  // Linear extrapolation above large charge
74  const auto & [barrel_ec, layer] = getBecAndLayer(m_pixelID, wafer_hash);
75  // search for ToT when charge exceeds threshold
76  if (!(element->isDBM())) {
77  //charge threshold beyond which linear fit will be used
78  const int totIdxStart = m_configData->getToTThreshold(barrel_ec,layer);
79  const int totIdxEnd = m_configData->getFEI3Latency(barrel_ec,layer);
80  // Normal pixels
81  int totlimit = b.idxAtChargeLimit(m_chargeLimit, InDetDD::PixelDiodeType::NORMAL, totIdxStart, totIdxEnd);
82  b.insertLinearParams( InDetDD::PixelDiodeType::NORMAL, totlimit);
83  // Ganged pixels
84  totlimit = b.idxAtChargeLimit(m_chargeLimit, InDetDD::PixelDiodeType::GANGED, totIdxStart, totIdxEnd);
85  b.insertLinearParams( InDetDD::PixelDiodeType::GANGED, totlimit);
86  } else { // DBM
87  b.lin.emplace_back(0.f, 0.f);
88  b.linGanged.emplace_back(0.f, 0.f);
89  }
90  } else {
92  b.lin.emplace_back(0.f, 0.f);
93  b.linGanged.emplace_back(0.f, 0.f);
94  }
95  }
96  } else {
97  std::cout<<"Array size is zero in " << calibArray << " at (i,j)=(" << moduleHash << "," << j << ")\n";
98  b.isValid = false;
99  return b;
100  }
101  }
102  return b;
103  }
104 }
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
json
nlohmann::json json
Definition: HistogramDef.cxx:9
PixelModuleData::getPIXLinearExtrapolation
bool getPIXLinearExtrapolation() const
Definition: PixelModuleData.cxx:332
PixelChargeCalib::getBecAndLayer
std::pair< int, int > getBecAndLayer(const PixelID *pPixelId, IdentifierHash hash)
Definition: PixelChargeCalibUtils.cxx:13
PixelChargeCalib::numChipsAndTechnology
std::pair< size_t, InDetDD::PixelReadoutTechnology > numChipsAndTechnology(const InDetDD::SiDetectorElement *element)
Definition: PixelChargeCalibUtils.cxx:19
InDetDD::PixelDiodeType::GANGED
@ GANGED
PixelChargeCalib::LUTChargeCalibParser::parseImpl
virtual ChargeCalibrationBundle parseImpl(unsigned int moduleHash, const nlohmann::json &data, int inputSource) override final
Definition: LUTChargeCalibParser.cxx:23
PixelModuleData::getToTThreshold
int getToTThreshold(int barrel_ec, int layer) const
Definition: PixelModuleData.cxx:107
InDetDD::PixelReadoutTechnology::RD53
@ RD53
PixelChargeCalibCondData::CalibrationStrategy::RUN3PIX
@ RUN3PIX
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
PixelChargeCalibCondData::CalibrationStrategy::LUTFEI4
@ LUTFEI4
ChargeCalibrationBundle.h
Struct for holding vectors of charge calibration constants, with utility methods.
PixelChargeCalib::IChargeCalibrationParser::m_configData
const PixelModuleData * m_configData
Definition: IChargeCalibrationParser.h:51
hist_file_dump.f
f
Definition: hist_file_dump.py:135
detail::ul
unsigned long ul
Definition: PrimitiveHelpers.h:45
PixelModuleData::getFEI3Latency
int getFEI3Latency(int barrel_ec, int layer) const
Definition: PixelModuleData.cxx:238
PixelChargeCalibUtils.h
PixelChargeCalib::IChargeCalibrationParser::m_chargeLimit
static constexpr float m_chargeLimit
If the calculated charge exceeds this limit, a linear extrapolation is used at this point.
Definition: IChargeCalibrationParser.h:55
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
IdentifierHash.h
PixelChargeCalib::IChargeCalibrationParser::m_elements
const InDetDD::SiDetectorElementCollection * m_elements
Definition: IChargeCalibrationParser.h:52
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
InDetDD::PixelReadoutTechnology::FEI4
@ FEI4
SiDetectorElement.h
PixelChargeCalib::IChargeCalibrationParser::m_pixelID
const PixelID * m_pixelID
Definition: IChargeCalibrationParser.h:53
PixelChargeCalibCondData::CalibrationStrategy::RUN1PIX
@ RUN1PIX
PixelModuleDesign.h
InDetDD::SiDetectorElement::isDBM
bool isDBM() const
PixelChargeCalib
Definition: IChargeCalibrationParser.h:30
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
LUTChargeCalibParser.h
Parses a database run4 Look-Up-Table format string to a ChargeCalibrationBundle.
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
InDetDD::SiDetectorElementCollection::getDetectorElement
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Definition: SiDetectorElementCollection.cxx:15
fitman.k
k
Definition: fitman.py:528
PixelChargeCalibCondData::IBLCalibration
std::array< float, IBLCalibrationSize > IBLCalibration
Definition: PixelChargeCalibCondData.h:30