ATLAS Offline Software
Loading...
Searching...
No Matches
BaseFakeBkgTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
9#include "xAODEgamma/Photon.h"
10#include "xAODMuon/Muon.h"
11#include "xAODTau/TauJet.h"
13#include <TFile.h>
14#include <TH2F.h>
15#include <TH3.h>
16#include <regex>
17#include <stdexcept>
19
20using namespace FakeBkgTools;
21using namespace CP;
22
23BaseFakeBkgTool::BaseFakeBkgTool(const std::string& toolname):
24 AsgTool(toolname),
25 m_initialized(false),
26 m_database(nullptr),
27 m_energyUnit("MeV"),
28 m_tightDecoNameAndType("Tight,as_char"),
29 m_progressFileName("none"),
31 m_accRealEff("real_eff"),
32 m_accFakeEff("fake_eff")
33{
34 declareProperty("InputFiles",
36 "list of XML/ROOT files storing the efficiencies [default = {}]. If left empty, the tool "
37 "assumes that efficiencies are provided by the user as decorations (xAOD) or class "
38 "members (standalone) of the lepton objects");
39 declareProperty("Selection",
41 "Selection used to increment total yield / fill histograms [default = \""
42 + m_selection +"\"]");
43 declareProperty("Process",
45 "Process used to increment total yield / fill histograms [default = \""
46 + m_process +"\"]");
47 declareProperty("EnergyUnit",
49 "MeV or GeV -- keep consistent between the input (IParticle decorations/members) "
50 "and the configuration files! [default = \"MeV\"]");
51 declareProperty("ConvertWhenMissing",
53 "set to 'true' to compute fake factors from fake efficiencies if only the latter "
54 "are provided in the config files (and vice-versa) [default = false]");
55 declareProperty("TightDecoration",
57 "Name (and type) of the decoration used to indicate whether leptons pass the 'tight' "
58 "requirements or not [default = \"Tight,as_char\"]");
59 declareProperty("ProgressFileName",
61 "Name of ntuple file with results from a subset of the data");
62 declareProperty("ProgressFileDirectory",
64 "complementary to ProgressFileName, specifies the directory inside the file where the "
65 "results are stored [default = \"\"]");
66}
67
72
77
79{
81 {
82 ATH_MSG_WARNING("the tool has already been initialized successfully");
83 return StatusCode::FAILURE;
84 }
85
86 m_useDB = m_inputFiles.size();
87
88
89 bool useGeV;
90 if(m_energyUnit == "MeV" || m_energyUnit == "MEV") useGeV = false;
91 else if(m_energyUnit == "GeV" || m_energyUnit == "GEV" ) useGeV = true;
92 else
93 {
94 ATH_MSG_ERROR("unrecognized energy unit \"" << m_energyUnit << '"');
95 return StatusCode::FAILURE;
96 }
97
98 std::unique_ptr<CP::ISelectionReadAccessor> tightAccessor;
100 m_tightAccessor = tightAccessor.release();
101
102 if(!m_useDB)
103 {
104 ATH_MSG_WARNING("no input file(s) provided with the reference efficiencies, will try reading the efficiencies directly from the IParticle");
105 }
106
108 {
109 auto db = new Database(clientForDB(), useGeV, m_convertWhenMissing);
110 if(!db) return StatusCode::FAILURE;
111 m_database = std::unique_ptr<Database>(db);
112 if(!importEfficiencies(true)){
113 ATH_MSG_ERROR("importEfficiencies failed!");
114 return StatusCode::FAILURE;
115 }
116 m_needEventInfo = db->needEventInfo();
117 }
118 else m_needEventInfo = false;
119
120 m_initialized = true;
121
122 return StatusCode::SUCCESS;
123}
124
126{
127 if(resetDB) m_database->reset();
128 std::string filename;
129 try
130 {
131 for(const auto& fn : m_inputFiles)
132 {
133 filename = PathResolverFindDataFile(fn);
134 auto pos = filename.rfind(".xml");
135 if(pos == filename.length()-4)
136 {
137 m_database->importXML(filename);
138 continue;
139 }
140 pos = filename.rfind(".root");
141 if(pos == filename.length()-5)
142 {
143 m_database->importDefaultROOT(fn);
144 continue;
145 }
146 ATH_MSG_ERROR("File extension not supported for " << filename);
147 return false;
148 }
149 }
150 catch(const Database::XmlError& err)
151 {
152 unsigned line1 = m_database->getXmlLineNumber(err.location.ptr);
153 unsigned line2 = m_database->getXmlLineNumber(err.location.endptr);
154 ATH_MSG_INFO("Exception caught while reading file " << filename << ", details follow");
155 std::string fullmsg = "(while parsing XML, line";
156 if(line2 != line1) fullmsg += "s " + std::to_string(line1) + " - " + std::to_string(line2);
157 else fullmsg += " " + std::to_string(line1);
158 fullmsg += "): " + err.reason;
159 ATH_MSG_ERROR(fullmsg);
160 return false;
161 }
162 catch(const Database::GenericError& err)
163 {
164 ATH_MSG_INFO("Exception caught while reading file " << filename << ", details follow");
165 ATH_MSG_ERROR(err.reason);
166 return false;
167 }
168 return m_database->ready();
169}
170
171template<class C>
172StatusCode BaseFakeBkgTool::addEventImpl(const C& iparticles, float mcWeight)
173{
174 if(!m_initialized)
175 {
176 ATH_MSG_WARNING("the tool hasn't been initialized");
177 return StatusCode::FAILURE;
178 }
179 m_particles.clear();
181
182 const xAOD::EventInfo* eventInfo = nullptr;
184 {
185 #ifdef FAKEBKGTOOLS_ATLAS_ENVIRONMENT
186 ATH_CHECK( evtStore()->retrieve(eventInfo, "EventInfo") );
187 #else
188 eventInfo = &iparticles.eventInfo;
189 #endif
190 }
191
192 for(const auto& pp : iparticles)
193 {
194 const auto& p = *pp;
195 m_particles.emplace_back();
196 auto& d = m_particles.back();
197 d.tight = m_tightAccessor->getBool(p);
198 d.type = p.type();
199 switch(p.type())
200 {
201 case xAOD::Type::Electron: d.charge = static_cast<const xAOD::Electron&>(p).charge(); break;
202 case xAOD::Type::Muon: d.charge = static_cast<const xAOD::Muon&>(p).charge(); break;
203 case xAOD::Type::Tau: d.charge = static_cast<const xAOD::TauJet&>(p).charge(); break;
204 case xAOD::Type::Photon: d.charge = 0; break;
205 default:
206 ATH_MSG_WARNING("unknown particle type, setting charge to 0");
207 d.charge = 0;
208 }
209 if(m_useDB)
210 {
211 std::string error;
212 if(!m_database->fillEfficiencies(d, p, eventInfo, error))
213 {
214 ATH_MSG_ERROR("unable to retrieve efficiencies: " << error);
215 return StatusCode::FAILURE;
216 }
217 ATH_MSG_DEBUG("particle has fake fact. = " << d.fake_factor.value(this) <<", fake eff. = " << d.fake_efficiency.value(this) <<", real eff. = " << d.real_efficiency.value(this));
218 }
219 else
220 {
221 d.real_efficiency.nominal = m_accRealEff(p);
222 d.fake_efficiency.nominal = m_accFakeEff(p);
223 }
224 }
225 if(m_particles.size() > maxParticles())
226 {
227 ATH_MSG_WARNING( "the input contains " << m_particles.size() << " particles but the maximum allowed is " << maxParticles()
228 << "; the last " << (m_particles.size()-maxParticles()) << " will be ignored");
229 m_particles.erase(m_particles.begin() + maxParticles(), m_particles.end());
230 }
231 m_externalWeight = mcWeight;
232 ATH_MSG_DEBUG("calling addEventCustom() with #particles = " << m_particles.size());
233 return addEventCustom();
234}
235
236StatusCode BaseFakeBkgTool::addEvent(const xAOD::IParticleContainer& iparticles, float mcWeight)
237{
238 return addEventImpl(iparticles, mcWeight);
239}
240
241StatusCode BaseFakeBkgTool::addEvent(const ConstDataVector<xAOD::IParticleContainer>& iparticles, float mcWeight)
242{
243 return addEventImpl(iparticles, mcWeight);
244}
245
246FinalState BaseFakeBkgTool::getCachedFinalState(uint8_t nparticles, const std::string& strPID, const std::string& strProc, bool& success)
247{
248 success = true;
249 size_t hFS = m_hasher(strProc) ^ m_hasher(strPID) ^ nparticles;
250 auto itrFS = m_cachedFinalStates.find(FinalState(hFS));
251 if(itrFS != m_cachedFinalStates.end()) return *itrFS;
252 std::string error;
253 FinalState fs(hFS, nparticles, strPID, strProc, error);
254 if(error.length())
255 {
257 success = false;
258 return FinalState(0);
259 }
260 if(m_cachedFinalStates.size() < 1024)
261 {
262 m_cachedFinalStates.emplace(fs);
263 }
264 return fs;
265}
266
267StatusCode BaseFakeBkgTool::register1DHistogram(TH1* h1, const float *val) {
268
269 if(!h1)
270 {
271 ATH_MSG_ERROR("invalid histogram pointer");
272 return StatusCode::FAILURE;
273 }
274 const std::string name = h1->GetName();
275 auto itr = m_values_1dhisto_map.begin();
276 const auto enditr = m_values_1dhisto_map.end();
277 for(;itr!=enditr;++itr)
278 {
279 if(itr->first == h1)
280 {
281 ATH_MSG_ERROR("the histogram \"" << name << "\" has already been registered");
282 return StatusCode::FAILURE;
283 }
284 if(name == itr->first->GetName()) break;
285 }
286 if(itr == enditr)
287 {
288 m_values_1dhisto_map.emplace(h1, val);
289 }
290 else
291 {
292 ATH_CHECK( CheckHistogramCompatibility(h1, itr->first) );
293 }
294 return StatusCode::SUCCESS;
295}
296
297StatusCode BaseFakeBkgTool::register2DHistogram(TH2* h2, const float *xval, const float *yval) {
298
299 if(!h2)
300 {
301 ATH_MSG_ERROR("invalid histogram pointer");
302 return StatusCode::FAILURE;
303 }
304 const std::string name = h2->GetName();
305 auto itr = m_values_2dhisto_map.begin();
306 const auto enditr = m_values_2dhisto_map.end();
307 for(;itr!=enditr;++itr)
308 {
309 if(itr->first == h2)
310 {
311 ATH_MSG_ERROR("the histogram \"" << name << "\" has already been registered");
312 return StatusCode::FAILURE;
313 }
314 if(name == itr->first->GetName()) break;
315 }
316 if(itr == enditr)
317 {
318 m_values_2dhisto_map.emplace(h2, std::make_pair(xval, yval));
319 }
320 else
321 {
322 ATH_CHECK( CheckHistogramCompatibility(h2, itr->first) );
323 }
324 return StatusCode::SUCCESS;
325}
326
327 StatusCode BaseFakeBkgTool::register3DHistogram(TH3* h3, const float *xval, const float *yval, const float *zval) {
328
329 if(!h3)
330 {
331 ATH_MSG_ERROR("invalid histogram pointer");
332 return StatusCode::FAILURE;
333 }
334 const std::string name = h3->GetName();
335 auto itr = m_values_3dhisto_map.begin();
336 const auto enditr = m_values_3dhisto_map.end();
337 for(;itr!=enditr;++itr)
338 {
339 if(itr->first == h3)
340 {
341 ATH_MSG_ERROR("the histogram \"" << name << "\" has already been registered");
342 return StatusCode::FAILURE;
343 }
344 if(name == itr->first->GetName()) break;
345 }
346 if(itr == enditr)
347 {
348m_values_3dhisto_map.emplace(h3, std::make_tuple(xval, yval, zval));
349 }
350 else
351 {
352 ATH_CHECK( CheckHistogramCompatibility(h3, itr->first) );
353 }
354 return StatusCode::SUCCESS;
355}
356
357StatusCode BaseFakeBkgTool::CheckHistogramCompatibility(const TH1* lhs, const TH1* rhs)
358{
359 std::string error;
360 if(std::string(lhs->GetName()) != rhs->GetName()) error = "names";
361 else if(lhs->GetDimension() != rhs->GetDimension()) error = "dimensions";
362 else if(lhs->GetNbinsX()!=rhs->GetNbinsX() || lhs->GetNbinsY()!=rhs->GetNbinsY() || lhs->GetNbinsZ()!=rhs->GetNbinsZ()) error = "number of bins";
363 else
364 {
365 for(auto getAxis : std::initializer_list<const TAxis*(TH1::*)()const>{&TH1::GetXaxis, &TH1::GetYaxis, &TH1::GetZaxis})
366 {
367 auto lhsAxis=(lhs->*getAxis)(), rhsAxis=(rhs->*getAxis)();
368 for(int i=0;i<=lhsAxis->GetNbins();++i)
369 {
370 auto x=lhsAxis->GetBinUpEdge(i), y=rhsAxis->GetBinUpEdge(i), width=lhsAxis->GetBinWidth(i?i:1);
371 if(std::fabs(x-y) > 0.01*width) error = "bin edges";
372 }
373 }
374 }
375 if(error.length())
376 {
377 ATH_MSG_ERROR("the registered histogram \"" << lhs->GetName() << "\" is not compatible with the one saved in the in-progress ROOT file (mismatching " << error << "). Or, you tried registering two different histograms with the same name.");
378 return StatusCode::FAILURE;
379 }
380 return StatusCode::SUCCESS;
381}
382
384{
386 {
387 ATH_MSG_ERROR("This function can be called only once the tool has been initialized");
388 return "";
389 }
390 std::bitset<Database::N_EFFICIENCY_TYPES> affects;
391 auto stat = m_database->findStat(uid);
392 if(stat) affects = stat->affects;
393 else
394 {
395 auto syst = m_database->findSyst(uid);
396 if(syst) affects = syst->affects;
397 else
398 {
399 ATH_MSG_ERROR("uncertainty with UID " << std::hex << uid << std::dec << " not found in database");
400 return "";
401 }
402 }
403 std::string info;
404 if(affects[Database::ELECTRON_REAL_EFFICIENCY]) info += "electron real efficiencies, ";
405 if(affects[Database::ELECTRON_FAKE_EFFICIENCY]) info += "electron fake efficiencies, ";
406 if(affects[Database::ELECTRON_FAKE_FACTOR]) info += "electron fake factors, ";
407 if(affects[Database::MUON_REAL_EFFICIENCY]) info += "muon real efficiencies, ";
408 if(affects[Database::MUON_FAKE_EFFICIENCY]) info += "muon fake efficiencies, ";
409 if(affects[Database::MUON_FAKE_FACTOR]) info += "muon fake factors, ";
410 if(affects[Database::PHOTON_ELE_FAKE_FACTOR]) info += "electron->photon fake rate, ";
411 if(affects[Database::PHOTON_ELE_FAKE_FACTOR_SF]) info += "electron->photon fake rate scale factor, ";
412 return info.substr(0, info.size()-2);
413}
414
415std::pair<uint16_t, float> BaseFakeBkgTool::identifyCpSystematicVariation(const CP::SystematicVariation& systematic) const
416{
418 {
419 ATH_MSG_ERROR("This function can be called only once the tool has been initialized, since the number of systematic variations depends on the configuration...");
420 throw std::logic_error("BaseFakeBkgTool::identifyCpSystematicVariation() called before initialization");
421 }
422 std::smatch smr;
423 auto bn = systematic.basename();
424 if(!std::regex_match(bn, smr, std::regex("FAKEBKG_(STAT|SYST)_VAR(\\d+)"))) return {{0}, 0.f};
425 unsigned index = std::stol(smr[2].str());
426 float sigma = systematic.parameter();
427 if(smr[1].str() == "SYST") return {m_database->systIndexToUID(index), sigma};
428 else return {m_database->statIndexToUID(index), sigma};
429}
430
432{
433 return identifyCpSystematicVariation(systematic).first;
434}
435
437{
439 {
440 ATH_MSG_ERROR("This function can be called only once the tool has been initialized, since the number of systematic variations depends on the configuration...");
441 throw std::logic_error("BaseFakeBkgTool::affectingSystematics() called before initialization");
442 }
443 CP::SystematicSet affecting;
444 for(int step=0;step<2;++step)
445 {
446 std::string type = step? "STAT" : "SYST";
447 const int imax = step? m_database->numberOfStats() : m_database->numberOfSysts();
448 for(int i=0;i<imax;++i)
449 {
450 std::string name = "FAKEBKG_" + type + "_VAR" + std::to_string(i);
451 affecting.insert(CP::SystematicVariation(name, 1.f));
452 affecting.insert(CP::SystematicVariation(name, -1.f));
453 }
454 }
455 return affecting;
456}
457
462
464{
466 {
467 ATH_MSG_ERROR("This function can be called only once the tool has been initialized");
468 throw std::logic_error("BaseFakeBkgTool::applySystematicVariation() called before initialization");
469 }
471 {
472 ATH_MSG_ERROR("this particular method doesn't support multiple calls to applySystematicVariation(), or after the first call to addEvent(). Please use a separate instance of the tool for each variation.");
473 throw std::logic_error("BaseFakeBkgTool::applySystematicVariation() called at a wrong time");
474 }
476 if(!systConfig.size())
477 {
478 m_selectedUncertainties = nullptr;
479 return StatusCode::SUCCESS;
480 }
481 auto itr = m_systSetDict.find(systConfig);
482 if(itr != m_systSetDict.end())
483 {
484 m_selectedUncertainties = &itr->second;
485 return StatusCode::SUCCESS;
486 }
487 CP::SystematicSet mysys;
489 if(sc != StatusCode::SUCCESS) return sc;
490 std::unique_ptr<UncertaintyList> uncertainties;
491 for(auto& sysvar : mysys)
492 {
493 auto var = identifyCpSystematicVariation(sysvar);
494 if(!var.first)
495 {
496 ATH_MSG_ERROR("The systematic variation " << sysvar.name() << " is not recognized, despite being present in affectingSystematics()...");
497 return StatusCode::FAILURE;
498 }
499 if(!uncertainties) uncertainties.reset(new UncertaintyList(var.first, var.second));
500 else uncertainties->extraVariation(var.first, var.second);
501 }
502 if(uncertainties)
503 {
504 auto emplaced = m_systSetDict.emplace(systConfig, std::move(*uncertainties));
505 m_selectedUncertainties = &emplaced.first->second;
506 }
507 else m_selectedUncertainties = nullptr;
508 return StatusCode::SUCCESS;
509}
510
512{
513 auto info = getUncertaintyDescription(systematic);
514 if(info.length()) ATH_MSG_INFO(info);
515}
516
518{
520 {
521 ATH_MSG_ERROR("This function can be called only once the tool has been initialized");
522 return "";
523 }
524
525 auto UID = identifyCpSystematicVariation(systematic).first;
526 if(!UID)
527 {
528 ATH_MSG_WARNING("Systematic variation " + systematic.name() + " is not recognized by BaseFakeBkgTool");
529 return "";
530 }
531
532 //UID cannot be zero here
533 std::string info;
534 auto stat = m_database->findStat(UID);
535 if(stat)
536 {
537 info = "Statistical uncertainty affecting ";
539 }
540 else
541 {
542 auto syst = m_database->findSyst(UID);
543 if(syst)
544 {
545 info = "Systematic uncertainty \"" + syst->name + "\" affecting ";
546 }
547 else
548 {
549 ATH_MSG_ERROR("uncertainty with UID " << std::hex << UID << std::dec << " not found in database");
550 return "";
551 }
552 }
554 return info;
555}
556
558{
559 uint16_t UID = identifyCpSystematicVariation(systematic).first;
560 if(UID) return Database::isSystUID(UID);
561 return false;
562}
563
565{
566 uint16_t UID = identifyCpSystematicVariation(systematic).first;
567 if(UID) return Database::isStatUID(UID);
568 return false;
569}
570
572{
573 uint16_t UID = identifyCpSystematicVariation(systematic).first;
574 if(UID) return getListOfEfficienciesAffectedBy(UID).find("electron") != std::string::npos;
575 return false;
576}
577
579{
580 uint16_t UID = identifyCpSystematicVariation(systematic).first;
581 if(UID) return getListOfEfficienciesAffectedBy(UID).find("muon") != std::string::npos;
582 return false;
583}
584
586{
587 uint16_t UID = identifyCpSystematicVariation(systematic).first;
588 if(UID) return getListOfEfficienciesAffectedBy(UID).find("tau") != std::string::npos;
589 return false;
590}
591
593{
594 uint16_t UID = identifyCpSystematicVariation(systematic).first;
595 if(UID) return getListOfEfficienciesAffectedBy(UID).find("real eff") != std::string::npos;
596 return false;
597}
598
600{
601 uint16_t UID = identifyCpSystematicVariation(systematic).first;
602 if(UID) return getListOfEfficienciesAffectedBy(UID).find("fake eff") != std::string::npos;
603 return false;
604}
605
607{
608 uint16_t UID = identifyCpSystematicVariation(systematic).first;
609 if(UID) return getListOfEfficienciesAffectedBy(UID).find("fake factor") != std::string::npos;
610 return false;
611}
612
613CP::SystematicSet BaseFakeBkgTool::affectingSystematicsFor(const std::string& nuisanceParameter) const
614{
615 CP::SystematicSet affecting;
617 {
618 ATH_MSG_ERROR("This function can be called only once the tool has been initialized, since the number of systematic variations depends on the configuration...");
619 return {};
620 }
621 bool up=true, down=true;
622 auto pos1=nuisanceParameter.find("__up"), pos2=nuisanceParameter.find("__down");
623 if(pos1!=std::string::npos && pos1+4==nuisanceParameter.length()) down = false;
624 else if(pos2!=std::string::npos && pos2+6==nuisanceParameter.length()) up = false;
625 std::string np = nuisanceParameter.substr(0, std::min(pos1, pos2));
626 for(unsigned i=0;i<m_database->numberOfSysts();++i)
627 {
628 auto syst = m_database->findSyst(m_database->systIndexToUID(i));
629 if(syst && syst->name==np)
630 {
631 std::string name = "FAKEBKG_SYST_VAR" + std::to_string(i);
632 if(up) affecting.insert(CP::SystematicVariation(name, 1.f));
633 if(down) affecting.insert(CP::SystematicVariation(name, -1.f));
634 }
635 }
636 return affecting;
637}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_INFO(x,...)
static Double_t fs
static Double_t sc
std::string PathResolverFindDataFile(const std::string &logical_file_name)
const double width
int imax(int i, int j)
#define y
#define x
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ServiceHandle< StoreGateSvc > & evtStore()
BaseFakeBkgTool(const std::string &toolname)
virtual StatusCode addEventCustom()=0
std::vector< FakeBkgTools::ParticleData > m_particles
StatusCode CheckHistogramCompatibility(const TH1 *lhs, const TH1 *rhs)
UncertaintyList * m_selectedUncertainties
Pointer to a value of the 'm_systSetDict' map it must be invalidated each time the map is updated in ...
bool m_unlimitedSystematicVariations
used to prevent multiple calls to applySystematicVariation() when unsupported set to true in a partic...
std::map< TH2 *, std::pair< const float *, const float * > > m_values_2dhisto_map
virtual bool affectsElectrons(const CP::SystematicVariation &systematic) const override final
checks whether the specified source of uncertainty affects electrons
std::string m_progressFileName
property ProgressFileName
virtual CP::SystematicSet affectingSystematics() const override
the list of all systematics this tool can be affected by
StatusCode addEventImpl(const C &iparticles, float mcWeight)
only used when m_useDB is false
CP::ISelectionReadAccessor * m_tightAccessor
this can't be a unique_ptr as this can cause issues with the dictionary in some particular circumstan...
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
std::string getListOfEfficienciesAffectedBy(uint16_t uid) const
virtual bool affectsMuons(const CP::SystematicVariation &systematic) const override final
checks whether the specified source of uncertainty affects muons
virtual bool affectsRealEfficiencies(const CP::SystematicVariation &systematic) const override final
checks whether the specified source of uncertainty affects real efficiencies
virtual CP::SystematicSet recommendedSystematics() const override
the list of all systematics this tool recommends to use
virtual StatusCode register1DHistogram(TH1 *h1, const float *val) override
associates a 1D histogram to the tool, to obtain a binned estimate of the fake lepton background the ...
virtual std::string getUncertaintyDescription(const CP::SystematicVariation &systematic) const override final
returns a human-readable description of the source of systematic uncertainty specified as argument
std::string m_progressFileDirectory
property ProgressFileDirectory
virtual bool isAffectedBySystematic(const CP::SystematicVariation &systematic) const override
Declare the interface that this class provides.
SG::ConstAccessor< float > m_accRealEff
virtual bool isStatisticalUncertainty(const CP::SystematicVariation &systematic) const override final
checks whether the specified source of uncertainty originates from a statistical uncertainty in the e...
std::map< TH3 *, std::tuple< const float *, const float *, const float * > > m_values_3dhisto_map
std::set< FakeBkgTools::FinalState > m_cachedFinalStates
std::string m_selection
'selection' settings used to compute the total yield / fill histograms
virtual bool isSystematicUncertainty(const CP::SystematicVariation &systematic) const override final
checks whether the specified source of uncertainty originates from a systematic uncertainty in the ef...
std::unique_ptr< FakeBkgTools::Database > m_database
bool importEfficiencies(bool resetDB=false)
load the config file(s) storing efficiencies
virtual StatusCode register3DHistogram(TH3 *h3, const float *xval, const float *yval, const float *zval) override
associates a 3D histogram to the tool, to obtain a binned estimate of the fake lepton background the ...
virtual CP::SystematicSet affectingSystematicsFor(const std::string &nuisanceParameter) const override
These functions are slow, don't use them in the tools implementations.
std::unordered_map< CP::SystematicSet, UncertaintyList > m_systSetDict
List of uncertainties in internal format, associated with a particular SystematicSet the m_selectedUn...
virtual bool affectsTaus(const CP::SystematicVariation &systematic) const override final
checks whether the specified source of uncertainty affects taus
virtual bool affectsFakeEfficiencies(const CP::SystematicVariation &systematic) const override final
checks whether the specified source of uncertainty affects fake efficiencies
std::pair< uint16_t, float > identifyCpSystematicVariation(const CP::SystematicVariation &systematic) const
std::vector< std::string > m_inputFiles
property InputFiles
virtual FakeBkgTools::Client clientForDB()=0
This indicates which type of efficiencies/fake factor need to be filled.
virtual StatusCode applySystematicVariation(const CP::SystematicSet &systConfig) override
effects: configure this tool for the given list of systematic variations.
std::hash< std::string > m_hasher
comes from Event passed to addEvent()
std::string m_tightDecoNameAndType
property TightDecoration
bool m_lockedSystematicVariations
when m_unlimitedSystematicVariations=false, keeps track of prior calls to applySystematicVariation() ...
std::string m_process
'process' settings used to compute the total yield / fill histograms
virtual StatusCode register2DHistogram(TH2 *h2, const float *xval, const float *yval) override
associates a 2D histogram to the tool, to obtain a binned estimate of the fake lepton background the ...
FakeBkgTools::FinalState getCachedFinalState(uint8_t nparticles, const std::string &strPID, const std::string &strProc, bool &success)
virtual bool affectsFakeFactors(const CP::SystematicVariation &systematic) const override final
checks whether the specified source of uncertainty affects fake factors
std::map< TH1 *, const float * > m_values_1dhisto_map
virtual void printUncertaintyDescription(const CP::SystematicVariation &systematic) const override final
prints a human-readable description of the source of systematic uncertainty specified as argument
std::string m_energyUnit
property EnergyUnit user can choose between MeV or GeV to indicate the unit of the pT parametrization...
virtual StatusCode addEvent(const xAOD::IParticleContainer &particles, float extraWeight=1.f) override final
supply list of leptons / global variables, internal counters incremented Does not return anything; ev...
SG::ConstAccessor< float > m_accFakeEff
only used when m_useDB is false
static constexpr const char * defaultSelection()
default value taken by the 'selection' argument of several methods or properties It indicates how the...
static constexpr const char * defaultProcess()
default value taken by the 'process' argument of several methods or properties It indicates what shou...
Class to wrap a set of SystematicVariations.
void insert(const SystematicVariation &systematic)
description: insert a systematic into the set
size_t size() const
returns: size of the set
static StatusCode filterForAffectingSystematics(const SystematicSet &systConfig, const SystematicSet &affectingSystematics, SystematicSet &filteredSystematics)
description: filter the systematics for the affected systematics returns: success guarantee: strong f...
float parameter() const
description: the numeric parameter contained in the subvariation(), or 0 if the subvariation can't be...
std::string basename() const
description: the base name, i.e.
const std::string & name() const
description: the full systematics name, for use in strings, etc.
DataVector adapter that acts like it holds const pointers.
static constexpr bool isStatUID(unsigned short uid)
Definition Database.h:223
static constexpr bool isSystUID(unsigned short uid)
Definition Database.h:222
AsgTool(const std::string &name)
Constructor specifying the tool instance's name.
Definition AsgTool.cxx:58
struct color C
Select isolated Photons, Electrons and Muons.
StatusCode makeSelectionReadAccessor(const std::string &expr, std::unique_ptr< ISelectionReadAccessor > &accessor, bool defaultToChar)
make the ISelectionReadAccessor for the given name
constexpr uint8_t maxParticles()
Definition index.py:1
@ Photon
The object is a photon.
Definition ObjectType.h:47
@ Muon
The object is a muon.
Definition ObjectType.h:48
@ Electron
The object is an electron.
Definition ObjectType.h:46
@ Tau
The object is a tau (jet).
Definition ObjectType.h:49
EventInfo_v1 EventInfo
Definition of the latest event info version.
TauJet_v3 TauJet
Definition of the current "tau version".
Definition TauJet.h:17
Muon_v1 Muon
Reference the current persistent version:
setWord1 uint16_t
Electron_v1 Electron
Definition of the current "egamma version".
DataVector< IParticle > IParticleContainer
Simple convenience declaration of IParticleContainer.
List of systematic variations (UID + sigma) to be considered This is implemented as a basic linked li...
This propagates an error message.
Definition Database.h:136
This propagates an error message + the reference to the faulty piece of XML when an exception is rais...
Definition Database.h:124