ATLAS Offline Software
Loading...
Searching...
No Matches
MvaTESEvaluator.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// local include(s)
7
8
9MvaTESEvaluator::MvaTESEvaluator(const std::string& name)
10 : TauRecToolBase(name) {
11}
12
13
15
16 const std::string weightFile = find_file(m_sWeightFileName);
17 m_bdtHelper = std::make_unique<tauRecTools::BDTHelper>();
18 ATH_CHECK(m_bdtHelper->initialize(weightFile));
19
20 if (!m_sWeightFileName0p.empty()) {
21 const std::string weightFile0p = find_file(m_sWeightFileName0p);
22 m_bdtHelper0p = std::make_unique<tauRecTools::BDTHelper>();
23 ATH_CHECK(m_bdtHelper0p->initialize(weightFile0p));
24 }
25
26 return StatusCode::SUCCESS;
27}
28
29
31 const EventContext& /*ctx*/) const {
32
33 std::map<TString, float*> availableVars;
35
36 // Declare input variables to the reader
37 if (!inTrigger()) {
38 availableVars.insert( std::make_pair("TauJetsAuxDyn.mu", &vars.mu) );
39 availableVars.insert( std::make_pair("TauJetsAuxDyn.nVtxPU", &vars.nVtxPU) );
40 availableVars.insert( std::make_pair("TauJetsAuxDyn.rho", &vars.rho) );
41 availableVars.insert( std::make_pair("TauJetsAuxDyn.ClustersMeanCenterLambda", &vars.center_lambda) );
42 availableVars.insert( std::make_pair("TauJetsAuxDyn.ClustersMeanFirstEngDens", &vars.first_eng_dens) );
43 availableVars.insert( std::make_pair("TauJetsAuxDyn.ClustersMeanSecondLambda", &vars.second_lambda) );
44 availableVars.insert( std::make_pair("TauJetsAuxDyn.ClustersMeanPresamplerFrac", &vars.presampler_frac) );
45 availableVars.insert( std::make_pair("TauJetsAuxDyn.ClustersMeanEMProbability", &vars.eprobability) );
46 availableVars.insert( std::make_pair("TauJetsAuxDyn.ptIntermediateAxisEM/TauJetsAuxDyn.ptIntermediateAxis", &vars.ptEM_D_ptLC) );
47 availableVars.insert( std::make_pair("TauJetsAuxDyn.ptIntermediateAxis/TauJetsAuxDyn.ptCombined", &vars.ptLC_D_ptCombined) );
48 availableVars.insert( std::make_pair("TauJetsAuxDyn.etaPanTauCellBased", &vars.etaConstituent) );
49 if (m_bdtHelper0p && xTau.nTracks()==0) {
50 availableVars.insert( std::make_pair("log(TauJetsAuxDyn.ptCombined)", &vars.logPtCombined) );
51 availableVars.insert( std::make_pair("TauJetsAuxDyn.LeadClusterFrac", &vars.lead_cluster_frac) );
52 availableVars.insert( std::make_pair("TauJetsAuxDyn.centFrac", &vars.centFrac) );
53 availableVars.insert( std::make_pair("TauJetsAuxDyn.UpsilonCluster", &vars.upsilon_cluster) );
54 availableVars.insert( std::make_pair("TauJetsAuxDyn.ptJetSeed/TauJetsAuxDyn.ptCombined", &vars.ptSeed_D_ptCombined) );
55 }
56 else {
57 availableVars.insert( std::make_pair("TauJetsAuxDyn.ptPanTauCellBased/TauJetsAuxDyn.ptCombined", &vars.ptConstituent_D_ptCombined) );
58 availableVars.insert( std::make_pair("TauJetsAuxDyn.ptCombined", &vars.ptCombined) );
59 availableVars.insert( std::make_pair("TauJetsAuxDyn.PanTau_BDTValue_1p0n_vs_1p1n", &vars.PanTauBDT_1p0n_vs_1p1n) );
60 availableVars.insert( std::make_pair("TauJetsAuxDyn.PanTau_BDTValue_1p1n_vs_1pXn", &vars.PanTauBDT_1p1n_vs_1pXn) );
61 availableVars.insert( std::make_pair("TauJetsAuxDyn.PanTau_BDTValue_3p0n_vs_3pXn", &vars.PanTauBDT_3p0n_vs_3pXn) );
62 availableVars.insert( std::make_pair("TauJetsAuxDyn.nTracks", &vars.nTracks) );
63 availableVars.insert( std::make_pair("TauJetsAuxDyn.PFOEngRelDiff", &vars.PFOEngRelDiff) );
64 }
65 }
66 else {
67 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.mu", &vars.mu) );
68 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.ClustersMeanCenterLambda", &vars.center_lambda) );
69 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.ClustersMeanFirstEngDens", &vars.first_eng_dens) );
70 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.ClustersMeanSecondLambda", &vars.second_lambda) );
71 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.ClustersMeanPresamplerFrac", &vars.presampler_frac) );
72 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.ClustersMeanEMProbability", &vars.eprobability) );
73 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.LeadClusterFrac", &vars.lead_cluster_frac) );
74 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.SecondClusterFrac", &vars.second_cluster_frac) );
75 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.ThirdClusterFrac", &vars.third_cluster_frac) );
76 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.UpsilonCluster", &vars.upsilon_cluster) );
77 availableVars.insert( std::make_pair("log(TrigTauJetsAuxDyn.ptDetectorAxis)", &vars.logPtDetectorAxis) );
78 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.etaDetectorAxis", &vars.etaDetectorAxis) );
79 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.ptIntermediateAxisEM/TrigTauJetsAuxDyn.ptDetectorAxis", &vars.ptEM_D_ptLC) );
80 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.ptDetectorAxis/TrigTauJetsAuxDyn.ptJetSeed", &vars.ptDetectorAxis_D_ptJetSeed) );
81 availableVars.insert( std::make_pair("TrigTauJetsAuxDyn.centFrac", &vars.centFrac) );
82 }
83
84 // Retrieve average pileup
85 static const SG::ConstAccessor<float> acc_mu("mu");
86 vars.mu = acc_mu(xTau);
87
88 // Retrieve cluster moments
94
95 static const SG::ConstAccessor<float> acc_ptIntermediateAxisEM("ptIntermediateAxisEM");
96 float ptEM = acc_ptIntermediateAxisEM(xTau);
97
98 if (!inTrigger()) {
99 static const SG::ConstAccessor<float> acc_ptCombined("ptCombined");
100 float ptCombined = acc_ptCombined(xTau);
101
102 if (ptCombined==0.) {
104 // apply MVA calibration as default
105 xTau.setP4(1., xTau.etaPanTauCellBased(), xTau.phiPanTauCellBased(), 0.);
106 return StatusCode::SUCCESS;
107 }
108
109 static const SG::ConstAccessor<int> acc_nVtxPU("nVtxPU");
110 vars.nVtxPU = acc_nVtxPU(xTau);
111
112 static const SG::ConstAccessor<float> acc_rho("rho");
113 vars.rho = acc_rho(xTau);
114
115 float ptLC = xTau.ptIntermediateAxis();
116
117 float ptConstituent = xTau.ptPanTauCellBased();
119
120 vars.ptEM_D_ptLC = (ptLC != 0.) ? ptEM / ptLC : 0.;
121 vars.ptLC_D_ptCombined = ptLC / ptCombined;
122
123 float ptMVA = 0.;
124
125 if (m_bdtHelper0p && xTau.nTracks()==0) {
126 vars.logPtCombined = std::log(ptCombined);
127 vars.ptSeed_D_ptCombined = xTau.ptJetSeed() / ptCombined;
128
129 static const SG::ConstAccessor<float> acc_UpsilonCluster("UpsilonCluster");
130 vars.upsilon_cluster = acc_UpsilonCluster(xTau);
131
132 static const SG::ConstAccessor<float> acc_LeadClusterFrac("LeadClusterFrac");
133 vars.lead_cluster_frac = acc_LeadClusterFrac(xTau);
134
136
137 ptMVA = float( ptCombined * m_bdtHelper0p->getResponse(availableVars) );
138 }
139 else {
140 vars.ptCombined = ptCombined;
141 vars.ptConstituent_D_ptCombined = ptConstituent / ptCombined;
142
143 // Retrieve substructure info
144 static const SG::ConstAccessor<float> acc_PanTauBDT_1p0n_vs_1p1n("PanTau_BDTValue_1p0n_vs_1p1n");
145 static const SG::ConstAccessor<float> acc_PanTauBDT_1p1n_vs_1pXn("PanTau_BDTValue_1p1n_vs_1pXn");
146 static const SG::ConstAccessor<float> acc_PanTauBDT_3p0n_vs_3pXn("PanTau_BDTValue_3p0n_vs_3pXn");
147 // BDT values are initialised to -1111, while actual scores (when evaluated) are within [-5,1], so take max between BDT score and -5-epsilon
148 vars.PanTauBDT_1p0n_vs_1p1n = std::max(acc_PanTauBDT_1p0n_vs_1p1n(xTau), -5.1f);
149 vars.PanTauBDT_1p1n_vs_1pXn = std::max(acc_PanTauBDT_1p1n_vs_1pXn(xTau), -5.1f);
150 vars.PanTauBDT_3p0n_vs_3pXn = std::max(acc_PanTauBDT_3p0n_vs_3pXn(xTau), -5.1f);
151 vars.nTracks = static_cast<float>(xTau.nTracks());
153
154 ptMVA = float( ptCombined * m_bdtHelper->getResponse(availableVars) );
155 }
156
157 if (ptMVA<1.) ptMVA=1.;
159 // apply MVA calibration as default
160 xTau.setP4(ptMVA, vars.etaConstituent, xTau.phiPanTauCellBased(), 0.);
161 }
162 else {
163 // protection but should never happen
164 if (xTau.ptDetectorAxis()==0. || xTau.ptJetSeed()==0.) {
166 xTau.setP4(1., xTau.etaDetectorAxis(), xTau.phiDetectorAxis(), 0.);
167 return StatusCode::SUCCESS;
168 }
169
170 vars.logPtDetectorAxis = std::log(xTau.ptDetectorAxis());
171 vars.etaDetectorAxis = xTau.etaDetectorAxis();
172 vars.ptEM_D_ptLC = ptEM / xTau.ptDetectorAxis();
174
175 static const SG::ConstAccessor<float> acc_UpsilonCluster("UpsilonCluster");
176 static const SG::ConstAccessor<float> acc_LeadClusterFrac("LeadClusterFrac");
177 static const SG::ConstAccessor<float> acc_SecondClusterFrac("SecondClusterFrac");
178 static const SG::ConstAccessor<float> acc_ThirdClusterFrac("ThirdClusterFrac");
179
180 vars.upsilon_cluster = acc_UpsilonCluster(xTau);
181 vars.lead_cluster_frac = acc_LeadClusterFrac(xTau);
182 vars.second_cluster_frac = acc_SecondClusterFrac(xTau);
183 vars.third_cluster_frac = acc_ThirdClusterFrac(xTau);
184
186
187 float ptMVA = float( xTau.ptDetectorAxis() * m_bdtHelper->getResponse(availableVars) );
188 if (ptMVA<1.) ptMVA=1.;
189
191 // apply MVA calibration
192 xTau.setP4(ptMVA, vars.etaDetectorAxis, xTau.phiDetectorAxis(), 0.);
193 }
194
195 ATH_MSG_DEBUG("final calib:" << xTau.pt() << " " << xTau.eta() << " " << xTau.phi() << " " << xTau.e());
196
197 return StatusCode::SUCCESS;
198}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
Gaudi::Property< std::string > m_sWeightFileName
std::unique_ptr< tauRecTools::BDTHelper > m_bdtHelper
std::unique_ptr< tauRecTools::BDTHelper > m_bdtHelper0p
virtual StatusCode initialize() override
Tool initializer.
MvaTESEvaluator(const std::string &name="MvaTESEvaluator")
Gaudi::Property< std::string > m_sWeightFileName0p
virtual StatusCode executeTool(xAOD::TauJet &xTau, const EventContext &ctx) const override
Execute - called for each tau candidate.
Helper class to provide constant type-safe access to aux data.
TauRecToolBase(const std::string &name)
std::string find_file(const std::string &fname) const
bool inTrigger() const
virtual double phi() const
The azimuthal angle ( ) of the particle.
double ptPanTauCellBased() const
double ptDetectorAxis() const
virtual double pt() const
The transverse momentum ( ) of the particle.
virtual double e() const
The total energy of the particle.
Definition TauJet_v3.cxx:87
double phiDetectorAxis() const
double etaDetectorAxis() const
double ptIntermediateAxis() const
bool detail(TauJetParameters::Detail detail, int &value) const
Get and set values of common details variables via enum.
void setP4(double pt, double eta, double phi, double m)
Set methods for IParticle values.
double ptJetSeed() const
double etaPanTauCellBased() const
virtual double eta() const
The pseudorapidity ( ) of the particle.
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
double phiPanTauCellBased() const
@ centFrac
Get centrality fraction.
Definition TauDefs.h:200
TauJet_v3 TauJet
Definition of the current "tau version".
Definition TauJet.h:17