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 
14 
15 #include <map>
16 #include <algorithm>
17 #include <functional>
18 #include <boost/container/flat_set.hpp>
19 template<typename Key> using flat_set = boost::container::flat_set<Key>;
20 
21 namespace TrigGlobEffCorr
22 {
23 
24 class Lepton;
25 
27 {
30  using GlobEffFunc = std::function<bool(Calculator*,const LeptonList&,unsigned,Efficiencies&)>;
31 
32 public:
33  Calculator(TrigGlobalEfficiencyCorrectionTool& parent, unsigned nPeriodsToReserve);
34  bool addPeriod(ImportData& data, const std::pair<unsigned,unsigned>& boundaries, const std::string& combination,
35  bool useToys, std::size_t& uniqueElectronLeg, std::size_t& uniquePhotonLeg);
39 
40  struct Period
41  {
42  const std::pair<unsigned,unsigned> m_boundaries;
44  std::vector<TrigDef> m_triggers;
45  Period(const decltype(m_boundaries)& b, decltype(m_formula)&& f, decltype(m_triggers)&& t = {}) : m_boundaries(b), m_formula(f), m_triggers(t) {}
46  };
47 
48 private:
50 
51  std::vector<Period> m_periods;
52  std::map<std::pair<const Lepton*, std::size_t>, Efficiencies> m_cachedEfficiencies; // not thread safe
53  bool m_forceUnitSF; // not thread safe
54 
55  bool aboveThreshold(const Lepton& p,std::size_t leg) const { return m_parent->aboveThreshold(p, leg); }
56  template<typename Trig1L> auto getLoosestLegAboveThreshold(const Lepton& lepton, const flat_set<Trig1L>& trigs, bool& success)
57  -> std::enable_if_t<Trig1L::is1L(), std::size_t>
58  { return m_parent->getLoosestLegAboveThreshold(lepton, Trig1L::anonymize(trigs), success); }
59  Efficiencies getCachedTriggerLegEfficiencies(const Lepton& lepton, unsigned runNumber, std::size_t leg, bool& success);
60  bool fillListOfLegsFor(const Lepton& lepton, const std::vector<TrigDef>& triggers, flat_set<std::size_t>& validLegs) const;
61  bool canTriggerBeFired(const TrigDef& trig, const std::vector<flat_set<std::size_t> >& firedLegs) const;
62  const Period* getPeriod(unsigned runNumber) const;
63  bool findUniqueLeg(xAOD::Type::ObjectType obj, std::size_t& uniqueLeg, const std::vector<TrigDef>& defs);
64 
66  template<typename Trig1L>
67  auto globalEfficiency(const LeptonList&, unsigned, const Trig1L, Efficiencies&)
68  -> std::enable_if_t<Trig1L::is1L(), bool>;
70  template<typename Trig1L_obj1, typename Trig1L_obj2>
71  auto globalEfficiency(const LeptonList&, unsigned, const Trig1L_obj1 trig1, const Trig1L_obj2 trig2, Efficiencies&)
72  -> std::enable_if_t<Trig1L_obj1::is1L()
73  && Trig1L_obj2::is1L()
75  bool>;
77  template<typename Trig1L>
78  auto globalEfficiency(const LeptonList&, unsigned, const flat_set<Trig1L>&, Efficiencies&)
79  -> std::enable_if_t<Trig1L::is1L(), bool>;
81  template<typename Trig1L_obj1, typename Trig1L_obj2>
82  auto globalEfficiency(const LeptonList&, unsigned, const flat_set<Trig1L_obj1>& trigs1, const flat_set<Trig1L_obj2>& trigs2, Efficiencies&)
83  -> std::enable_if_t<Trig1L_obj1::is1L()
84  && Trig1L_obj2::is1L()
86  bool>;
88  template<typename Trig2Lmix>
89  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lmix, Efficiencies&)
90  -> std::enable_if_t<Trig2Lmix::is2Lmix(), bool>;
92  template<typename Trig2Lsym>
93  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym , Efficiencies&)
94  -> std::enable_if_t<Trig2Lsym::is2Lsym(), bool>;
96  template<typename Trig2Lasym>
97  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym, Efficiencies&)
98  -> std::enable_if_t<Trig2Lasym::is2Lasym(), bool>;
100  template<typename Trig2Lmix, typename Trig1L_obj1, typename Trig1L_obj2>
101  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lmix, const flat_set<Trig1L_obj1>&, const flat_set<Trig1L_obj2>&, Efficiencies&)
102  -> std::enable_if_t<Trig2Lmix::is2Lmix()
103  && Trig1L_obj1::is1L() && Trig2Lmix::object1()==Trig1L_obj1::object()
104  && Trig1L_obj2::is1L() && Trig2Lmix::object2()==Trig1L_obj2::object(),
105  bool>;
107  template<typename Trig2L, typename Trig1L>
108  inline auto globalEfficiency(const LeptonList&, unsigned, const Trig2L, const Trig1L, Efficiencies&)
109  -> std::enable_if_t<Trig2L::is2Lnomix()
110  && Trig1L::is1L()
112  bool>;
114  template<typename Trig2Lsym, typename Trig1L>
115  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym, const flat_set<Trig1L>&, Efficiencies&)
116  -> std::enable_if_t<Trig2Lsym::is2Lsym()
117  && Trig1L::is1L()
119  bool>;
121  template<typename Trig2Lasym, typename Trig1L>
122  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym, const flat_set<Trig1L>&, Efficiencies&)
123  -> std::enable_if_t<Trig2Lasym::is2Lasym()
124  && Trig1L::is1L()
126  bool>;
128  template<typename Trig2Lsym, typename Trig1L>
129  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lsym, const Trig2Lsym, const flat_set<Trig1L>&, Efficiencies&)
130  -> std::enable_if_t<Trig2Lsym::is2Lsym()
131  && Trig1L::is1L()
133  bool>;
135  template<typename Trig2Lasym, typename Trig2Lsym, typename Trig1L>
136  auto globalEfficiency(const LeptonList&, unsigned, const Trig2Lasym, const Trig2Lsym, const flat_set<Trig1L>&, Efficiencies&)
137  -> std::enable_if_t<Trig2Lasym::is2Lasym()
138  && Trig2Lsym::is2Lsym() && Trig2Lsym::object()==Trig2Lasym::object()
139  && Trig1L::is1L() && Trig1L::object()==Trig2Lasym::object(),
140  bool>;
142  template<typename Trig3Lsym>
143  auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lsym, Efficiencies&)
144  -> std::enable_if_t<Trig3Lsym::is3Lsym(), bool>;
146  template<typename Trig3Lhalfsym>
147  auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lhalfsym, Efficiencies&)
148  -> std::enable_if_t<Trig3Lhalfsym::is3Lhalfsym(), bool>;
150  template<typename Trig2L, typename Trig2Lmix>
151  auto globalEfficiency(const LeptonList&, unsigned, const Trig2L, const Trig2Lmix, Efficiencies&)
152  -> std::enable_if_t<Trig2L::is2Lnomix()
153  && Trig2Lmix::is2Lmix()
154  && (Trig2Lmix::object1()==Trig2L::object() || Trig2Lmix::object2()==Trig2L::object()),
155  bool>;
157  template<typename Trig2L_obj1, typename Trig2L_obj2, typename Trig2Lmix>
158  auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1, const Trig2L_obj2, const Trig2Lmix, Efficiencies&)
159  -> std::enable_if_t<Trig2Lmix::is2Lmix()
160  && Trig2L_obj1::is2Lnomix() && Trig2L_obj1::object() == Trig2Lmix::object1()
161  && Trig2L_obj2::is2Lnomix() && Trig2L_obj2::object() == Trig2Lmix::object2(),
162 
163  bool>;
165  template<typename Trig2L_obj1, typename Trig2L_obj2, typename Trig2Lmix, typename Trig1L_obj1, typename Trig1L_obj2>
166  auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1, const Trig2L_obj2, const Trig2Lmix,
168  -> std::enable_if_t<Trig2Lmix::is2Lmix()
169  && Trig2L_obj1::is2Lnomix() && Trig2L_obj1::object()==Trig2Lmix::object1()
170  && Trig2L_obj2::is2Lnomix() && Trig2L_obj2::object()==Trig2Lmix::object2()
171  && Trig1L_obj1::is1L() && Trig1L_obj1::object()==Trig2Lmix::object1()
172  && Trig1L_obj2::is1L() && Trig1L_obj2::object()==Trig2Lmix::object2(),
173 
174  bool>;
176  template<typename Trig2L_obj1, typename Trig2Lsym_obj1, typename Trig2L_obj2, typename Trig2Lsym_obj2,
177  typename Trig2Lmix, typename Trig1L_obj1, typename Trig1L_obj2>
178  auto globalEfficiency(const LeptonList&, unsigned, const Trig2L_obj1, const Trig2Lsym_obj1, const Trig2L_obj2, const Trig2Lsym_obj2,
179  const Trig2Lmix, const Trig2Lmix, const flat_set<Trig1L_obj1>&, const flat_set<Trig1L_obj2>&, Efficiencies&)
180  -> std::enable_if_t<Trig2Lmix::is2Lmix()
181  && Trig2L_obj1::is2Lnomix() && Trig2L_obj1::object()==Trig2Lmix::object1()
182  && Trig2L_obj2::is2Lnomix() && Trig2L_obj2::object()==Trig2Lmix::object2()
183  && Trig2Lsym_obj1::is2Lsym() && Trig2Lsym_obj1::object()==Trig2Lmix::object1()
184  && Trig2Lsym_obj2::is2Lsym() && Trig2Lsym_obj2::object()==Trig2Lmix::object2()
185  && Trig1L_obj1::is1L() && Trig1L_obj1::object()==Trig2Lmix::object1()
186  && Trig1L_obj2::is1L() && Trig1L_obj2::object()==Trig2Lmix::object2(),
187  bool>;
189  template<typename Trig3Lmix>
190  auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lmix, Efficiencies&)
191  -> std::enable_if_t<Trig3Lmix::is3Lmix(), bool>;
193  template<typename Trig3Lmix1, typename Trig3Lmix2>
194  auto globalEfficiency(const LeptonList&, unsigned, const Trig3Lmix1, const Trig3Lmix2, Efficiencies&)
195  -> std::enable_if_t<Trig3Lmix1::is3Lmix()
196  && Trig3Lmix2::is3Lmix()
197  && Trig3Lmix1::object1() == Trig3Lmix2::object2()
198  && Trig3Lmix1::object2() == Trig3Lmix2::object1(),
199  bool>;
201  template<typename Trig4Lsym>
202  auto globalEfficiency(const LeptonList&, unsigned, const Trig4Lsym, Efficiencies&)
203  -> std::enable_if_t<Trig4Lsym::is4Lsym(), bool>;
204 
205  bool globalEfficiency_Factorized2(const LeptonList& leptons, unsigned runNumber, GlobEffFunc func1, GlobEffFunc func2, Efficiencies& globalEfficiencies);
206  bool globalEfficiency_Factorized3(const LeptonList& leptons, unsigned runNumber, GlobEffFunc func1, GlobEffFunc func2, GlobEffFunc func3, Efficiencies& globalEfficiencies);
207 
208  bool globalEfficiency_Toys(const LeptonList&, unsigned, const std::vector<TrigDef>& triggers, Efficiencies&);
209 
210 private:
211  class Helper
212  {
213  public:
214  Helper(const std::vector<TrigDef>& defs);
215  Helper(Helper&&) = default;
216 
217  bool duplicates() const;
218  std::function<bool(Calculator*,const LeptonList&,unsigned,Efficiencies&)> m_formula;
219 
220  bool findAndBindFunction();
221 
222  protected:
223  std::vector<TrigDef> m_defs;
224  unsigned m_n1L = 0, m_n2L = 0, m_n3L = 0, m_n4L = 0;
225 
226  template<TriggerType object_flag> bool findAndBindFunction();
227  template<TriggerType object1_flag, TriggerType object2_flag> bool findAndBindFunction();
228  template<typename... Trigs> bool bindFunction();
229 
230  template<typename Param> auto extract();
231  struct NoSuchTrigger {};
232  template<typename T> struct Optional{};
233  template<typename T> struct BindPackedParam;
234 
235  };
236 
237  friend class CheckConfig;
238 };
239 
240 }
241 #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:53
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
TrigGlobalEfficiencyCorrectionTool::LeptonList
std::vector< TrigGlobEffCorr::Lepton > LeptonList
Definition: TrigGlobalEfficiencyCorrectionTool.h:106
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:51
TrigGlobEffCorr::Calculator::findUniqueLeg
bool findUniqueLeg(xAOD::Type::ObjectType obj, std::size_t &uniqueLeg, const std::vector< TrigDef > &defs)
Definition: Calculator.cxx:85
TrigGlobEffCorr
the template specializations below must be enclosed in this namespace
Definition: Calculator.cxx:1240
TrigGlobEffCorr::Calculator::Period::m_boundaries
const std::pair< unsigned, unsigned > m_boundaries
Definition: Calculator.h:42
TrigGlobEffCorr::Efficiencies
Definition: Efficiencies.h:16
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. Also, single-lepton OR triggers are split!
Definition: Calculator.h:45
TrigGlobEffCorr::Calculator::Helper::Helper
Helper(const std::vector< TrigDef > &defs)
Definition: Calculator.cxx:1226
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:233
TrigGlobEffCorr::Calculator::Period::m_triggers
std::vector< TrigDef > m_triggers
Definition: Calculator.h:44
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:56
flat_set
boost::container::flat_set< Key > flat_set
Definition: CheckConfig.cxx:11
TrigGlobEffCorr::Calculator::aboveThreshold
bool aboveThreshold(const Lepton &p, std::size_t leg) const
Definition: Calculator.h:55
ImportData.h
AsgMessaging.h
TrigGlobEffCorr::Calculator::compute
bool compute(TrigGlobalEfficiencyCorrectionTool &parent, const LeptonList &leptons, unsigned runNumber, Efficiencies &efficiencies)
Definition: Calculator.cxx:116
TrigGlobEffCorr::Calculator::Helper::extract
auto extract()
Definition: Calculator.cxx:1276
TrigGlobEffCorr::Calculator::globalEfficiency_Factorized2
bool globalEfficiency_Factorized2(const LeptonList &leptons, unsigned runNumber, GlobEffFunc func1, GlobEffFunc func2, Efficiencies &globalEfficiencies)
Definition: Calculator.cxx:1065
TrigGlobEffCorr::Calculator::Helper::duplicates
bool duplicates() const
Definition: Calculator.cxx:1231
TrigGlobEffCorr::Calculator::Helper::bindFunction
bool bindFunction()
Definition: Calculator.cxx:1291
TrigGlobEffCorr::Calculator::GlobEffFunc
std::function< bool(Calculator *, const LeptonList &, unsigned, Efficiencies &)> GlobEffFunc
Definition: Calculator.h:30
TrigGlobEffCorr::Calculator
Definition: Calculator.h:27
TrigGlobEffCorr::Calculator::m_cachedEfficiencies
std::map< std::pair< const Lepton *, std::size_t >, Efficiencies > m_cachedEfficiencies
Definition: Calculator.h:52
TrigGlobEffCorr::Calculator::Helper::m_n1L
unsigned m_n1L
Definition: Calculator.h:224
TrigGlobEffCorr::ImportData
Definition: ImportData.h:88
TrigGlobalEfficiencyCorrectionTool::aboveThreshold
bool aboveThreshold(const TrigGlobEffCorr::Lepton &p, std::size_t leg) const
TrigGlobEffCorr::Calculator::m_parent
TrigGlobalEfficiencyCorrectionTool * m_parent
Definition: Calculator.h:49
test_pyathena.parent
parent
Definition: test_pyathena.py:15
TrigGlobEffCorr::CheckConfig
Definition: CheckConfig.h:20
compute_lumi.leg
leg
Definition: compute_lumi.py:95
TrigGlobEffCorr::Calculator::Helper::m_defs
std::vector< TrigDef > m_defs
Definition: Calculator.h:223
TrigGlobEffCorr::Calculator::Helper::NoSuchTrigger
Definition: Calculator.h:231
TrigGlobEffCorr::Calculator::LeptonList
TrigGlobalEfficiencyCorrectionTool::LeptonList LeptonList
Definition: Calculator.h:28
TrigGlobEffCorr::Lepton
Definition: Lepton.h:18
TrigGlobEffCorr::Calculator::TrigDef
TrigGlobEffCorr::ImportData::TrigDef TrigDef
Definition: Calculator.h:29
asg::AsgMessaging
Class mimicking the AthMessaging class from the offline software.
Definition: AsgMessaging.h:40
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
TrigGlobEffCorr::Calculator::Helper::m_formula
std::function< bool(Calculator *, const LeptonList &, unsigned, Efficiencies &)> m_formula
Definition: Calculator.h:218
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:1074
TrigGlobalEfficiencyCorrectionTool
Definition: TrigGlobalEfficiencyCorrectionTool.h:39
TrigGlobEffCorr::ImportData::TrigDef
Definition: ImportData.h:93
DeMoAtlasDataLoss.runNumber
string runNumber
Definition: DeMoAtlasDataLoss.py:64
TrigGlobEffCorr::Calculator::Calculator
Calculator(TrigGlobalEfficiencyCorrectionTool &parent, unsigned nPeriodsToReserve)
Definition: Calculator.cxx:21
TrigGlobEffCorr::Calculator::checkTriggerMatching
bool checkTriggerMatching(TrigGlobalEfficiencyCorrectionTool &parent, bool &matched, const LeptonList &leptons, unsigned runNumber)
Definition: Calculator.cxx:133
TrigGlobEffCorr::Calculator::getCachedTriggerLegEfficiencies
Efficiencies getCachedTriggerLegEfficiencies(const Lepton &lepton, unsigned runNumber, std::size_t leg, bool &success)
Definition: Calculator.cxx:241
TrigGlobEffCorr::Calculator::Helper::m_n3L
unsigned m_n3L
Definition: Calculator.h:224
TrigGlobEffCorr::Calculator::Helper::m_n4L
unsigned m_n4L
Definition: Calculator.h:224
TrigGlobEffCorr::Calculator::Helper::findAndBindFunction
bool findAndBindFunction()
top-level function
Definition: Calculator.cxx:1394
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:284
TrigGlobEffCorr::Calculator::Helper
Definition: Calculator.h:212
TrigGlobEffCorr::Calculator::fillListOfLegsFor
bool fillListOfLegsFor(const Lepton &lepton, const std::vector< TrigDef > &triggers, flat_set< std::size_t > &validLegs) const
Definition: Calculator.cxx:1084
pickleTool.object
object
Definition: pickleTool.py:30
TrigGlobEffCorr::Calculator::Period::m_formula
GlobEffFunc m_formula
Definition: Calculator.h:43
TrigGlobEffCorr::Calculator::canTriggerBeFired
bool canTriggerBeFired(const TrigDef &trig, const std::vector< flat_set< std::size_t > > &firedLegs) const
Definition: Calculator.cxx:1101
TrigGlobEffCorr::Calculator::globalEfficiency_Toys
bool globalEfficiency_Toys(const LeptonList &, unsigned, const std::vector< TrigDef > &triggers, Efficiencies &)
Definition: Calculator.cxx:1157
TrigGlobEffCorr::Calculator::getRelevantTriggersForUser
bool getRelevantTriggersForUser(TrigGlobalEfficiencyCorrectionTool &parent, std::vector< std::string > &triggers, unsigned runNumber)
Definition: Calculator.cxx:214
python.PyAthena.obj
obj
Definition: PyAthena.py:135
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
TrigGlobEffCorr::Calculator::Helper::m_n2L
unsigned m_n2L
Definition: Calculator.h:224
TrigGlobEffCorr::Calculator::Helper::Helper
Helper(Helper &&)=default
TrigGlobEffCorr::Calculator::Period
Definition: Calculator.h:41
TrigGlobEffCorr::Calculator::Helper::Optional
Definition: Calculator.h:232
TrigGlobEffCorr::Calculator::getPeriod
const Period * getPeriod(unsigned runNumber) const
Definition: Calculator.cxx:104