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  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>
58  Period(const decltype(m_boundaries)& b, decltype(m_formula)&& f,
60  decltype(m_triggers)&& t = {})
62  };
63 
64  private:
67 
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>
78  auto getLoosestLegAboveThreshold(const Lepton& lepton,
79  const flat_set<Trig1L>& trigs, bool& success)
80  -> std::enable_if_t<Trig1L::is1L(), std::size_t> {
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;
90  bool canTriggerBeFired(
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,
100  Efficiencies&)
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() &&
108  bool>;
110  template <typename Trig1L>
111  auto globalEfficiency(const LeptonList&, unsigned, const flat_set<Trig1L>&,
112  Efficiencies&)
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() &&
121  bool>;
123  template <typename Trig2Lmix>
124  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lmix,
125  Efficiencies&)
126  -> std::enable_if_t<Trig2Lmix::is2Lmix(), bool>;
128  template <typename Trig2Lsym>
129  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym,
130  Efficiencies&)
131  -> std::enable_if_t<Trig2Lsym::is2Lsym(), bool>;
133  template <typename Trig2Lasym>
134  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym,
135  Efficiencies&)
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,
140  const flat_set<Trig1L_obj1>&,
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() &&
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() &&
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() &&
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() &&
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() &&
182  Trig1L::is1L() &&
184  bool>;
186  template <typename Trig3Lsym>
187  auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lsym,
188  Efficiencies&)
189  -> std::enable_if_t<Trig3Lsym::is3Lsym(), bool>;
191  template <typename Trig3Lhalfsym>
192  auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lhalfsym,
193  Efficiencies&)
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,
219  const flat_set<Trig1L_obj1>&,
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,
239  const flat_set<Trig1L_obj1>&,
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,
258  Efficiencies&)
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,
271  Efficiencies&)
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
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:72
TrigGlobalEfficiencyCorrectionTool::LeptonList
std::vector< TrigGlobEffCorr::Lepton > LeptonList
Definition: TrigGlobalEfficiencyCorrectionTool.h:143
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:69
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:1607
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:59
TrigGlobEffCorr::Calculator::Helper::Helper
Helper(const std::vector< TrigDef > &defs)
Definition: Calculator.cxx:1594
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:317
TrigGlobEffCorr::Calculator::Period::m_triggers
std::vector< TrigDef > m_triggers
Definition: Calculator.h:57
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:78
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:74
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:1648
TrigGlobEffCorr::Calculator::globalEfficiency_Factorized2
bool globalEfficiency_Factorized2(const LeptonList &leptons, unsigned runNumber, GlobEffFunc func1, GlobEffFunc func2, Efficiencies &globalEfficiencies)
Definition: Calculator.cxx:1431
TrigGlobEffCorr::Calculator::Helper::duplicates
bool duplicates() const
Definition: Calculator.cxx:1597
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:209
TrigGlobEffCorr::Calculator::Helper::bindFunction
bool bindFunction()
Definition: Calculator.cxx:1664
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:71
TrigGlobEffCorr::Calculator::Helper::m_n1L
unsigned m_n1L
Definition: Calculator.h:301
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:66
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:300
TrigGlobEffCorr::Calculator::Helper::NoSuchTrigger
Definition: Calculator.h:312
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
TrigGlobEffCorr::Calculator::checkTriggerMatching
bool checkTriggerMatching(TrigGlobalEfficiencyCorrectionTool &parent, bool &matched, const LeptonList &leptons, unsigned runNumber)
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:1443
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::getCachedTriggerLegEfficiencies
Efficiencies getCachedTriggerLegEfficiencies(const Lepton &lepton, unsigned runNumber, std::size_t leg, bool &success)
Definition: Calculator.cxx:276
TrigGlobEffCorr::Calculator::Helper::m_n3L
unsigned m_n3L
Definition: Calculator.h:301
TrigGlobEffCorr::Calculator::Period::m_boundaries
const std::pair< unsigned, unsigned > m_boundaries
Definition: Calculator.h:54
TrigGlobEffCorr::Calculator::Helper::m_n4L
unsigned m_n4L
Definition: Calculator.h:301
TrigGlobEffCorr::Calculator::Helper::m_formula
std::function< bool(Calculator *, const LeptonList &, unsigned, Efficiencies &)> m_formula
Definition: Calculator.h:295
TrigGlobEffCorr::Calculator::Helper::findAndBindFunction
bool findAndBindFunction()
top-level function
Definition: Calculator.cxx:1782
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:324
TrigGlobEffCorr::Calculator::Helper
Definition: Calculator.h:288
TrigGlobEffCorr::Calculator::fillListOfLegsFor
bool fillListOfLegsFor(const Lepton &lepton, const std::vector< TrigDef > &triggers, flat_set< std::size_t > &validLegs) const
Definition: Calculator.cxx:1458
pickleTool.object
object
Definition: pickleTool.py:29
TrigGlobEffCorr::Calculator::Period::m_formula
GlobEffFunc m_formula
Definition: Calculator.h:55
TrigGlobEffCorr::Calculator::canTriggerBeFired
bool canTriggerBeFired(const TrigDef &trig, const std::vector< flat_set< std::size_t > > &firedLegs) const
Definition: Calculator.cxx:1476
TrigGlobEffCorr::Calculator::globalEfficiency_Toys
bool globalEfficiency_Toys(const LeptonList &, unsigned, const std::vector< TrigDef > &triggers, Efficiencies &)
Definition: Calculator.cxx:1524
TrigGlobEffCorr::Calculator::getRelevantTriggersForUser
bool getRelevantTriggersForUser(TrigGlobalEfficiencyCorrectionTool &parent, std::vector< std::string > &triggers, unsigned runNumber)
Definition: Calculator.cxx:244
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:301
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:53
TrigGlobEffCorr::Calculator::Helper::Optional
Definition: Calculator.h:314
TrigGlobEffCorr::Calculator::getPeriod
const Period * getPeriod(unsigned runNumber) const
Definition: Calculator.cxx:111