ATLAS Offline Software
CalibrationDataInterfaceTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // CalibrationDataInterfaceTool.cxx, (c) ATLAS Detector software
8 
12 #include "JetEvent/Jet.h"
13 
14 #include "TF1.h"
15 
16 #include <map>
17 
21 
22 using std::cerr;
23 using std::endl;
24 using std::string;
25 
26 //================ Constructor =================================================
27 
29  const string& n,
30  const IInterface* p ) :
31  AthAlgTool(t,n,p),
32  m_broker("PerformanceBroker")
33 {
34  declareInterface<Analysis::ICalibrationDataInterfaceTool>(this);
35 
36  declareProperty("taggerName", m_taggerName = "undefined",
37  "tagging algorithm name");
38  declareProperty("operatingPoints", m_operatingPoints,
39  "operating points for this tagging algorithm");
40  declareProperty("efficiencyCalibrationBName", m_EffcalibrationBName = "default",
41  "efficiency calibration curve for b jets");
42  declareProperty("efficiencyCalibrationCName", m_EffcalibrationCName = "default",
43  "efficiency calibration curve for c jets");
44  declareProperty("efficiencyCalibrationTName", m_EffcalibrationTName = "default",
45  "efficiency calibration curve for tau jets");
46  declareProperty("efficiencyCalibrationLightName", m_EffcalibrationLightName = "default",
47  "efficiency calibration curve for light-flavour jets");
48  declareProperty("scaleFactorCalibrationBName", m_SFcalibrationBName = "default",
49  "scale factor calibration curve for b jets");
50  declareProperty("scaleFactorCalibrationCName", m_SFcalibrationCName = "default",
51  "scale factor calibration curve for c jets");
52  declareProperty("scaleFactorCalibrationTName", m_SFcalibrationTName = "default",
53  "scale factor calibration curve for tau jets");
54  declareProperty("scaleFactorCalibrationLightName", m_SFcalibrationLightName = "default",
55  "scale factor calibration curve for light-flavour jets");
56  declareProperty("PerformanceBroker", m_broker,
57  "tool interfacing with COOL Database");
58 }
59 
60 //================ Interface stuff ===============================================
61 
63 {
65  *ppvIf = (ICalibrationDataInterfaceTool*)this;
66  addRef();
67  return StatusCode::SUCCESS;
68  }
69 
70  return AthAlgTool::queryInterface( riid, ppvIf );
71 }
72 
73 
74 
76 {
77 
78 // StatusCode sc = AthAlgTool::initialize();
79 // if (sc.isFailure()) return sc;
80 //
81 // sc = m_broker.retrieve();
82 // if (sc.isFailure()) {
83 // ATH_MSG_FATAL("initialize() in " << name() << ": unable to retrieve CalibrationBroker tool!");
84 // return sc;
85 // }
86 
87  string::size_type end;
88 
89  std::vector<string> calibrationBNames;
90  if (m_EffcalibrationBName.size() > 0) {
91  do {
92  end = m_EffcalibrationBName.find(";");
93  calibrationBNames.push_back(m_EffcalibrationBName.substr(0,end));
94  if (end != string::npos) m_EffcalibrationBName = m_EffcalibrationBName.substr(end+1);
95  } while (end != string::npos);
96  }
97 
98  std::vector<string> calibrationCNames;
99  if (m_EffcalibrationCName.size() > 0) {
100  do {
101  end = m_EffcalibrationCName.find(";");
102  calibrationCNames.push_back(m_EffcalibrationCName.substr(0,end));
103  if (end != string::npos) m_EffcalibrationCName = m_EffcalibrationCName.substr(end+1);
104  } while (end != string::npos);
105  }
106 
107  std::vector<string> calibrationTNames;
108  if (m_EffcalibrationTName.size() > 0) {
109  do {
110  end = m_EffcalibrationTName.find(";");
111  calibrationTNames.push_back(m_EffcalibrationTName.substr(0,end));
112  if (end != string::npos) m_EffcalibrationTName = m_EffcalibrationTName.substr(end+1);
113  } while (end != string::npos);
114  }
115 
116  std::vector<string> calibrationLightNames;
117  if (m_EffcalibrationLightName.size() > 0) {
118  do {
119  end = m_EffcalibrationLightName.find(";");
120  calibrationLightNames.push_back(m_EffcalibrationLightName.substr(0,end));
121  if (end != string::npos) m_EffcalibrationLightName = m_EffcalibrationLightName.substr(end+1);
122  } while (end != string::npos);
123  }
124 
125 
126  // insert the calibration names into a common object
127  std::map<string, std::vector<string> > effNames;
128  effNames["B"] = calibrationBNames;
129  effNames["C"] = calibrationCNames;
130  effNames["T"] = calibrationTNames;
131  effNames["Light"] = calibrationLightNames;
132  setEffCalibrationNames(effNames);
133 
134  // insert the calibration names into a common object
135  std::map<string, string> calibrationNames;
136  calibrationNames["B"] = m_SFcalibrationBName;
137  calibrationNames["C"] = m_SFcalibrationCName;
138  calibrationNames["T"] = m_SFcalibrationTName;
139  calibrationNames["Light"] = m_SFcalibrationLightName;
140  setSFCalibrationNames(calibrationNames);
141 
142  // register all objects
143  for (std::map<string, string>::const_iterator it = calibrationNames.begin();
144  it != calibrationNames.end(); ++it) {
145  for (std::vector<string>::const_iterator op = m_operatingPoints.begin();
146  op != m_operatingPoints.end(); ++op) {
147  registerObjects(it->first, *op);
148  }
149  }
150 
151  ATH_MSG_INFO("initialize() successful in " << name());
152  return StatusCode::SUCCESS;
153 }
154 
155 //============================================================================================
156 
157 //====================== efficiency scale factor retrieval =============================
158 
161  const string& OP, Uncertainty unc) const
162 {
163  // // For now, a calibration for the charm efficiency scale factor is assumed not to exist
164  // if (label == "C") return getScaleFactor(jet, "B", OP, unc);
165 
166  // for light-flavour jets, rename from "N/A"
167  string flavour(label);
168  if (flavour == "N/A") flavour = "Light";
169 
170  string author = jet.jetAuthor();
171 
172  string sfName(getBasename(OP, flavour, "_SF", true));
173 
174  // Return a dummy result if the object is not found
175  std::pair<CalibrationDataContainer*,bool> ret =
176  m_broker->retrieveTObject<CalibrationDataContainer>(m_taggerName, author, sfName);
177  CalibrationDataContainer* container = ret.first;
178  if (! container) {
179  ATH_MSG_WARNING("in " << name() << ": unable to find SF calibration for object with "
180  << "tagger/jetCollection/flavour/operating point = "
181  << m_taggerName << "/" << author << "/" << flavour << "/" << OP);
182  return Analysis::dummyResult;
183  }
184 
185  /* Here, it isn't obvious what to do with the second element of the pair returned:
186  This indicates whether a new object has been loaded (presumably due to IOV changes),
187  but the CalibrationDataContainer should take of any necessary computations itself.
188  */
189 
190  // fill the CalibrationDataVariables object
192  makeVariables (jet, variables);
193 
194  // always retrieve the result itself
195  double value;
196  if (container->getResult(variables, value) == CalibrationDataContainer::kError)
197  return Analysis::dummyResult;
198 
199  // retrieve the statistical uncertainty if desired
200  double stat(0);
201  if (unc == Total || unc == Statistical) {
202  if (container->getStatUncertainty(variables, stat) == CalibrationDataContainer::kError)
203  cerr << "getScaleFactor: error retrieving Scale factor statistical uncertainty!"
204  << endl;
205  }
206  UncertaintyResult resSyst(0,0);
207  if (unc == Total || unc == Systematic) {
208  if (container->getSystUncertainty(variables, resSyst) == CalibrationDataContainer::kError)
209  cerr << "getScaleFactor: error retrieving Scale factor parameter systematic uncertainty!"
210  << endl;
211  }
212 
213  double uncertainty = combinedUncertainty(stat, resSyst);
214  Analysis::CalibResult result = std::make_pair(value, uncertainty);
215 
216  result.first = std::max(0., result.first);
217  if (std::abs(result.first) < Analysis::CalibZERO)
218  result.first = 1.;
219  return result;
220 }
221 
222 //====================== "MC" efficiency retrieval ======================================
223 
226  const string& OP, Uncertainty unc) const
227 {
228  // extract the relevant jet quantities: kinematic variables and jet author
229 
230  // for light-flavour jets, rename from "N/A"
231  string flavour(label);
232  if (flavour == "N/A") flavour = "Light";
233 
234  string author = jet.jetAuthor();
235 
236  string effName(getBasename(OP, flavour, "_Eff", false));
237 
238  // Return a dummy result if the object is not found
239  std::pair<CalibrationDataContainer*,bool> ret =
240  m_broker->retrieveTObject<CalibrationDataContainer>(m_taggerName, author, effName);
241  CalibrationDataContainer* container = ret.first;
242  if (! container) {
243  ATH_MSG_WARNING("in " << name() << ": unable to find Eff calibration for object with "
244  << "tagger/jetCollection/flavour/operating point = "
245  << m_taggerName << "/" << author << "/" << flavour << "/" << OP);
246  return Analysis::dummyResult;
247  }
248 
249  /* Here, it isn't obvious what to do with the second element of the pair returned:
250  This indicates whether a new object has been loaded (presumably due to IOV changes),
251  but the CalibrationDataContainer should take of any necessary computations itself.
252  */
253 
254  // fill the CalibrationDataVariables object
256  makeVariables (jet, variables);
257 
258  // always retrieve the result itself
259  double value;
260  if (container->getResult(variables, value) == CalibrationDataContainer::kError)
261  return Analysis::dummyResult;
262 
263  // retrieve the statistical uncertainty if desired
264  double stat(0);
265  if (unc == Total || unc == Statistical) {
266  if (container->getStatUncertainty(variables, stat) == CalibrationDataContainer::kError)
267  cerr << "getMCEfficiency: error retrieving MC efficiency statistical uncertainty!"
268  << endl;
269  }
270  UncertaintyResult resSyst(0,0);
271  if (unc == Total || unc == Systematic) {
272  if (container->getSystUncertainty(variables, resSyst) == CalibrationDataContainer::kError)
273  cerr << "getMCEfficiency: error retrieving MC efficiency parameter systematic uncertainty!"
274  << endl;
275  }
276 
277  double uncertainty = combinedUncertainty(stat, resSyst);
278  Analysis::CalibResult result = std::make_pair(value, uncertainty);
279 
280  result.first = std::max(0., std::min(1., result.first));
281  return result;
282 }
283 
284 //====================== efficiency retrieval ==========================================
285 
288  const string& OP, Uncertainty unc) const
289 {
290  Analysis::CalibResult sfResult = getScaleFactor(jet, label, OP, unc);
291  Analysis::CalibResult effResult = getMCEfficiency(jet, label, OP, unc);
292 
293  double relative = 0;
294  double value = effResult.first*sfResult.first;
295  if (value != 0) {
296  relative = effResult.second/effResult.first;
297  double sfRelative = sfResult.second/sfResult.first;
298  relative = std::sqrt(sfRelative*sfRelative + relative*relative);
299  } else {
300  ATH_MSG_WARNING("in " << name() << ": null result, SF=" << sfResult.first
301  << " MC eff=" << effResult.first);
302  relative = Analysis::dummyValue;
303  }
304 
305  return std::make_pair(value,value*relative);
306 }
307 
308 //============================================================================================
309 
311  const string& OP) const
312 {
313  static const string slash("/");
314 
315  string common = OP; common += slash;
316  common += flavour; common += slash;
317  string nameEff(common); nameEff += EffCalibrationName(flavour); nameEff += "_Eff";
318  string nameSF(common); nameSF += SFCalibrationName(flavour); nameSF += "_SF";
319 
320  m_broker->registerHistogram(m_taggerName, nameSF);
321  m_broker->registerHistogram(m_taggerName, nameEff);
322 }
323 
324 void
327 {
328  x.jetAuthor = jet.jetAuthor();
329  x.jetPt = jet.pt() * 0.001; // NB convert from MeV to GeV!
330  x.jetEta = jet.eta();
331 }
Analysis::CalibResult
std::pair< double, double > CalibResult
Definition: CalibrationDataInterfaceBase.h:34
Analysis::CalibrationDataInterfaceTool::m_SFcalibrationCName
std::string m_SFcalibrationCName
Definition: CalibrationDataInterfaceTool.h:116
Analysis::CalibrationDataInterfaceTool::queryInterface
StatusCode queryInterface(const InterfaceID &riid, void **ppvIf)
allow access to the ICalibrationDataInterfaceTool interface
Definition: CalibrationDataInterfaceTool.cxx:62
Analysis::dummyResult
const CalibResult dummyResult(dummyValue, dummyValue)
get_generator_info.result
result
Definition: get_generator_info.py:21
Analysis::CalibrationDataContainer
Definition: CalibrationDataContainer.h:51
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
max
#define max(a, b)
Definition: cfImp.cxx:41
checkCoolLatestUpdate.variables
variables
Definition: checkCoolLatestUpdate.py:13
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
Jet
Basic data class defines behavior for all Jet objects The Jet class is the principal data class for...
Definition: Reconstruction/Jet/JetEvent/JetEvent/Jet.h:47
CalibrationDataContainer.h
Analysis::CalibrationDataInterfaceTool::m_EffcalibrationTName
std::string m_EffcalibrationTName
Definition: CalibrationDataInterfaceTool.h:113
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
PlotCalibFromCool.label
label
Definition: PlotCalibFromCool.py:78
Analysis::Statistical
@ Statistical
Definition: CalibrationDataInterfaceROOT.h:70
skel.it
it
Definition: skel.GENtoEVGEN.py:423
Analysis::ICalibrationDataInterfaceTool
Definition: ICalibrationDataInterfaceTool.h:21
CalibrationDataInterfaceTool.h
Analysis::CalibrationDataInterfaceTool::registerObjects
void registerObjects(const std::string &folder, const std::string &OP) const
auxiliary function dealing with registration of objects
Definition: CalibrationDataInterfaceTool.cxx:310
athena.value
value
Definition: athena.py:122
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
CalibrationDataVariables.h
x
#define x
Analysis::dummyValue
const double dummyValue
Definition: CalibrationDataInterfaceBase.h:33
Analysis::CalibrationDataInterfaceTool::getEfficiency
CalibResult getEfficiency(const Jet &jet, const std::string &label, const std::string &OP, Uncertainty unc=None) const
Main interface methods accessing the flavour tagging performance information.
Definition: CalibrationDataInterfaceTool.cxx:287
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
Analysis::CalibrationDataInterfaceBase::m_taggerName
std::string m_taggerName
tagging algorithm name
Definition: CalibrationDataInterfaceBase.h:94
Analysis::Total
@ Total
Definition: CalibrationDataInterfaceROOT.h:70
Analysis::CalibrationDataInterfaceTool::m_EffcalibrationBName
std::string m_EffcalibrationBName
calibration curves for b, c, and light-flavour jets
Definition: CalibrationDataInterfaceTool.h:111
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
Analysis::CalibrationDataInterfaceTool::m_broker
ToolHandle< CalibrationBroker > m_broker
pointer to the performance broker
Definition: CalibrationDataInterfaceTool.h:121
ret
T ret(T t)
Definition: rootspy.cxx:260
beamspotman.n
n
Definition: beamspotman.py:731
Analysis::kError
@ kError
Definition: CalibrationDataVariables.h:60
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
Analysis::CalibrationDataInterfaceTool::m_SFcalibrationLightName
std::string m_SFcalibrationLightName
Definition: CalibrationDataInterfaceTool.h:118
Analysis::CalibrationDataInterfaceTool::m_EffcalibrationLightName
std::string m_EffcalibrationLightName
Definition: CalibrationDataInterfaceTool.h:114
Analysis::UncertaintyResult
std::pair< double, double > UncertaintyResult
The following typedef is for convenience: most uncertainties can be asymmetric.
Definition: CalibrationDataContainer.h:33
Analysis::ICalibrationDataInterfaceTool::interfaceID
static const InterfaceID & interfaceID()
Definition: ICalibrationDataInterfaceTool.h:23
beamspotman.stat
stat
Definition: beamspotman.py:266
min
#define min(a, b)
Definition: cfImp.cxx:40
Analysis::CalibrationDataInterfaceTool::getScaleFactor
CalibResult getScaleFactor(const Jet &jet, const std::string &label, const std::string &OP, Uncertainty unc=None) const
efficiency scale factor retrieval
Definition: CalibrationDataInterfaceTool.cxx:160
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
Analysis::CalibrationDataInterfaceTool::CalibrationDataInterfaceTool
CalibrationDataInterfaceTool(const std::string &, const std::string &, const IInterface *)
Definition: CalibrationDataInterfaceTool.cxx:28
Analysis::CalibrationDataInterfaceTool::makeVariables
void makeVariables(const Jet &jet, CalibrationDataVariables &x) const
auxiliary function to create the intermediate struct needed for the data layer
Definition: CalibrationDataInterfaceTool.cxx:325
Analysis::CalibrationDataInterfaceTool::initialize
virtual StatusCode initialize() override
standard Athena-Algorithm method
Definition: CalibrationDataInterfaceTool.cxx:75
Analysis::CalibrationDataInterfaceTool::m_EffcalibrationCName
std::string m_EffcalibrationCName
Definition: CalibrationDataInterfaceTool.h:112
Analysis::CalibrationDataInterfaceTool::m_SFcalibrationBName
std::string m_SFcalibrationBName
Definition: CalibrationDataInterfaceTool.h:115
Analysis::ICalibrationDataInterfaceTool::Uncertainty
Uncertainty
retrieve either the total uncertainty or only the statistical or systematic components
Definition: ICalibrationDataInterfaceTool.h:28
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CaloCondBlobAlgs_fillNoiseFromASCII.author
string author
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:26
Analysis::CalibrationDataVariables
Definition: CalibrationDataVariables.h:42
Jet.h
AthAlgTool
Definition: AthAlgTool.h:26
Analysis::CalibrationDataInterfaceTool::getMCEfficiency
CalibResult getMCEfficiency(const Jet &jet, const std::string &label, const std::string &OP, Uncertainty unc=None) const
"MC" efficiency retrieval
Definition: CalibrationDataInterfaceTool.cxx:225
Analysis::Systematic
@ Systematic
Definition: CalibrationDataInterfaceROOT.h:70
Analysis::CalibrationDataInterfaceTool::m_SFcalibrationTName
std::string m_SFcalibrationTName
Definition: CalibrationDataInterfaceTool.h:117
Analysis::CalibZERO
const double CalibZERO
Definition: CalibrationDataInterfaceBase.h:32
common
Definition: common.py:1