ATLAS Offline Software
Loading...
Searching...
No Matches
Run2ChargeCalibParser.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
9#include "PixelConditionsData/PixelChargeCalibUtils.h" //for getBecAndLayer
10
11
12
13namespace{
14 constexpr size_t FEStringSize{21};
15} // namespace
16
19
20namespace PixelChargeCalib{
22 Run2ChargeCalibParser::parseImpl(unsigned int moduleHash, const std::string & data){
23 IdentifierHash wafer_hash = IdentifierHash(moduleHash);
24 const InDetDD::SiDetectorElement *element = m_elements->getDetectorElement(wafer_hash);
25 const auto & [numChips, technology] = PixelChargeCalib::numChipsAndTechnology(element);
26 //
27 std::stringstream ss(data);
28 std::vector<std::string> component;
29 std::string buffer;
30 std::getline(ss, buffer, '\n'); // skip first line
31 while (std::getline(ss, buffer, '\n')) { component.push_back(buffer); }
32 const size_t numFE = component.size();
33 if (numFE != numChips){
34 std::cout << "Warning that the number of chips in the DB string and the number of chips according to readout technology are not equal\n";
35 }
36 //
38 //
39 // loop over FEs
40 for (size_t i{}; i < numFE; i++) {
41 std::stringstream checkFE(component[i]);
42 std::vector<std::string> FEString;
43 while (std::getline(checkFE, buffer, ' ')) { FEString.push_back(buffer); }
44
45 if (FEString.size() < FEStringSize) {
46 b.isValid=false;
47 return b;
48 }
49
50 auto getInt = getFunc<int>(FEString);
51 auto getFloat = getFunc<float>(FEString);
52 //
53 b.threshold.emplace_back(getInt(1), getInt(2), getInt(3), getInt(4));
54 b.thresholdLong.emplace_back(getInt(5), getInt(6), getInt(7), getInt(8));
55 b.thresholdGanged.emplace_back(getInt(9), getInt(10), getInt(11), getInt(12));
56 b.params.emplace_back(getFloat(13), getFloat(14), getFloat(15), LegacyFitParameters::defaultOverflow);
57 b.paramsGanged.emplace_back(getFloat(16), getFloat(17), getFloat(18), LegacyFitParameters::defaultOverflow);
58 b.totRes.emplace_back(getFloat(19), getFloat(20));
59
60 // Linear extrapolation above large charge
61 if (m_configData->getPIXLinearExtrapolation() && technology==InDetDD::PixelReadoutTechnology::FEI3) {
63 const auto & [barrel_ec, layer] = getBecAndLayer(m_pixelID, wafer_hash);
64 // search for ToT when charge exceeds threshold
65 int totlimit = -1;
66 int start = m_configData->getToTThreshold(barrel_ec,layer);
67 int end = m_configData->getFEI3Latency(barrel_ec,layer);
68 // Normal pixels
69 totlimit = b.idxAtChargeLimit(m_chargeLimit, InDetDD::PixelDiodeType::NORMAL, start, end);
70 b.insertLinearParams(InDetDD::PixelDiodeType::NORMAL, totlimit);
71 // Ganged pixels
72 totlimit = b.idxAtChargeLimit(m_chargeLimit, InDetDD::PixelDiodeType::GANGED, start, end);
73 b.insertLinearParams(InDetDD::PixelDiodeType::GANGED, totlimit);
74 } else {
75 b.lin.emplace_back(0.f, 0.f);
76 b.linGanged.emplace_back(0.f, 0.f);
77 }
78 }
79 return b;
80 }
81}
Struct for holding vectors of charge calibration constants, with utility methods.
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static Double_t ss
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 hash, const std::string &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