ATLAS Offline Software
Loading...
Searching...
No Matches
TrigTauMonitorL1Algorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7
8TrigTauMonitorL1Algorithm::TrigTauMonitorL1Algorithm(const std::string& name, ISvcLocator* pSvcLocator)
9 : TrigTauMonitorBaseAlgorithm(name, pSvcLocator)
10{}
11
12
14{
16
18
19 return StatusCode::SUCCESS;
20}
21
22StatusCode TrigTauMonitorL1Algorithm::processEvent(const EventContext& ctx) const
23{
24 constexpr float threshold_offset = 10.0;
25
26 // Offline taus
27 auto offline_taus_all = getOfflineTausAll(ctx, 0.0);
28 if(m_requireOfflineTaus && offline_taus_all.empty()) return StatusCode::SUCCESS;
29
30 // xTOB-based eTAU RoIs
31 // If the container is not in SG, it'll return an empty vector
32 const std::vector<const xAOD::eFexTauRoI*> xtob_etau_rois = getL1xTOBeTAUs();
33
34 for(const std::string& trigger : m_triggers) {
35 const TrigTauInfo& info = getTrigInfo(trigger);
36
37 if(!info.isL1TauOnly()) {
38 ATH_MSG_WARNING("Chain \"" << trigger << "\" is not an L1 tau trigger. Skipping...");
39 continue;
40 }
41
42 // Offline tau requirement check
43 std::vector<const xAOD::TauJet*> offline_taus_with_id = classifyTausAll(offline_taus_all, 0, static_cast<TauID>(m_offline_tau_id.value()));
44 if(m_requireOfflineTaus && offline_taus_with_id.empty()) continue;
45
46 // Filter offline taus
47 auto offline_taus = classifyOfflineTaus(offline_taus_with_id, info.getL1TauThreshold() - threshold_offset);
48 std::vector<const xAOD::TauJet*> offline_taus_1p = offline_taus.first;
49 std::vector<const xAOD::TauJet*> offline_taus_3p = offline_taus.second;
50
51 if(info.getL1TauType() == "eTAU") {
52 std::vector<const xAOD::eFexTauRoI*> rois = getL1eTAUs(ctx, info.getL1TauItem());
53
54 if(m_do_variable_plots) fillL1eTauVars(trigger, rois, xtob_etau_rois);
56 fillL1Efficiencies(ctx, offline_taus_1p, "1P", trigger, rois);
57 fillL1Efficiencies(ctx, offline_taus_3p, "3P", trigger, rois);
58 }
59
60 } else if(info.getL1TauType() == "jTAU") {
61 std::vector<const xAOD::jFexTauRoI*> rois = getL1jTAUs(ctx, info.getL1TauItem());
62
63 if(m_do_variable_plots) fillL1jTauVars(trigger, rois);
65 fillL1Efficiencies(ctx, offline_taus_1p, "1P", trigger, rois);
66 fillL1Efficiencies(ctx, offline_taus_3p, "3P", trigger, rois);
67 }
68
69 } else if(info.getL1TauType() == "cTAU") {
70 std::vector<std::pair<const xAOD::eFexTauRoI*, const xAOD::jFexTauRoI*>> rois = getL1cTAUs(ctx, info.getL1TauItem());
71
72 std::vector<const xAOD::eFexTauRoI*> eTau_rois;
73 eTau_rois.reserve(rois.size());
74for(const auto& [eTau_roi, jTau_roi] : rois) eTau_rois.push_back(eTau_roi);
75
76 if(m_do_variable_plots) fillL1cTauVars(trigger, rois, xtob_etau_rois);
78 fillL1Efficiencies(ctx, offline_taus_1p, "1P", trigger, eTau_rois);
79 fillL1Efficiencies(ctx, offline_taus_3p, "3P", trigger, eTau_rois);
80 }
81
82 }
83 }
84
85 return StatusCode::SUCCESS;
86}
87
88
89void TrigTauMonitorL1Algorithm::fillL1eTauVars(const std::string& trigger, const std::vector<const xAOD::eFexTauRoI*>& rois, const std::vector<const xAOD::eFexTauRoI*>& xtob_rois) const
90{
91 ATH_MSG_DEBUG("Fill L1 variables: " << trigger);
92
93 auto monGroup = getGroup(trigger+"_L1Vars");
94
95 auto L1RoIEt = Monitored::Collection("L1RoIEt" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->et()/Gaudi::Units::GeV; });
96 auto L1RoIEta = Monitored::Collection("L1RoIEta" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->eta(); });
97 auto L1RoIPhi = Monitored::Collection("L1RoIPhi" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->phi(); });
98 auto L1RoIRCore = Monitored::Collection("L1eFexRoIRCore", rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->rCore(); });
99 auto L1RoIRHad = Monitored::Collection("L1eFexRoIRHad" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->rHad(); });
100 auto L1RoIBDTScore = Monitored::Collection("L1eFexRoIBDTScore" , rois, [this, &xtob_rois](const xAOD::eFexTauRoI* L1roi){ return getBDTScore(L1roi, xtob_rois); });
101 fill(monGroup, L1RoIEt, L1RoIEta, L1RoIPhi, L1RoIRCore, L1RoIRHad, L1RoIBDTScore);
102
103 ATH_MSG_DEBUG("After fill L1 variables: " << trigger);
104}
105
106
107void TrigTauMonitorL1Algorithm::fillL1jTauVars(const std::string& trigger, const std::vector<const xAOD::jFexTauRoI*>& rois) const
108{
109 ATH_MSG_DEBUG("Fill L1 variables: " << trigger);
110
111 auto monGroup = getGroup(trigger+"_L1Vars");
112
113 auto L1RoIEt = Monitored::Collection("L1RoIEt" , rois, [](const xAOD::jFexTauRoI* L1roi){ return L1roi->et()/Gaudi::Units::GeV; });
114 auto L1RoIEta = Monitored::Collection("L1RoIEta" , rois, [](const xAOD::jFexTauRoI* L1roi){ return L1roi->eta(); });
115 auto L1RoIPhi = Monitored::Collection("L1RoIPhi" , rois, [](const xAOD::jFexTauRoI* L1roi){ return L1roi->phi(); });
116 auto L1jFexRoIIso = Monitored::Collection("L1jFexRoIIso", rois, [](const xAOD::jFexTauRoI* L1roi){ return L1roi->iso()/Gaudi::Units::GeV; });
117
118 fill(monGroup, L1RoIEt, L1RoIEta, L1RoIPhi, L1jFexRoIIso);
119
120 ATH_MSG_DEBUG("After fill L1 variables: " << trigger);
121}
122
123
124
125void TrigTauMonitorL1Algorithm::fillL1cTauVars(const std::string& trigger, const std::vector<std::pair<const xAOD::eFexTauRoI*, const xAOD::jFexTauRoI*>>& rois, const std::vector<const xAOD::eFexTauRoI*>& xtob_rois) const
126{
127 ATH_MSG_DEBUG("Fill L1 variables: " << trigger);
128
129 auto monGroup = getGroup(trigger+"_L1Vars");
130
131 auto L1RoIEt = Monitored::Collection("L1RoIEt" , rois, [](const auto L1roi){ return L1roi.first->et()/Gaudi::Units::GeV; });
132 auto L1RoIEta = Monitored::Collection("L1RoIEta" , rois, [](const auto L1roi){ return L1roi.first->eta(); });
133 auto L1RoIPhi = Monitored::Collection("L1RoIPhi" , rois, [](const auto L1roi){ return L1roi.first->phi(); });
134 auto L1eFexRoIRCore = Monitored::Collection("L1eFexRoIRCore", rois, [](const auto L1roi){ return L1roi.first->rCore(); });
135 auto L1eFexRoIRHad = Monitored::Collection("L1eFexRoIRHad" , rois, [](const auto L1roi){ return L1roi.first->rHad(); });
136 auto L1RoIBDTScore = Monitored::Collection("L1eFexRoIBDTScore" , rois, [this, &xtob_rois](const auto L1roi){ return getBDTScore(L1roi.first, xtob_rois); });
137
138 std::vector<bool> jFex_isMatched;
139 std::vector<float> jFex_eFex_et_ratio;
140 std::vector<float> jFex_isolation;
141 std::vector<float> cTau_isolation;
142 for(const auto& [eFexRoI, jFexRoI] : rois) {
143 if(!jFexRoI) {
144 jFex_isMatched.push_back(false);
145 continue;
146 }
147
148 jFex_isMatched.push_back(true);
149 jFex_eFex_et_ratio.push_back(jFexRoI->et()/eFexRoI->et());
150 jFex_isolation.push_back(jFexRoI->iso()/Gaudi::Units::GeV);
151 cTau_isolation.push_back(jFexRoI->iso()/eFexRoI->et());
152 }
153 auto L1cTauRoITopoMatch = Monitored::Collection("L1cTauRoITopoMatch" , jFex_isMatched);
154 auto L1jFexRoIIso = Monitored::Collection("L1jFexRoIIso" , jFex_isolation);
155 auto L1cTauRoIIso = Monitored::Collection("L1cTauMatchedRoIIso" , cTau_isolation);
156 auto L1RoIcTauEtRatio = Monitored::Collection("L1RoIcTauMatchedEtRatio", jFex_eFex_et_ratio);
157
158 fill(monGroup, L1RoIEt, L1RoIEta, L1RoIPhi, L1eFexRoIRCore, L1eFexRoIRHad, L1cTauRoITopoMatch, L1jFexRoIIso, L1cTauRoIIso, L1RoIcTauEtRatio, L1RoIBDTScore );
159
160 ATH_MSG_DEBUG("After fill L1 variables: " << trigger);
161}
162
163std::vector<const xAOD::eFexTauRoI*> TrigTauMonitorL1Algorithm::getL1xTOBeTAUs() const
164{
165 std::vector<const xAOD::eFexTauRoI*> roi_vec;
166
167 if(m_phase1l1eTauxRoIKey.empty()) return roi_vec;
168
170 if(!rois.isValid()) {
171 ATH_MSG_WARNING("The L1_eTauxRoI container is not available! No e/cTAU BDT score will be retrieved");
172 return roi_vec;
173 }
174
175 for(const xAOD::eFexTauRoI* roi : *rois) roi_vec.push_back(roi);
176 return roi_vec;
177}
178
179unsigned int TrigTauMonitorL1Algorithm::getBDTScore(const xAOD::eFexTauRoI* roi, const std::vector<const xAOD::eFexTauRoI*>& xtob_rois) const
180{
181 if(xtob_rois.empty()) return 0;
182
183 for(const xAOD::eFexTauRoI* xroi : xtob_rois) {
184 if(xroi->eta() == roi->eta() && xroi->phi() == roi->phi()) return xroi->bdtScore();
185 }
186 ATH_MSG_DEBUG("Unmatched RoI! et=" << roi->et() << ", eta=" << roi->eta() << ", phi=" << roi->phi());
187 for(const xAOD::eFexTauRoI* xroi : xtob_rois) {
188 ATH_MSG_DEBUG(" - xRoI et=" << xroi->et() << ", eta=" << xroi->eta() << ", phi=" << xroi->phi());
189 }
190 return 0;
191}
192
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
std::vector< const xAOD::eFexTauRoI * > getL1eTAUs(const EventContext &ctx, const std::string &l1_item) const
Gaudi::Property< bool > m_do_efficiency_plots
virtual StatusCode initialize() override
initialize
TrigTauMonitorBaseAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< const xAOD::TauJet * > getOfflineTausAll(const EventContext &ctx, const float threshold=20.0) const
Gaudi::Property< std::vector< std::string > > m_triggers
const TrigTauInfo & getTrigInfo(const std::string &trigger) const
std::vector< const xAOD::jFexTauRoI * > getL1jTAUs(const EventContext &ctx, const std::string &l1_item) const
std::vector< std::pair< const xAOD::eFexTauRoI *, const xAOD::jFexTauRoI * > > getL1cTAUs(const EventContext &ctx, const std::string &l1_item) const
std::vector< const xAOD::TauJet * > classifyTausAll(const std::vector< const xAOD::TauJet * > &taus, const float threshold=0.0, const TauID tau_id=TauID::None) const
std::pair< std::vector< const xAOD::TauJet * >, std::vector< const xAOD::TauJet * > > classifyOfflineTaus(const std::vector< const xAOD::TauJet * > &taus, const float threshold=0.0, const TauID tau_id=TauID::None) const
Gaudi::Property< bool > m_do_variable_plots
void fillL1jTauVars(const std::string &trigger, const std::vector< const xAOD::jFexTauRoI * > &rois) const
Gaudi::Property< unsigned int > m_offline_tau_id
virtual StatusCode processEvent(const EventContext &ctx) const override
void fillL1Efficiencies(const EventContext &ctx, const std::vector< const xAOD::TauJet * > &offline_tau_vec, const std::string &nProng, const std::string &trigger, const std::vector< const T * > &rois) const
void fillL1eTauVars(const std::string &trigger, const std::vector< const xAOD::eFexTauRoI * > &rois, const std::vector< const xAOD::eFexTauRoI * > &xtob_rois) const
void fillL1cTauVars(const std::string &trigger, const std::vector< std::pair< const xAOD::eFexTauRoI *, const xAOD::jFexTauRoI * > > &rois, const std::vector< const xAOD::eFexTauRoI * > &xtob_rois) const
SG::ReadHandleKey< xAOD::eFexTauRoIContainer > m_phase1l1eTauxRoIKey
TrigTauMonitorL1Algorithm(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< const xAOD::eFexTauRoI * > getL1xTOBeTAUs() const
unsigned int getBDTScore(const xAOD::eFexTauRoI *roi, const std::vector< const xAOD::eFexTauRoI * > &xtob_rois) const
Gaudi::Property< bool > m_requireOfflineTaus
virtual StatusCode initialize() override
initialize
float et() const
TOB ET (decoded from TOB, stored for convenience)
float phi() const
Seed supercell index within central tower (0 -> 3)
float rCore() const
Jet Discriminants Derived floating point values (not used in actual algorithm)
float eta() const
setter for the above
unsigned int iso() const
Iso on TOB scale.
float phi() const
float eta() const
unsigned int et() const
Methods that require combining results or applying scales.
void fill(const ToolHandle< GenericMonitoringTool > &groupHandle, std::vector< std::reference_wrapper< Monitored::IMonitoredVariable > > &&variables) const
Fills a vector of variables to a group by reference.
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
jFexTauRoI_v1 jFexTauRoI
Define the latest version of the jFexSRJetRoI class.
Definition jFexTauRoI.h:13
eFexTauRoI_v1 eFexTauRoI
Define the latest version of the eFexTauRoI class.
Definition eFexTauRoI.h:16