ATLAS Offline Software
Calculator.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // contact: jmaurer@cern.ch
6 
7 #ifndef TRIGGLOBALEFFICIENCYCORRECTION_CALCULATOR_H
8 #define TRIGGLOBALEFFICIENCYCORRECTION_CALCULATOR_H 1
9 
10 #include <algorithm>
11 #include <boost/container/flat_set.hpp>
12 #include <functional>
13 #include <map>
14 
19 template <typename Key>
20 using flat_set = boost::container::flat_set<Key>;
21 
22 namespace TrigGlobEffCorr {
23 
24 class Lepton;
25 
26 class Calculator : public asg::AsgMessaging {
29  using GlobEffFunc = std::function<bool(Calculator*, const LeptonList&,
30  unsigned, Efficiencies&)>;
31 
32  public:
34  unsigned nPeriodsToReserve);
36  const std::pair<unsigned, unsigned>& boundaries,
37  const std::string& combination, bool useToys,
38  std::size_t& uniqueElectronLeg, std::size_t& uniquePhotonLeg);
40  const LeptonList& leptons, unsigned runNumber,
43  bool& matched, const LeptonList& leptons,
44  unsigned runNumber);
46  std::vector<std::string>& triggers,
47  unsigned runNumber);
48 
49  struct Period {
50  const std::pair<unsigned, unsigned> m_boundaries;
52  std::vector<TrigDef>
54  Period(const decltype(m_boundaries)& b, decltype(m_formula)&& f,
56  decltype(m_triggers)&& t = {})
58  };
59 
60  private:
63 
65  std::vector<Period> m_periods;
66  std::map<std::pair<const Lepton*, std::size_t>, Efficiencies>
67  m_cachedEfficiencies; // not thread safe
68  bool m_forceUnitSF; // not thread safe
69 
70  bool aboveThreshold(const Lepton& p, std::size_t leg) const {
71  return m_parent->aboveThreshold(p, leg);
72  }
73  template <typename Trig1L>
74  auto getLoosestLegAboveThreshold(const Lepton& lepton,
75  const flat_set<Trig1L>& trigs, bool& success)
76  -> std::enable_if_t<Trig1L::is1L(), std::size_t> {
78  lepton, Trig1L::anonymize(trigs), success);
79  }
81  unsigned runNumber,
82  std::size_t leg, bool& success);
83  bool fillListOfLegsFor(const Lepton& lepton,
84  const std::vector<TrigDef>& triggers,
85  flat_set<std::size_t>& validLegs) const;
86  bool canTriggerBeFired(
87  const TrigDef& trig,
88  const std::vector<flat_set<std::size_t> >& firedLegs) const;
89  const Period* getPeriod(unsigned runNumber) const;
90  bool findUniqueLeg(xAOD::Type::ObjectType obj, std::size_t& uniqueLeg,
91  const std::vector<TrigDef>& defs);
92 
94  template <typename Trig1L>
95  auto globalEfficiency(const LeptonList&, unsigned, const Trig1L,
96  Efficiencies&)
97  -> std::enable_if_t<Trig1L::is1L(), bool>;
99  template <typename Trig1L_obj1, typename Trig1L_obj2>
100  auto globalEfficiency(const LeptonList&, unsigned, const Trig1L_obj1 trig1,
101  const Trig1L_obj2 trig2, Efficiencies&)
102  -> std::enable_if_t<Trig1L_obj1::is1L() && Trig1L_obj2::is1L() &&
104  bool>;
106  template <typename Trig1L>
107  auto globalEfficiency(const LeptonList&, unsigned, const flat_set<Trig1L>&,
108  Efficiencies&)
109  -> std::enable_if_t<Trig1L::is1L(), bool>;
111  template <typename Trig1L_obj1, typename Trig1L_obj2>
112  auto globalEfficiency(const LeptonList&, unsigned,
113  const flat_set<Trig1L_obj1>& trigs1,
114  const flat_set<Trig1L_obj2>& trigs2, Efficiencies&)
115  -> std::enable_if_t<Trig1L_obj1::is1L() && Trig1L_obj2::is1L() &&
117  bool>;
119  template <typename Trig2Lmix>
120  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lmix,
121  Efficiencies&)
122  -> std::enable_if_t<Trig2Lmix::is2Lmix(), bool>;
124  template <typename Trig2Lsym>
125  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym,
126  Efficiencies&)
127  -> std::enable_if_t<Trig2Lsym::is2Lsym(), bool>;
129  template <typename Trig2Lasym>
130  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym,
131  Efficiencies&)
132  -> std::enable_if_t<Trig2Lasym::is2Lasym(), bool>;
134  template <typename Trig2Lmix, typename Trig1L_obj1, typename Trig1L_obj2>
135  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lmix,
136  const flat_set<Trig1L_obj1>&,
138  -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig1L_obj1::is1L() &&
139  Trig2Lmix::object1() == Trig1L_obj1::object() &&
140  Trig1L_obj2::is1L() &&
141  Trig2Lmix::object2() == Trig1L_obj2::object(),
142  bool>;
144  template <typename Trig2L, typename Trig1L>
145  inline auto globalEfficiency(const LeptonList&, unsigned, const Trig2L,
146  const Trig1L, Efficiencies&)
147  -> std::enable_if_t<Trig2L::is2Lnomix() && Trig1L::is1L() &&
149  bool>;
151  template <typename Trig2Lsym, typename Trig1L>
152  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym,
154  -> std::enable_if_t<Trig2Lsym::is2Lsym() && Trig1L::is1L() &&
156  bool>;
158  template <typename Trig2Lasym, typename Trig1L>
159  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym,
161  -> std::enable_if_t<Trig2Lasym::is2Lasym() && Trig1L::is1L() &&
163  bool>;
165  template <typename Trig2Lsym, typename Trig1L>
166  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym,
167  const Trig2Lsym, const flat_set<Trig1L>&, Efficiencies&)
168  -> std::enable_if_t<Trig2Lsym::is2Lsym() && Trig1L::is1L() &&
170  bool>;
173  template <typename Trig2Lasym, typename Trig2Lsym, typename Trig1L>
174  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym,
175  const Trig2Lsym, const flat_set<Trig1L>&, Efficiencies&)
176  -> std::enable_if_t<Trig2Lasym::is2Lasym() && Trig2Lsym::is2Lsym() &&
178  Trig1L::is1L() &&
180  bool>;
182  template <typename Trig3Lsym>
183  auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lsym,
184  Efficiencies&)
185  -> std::enable_if_t<Trig3Lsym::is3Lsym(), bool>;
187  template <typename Trig3Lhalfsym>
188  auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lhalfsym,
189  Efficiencies&)
190  -> std::enable_if_t<Trig3Lhalfsym::is3Lhalfsym(), bool>;
192  template <typename Trig2L, typename Trig2Lmix>
193  auto globalEfficiency(const LeptonList&, unsigned, const Trig2L,
194  const Trig2Lmix, Efficiencies&)
195  -> std::enable_if_t<Trig2L::is2Lnomix() && Trig2Lmix::is2Lmix() &&
196  (Trig2Lmix::object1() == Trig2L::object() ||
197  Trig2Lmix::object2() == Trig2L::object()),
198  bool>;
201  template <typename Trig2L_obj1, typename Trig2L_obj2, typename Trig2Lmix>
202  auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1,
203  const Trig2L_obj2, const Trig2Lmix, Efficiencies&)
204  -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
205  Trig2L_obj1::object() == Trig2Lmix::object1() &&
206  Trig2L_obj2::is2Lnomix() &&
207  Trig2L_obj2::object() == Trig2Lmix::object2(),
208 
209  bool>;
211  template <typename Trig2L_obj1, typename Trig2L_obj2, typename Trig2Lmix,
212  typename Trig1L_obj1, typename Trig1L_obj2>
213  auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1,
214  const Trig2L_obj2, const Trig2Lmix,
215  const flat_set<Trig1L_obj1>&,
217  -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
218  Trig2L_obj1::object() == Trig2Lmix::object1() &&
219  Trig2L_obj2::is2Lnomix() &&
220  Trig2L_obj2::object() == Trig2Lmix::object2() &&
221  Trig1L_obj1::is1L() &&
222  Trig1L_obj1::object() == Trig2Lmix::object1() &&
223  Trig1L_obj2::is1L() &&
224  Trig1L_obj2::object() == Trig2Lmix::object2(),
225 
226  bool>;
229  template <typename Trig2L_obj1, typename Trig2Lsym_obj1, typename Trig2L_obj2,
230  typename Trig2Lsym_obj2, typename Trig2Lmix, typename Trig1L_obj1,
231  typename Trig1L_obj2>
232  auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1,
233  const Trig2Lsym_obj1, const Trig2L_obj2,
234  const Trig2Lsym_obj2, const Trig2Lmix, const Trig2Lmix,
235  const flat_set<Trig1L_obj1>&,
237  -> std::enable_if_t<
238  Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
239  Trig2L_obj1::object() == Trig2Lmix::object1() &&
240  Trig2L_obj2::is2Lnomix() &&
241  Trig2L_obj2::object() == Trig2Lmix::object2() &&
242  Trig2Lsym_obj1::is2Lsym() &&
243  Trig2Lsym_obj1::object() == Trig2Lmix::object1() &&
244  Trig2Lsym_obj2::is2Lsym() &&
245  Trig2Lsym_obj2::object() == Trig2Lmix::object2() &&
246  Trig1L_obj1::is1L() &&
247  Trig1L_obj1::object() == Trig2Lmix::object1() &&
248  Trig1L_obj2::is1L() &&
249  Trig1L_obj2::object() == Trig2Lmix::object2(),
250  bool>;
252  template <typename Trig3Lmix>
253  auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lmix,
254  Efficiencies&)
255  -> std::enable_if_t<Trig3Lmix::is3Lmix(), bool>;
257  template <typename Trig3Lmix1, typename Trig3Lmix2>
258  auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lmix1,
259  const Trig3Lmix2, Efficiencies&)
260  -> std::enable_if_t<Trig3Lmix1::is3Lmix() && Trig3Lmix2::is3Lmix() &&
261  Trig3Lmix1::object1() == Trig3Lmix2::object2() &&
262  Trig3Lmix1::object2() == Trig3Lmix2::object1(),
263  bool>;
265  template <typename Trig4Lsym>
266  auto globalEfficiency(const LeptonList&, unsigned, const Trig4Lsym,
267  Efficiencies&)
268  -> std::enable_if_t<Trig4Lsym::is4Lsym(), bool>;
269 
270  bool globalEfficiency_Factorized2(const LeptonList& leptons,
271  unsigned runNumber, GlobEffFunc func1,
272  GlobEffFunc func2,
273  Efficiencies& globalEfficiencies);
274  bool globalEfficiency_Factorized3(const LeptonList& leptons,
275  unsigned runNumber, GlobEffFunc func1,
276  GlobEffFunc func2, GlobEffFunc func3,
277  Efficiencies& globalEfficiencies);
278 
279  bool globalEfficiency_Toys(const LeptonList&, unsigned,
280  const std::vector<TrigDef>& triggers,
281  Efficiencies&);
282 
283  private:
284  class Helper {
285  public:
286  Helper(const std::vector<TrigDef>& defs);
287  Helper(Helper&&) = default;
288 
289  bool duplicates() const;
290  std::function<bool(Calculator*, const LeptonList&, unsigned, Efficiencies&)>
292 
293  bool findAndBindFunction();
294 
295  protected:
296  std::vector<TrigDef> m_defs;
297  unsigned m_n1L = 0, m_n2L = 0, m_n3L = 0, m_n4L = 0;
298 
299  template <TriggerType object_flag>
300  bool findAndBindFunction();
301  template <TriggerType object1_flag, TriggerType object2_flag>
302  bool findAndBindFunction();
303  template <typename... Trigs>
304  bool bindFunction();
305 
306  template <typename Param>
307  auto extract();
308  struct NoSuchTrigger {};
309  template <typename T>
310  struct Optional {
311  };
312  template <typename T>
314  };
315 
316  friend class CheckConfig;
317 };
318 
319 } // namespace TrigGlobEffCorr
320 #endif
TrigGlobalEfficiencyCorrectionTool::getLoosestLegAboveThreshold
std::size_t getLoosestLegAboveThreshold(const TrigGlobEffCorr::Lepton &lepton, const flat_set< std::size_t > &legs, bool &success)
sTgcDigitEffiDump.efficiencies
list efficiencies
translate the station name indices into the string staiton name
Definition: sTgcDigitEffiDump.py:23
TrigGlobEffCorr::Calculator::addPeriod
bool addPeriod(ImportData &data, const std::pair< unsigned, unsigned > &boundaries, const std::string &combination, bool useToys, std::size_t &uniqueElectronLeg, std::size_t &uniquePhotonLeg)
Definition: Calculator.cxx:29
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
TrigGlobEffCorr::Calculator::m_forceUnitSF
bool m_forceUnitSF
Definition: Calculator.h:68
TrigGlobalEfficiencyCorrectionTool::LeptonList
std::vector< TrigGlobEffCorr::Lepton > LeptonList
Definition: TrigGlobalEfficiencyCorrectionTool.h:140
athena_checkUpload.Period
int Period
--> Execution phase:
Definition: athena_checkUpload.py:179
ObjectType
ObjectType
Definition: BaseObject.h:11
TrigGlobEffCorr::Calculator::m_periods
std::vector< Period > m_periods
pointer updated at each call to compute() because the parent tool might have been moved in-between
Definition: Calculator.h:65
TrigGlobEffCorr::Calculator::findUniqueLeg
bool findUniqueLeg(xAOD::Type::ObjectType obj, std::size_t &uniqueLeg, const std::vector< TrigDef > &defs)
Definition: Calculator.cxx:89
TrigGlobEffCorr
the template specializations below must be enclosed in this namespace
Definition: Calculator.cxx:1596
TrigGlobEffCorr::Efficiencies
Definition: Efficiencies.h:14
TrigGlobalEfficiencyCorrectionTool.h
Efficiencies.h
TrigGlobEffCorr::Calculator::Period::Period
Period(const decltype(m_boundaries)&b, decltype(m_formula)&&f, decltype(m_triggers)&&t={})
only used for trigger matching; not filled otherwise.
Definition: Calculator.h:55
TrigGlobEffCorr::Calculator::Helper::Helper
Helper(const std::vector< TrigDef > &defs)
Definition: Calculator.cxx:1583
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
python.TrigTLAMonitorAlgorithm.triggers
triggers
Definition: TrigTLAMonitorAlgorithm.py:196
TrigGlobEffCorr::Calculator::Helper::BindPackedParam
to decorate the parameters of the findAndBind() function(s)
Definition: Calculator.h:313
TrigGlobEffCorr::Calculator::Period::m_triggers
std::vector< TrigDef > m_triggers
Definition: Calculator.h:53
TrigGlobEffCorr::Calculator::getLoosestLegAboveThreshold
auto getLoosestLegAboveThreshold(const Lepton &lepton, const flat_set< Trig1L > &trigs, bool &success) -> std::enable_if_t< Trig1L::is1L(), std::size_t >
Definition: Calculator.h:74
flat_set
boost::container::flat_set< Key > flat_set
Definition: CheckConfig.cxx:14
TrigGlobEffCorr::Calculator::aboveThreshold
bool aboveThreshold(const Lepton &p, std::size_t leg) const
Definition: Calculator.h:70
ImportData.h
AsgMessaging.h
TrigGlobEffCorr::Calculator::compute
bool compute(TrigGlobalEfficiencyCorrectionTool &parent, const LeptonList &leptons, unsigned runNumber, Efficiencies &efficiencies)
Definition: Calculator.cxx:125
TrigGlobEffCorr::Calculator::Helper::extract
auto extract()
Definition: Calculator.cxx:1637
TrigGlobEffCorr::Calculator::globalEfficiency_Factorized2
bool globalEfficiency_Factorized2(const LeptonList &leptons, unsigned runNumber, GlobEffFunc func1, GlobEffFunc func2, Efficiencies &globalEfficiencies)
Definition: Calculator.cxx:1420
TrigGlobEffCorr::Calculator::Helper::duplicates
bool duplicates() const
Definition: Calculator.cxx:1586
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:209
TrigGlobEffCorr::Calculator::Helper::bindFunction
bool bindFunction()
Definition: Calculator.cxx:1653
TrigGlobEffCorr::Calculator
Definition: Calculator.h:26
TrigGlobEffCorr::Calculator::m_cachedEfficiencies
std::map< std::pair< const Lepton *, std::size_t >, Efficiencies > m_cachedEfficiencies
Definition: Calculator.h:67
TrigGlobEffCorr::Calculator::Helper::m_n1L
unsigned m_n1L
Definition: Calculator.h:297
TrigGlobEffCorr::ImportData
Definition: ImportData.h:86
TrigGlobalEfficiencyCorrectionTool::aboveThreshold
bool aboveThreshold(const TrigGlobEffCorr::Lepton &p, std::size_t leg) const
TrigGlobEffCorr::Calculator::m_parent
TrigGlobalEfficiencyCorrectionTool * m_parent
Definition: Calculator.h:62
test_pyathena.parent
parent
Definition: test_pyathena.py:15
TrigGlobEffCorr::CheckConfig
Definition: CheckConfig.h:18
compute_lumi.leg
leg
Definition: compute_lumi.py:95
hist_file_dump.f
f
Definition: hist_file_dump.py:140
TrigGlobEffCorr::Calculator::Helper::m_defs
std::vector< TrigDef > m_defs
Definition: Calculator.h:296
TrigGlobEffCorr::Calculator::Helper::NoSuchTrigger
Definition: Calculator.h:308
TrigGlobEffCorr::Calculator::LeptonList
TrigGlobalEfficiencyCorrectionTool::LeptonList LeptonList
Definition: Calculator.h:27
TrigGlobEffCorr::Lepton
Definition: Lepton.h:16
TrigGlobEffCorr::Calculator::TrigDef
TrigGlobEffCorr::ImportData::TrigDef TrigDef
Definition: Calculator.h:28
asg::AsgMessaging
Class mimicking the AthMessaging class from the offline software.
Definition: AsgMessaging.h:40
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
python.ElectronD3PDObject.matched
matched
Definition: ElectronD3PDObject.py:138
TrigGlobEffCorr::Calculator::globalEfficiency_Factorized3
bool globalEfficiency_Factorized3(const LeptonList &leptons, unsigned runNumber, GlobEffFunc func1, GlobEffFunc func2, GlobEffFunc func3, Efficiencies &globalEfficiencies)
Definition: Calculator.cxx:1432
TrigGlobalEfficiencyCorrectionTool
Definition: TrigGlobalEfficiencyCorrectionTool.h:37
TrigGlobEffCorr::ImportData::TrigDef
Definition: ImportData.h:90
DeMoAtlasDataLoss.runNumber
string runNumber
Definition: DeMoAtlasDataLoss.py:64
TrigGlobEffCorr::Calculator::Calculator
Calculator(TrigGlobalEfficiencyCorrectionTool &parent, unsigned nPeriodsToReserve)
Definition: Calculator.cxx:22
TrigGlobEffCorr::Calculator::checkTriggerMatching
bool checkTriggerMatching(TrigGlobalEfficiencyCorrectionTool &parent, bool &matched, const LeptonList &leptons, unsigned runNumber)
Definition: Calculator.cxx:144
TrigGlobEffCorr::Calculator::getCachedTriggerLegEfficiencies
Efficiencies getCachedTriggerLegEfficiencies(const Lepton &lepton, unsigned runNumber, std::size_t leg, bool &success)
Definition: Calculator.cxx:265
TrigGlobEffCorr::Calculator::Helper::m_n3L
unsigned m_n3L
Definition: Calculator.h:297
TrigGlobEffCorr::Calculator::Period::m_boundaries
const std::pair< unsigned, unsigned > m_boundaries
Definition: Calculator.h:50
TrigGlobEffCorr::Calculator::Helper::m_n4L
unsigned m_n4L
Definition: Calculator.h:297
TrigGlobEffCorr::Calculator::Helper::m_formula
std::function< bool(Calculator *, const LeptonList &, unsigned, Efficiencies &)> m_formula
Definition: Calculator.h:291
TrigGlobEffCorr::Calculator::Helper::findAndBindFunction
bool findAndBindFunction()
top-level function
Definition: Calculator.cxx:1771
TrigGlobEffCorr::Calculator::globalEfficiency
auto globalEfficiency(const LeptonList &, unsigned, const Trig1L, Efficiencies &) -> std::enable_if_t< Trig1L::is1L(), bool >
One single-lepton trigger.
Definition: Calculator.cxx:313
TrigGlobEffCorr::Calculator::Helper
Definition: Calculator.h:284
TrigGlobEffCorr::Calculator::fillListOfLegsFor
bool fillListOfLegsFor(const Lepton &lepton, const std::vector< TrigDef > &triggers, flat_set< std::size_t > &validLegs) const
Definition: Calculator.cxx:1447
pickleTool.object
object
Definition: pickleTool.py:29
TrigGlobEffCorr::Calculator::Period::m_formula
GlobEffFunc m_formula
Definition: Calculator.h:51
TrigGlobEffCorr::Calculator::canTriggerBeFired
bool canTriggerBeFired(const TrigDef &trig, const std::vector< flat_set< std::size_t > > &firedLegs) const
Definition: Calculator.cxx:1465
TrigGlobEffCorr::Calculator::globalEfficiency_Toys
bool globalEfficiency_Toys(const LeptonList &, unsigned, const std::vector< TrigDef > &triggers, Efficiencies &)
Definition: Calculator.cxx:1513
TrigGlobEffCorr::Calculator::getRelevantTriggersForUser
bool getRelevantTriggersForUser(TrigGlobalEfficiencyCorrectionTool &parent, std::vector< std::string > &triggers, unsigned runNumber)
Definition: Calculator.cxx:233
python.PyAthena.obj
obj
Definition: PyAthena.py:132
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
TrigGlobEffCorr::Calculator::Helper::m_n2L
unsigned m_n2L
Definition: Calculator.h:297
TrigGlobEffCorr::Calculator::GlobEffFunc
std::function< bool(Calculator *, const LeptonList &, unsigned, Efficiencies &)> GlobEffFunc
Definition: Calculator.h:30
TrigGlobEffCorr::Calculator::Helper::Helper
Helper(Helper &&)=default
TrigGlobEffCorr::Calculator::Period
Definition: Calculator.h:49
TrigGlobEffCorr::Calculator::Helper::Optional
Definition: Calculator.h:310
TrigGlobEffCorr::Calculator::getPeriod
const Period * getPeriod(unsigned runNumber) const
Definition: Calculator.cxx:111