ATLAS Offline Software
Loading...
Searching...
No Matches
Calculator.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 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 <functional>
12#include <map>
13
18#include <flat_set>
19
20namespace TrigGlobEffCorr {
21
22class Lepton;
23
27 using GlobEffFunc = std::function<bool(Calculator*, const LeptonList&,
28 unsigned, Efficiencies&)>;
29
30 public:
32 unsigned nPeriodsToReserve);
33 bool addPeriod(ImportData& data,
34 const std::pair<unsigned, unsigned>& boundaries,
35 const std::string& combination, bool useToys,
36 std::size_t& uniqueElectronLeg, std::size_t& uniquePhotonLeg);
38 const LeptonList& leptons, unsigned runNumber,
39 Efficiencies& efficiencies);
41 bool& matched, const LeptonList& leptons,
42 unsigned runNumber);
44 bool& matched,
45 std::unordered_map<std::string, bool>* matched_per_trigger,
46 const LeptonList& leptons, unsigned runNumber);
48 std::vector<std::string>& triggers,
49 unsigned runNumber);
50
51 struct Period {
52 const std::pair<unsigned, unsigned> m_boundaries;
54 std::vector<TrigDef>
57 Period(const decltype(m_boundaries)& b, decltype(m_formula)&& f,
58 decltype(m_triggers)&& t = {})
59 : m_boundaries(b), m_formula(std::move(f)), m_triggers(std::move(t)) {}
60 };
61
62 private:
66
67 std::vector<Period> m_periods;
68 std::map<std::pair<const Lepton*, std::size_t>, Efficiencies>
69 m_cachedEfficiencies; // not thread safe
70 bool m_forceUnitSF{}; // not thread safe
71
72 bool aboveThreshold(const Lepton& p, std::size_t leg) const {
73 return m_parent->aboveThreshold(p, leg);
74 }
75 template <typename Trig1L>
77 const std::flat_set<Trig1L>& trigs, bool& success)
78 -> std::enable_if_t<Trig1L::is1L(), std::size_t> {
79 return m_parent->getLoosestLegAboveThreshold(
80 lepton, Trig1L::anonymize(trigs), success);
81 }
83 unsigned runNumber,
84 std::size_t leg, bool& success);
85 bool fillListOfLegsFor(const Lepton& lepton,
86 const std::vector<TrigDef>& triggers,
87 std::flat_set<std::size_t>& validLegs) const;
89 const TrigDef& trig,
90 const std::vector<std::flat_set<std::size_t> >& firedLegs) const;
91 const Period* getPeriod(unsigned runNumber) const;
92 bool findUniqueLeg(xAOD::Type::ObjectType obj, std::size_t& uniqueLeg,
93 const std::vector<TrigDef>& defs);
94
96 template <typename Trig1L>
97 auto globalEfficiency(const LeptonList&, unsigned, const Trig1L,
99 -> std::enable_if_t<Trig1L::is1L(), bool>;
101 template <typename Trig1L_obj1, typename Trig1L_obj2>
102 auto globalEfficiency(const LeptonList&, unsigned, const Trig1L_obj1 trig1,
103 const Trig1L_obj2 trig2, Efficiencies&)
104 -> std::enable_if_t<Trig1L_obj1::is1L() && Trig1L_obj2::is1L() &&
105 Trig1L_obj1::object() != Trig1L_obj2::object(),
106 bool>;
108 template <typename Trig1L>
109 auto globalEfficiency(const LeptonList&, unsigned, const std::flat_set<Trig1L>&,
111 -> std::enable_if_t<Trig1L::is1L(), bool>;
113 template <typename Trig1L_obj1, typename Trig1L_obj2>
114 auto globalEfficiency(const LeptonList&, unsigned,
115 const std::flat_set<Trig1L_obj1>& trigs1,
116 const std::flat_set<Trig1L_obj2>& trigs2, Efficiencies&)
117 -> std::enable_if_t<Trig1L_obj1::is1L() && Trig1L_obj2::is1L() &&
118 Trig1L_obj1::object() != Trig1L_obj2::object(),
119 bool>;
121 template <typename Trig2Lmix>
122 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lmix,
124 -> std::enable_if_t<Trig2Lmix::is2Lmix(), bool>;
126 template <typename Trig2Lsym>
127 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym,
129 -> std::enable_if_t<Trig2Lsym::is2Lsym(), bool>;
131 template <typename Trig2Lasym>
132 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym,
134 -> std::enable_if_t<Trig2Lasym::is2Lasym(), bool>;
136 template <typename Trig2Lmix, typename Trig1L_obj1, typename Trig1L_obj2>
137 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lmix,
138 const std::flat_set<Trig1L_obj1>&,
139 const std::flat_set<Trig1L_obj2>&, Efficiencies&)
140 -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig1L_obj1::is1L() &&
141 Trig2Lmix::object1() == Trig1L_obj1::object() &&
142 Trig1L_obj2::is1L() &&
143 Trig2Lmix::object2() == Trig1L_obj2::object(),
144 bool>;
146 template <typename Trig2L, typename Trig1L>
147 inline auto globalEfficiency(const LeptonList&, unsigned, const Trig2L,
148 const Trig1L, Efficiencies&)
149 -> std::enable_if_t<Trig2L::is2Lnomix() && Trig1L::is1L() &&
150 Trig2L::object() == Trig1L::object(),
151 bool>;
153 template <typename Trig2Lsym, typename Trig1L>
154 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym,
155 const std::flat_set<Trig1L>&, Efficiencies&)
156 -> std::enable_if_t<Trig2Lsym::is2Lsym() && Trig1L::is1L() &&
157 Trig1L::object() == Trig2Lsym::object(),
158 bool>;
160 template <typename Trig2Lasym, typename Trig1L>
161 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym,
162 const std::flat_set<Trig1L>&, Efficiencies&)
163 -> std::enable_if_t<Trig2Lasym::is2Lasym() && Trig1L::is1L() &&
164 Trig1L::object() == Trig2Lasym::object(),
165 bool>;
167 template <typename Trig2Lsym, typename Trig1L>
168 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym,
169 const Trig2Lsym, const std::flat_set<Trig1L>&, Efficiencies&)
170 -> std::enable_if_t<Trig2Lsym::is2Lsym() && Trig1L::is1L() &&
171 Trig1L::object() == Trig2Lsym::object(),
172 bool>;
175 template <typename Trig2Lasym, typename Trig2Lsym, typename Trig1L>
176 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym,
177 const Trig2Lsym, const std::flat_set<Trig1L>&, Efficiencies&)
178 -> std::enable_if_t<Trig2Lasym::is2Lasym() && Trig2Lsym::is2Lsym() &&
179 Trig2Lsym::object() == Trig2Lasym::object() &&
180 Trig1L::is1L() &&
181 Trig1L::object() == Trig2Lasym::object(),
182 bool>;
184 template <typename Trig3Lsym>
185 auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lsym,
187 -> std::enable_if_t<Trig3Lsym::is3Lsym(), bool>;
189 template <typename Trig3Lhalfsym>
190 auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lhalfsym,
192 -> std::enable_if_t<Trig3Lhalfsym::is3Lhalfsym(), bool>;
194 template <typename Trig2L, typename Trig2Lmix>
195 auto globalEfficiency(const LeptonList&, unsigned, const Trig2L,
196 const Trig2Lmix, Efficiencies&)
197 -> std::enable_if_t<Trig2L::is2Lnomix() && Trig2Lmix::is2Lmix() &&
198 (Trig2Lmix::object1() == Trig2L::object() ||
199 Trig2Lmix::object2() == Trig2L::object()),
200 bool>;
203 template <typename Trig2L_obj1, typename Trig2L_obj2, typename Trig2Lmix>
204 auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1,
205 const Trig2L_obj2, const Trig2Lmix, Efficiencies&)
206 -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
207 Trig2L_obj1::object() == Trig2Lmix::object1() &&
208 Trig2L_obj2::is2Lnomix() &&
209 Trig2L_obj2::object() == Trig2Lmix::object2(),
210
211 bool>;
213 template <typename Trig2L_obj1, typename Trig2L_obj2, typename Trig2Lmix,
214 typename Trig1L_obj1, typename Trig1L_obj2>
215 auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1,
216 const Trig2L_obj2, const Trig2Lmix,
217 const std::flat_set<Trig1L_obj1>&,
218 const std::flat_set<Trig1L_obj2>&, Efficiencies&)
219 -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
220 Trig2L_obj1::object() == Trig2Lmix::object1() &&
221 Trig2L_obj2::is2Lnomix() &&
222 Trig2L_obj2::object() == Trig2Lmix::object2() &&
223 Trig1L_obj1::is1L() &&
224 Trig1L_obj1::object() == Trig2Lmix::object1() &&
225 Trig1L_obj2::is1L() &&
226 Trig1L_obj2::object() == Trig2Lmix::object2(),
227
228 bool>;
231 template <typename Trig2L_obj1, typename Trig2Lsym_obj1, typename Trig2L_obj2,
232 typename Trig2Lsym_obj2, typename Trig2Lmix, typename Trig1L_obj1,
233 typename Trig1L_obj2>
234 auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1,
235 const Trig2Lsym_obj1, const Trig2L_obj2,
236 const Trig2Lsym_obj2, const Trig2Lmix, const Trig2Lmix,
237 const std::flat_set<Trig1L_obj1>&,
238 const std::flat_set<Trig1L_obj2>&, Efficiencies&)
239 -> std::enable_if_t<
240 Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
241 Trig2L_obj1::object() == Trig2Lmix::object1() &&
242 Trig2L_obj2::is2Lnomix() &&
243 Trig2L_obj2::object() == Trig2Lmix::object2() &&
244 Trig2Lsym_obj1::is2Lsym() &&
245 Trig2Lsym_obj1::object() == Trig2Lmix::object1() &&
246 Trig2Lsym_obj2::is2Lsym() &&
247 Trig2Lsym_obj2::object() == Trig2Lmix::object2() &&
248 Trig1L_obj1::is1L() &&
249 Trig1L_obj1::object() == Trig2Lmix::object1() &&
250 Trig1L_obj2::is1L() &&
251 Trig1L_obj2::object() == Trig2Lmix::object2(),
252 bool>;
254 template <typename Trig3Lmix>
255 auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lmix,
257 -> std::enable_if_t<Trig3Lmix::is3Lmix(), bool>;
259 template <typename Trig3Lmix1, typename Trig3Lmix2>
260 auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lmix1,
261 const Trig3Lmix2, Efficiencies&)
262 -> std::enable_if_t<Trig3Lmix1::is3Lmix() && Trig3Lmix2::is3Lmix() &&
263 Trig3Lmix1::object1() == Trig3Lmix2::object2() &&
264 Trig3Lmix1::object2() == Trig3Lmix2::object1(),
265 bool>;
267 template <typename Trig4Lsym>
268 auto globalEfficiency(const LeptonList&, unsigned, const Trig4Lsym,
270 -> std::enable_if_t<Trig4Lsym::is4Lsym(), bool>;
271
272 bool globalEfficiency_Factorized2(const LeptonList& leptons,
273 unsigned runNumber, GlobEffFunc func1,
274 GlobEffFunc func2,
275 Efficiencies& globalEfficiencies);
276 bool globalEfficiency_Factorized3(const LeptonList& leptons,
277 unsigned runNumber, GlobEffFunc func1,
278 GlobEffFunc func2, GlobEffFunc func3,
279 Efficiencies& globalEfficiencies);
280
281 bool globalEfficiency_Toys(const LeptonList&, unsigned,
282 const std::vector<TrigDef>& triggers,
283 Efficiencies&);
284
285 private:
286 class Helper {
287 public:
288 Helper(const std::vector<TrigDef>& defs);
289 Helper(Helper&&) = default;
290
291 bool duplicates() const;
292 std::function<bool(Calculator*, const LeptonList&, unsigned, Efficiencies&)>
294
295 bool findAndBindFunction();
296
297 protected:
298 std::vector<TrigDef> m_defs;
299 unsigned m_n1L = 0, m_n2L = 0, m_n3L = 0, m_n4L = 0;
300
301 template <TriggerType object_flag>
302 bool findAndBindFunction();
303 template <TriggerType object1_flag, TriggerType object2_flag>
304 bool findAndBindFunction();
305 template <typename... Trigs>
306 bool bindFunction();
307
308 template <typename Param>
309 auto extract();
310 struct NoSuchTrigger {};
311 template <typename T>
312 struct Optional {
313 };
314 template <typename T>
316 };
317
318 friend class CheckConfig;
319};
320
321} // namespace TrigGlobEffCorr
322#endif
TrigGlobEffCorr::Calculator Calculator
std::vector< TrigDef > m_defs
Definition Calculator.h:298
bool findAndBindFunction()
top-level function
Helper(const std::vector< TrigDef > &defs)
std::function< bool(Calculator *, const LeptonList &, unsigned, Efficiencies &)> m_formula
Definition Calculator.h:293
TrigGlobalEfficiencyCorrectionTool * m_parent
Definition Calculator.h:64
std::vector< Period > m_periods
pointer updated at each call to compute() because the
Definition Calculator.h:67
std::map< std::pair< const Lepton *, std::size_t >, Efficiencies > m_cachedEfficiencies
Definition Calculator.h:69
bool checkTriggerMatching(TrigGlobalEfficiencyCorrectionTool &parent, bool &matched, const LeptonList &leptons, unsigned runNumber)
auto globalEfficiency(const LeptonList &, unsigned, const Trig1L, Efficiencies &) -> std::enable_if_t< Trig1L::is1L(), bool >
One single-lepton trigger.
Efficiencies getCachedTriggerLegEfficiencies(const Lepton &lepton, unsigned runNumber, std::size_t leg, bool &success)
auto getLoosestLegAboveThreshold(const Lepton &lepton, const std::flat_set< Trig1L > &trigs, bool &success) -> std::enable_if_t< Trig1L::is1L(), std::size_t >
Definition Calculator.h:76
TrigGlobalEfficiencyCorrectionTool::LeptonList LeptonList
Definition Calculator.h:25
bool addPeriod(ImportData &data, const std::pair< unsigned, unsigned > &boundaries, const std::string &combination, bool useToys, std::size_t &uniqueElectronLeg, std::size_t &uniquePhotonLeg)
TrigGlobEffCorr::ImportData::TrigDef TrigDef
Definition Calculator.h:26
bool getRelevantTriggersForUser(TrigGlobalEfficiencyCorrectionTool &parent, std::vector< std::string > &triggers, unsigned runNumber)
std::function< bool(Calculator *, const LeptonList &, unsigned, Efficiencies &)> GlobEffFunc
Definition Calculator.h:27
bool globalEfficiency_Factorized2(const LeptonList &leptons, unsigned runNumber, GlobEffFunc func1, GlobEffFunc func2, Efficiencies &globalEfficiencies)
bool compute(TrigGlobalEfficiencyCorrectionTool &parent, const LeptonList &leptons, unsigned runNumber, Efficiencies &efficiencies)
bool canTriggerBeFired(const TrigDef &trig, const std::vector< std::flat_set< std::size_t > > &firedLegs) const
const Period * getPeriod(unsigned runNumber) const
bool findUniqueLeg(xAOD::Type::ObjectType obj, std::size_t &uniqueLeg, const std::vector< TrigDef > &defs)
bool globalEfficiency_Factorized3(const LeptonList &leptons, unsigned runNumber, GlobEffFunc func1, GlobEffFunc func2, GlobEffFunc func3, Efficiencies &globalEfficiencies)
Calculator(TrigGlobalEfficiencyCorrectionTool &parent, unsigned nPeriodsToReserve)
bool globalEfficiency_Toys(const LeptonList &, unsigned, const std::vector< TrigDef > &triggers, Efficiencies &)
bool aboveThreshold(const Lepton &p, std::size_t leg) const
Definition Calculator.h:72
bool fillListOfLegsFor(const Lepton &lepton, const std::vector< TrigDef > &triggers, std::flat_set< std::size_t > &validLegs) const
std::vector< TrigGlobEffCorr::Lepton > LeptonList
Class mimicking the AthMessaging class from the offline software.
the template specializations below must be enclosed in this namespace
STL namespace.
ObjectType
Type of objects that have a representation in the xAOD EDM.
Definition ObjectType.h:32
to decorate the parameters of the findAndBind() function(s)
Definition Calculator.h:315
const std::pair< unsigned, unsigned > m_boundaries
Definition Calculator.h:52
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:57
std::vector< TrigDef > m_triggers
Definition Calculator.h:55