ATLAS Offline Software
Loading...
Searching...
No Matches
IsolationConditionFormula.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4
6
7#include <TF1.h>
8#include <TH3.h>
9#include <TString.h>
10
11#include <algorithm>
12#include <cmath>
13
14namespace CP {
15 IsolationConditionFormula::IsolationConditionFormula(const std::string& name, xAOD::Iso::IsolationType isoType, const std::string& cutFunction,
16 bool invertCut, const std::string& isoDecSuffix) :
17 IsolationCondition(name, isoType, isoDecSuffix),
18 m_cutFunction (std::make_unique<TF1>(cutFunction.c_str(), cutFunction.c_str())),
19 m_invertCut (invertCut)
20 {
21 }
22 IsolationConditionFormula::IsolationConditionFormula(const std::string& name, const std::string& isoType, const std::string& cutFunction,
23 bool invertCut, const std::string& isoDecSuffix) :
24 IsolationCondition(name, isoType, isoDecSuffix),
25 m_cutFunction (std::make_unique<TF1>(cutFunction.c_str(), cutFunction.c_str())),
26 m_invertCut (invertCut)
27 {
28 }
30 const float cutVal = m_cutFunction->Eval(x.pt());
31 const FloatAccessor& acc = accessor();
32 if (!acc.isAvailable(x)) {
33 // Temporary fix for missing closeByCorr variables if no primary vertex exists for the event
34 // If closeByCorr variable does not exist, fallback to the standard isolation variable 2025/02
35 const FloatAccessor& acc_noCloseBy = accessor_noCloseBy();
36 if (acc_noCloseBy.isAvailable(x)) {
37 if (!m_invertCut) return acc_noCloseBy(x) <= cutVal;
38 return acc_noCloseBy(x) > cutVal;
39 }
40 else {
41 ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<"Accessor "<<SG::AuxTypeRegistry::instance().getName(acc.auxid())
42 <<" is not available. Expected when using primary AODs, post-p3793 derivations (only for *FixedRad or FixedCutPflow* for electrons), "
43 <<" pre-p3517 derivations (only for FC*), or pre-p3830 derivations (for other electron WPs)");
44 if (!m_isoDecSuffix.empty()) throw std::runtime_error ("IsolationConditionCombined: IsolationSelectionTool property 'IsoDecSuffix' is set to " + m_isoDecSuffix + ". Must run on derivation made with IsolationCloseByCorrection to create the isolation variables with this suffix, or remove 'IsoDecSuffix'. ");
45 return false;
46 }
47 }
48 if (!m_invertCut) return acc(x) <= cutVal;
49 return acc(x) > cutVal;
50 }
51
53 const float cutVal = m_cutFunction->Eval(x.pt);
54 if (!m_invertCut) return x.isolationValues.at(type()) <= cutVal;
55 return x.isolationValues.at(type()) > cutVal;
56 }
57
58} // namespace CP
#define ATH_MSG_WARNING(x)
#define x
IsolationConditionFormula(const std::string &name, xAOD::Iso::IsolationType isoType, const std::string &cutFunction, bool invertCut=false, const std::string &isoDecSuffix="")
virtual bool accept(const xAOD::IParticle &x) const override
IsolationCondition(const std::string &name, xAOD::Iso::IsolationType isoType, const std::string &isoDecSuffix="")
const FloatAccessor & accessor_noCloseBy(unsigned int n=0) const
const std::string & name() const
xAOD::Iso::IsolationType type(unsigned int n=0) const
const FloatAccessor & accessor(unsigned int n=0) const
static AuxTypeRegistry & instance()
Return the singleton registry instance.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
Class providing the definition of the 4-vector interface.
Select isolated Photons, Electrons and Muons.
STL namespace.
IsolationType
Overall enumeration for isolation types in xAOD files.
static const SG::AuxElement::Accessor< ElementLink< IParticleContainer > > acc("originalObjectLink")
Object used for setting/getting the dynamic decoration in question.