ATLAS Offline Software
Loading...
Searching...
No Matches
TauPi0ScoreCalculator.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
7#include "xAODPFlow/PFO.h"
8
9
10
12 TauRecToolBase(name) {
13}
14
15
16
18 std::string weightFile = find_file(m_weightfile);
19
20 m_mvaBDT = std::make_unique<tauRecTools::BDTHelper>();
21 ATH_CHECK(m_mvaBDT->initialize(weightFile));
22
23 return StatusCode::SUCCESS;
24}
25
26
27
28StatusCode TauPi0ScoreCalculator::executePi0nPFO(xAOD::TauJet& pTau, xAOD::PFOContainer& neutralPFOContainer) const {
29 // Only run on 0-5 prong taus
30 if (!tauRecTools::doPi0andShots(pTau)) {
31 return StatusCode::SUCCESS;
32 }
33
34 // retrieve neutral PFOs from tau, calculate BDT scores and store them in PFO
35 for(size_t i=0; i<pTau.nProtoNeutralPFOs(); i++) {
36 xAOD::PFO* neutralPFO = neutralPFOContainer.at( pTau.protoNeutralPFO(i)->index() );
37 float BDTScore = calculateScore(neutralPFO);
38 neutralPFO->setBDTPi0Score(BDTScore);
39 }
40
41 return StatusCode::SUCCESS;
42}
43
44
45
46float TauPi0ScoreCalculator::calculateScore(const xAOD::PFO* neutralPFO) const {
47
48 std::map<TString, float> availableVariables;
49
50 int ivariable = 0;
51 float fvariable = 0.;
52
53 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_FIRST_ETA, fvariable) == false) {
54 ATH_MSG_WARNING("Can't find FIRST_ETA. Set it to 0.");
55 }
56 fvariable = std::abs(fvariable);
57 availableVariables.insert(std::make_pair("Pi0Cluster_Abs_FIRST_ETA", fvariable));
58
59 fvariable = 0.;
60 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_SECOND_R, fvariable) == false) {
61 ATH_MSG_WARNING("Can't find SECOND_R. Set it to 0.");
62 }
63 availableVariables.insert(std::make_pair("Pi0Cluster_SECOND_R", fvariable));
64
65 fvariable = 0.;
66 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_DELTA_THETA, fvariable) == false) {
67 ATH_MSG_WARNING("Can't find DELTA_THETA. Set it to 0.");
68 }
69 fvariable = std::abs(fvariable);
70 availableVariables.insert(std::make_pair("Pi0Cluster_Abs_DELTA_THETA", fvariable));
71
72 fvariable = 0.;
73 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_CENTER_LAMBDA, fvariable) == false) {
74 ATH_MSG_WARNING("Can't find CENTER_LAMBDA. Set it to 0.");
75 }
76 fvariable = fmin(fvariable, 1000.);
77 availableVariables.insert(std::make_pair("Pi0Cluster_CENTER_LAMBDA_helped", fvariable));
78
79 fvariable = 0.;
80 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_LONGITUDINAL, fvariable) == false) {
81 ATH_MSG_WARNING("Can't find LONGITUDINAL. Set it to 0.");
82 }
83 availableVariables.insert(std::make_pair("Pi0Cluster_LONGITUDINAL", fvariable));
84
85 fvariable = 0.;
86 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_ENG_FRAC_EM, fvariable) == false) {
87 ATH_MSG_WARNING("Can't find ENG_FRAC_EM. Set it to 0.");
88 }
89 availableVariables.insert(std::make_pair("Pi0Cluster_ENG_FRAC_EM", fvariable));
90
91 fvariable = 0.;
92 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_ENG_FRAC_CORE, fvariable) == false) {
93 ATH_MSG_WARNING("Can't find ENG_FRAC_CORE. Set it to 0.");
94 }
95 availableVariables.insert(std::make_pair("Pi0Cluster_ENG_FRAC_CORE", fvariable));
96
97 fvariable = 0.;
98 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_SECOND_ENG_DENS, fvariable) == false) {
99 ATH_MSG_WARNING("Can't find SECOND_ENG_DENS. Set it to 0.");
100 }
101 if(fvariable==0.) {
102 fvariable=-50.;
103 }
104 else {
105 fvariable = log(fvariable);
106 }
107 availableVariables.insert(std::make_pair("Pi0Cluster_log_SECOND_ENG_DENS", fvariable));
108
109 fvariable = 0.;
110 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_EM1CoreFrac, fvariable) == false) {
111 ATH_MSG_WARNING("Can't find EM1CoreFrac. Set it to 0.");
112 }
113 availableVariables.insert(std::make_pair("Pi0Cluster_EcoreOverEEM1", fvariable));
114
115 ivariable = 0;
116 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM1, ivariable) == false) {
117 ATH_MSG_WARNING("Can't find NPosECells_EM1. Set it to 0.");
118 }
119 availableVariables.insert(std::make_pair("Pi0Cluster_NPosECells_EM1", static_cast<float>(ivariable)));
120
121 ivariable = 0;
122 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM2, ivariable) == false) {
123 ATH_MSG_WARNING("Can't find NPosECells_EM2. Set it to 0.");
124 }
125 availableVariables.insert(std::make_pair("Pi0Cluster_NPosECells_EM2", static_cast<float>(ivariable)));
126
127 fvariable = 0.;
128 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_firstEtaWRTClusterPosition_EM1, fvariable) == false) {
129 ATH_MSG_WARNING("Can't find firstEtaWRTClusterPosition_EM1. Set it to 0.");
130 }
131 fvariable = std::abs(fvariable);
132 availableVariables.insert(std::make_pair("Pi0Cluster_AbsFirstEtaWRTClusterPosition_EM1", fvariable));
133
134 fvariable = 0.;
135 if(neutralPFO->attribute(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM2, fvariable) == false) {
136 ATH_MSG_WARNING("Can't find secondEtaWRTClusterPosition_EM2. Set it to 0.");
137 }
138 availableVariables.insert(std::make_pair("Pi0Cluster_secondEtaWRTClusterPosition_EM2", fvariable));
139
140 // Calculate BDT score, will be -999 when availableVariables lack variables
141 float score = m_mvaBDT->getGradBoostMVA(availableVariables);
142
143 return score;
144}
#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.
virtual StatusCode executePi0nPFO(xAOD::TauJet &pTau, xAOD::PFOContainer &pNeutralPFOContainer) const override
std::unique_ptr< tauRecTools::BDTHelper > m_mvaBDT
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