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 const std::string jetName{"OfflineTauJets"};
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
36 key,
37 std::make_pair(
40 )
41 );
42 ATH_CHECK(m_monitoredVarPairsDecorHandleKeys.at(jetName).at(key).first.initialize());
43 ATH_CHECK(m_monitoredVarPairsDecorHandleKeys.at(jetName).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(ctx, 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(ctx, 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(ctx, 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 const 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, 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 const 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 const 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 //coverity[UNNECESSARY_STRING_COPY:FALSE]
326 static const SG::ConstAccessor< std::vector<ElementLink<xAOD::TauTrackContainer>> > tauTrackAcc("tauTrackLinks");
327 bool linksValid = true;
328 for(const ElementLink<xAOD::TauTrackContainer>& trackEL : tauTrackAcc(*tau)) {
329 if(!trackEL.isValid()) {
330 linksValid = false;
331 break;
332 }
333 }
334 if(!linksValid) {
335 ATH_MSG_WARNING("Invalid track element links from TauJet in " << trigger);
336 continue;
337 }
338
339 auto tracks = tau->allTracks();
340 std::sort(tracks.begin(), tracks.end(), [](const xAOD::TauTrack* lhs, const xAOD::TauTrack* rhs){ return lhs->pt() > rhs->pt(); });
341
342 auto n_track = Monitored::Scalar<int>("n_track", tracks.size());
343
344 auto track_pt_log = Monitored::Collection("track_pt_log", tracks, [](const xAOD::TauTrack *track){ return std::log10(track->pt()); });
345 auto track_eta = Monitored::Collection("track_eta", tracks, [](const xAOD::TauTrack *track){ return track->eta(); });
346 auto track_phi = Monitored::Collection("track_phi", tracks, [](const xAOD::TauTrack *track){ return track->phi(); });
347
348 auto track_dEta = Monitored::Collection("track_dEta", tracks, [&tau](const xAOD::TauTrack *track){ return track->eta() - tau->eta(); });
349 auto track_dPhi = Monitored::Collection("track_dPhi", tracks, [&tau](const xAOD::TauTrack *track){ return track->p4().DeltaPhi(tau->p4()); });
350
351 auto track_z0sinthetaTJVA_abs_log = Monitored::Collection("track_z0sinthetaTJVA_abs_log", tracks, [](const xAOD::TauTrack *track){return track->z0sinthetaTJVA(); });
352 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); });
353
354 auto track_nIBLHitsAndExp = Monitored::Collection("track_nIBLHitsAndExp", tracks, [](const xAOD::TauTrack *track){
355 uint8_t inner_pixel_hits, inner_pixel_exp;
356 const auto success1_innerPixel_hits = track->track()->summaryValue(inner_pixel_hits, xAOD::numberOfInnermostPixelLayerHits);
357 const auto success2_innerPixel_exp = track->track()->summaryValue(inner_pixel_exp, xAOD::expectInnermostPixelLayerHit);
358 float detail = -999;
359 if(success1_innerPixel_hits && success2_innerPixel_exp) { detail = inner_pixel_exp ? inner_pixel_hits : 1.; };
360 return detail;
361 });
362 auto track_nPixelHitsPlusDeadSensors = Monitored::Collection("track_nPixelHitsPlusDeadSensors", tracks, [](const xAOD::TauTrack *track){
363 uint8_t pixel_hits, pixel_dead;
364 const auto success1_pixel_hits = track->track()->summaryValue(pixel_hits, xAOD::numberOfPixelHits);
365 const auto success2_pixel_dead = track->track()->summaryValue(pixel_dead, xAOD::numberOfPixelDeadSensors);
366 float detail = -999;
367 if(success1_pixel_hits && success2_pixel_dead) { detail = pixel_hits + pixel_dead; };
368 return detail;
369 });
370 auto track_nSCTHitsPlusDeadSensors = Monitored::Collection("track_nSCTHitsPlusDeadSensors", tracks, [](const xAOD::TauTrack *track){
371 uint8_t sct_hits, sct_dead;
372 const auto success1_sct_hits = track->track()->summaryValue(sct_hits, xAOD::numberOfSCTHits);
373 const auto success2_sct_dead = track->track()->summaryValue(sct_dead, xAOD::numberOfSCTDeadSensors);
374 float detail = -999;
375 if(success1_sct_hits && success2_sct_dead) { detail = sct_hits + sct_dead; };
376 return detail;
377 });
378
379 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);
380 }
381
382 ATH_MSG_DEBUG("After fill ID input Track: " << trigger);
383}
384
385
386void TrigTauMonitorSingleAlgorithm::fillIDCluster(const std::string& trigger, const std::vector<const xAOD::TauJet*>& tau_vec, bool online) const
387{
388 ATH_MSG_DEBUG("Fill ID input Cluster: " << trigger << " for online/offline " << online);
389
390 const auto & monGroup = getGroup(trigger+"_ID_"+(online ? "HLT" : "Offline")+"_InputCluster");
391
392 for(const auto *tau : tau_vec){
393 auto cluster_pt_jetseed_log = Monitored::Collection("cluster_pt_jetseed_log", tau_vec, [](const xAOD::TauJet* tau){ return std::log10(tau->ptJetSeed()); });
394
395 std::vector<const xAOD::CaloCluster*> clusters;
396 for(const xAOD::IParticle* particle : tau->clusters()) {
397 const xAOD::CaloCluster* cluster = static_cast<const xAOD::CaloCluster*>(particle);
398 clusters.push_back(cluster);
399 }
400 std::sort(clusters.begin(), clusters.end(), [](const xAOD::CaloCluster *lhs, const xAOD::CaloCluster *rhs){ return lhs->et() > rhs->et(); });
401
402 auto n_cluster = Monitored::Scalar<int>("n_cluster", 0);
403 n_cluster = clusters.size();
404
405 auto cluster_et_log = Monitored::Collection("cluster_et_log",clusters, [](const xAOD::CaloCluster *cluster){ return std::log10( cluster->et()); });
406 auto cluster_eta = Monitored::Collection("cluster_eta", clusters, [](const xAOD::CaloCluster *cluster){ return cluster->eta(); });
407 auto cluster_phi = Monitored::Collection("cluster_phi", clusters, [](const xAOD::CaloCluster *cluster){ return cluster->phi(); });
408 auto cluster_dEta = Monitored::Collection("cluster_dEta", clusters, [&tau](const xAOD::CaloCluster *cluster){ return cluster->eta() - tau->eta(); });
409 auto cluster_dPhi = Monitored::Collection("cluster_dPhi", clusters, [&tau](const xAOD::CaloCluster *cluster){ return cluster->p4().DeltaPhi(tau->p4()); });
410 auto cluster_SECOND_R_log10 = Monitored::Collection("cluster_SECOND_R_log10", clusters, [](const xAOD::CaloCluster *cluster){
411 double detail = -999;
412 const auto success_SECOND_R = cluster->retrieveMoment(xAOD::CaloCluster::MomentType::SECOND_R,detail);
413 if(success_SECOND_R) detail = std::log10(detail + 0.1);
414 return detail;
415 });
416
417 auto cluster_SECOND_LAMBDA_log10 = Monitored::Collection("cluster_SECOND_LAMBDA_log10", clusters, [](const xAOD::CaloCluster *cluster){
418 double detail = -999;
419 const auto success_SECOND_LAMBDA = cluster->retrieveMoment(xAOD::CaloCluster::MomentType::SECOND_LAMBDA, detail);
420 if(success_SECOND_LAMBDA) detail = std::log10(detail + 0.1);
421 return detail;
422 });
423
424 auto cluster_CENTER_LAMBDA_log10 = Monitored::Collection("cluster_CENTER_LAMBDA_log10", clusters, [](const xAOD::CaloCluster *cluster){
425 double detail = -999;
426 const auto success_CENTER_LAMBDA = cluster->retrieveMoment(xAOD::CaloCluster::MomentType::CENTER_LAMBDA, detail);
427 if(success_CENTER_LAMBDA) detail = std::log10(detail + 1e-6);
428 return detail;
429 });
430
431 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);
432 }
433
434 ATH_MSG_DEBUG("After fill ID input Cluster: " << trigger);
435}
436
437
438void TrigTauMonitorSingleAlgorithm::fillBasicVars(const EventContext& ctx, const std::string& trigger, const std::vector<const xAOD::TauJet*>& tau_vec, const std::string& nProng, bool online) const
439{
440 ATH_MSG_DEBUG("Fill Basic Variables: " << trigger);
441
442 const auto & monGroup = getGroup(trigger+"_"+(online ? "HLT" : "Offline")+"_basicVars_"+nProng);
443
444 auto Pt = Monitored::Collection("Pt", tau_vec, [](const xAOD::TauJet* tau){ return tau->pt()/Gaudi::Units::GeV; });
445 auto Eta = Monitored::Collection("Eta", tau_vec, [](const xAOD::TauJet* tau){ return tau->eta(); });
446 auto Phi = Monitored::Collection("Phi", tau_vec, [](const xAOD::TauJet* tau){ return tau->phi(); });
447
448 auto nTrack = Monitored::Collection("nTrack", tau_vec, [](const xAOD::TauJet* tau){
449 int nTrack = -1;
451 return nTrack;
452 });
453 auto nIsoTrack = Monitored::Collection("nIsoTrack", tau_vec, [](const xAOD::TauJet* tau){ return tau->nTracksIsolation(); });
454
455 auto averageMu = Monitored::Scalar<float>("averageMu", 0.0);
456 averageMu = lbAverageInteractionsPerCrossing(ctx);
457
458 auto TauVertexX = Monitored::Collection("TauVertexX", tau_vec, [](const xAOD::TauJet* tau){
459 double vtx = -999;
460 if(tau->vertex() != nullptr) vtx = tau->vertex()->x();
461 return vtx;
462 });
463 auto TauVertexY = Monitored::Collection("TauVertexY", tau_vec, [](const xAOD::TauJet* tau){
464 double vty = -999;
465 if(tau->vertex() != nullptr) vty = tau->vertex()->y();
466 return vty;
467 });
468 auto TauVertexZ = Monitored::Collection("TauVertexZ", tau_vec, [](const xAOD::TauJet* tau){
469 double vtz = -999;
470 if(tau->vertex() != nullptr) vtz = tau->vertex()->z();
471 return vtz;
472 });
473
474 fill(monGroup, Pt, Eta, Phi, nTrack, nIsoTrack, averageMu, TauVertexX, TauVertexY, TauVertexZ);
475
476 ATH_MSG_DEBUG("After fill Basic variables: " << trigger);
477}
478
479
480void TrigTauMonitorSingleAlgorithm::fillIDScores(const EventContext& ctx, const std::string& trigger, const std::vector<const xAOD::TauJet*>& tau_vec, const std::string& nProng, bool online) const
481{
482 ATH_MSG_DEBUG("Fill TauID Scores: " << trigger);
483
484 const TrigTauInfo& info = getTrigInfo(trigger);
485
486 if(online) {
487 if(info.getHLTTauType() == "ptonly") return;
488 const bool monitor_ids = m_monitoredHLTIdScores.value().find(info.getHLTTauLegContainerSfx()) != m_monitoredHLTIdScores.value().end();
489 const bool monitor_ch_presel = m_monitoredHLTCaloHitsPreselIdScores.value().find(info.getHLTTauLegContainerSfx()) != m_monitoredHLTCaloHitsPreselIdScores.value().end();
490 if(!monitor_ids && !monitor_ch_presel) return;
491
492 const auto & monGroup = getGroup(trigger+"_HLT_IDScores_"+nProng);
493
494 if(monitor_ids) {
495 std::string match = info.getHLTTauID();
496 if(match == "idperf" || match == "perf") match.clear(); // Monitor all
497
498 fillVarPairs(ctx, monGroup, m_monitoredHLTIdScores.value().at(info.getHLTTauLegContainerSfx()), info.getHLTTauLegContainerSfx(), match, "TauIDScore", "TauIDScoreSigTrans", tau_vec);
499 }
500
501 if(monitor_ch_presel) {
502 std::string match = info.getHLTTauCaloHitsPreselectionID();
503 if(match == "idperfCHP") match.clear(); // Monitor all
504
505 fillVarPairs(ctx, monGroup, m_monitoredHLTCaloHitsPreselIdScores.value().at(info.getHLTTauLegContainerSfx()), info.getHLTTauLegContainerSfx(), match, "TauIDScore", "TauIDScoreSigTrans", tau_vec);
506 }
507
508 } else {
509 if(m_monitoredOfflineIdScores.value().size() == 0) return;
510
511 const auto & monGroup = getGroup(trigger+"_Offline_IDScores_"+nProng);
512 fillVarPairs(ctx, monGroup, m_monitoredOfflineIdScores.value(), "OfflineTauJets", "", "TauIDScore", "TauIDScoreSigTrans", tau_vec);
513 }
514
515 ATH_MSG_DEBUG("After fill TauID Scores: " << trigger);
516}
517
518
520 const ToolHandle<GenericMonitoringTool>& mon_group,
521 const VarPropertyMap::mapped_type& vars,
522 const std::string& category,
523 const std::string& match_var_name,
524 const std::string& mon_var_1_name,
525 const std::string& mon_var_2_name,
526 const std::vector<const xAOD::TauJet*>& tau_vec) const
527{
528 for(const auto& [key, p] : vars) {
529 if(!match_var_name.empty() && match_var_name != key) continue;
530
531 const auto& [var_1_key, var_2_key] = m_monitoredVarPairsDecorHandleKeys.at(category).at(key);
532 SG::ReadDecorHandle<xAOD::TauJetContainer, float> var_1_handle(var_1_key, ctx);
533 SG::ReadDecorHandle<xAOD::TauJetContainer, float> var_2_handle(var_2_key, ctx);
534
535 // Skip if both the Score and ScoreSigTrans aren't available
536 if(!var_1_handle.isAvailable() || !var_2_handle.isAvailable()) continue;
537
538 std::vector<float> var_1, var_2;
539 for(const xAOD::TauJet* tau : tau_vec) {
540 var_1.push_back(var_1_handle(*tau));
541 var_2.push_back(var_2_handle(*tau));
542 }
543
544 auto mon_var_1 = Monitored::Collection(key + "_" + mon_var_1_name, var_1);
545 auto mon_var_2 = Monitored::Collection(key + "_" + mon_var_2_name, var_2);
546 fill(mon_group, mon_var_1, mon_var_2);
547 }
548}
549
550
551void TrigTauMonitorSingleAlgorithm::fillHitZVars(const EventContext& ctx, const std::string& trigger, const std::vector<const xAOD::TauJet*>& tau_vec, const std::string& nProng) const
552{
553 ATH_MSG_DEBUG("Fill HitZ Variables: " << trigger);
554
555 const TrigTauInfo& info = getTrigInfo(trigger);
556 if(m_monitoredHLTHitZVars.value().find(info.getHLTTauLegContainerSfx()) == m_monitoredHLTHitZVars.value().end()) return;
557 if(info.getHLTTauHitZAlg().empty() && info.getHLTTauCaloHitsPreselectionID().empty()) return;
558
559 const auto & monGroup = getGroup(trigger+"_HLT_HitZ_"+nProng);
560
561 for(const auto& [key, p] : m_monitoredHLTHitZVars.value().at(info.getHLTTauLegContainerSfx())) {
562 const auto& [z0_key, z0_sigma_key] = m_monitoredVarPairsDecorHandleKeys.at(info.getHLTTauLegContainerSfx()).at(key);
564 SG::ReadDecorHandle<xAOD::TauJetContainer, float> z0_sigma_handle(z0_sigma_key, ctx);
565
566 // Skip if both the Score and ScoreSigTrans aren't available
567 if(!z0_handle.isAvailable() || !z0_sigma_handle.isAvailable()) continue;
568
569 std::vector<float> z0, z0_sigma, z0_delta, z0_delta_sig;
570 for(const xAOD::TauJet* tau : tau_vec) {
571 z0.push_back(z0_handle(*tau));
572 z0_sigma.push_back(z0_sigma_handle(*tau));
573
574 if(tau->vertex() != nullptr) {
575 const float tau_z = tau->vertex()->z();
576 z0_delta.push_back(z0_handle(*tau) - tau_z);
577 z0_delta_sig.push_back(z0_sigma_handle(*tau) ? (z0_handle(*tau) - tau_z) / z0_sigma_handle(*tau) : -999);
578 } else {
579 z0_delta.push_back(-999);
580 z0_delta_sig.push_back(-999);
581 }
582 }
583
584 auto mon_z0 = Monitored::Collection(key + "_z0", z0);
585 auto mon_z0_sigma = Monitored::Collection(key + "_z0_sigma", z0_sigma);
586 auto mon_z0_delta = Monitored::Collection(key + "_z0_delta", z0_delta);
587 auto mon_z0_delta_sig = Monitored::Collection(key + "_z0_delta_sig", z0_delta_sig);
588 fill(monGroup, mon_z0, mon_z0_sigma, mon_z0_delta, mon_z0_delta_sig);
589 }
590
591 ATH_MSG_DEBUG("After fill HitZ Variables: " << trigger);
592}
593
594
595std::vector<TLorentzVector> TrigTauMonitorSingleAlgorithm::getRoIsVector(const EventContext& ctx, const std::string& trigger) const
596{
597 std::vector<TLorentzVector> ret;
598
599 const TrigTauInfo& info = getTrigInfo(trigger);
600
601 TLorentzVector v;
602 if(info.getL1TauType() == "eTAU") {
603 for(const xAOD::eFexTauRoI* roi : getL1eTAUs(ctx, info.getL1TauItem())) {
604 v.SetPtEtaPhiM(roi->et(), roi->eta(), roi->phi(), 0);
605 ret.push_back(v);
606 }
607 } else if(info.getL1TauType() == "cTAU") {
608 for(const auto& [eTau_roi, jTau_roi] : getL1cTAUs(ctx, info.getL1TauItem())) {
609 v.SetPtEtaPhiM(eTau_roi->et(), eTau_roi->eta(), eTau_roi->phi(), 0);
610 ret.push_back(v);
611 }
612 }
613
614 return ret;
615}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
Handle class for reading a decoration on an object.
const ToolHandle< GenericMonitoringTool > & getGroup(std::string_view 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
std::unordered_map< std::string, SG::ReadHandleKey< xAOD::TauJetContainer >, CxxUtils::TransparentStringHash, std::equal_to<> > m_hltTauJetKeysMap
Gaudi::Property< bool > m_do_efficiency_plots
const SG::ReadHandleKey< xAOD::TauJetContainer > & getOnlineContainerKey(const std::string &container_suffix) const
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
bool matchObjects(const T1 *tau, const std::vector< const T2 * > &tau_vec, float threshold) const
Gaudi::Property< std::vector< std::string > > m_triggers
std::tuple< std::vector< const xAOD::TauJet * >, std::vector< const xAOD::TauJet * >, std::vector< const xAOD::TauJet * > > classifyOnlineTaus(const EventContext &ctx, const std::vector< const xAOD::TauJet * > &taus, const float threshold=0.0) const
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< 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
Gaudi::Property< bool > m_do_variable_plots
SG::ReadHandleKey< xAOD::TauJetContainer > m_offlineTauJetKey
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
void fillVarPairs(const EventContext &ctx, const 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
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
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) 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:359
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".
Definition TauJet.h:17
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].