ATLAS Offline Software
jFEXCondAlgo.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 // 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 
24 namespace LVL1 {
25 
26 //Default Constructor
27 jFEXCondAlgo::jFEXCondAlgo(const std::string& name, ISvcLocator* svc) : AthReentrantAlgorithm(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 
42 StatusCode 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
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){
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());
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] = 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) {
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());
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 
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());
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
jFEXCoolDBDefaults.h
LVL1::jFEXCondAlgo::m_jFEXDBParamsKey
SG::WriteCondHandleKey< jFEXDBCondData > m_jFEXDBParamsKey
Definition: jFEXCondAlgo.h:39
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
LVL1::jFEXCondAlgo::initialize
virtual StatusCode initialize() override
Function initialising the algorithm.
Definition: jFEXCondAlgo.cxx:29
json
nlohmann::json json
Definition: HistogramDef.cxx:9
LVL1::jFEXCondAlgo::m_isMC
Gaudi::Property< bool > m_isMC
Definition: jFEXCondAlgo.h:48
parse
std::map< std::string, std::string > parse(const std::string &list)
Definition: egammaLayerRecalibTool.cxx:1054
python.subdetectors.tile.Blob
Blob
Definition: tile.py:17
athena.value
value
Definition: athena.py:124
LVL1::jFEXCondAlgo::m_JfexNoiseCutsKey
SG::ReadCondHandleKey< CondAttrListCollection > m_JfexNoiseCutsKey
Definition: jFEXCondAlgo.h:43
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
LVL1
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
Definition: ICMMCPHitsCnvTool.h:18
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
LVL1::jFEXCondAlgo::m_dbBeginTimestamp
UnsignedIntegerProperty m_dbBeginTimestamp
Definition: jFEXCondAlgo.h:46
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LVL1::jFEXCoolDBDefaults
Definition: jFEXCoolDBDefaults.h:7
maskDeadModules.mod
mod
Definition: maskDeadModules.py:36
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
LVL1::jFEXCondAlgo::execute
virtual StatusCode execute(const EventContext &) const override
Function executing the algorithm.
Definition: jFEXCondAlgo.cxx:42
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
IOVInfiniteRange::infiniteRunLB
static EventIDRange infiniteRunLB()
Produces an EventIDRange that is infinite in RunLumi and invalid in Time.
Definition: IOVInfiniteRange.h:39
LVL1::jFEXCondAlgo::m_JfexModuleSettingsKey
SG::ReadCondHandleKey< CondAttrListCollection > m_JfexModuleSettingsKey
Definition: jFEXCondAlgo.h:42
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
LVL1::jFEXCondAlgo::m_JfexSystemSettingsKey
SG::ReadCondHandleKey< CondAttrListCollection > m_JfexSystemSettingsKey
Definition: jFEXCondAlgo.h:44
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Handler::svc
AthROOTErrorHandlerSvc * svc
Definition: AthROOTErrorHandlerSvc.cxx:10
TrigConf::name
Definition: HLTChainList.h:35
IOVInfiniteRange.h
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
jFEXCondAlgo.h
LVL1::jFEXCondAlgo::jFEXCondAlgo
jFEXCondAlgo(const std::string &name, ISvcLocator *svc)
Constructors.
Definition: jFEXCondAlgo.cxx:27
DEBUG
#define DEBUG
Definition: page_access.h:11
SG::WriteCondHandle::isValid
bool isValid() const
Definition: WriteCondHandle.h:248
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
SG::AllowEmpty
@ AllowEmpty
Definition: StoreGate/StoreGate/VarHandleKey.h:30
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
CaloCondBlobAlgs_fillNoiseFromASCII.blob
blob
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:96
SG::WriteCondHandle::addDependency
void addDependency(const EventIDRange &range)
Definition: WriteCondHandle.h:275
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37