ATLAS Offline Software
Loading...
Searching...
No Matches
TrigTauMonitorBaseAlgorithm.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
8
11
12TrigTauMonitorBaseAlgorithm::TrigTauMonitorBaseAlgorithm(const std::string& name, ISvcLocator* pSvcLocator)
13 : AthMonitorAlgorithm(name, pSvcLocator)
14{}
15
16
19 ATH_CHECK( m_trigDecTool.retrieve() );
20 ATH_CHECK( m_eventInfoDecorKey.initialize() );
21
22 ATH_CHECK( m_offlineTauJetKey.initialize() );
24 ATH_CHECK( m_offlineGNTauDecorKey.initialize() );
25
26 if(m_L1_select_by_et_only) ATH_MSG_INFO("L1 RoI selection by Et cut only! No isolated L1 tau items are allowed!");
27 ATH_CHECK( m_phase1l1eTauRoIKey.initialize() );
29 ATH_CHECK( m_phase1l1jTauRoIKey.initialize() );
31 ATH_CHECK( m_phase1l1cTauRoIKey.initialize() );
34
35 ATH_CHECK( m_hltTauJetKey.initialize() );
36 ATH_CHECK( m_hltTauJetLLPKey.initialize() );
37 ATH_CHECK( m_hltTauJetLRTKey.initialize() );
39
40 // Parse TauTrigInfo objects
41 for(const std::string& trigger : m_triggers) {
44
45 if(m_trigInfo[trigger].areAnyL1TauIsolated()) {
46 ATH_MSG_FATAL("Cannot use isolated L1 tau items if running with SelectL1ByETOnly = True: " << trigger);
47 return StatusCode::FAILURE;
48 }
49 } else {
51 }
52 }
53
54 return StatusCode::SUCCESS;
55}
56
57std::vector<const xAOD::TauJet*> TrigTauMonitorBaseAlgorithm::getOnlineTausAll(const std::string& trigger, bool include_0P) const
58{
59 std::vector<const xAOD::TauJet*> tau_vec;
60
61
62 const TrigTauInfo& info = getTrigInfo(trigger);
63 const std::string tau_container_name = getOnlineContainerKey(info.getHLTTauType()).key();
64 ATH_MSG_DEBUG("Tau container name is: " << tau_container_name);
65 auto vec = m_trigDecTool->features<xAOD::TauJetContainer>(trigger, TrigDefs::Physics, tau_container_name);
66 for(auto& featLinkInfo : vec) {
67 const xAOD::TauJet* feat = *(featLinkInfo.link);
68 if(!feat) continue;
69
70 int nTracks = -1;
72 ATH_MSG_DEBUG("NTracks Online: " << nTracks);
73
74 if(include_0P && nTracks == 0) tau_vec.push_back(feat);
75 else tau_vec.push_back(feat);
76 }
77
78 return tau_vec;
79}
80
81std::tuple<std::vector<const xAOD::TauJet*>, std::vector<const xAOD::TauJet*>, std::vector<const xAOD::TauJet*>> TrigTauMonitorBaseAlgorithm::getOnlineTaus(const std::string& trigger) const
82{
83 return classifyOnlineTaus(getOnlineTausAll(trigger, true), 0.0);
84}
85
86
87std::vector<const xAOD::TauJet*> TrigTauMonitorBaseAlgorithm::getOfflineTausAll(const EventContext& ctx, const float threshold) const
88{
89 ATH_MSG_DEBUG("Retrieving offline Taus");
90
91 std::vector<const xAOD::TauJet*> tau_vec;
92
94 if(!taus.isValid()) {
95 ATH_MSG_WARNING("Failed to retrieve offline Taus");
96 return tau_vec;
97 }
98
99 for(const xAOD::TauJet* const tau : *taus) {
100 // Consider only offline taus with a certain minimum pT
101 if(tau->pt() < threshold*Gaudi::Units::GeV) continue;
102
103 // Consider only offline taus outside of the crack region
104 if(std::abs(tau->eta()) > 1.37 && std::abs(tau->eta()) < 1.52) continue;
105
106 // Consider only offline taus which pass RNN medium WP
107 if(!tau->isTau(xAOD::TauJetParameters::JetRNNSigMedium)) continue;
108
109 // Consider only offline taus which pass thinning
110 static const SG::ConstAccessor<char> passThinningAcc("passThinning");
111 if(!passThinningAcc.withDefault(*tau, true)) continue;
112
113 int nTracks = -1;
114 tau->detail(xAOD::TauJetParameters::nChargedTracks, nTracks);
115 ATH_MSG_DEBUG("NTracks Offline: " << nTracks);
116 if(nTracks == 1 || nTracks == 3) tau_vec.push_back(tau);
117 }
118
119 return tau_vec;
120}
121
122
123std::pair<std::vector<const xAOD::TauJet*>, std::vector<const xAOD::TauJet*>> TrigTauMonitorBaseAlgorithm::getOfflineTaus(const EventContext& ctx, const float threshold, const TauID tau_id) const
124{
126}
127
128
129std::vector<const xAOD::eFexTauRoI*> TrigTauMonitorBaseAlgorithm::getL1eTAUs(const EventContext& ctx, const std::string& l1_item) const
130{
131 std::vector<const xAOD::eFexTauRoI*> roi_vec;
132
134 if(!rois.isValid()) {
135 ATH_MSG_WARNING("Failed to retrieve the L1_eTauRoi container");
136 return roi_vec;
137 }
138
140 for(const xAOD::eFexTauRoI* roi : *rois) {
141 // Select by RoI ET value only
142 if(roi->et() > m_L1_Phase1_thresholds.value().at(l1_item)) roi_vec.push_back(roi);
143 }
144 } else {
146 if(!thresholdPatterns.isValid()) {
147 ATH_MSG_WARNING("Failed to create thresholdPatterns property accessor for the L1_eTauRoi container");
148 return roi_vec;
149 }
150
151 for(const xAOD::eFexTauRoI* roi : *rois) {
152 // Check that the RoI passed the threshold selection
153 if(thresholdPatterns(*roi) & m_L1_Phase1_threshold_patterns.value().at(l1_item)) roi_vec.push_back(roi);
154 }
155 }
156
157 return roi_vec;
158}
159
160
161std::vector<const xAOD::jFexTauRoI*> TrigTauMonitorBaseAlgorithm::getL1jTAUs(const EventContext& ctx, const std::string& l1_item) const
162{
163 std::vector<const xAOD::jFexTauRoI*> roi_vec;
164
166 if(!rois.isValid()) {
167 ATH_MSG_WARNING("Failed to retrieve the L1_jTauRoi container");
168 return roi_vec;
169 }
170
172 for(const xAOD::jFexTauRoI* roi : *rois) {
173 // Select by RoI ET value only
174 if(roi->et() > m_L1_Phase1_thresholds.value().at(l1_item)) roi_vec.push_back(roi);
175 }
176 } else {
178 if(!thresholdPatterns.isValid()) {
179 ATH_MSG_WARNING("Failed to create thresholdPatterns property accessor for the L1_jTauRoi container");
180 return roi_vec;
181 }
182
183 for(const xAOD::jFexTauRoI* roi : *rois) {
184 // Check that the RoI passed the threshold selection
185 if(thresholdPatterns(*roi) & m_L1_Phase1_threshold_patterns.value().at(l1_item)) roi_vec.push_back(roi);
186 }
187 }
188
189 return roi_vec;
190}
191
192
193std::vector<std::pair<const xAOD::eFexTauRoI*, const xAOD::jFexTauRoI*>> TrigTauMonitorBaseAlgorithm::getL1cTAUs(const EventContext& ctx, const std::string& l1_item) const
194{
195 std::vector<std::pair<const xAOD::eFexTauRoI*, const xAOD::jFexTauRoI*>> roi_vec;
196
198 if(!rois.isValid()) {
199 ATH_MSG_WARNING("Failed to retrieve the L1_cTauRoi container");
200 return roi_vec;
201 }
203 if(!jTau_roi_link.isValid()) {
204 ATH_MSG_WARNING("Failed to create jTauLink accessor for the L1_cTauRoi container");
205 return roi_vec;
206 }
207
209 for(size_t i = 0; i < rois->size(); i++) {
210 const xAOD::eFexTauRoI* roi = (*rois)[i];
211 const xAOD::jFexTauRoI* jTau_roi = jTau_roi_link(i).isValid() ? *jTau_roi_link(i) : nullptr;
212
213 // Select by RoI ET value only
214 if(roi->et() > m_L1_Phase1_thresholds.value().at(l1_item)) roi_vec.push_back(std::make_pair(roi, jTau_roi));
215 }
216 } else {
218 if(!thresholdPatterns.isValid()) {
219 ATH_MSG_WARNING("Failed to create thresholdPatterns property accessor for the L1_cTauRoi container");
220 return roi_vec;
221 }
222
223 for(size_t i = 0; i < rois->size(); i++) {
224 const xAOD::eFexTauRoI* roi = (*rois)[i];
225 const xAOD::jFexTauRoI* jTau_roi = jTau_roi_link(i).isValid() ? *jTau_roi_link(i) : nullptr;
226
227 // Check that the RoI passed the threshold selection
228 if(thresholdPatterns(*roi) & m_L1_Phase1_threshold_patterns.value().at(l1_item)) roi_vec.push_back(std::make_pair(roi, jTau_roi));
229 }
230 }
231
232
233 return roi_vec;
234}
235
236
238{
239 if(sequence == "tracktwoMVA" || sequence == "tracktwoMVABDT") return m_hltTauJetKey;
240 else if(sequence == "tracktwoLLP") return m_hltTauJetLLPKey;
241 else if(sequence == "trackLRT") return m_hltTauJetLRTKey;
242 else if(sequence == "ptonly") return m_hltTauJetCaloMVAOnlyKey;
243 else {
244 ATH_MSG_ERROR("Unknown HLT TauJet container for sequence \"" << sequence << "\". Returning the default \"" << m_hltTauJetKey.key() << "\"");
245 return m_hltTauJetKey;
246 }
247}
248
249
250StatusCode TrigTauMonitorBaseAlgorithm::fillHistograms(const EventContext& ctx) const
251{
252 ATH_MSG_DEBUG("Executing Monitoring algorithm");
253
254 // Protect against truncated events
255 // Since this happens very rarely, it won't bias the L1 distributions and efficiencies
256 if(m_trigDecTool->ExperimentalAndExpertMethods().isHLTTruncated()){
257 ATH_MSG_WARNING("HLTResult truncated, skip trigger analysis");
258 return StatusCode::SUCCESS;
259 }
260
261 // Protect against LAr noise bursts and other detector errors
263 ATH_CHECK(eventInfo.isValid());
264 if (eventInfo->errorState(xAOD::EventInfo::LAr) == xAOD::EventInfo::Error
265 || eventInfo->errorState(xAOD::EventInfo::Tile) == xAOD::EventInfo::Error
266 || eventInfo->errorState(xAOD::EventInfo::SCT) == xAOD::EventInfo::Error
267 || eventInfo->isEventFlagBitSet(xAOD::EventInfo::Core, 18)) {
268 return StatusCode::SUCCESS;
269 }
270
272
273 return StatusCode::SUCCESS;
274}
275
276
277std::vector<const xAOD::TauJet*> TrigTauMonitorBaseAlgorithm::classifyTausAll(const std::vector<const xAOD::TauJet*>& taus, const float threshold, const TauID tau_id) const
278{
279 std::vector<const xAOD::TauJet*> tau_vec;
280
281 SG::ReadDecorHandle<xAOD::TauJetContainer, char> tauid_medium{m_offlineGNTauDecorKey, Gaudi::Hive::currentContext()};
282 if(!tauid_medium.isValid()) {
283 ATH_MSG_WARNING("Cannot retrieve " << tauid_medium.key());
284 return tau_vec;
285 }
286
287 for(const xAOD::TauJet* tau : taus) {
288 if(tau->pt() < threshold*Gaudi::Units::GeV) continue;
289
290 // Consider only offline taus which pass medium ID WP
291 if(tau_id == TauID::RNN) {
292 if(!tau->isTau(xAOD::TauJetParameters::JetRNNSigMedium)) continue;
293 }
294 else if(tau_id == TauID::GNTau) {
295 if(!tauid_medium(*tau)) continue;
296 }
297
298 tau_vec.push_back(tau);
299 }
300
301 return tau_vec;
302}
303
304
305std::tuple<std::vector<const xAOD::TauJet*>, std::vector<const xAOD::TauJet*>, std::vector<const xAOD::TauJet*>> TrigTauMonitorBaseAlgorithm::classifyOnlineTaus(const std::vector<const xAOD::TauJet*>& taus, const float threshold) const
306{
307 std::vector<const xAOD::TauJet*> tau_vec_0p, tau_vec_1p, tau_vec_mp;
308
310 int nTracks = -1;
311 tau->detail(xAOD::TauJetParameters::nChargedTracks, nTracks);
312
313 if(nTracks == 0) tau_vec_0p.push_back(tau);
314 else if(nTracks == 1) tau_vec_1p.push_back(tau);
315 else tau_vec_mp.push_back(tau);
316 }
317
318 return {tau_vec_0p, tau_vec_1p, tau_vec_mp};
319}
320
321
322std::pair<std::vector<const xAOD::TauJet*>, std::vector<const xAOD::TauJet*>> TrigTauMonitorBaseAlgorithm::classifyOfflineTaus(const std::vector<const xAOD::TauJet*>& taus, const float threshold, const TauID tau_id) const
323{
324 std::vector<const xAOD::TauJet*> tau_vec_1p, tau_vec_3p;
325
326 for(const xAOD::TauJet* const tau : classifyTausAll(taus, threshold, tau_id)) {
327 int nTracks = -1;
328 tau->detail(xAOD::TauJetParameters::nChargedTracks, nTracks);
329
330 if(nTracks == 1) tau_vec_1p.push_back(tau);
331 else if(nTracks == 3) tau_vec_3p.push_back(tau);
332 }
333
334 return {tau_vec_1p, tau_vec_3p};
335}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
std::vector< size_t > vec
static Double_t taus
Handle class for reading a decoration on an object.
virtual StatusCode initialize() override
initialize
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.)
PublicToolHandle< Trig::TrigDecisionTool > m_trigDecTool
Tool to tell whether a specific trigger is passed.
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Helper class to provide constant type-safe access to aux data.
const_reference_type withDefault(const ELT &e, const T &deflt) const
Fetch the variable for one element, as a const reference, with a default.
Handle class for reading a decoration on an object.
Property holding a SG store/key/clid from which a ReadHandle is made.
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
const SG::ReadHandleKey< xAOD::TauJetContainer > & getOnlineContainerKey(const std::string &sequence) const
Gaudi::Property< std::map< std::string, float > > m_L1_Phase1_thresholds
SG::ReadHandleKey< xAOD::jFexTauRoIContainer > m_phase1l1jTauRoIKey
SG::ReadDecorHandleKey< xAOD::eFexTauRoIContainer > m_phase1l1cTauRoIDecorKey
virtual StatusCode initialize() override
initialize
SG::ReadHandleKey< xAOD::TauJetContainer > m_hltTauJetKey
std::map< std::string, TrigTauInfo > m_trigInfo
TrigTauMonitorBaseAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< const xAOD::TauJet * > getOfflineTausAll(const EventContext &ctx, const float threshold=20.0) const
std::pair< std::vector< const xAOD::TauJet * >, std::vector< const xAOD::TauJet * > > getOfflineTaus(const EventContext &ctx, const float threshold=20.0, const TauID tau_id=TauID::None) const
Gaudi::Property< std::vector< std::string > > m_triggers
SG::ReadDecorHandleKey< xAOD::eFexTauRoIContainer > m_phase1l1cTauRoIThresholdPatternsKey
SG::ReadHandleKey< xAOD::eFexTauRoIContainer > m_phase1l1eTauRoIKey
SG::ReadDecorHandleKey< xAOD::jFexTauRoIContainer > m_phase1l1jTauRoIThresholdPatternsKey
SG::ReadHandleKey< xAOD::TauJetContainer > m_hltTauJetLLPKey
const TrigTauInfo & getTrigInfo(const std::string &trigger) const
virtual StatusCode processEvent(const EventContext &ctx) const =0
SG::ReadHandleKey< xAOD::TauJetContainer > m_hltTauJetCaloMVAOnlyKey
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
SG::ReadDecorHandleKey< xAOD::eFexTauRoIContainer > m_phase1l1eTauRoIThresholdPatternsKey
Gaudi::Property< bool > m_L1_select_by_et_only
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_offlineGNTauDecorKey
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
SG::ReadHandleKey< xAOD::eFexTauRoIContainer > m_phase1l1cTauRoIKey
SG::ReadHandleKey< xAOD::TauJetContainer > m_hltTauJetLRTKey
std::tuple< std::vector< const xAOD::TauJet * >, std::vector< const xAOD::TauJet * >, std::vector< const xAOD::TauJet * > > getOnlineTaus(const std::string &trigger) 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< std::map< std::string, uint64_t > > m_L1_Phase1_threshold_patterns
SG::ReadDecorHandleKey< xAOD::EventInfo > m_eventInfoDecorKey
SG::ReadHandleKey< xAOD::TauJetContainer > m_offlineTauJetKey
std::tuple< std::vector< const xAOD::TauJet * >, std::vector< const xAOD::TauJet * >, std::vector< const xAOD::TauJet * > > classifyOnlineTaus(const std::vector< const xAOD::TauJet * > &taus, const float threshold=0.0) const
std::vector< const xAOD::TauJet * > getOnlineTausAll(const std::string &trigger, bool include_0P=true) const
@ Tile
The Tile calorimeter.
@ Core
Core flags describing the event.
@ LAr
The LAr calorimeter.
@ Error
The sub-detector issued an error.
bool detail(TauJetParameters::Detail detail, int &value) const
Get and set values of common details variables via enum.
float et() const
TOB ET (decoded from TOB, stored for convenience)
TauJet_v3 TauJet
Definition of the current "tau version".
jFexTauRoI_v1 jFexTauRoI
Define the latest version of the jFexSRJetRoI class.
Definition jFexTauRoI.h:13
TauJetContainer_v3 TauJetContainer
Definition of the current "taujet container version".
eFexTauRoI_v1 eFexTauRoI
Define the latest version of the eFexTauRoI class.
Definition eFexTauRoI.h:16