ATLAS Offline Software
Loading...
Searching...
No Matches
jFEXCondAlgo.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4//***************************************************************************
5// Interface for jFEXCondAlgo - Tool to read the COOL DB for jFEX
6// -------------------
7// begin : 01 08 2023
8// email : Sergi.Rodriguez@cern.ch
9//***************************************************************************
10#include "jFEXCondAlgo.h"
11#include "nlohmann/json.hpp"
12#include "CoralBase/Blob.h"
14
15
16#include "jFEXCoolDBDefaults.h"
17
18
19
20#include <fstream>
21
23
24namespace LVL1 {
25
26//Default Constructor
27jFEXCondAlgo::jFEXCondAlgo(const std::string& name, ISvcLocator* svc) : AthCondAlgorithm(name, svc){}
28
30
31 ATH_MSG_INFO("Loading jFEX parameters from DB");
32
36 ATH_CHECK( m_jFEXDBParamsKey.initialize() );
37
38 return StatusCode::SUCCESS;
39}
40
41
42StatusCode jFEXCondAlgo::execute(const EventContext& ctx) const {
43
44
45 // Construct the output Cond Object and fill it in
46 std::unique_ptr<jFEXDBCondData> writeDBTool(std::make_unique<jFEXDBCondData>() );
47
48 //Write handle
50 if (writeCHandle.isValid()) {
51 ATH_MSG_DEBUG("Existing jfex condition data is still valid");
52 return StatusCode::SUCCESS;
53 }
54
55 // Date from which jFEX database parameters should be used (MC should always use DB)
56 // PU fix: 2023-10-27
57 bool validTimeStamp = (ctx.eventID().time_stamp() < m_dbBeginTimestamp) ? false : true;
58 if (m_isMC)
59 validTimeStamp = true;
60
61 // Set DB to false if any of keys not provided
62 bool anyKeyEmpty = ( m_JfexModuleSettingsKey.empty() || m_JfexNoiseCutsKey.empty() || m_JfexSystemSettingsKey.empty() );
63
64 bool useDBparams = (!anyKeyEmpty && validTimeStamp);
65
66 /***************************************/
67 /* */
68 /* Jet calibration Parameters */
69 /* */
70 /***************************************/
71 std::vector<std::vector<int>> jJCalibParams(6, std::vector<int>(25, 0)); //6 modules, up to 25 calib factors
72
73 if(!m_JfexModuleSettingsKey.empty() && useDBparams){
74 SG::ReadCondHandle <CondAttrListCollection> load_jFexModuleSet{m_JfexModuleSettingsKey, ctx };
75
76 // we should check if it is valid and the size is 6 (corresponding to the 6 jfex modules)
77 if (load_jFexModuleSet.isValid() and load_jFexModuleSet->size() == 6) {
78
79 //setting the validity
80 writeCHandle.addDependency(load_jFexModuleSet);
81
82 unsigned int mod = 0;
83 for (auto itr = load_jFexModuleSet->begin(); itr != load_jFexModuleSet->end(); ++itr) {
84
85 const coral::Blob& blob = (itr->second["json"]).data<coral::Blob>();
86 const std::string s((char*)blob.startingAddress(),blob.size());
87 nlohmann::json attrList = nlohmann::json::parse(s);
88
89 if(attrList["JetCalib"] == nullptr) {
90 ATH_MSG_ERROR("Not loaded jFEX JetCalib from "<<m_JfexModuleSettingsKey);
91 return StatusCode::FAILURE;
92 }
93
94 const std::vector<int> v_tmp(attrList["JetCalib"]);
95 if ( not(v_tmp.size() == 9 || v_tmp.size() == 8 || v_tmp.size() == 25 ) ){ //9 ET bins (before 2024), 8 (ctrl) / 25 (fwd) eta bins (from 2024 on)
96 ATH_MSG_ERROR("Not loaded jFEX JetCalib from "<<m_JfexModuleSettingsKey<<" (unexpected size: "<<v_tmp.size()<<")");
97 return StatusCode::FAILURE;
98 }
99
100 jJCalibParams[mod] = std::move(v_tmp);
101 mod++;
102 }
103
104 }
105 else{
106 ATH_MSG_ERROR("Values from "<<m_JfexModuleSettingsKey<< " not loaded. Wrong key?");
107 return StatusCode::FAILURE;
108 }
109 }
110 else{
111
112 // LOADING default values!
113 for(unsigned int fex=0; fex<6; fex++){
114 for(unsigned int range=0; range<25; range++){
115 jJCalibParams[fex][range] = jDBdefaults::jJCalibParams[fex][range];
116 }
117 }
118 }
119
120 writeDBTool->set_jJCalibParam(jJCalibParams);
121
122
123 /***************************************/
124 /* */
125 /* System Settings Parameters */
126 /* */
127 /***************************************/
128
129 // Loading defaults
130 bool PileUpCorrectionJet = jDBdefaults::PileUpCorrectionJet;
131 bool PileUpCorrectionMET = jDBdefaults::PileUpCorrectionMET;
132 int PileUpThresholdLowEm = jDBdefaults::PileUpThresholdLowEm;
133 int PileUpThresholdHighEm = jDBdefaults::PileUpThresholdHighEm;
134 int PileUpThresholdLowHadLar = jDBdefaults::PileUpThresholdLowHadLar;
135 int PileUpThresholdHighHadLar = jDBdefaults::PileUpThresholdHighHadLar;
136 int PileUpThresholdLowHadHecOverlap = jDBdefaults::PileUpThresholdLowHadHecOverlap;
137 int PileUpThresholdHighHadHecOverlap = jDBdefaults::PileUpThresholdHighHadHecOverlap;
138 int PileUpThresholdLowHadTrex = jDBdefaults::PileUpThresholdLowHadTrex;
139 int PileUpThresholdHighHadTrex = jDBdefaults::PileUpThresholdHighHadTrex;
140 int PileUpThresholdLowFcal = jDBdefaults::PileUpThresholdLowFcal;
141 int PileUpThresholdHighFcal = jDBdefaults::PileUpThresholdHighFcal;
142
143
144 if(!m_JfexSystemSettingsKey.empty() && useDBparams) {
145 SG::ReadCondHandle <CondAttrListCollection> load_SystemSet{m_JfexSystemSettingsKey, ctx};
146
147 const std::vector<std::string> myStrings{ "PileUpCorrectionJet", "PileUpCorrectionMET", "PileUpThresholdLowEm", "PileUpThresholdHighEm", "PileUpThresholdLowHadLar", "PileUpThresholdHighHadLar", "PileUpThresholdLowHadHecOverlap", "PileUpThresholdHighHadHecOverlap", "PileUpThresholdLowHadTrex", "PileUpThresholdHighHadTrex", "PileUpThresholdLowFcal", "PileUpThresholdHighFcal" };
148
149 if (load_SystemSet.isValid()) {
150
151 //setting the validity
152 writeCHandle.addDependency(load_SystemSet);
153
154 for (auto itr = load_SystemSet->begin(); itr != load_SystemSet->end(); ++itr) {
155
156 const coral::Blob& blob = (itr->second["json"]).data<coral::Blob>();
157 const std::string s((char*)blob.startingAddress(),blob.size());
158 nlohmann::json attrList = nlohmann::json::parse(s);
159
160 try {
161
162 //checking if all the string are present in the json file
163 bool allitemsPresent = true;
164 for(const auto & name:myStrings ) {
165 allitemsPresent = allitemsPresent && attrList.contains(name);
166 }
167 if(allitemsPresent) {
168 PileUpCorrectionJet = (bool) attrList[myStrings.at( 0)];
169 PileUpCorrectionMET = (bool) attrList[myStrings.at( 1)];
170 PileUpThresholdLowEm = (int) attrList[myStrings.at( 2)];
171 PileUpThresholdHighEm = (int) attrList[myStrings.at( 3)];
172 PileUpThresholdLowHadLar = (int) attrList[myStrings.at( 4)];
173 PileUpThresholdHighHadLar = (int) attrList[myStrings.at( 5)];
174 PileUpThresholdLowHadHecOverlap = (int) attrList[myStrings.at( 6)];
175 PileUpThresholdHighHadHecOverlap = (int) attrList[myStrings.at( 7)];
176 PileUpThresholdLowHadTrex = (int) attrList[myStrings.at( 8)];
177 PileUpThresholdHighHadTrex = (int) attrList[myStrings.at( 9)];
178 PileUpThresholdLowFcal = (int) attrList[myStrings.at(10)];
179 PileUpThresholdHighFcal = (int) attrList[myStrings.at(11)];
180
181 }
182 else {
183 throw (uint16_t) itr->first;
184 }
185 }
186 catch(uint16_t errTower) {
187 ATH_MSG_DEBUG("Loading Pileup values for jFEX ID A:"<<errTower <<". Some towers are not used anymore. Skipping");
188 }
189 }
190 }
191 else {
192 ATH_MSG_ERROR("Values from "<<m_JfexSystemSettingsKey<< " not loaded. Wrong key?");
193 return StatusCode::FAILURE;
194 }
195 }
196
197 writeDBTool->set_doPileUpJet(PileUpCorrectionJet);
198 writeDBTool->set_doPileUpMet(PileUpCorrectionMET);
199 writeDBTool->set_PUThrLowEm(PileUpThresholdLowEm);
200 writeDBTool->set_PUThrHighEm(PileUpThresholdHighEm);
201 writeDBTool->set_PUThrLowHadLar(PileUpThresholdLowHadLar);
202 writeDBTool->set_PUThrHighHadLar(PileUpThresholdHighHadLar);
203 writeDBTool->set_PUThrLowHadHecOverlap(PileUpThresholdLowHadHecOverlap);
204 writeDBTool->set_PUThrHighHadHecOverlap(PileUpThresholdHighHadHecOverlap);
205 writeDBTool->set_PUThrLowHadTrex(PileUpThresholdLowHadTrex);
206 writeDBTool->set_PUThrHighHadTrex(PileUpThresholdHighHadTrex);
207 writeDBTool->set_PUThrLowFcal(PileUpThresholdLowFcal);
208 writeDBTool->set_PUThrHighFcal(PileUpThresholdHighFcal);
209
210 /***************************************/
211 /* */
212 /* Noise Cut Parameters */
213 /* */
214 /***************************************/
215
216 // Noise values for EM and HAD
217 // the map contains: key: OnlineID and the array contains {CutJetEM, CutJetHad, CutMetEM, CutMetHad} in that order!
218 std::unordered_map< uint16_t, std::array<uint16_t,4> > NoiseCuts;
219
220 // PileUp values for EM and HAD
221 // the map contains: key: OnlineID and the array contains {CutJetEM, CutJetHad, CutMetEM, CutMetHad} in that order!
222 std::unordered_map< uint16_t, std::array<uint16_t,4> > PileUpWeight;
223
224
225 if(!m_JfexNoiseCutsKey.empty() && useDBparams) {
226
227 SG::ReadCondHandle <CondAttrListCollection> load_jFexNoiseCut{m_JfexNoiseCutsKey, ctx };
228
229 std::vector<std::string> myStringsNoise;
230
231 if (PileUpCorrectionJet == 0 and PileUpCorrectionMET == 0)
232 myStringsNoise = { "CutJetEM", "CutJetHad", "CutMetEM", "CutMetHad" };
233 else if (PileUpCorrectionJet == 1 and PileUpCorrectionMET == 0)
234 myStringsNoise = { "CutJetPUEM", "CutJetPUHad", "CutMetEM", "CutMetHad" };
235 else if (PileUpCorrectionJet == 0 and PileUpCorrectionMET == 1)
236 myStringsNoise = { "CutJetEM", "CutJetHad", "CutMetPUEM", "CutMetPUHad" };
237 else // (PileUpCorrectionJet == 1 and PileUpCorrectionMET == 1)
238 myStringsNoise = { "CutJetPUEM", "CutJetPUHad", "CutMetPUEM", "CutMetPUHad" };
239
240 const std::vector<std::string> myStringsPileup{ "PileUpWeightEM", "PileUpWeightHad", "InverseWeightEM", "InverseWeightHad" };
241
242 // we should check if it is valid and the size is 6 (corresponding to the 6 jfex modules)
243 if (load_jFexNoiseCut.isValid()) {
244
245 //setting the validity
246 writeCHandle.addDependency(load_jFexNoiseCut);
247
248 writeDBTool->set_sendDefaults(false);
249
250 for (auto itr = load_jFexNoiseCut->begin(); itr != load_jFexNoiseCut->end(); ++itr) {
251
252 const coral::Blob& blob = (itr->second["json"]).data<coral::Blob>();
253 const std::string s((char*)blob.startingAddress(),blob.size());
254 nlohmann::json attrList = nlohmann::json::parse(s);
255
256
257 //Trying to update Noise cut values
258 try {
259
260 bool allitemsPresent = true;
261 for(const auto & name:myStringsNoise ) {
262 allitemsPresent = allitemsPresent && attrList.contains(name);
263 }
264
265 if( allitemsPresent ) {
266 NoiseCuts[ (uint16_t) itr->first ]= { {(uint16_t) attrList[myStringsNoise.at(0)],(uint16_t) attrList[myStringsNoise.at(1)],(uint16_t) attrList[myStringsNoise.at(2)],(uint16_t) attrList[myStringsNoise.at(3)]} };
267 }
268 else {
269 throw (uint16_t) itr->first;
270 }
271 }
272 catch(uint16_t errTower) {
273 ATH_MSG_DEBUG("Loading Pileup values for jFEX ID B:"<<errTower <<". Some towers are not used anymore. Skipping");
274 NoiseCuts[ (uint16_t) itr->first ] = {0, 0, 0, 0};
275 }
276
277 //Trying to update the PileUp values
278 //Some jTower are expected to throw and exception, wrong in DB
279 try {
280
281 bool allitemsPresent = true;
282 for(const auto & name:myStringsPileup ) {
283 allitemsPresent = allitemsPresent && attrList.contains(name);
284 }
285
286 if( allitemsPresent ) {
287 PileUpWeight[ (uint16_t) itr->first ]= { {(uint16_t) attrList[myStringsPileup.at(0)],(uint16_t) attrList[myStringsPileup.at(1)],(uint16_t) attrList[myStringsPileup.at(2)],(uint16_t) attrList[myStringsPileup.at(3)]} };
288 }
289 else {
290 throw (uint16_t) itr->first;
291 }
292 }
293 catch(uint16_t errTower) {
294 ATH_MSG_DEBUG("Loading Pileup values for jFEX ID C:"<<errTower <<". Some towers are not used anymore. Skipping");
295 PileUpWeight[ (uint16_t) itr->first ] = {0, 0, 0, 0};
296 }
297 }
298
299 }
300 else {
301 ATH_MSG_ERROR("Values from "<<m_JfexNoiseCutsKey<< " not loaded. Wrong key?");
302 return StatusCode::FAILURE;
303 }
304 }
305 else{
306 NoiseCuts[0x0000] = jDBdefaults::PileUpWeight_default; // Unused - filled with 0s
307 NoiseCuts[0x00f0] = jDBdefaults::NoiseCuts_LATOME_TILE;
308 NoiseCuts[0x0f00] = jDBdefaults::NoiseCuts_LATOME_HEC;
309 NoiseCuts[0xf000] = jDBdefaults::NoiseCuts_FCAL;
310
311 PileUpWeight[0x0000] = jDBdefaults::PileUpWeight_default;
312 PileUpWeight[0x00f0] = jDBdefaults::PileUpWeight_default;
313 PileUpWeight[0x0f00] = jDBdefaults::PileUpWeight_default;
314 PileUpWeight[0xf000] = jDBdefaults::PileUpWeight_default;
315 }
316
317
318 writeDBTool->set_NoiseCuts(NoiseCuts);
319 writeDBTool->set_PileUpValues(PileUpWeight);
320
321 if(msgLvl(MSG::DEBUG)){
322
323 std::stringstream myprint;
324 if (useDBparams)
325 myprint << "Parameters obtained from m_JfexModuleSettingsKey: "<< m_JfexModuleSettingsKey << std::endl;
326 else
327 myprint << "JfexModuleSettings obtained from jDBdefaults"<< std::endl;
328 myprint << "jJCalibParam:" << std::endl;
329
330 for(int mod=0; mod<6; mod++) {
331 myprint << "jFEX"<<mod<<" - ";
332 for(int range=0; range<25; range++) {
333 myprint << writeDBTool->get_jJCalibParam(mod,range)<< " ";
334 }
335 myprint << std::endl;
336 }
337 myprint << std::endl;
338
339 ATH_MSG_DEBUG(myprint.str());
340
341
342 std::stringstream myprint1;
343
344 if (useDBparams)
345 myprint1 << "Parameters obtained from m_JfexSystemSettingsKey: "<< m_JfexSystemSettingsKey << std::endl;
346 else
347 myprint1 << "JfexSystemSettings obtained from jDBdefaults"<< std::endl;
348
349 myprint1 << "System setting parameters: " <<std::endl;
350 myprint1 << "PileUpCorrectionJet: " << writeDBTool->get_doPileUpJet() <<std::endl;
351 myprint1 << "PileUpCorrectionMET: " << writeDBTool->get_doPileUpMet() <<std::endl;
352 myprint1 << "PileUpThresholdLowEm: " << writeDBTool->get_PUThrLowEm() <<std::endl;
353 myprint1 << "PileUpThresholdHighEm: " << writeDBTool->get_PUThrHighEm() <<std::endl;
354 myprint1 << "PileUpThresholdLowHadLar: " << writeDBTool->get_PUThrLowHadLar() <<std::endl;
355 myprint1 << "PileUpThresholdHighHadLar: " << writeDBTool->get_PUThrHighHadLar() <<std::endl;
356 myprint1 << "PileUpThresholdLowHadHecOverlap: " << writeDBTool->get_PUThrLowHadHecOverlap() <<std::endl;
357 myprint1 << "PileUpThresholdHighHadHecOverlap: "<< writeDBTool->get_PUThrHighHadHecOverlap()<<std::endl;
358 myprint1 << "PileUpThresholdLowHadTrex: " << writeDBTool->get_PUThrLowHadTrex() <<std::endl;
359 myprint1 << "PileUpThresholdHighHadTrex: " << writeDBTool->get_PUThrHighHadTrex() <<std::endl;
360 myprint1 << "PileUpThresholdLowFcal: " << writeDBTool->get_PUThrLowFcal() <<std::endl;
361 myprint1 << "PileUpThresholdHighFcal: " << writeDBTool->get_PUThrHighFcal() <<std::endl;
362
363 ATH_MSG_DEBUG(myprint1.str());
364
365 std::stringstream myprint2;
366
367 if (useDBparams)
368 myprint2 << "Parameters obtained from m_JfexNoiseCutsKey: "<< m_JfexNoiseCutsKey << std::endl;
369 else
370 myprint2 << "JfexNoiseCuts obtained from jDBdefaults"<< std::endl;
371
372 for( const auto& [key, value] : NoiseCuts) {
373 const auto [CutJetEM, CutJetHad, CutMetEM, CutMetHad] = value;
374 const auto [PileUpWeightEM, PileUpWeightHad, InverseWeightEM, InverseWeightHad] = PileUpWeight[key];
375
376 myprint2 <<"OnlineID: 0x"<< std::hex<<key<<std::dec<< " - CutJetEM: "<< CutJetEM<< ", CutJetHad:"<< CutJetHad<< ", CutMetEM:"<< CutMetEM<< ", CutMetHad:"<< CutMetHad<< ", PileUpWeightEM: "<< PileUpWeightEM<< ", PileUpWeightHad:"<< PileUpWeightHad<< ", InverseWeightEM:"<< InverseWeightEM<< ", InverseWeightHad:"<< InverseWeightHad<< std::endl;
377 }
378
379 ATH_MSG_DEBUG(myprint2.str());
380
381 }
382
383
384
385 // If DB parameters not loaded, valid for infinity and beyond!
386 if (!useDBparams) {
387 writeCHandle.addDependency(IOVInfiniteRange::infiniteRunLB()); // Use infinite IOV
388 }
389
390 //Wrinting into SG!
391 if (writeCHandle.record(std::move(writeDBTool)).isFailure()) {
392 ATH_MSG_ERROR("Could not record " << writeCHandle.key() << " with EventRange " << writeCHandle.getRange() << " into Conditions Store");
393 return StatusCode::FAILURE;
394 }
395 ATH_MSG_INFO("Recorded " << writeCHandle.key() << " with EventRange " << writeCHandle.getRange() << " into Conditions Store");
396
397 return StatusCode::SUCCESS;
398
399}
400
401
402
403}// end of namespace LVL1
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
Base class for conditions algorithms.
static EventIDRange infiniteRunLB()
Produces an EventIDRange that is infinite in RunLumi and invalid in Time.
jFEXCondAlgo(const std::string &name, ISvcLocator *svc)
Constructors.
SG::ReadCondHandleKey< CondAttrListCollection > m_JfexNoiseCutsKey
virtual StatusCode initialize() override
Function initialising the algorithm.
SG::ReadCondHandleKey< CondAttrListCollection > m_JfexSystemSettingsKey
SG::WriteCondHandleKey< jFEXDBCondData > m_jFEXDBParamsKey
virtual StatusCode execute(const EventContext &) const override
Function executing the algorithm.
Gaudi::Property< bool > m_isMC
UnsignedIntegerProperty m_dbBeginTimestamp
SG::ReadCondHandleKey< CondAttrListCollection > m_JfexModuleSettingsKey
void addDependency(const EventIDRange &range)
static constexpr int PileUpThresholdHighHadLar
static constexpr int PileUpThresholdHighEm
static constexpr std::array< uint16_t, 4 > NoiseCuts_LATOME_HEC
static constexpr bool PileUpCorrectionJet
static constexpr int PileUpThresholdLowFcal
static constexpr int PileUpThresholdLowHadTrex
static constexpr int PileUpThresholdLowHadHecOverlap
static constexpr std::array< uint16_t, 4 > NoiseCuts_FCAL
static constexpr std::array< uint16_t, 4 > PileUpWeight_default
static constexpr std::array< uint16_t, 4 > NoiseCuts_LATOME_TILE
static constexpr int PileUpThresholdHighHadTrex
static constexpr int PileUpThresholdHighFcal
static constexpr int PileUpThresholdLowEm
static constexpr int jJCalibParams[6][25]
static constexpr bool PileUpCorrectionMET
static constexpr int PileUpThresholdLowHadLar
static constexpr int PileUpThresholdHighHadHecOverlap
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
setWord1 uint16_t