ATLAS Offline Software
PixelChargeLUTCalibCondAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "GaudiKernel/EventIDRange.h"
11 #include "PixelConditionsData/PixelChargeCalibUtils.h" //getBecAndLayer
13 #include "LUTChargeCalibParser.h"
14 
15 #include <nlohmann/json.hpp>
17 
18 #include <fstream>
19 #include <stdexcept>
20 #include <memory>
21 #include <sstream>
22 
23 
24 using namespace PixelChargeCalib; //containing LegacyFitParameters etc
25 
26 using InDetDD::enum2uint;
27 namespace{
28  constexpr int halfModuleThreshold{8};
29 } // namespace
30 
31 
32 PixelChargeLUTCalibCondAlg::PixelChargeLUTCalibCondAlg(const std::string& name, ISvcLocator* pSvcLocator):
33  ::AthReentrantAlgorithm(name, pSvcLocator){
34 }
35 
37  ATH_MSG_DEBUG("PixelChargeLUTCalibCondAlg::initialize()");
43  return StatusCode::SUCCESS;
44 }
45 
46 StatusCode PixelChargeLUTCalibCondAlg::execute(const EventContext& ctx) const {
47  ATH_MSG_DEBUG("PixelChargeLUTCalibCondAlg::execute()");
48 
50  if (writeHandle.isValid()) {
51  ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid.. In theory this should not be called, but may happen if multiple concurrent events are being processed out of order.");
52  return StatusCode::SUCCESS;
53  }
54 
56  const InDetDD::SiDetectorElementCollection* elements(*pixelDetEleHandle);
57  if (not pixelDetEleHandle.isValid() or elements==nullptr) {
58  ATH_MSG_FATAL(m_pixelDetEleCollKey.fullKey() << " is not available.");
59  return StatusCode::FAILURE;
60  }
61 
64 
65  SG::ReadCondHandle<PixelModuleData> configDataHandle(m_configKey, ctx);
66  const PixelModuleData *configData = *configDataHandle;
67 
68  // Construct the output Cond Object and fill it in
69  std::unique_ptr<PixelChargeCalibCondData> writeCdo(std::make_unique<PixelChargeCalibCondData>(m_pixelID->wafer_hash_max()));
70 
71  const EventIDBase start{EventIDBase::UNDEFNUM, EventIDBase::UNDEFEVT, 0, 0, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM};
72  const EventIDBase stop {EventIDBase::UNDEFNUM, EventIDBase::UNDEFEVT, EventIDBase::UNDEFNUM-1, EventIDBase::UNDEFNUM-1, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM};
73 
74  EventIDRange rangeW{start, stop};
75  if (!m_readKey.empty()) {
77  const CondAttrListCollection* readCdo = *readHandle;
78  if (readCdo==nullptr) {
79  ATH_MSG_FATAL("Null pointer to the read conditions object");
80  return StatusCode::FAILURE;
81  }
82  // Get the validitiy range
83  if (not readHandle.range(rangeW)) {
84  ATH_MSG_FATAL("Failed to retrieve validity range for " << readHandle.key());
85  return StatusCode::FAILURE;
86  }
87  ATH_MSG_INFO("Size of CondAttrListCollection " << readHandle.fullKey() << " readCdo->size()= " << readCdo->size());
88  ATH_MSG_INFO("Range of input is " << rangeW);
89  std::unique_ptr<IChargeCalibrationParser> pParser{};
90 
91  for (const auto & attrList : *readCdo) {
92  const CondAttrListCollection::AttributeList &payload = attrList.second;
93 
94  // RUN-3 format
95  if (payload.exists("data_array") and not payload["data_array"].isNull()) {
96  ATH_MSG_DEBUG("Using LUTChargeCalibParser");
97  pParser = std::make_unique<LUTChargeCalibParser>(configData, elements, m_pixelID);
98  std::string fileName = PathResolver::find_file(m_jsonFileName, "DATAPATH");
99  if (m_inputSource == 2 && fileName.empty()) {
100  ATH_MSG_FATAL("Input file" << fileName << " not found! Change the inputSource!");
101  return StatusCode::FAILURE;
102  }
103  std::ifstream infile(fileName.c_str());
104  //Read the contents of the text file into a string
105  std::string fileContent((std::istreambuf_iterator<char>(infile)), std::istreambuf_iterator<char>());
106  const nlohmann::json & jsonData = (m_inputSource == 0 || m_inputSource == 1) ?
107  nlohmann::json::parse(payload["data_array"].data<std::string>()) :
108  nlohmann::json::parse(fileContent);
109  for (const auto &[hash, data] : jsonData.items()) {
110  const unsigned int moduleHash = std::stoul(hash);
111  IdentifierHash wafer_hash = IdentifierHash(moduleHash);
112  const InDetDD::SiDetectorElement *element = elements->getDetectorElement(wafer_hash);
113  const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
114  const ChargeCalibrationBundle & b = pParser->parse(moduleHash, data, m_inputSource);
115  if (not b.isValid){
116  ATH_MSG_FATAL("Parsing failed");
117  return StatusCode::FAILURE;
118  }
119  // Special calibration
120  if (!b.tot2Charges.empty()) {
121  writeCdo -> setTot2Charges(moduleHash, b.tot2Charges);
122  }
123  //calibration strategy
124  writeCdo -> setAllFromBundle(moduleHash, b);
125 
126  // Ganged/large pixel
128  writeCdo -> setThresholds(InDetDD::PixelDiodeType::LARGE, moduleHash, b.thresholdGanged);
129  writeCdo -> setLegacyFitParameters(InDetDD::PixelDiodeType::LARGE, moduleHash, b.paramsGanged); //uses the ganged answer
130  writeCdo -> setLinearFitParameters(InDetDD::PixelDiodeType::LARGE, moduleHash, b.linGanged);
131  } else {
132  writeCdo -> setThresholds(InDetDD::PixelDiodeType::GANGED, moduleHash, b.thresholdGanged);
133  writeCdo -> setLegacyFitParameters(InDetDD::PixelDiodeType::GANGED, moduleHash, b.paramsGanged);
134  writeCdo -> setLinearFitParameters(InDetDD::PixelDiodeType::GANGED, moduleHash, b.linGanged);
135  }
136  }
137  }
138  }
139  } else {
140  for (unsigned int moduleHash{}; moduleHash < m_pixelID->wafer_hash_max(); moduleHash++) {
141  const auto & becLayer = getBecAndLayer(m_pixelID, moduleHash);
142  IdentifierHash wafer_hash = IdentifierHash(moduleHash);
143  const InDetDD::SiDetectorElement *element = elements->getDetectorElement(wafer_hash);
144  const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
145  unsigned int numFE = p_design->numberOfCircuits() < halfModuleThreshold ? p_design->numberOfCircuits() : 2 * p_design->numberOfCircuits();
146  writeCdo -> setAllFromConfigData(moduleHash, configData, becLayer, numFE);
147  }
148  }
149 
150  // Scan over if the DB contents need to be overwritten.
151  // This is useful for threshold study. So far only threshold value.
152  for (unsigned int moduleHash{}; moduleHash < m_pixelID->wafer_hash_max(); moduleHash++) {
153  IdentifierHash wafer_hash = IdentifierHash(moduleHash);
154  Identifier wafer_id = m_pixelID->wafer_id(wafer_hash);
155  int barrel_ec = m_pixelID->barrel_ec(wafer_id);
156  int layer = m_pixelID->layer_disk(wafer_id);
157  const InDetDD::SiDetectorElement *element = elements->getDetectorElement(wafer_hash);
158  const InDetDD::PixelModuleDesign *p_design = static_cast<const InDetDD::PixelModuleDesign*>(&element->design());
159  // in some cases numberOfCircuits returns FEs per half-module
160  unsigned int numFE = p_design->numberOfCircuits() < halfModuleThreshold ? p_design->numberOfCircuits() : 2 * p_design->numberOfCircuits();
161  Thresholds defaults{configData->getDefaultAnalogThreshold(barrel_ec, layer), configData->getDefaultAnalogThresholdSigma(barrel_ec, layer),
162  configData->getDefaultAnalogThresholdNoise(barrel_ec, layer), configData->getDefaultInTimeThreshold(barrel_ec, layer)};
163  if (defaults.value > -0.1) {
164  for (InDetDD::PixelDiodeType type : diodeTypes) {
165  writeCdo -> setThresholds(type, moduleHash, std::vector<Thresholds>(numFE, defaults));
166  }
167  }
168  }
169 
170  if (writeHandle.record(rangeW, std::move(writeCdo)).isFailure()) {
171  ATH_MSG_FATAL("Could not record PixelChargeCalibCondData " << writeHandle.key() << " with EventRange " << rangeW << " into Conditions Store");
172  return StatusCode::FAILURE;
173  }
174  ATH_MSG_INFO("recorded new CDO " << writeHandle.key() << " with range " << rangeW << " into Conditions Store");
175 
176  return StatusCode::SUCCESS;
177 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
PixelModuleData::getDefaultAnalogThresholdSigma
int getDefaultAnalogThresholdSigma(int barrel_ec, int layer) const
Definition: PixelModuleData.cxx:38
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
PixelModuleData::getDefaultAnalogThreshold
int getDefaultAnalogThreshold(int barrel_ec, int layer) const
Definition: PixelModuleData.cxx:15
run.infile
string infile
Definition: run.py:13
SG::ReadCondHandle::fullKey
const DataObjID & fullKey() const
Definition: ReadCondHandle.h:60
PixelModuleData::getDefaultAnalogThresholdNoise
int getDefaultAnalogThresholdNoise(int barrel_ec, int layer) const
Definition: PixelModuleData.cxx:61
InDetDD::SiDetectorElementCollection
Definition: SiDetectorElementCollection.h:30
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
PixelChargeLUTCalibCondAlg::m_writeKey
SG::WriteCondHandleKey< PixelChargeCalibCondData > m_writeKey
Definition: PixelChargeLUTCalibCondAlg.h:52
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path, SearchType search_type=LocalSearch)
Definition: PathResolver.cxx:251
InDetDD::PixelModuleDesign
Definition: PixelModuleDesign.h:48
json
nlohmann::json json
Definition: HistogramDef.cxx:9
PixelModuleData::getDefaultInTimeThreshold
int getDefaultInTimeThreshold(int barrel_ec, int layer) const
Definition: PixelModuleData.cxx:84
PixelID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: PixelID.h:619
PixelChargeCalib::getBecAndLayer
std::pair< int, int > getBecAndLayer(const PixelID *pPixelId, IdentifierHash hash)
Definition: PixelChargeCalibUtils.cxx:13
PixelModuleData
Definition: PixelModuleData.h:22
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:14
parse
std::map< std::string, std::string > parse(const std::string &list)
Definition: egammaLayerRecalibTool.cxx:983
InDetDD::PixelDiodeType
PixelDiodeType
Definition: PixelReadoutDefinitions.h:20
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:205
PixelModuleFeMask_create_db.stop
int stop
Definition: PixelModuleFeMask_create_db.py:76
SG::ReadCondHandle::range
bool range(EventIDRange &r)
Definition: ReadCondHandle.h:223
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
SG::WriteCondHandle::record
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
Definition: WriteCondHandle.h:157
CondAttrListCollection
This class is a collection of AttributeLists where each one is associated with a channel number....
Definition: CondAttrListCollection.h:52
InDetDD::PixelDiodeType::GANGED
@ GANGED
PixelID::wafer_id
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
Definition: PixelID.h:364
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
InDetDD::PixelDiodeType::N_DIODETYPES
@ N_DIODETYPES
InDetDD::PixelReadoutTechnology::RD53
@ RD53
PixelChargeLUTCalibCondAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override final
Definition: PixelChargeLUTCalibCondAlg.cxx:46
FortranAlgorithmOptions.fileName
fileName
Definition: FortranAlgorithmOptions.py:13
SG::WriteCondHandle::fullKey
const DataObjID & fullKey() const
Definition: WriteCondHandle.h:41
PixelChargeLUTCalibCondAlg::m_pixelIDName
Gaudi::Property< std::string > m_pixelIDName
Definition: PixelChargeLUTCalibCondAlg.h:40
InDetDD::PixelDiodeType::LONG
@ LONG
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
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
InDetDD::PixelModuleDesign::numberOfCircuits
int numberOfCircuits() const
Total number of circuits:
Definition: PixelModuleDesign.h:297
ChargeCalibrationBundle.h
Struct for holding vectors of charge calibration constants, with utility methods.
PixelChargeLUTCalibCondAlg::m_jsonFileName
Gaudi::Property< std::string > m_jsonFileName
Definition: PixelChargeLUTCalibCondAlg.h:56
InDetDD::PixelDiodeType::LARGE
@ LARGE
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
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
PixelChargeCalibUtils.h
PixelChargeLUTCalibCondAlg::initialize
virtual StatusCode initialize() override final
Definition: PixelChargeLUTCalibCondAlg.cxx:36
PixelChargeLUTCalibCondAlg.h
PixelChargeLUTCalibCondAlg::m_configKey
SG::ReadCondHandleKey< PixelModuleData > m_configKey
Definition: PixelChargeLUTCalibCondAlg.h:46
lumiFormat.array
array
Definition: lumiFormat.py:98
PixelID::layer_disk
int layer_disk(const Identifier &id) const
Definition: PixelID.h:626
PathResolver.h
PixelChargeLUTCalibCondAlg::m_readKey
SG::ReadCondHandleKey< CondAttrListCollection > m_readKey
Definition: PixelChargeLUTCalibCondAlg.h:49
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
SG::WriteCondHandle::key
const std::string & key() const
Definition: WriteCondHandle.h:40
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
IdentifierHash.h
PixelChargeLUTCalibCondAlg::m_pixelDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_pixelDetEleCollKey
Definition: PixelChargeLUTCalibCondAlg.h:43
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
PixelID::wafer_hash_max
size_type wafer_hash_max(void) const
Definition: PixelID.cxx:912
Base_Fragment.defaults
dictionary defaults
This includes now the top quark, the leptons and the bosons.
Definition: GeneratorFilters/share/common/Base_Fragment.py:79
InDetDD::PixelModuleDesign::getReadoutTechnology
PixelReadoutTechnology getReadoutTechnology() const
Definition: PixelModuleDesign.h:368
CondAttrListCollection::size
size_type size() const
number of Chan/AttributeList pairs
Definition: CondAttrListCollection.h:322
SiDetectorElement.h
PixelModuleFeMask_create_db.payload
string payload
Definition: PixelModuleFeMask_create_db.py:69
PixelChargeLUTCalibCondAlg::m_pixelID
const PixelID * m_pixelID
Definition: PixelChargeLUTCalibCondAlg.h:38
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
PixelModuleDesign.h
Thresholds
Definition: LArCalorimeter/LArCalibDataQuality/python/Thresholds.py:1
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
SG::WriteCondHandle::isValid
bool isValid() const
Definition: WriteCondHandle.h:248
PixelChargeCalib
Definition: IChargeCalibrationParser.h:30
PixelChargeLUTCalibCondAlg::PixelChargeLUTCalibCondAlg
PixelChargeLUTCalibCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: PixelChargeLUTCalibCondAlg.cxx:32
PixelChargeCalib::ChargeCalibrationBundle
bundles of parameters used together in the PixelChargeCalibCondAlg
Definition: ChargeCalibrationBundle.h:24
CondAttrListCollection::AttributeList
coral::AttributeList AttributeList
Definition: CondAttrListCollection.h:56
InDetDD::PixelDiodeType::NORMAL
@ NORMAL
PixelChargeLUTCalibCondAlg::m_inputSource
Gaudi::Property< int > m_inputSource
Definition: PixelChargeLUTCalibCondAlg.h:55
IChargeCalibrationParser.h
Interface to parsers which accept a string or json object and return a ChargeCalibrationBundle.
LUTChargeCalibParser.h
Parses a database run4 Look-Up-Table format string to a ChargeCalibrationBundle.
SG::ReadCondHandle::key
const std::string & key() const
Definition: ReadCondHandle.h:59
InDetDD::SiDetectorElement::design
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
SG::AllowEmpty
@ AllowEmpty
Definition: StoreGate/StoreGate/VarHandleKey.h:30
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
InDetDD::SiDetectorElementCollection::getDetectorElement
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Definition: SiDetectorElementCollection.cxx:15