ATLAS Offline Software
Loading...
Searching...
No Matches
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
19template <typename Key>
20using flat_set = boost::container::flat_set<Key>;
21
22namespace TrigGlobEffCorr {
23
24class Lepton;
25
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,
41 Efficiencies& efficiencies);
43 bool& matched, const LeptonList& leptons,
44 unsigned runNumber);
46 bool& matched,
47 std::unordered_map<std::string, bool>* matched_per_trigger,
48 const LeptonList& leptons, unsigned runNumber);
50 std::vector<std::string>& triggers,
51 unsigned runNumber);
52
53 struct Period {
54 const std::pair<unsigned, unsigned> m_boundaries;
56 std::vector<TrigDef>
59 Period(const decltype(m_boundaries)& b, decltype(m_formula)&& f,
60 decltype(m_triggers)&& t = {})
61 : m_boundaries(b), m_formula(f), m_triggers(t) {}
62 };
63
64 private:
68
69 std::vector<Period> m_periods;
70 std::map<std::pair<const Lepton*, std::size_t>, Efficiencies>
71 m_cachedEfficiencies; // not thread safe
72 bool m_forceUnitSF; // not thread safe
73
74 bool aboveThreshold(const Lepton& p, std::size_t leg) const {
75 return m_parent->aboveThreshold(p, leg);
76 }
77 template <typename Trig1L>
79 const flat_set<Trig1L>& trigs, bool& success)
80 -> std::enable_if_t<Trig1L::is1L(), std::size_t> {
81 return m_parent->getLoosestLegAboveThreshold(
82 lepton, Trig1L::anonymize(trigs), success);
83 }
85 unsigned runNumber,
86 std::size_t leg, bool& success);
87 bool fillListOfLegsFor(const Lepton& lepton,
88 const std::vector<TrigDef>& triggers,
89 flat_set<std::size_t>& validLegs) const;
91 const TrigDef& trig,
92 const std::vector<flat_set<std::size_t> >& firedLegs) const;
93 const Period* getPeriod(unsigned runNumber) const;
94 bool findUniqueLeg(xAOD::Type::ObjectType obj, std::size_t& uniqueLeg,
95 const std::vector<TrigDef>& defs);
96
98 template <typename Trig1L>
99 auto globalEfficiency(const LeptonList&, unsigned, const Trig1L,
101 -> std::enable_if_t<Trig1L::is1L(), bool>;
103 template <typename Trig1L_obj1, typename Trig1L_obj2>
104 auto globalEfficiency(const LeptonList&, unsigned, const Trig1L_obj1 trig1,
105 const Trig1L_obj2 trig2, Efficiencies&)
106 -> std::enable_if_t<Trig1L_obj1::is1L() && Trig1L_obj2::is1L() &&
107 Trig1L_obj1::object() != Trig1L_obj2::object(),
108 bool>;
110 template <typename Trig1L>
111 auto globalEfficiency(const LeptonList&, unsigned, const flat_set<Trig1L>&,
113 -> std::enable_if_t<Trig1L::is1L(), bool>;
115 template <typename Trig1L_obj1, typename Trig1L_obj2>
116 auto globalEfficiency(const LeptonList&, unsigned,
117 const flat_set<Trig1L_obj1>& trigs1,
118 const flat_set<Trig1L_obj2>& trigs2, Efficiencies&)
119 -> std::enable_if_t<Trig1L_obj1::is1L() && Trig1L_obj2::is1L() &&
120 Trig1L_obj1::object() != Trig1L_obj2::object(),
121 bool>;
123 template <typename Trig2Lmix>
124 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lmix,
126 -> std::enable_if_t<Trig2Lmix::is2Lmix(), bool>;
128 template <typename Trig2Lsym>
129 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym,
131 -> std::enable_if_t<Trig2Lsym::is2Lsym(), bool>;
133 template <typename Trig2Lasym>
134 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym,
136 -> std::enable_if_t<Trig2Lasym::is2Lasym(), bool>;
138 template <typename Trig2Lmix, typename Trig1L_obj1, typename Trig1L_obj2>
139 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lmix,
142 -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig1L_obj1::is1L() &&
143 Trig2Lmix::object1() == Trig1L_obj1::object() &&
144 Trig1L_obj2::is1L() &&
145 Trig2Lmix::object2() == Trig1L_obj2::object(),
146 bool>;
148 template <typename Trig2L, typename Trig1L>
149 inline auto globalEfficiency(const LeptonList&, unsigned, const Trig2L,
150 const Trig1L, Efficiencies&)
151 -> std::enable_if_t<Trig2L::is2Lnomix() && Trig1L::is1L() &&
152 Trig2L::object() == Trig1L::object(),
153 bool>;
155 template <typename Trig2Lsym, typename Trig1L>
156 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym,
158 -> std::enable_if_t<Trig2Lsym::is2Lsym() && Trig1L::is1L() &&
159 Trig1L::object() == Trig2Lsym::object(),
160 bool>;
162 template <typename Trig2Lasym, typename Trig1L>
163 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym,
165 -> std::enable_if_t<Trig2Lasym::is2Lasym() && Trig1L::is1L() &&
166 Trig1L::object() == Trig2Lasym::object(),
167 bool>;
169 template <typename Trig2Lsym, typename Trig1L>
170 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym,
171 const Trig2Lsym, const flat_set<Trig1L>&, Efficiencies&)
172 -> std::enable_if_t<Trig2Lsym::is2Lsym() && Trig1L::is1L() &&
173 Trig1L::object() == Trig2Lsym::object(),
174 bool>;
177 template <typename Trig2Lasym, typename Trig2Lsym, typename Trig1L>
178 auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym,
179 const Trig2Lsym, const flat_set<Trig1L>&, Efficiencies&)
180 -> std::enable_if_t<Trig2Lasym::is2Lasym() && Trig2Lsym::is2Lsym() &&
181 Trig2Lsym::object() == Trig2Lasym::object() &&
182 Trig1L::is1L() &&
183 Trig1L::object() == Trig2Lasym::object(),
184 bool>;
186 template <typename Trig3Lsym>
187 auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lsym,
189 -> std::enable_if_t<Trig3Lsym::is3Lsym(), bool>;
191 template <typename Trig3Lhalfsym>
192 auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lhalfsym,
194 -> std::enable_if_t<Trig3Lhalfsym::is3Lhalfsym(), bool>;
196 template <typename Trig2L, typename Trig2Lmix>
197 auto globalEfficiency(const LeptonList&, unsigned, const Trig2L,
198 const Trig2Lmix, Efficiencies&)
199 -> std::enable_if_t<Trig2L::is2Lnomix() && Trig2Lmix::is2Lmix() &&
200 (Trig2Lmix::object1() == Trig2L::object() ||
201 Trig2Lmix::object2() == Trig2L::object()),
202 bool>;
205 template <typename Trig2L_obj1, typename Trig2L_obj2, typename Trig2Lmix>
206 auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1,
207 const Trig2L_obj2, const Trig2Lmix, Efficiencies&)
208 -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
209 Trig2L_obj1::object() == Trig2Lmix::object1() &&
210 Trig2L_obj2::is2Lnomix() &&
211 Trig2L_obj2::object() == Trig2Lmix::object2(),
212
213 bool>;
215 template <typename Trig2L_obj1, typename Trig2L_obj2, typename Trig2Lmix,
216 typename Trig1L_obj1, typename Trig1L_obj2>
217 auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1,
218 const Trig2L_obj2, const Trig2Lmix,
221 -> std::enable_if_t<Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
222 Trig2L_obj1::object() == Trig2Lmix::object1() &&
223 Trig2L_obj2::is2Lnomix() &&
224 Trig2L_obj2::object() == Trig2Lmix::object2() &&
225 Trig1L_obj1::is1L() &&
226 Trig1L_obj1::object() == Trig2Lmix::object1() &&
227 Trig1L_obj2::is1L() &&
228 Trig1L_obj2::object() == Trig2Lmix::object2(),
229
230 bool>;
233 template <typename Trig2L_obj1, typename Trig2Lsym_obj1, typename Trig2L_obj2,
234 typename Trig2Lsym_obj2, typename Trig2Lmix, typename Trig1L_obj1,
235 typename Trig1L_obj2>
236 auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1,
237 const Trig2Lsym_obj1, const Trig2L_obj2,
238 const Trig2Lsym_obj2, const Trig2Lmix, const Trig2Lmix,
241 -> std::enable_if_t<
242 Trig2Lmix::is2Lmix() && Trig2L_obj1::is2Lnomix() &&
243 Trig2L_obj1::object() == Trig2Lmix::object1() &&
244 Trig2L_obj2::is2Lnomix() &&
245 Trig2L_obj2::object() == Trig2Lmix::object2() &&
246 Trig2Lsym_obj1::is2Lsym() &&
247 Trig2Lsym_obj1::object() == Trig2Lmix::object1() &&
248 Trig2Lsym_obj2::is2Lsym() &&
249 Trig2Lsym_obj2::object() == Trig2Lmix::object2() &&
250 Trig1L_obj1::is1L() &&
251 Trig1L_obj1::object() == Trig2Lmix::object1() &&
252 Trig1L_obj2::is1L() &&
253 Trig1L_obj2::object() == Trig2Lmix::object2(),
254 bool>;
256 template <typename Trig3Lmix>
257 auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lmix,
259 -> std::enable_if_t<Trig3Lmix::is3Lmix(), bool>;
261 template <typename Trig3Lmix1, typename Trig3Lmix2>
262 auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lmix1,
263 const Trig3Lmix2, Efficiencies&)
264 -> std::enable_if_t<Trig3Lmix1::is3Lmix() && Trig3Lmix2::is3Lmix() &&
265 Trig3Lmix1::object1() == Trig3Lmix2::object2() &&
266 Trig3Lmix1::object2() == Trig3Lmix2::object1(),
267 bool>;
269 template <typename Trig4Lsym>
270 auto globalEfficiency(const LeptonList&, unsigned, const Trig4Lsym,
272 -> std::enable_if_t<Trig4Lsym::is4Lsym(), bool>;
273
274 bool globalEfficiency_Factorized2(const LeptonList& leptons,
275 unsigned runNumber, GlobEffFunc func1,
276 GlobEffFunc func2,
277 Efficiencies& globalEfficiencies);
278 bool globalEfficiency_Factorized3(const LeptonList& leptons,
279 unsigned runNumber, GlobEffFunc func1,
280 GlobEffFunc func2, GlobEffFunc func3,
281 Efficiencies& globalEfficiencies);
282
283 bool globalEfficiency_Toys(const LeptonList&, unsigned,
284 const std::vector<TrigDef>& triggers,
285 Efficiencies&);
286
287 private:
288 class Helper {
289 public:
290 Helper(const std::vector<TrigDef>& defs);
291 Helper(Helper&&) = default;
292
293 bool duplicates() const;
294 std::function<bool(Calculator*, const LeptonList&, unsigned, Efficiencies&)>
296
297 bool findAndBindFunction();
298
299 protected:
300 std::vector<TrigDef> m_defs;
301 unsigned m_n1L = 0, m_n2L = 0, m_n3L = 0, m_n4L = 0;
302
303 template <TriggerType object_flag>
304 bool findAndBindFunction();
305 template <TriggerType object1_flag, TriggerType object2_flag>
306 bool findAndBindFunction();
307 template <typename... Trigs>
308 bool bindFunction();
309
310 template <typename Param>
311 auto extract();
312 struct NoSuchTrigger {};
313 template <typename T>
314 struct Optional {
315 };
316 template <typename T>
318 };
319
320 friend class CheckConfig;
321};
322
323} // namespace TrigGlobEffCorr
324#endif
boost::container::flat_set< Key > flat_set
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
TrigGlobEffCorr::Calculator Calculator
TrigGlobEffCorr::Lepton Lepton
std::vector< TrigDef > m_defs
Definition Calculator.h:300
bool findAndBindFunction()
top-level function
Helper(const std::vector< TrigDef > &defs)
std::function< bool(Calculator *, const LeptonList &, unsigned, Efficiencies &)> m_formula
Definition Calculator.h:295
TrigGlobalEfficiencyCorrectionTool * m_parent
Definition Calculator.h:66
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:69
std::map< std::pair< const Lepton *, std::size_t >, Efficiencies > m_cachedEfficiencies
Definition Calculator.h:71
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.
auto getLoosestLegAboveThreshold(const Lepton &lepton, const flat_set< Trig1L > &trigs, bool &success) -> std::enable_if_t< Trig1L::is1L(), std::size_t >
Definition Calculator.h:78
Efficiencies getCachedTriggerLegEfficiencies(const Lepton &lepton, unsigned runNumber, std::size_t leg, bool &success)
bool canTriggerBeFired(const TrigDef &trig, const std::vector< flat_set< std::size_t > > &firedLegs) const
TrigGlobalEfficiencyCorrectionTool::LeptonList LeptonList
Definition Calculator.h:27
bool addPeriod(ImportData &data, const std::pair< unsigned, unsigned > &boundaries, const std::string &combination, bool useToys, std::size_t &uniqueElectronLeg, std::size_t &uniquePhotonLeg)
std::function< bool(Calculator *, const LeptonList &, unsigned, Efficiencies &)> GlobEffFunc
Definition Calculator.h:29
TrigGlobEffCorr::ImportData::TrigDef TrigDef
Definition Calculator.h:28
bool getRelevantTriggersForUser(TrigGlobalEfficiencyCorrectionTool &parent, std::vector< std::string > &triggers, unsigned runNumber)
bool fillListOfLegsFor(const Lepton &lepton, const std::vector< TrigDef > &triggers, flat_set< std::size_t > &validLegs) const
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)
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:74
std::vector< TrigGlobEffCorr::Lepton > LeptonList
Class mimicking the AthMessaging class from the offline software.
the template specializations below must be enclosed in this 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:317
const std::pair< unsigned, unsigned > m_boundaries
Definition Calculator.h:54
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:59
std::vector< TrigDef > m_triggers
Definition Calculator.h:57