ATLAS Offline Software
Loading...
Searching...
No Matches
Run3ChargeCalibParser.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
6#include "Identifier/Identifier.h"
12
15
16namespace{
17 constexpr size_t FEStringSize{21};
18} // namespace
19
20
21namespace PixelChargeCalib{
23 Run3ChargeCalibParser::parseImpl(unsigned int moduleHash, const nlohmann::json & data){
24 IdentifierHash wafer_hash = IdentifierHash(moduleHash);
25 const InDetDD::SiDetectorElement *element = m_elements->getDetectorElement(wafer_hash);
26 const auto & [numFE, technology] = numChipsAndTechnology(element);
27 //
29 //
30 for (unsigned int j{}; j < numFE; j++) {
31 const auto &calibArray = data.at(j);
32 if (!calibArray.empty()) {
33 // conventional calibration
34 if (calibArray.size() != FEStringSize-1) {
35 std::cout<<"Parameter size is not consistent(" << FEStringSize << ") " << calibArray.size() << " at (i,j)=(" << moduleHash << "," << j << ")\n";
36 b.isValid = false;
37 return b;
38 }
39 auto getInt = getFunc<int>(calibArray);
40 auto getFloat = getFunc<float>(calibArray);
41 b.threshold.emplace_back(getInt(0), getInt(1), getInt(2), getInt(3));
42 b.thresholdLong.emplace_back(getInt(4), getInt(5), getInt(6), getInt(7));
43 b.thresholdGanged.emplace_back(getInt(8), getInt(9), getInt(10), getInt(11));
44 b.params.emplace_back(getFloat(12), getFloat(13), getFloat(14), LegacyFitParameters::defaultOverflow);
45 b.paramsGanged.emplace_back(getFloat(15), getFloat(16), getFloat(17), LegacyFitParameters::defaultOverflow);
46 b.totRes.emplace_back(getFloat(18), getFloat(19));
47
48 // Linear extrapolation above large charge
49 if (m_configData->getPIXLinearExtrapolation() && technology==InDetDD::PixelReadoutTechnology::FEI3) {
51 const auto & [barrel_ec, layer] = getBecAndLayer(m_pixelID, wafer_hash);
52 // search for ToT when charge exceeds threshold
53 if (!(element->isDBM())) {
54 //charge threshold beyond which linear fit will be used
55 const int totIdxStart = m_configData->getToTThreshold(barrel_ec,layer);
56 const int totIdxEnd = m_configData->getFEI3Latency(barrel_ec,layer);
57 // Normal pixels
58 int totlimit = b.idxAtChargeLimit(m_chargeLimit, InDetDD::PixelDiodeType::NORMAL, totIdxStart, totIdxEnd);
59 b.insertLinearParams( InDetDD::PixelDiodeType::NORMAL, totlimit);
60 // Ganged pixels
61 totlimit = b.idxAtChargeLimit(m_chargeLimit, InDetDD::PixelDiodeType::GANGED, totIdxStart, totIdxEnd);
62 b.insertLinearParams( InDetDD::PixelDiodeType::GANGED, totlimit);
63 } else { // DBM
64 b.lin.emplace_back(0.f, 0.f);
65 b.linGanged.emplace_back(0.f, 0.f);
66 }
67 } else {
68 b.lin.emplace_back(0.f, 0.f);
69 b.linGanged.emplace_back(0.f, 0.f);
70 }
71 } else {
72 std::cout<<"Array size is zero in " << calibArray << " at (i,j)=(" << moduleHash << "," << j << ")\n";
73 b.isValid = false;
74 return b;
75 }
76 }
77 return b;
78 }
79}
Struct for holding vectors of charge calibration constants, with utility methods.
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
Store pixel constant parameters in PixelModuleData.
Parses a database run3 format string to a ChargeCalibrationBundle.
This is a "hash" representation of an Identifier.
Class to hold geometrical description of a silicon detector element.
std::function< T(size_t)> getFunc(const std::vector< std::string > &data)
Return function converting a string to number type T at index i of data vector.
static constexpr float m_chargeLimit
If the calculated charge exceeds this limit, a linear extrapolation is used at this point.
const InDetDD::SiDetectorElementCollection * m_elements
virtual ChargeCalibrationBundle parseImpl(unsigned int moduleHash, const nlohmann::json &data) override final
std::pair< size_t, InDetDD::PixelReadoutTechnology > numChipsAndTechnology(const InDetDD::SiDetectorElement *element)
std::pair< int, int > getBecAndLayer(const PixelID *pPixelId, IdentifierHash hash)
bundles of parameters used together in the PixelChargeCalibCondAlg