ATLAS Offline Software
Loading...
Searching...
No Matches
BaseFakeBkgTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2019 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 <string>
17#include <vector>
18#include <regex>
19#include <stdexcept>
21
22using namespace FakeBkgTools;
23using namespace CP;
24
25BaseFakeBkgTool::BaseFakeBkgTool(const std::string& toolname):
26 AsgTool(toolname),
27 m_initialized(false),
28 m_database(nullptr),
29 m_energyUnit("MeV"),
30 m_tightDecoNameAndType("Tight,as_char"),
31 m_progressFileName("none"),
33 m_accRealEff("real_eff"),
34 m_accFakeEff("fake_eff")
35{
36 declareProperty("InputFiles",
38 "list of XML/ROOT files storing the efficiencies [default = {}]. If left empty, the tool "
39 "assumes that efficiencies are provided by the user as decorations (xAOD) or class "
40 "members (standalone) of the lepton objects");
41 declareProperty("Selection",
43 "Selection used to increment total yield / fill histograms [default = \""
44 + m_selection +"\"]");
45 declareProperty("Process",
47 "Process used to increment total yield / fill histograms [default = \""
48 + m_process +"\"]");
49 declareProperty("EnergyUnit",
51 "MeV or GeV -- keep consistent between the input (IParticle decorations/members) "
52 "and the configuration files! [default = \"MeV\"]");
53 declareProperty("ConvertWhenMissing",
55 "set to 'true' to compute fake factors from fake efficiencies if only the latter "
56 "are provided in the config files (and vice-versa) [default = false]");
57 declareProperty("TightDecoration",
59 "Name (and type) of the decoration used to indicate whether leptons pass the 'tight' "
60 "requirements or not [default = \"Tight,as_char\"]");
61 declareProperty("ProgressFileName",
63 "Name of ntuple file with results from a subset of the data");
64 declareProperty("ProgressFileDirectory",
66 "complementary to ProgressFileName, specifies the directory inside the file where the "
67 "results are stored [default = \"\"]");
68}
69
74
79
81{
83 {
84 ATH_MSG_WARNING("the tool has already been initialized successfully");
85 return StatusCode::FAILURE;
86 }
87
88 m_useDB = m_inputFiles.size();
89
90
91 bool useGeV;
92 if(m_energyUnit == "MeV" || m_energyUnit == "MEV") useGeV = false;
93 else if(m_energyUnit == "GeV" || m_energyUnit == "GEV" ) useGeV = true;
94 else
95 {
96 ATH_MSG_ERROR("unrecognized energy unit \"" << m_energyUnit << '"');
97 return StatusCode::FAILURE;
98 }
99
100 std::unique_ptr<CP::ISelectionReadAccessor> tightAccessor;
102 m_tightAccessor = tightAccessor.release();
103
104 if(!m_useDB)
105 {
106 ATH_MSG_WARNING("no input file(s) provided with the reference efficiencies, will try reading the efficiencies directly from the IParticle");
107 }
108
110 {
111 auto db = new Database(clientForDB(), useGeV, m_convertWhenMissing);
112 if(!db) return StatusCode::FAILURE;
113 m_database = std::unique_ptr<Database>(db);
114 if(!importEfficiencies(true)){
115 ATH_MSG_ERROR("importEfficiencies failed!");
116 return StatusCode::FAILURE;
117 }
118 m_needEventInfo = db->needEventInfo();
119 }
120 else m_needEventInfo = false;
121
122 m_initialized = true;
123
124 return StatusCode::SUCCESS;
125}
126
128{
129 if(resetDB) m_database->reset();
130 std::string filename;
131 try
132 {
133 for(const auto& fn : m_inputFiles)
134 {
135 filename = PathResolverFindDataFile(fn);
136 auto pos = filename.rfind(".xml");
137 if(pos == filename.length()-4)
138 {
139 m_database->importXML(filename);
140 continue;
141 }
142 pos = filename.rfind(".root");
143 if(pos == filename.length()-5)
144 {
145 m_database->importDefaultROOT(fn);
146 continue;
147 }
148 ATH_MSG_ERROR("File extension not supported for " << filename);
149 return false;
150 }
151 }
152 catch(const Database::XmlError& err)
153 {
154 unsigned line1 = m_database->getXmlLineNumber(err.location.ptr);
155 unsigned line2 = m_database->getXmlLineNumber(err.location.endptr);
156 ATH_MSG_INFO("Exception caught while reading file " << filename << ", details follow");
157 std::string fullmsg = "(while parsing XML, line";
158 if(line2 != line1) fullmsg += "s " + std::to_string(line1) + " - " + std::to_string(line2);
159 else fullmsg += " " + std::to_string(line1);
160 fullmsg += "): " + err.reason;
161 ATH_MSG_ERROR(fullmsg);
162 return false;
163 }
164 catch(const Database::GenericError& err)
165 {
166 ATH_MSG_INFO("Exception caught while reading file " << filename << ", details follow");
167 ATH_MSG_ERROR(err.reason);
168 return false;
169 }
170 return m_database->ready();
171}
172
173template<class C>
174StatusCode BaseFakeBkgTool::addEventImpl(const C& iparticles, float mcWeight)
175{
176 if(!m_initialized)
177 {
178 ATH_MSG_WARNING("the tool hasn't been initialized");
179 return StatusCode::FAILURE;
180 }
181 m_particles.clear();
183
184 const xAOD::EventInfo* eventInfo = nullptr;
186 {
187 #ifdef FAKEBKGTOOLS_ATLAS_ENVIRONMENT
188 ATH_CHECK( evtStore()->retrieve(eventInfo, "EventInfo") );
189 #else
190 eventInfo = &iparticles.eventInfo;
191 #endif
192 }
193
194 for(const auto& pp : iparticles)
195 {
196 const auto& p = *pp;
197 m_particles.emplace_back();
198 auto& d = m_particles.back();
199 d.tight = m_tightAccessor->getBool(p);
200 d.type = p.type();
201 switch(p.type())
202 {
203 case xAOD::Type::Electron: d.charge = static_cast<const xAOD::Electron&>(p).charge(); break;
204 case xAOD::Type::Muon: d.charge = static_cast<const xAOD::Muon&>(p).charge(); break;
205 case xAOD::Type::Tau: d.charge = static_cast<const xAOD::TauJet&>(p).charge(); break;
206 case xAOD::Type::Photon: d.charge = 0; break;
207 default:
208 ATH_MSG_WARNING("unknown particle type, setting charge to 0");
209 d.charge = 0;
210 }
211 if(m_useDB)
212 {
213 std::string error;
214 if(!m_database->fillEfficiencies(d, p, *eventInfo, error))
215 {
216 ATH_MSG_ERROR("unable to retrieve efficiencies: " << error);
217 return StatusCode::FAILURE;
218 }
219 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));
220 }
221 else
222 {
223 d.real_efficiency.nominal = m_accRealEff(p);
224 d.fake_efficiency.nominal = m_accFakeEff(p);
225 }
226 }
227 if(m_particles.size() > maxParticles())
228 {
229 ATH_MSG_WARNING( "the input contains " << m_particles.size() << " particles but the maximum allowed is " << maxParticles()
230 << "; the last " << (m_particles.size()-maxParticles()) << " will be ignored");
231 m_particles.erase(m_particles.begin() + maxParticles(), m_particles.end());
232 }
233 m_externalWeight = mcWeight;
234 ATH_MSG_DEBUG("calling addEventCustom() with #particles = " << m_particles.size());
235 return addEventCustom();
236}
237
238StatusCode BaseFakeBkgTool::addEvent(const xAOD::IParticleContainer& iparticles, float mcWeight)
239{
240 return addEventImpl(iparticles, mcWeight);
241}
242
243StatusCode BaseFakeBkgTool::addEvent(const ConstDataVector<xAOD::IParticleContainer>& iparticles, float mcWeight)
244{
245 return addEventImpl(iparticles, mcWeight);
246}
247
248FinalState BaseFakeBkgTool::getCachedFinalState(uint8_t nparticles, const std::string& strPID, const std::string& strProc, bool& success)
249{
250 success = true;
251 size_t hFS = m_hasher(strProc) ^ m_hasher(strPID) ^ nparticles;
252 auto itrFS = m_cachedFinalStates.find(FinalState(hFS));
253 if(itrFS != m_cachedFinalStates.end()) return *itrFS;
254 std::string error;
255 FinalState fs(hFS, nparticles, strPID, strProc, error);
256 if(error.length())
257 {
259 success = false;
260 return FinalState(0);
261 }
262 if(m_cachedFinalStates.size() < 1024)
263 {
264 m_cachedFinalStates.emplace(fs);
265 }
266 return fs;
267}
268
269StatusCode BaseFakeBkgTool::register1DHistogram(TH1* h1, const float *val) {
270
271 if(!h1)
272 {
273 ATH_MSG_ERROR("invalid histogram pointer");
274 return StatusCode::FAILURE;
275 }
276 const std::string name = h1->GetName();
277 auto itr = m_values_1dhisto_map.begin();
278 const auto enditr = m_values_1dhisto_map.end();
279 for(;itr!=enditr;++itr)
280 {
281 if(itr->first == h1)
282 {
283 ATH_MSG_ERROR("the histogram \"" << name << "\" has already been registered");
284 return StatusCode::FAILURE;
285 }
286 if(name == itr->first->GetName()) break;
287 }
288 if(itr == enditr)
289 {
290 m_values_1dhisto_map.emplace(h1, val);
291 }
292 else
293 {
294 ATH_CHECK( CheckHistogramCompatibility(h1, itr->first) );
295 }
296 return StatusCode::SUCCESS;
297}
298
299StatusCode BaseFakeBkgTool::register2DHistogram(TH2* h2, const float *xval, const float *yval) {
300
301 if(!h2)
302 {
303 ATH_MSG_ERROR("invalid histogram pointer");
304 return StatusCode::FAILURE;
305 }
306 const std::string name = h2->GetName();
307 auto itr = m_values_2dhisto_map.begin();
308 const auto enditr = m_values_2dhisto_map.end();
309 for(;itr!=enditr;++itr)
310 {
311 if(itr->first == h2)
312 {
313 ATH_MSG_ERROR("the histogram \"" << name << "\" has already been registered");
314 return StatusCode::FAILURE;
315 }
316 if(name == itr->first->GetName()) break;
317 }
318 if(itr == enditr)
319 {
320 m_values_2dhisto_map.emplace(h2, std::make_pair(xval, yval));
321 }
322 else
323 {
324 ATH_CHECK( CheckHistogramCompatibility(h2, itr->first) );
325 }
326 return StatusCode::SUCCESS;
327}
328
329 StatusCode BaseFakeBkgTool::register3DHistogram(TH3* h3, const float *xval, const float *yval, const float *zval) {
330
331 if(!h3)
332 {
333 ATH_MSG_ERROR("invalid histogram pointer");
334 return StatusCode::FAILURE;
335 }
336 const std::string name = h3->GetName();
337 auto itr = m_values_3dhisto_map.begin();
338 const auto enditr = m_values_3dhisto_map.end();
339 for(;itr!=enditr;++itr)
340 {
341 if(itr->first == h3)
342 {
343 ATH_MSG_ERROR("the histogram \"" << name << "\" has already been registered");
344 return StatusCode::FAILURE;
345 }
346 if(name == itr->first->GetName()) break;
347 }
348 if(itr == enditr)
349 {
350m_values_3dhisto_map.emplace(h3, std::make_tuple(xval, yval, zval));
351 }
352 else
353 {
354 ATH_CHECK( CheckHistogramCompatibility(h3, itr->first) );
355 }
356 return StatusCode::SUCCESS;
357}
358
359StatusCode BaseFakeBkgTool::CheckHistogramCompatibility(const TH1* lhs, const TH1* rhs)
360{
361 std::string error;
362 if(std::string(lhs->GetName()) != rhs->GetName()) error = "names";
363 else if(lhs->GetDimension() != rhs->GetDimension()) error = "dimensions";
364 else if(lhs->GetNbinsX()!=rhs->GetNbinsX() || lhs->GetNbinsY()!=rhs->GetNbinsY() || lhs->GetNbinsZ()!=rhs->GetNbinsZ()) error = "number of bins";
365 else
366 {
367 for(auto getAxis : std::initializer_list<const TAxis*(TH1::*)()const>{&TH1::GetXaxis, &TH1::GetYaxis, &TH1::GetZaxis})
368 {
369 auto lhsAxis=(lhs->*getAxis)(), rhsAxis=(rhs->*getAxis)();
370 for(int i=0;i<=lhsAxis->GetNbins();++i)
371 {
372 auto x=lhsAxis->GetBinUpEdge(i), y=rhsAxis->GetBinUpEdge(i), width=lhsAxis->GetBinWidth(i?i:1);
373 if(std::fabs(x-y) > 0.01*width) error = "bin edges";
374 }
375 }
376 }
377 if(error.length())
378 {
379 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.");
380 return StatusCode::FAILURE;
381 }
382 return StatusCode::SUCCESS;
383}
384
386{
388 {
389 ATH_MSG_ERROR("This function can be called only once the tool has been initialized");
390 return "";
391 }
392 std::bitset<Database::N_EFFICIENCY_TYPES> affects;
393 auto stat = m_database->findStat(uid);
394 if(stat) affects = stat->affects;
395 else
396 {
397 auto syst = m_database->findSyst(uid);
398 if(syst) affects = syst->affects;
399 else
400 {
401 ATH_MSG_ERROR("uncertainty with UID " << std::hex << uid << std::dec << " not found in database");
402 return "";
403 }
404 }
405 std::string info;
406 if(affects[Database::ELECTRON_REAL_EFFICIENCY]) info += "electron real efficiencies, ";
407 if(affects[Database::ELECTRON_FAKE_EFFICIENCY]) info += "electron fake efficiencies, ";
408 if(affects[Database::ELECTRON_FAKE_FACTOR]) info += "electron fake factors, ";
409 if(affects[Database::MUON_REAL_EFFICIENCY]) info += "muon real efficiencies, ";
410 if(affects[Database::MUON_FAKE_EFFICIENCY]) info += "muon fake efficiencies, ";
411 if(affects[Database::MUON_FAKE_FACTOR]) info += "muon fake factors, ";
412 if(affects[Database::PHOTON_ELE_FAKE_FACTOR]) info += "electron->photon fake rate, ";
413 if(affects[Database::PHOTON_ELE_FAKE_FACTOR_SF]) info += "electron->photon fake rate scale factor, ";
414 return info.substr(0, info.size()-2);
415}
416
417std::pair<uint16_t, float> BaseFakeBkgTool::identifyCpSystematicVariation(const CP::SystematicVariation& systematic) const
418{
420 {
421 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...");
422 throw std::logic_error("BaseFakeBkgTool::identifyCpSystematicVariation() called before initialization");
423 }
424 std::smatch smr;
425 auto bn = systematic.basename();
426 if(!std::regex_match(bn, smr, std::regex("FAKEBKG_(STAT|SYST)_VAR(\\d+)"))) return {{0}, 0.f};
427 unsigned index = std::stol(smr[2].str());
428 float sigma = systematic.parameter();
429 if(smr[1].str() == "SYST") return {m_database->systIndexToUID(index), sigma};
430 else return {m_database->statIndexToUID(index), sigma};
431}
432
434{
435 return identifyCpSystematicVariation(systematic).first;
436}
437
439{
441 {
442 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...");
443 throw std::logic_error("BaseFakeBkgTool::affectingSystematics() called before initialization");
444 }
445 CP::SystematicSet affecting;
446 for(int step=0;step<2;++step)
447 {
448 std::string type = step? "STAT" : "SYST";
449 const int imax = step? m_database->numberOfStats() : m_database->numberOfSysts();
450 for(int i=0;i<imax;++i)
451 {
452 std::string name = "FAKEBKG_" + type + "_VAR" + std::to_string(i);
453 affecting.insert(CP::SystematicVariation(name, 1.f));
454 affecting.insert(CP::SystematicVariation(name, -1.f));
455 }
456 }
457 return affecting;
458}
459
464
466{
468 {
469 ATH_MSG_ERROR("This function can be called only once the tool has been initialized");
470 throw std::logic_error("BaseFakeBkgTool::applySystematicVariation() called before initialization");
471 }
473 {
474 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.");
475 throw std::logic_error("BaseFakeBkgTool::applySystematicVariation() called at a wrong time");
476 }
478 if(!systConfig.size())
479 {
480 m_selectedUncertainties = nullptr;
481 return StatusCode::SUCCESS;
482 }
483 auto itr = m_systSetDict.find(systConfig);
484 if(itr != m_systSetDict.end())
485 {
486 m_selectedUncertainties = &itr->second;
487 return StatusCode::SUCCESS;
488 }
489 CP::SystematicSet mysys;
491 if(sc != StatusCode::SUCCESS) return sc;
492 std::unique_ptr<UncertaintyList> uncertainties;
493 for(auto& sysvar : mysys)
494 {
495 auto var = identifyCpSystematicVariation(sysvar);
496 if(!var.first)
497 {
498 ATH_MSG_ERROR("The systematic variation " << sysvar.name() << " is not recognized, despite being present in affectingSystematics()...");
499 return StatusCode::FAILURE;
500 }
501 if(!uncertainties) uncertainties.reset(new UncertaintyList(var.first, var.second));
502 else uncertainties->extraVariation(var.first, var.second);
503 }
504 if(uncertainties)
505 {
506 auto emplaced = m_systSetDict.emplace(systConfig, std::move(*uncertainties));
507 m_selectedUncertainties = &emplaced.first->second;
508 }
509 else m_selectedUncertainties = nullptr;
510 return StatusCode::SUCCESS;
511}
512
514{
515 auto info = getUncertaintyDescription(systematic);
516 if(info.length()) ATH_MSG_INFO(info);
517}
518
520{
522 {
523 ATH_MSG_ERROR("This function can be called only once the tool has been initialized");
524 return "";
525 }
526
527 auto UID = identifyCpSystematicVariation(systematic).first;
528 if(!UID)
529 {
530 ATH_MSG_WARNING("Systematic variation " + systematic.name() + " is not recognized by BaseFakeBkgTool");
531 return "";
532 }
533
534 if(UID == 0)
535 {
536 return "Total statistical uncertainty in the event yield";
537 }
538 std::string info;
539 auto stat = m_database->findStat(UID);
540 if(stat)
541 {
542 info = "Statistical uncertainty affecting ";
544 }
545 else
546 {
547 auto syst = m_database->findSyst(UID);
548 if(syst)
549 {
550 info = "Systematic uncertainty \"" + syst->name + "\" affecting ";
551 }
552 else
553 {
554 ATH_MSG_ERROR("uncertainty with UID " << std::hex << UID << std::dec << " not found in database");
555 return "";
556 }
557 }
559 return info;
560}
561
563{
564 uint16_t UID = identifyCpSystematicVariation(systematic).first;
565 if(UID) return Database::isSystUID(UID);
566 return false;
567}
568
570{
571 uint16_t UID = identifyCpSystematicVariation(systematic).first;
572 if(UID) return Database::isStatUID(UID);
573 return false;
574}
575
577{
578 uint16_t UID = identifyCpSystematicVariation(systematic).first;
579 if(UID) return getListOfEfficienciesAffectedBy(UID).find("electron") != std::string::npos;
580 return false;
581}
582
584{
585 uint16_t UID = identifyCpSystematicVariation(systematic).first;
586 if(UID) return getListOfEfficienciesAffectedBy(UID).find("muon") != std::string::npos;
587 return false;
588}
589
591{
592 uint16_t UID = identifyCpSystematicVariation(systematic).first;
593 if(UID) return getListOfEfficienciesAffectedBy(UID).find("tau") != std::string::npos;
594 return false;
595}
596
598{
599 uint16_t UID = identifyCpSystematicVariation(systematic).first;
600 if(UID) return getListOfEfficienciesAffectedBy(UID).find("real eff") != std::string::npos;
601 return false;
602}
603
605{
606 uint16_t UID = identifyCpSystematicVariation(systematic).first;
607 if(UID) return getListOfEfficienciesAffectedBy(UID).find("fake eff") != std::string::npos;
608 return false;
609}
610
612{
613 uint16_t UID = identifyCpSystematicVariation(systematic).first;
614 if(UID) return getListOfEfficienciesAffectedBy(UID).find("fake factor") != std::string::npos;
615 return false;
616}
617
618CP::SystematicSet BaseFakeBkgTool::affectingSystematicsFor(const std::string& nuisanceParameter) const
619{
620 CP::SystematicSet affecting;
622 {
623 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...");
624 return {};
625 }
626 bool up=true, down=true;
627 auto pos1=nuisanceParameter.find("__up"), pos2=nuisanceParameter.find("__down");
628 if(pos1!=std::string::npos && pos1+4==nuisanceParameter.length()) down = false;
629 else if(pos2!=std::string::npos && pos2+6==nuisanceParameter.length()) up = false;
630 std::string np = nuisanceParameter.substr(0, std::min(pos1, pos2));
631 for(unsigned i=0;i<m_database->numberOfSysts();++i)
632 {
633 auto syst = m_database->findSyst(m_database->systIndexToUID(i));
634 if(syst && syst->name==np)
635 {
636 std::string name = "FAKEBKG_SYST_VAR" + std::to_string(i);
637 if(up) affecting.insert(CP::SystematicVariation(name, 1.f));
638 if(down) affecting.insert(CP::SystematicVariation(name, -1.f));
639 }
640 }
641 return affecting;
642}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(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".
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