ATLAS Offline Software
Loading...
Searching...
No Matches
TrigTauMonitorL1Algorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 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(ctx, 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(ctx, 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() == "cTAU") {
61 std::vector<std::pair<const xAOD::eFexTauRoI*, const xAOD::jFexTauRoI*>> rois = getL1cTAUs(ctx, info.getL1TauItem());
62
63 std::vector<const xAOD::eFexTauRoI*> eTau_rois;
64 eTau_rois.reserve(rois.size());
65for(const auto& [eTau_roi, jTau_roi] : rois) eTau_rois.push_back(eTau_roi);
66
67 if(m_do_variable_plots) fillL1cTauVars(trigger, rois, xtob_etau_rois);
69 fillL1Efficiencies(ctx, offline_taus_1p, "1P", trigger, eTau_rois);
70 fillL1Efficiencies(ctx, offline_taus_3p, "3P", trigger, eTau_rois);
71 }
72
73 }
74 }
75
76 return StatusCode::SUCCESS;
77}
78
79
80void TrigTauMonitorL1Algorithm::fillL1eTauVars(const std::string& trigger, const std::vector<const xAOD::eFexTauRoI*>& rois, const std::vector<const xAOD::eFexTauRoI*>& xtob_rois) const
81{
82 ATH_MSG_DEBUG("Fill L1 variables: " << trigger);
83
84 auto monGroup = getGroup(trigger+"_L1Vars");
85
86 auto L1RoIEt = Monitored::Collection("L1RoIEt" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->et()/Gaudi::Units::GeV; });
87 auto L1RoIEta = Monitored::Collection("L1RoIEta" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->eta(); });
88 auto L1RoIPhi = Monitored::Collection("L1RoIPhi" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->phi(); });
89 auto L1RoIRCore = Monitored::Collection("L1eFexRoIRCore", rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->rCore(); });
90 auto L1RoIRHad = Monitored::Collection("L1eFexRoIRHad" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->rHad(); });
91 auto L1RoIBDTScore = Monitored::Collection("L1eFexRoIBDTScore" , rois, [this, &xtob_rois](const xAOD::eFexTauRoI* L1roi){ return getBDTScore(L1roi, xtob_rois); });
92 fill(monGroup, L1RoIEt, L1RoIEta, L1RoIPhi, L1RoIRCore, L1RoIRHad, L1RoIBDTScore);
93
94 ATH_MSG_DEBUG("After fill L1 variables: " << trigger);
95}
96
97
98void 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
99{
100 ATH_MSG_DEBUG("Fill L1 variables: " << trigger);
101
102 auto monGroup = getGroup(trigger+"_L1Vars");
103
104 auto L1RoIEt = Monitored::Collection("L1RoIEt" , rois, [](const auto L1roi){ return L1roi.first->et()/Gaudi::Units::GeV; });
105 auto L1RoIEta = Monitored::Collection("L1RoIEta" , rois, [](const auto L1roi){ return L1roi.first->eta(); });
106 auto L1RoIPhi = Monitored::Collection("L1RoIPhi" , rois, [](const auto L1roi){ return L1roi.first->phi(); });
107 auto L1eFexRoIRCore = Monitored::Collection("L1eFexRoIRCore", rois, [](const auto L1roi){ return L1roi.first->rCore(); });
108 auto L1eFexRoIRHad = Monitored::Collection("L1eFexRoIRHad" , rois, [](const auto L1roi){ return L1roi.first->rHad(); });
109 auto L1RoIBDTScore = Monitored::Collection("L1eFexRoIBDTScore" , rois, [this, &xtob_rois](const auto L1roi){ return getBDTScore(L1roi.first, xtob_rois); });
110
111 std::vector<bool> jFex_isMatched;
112 std::vector<float> jFex_eFex_et_ratio;
113 std::vector<float> jFex_isolation;
114 std::vector<float> cTau_isolation;
115 for(const auto& [eFexRoI, jFexRoI] : rois) {
116 if(!jFexRoI) {
117 jFex_isMatched.push_back(false);
118 continue;
119 }
120
121 jFex_isMatched.push_back(true);
122 jFex_eFex_et_ratio.push_back(jFexRoI->et()/eFexRoI->et());
123 jFex_isolation.push_back(jFexRoI->iso()/Gaudi::Units::GeV);
124 cTau_isolation.push_back(jFexRoI->iso()/eFexRoI->et());
125 }
126 auto L1cTauRoITopoMatch = Monitored::Collection("L1cTauRoITopoMatch" , jFex_isMatched);
127 auto L1jFexRoIIso = Monitored::Collection("L1jFexRoIIso" , jFex_isolation);
128 auto L1cTauRoIIso = Monitored::Collection("L1cTauMatchedRoIIso" , cTau_isolation);
129 auto L1RoIcTauEtRatio = Monitored::Collection("L1RoIcTauMatchedEtRatio", jFex_eFex_et_ratio);
130
131 fill(monGroup, L1RoIEt, L1RoIEta, L1RoIPhi, L1eFexRoIRCore, L1eFexRoIRHad, L1cTauRoITopoMatch, L1jFexRoIIso, L1cTauRoIIso, L1RoIcTauEtRatio, L1RoIBDTScore );
132
133 ATH_MSG_DEBUG("After fill L1 variables: " << trigger);
134}
135
136std::vector<const xAOD::eFexTauRoI*> TrigTauMonitorL1Algorithm::getL1xTOBeTAUs() const
137{
138 std::vector<const xAOD::eFexTauRoI*> roi_vec;
139
140 if(m_phase1l1eTauxRoIKey.empty()) return roi_vec;
141
143 if(!rois.isValid()) {
144 ATH_MSG_WARNING("The L1_eTauxRoI container is not available! No e/cTAU BDT score will be retrieved");
145 return roi_vec;
146 }
147
148 for(const xAOD::eFexTauRoI* roi : *rois) roi_vec.push_back(roi);
149 return roi_vec;
150}
151
152unsigned int TrigTauMonitorL1Algorithm::getBDTScore(const xAOD::eFexTauRoI* roi, const std::vector<const xAOD::eFexTauRoI*>& xtob_rois) const
153{
154 if(xtob_rois.empty()) return 0;
155
156 for(const xAOD::eFexTauRoI* xroi : xtob_rois) {
157 if(xroi->eta() == roi->eta() && xroi->phi() == roi->phi()) return xroi->bdtScore();
158 }
159 ATH_MSG_DEBUG("Unmatched RoI! et=" << roi->et() << ", eta=" << roi->eta() << ", phi=" << roi->phi());
160 for(const xAOD::eFexTauRoI* xroi : xtob_rois) {
161 ATH_MSG_DEBUG(" - xRoI et=" << xroi->et() << ", eta=" << xroi->eta() << ", phi=" << xroi->phi());
162 }
163 return 0;
164}
165
#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.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
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
std::pair< std::vector< const xAOD::TauJet * >, std::vector< const xAOD::TauJet * > > classifyOfflineTaus(const EventContext &ctx, const std::vector< const xAOD::TauJet * > &taus, const float threshold=0.0, const TauID tau_id=TauID::None) const
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::TauJet * > classifyTausAll(const EventContext &ctx, const std::vector< const xAOD::TauJet * > &taus, const float threshold=0.0, const TauID tau_id=TauID::None) const
std::vector< std::pair< const xAOD::eFexTauRoI *, const xAOD::jFexTauRoI * > > getL1cTAUs(const EventContext &ctx, const std::string &l1_item) const
Gaudi::Property< bool > m_do_variable_plots
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
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.
eFexTauRoI_v1 eFexTauRoI
Define the latest version of the eFexTauRoI class.
Definition eFexTauRoI.h:16