ATLAS Offline Software
Loading...
Searching...
No Matches
TrigTauMonitorSingleAlgorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
7
9
10
11TrigTauMonitorSingleAlgorithm::TrigTauMonitorSingleAlgorithm(const std::string& name, ISvcLocator* pSvcLocator)
12 : TrigTauMonitorBaseAlgorithm(name, pSvcLocator)
13{}
14
15
17{
19
23
25 ATH_MSG_ERROR("Cannot have an HLT monitored ID or HitZ variable with the key OfflineTauJets.");
26 return StatusCode::FAILURE;
27 }
28
29 for(const auto& [key, p] : m_monitoredOfflineIdScores) {
30 if(p.first.empty() || p.second.empty()) {
31 ATH_MSG_WARNING("Invalid Offline TauID score variable names; skipping this entry for the monitoring!");
32 continue;
33 }
34
35 m_monitoredVarPairsDecorHandleKeys["OfflineTauJets"].emplace(
36 key,
37 std::make_pair(
40 )
41 );
42 ATH_CHECK(m_monitoredVarPairsDecorHandleKeys.at("OfflineTauJets").at(key).first.initialize());
43 ATH_CHECK(m_monitoredVarPairsDecorHandleKeys.at("OfflineTauJets").at(key).second.initialize());
44 }
45
46 return StatusCode::SUCCESS;
47}
48
49
51{
52 for(const auto& [container_sfx, m] : var_names_map) {
53 if(m_hltTauJetKeysMap.find(container_sfx) == m_hltTauJetKeysMap.end()) {
54 ATH_MSG_DEBUG("No triggers using container suffix \"" << container_sfx << "\". Skipping key creation for this suffix.");
55 continue;
56 }
57
58 const std::string online_container_name = getOnlineContainerKey(container_sfx).key();
59 for(const auto& [key, p] : m) {
60 if(p.first.empty() || p.second.empty()) {
61 ATH_MSG_ERROR("Invalid HLT variable names for \"" << key << "\".");
62 return StatusCode::FAILURE;
63 }
64
65 m_monitoredVarPairsDecorHandleKeys[container_sfx].emplace(
66 key,
67 std::make_pair(
68 SG::ReadDecorHandleKey<xAOD::TauJetContainer>(online_container_name + "." + p.first),
69 SG::ReadDecorHandleKey<xAOD::TauJetContainer>(online_container_name + "." + p.second)
70 )
71 );
72
73 ATH_CHECK(m_monitoredVarPairsDecorHandleKeys.at(container_sfx).at(key).first.initialize());
74 ATH_CHECK(m_monitoredVarPairsDecorHandleKeys.at(container_sfx).at(key).second.initialize());
75 }
76 }
77
78 return StatusCode::SUCCESS;
79}
80
81
82StatusCode TrigTauMonitorSingleAlgorithm::processEvent(const EventContext& ctx) const
83{
84 constexpr float threshold_offset = 10.0;
85
86 // Offline taus
87 auto offline_taus_all = getOfflineTausAll(ctx, 0.0);
88 if(m_requireOfflineTaus && offline_taus_all.empty()) return StatusCode::SUCCESS;
89
90 for(const std::string& trigger : m_triggers) {
91 const TrigTauInfo& info = getTrigInfo(trigger);
92
93 if(!info.isHLTSingleTau()) {
94 ATH_MSG_WARNING("Chain \"" << trigger << "\" is not a single tau trigger. Skipping...");
95 continue;
96 }
97
98 const auto passBits = m_trigDecTool->isPassedBits(trigger);
99 const bool l1_accept_flag = passBits & TrigDefs::L1_isPassedAfterVeto;
100 const bool hlt_not_prescaled_flag = (passBits & TrigDefs::EF_prescaled) == 0;
101
102 // Offline tau requirement check
103 const std::vector<const xAOD::TauJet*> offline_taus_with_id = classifyTausAll(offline_taus_all, 0, static_cast<TauID>(m_offline_tau_id.value()));
104 if(m_requireOfflineTaus && offline_taus_with_id.empty()) continue;
105
106 // Filter offline taus
107 auto offline_taus = classifyOfflineTaus(offline_taus_with_id, info.getHLTTauThreshold() - threshold_offset);
108 std::vector<const xAOD::TauJet*> offline_taus_1p = offline_taus.first;
109 std::vector<const xAOD::TauJet*> offline_taus_3p = offline_taus.second;
110
111 // Online taus
112 std::vector<const xAOD::TauJet*> hlt_taus_all = getOnlineTausAll(trigger, true, info.isBootstrappedTauTrigger());
113 auto hlt_taus = classifyOnlineTaus(hlt_taus_all);
114 std::vector<const xAOD::TauJet*> hlt_taus_0p = std::get<0>(hlt_taus);
115 std::vector<const xAOD::TauJet*> hlt_taus_1p = std::get<1>(hlt_taus);
116 std::vector<const xAOD::TauJet*> hlt_taus_mp = std::get<2>(hlt_taus);
117
119 // Offline variables:
120 if(m_doOfflineTausDistributions && !offline_taus_1p.empty()) {
121 fillBasicVars(ctx, trigger, offline_taus_1p, "1P", false);
122 fillIDScores(ctx, trigger, offline_taus_1p, "1P", false);
123 fillIDInputVars(trigger, offline_taus_1p, "1P", false);
124 fillIDTrack(trigger, offline_taus_1p, false);
125 fillIDCluster(trigger, offline_taus_1p, false);
126 }
127 if(m_doOfflineTausDistributions && !offline_taus_3p.empty()) {
128 fillBasicVars(ctx, trigger, offline_taus_3p, "3P", false);
129 fillIDScores(ctx, trigger, offline_taus_3p, "3P", false);
130 fillIDInputVars(trigger, offline_taus_3p, "3P", false);
131 fillIDTrack(trigger, offline_taus_3p, false);
132 fillIDCluster(trigger, offline_taus_3p, false);
133 }
134
135 // Fill information for online 0 prong taus
136 if(!hlt_taus_0p.empty()) {
137 fillBasicVars(ctx, trigger, hlt_taus_0p, "0P", true);
138 fillIDScores(ctx, trigger, hlt_taus_0p, "0P", true);
139 fillIDInputVars(trigger, hlt_taus_0p, "0P", true);
140 fillIDTrack(trigger, hlt_taus_0p, true);
141 fillIDCluster(trigger, hlt_taus_0p, true);
142 fillHitZVars(ctx, trigger, hlt_taus_0p, "0P");
143 }
144
145 // Fill information for online 1 prong taus
146 if(!hlt_taus_1p.empty()) {
147 fillBasicVars(ctx, trigger, hlt_taus_1p, "1P", true);
148 fillIDScores(ctx, trigger, hlt_taus_1p, "1P", true);
149 fillIDInputVars(trigger, hlt_taus_1p, "1P", true);
150 fillIDTrack(trigger, hlt_taus_1p, true);
151 fillIDCluster(trigger, hlt_taus_1p, true);
152 fillHitZVars(ctx, trigger, hlt_taus_1p, "1P");
153 }
154
155 // Fill information for online multiprong prong taus
156 if(!hlt_taus_mp.empty()) {
157 fillBasicVars(ctx, trigger, hlt_taus_mp, "MP", true);
158 fillIDScores(ctx, trigger, hlt_taus_mp, "MP", true);
159 fillIDInputVars(trigger, hlt_taus_mp, "MP", true);
160 fillIDTrack(trigger, hlt_taus_mp, true);
161 fillIDCluster(trigger, hlt_taus_mp, true);
162 fillHitZVars(ctx, trigger, hlt_taus_mp, "MP");
163 }
164 }
165
166 if(m_do_efficiency_plots && hlt_not_prescaled_flag) {
167 fillHLTEfficiencies(ctx, trigger, l1_accept_flag, offline_taus_1p, hlt_taus_all, "1P");
168 fillHLTEfficiencies(ctx, trigger, l1_accept_flag, offline_taus_3p, hlt_taus_all, "3P");
169 }
170 }
171
172 return StatusCode::SUCCESS;
173}
174
175
176void TrigTauMonitorSingleAlgorithm::fillHLTEfficiencies(const EventContext& ctx, const std::string& trigger, const bool l1_accept_flag, const std::vector<const xAOD::TauJet*>& offline_tau_vec, const std::vector<const xAOD::TauJet*>& online_tau_vec, const std::string& nProng) const
177{
178 ATH_MSG_DEBUG("Fill HLT " << nProng << " efficiencies: " << trigger);
179
180 const TrigTauInfo& info = getTrigInfo(trigger);
181
182 // Efficiency for single leg tau triggers:
183 // denominator = offline tau + matching with L1 object with dR(offline tau,L1 item) < 0.3
184 // numerator = denominator + hlt fires + matching with HLT tau with dR(offline tau, HLT tau) < 0.2
185
186 auto monGroup = getGroup(trigger+"_HLT_Efficiency_"+nProng);
187
188 auto tauPt = Monitored::Scalar<float>("tauPt", 0.0);
189 auto tauEta = Monitored::Scalar<float>("tauEta", 0.0);
190 auto tauPhi = Monitored::Scalar<float>("tauPhi", 0.0);
191 auto averageMu = Monitored::Scalar<float>("averageMu", 0.0);
192 auto HLT_match = Monitored::Scalar<bool>("HLT_pass", false);
193 auto HLT_match_highPt = Monitored::Scalar<bool>("HLT_pass_highPt", false);
194 auto Total_match = Monitored::Scalar<bool>("Total_pass", false);
195 auto Total_match_highPt = Monitored::Scalar<bool>("Total_pass_highPt", false);
196
197 bool hlt_fires = m_trigDecTool->isPassed(trigger, TrigDefs::Physics | TrigDefs::allowResurrectedDecision);
198
199 std::vector<TLorentzVector> rois = getRoIsVector(ctx, trigger);
200 for(const auto *offline_tau : offline_tau_vec) {
201 bool L1_match = false;
202
203 // Check the matching offline tau with L1 item -> depending on the L1 type (phase-1 eTAU, jTAU, cTAU)
204 // All L1 RoIs have a core size of 3x3 TTs -> 0.3 x 0.3
205 for(const TLorentzVector& roi : rois) {
206 L1_match = offline_tau->p4().DeltaR(roi) <= 0.3;
207 if(L1_match) break;
208 }
209
210 tauPt = offline_tau->pt()/Gaudi::Units::GeV;
211 tauEta = offline_tau->eta();
212 tauPhi = offline_tau->phi();
213 averageMu = lbAverageInteractionsPerCrossing(ctx);
214
215 bool is_highPt = tauPt > info.getHLTTauThreshold() + 20.0;
216
217 // HLT matching: dR matching + HLT fires
218 HLT_match = matchObjects(offline_tau, online_tau_vec, 0.2) && hlt_fires;
219
220 // Total efficiency (without L1 matching)
222 Total_match = static_cast<bool>(HLT_match);
223 fill(monGroup, tauPt, tauEta, tauPhi, Total_match);
224
225 if(is_highPt) {
226 Total_match_highPt = static_cast<bool>(HLT_match);
227 fill(monGroup, tauEta, tauPhi, Total_match_highPt);
228 }
229 }
230
231 if(!L1_match || !l1_accept_flag) continue; // Skip this offline tau since not matched with L1 item
232
233 fill(monGroup, tauPt, tauEta, tauPhi, averageMu, HLT_match);
234
235 if(is_highPt) {
236 HLT_match_highPt = static_cast<bool>(HLT_match);
237 fill(monGroup, tauEta, tauPhi, HLT_match_highPt);
238 }
239 }
240
241 ATH_MSG_DEBUG("After fill HLT efficiencies: " << trigger);
242}
243
244
245void TrigTauMonitorSingleAlgorithm::fillIDInputVars(const std::string& trigger, const std::vector<const xAOD::TauJet*>& tau_vec,const std::string& nProng, bool online) const
246{
247 ATH_MSG_DEBUG("Fill ID input variables: " << trigger);
248
249 auto monGroup = getGroup(trigger+"_ID_"+(online ? "HLT" : "Offline")+"_InputScalar_"+nProng);
250
251 auto centFrac = Monitored::Collection("centFrac", tau_vec, [](const xAOD::TauJet* tau){
252 float detail = -999;
253 if(tau->detail(xAOD::TauJetParameters::centFrac, detail)) detail = std::min(detail, 1.0f);
254 return detail;
255 });
256 auto etOverPtLeadTrk = Monitored::Collection("etOverPtLeadTrk", tau_vec, [](const xAOD::TauJet* tau){
257 float detail = -999;
258 if(tau->detail(xAOD::TauJetParameters::etOverPtLeadTrk, detail)) detail = std::log10(std::max(detail, 0.1f));
259 return detail;
260 });
261 auto dRmax = Monitored::Collection("dRmax", tau_vec, [](const xAOD::TauJet* tau){
262 float detail = -999;
264 return detail;
265 });
266 auto absipSigLeadTrk = Monitored::Collection("absipSigLeadTrk", tau_vec, [](const xAOD::TauJet* tau){
267 float detail = (tau->nTracks()>0) ? std::abs(tau->track(0)->d0SigTJVA()) : 0;
268 detail = std::min(std::abs(detail), 30.0f);
269 return detail;
270 });
271 auto sumPtTrkFrac = Monitored::Collection("sumPtTrkFrac", tau_vec, [](const xAOD::TauJet* tau){
272 float detail = -999;
274 return detail;
275 });
276 auto emPOverTrkSysP = Monitored::Collection("emPOverTrkSysP", tau_vec, [](const xAOD::TauJet* tau){
277 float detail = -999;
278 if(tau->detail(xAOD::TauJetParameters::EMPOverTrkSysP, detail)) detail = std::log10(std::max(detail, 1e-3f));
279 return detail;
280 });
281 auto ptRatioEflowApprox = Monitored::Collection("ptRatioEflowApprox", tau_vec, [](const xAOD::TauJet* tau){
282 float detail = -999;
284 return detail;
285 });
286 auto mEflowApprox = Monitored::Collection("mEflowApprox", tau_vec, [](const xAOD::TauJet* tau){
287 float detail = -999;
288 if(tau->detail(xAOD::TauJetParameters::mEflowApprox, detail)) detail = std::log10(std::max(detail, 140.0f));
289 return detail;
290 });
291 auto ptDetectorAxis = Monitored::Collection("ptDetectorAxis", tau_vec, [](const xAOD::TauJet* tau){
292 float detail = -999;
293 if( tau->ptDetectorAxis() > 0) detail = std::log10(std::min(tau->ptDetectorAxis()/Gaudi::Units::GeV, 100.0));
294 return detail;
295 });
296 auto massTrkSys = Monitored::Collection("massTrkSys", tau_vec, [&nProng](const xAOD::TauJet* tau){
297 float detail = -999;
298 if( tau->detail(xAOD::TauJetParameters::massTrkSys, detail) && (nProng.find("MP") != std::string::npos || nProng.find("3P") != std::string::npos)) {
299 detail = std::log10(std::max(detail, 140.0f));
300 }
301 return detail;});
302 auto trFlightPathSig = Monitored::Collection("trFlightPathSig", tau_vec, [&nProng](const xAOD::TauJet* tau){
303 float detail = -999;
304 if(nProng.find("MP") != std::string::npos || nProng.find("3P") != std::string::npos) tau->detail(xAOD::TauJetParameters::trFlightPathSig, detail);
305 return detail;
306 });
307
308 fill(monGroup, centFrac, etOverPtLeadTrk, dRmax, absipSigLeadTrk, sumPtTrkFrac, emPOverTrkSysP, ptRatioEflowApprox, mEflowApprox, ptDetectorAxis, massTrkSys, trFlightPathSig);
309
310 ATH_MSG_DEBUG("After fill ID input variables: " << trigger);
311}
312
313
314void TrigTauMonitorSingleAlgorithm::fillIDTrack(const std::string& trigger, const std::vector<const xAOD::TauJet*>& tau_vec, bool online) const
315{
316 ATH_MSG_DEBUG("Fill ID input Track: " << trigger);
317
318 auto monGroup = getGroup(trigger+"_ID_"+(online ? "HLT" : "Offline")+"_InputTrack");
319
320 auto track_pt_jetseed_log = Monitored::Collection("track_pt_jetseed_log", tau_vec, [](const xAOD::TauJet* tau){ return std::log10(tau->ptJetSeed()); });
321 fill(monGroup, track_pt_jetseed_log);
322
323 for(const auto *tau : tau_vec) {
324 // Don't call ->allTracks() unless the element links are valid
325 static const SG::ConstAccessor< std::vector<ElementLink<xAOD::TauTrackContainer>> > tauTrackAcc("tauTrackLinks");
326 bool linksValid = true;
327 for(const ElementLink<xAOD::TauTrackContainer>& trackEL : tauTrackAcc(*tau)) {
328 if(!trackEL.isValid()) {
329 linksValid = false;
330 break;
331 }
332 }
333 if(!linksValid) {
334 ATH_MSG_WARNING("Invalid track element links from TauJet in " << trigger);
335 continue;
336 }
337
338 auto tracks = tau->allTracks();
339 std::sort(tracks.begin(), tracks.end(), [](const xAOD::TauTrack* lhs, const xAOD::TauTrack* rhs){ return lhs->pt() > rhs->pt(); });
340
341 auto n_track = Monitored::Scalar<int>("n_track", tracks.size());
342
343 auto track_pt_log = Monitored::Collection("track_pt_log", tracks, [](const xAOD::TauTrack *track){ return std::log10(track->pt()); });
344 auto track_eta = Monitored::Collection("track_eta", tracks, [](const xAOD::TauTrack *track){ return track->eta(); });
345 auto track_phi = Monitored::Collection("track_phi", tracks, [](const xAOD::TauTrack *track){ return track->phi(); });
346
347 auto track_dEta = Monitored::Collection("track_dEta", tracks, [&tau](const xAOD::TauTrack *track){ return track->eta() - tau->eta(); });
348 auto track_dPhi = Monitored::Collection("track_dPhi", tracks, [&tau](const xAOD::TauTrack *track){ return track->p4().DeltaPhi(tau->p4()); });
349
350 auto track_z0sinthetaTJVA_abs_log = Monitored::Collection("track_z0sinthetaTJVA_abs_log", tracks, [](const xAOD::TauTrack *track){return track->z0sinthetaTJVA(); });
351 auto track_d0_abs_log = Monitored::Collection("track_d0_abs_log", tracks, [](const xAOD::TauTrack *track){ return std::log10(std::abs(track->track()->d0()) + 1e-6); });
352
353 auto track_nIBLHitsAndExp = Monitored::Collection("track_nIBLHitsAndExp", tracks, [](const xAOD::TauTrack *track){
354 uint8_t inner_pixel_hits, inner_pixel_exp;
355 const auto success1_innerPixel_hits = track->track()->summaryValue(inner_pixel_hits, xAOD::numberOfInnermostPixelLayerHits);
356 const auto success2_innerPixel_exp = track->track()->summaryValue(inner_pixel_exp, xAOD::expectInnermostPixelLayerHit);
357 float detail = -999;
358 if(success1_innerPixel_hits && success2_innerPixel_exp) { detail = inner_pixel_exp ? inner_pixel_hits : 1.; };
359 return detail;
360 });
361 auto track_nPixelHitsPlusDeadSensors = Monitored::Collection("track_nPixelHitsPlusDeadSensors", tracks, [](const xAOD::TauTrack *track){
362 uint8_t pixel_hits, pixel_dead;
363 const auto success1_pixel_hits = track->track()->summaryValue(pixel_hits, xAOD::numberOfPixelHits);
364 const auto success2_pixel_dead = track->track()->summaryValue(pixel_dead, xAOD::numberOfPixelDeadSensors);
365 float detail = -999;
366 if(success1_pixel_hits && success2_pixel_dead) { detail = pixel_hits + pixel_dead; };
367 return detail;
368 });
369 auto track_nSCTHitsPlusDeadSensors = Monitored::Collection("track_nSCTHitsPlusDeadSensors", tracks, [](const xAOD::TauTrack *track){
370 uint8_t sct_hits, sct_dead;
371 const auto success1_sct_hits = track->track()->summaryValue(sct_hits, xAOD::numberOfSCTHits);
372 const auto success2_sct_dead = track->track()->summaryValue(sct_dead, xAOD::numberOfSCTDeadSensors);
373 float detail = -999;
374 if(success1_sct_hits && success2_sct_dead) { detail = sct_hits + sct_dead; };
375 return detail;
376 });
377
378 fill(monGroup, n_track, track_pt_log, track_eta, track_phi, track_dEta, track_dPhi, track_z0sinthetaTJVA_abs_log, track_d0_abs_log, track_nIBLHitsAndExp, track_nPixelHitsPlusDeadSensors, track_nSCTHitsPlusDeadSensors);
379 }
380
381 ATH_MSG_DEBUG("After fill ID input Track: " << trigger);
382}
383
384
385void TrigTauMonitorSingleAlgorithm::fillIDCluster(const std::string& trigger, const std::vector<const xAOD::TauJet*>& tau_vec, bool online) const
386{
387 ATH_MSG_DEBUG("Fill ID input Cluster: " << trigger << " for online/offline " << online);
388
389 auto monGroup = getGroup(trigger+"_ID_"+(online ? "HLT" : "Offline")+"_InputCluster");
390
391 for(const auto *tau : tau_vec){
392 auto cluster_pt_jetseed_log = Monitored::Collection("cluster_pt_jetseed_log", tau_vec, [](const xAOD::TauJet* tau){ return std::log10(tau->ptJetSeed()); });
393
394 std::vector<const xAOD::CaloCluster*> clusters;
395 for(const xAOD::IParticle* particle : tau->clusters()) {
396 const xAOD::CaloCluster* cluster = static_cast<const xAOD::CaloCluster*>(particle);
397 clusters.push_back(cluster);
398 }
399 std::sort(clusters.begin(), clusters.end(), [](const xAOD::CaloCluster *lhs, const xAOD::CaloCluster *rhs){ return lhs->et() > rhs->et(); });
400
401 auto n_cluster = Monitored::Scalar<int>("n_cluster", 0);
402 n_cluster = clusters.size();
403
404 auto cluster_et_log = Monitored::Collection("cluster_et_log",clusters, [](const xAOD::CaloCluster *cluster){ return std::log10( cluster->et()); });
405 auto cluster_eta = Monitored::Collection("cluster_eta", clusters, [](const xAOD::CaloCluster *cluster){ return cluster->eta(); });
406 auto cluster_phi = Monitored::Collection("cluster_phi", clusters, [](const xAOD::CaloCluster *cluster){ return cluster->phi(); });
407 auto cluster_dEta = Monitored::Collection("cluster_dEta", clusters, [&tau](const xAOD::CaloCluster *cluster){ return cluster->eta() - tau->eta(); });
408 auto cluster_dPhi = Monitored::Collection("cluster_dPhi", clusters, [&tau](const xAOD::CaloCluster *cluster){ return cluster->p4().DeltaPhi(tau->p4()); });
409 auto cluster_SECOND_R_log10 = Monitored::Collection("cluster_SECOND_R_log10", clusters, [](const xAOD::CaloCluster *cluster){
410 double detail = -999;
411 const auto success_SECOND_R = cluster->retrieveMoment(xAOD::CaloCluster::MomentType::SECOND_R,detail);
412 if(success_SECOND_R) detail = std::log10(detail + 0.1);
413 return detail;
414 });
415
416 auto cluster_SECOND_LAMBDA_log10 = Monitored::Collection("cluster_SECOND_LAMBDA_log10", clusters, [](const xAOD::CaloCluster *cluster){
417 double detail = -999;
418 const auto success_SECOND_LAMBDA = cluster->retrieveMoment(xAOD::CaloCluster::MomentType::SECOND_LAMBDA, detail);
419 if(success_SECOND_LAMBDA) detail = std::log10(detail + 0.1);
420 return detail;
421 });
422
423 auto cluster_CENTER_LAMBDA_log10 = Monitored::Collection("cluster_CENTER_LAMBDA_log10", clusters, [](const xAOD::CaloCluster *cluster){
424 double detail = -999;
425 const auto success_CENTER_LAMBDA = cluster->retrieveMoment(xAOD::CaloCluster::MomentType::CENTER_LAMBDA, detail);
426 if(success_CENTER_LAMBDA) detail = std::log10(detail + 1e-6);
427 return detail;
428 });
429
430 fill(monGroup, n_cluster, cluster_pt_jetseed_log, cluster_et_log, cluster_eta, cluster_phi, cluster_dEta, cluster_dPhi, cluster_SECOND_R_log10, cluster_SECOND_LAMBDA_log10, cluster_CENTER_LAMBDA_log10);
431 }
432
433 ATH_MSG_DEBUG("After fill ID input Cluster: " << trigger);
434}
435
436
437void TrigTauMonitorSingleAlgorithm::fillBasicVars(const EventContext& ctx, const std::string& trigger, const std::vector<const xAOD::TauJet*>& tau_vec, const std::string& nProng, bool online) const
438{
439 ATH_MSG_DEBUG("Fill Basic Variables: " << trigger);
440
441 auto monGroup = getGroup(trigger+"_"+(online ? "HLT" : "Offline")+"_basicVars_"+nProng);
442
443 auto Pt = Monitored::Collection("Pt", tau_vec, [](const xAOD::TauJet* tau){ return tau->pt()/Gaudi::Units::GeV; });
444 auto Eta = Monitored::Collection("Eta", tau_vec, [](const xAOD::TauJet* tau){ return tau->eta(); });
445 auto Phi = Monitored::Collection("Phi", tau_vec, [](const xAOD::TauJet* tau){ return tau->phi(); });
446
447 auto nTrack = Monitored::Collection("nTrack", tau_vec, [](const xAOD::TauJet* tau){
448 int nTrack = -1;
450 return nTrack;
451 });
452 auto nIsoTrack = Monitored::Collection("nIsoTrack", tau_vec, [](const xAOD::TauJet* tau){ return tau->nTracksIsolation(); });
453
454 auto averageMu = Monitored::Scalar<float>("averageMu", 0.0);
455 averageMu = lbAverageInteractionsPerCrossing(ctx);
456
457 auto TauVertexX = Monitored::Collection("TauVertexX", tau_vec, [](const xAOD::TauJet* tau){
458 double vtx = -999;
459 if(tau->vertex() != nullptr) vtx = tau->vertex()->x();
460 return vtx;
461 });
462 auto TauVertexY = Monitored::Collection("TauVertexY", tau_vec, [](const xAOD::TauJet* tau){
463 double vty = -999;
464 if(tau->vertex() != nullptr) vty = tau->vertex()->y();
465 return vty;
466 });
467 auto TauVertexZ = Monitored::Collection("TauVertexZ", tau_vec, [](const xAOD::TauJet* tau){
468 double vtz = -999;
469 if(tau->vertex() != nullptr) vtz = tau->vertex()->z();
470 return vtz;
471 });
472
473 fill(monGroup, Pt, Eta, Phi, nTrack, nIsoTrack, averageMu, TauVertexX, TauVertexY, TauVertexZ);
474
475 ATH_MSG_DEBUG("After fill Basic variables: " << trigger);
476}
477
478
479void TrigTauMonitorSingleAlgorithm::fillIDScores(const EventContext& ctx, const std::string& trigger, const std::vector<const xAOD::TauJet*>& tau_vec, const std::string& nProng, bool online) const
480{
481 ATH_MSG_DEBUG("Fill TauID Scores: " << trigger);
482
483 const TrigTauInfo& info = getTrigInfo(trigger);
484
485 if(online) {
486 if(info.getHLTTauType() == "ptonly") return;
487 const bool monitor_ids = m_monitoredHLTIdScores.value().find(info.getHLTTauLegContainerSfx()) != m_monitoredHLTIdScores.value().end();
488 const bool monitor_ch_presel = m_monitoredHLTCaloHitsPreselIdScores.value().find(info.getHLTTauLegContainerSfx()) != m_monitoredHLTCaloHitsPreselIdScores.value().end();
489 if(!monitor_ids && !monitor_ch_presel) return;
490
491 auto monGroup = getGroup(trigger+"_HLT_IDScores_"+nProng);
492
493 if(monitor_ids) {
494 std::string match = info.getHLTTauID();
495 if(match == "idperf" || match == "perf") match.clear(); // Monitor all
496
497 fillVarPairs(ctx, monGroup, m_monitoredHLTIdScores.value().at(info.getHLTTauLegContainerSfx()), info.getHLTTauLegContainerSfx(), match, "TauIDScore", "TauIDScoreSigTrans", tau_vec);
498 }
499
500 if(monitor_ch_presel) {
501 std::string match = info.getHLTTauCaloHitsPreselectionID();
502 if(match == "idperfCHP") match.clear(); // Monitor all
503
504 fillVarPairs(ctx, monGroup, m_monitoredHLTCaloHitsPreselIdScores.value().at(info.getHLTTauLegContainerSfx()), info.getHLTTauLegContainerSfx(), match, "TauIDScore", "TauIDScoreSigTrans", tau_vec);
505 }
506
507 } else {
508 if(m_monitoredOfflineIdScores.value().size() == 0) return;
509
510 auto monGroup = getGroup(trigger+"_Offline_IDScores_"+nProng);
511 fillVarPairs(ctx, monGroup, m_monitoredOfflineIdScores.value(), "OfflineTauJets", "", "TauIDScore", "TauIDScoreSigTrans", tau_vec);
512 }
513
514 ATH_MSG_DEBUG("After fill TauID Scores: " << trigger);
515}
516
517
519 ToolHandle<GenericMonitoringTool>& mon_group,
520 const VarPropertyMap::mapped_type& vars,
521 const std::string& category,
522 const std::string& match_var_name,
523 const std::string& mon_var_1_name,
524 const std::string& mon_var_2_name,
525 const std::vector<const xAOD::TauJet*>& tau_vec) const
526{
527 for(const auto& [key, p] : vars) {
528 if(!match_var_name.empty() && match_var_name != key) continue;
529
530 const auto& [var_1_key, var_2_key] = m_monitoredVarPairsDecorHandleKeys.at(category).at(key);
531 SG::ReadDecorHandle<xAOD::TauJetContainer, float> var_1_handle(var_1_key, ctx);
532 SG::ReadDecorHandle<xAOD::TauJetContainer, float> var_2_handle(var_2_key, ctx);
533
534 // Skip if both the Score and ScoreSigTrans aren't available
535 if(!var_1_handle.isAvailable() || !var_2_handle.isAvailable()) continue;
536
537 std::vector<float> var_1, var_2;
538 for(const xAOD::TauJet* tau : tau_vec) {
539 var_1.push_back(var_1_handle(*tau));
540 var_2.push_back(var_2_handle(*tau));
541 }
542
543 auto mon_var_1 = Monitored::Collection(key + "_" + mon_var_1_name, var_1);
544 auto mon_var_2 = Monitored::Collection(key + "_" + mon_var_2_name, var_2);
545 fill(mon_group, mon_var_1, mon_var_2);
546 }
547}
548
549
550void TrigTauMonitorSingleAlgorithm::fillHitZVars(const EventContext& ctx, const std::string& trigger, const std::vector<const xAOD::TauJet*>& tau_vec, const std::string& nProng) const
551{
552 ATH_MSG_DEBUG("Fill HitZ Variables: " << trigger);
553
554 const TrigTauInfo& info = getTrigInfo(trigger);
555 if(m_monitoredHLTHitZVars.value().find(info.getHLTTauLegContainerSfx()) == m_monitoredHLTHitZVars.value().end()) return;
556 if(info.getHLTTauHitZAlg().empty() && info.getHLTTauCaloHitsPreselectionID().empty()) return;
557
558 auto monGroup = getGroup(trigger+"_HLT_HitZ_"+nProng);
559
560 for(const auto& [key, p] : m_monitoredHLTHitZVars.value().at(info.getHLTTauLegContainerSfx())) {
561 const auto& [z0_key, z0_sigma_key] = m_monitoredVarPairsDecorHandleKeys.at(info.getHLTTauLegContainerSfx()).at(key);
563 SG::ReadDecorHandle<xAOD::TauJetContainer, float> z0_sigma_handle(z0_sigma_key, ctx);
564
565 // Skip if both the Score and ScoreSigTrans aren't available
566 if(!z0_handle.isAvailable() || !z0_sigma_handle.isAvailable()) continue;
567
568 std::vector<float> z0, z0_sigma, z0_delta, z0_delta_sig;
569 for(const xAOD::TauJet* tau : tau_vec) {
570 z0.push_back(z0_handle(*tau));
571 z0_sigma.push_back(z0_sigma_handle(*tau));
572
573 if(tau->vertex() != nullptr) {
574 const float tau_z = tau->vertex()->z();
575 z0_delta.push_back(z0_handle(*tau) - tau_z);
576 z0_delta_sig.push_back(z0_sigma_handle(*tau) ? (z0_handle(*tau) - tau_z) / z0_sigma_handle(*tau) : -999);
577 } else {
578 z0_delta.push_back(-999);
579 z0_delta_sig.push_back(-999);
580 }
581 }
582
583 auto mon_z0 = Monitored::Collection(key + "_z0", z0);
584 auto mon_z0_sigma = Monitored::Collection(key + "_z0_sigma", z0_sigma);
585 auto mon_z0_delta = Monitored::Collection(key + "_z0_delta", z0_delta);
586 auto mon_z0_delta_sig = Monitored::Collection(key + "_z0_delta_sig", z0_delta_sig);
587 fill(monGroup, mon_z0, mon_z0_sigma, mon_z0_delta, mon_z0_delta_sig);
588 }
589
590 ATH_MSG_DEBUG("After fill HitZ Variables: " << trigger);
591}
592
593
594std::vector<TLorentzVector> TrigTauMonitorSingleAlgorithm::getRoIsVector(const EventContext& ctx, const std::string& trigger) const
595{
596 std::vector<TLorentzVector> ret;
597
598 const TrigTauInfo& info = getTrigInfo(trigger);
599
600 TLorentzVector v;
601 if(info.getL1TauType() == "eTAU") {
602 for(const xAOD::eFexTauRoI* roi : getL1eTAUs(ctx, info.getL1TauItem())) {
603 v.SetPtEtaPhiM(roi->et(), roi->eta(), roi->phi(), 0);
604 ret.push_back(v);
605 }
606 } else if(info.getL1TauType() == "jTAU") {
607 for(const xAOD::jFexTauRoI* roi : getL1jTAUs(ctx, info.getL1TauItem())) {
608 v.SetPtEtaPhiM(roi->et(), roi->eta(), roi->phi(), 0);
609 ret.push_back(v);
610 }
611 } else if(info.getL1TauType() == "cTAU") {
612 for(const auto& [eTau_roi, jTau_roi] : getL1cTAUs(ctx, info.getL1TauItem())) {
613 v.SetPtEtaPhiM(eTau_roi->et(), eTau_roi->eta(), eTau_roi->phi(), 0);
614 ret.push_back(v);
615 }
616 }
617
618 return ret;
619}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Handle class for reading a decoration on an object.
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
PublicToolHandle< Trig::TrigDecisionTool > m_trigDecTool
Tool to tell whether a specific trigger is passed.
Declare a monitored scalar variable.
Helper class to provide constant type-safe access to aux data.
Property holding a SG store/key/clid/attr name from which a ReadDecorHandle is made.
Handle class for reading a decoration on an object.
bool isAvailable()
Test to see if this variable exists in the store, for the referenced object.
std::vector< const xAOD::eFexTauRoI * > getL1eTAUs(const EventContext &ctx, const std::string &l1_item) const
Gaudi::Property< bool > m_do_efficiency_plots
const SG::ReadHandleKey< xAOD::TauJetContainer > & getOnlineContainerKey(const std::string &container_suffix) const
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
std::unordered_map< std::string, SG::ReadHandleKey< xAOD::TauJetContainer > > m_hltTauJetKeysMap
bool matchObjects(const T1 *tau, const std::vector< const T2 * > &tau_vec, float threshold) 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< const xAOD::TauJet * > getOnlineTausAll(const std::string &trigger, bool include_0P=true, bool filter_legs=false) 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
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
void fillIDScores(const EventContext &ctx, const std::string &trigger, const std::vector< const xAOD::TauJet * > &tau_vec, const std::string &nProng, bool online) const
virtual StatusCode initialize() override
initialize
TrigTauMonitorSingleAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
void fillHitZVars(const EventContext &ctx, const std::string &trigger, const std::vector< const xAOD::TauJet * > &tau_vec, const std::string &nProng) const
StatusCode createKeys(const VarPropertyMap &var_names_map)
Gaudi::Property< VarPropertyMap > m_monitoredHLTIdScores
void fillIDInputVars(const std::string &trigger, const std::vector< const xAOD::TauJet * > &tau_vec, const std::string &nProng, bool online) const
Gaudi::Property< std::map< std::string, std::pair< std::string, std::string > > > m_monitoredOfflineIdScores
virtual StatusCode processEvent(const EventContext &ctx) const override
Gaudi::Property< VarPropertyMap > m_monitoredHLTCaloHitsPreselIdScores
void fillHLTEfficiencies(const EventContext &ctx, const std::string &trigger, const bool l1_accept_flag, const std::vector< const xAOD::TauJet * > &offline_tau_vec, const std::vector< const xAOD::TauJet * > &online_tau_vec, const std::string &nProng) const
Gaudi::Property< VarPropertyMap > m_monitoredHLTHitZVars
Gaudi::Property< unsigned int > m_offline_tau_id
void fillVarPairs(const EventContext &ctx, ToolHandle< GenericMonitoringTool > &mon_group, const VarPropertyMap::mapped_type &vars, const std::string &category, const std::string &match_var_name, const std::string &mon_var_1_name, const std::string &mon_var_2_name, const std::vector< const xAOD::TauJet * > &tau_vec) const
std::map< std::string, std::map< std::string, std::pair< std::string, std::string > > > VarPropertyMap
void fillIDCluster(const std::string &trigger, const std::vector< const xAOD::TauJet * > &tau_vec, bool online) const
Gaudi::Property< bool > m_doOfflineTausDistributions
void fillBasicVars(const EventContext &ctx, const std::string &trigger, const std::vector< const xAOD::TauJet * > &tau_vec, const std::string &nProng, bool online) const
void fillIDTrack(const std::string &trigger, const std::vector< const xAOD::TauJet * > &tau_vec, bool online) const
std::vector< TLorentzVector > getRoIsVector(const EventContext &ctx, const std::string &trigger) const
bool retrieveMoment(MomentType type, double &value) const
Retrieve individual moment.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
@ SECOND_LAMBDA
Second Moment in .
@ SECOND_R
Second Moment in .
@ CENTER_LAMBDA
Shower depth at Cluster Centroid.
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Class providing the definition of the 4-vector interface.
virtual double phi() const
The azimuthal angle ( ) of the particle.
double ptDetectorAxis() const
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition TauJet_v3.cxx:96
virtual double pt() const
The transverse momentum ( ) of the particle.
bool detail(TauJetParameters::Detail detail, int &value) const
Get and set values of common details variables via enum.
const TauTrack * track(size_t i, TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged, int *container_index=0) const
Get the pointer to a given tauTrack associated with this tau /*container index needed by trackNonCons...
const Vertex * vertex() const
std::vector< const IParticle * > clusters() const
double ptJetSeed() const
size_t nTracksIsolation() const
std::vector< const TauTrack * > allTracks() const
Get the v<const pointer> to all tracks associated with this tau, regardless of classification.
virtual double eta() const
The pseudorapidity ( ) of the particle.
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
float d0SigTJVA() const
float z() const
Returns the z position.
float y() const
Returns the y position.
float x() const
Returns the x position.
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.
virtual float lbAverageInteractionsPerCrossing(const EventContext &ctx=Gaudi::Hive::currentContext()) const
Calculate the average mu, i.e.
bool match(std::string s1, std::string s2)
match the individual directories of two strings
Definition hcg.cxx:357
ValuesCollection< T > Collection(std::string name, const T &collection)
Declare a monitored (double-convertible) collection.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
@ centFrac
Get centrality fraction.
Definition TauDefs.h:200
@ dRmax
Get maximal dR of tracks associated to calo-seeded tau.
Definition TauDefs.h:226
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
TauTrack_v1 TauTrack
Definition of the current version.
Definition TauTrack.h:16
TauJet_v3 TauJet
Definition of the current "tau version".
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
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
@ numberOfSCTDeadSensors
number of dead SCT sensors crossed [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].