ATLAS Offline Software
TrigTauMonitorL1Algorithm.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 
8 TrigTauMonitorL1Algorithm::TrigTauMonitorL1Algorithm(const std::string& name, ISvcLocator* pSvcLocator)
9  : TrigTauMonitorBaseAlgorithm(name, pSvcLocator)
10 {}
11 
12 
14 {
16 
18 
19  return StatusCode::SUCCESS;
20 }
21 
23 {
24  constexpr float threshold_offset = 10.0;
25 
26  // Offline taus
27  auto offline_taus_all = getOfflineTausAll(ctx, 0.0);
28 
29  if(m_requireOfflineTaus && offline_taus_all.empty()) return StatusCode::SUCCESS;
30 
31  // xTOB-based eTAU RoIs
32  // If the container is not in SG, it'll return an empty vector
33  const std::vector<const xAOD::eFexTauRoI*> xtob_etau_rois = getL1xTOBeTAUs();
34 
35  for(const std::string& trigger : m_triggers) {
37 
38  if(!info.isL1TauOnly()) {
39  ATH_MSG_WARNING("Chain \"" << trigger << "\" is not an L1 tau trigger. Skipping...");
40  continue;
41  }
42 
43  // Filter offline taus
44  auto offline_taus = classifyOfflineTaus(offline_taus_all, info.getL1TauThreshold() - threshold_offset);
45  std::vector<const xAOD::TauJet*> offline_taus_1p = offline_taus.first;
46  std::vector<const xAOD::TauJet*> offline_taus_3p = offline_taus.second;
47 
48  if(info.getL1TauType() == "eTAU") {
49  std::vector<const xAOD::eFexTauRoI*> rois = getL1eTAUs(ctx, info.getL1TauItem());
50 
51  if(m_do_variable_plots) fillL1eTauVars(trigger, rois, xtob_etau_rois);
53  fillL1Efficiencies(ctx, offline_taus_1p, "1P", trigger, rois);
54  fillL1Efficiencies(ctx, offline_taus_3p, "3P", trigger, rois);
55  }
56 
57  } else if(info.getL1TauType() == "jTAU") {
58  std::vector<const xAOD::jFexTauRoI*> rois = getL1jTAUs(ctx, info.getL1TauItem());
59 
62  fillL1Efficiencies(ctx, offline_taus_1p, "1P", trigger, rois);
63  fillL1Efficiencies(ctx, offline_taus_3p, "3P", trigger, rois);
64  }
65 
66  } else if(info.getL1TauType() == "cTAU") {
67  std::vector<std::pair<const xAOD::eFexTauRoI*, const xAOD::jFexTauRoI*>> rois = getL1cTAUs(ctx, info.getL1TauItem());
68 
69  std::vector<const xAOD::eFexTauRoI*> eTau_rois;
70  eTau_rois.reserve(rois.size());
71 for(const auto& [eTau_roi, jTau_roi] : rois) eTau_rois.push_back(eTau_roi);
72 
73  if(m_do_variable_plots) fillL1cTauVars(trigger, rois, xtob_etau_rois);
75  fillL1Efficiencies(ctx, offline_taus_1p, "1P", trigger, eTau_rois);
76  fillL1Efficiencies(ctx, offline_taus_3p, "3P", trigger, eTau_rois);
77  }
78 
79  } else { // Legacy
80  std::vector<const xAOD::EmTauRoI*> rois = getL1LegacyTAUs(ctx, info.getL1TauItem());
81 
84  fillL1Efficiencies(ctx, offline_taus_1p, "1P", trigger, rois);
85  fillL1Efficiencies(ctx, offline_taus_3p, "3P", trigger, rois);
86  }
87  }
88  }
89 
90  return StatusCode::SUCCESS;
91 }
92 
93 
94 void TrigTauMonitorL1Algorithm::fillL1eTauVars(const std::string& trigger, const std::vector<const xAOD::eFexTauRoI*>& rois, const std::vector<const xAOD::eFexTauRoI*>& xtob_rois) const
95 {
96  ATH_MSG_DEBUG("Fill L1 variables: " << trigger);
97 
98  auto monGroup = getGroup(trigger+"_L1Vars");
99 
100  auto L1RoIEt = Monitored::Collection("L1RoIEt" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->et()/Gaudi::Units::GeV; });
101  auto L1RoIEta = Monitored::Collection("L1RoIEta" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->eta(); });
102  auto L1RoIPhi = Monitored::Collection("L1RoIPhi" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->phi(); });
103  auto L1RoIRCore = Monitored::Collection("L1eFexRoIRCore", rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->rCore(); });
104  auto L1RoIRHad = Monitored::Collection("L1eFexRoIRHad" , rois, [](const xAOD::eFexTauRoI* L1roi){ return L1roi->rHad(); });
105  auto L1RoIBDTScore = Monitored::Collection("L1eFexRoIBDTScore" , rois, [this, &xtob_rois](const xAOD::eFexTauRoI* L1roi){ return getBDTScore(L1roi, xtob_rois); });
106  fill(monGroup, L1RoIEt, L1RoIEta, L1RoIPhi, L1RoIRCore, L1RoIRHad, L1RoIBDTScore);
107 
108  ATH_MSG_DEBUG("After fill L1 variables: " << trigger);
109 }
110 
111 
112 void TrigTauMonitorL1Algorithm::fillL1jTauVars(const std::string& trigger, const std::vector<const xAOD::jFexTauRoI*>& rois) const
113 {
114  ATH_MSG_DEBUG("Fill L1 variables: " << trigger);
115 
116  auto monGroup = getGroup(trigger+"_L1Vars");
117 
118  auto L1RoIEt = Monitored::Collection("L1RoIEt" , rois, [](const xAOD::jFexTauRoI* L1roi){ return L1roi->et()/Gaudi::Units::GeV; });
119  auto L1RoIEta = Monitored::Collection("L1RoIEta" , rois, [](const xAOD::jFexTauRoI* L1roi){ return L1roi->eta(); });
120  auto L1RoIPhi = Monitored::Collection("L1RoIPhi" , rois, [](const xAOD::jFexTauRoI* L1roi){ return L1roi->phi(); });
121  auto L1jFexRoIIso = Monitored::Collection("L1jFexRoIIso", rois, [](const xAOD::jFexTauRoI* L1roi){ return L1roi->iso()/Gaudi::Units::GeV; });
122 
123  fill(monGroup, L1RoIEt, L1RoIEta, L1RoIPhi, L1jFexRoIIso);
124 
125  ATH_MSG_DEBUG("After fill L1 variables: " << trigger);
126 }
127 
128 
129 
130 void 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
131 {
132  ATH_MSG_DEBUG("Fill L1 variables: " << trigger);
133 
134  auto monGroup = getGroup(trigger+"_L1Vars");
135 
136  auto L1RoIEt = Monitored::Collection("L1RoIEt" , rois, [](const auto L1roi){ return L1roi.first->et()/Gaudi::Units::GeV; });
137  auto L1RoIEta = Monitored::Collection("L1RoIEta" , rois, [](const auto L1roi){ return L1roi.first->eta(); });
138  auto L1RoIPhi = Monitored::Collection("L1RoIPhi" , rois, [](const auto L1roi){ return L1roi.first->phi(); });
139  auto L1eFexRoIRCore = Monitored::Collection("L1eFexRoIRCore", rois, [](const auto L1roi){ return L1roi.first->rCore(); });
140  auto L1eFexRoIRHad = Monitored::Collection("L1eFexRoIRHad" , rois, [](const auto L1roi){ return L1roi.first->rHad(); });
141  auto L1RoIBDTScore = Monitored::Collection("L1eFexRoIBDTScore" , rois, [this, &xtob_rois](const auto L1roi){ return getBDTScore(L1roi.first, xtob_rois); });
142 
143  std::vector<bool> jFex_isMatched;
144  std::vector<float> jFex_eFex_et_ratio;
145  std::vector<float> jFex_isolation;
146  std::vector<float> cTau_isolation;
147  for(const auto& [eFexRoI, jFexRoI] : rois) {
148  if(!jFexRoI) {
149  jFex_isMatched.push_back(false);
150  continue;
151  }
152 
153  jFex_isMatched.push_back(true);
154  jFex_eFex_et_ratio.push_back(jFexRoI->et()/eFexRoI->et());
155  jFex_isolation.push_back(jFexRoI->iso()/Gaudi::Units::GeV);
156  cTau_isolation.push_back(jFexRoI->iso()/eFexRoI->et());
157  }
158  auto L1cTauRoITopoMatch = Monitored::Collection("L1cTauRoITopoMatch" , jFex_isMatched);
159  auto L1jFexRoIIso = Monitored::Collection("L1jFexRoIIso" , jFex_isolation);
160  auto L1cTauRoIIso = Monitored::Collection("L1cTauMatchedRoIIso" , cTau_isolation);
161  auto L1RoIcTauEtRatio = Monitored::Collection("L1RoIcTauMatchedEtRatio", jFex_eFex_et_ratio);
162 
163  fill(monGroup, L1RoIEt, L1RoIEta, L1RoIPhi, L1eFexRoIRCore, L1eFexRoIRHad, L1cTauRoITopoMatch, L1jFexRoIIso, L1cTauRoIIso, L1RoIcTauEtRatio, L1RoIBDTScore );
164 
165  ATH_MSG_DEBUG("After fill L1 variables: " << trigger);
166 }
167 
168 
169 void TrigTauMonitorL1Algorithm::fillL1LegacyVars(const std::string& trigger, const std::vector<const xAOD::EmTauRoI*>& rois) const
170 {
171  ATH_MSG_DEBUG("Fill L1 variables: " << trigger);
172 
173  auto monGroup = getGroup(trigger+"_L1Vars");
174 
175  auto L1RoIEt = Monitored::Collection("L1RoIEt" , rois, [](const xAOD::EmTauRoI* L1roi){ return L1roi->eT()/Gaudi::Units::GeV; });
176  auto L1RoIEta = Monitored::Collection("L1RoIEta" , rois, [](const xAOD::EmTauRoI* L1roi){ return L1roi->eta(); });
177  auto L1RoIPhi = Monitored::Collection("L1RoIPhi" , rois, [](const xAOD::EmTauRoI* L1roi){ return L1roi->phi(); });
178  auto L1RoITauClus = Monitored::Collection("L1RoITauClus", rois, [](const xAOD::EmTauRoI* L1roi){ return L1roi->tauClus()/Gaudi::Units::GeV; });
179  auto L1RoIEMIsol = Monitored::Collection("L1RoIEMIsol" , rois, [](const xAOD::EmTauRoI* L1roi){ return L1roi->emIsol()/Gaudi::Units::GeV; });
180  auto L1RoIHadCore = Monitored::Collection("L1RoIHadCore", rois, [](const xAOD::EmTauRoI* L1roi){ return L1roi->hadCore()/Gaudi::Units::GeV; });
181  auto L1RoIHadIsol = Monitored::Collection("L1RoIHadIsol", rois, [](const xAOD::EmTauRoI* L1roi){ return L1roi->hadIsol()/Gaudi::Units::GeV; });
182 
183  fill(monGroup, L1RoIEt, L1RoIEta, L1RoIPhi, L1RoITauClus, L1RoIEMIsol, L1RoIHadCore, L1RoIHadIsol);
184 
185  ATH_MSG_DEBUG("After fill L1 variables: " << trigger);
186 }
187 
188 
189 std::vector<const xAOD::eFexTauRoI*> TrigTauMonitorL1Algorithm::getL1xTOBeTAUs() const
190 {
191  std::vector<const xAOD::eFexTauRoI*> roi_vec;
192 
193  if(m_phase1l1eTauxRoIKey.empty()) return roi_vec;
194 
196  if(!rois.isValid()) {
197  ATH_MSG_WARNING("The L1_eTauxRoI container is not available! No e/cTAU BDT score will be retrieved");
198  return roi_vec;
199  }
200 
201  for(const xAOD::eFexTauRoI* roi : *rois) roi_vec.push_back(roi);
202  return roi_vec;
203 }
204 
205 unsigned int TrigTauMonitorL1Algorithm::getBDTScore(const xAOD::eFexTauRoI* roi, const std::vector<const xAOD::eFexTauRoI*>& xtob_rois) const
206 {
207  if(xtob_rois.empty()) return 0;
208 
209  for(const xAOD::eFexTauRoI* xroi : xtob_rois) {
210  if(xroi->eta() == roi->eta() && xroi->phi() == roi->phi()) return xroi->bdtScore();
211  }
212  ATH_MSG_DEBUG("Unmatched RoI! et=" << roi->et() << ", eta=" << roi->eta() << ", phi=" << roi->phi());
213  for(const xAOD::eFexTauRoI* xroi : xtob_rois) {
214  ATH_MSG_DEBUG(" - xRoI et=" << xroi->et() << ", eta=" << xroi->eta() << ", phi=" << xroi->phi());
215  }
216  return 0;
217 }
218 
grepfile.info
info
Definition: grepfile.py:38
xAOD::jFexTauRoI_v1
Class describing properties of a LVL1 jFEX global Trigger Object (TOB) in the xAOD format.
Definition: jFexTauRoI_v1.h:22
python.TIDAMonTool.monGroup
def monGroup(analysis_chain)
Definition: TIDAMonTool.py:295
xAOD::eFexTauRoI_v1::et
float et() const
TOB ET (decoded from TOB, stored for convenience)
xAOD::EmTauRoI_v2::phi
float phi() const
The azimuthal angle ( ) of the em/tau candidate.
xAOD::jFexTauRoI_v1::eta
float eta() const
TrigTauMonitorL1Algorithm.h
xAOD::eFexTauRoI_v1::eta
float eta() const
setter for the above
TrigTauMonitorBaseAlgorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: TrigTauMonitorBaseAlgorithm.cxx:16
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
TrigTauMonitorL1Algorithm::getL1xTOBeTAUs
std::vector< const xAOD::eFexTauRoI * > getL1xTOBeTAUs() const
Definition: TrigTauMonitorL1Algorithm.cxx:189
TrigTauMonitorL1Algorithm::fillL1LegacyVars
void fillL1LegacyVars(const std::string &trigger, const std::vector< const xAOD::EmTauRoI * > &rois) const
Definition: TrigTauMonitorL1Algorithm.cxx:169
TrigTauMonitorBaseAlgorithm::getL1cTAUs
std::vector< std::pair< const xAOD::eFexTauRoI *, const xAOD::jFexTauRoI * > > getL1cTAUs(const EventContext &ctx, const std::string &l1_item) const
Definition: TrigTauMonitorBaseAlgorithm.cxx:189
xAOD::eFexTauRoI_v1::rCore
float rCore() const
Jet Discriminants Derived floating point values (not used in actual algorithm)
Definition: eFexTauRoI_v1.cxx:232
TrigTauMonitorL1Algorithm::getBDTScore
unsigned int getBDTScore(const xAOD::eFexTauRoI *roi, const std::vector< const xAOD::eFexTauRoI * > &xtob_rois) const
Definition: TrigTauMonitorL1Algorithm.cxx:205
TrigTauMonitorBaseAlgorithm::getL1eTAUs
std::vector< const xAOD::eFexTauRoI * > getL1eTAUs(const EventContext &ctx, const std::string &l1_item) const
Definition: TrigTauMonitorBaseAlgorithm.cxx:125
xAOD::jFexTauRoI_v1::et
unsigned int et() const
Methods that require combining results or applying scales.
Definition: jFexTauRoI_v1.cxx:114
TrigTauMonitorBaseAlgorithm::m_do_variable_plots
Gaudi::Property< bool > m_do_variable_plots
Definition: TrigTauMonitorBaseAlgorithm.h:41
Monitored::Collection
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
Definition: MonitoredCollection.h:38
TrigTauMonitorBaseAlgorithm::classifyOfflineTaus
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
Definition: TrigTauMonitorBaseAlgorithm.cxx:336
TrigTauMonitorL1Algorithm::TrigTauMonitorL1Algorithm
TrigTauMonitorL1Algorithm(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TrigTauMonitorL1Algorithm.cxx:8
xAOD::EmTauRoI_v2
Class describing a LVL1 em/tau region of interest.
Definition: EmTauRoI_v2.h:35
xAOD::eFexTauRoI_v1
Class describing a LVL1 eFEX tau region of interest.
Definition: eFexTauRoI_v1.h:29
xAOD::EmTauRoI_v2::emIsol
float emIsol() const
The EM calorimeter isolation (outer ring of EM towers)
TrigTauMonitorL1Algorithm::fillL1eTauVars
void fillL1eTauVars(const std::string &trigger, const std::vector< const xAOD::eFexTauRoI * > &rois, const std::vector< const xAOD::eFexTauRoI * > &xtob_rois) const
Definition: TrigTauMonitorL1Algorithm.cxx:94
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
xAOD::EmTauRoI_v2::hadCore
float hadCore() const
The ET deposited in the inner hadronic isolation region (2x2 core)
xAOD::eFexTauRoI_v1::rHad
float rHad() const
Definition: eFexTauRoI_v1.cxx:237
TrigTauMonitorL1Algorithm::processEvent
virtual StatusCode processEvent(const EventContext &ctx) const override
Definition: TrigTauMonitorL1Algorithm.cxx:22
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::jFexTauRoI_v1::phi
float phi() const
AthMonitorAlgorithm::fill
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.
TrigTauMonitorL1Algorithm::fillL1cTauVars
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
Definition: TrigTauMonitorL1Algorithm.cxx:130
TrigTauMonitorL1Algorithm::fillL1Efficiencies
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
Definition: TrigTauMonitorL1Algorithm.h:29
xAOD::eFexTauRoI_v1::phi
float phi() const
Seed supercell index within central tower (0 -> 3)
xAOD::EmTauRoI_v2::hadIsol
float hadIsol() const
The hadron calorimeter isolation (outer ring of had towers)
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
TrigTauMonitorBaseAlgorithm
Definition: TrigTauMonitorBaseAlgorithm.h:24
TrigTauMonitorBaseAlgorithm::m_do_efficiency_plots
Gaudi::Property< bool > m_do_efficiency_plots
Definition: TrigTauMonitorBaseAlgorithm.h:40
TrigTauMonitorL1Algorithm::m_phase1l1eTauxRoIKey
SG::ReadHandleKey< xAOD::eFexTauRoIContainer > m_phase1l1eTauxRoIKey
Definition: TrigTauMonitorL1Algorithm.h:21
TrigTauMonitorL1Algorithm::m_requireOfflineTaus
Gaudi::Property< bool > m_requireOfflineTaus
Definition: TrigTauMonitorL1Algorithm.h:18
TrigTauMonitorL1Algorithm::initialize
virtual StatusCode initialize() override
initialize
Definition: TrigTauMonitorL1Algorithm.cxx:13
TrigTauInfo
Definition: TrigTauInfo.h:15
xAOD::jFexTauRoI_v1::iso
unsigned int iso() const
Iso on TOB scale.
Definition: jFexTauRoI_v1.cxx:120
xAOD::EmTauRoI_v2::eta
float eta() const
The pseudorapidity ( ) of the em/tau candidate.
TrigTauMonitorL1Algorithm::fillL1jTauVars
void fillL1jTauVars(const std::string &trigger, const std::vector< const xAOD::jFexTauRoI * > &rois) const
Definition: TrigTauMonitorL1Algorithm.cxx:112
TrigTauMonitorBaseAlgorithm::getL1jTAUs
std::vector< const xAOD::jFexTauRoI * > getL1jTAUs(const EventContext &ctx, const std::string &l1_item) const
Definition: TrigTauMonitorBaseAlgorithm.cxx:157
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
TriggerTest.rois
rois
Definition: TriggerTest.py:23
TrigTauMonitorBaseAlgorithm::getL1LegacyTAUs
std::vector< const xAOD::EmTauRoI * > getL1LegacyTAUs(const EventContext &ctx, const std::string &l1_item) const
Definition: TrigTauMonitorBaseAlgorithm.cxx:233
xAOD::EmTauRoI_v2::eT
float eT() const
The ET of the cluster (from RoI word)
TrigTauMonitorBaseAlgorithm::m_triggers
Gaudi::Property< std::vector< std::string > > m_triggers
Definition: TrigTauMonitorBaseAlgorithm.h:32
TrigTauMonitorBaseAlgorithm::getTrigInfo
const TrigTauInfo & getTrigInfo(const std::string &trigger) const
Definition: TrigTauMonitorBaseAlgorithm.h:45
SG::AllowEmpty
@ AllowEmpty
Definition: StoreGate/StoreGate/VarHandleKey.h:30
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
AthMonitorAlgorithm::getGroup
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
Definition: AthMonitorAlgorithm.cxx:164
TrigTauMonitorBaseAlgorithm::getOfflineTausAll
std::vector< const xAOD::TauJet * > getOfflineTausAll(const EventContext &ctx, const float threshold=20.0) const
Definition: TrigTauMonitorBaseAlgorithm.cxx:83
PhysDESDM_Quirks.trigger
trigger
Definition: PhysDESDM_Quirks.py:27
xAOD::EmTauRoI_v2::tauClus
float tauClus() const
The deposited ET from the "tau cluster".