ATLAS Offline Software
Loading...
Searching...
No Matches
TauPi0ScoreCalculator.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
7#include "xAODPFlow/PFO.h"
8
9
11 TauRecToolBase(name) {
12}
13
14
16 std::string weightFile = find_file(m_weightfile);
17
18 m_mvaBDT = std::make_unique<tauRecTools::BDTHelper>();
19 ATH_CHECK(m_mvaBDT->initialize(weightFile));
20
21 return StatusCode::SUCCESS;
22}
23
24
26 const EventContext& /*ctx*/,
27 xAOD::PFOContainer& neutralPFOContainer) const {
28 // Only run on 0-5 prong taus
29 if (!tauRecTools::doPi0andShots(pTau)) {
30 return StatusCode::SUCCESS;
31 }
32
33 // retrieve neutral PFOs from tau, calculate BDT scores and store them in PFO
34 for(size_t i=0; i<pTau.nProtoNeutralPFOs(); i++) {
35 xAOD::PFO* neutralPFO = neutralPFOContainer.at( pTau.protoNeutralPFO(i)->index() );
36 float BDTScore = calculateScore(neutralPFO);
37 neutralPFO->setBDTPi0Score(BDTScore);
38 }
39
40 return StatusCode::SUCCESS;
41}
42
43
44float TauPi0ScoreCalculator::calculateScore(const xAOD::PFO* neutralPFO) const {
45
46 std::map<TString, float> availableVariables;
47
48 int ivariable = 0;
49 float fvariable = 0.;
50
51 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_FIRST_ETA, fvariable) == false) {
52 ATH_MSG_WARNING("Can't find FIRST_ETA. Set it to 0.");
53 }
54 fvariable = std::abs(fvariable);
55 availableVariables.insert(std::make_pair("Pi0Cluster_Abs_FIRST_ETA", fvariable));
56
57 fvariable = 0.;
58 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_SECOND_R, fvariable) == false) {
59 ATH_MSG_WARNING("Can't find SECOND_R. Set it to 0.");
60 }
61 availableVariables.insert(std::make_pair("Pi0Cluster_SECOND_R", fvariable));
62
63 fvariable = 0.;
64 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_DELTA_THETA, fvariable) == false) {
65 ATH_MSG_WARNING("Can't find DELTA_THETA. Set it to 0.");
66 }
67 fvariable = std::abs(fvariable);
68 availableVariables.insert(std::make_pair("Pi0Cluster_Abs_DELTA_THETA", fvariable));
69
70 fvariable = 0.;
71 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_CENTER_LAMBDA, fvariable) == false) {
72 ATH_MSG_WARNING("Can't find CENTER_LAMBDA. Set it to 0.");
73 }
74 fvariable = fmin(fvariable, 1000.);
75 availableVariables.insert(std::make_pair("Pi0Cluster_CENTER_LAMBDA_helped", fvariable));
76
77 fvariable = 0.;
78 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_LONGITUDINAL, fvariable) == false) {
79 ATH_MSG_WARNING("Can't find LONGITUDINAL. Set it to 0.");
80 }
81 availableVariables.insert(std::make_pair("Pi0Cluster_LONGITUDINAL", fvariable));
82
83 fvariable = 0.;
84 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_ENG_FRAC_EM, fvariable) == false) {
85 ATH_MSG_WARNING("Can't find ENG_FRAC_EM. Set it to 0.");
86 }
87 availableVariables.insert(std::make_pair("Pi0Cluster_ENG_FRAC_EM", fvariable));
88
89 fvariable = 0.;
90 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_ENG_FRAC_CORE, fvariable) == false) {
91 ATH_MSG_WARNING("Can't find ENG_FRAC_CORE. Set it to 0.");
92 }
93 availableVariables.insert(std::make_pair("Pi0Cluster_ENG_FRAC_CORE", fvariable));
94
95 fvariable = 0.;
96 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_SECOND_ENG_DENS, fvariable) == false) {
97 ATH_MSG_WARNING("Can't find SECOND_ENG_DENS. Set it to 0.");
98 }
99 if(fvariable==0.) {
100 fvariable=-50.;
101 }
102 else {
103 fvariable = log(fvariable);
104 }
105 availableVariables.insert(std::make_pair("Pi0Cluster_log_SECOND_ENG_DENS", fvariable));
106
107 fvariable = 0.;
108 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_EM1CoreFrac, fvariable) == false) {
109 ATH_MSG_WARNING("Can't find EM1CoreFrac. Set it to 0.");
110 }
111 availableVariables.insert(std::make_pair("Pi0Cluster_EcoreOverEEM1", fvariable));
112
113 ivariable = 0;
114 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM1, ivariable) == false) {
115 ATH_MSG_WARNING("Can't find NPosECells_EM1. Set it to 0.");
116 }
117 availableVariables.insert(std::make_pair("Pi0Cluster_NPosECells_EM1", static_cast<float>(ivariable)));
118
119 ivariable = 0;
120 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM2, ivariable) == false) {
121 ATH_MSG_WARNING("Can't find NPosECells_EM2. Set it to 0.");
122 }
123 availableVariables.insert(std::make_pair("Pi0Cluster_NPosECells_EM2", static_cast<float>(ivariable)));
124
125 fvariable = 0.;
126 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_firstEtaWRTClusterPosition_EM1, fvariable) == false) {
127 ATH_MSG_WARNING("Can't find firstEtaWRTClusterPosition_EM1. Set it to 0.");
128 }
129 fvariable = std::abs(fvariable);
130 availableVariables.insert(std::make_pair("Pi0Cluster_AbsFirstEtaWRTClusterPosition_EM1", fvariable));
131
132 fvariable = 0.;
133 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM2, fvariable) == false) {
134 ATH_MSG_WARNING("Can't find secondEtaWRTClusterPosition_EM2. Set it to 0.");
135 }
136 availableVariables.insert(std::make_pair("Pi0Cluster_secondEtaWRTClusterPosition_EM2", fvariable));
137
138 // Calculate BDT score, will be -999 when availableVariables lack variables
139 float score = m_mvaBDT->getGradBoostMVA(availableVariables);
140
141 return score;
142}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x,...)
const T * at(size_type n) const
Access an element, as an rvalue.
std::unique_ptr< tauRecTools::BDTHelper > m_mvaBDT
virtual StatusCode executeTool(xAOD::TauJet &pTau, const EventContext &ctx, xAOD::PFOContainer &pNeutralPFOContainer) const override
float calculateScore(const xAOD::PFO *neutralPFO) const
Calculate pi0 BDT score.
virtual StatusCode initialize() override
Tool initializer.
Gaudi::Property< std::string > m_weightfile
TauPi0ScoreCalculator(const std::string &name)
TauRecToolBase(const std::string &name)
std::string find_file(const std::string &fname) const
bool attribute(PFODetails::PFOAttributes AttributeType, T &anAttribute) const
get a PFO Variable via enum
void setBDTPi0Score(float BDTPi0Score)
set BDT Score used to classify clusters as Pi0 like or not
const PFO * protoNeutralPFO(size_t i) const
Get the pointer to a given cellbased_neutral PFO associated with this tau.
size_t nProtoNeutralPFOs() const
Get the number of cellbased_neutral PFO particles associated with this tau.
bool doPi0andShots(const xAOD::TauJet &tau)
Determines whether pi0s and shots should be built for a tau candidate.
PFO_v1 PFO
Definition of the current "pfo version".
Definition PFO.h:17
PFOContainer_v1 PFOContainer
Definition of the current "pfo container version".
TauJet_v3 TauJet
Definition of the current "tau version".
Definition TauJet.h:17