ATLAS Offline Software
Loading...
Searching...
No Matches
tauMonitorAlgorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include "GaudiKernel/SystemOfUnits.h"
10#include <algorithm>
11
12using Gaudi::Units::GeV;
13using namespace Monitored;
14
16 ISvcLocator *pSvcLocator)
17 : AthMonitorAlgorithm(name, pSvcLocator)
18{}
19
21
40
41StatusCode tauMonitorAlgorithm::fillHistograms(const EventContext &ctx) const {
42
44
45 if (!taus.isValid()) {
46 ATH_MSG_ERROR("evtStore() does not contain tau Collection with name "
48 return StatusCode::FAILURE;
49 }
50
51 auto [shallowTaus, shallowTausAux] = xAOD::shallowCopy(*taus,ctx);
52
53 const int lowerEtThreshold = 15;
54 const int higherEtThreshold = 75;
55 const auto & tool = getGroup(m_kinGroupName);
56
57 auto tauEta = Monitored::Scalar<float>("tauEta", 0.0);
58
59 auto tauPhi = Monitored::Scalar<float>("tauPhi", 0.0);
60 auto tauEt = Monitored::Scalar<float>("tauEt", 0.0);
61
62 std::string tauid = "";
63 if(m_TauContainerKey.key().find("TauMonTauJets") != std::string::npos)
64 {
65 tauid = "GNTau";
66 } else {
67 tauid = "RNN";
68 }
69
70 auto tauEtEt15Loose = Monitored::Scalar<float>("tauEtEt15"+tauid+"Loose", 0.0);
71 auto panModeEt15Loose =
72 Monitored::Scalar<float>("panModeEt15"+tauid+"Loose", 0.0);
73 auto panModeSubstructure =
74 Monitored::Scalar<float>("panModeSubstructure", 0.0);
75
76 auto tauPhiEt15 = Monitored::Scalar<float>("tauPhiEt15", 0.0);
77 auto tauEtaEt15 = Monitored::Scalar<float>("tauEtaEt15", 0.0);
78
79 auto tauPhiEt15Loose = Monitored::Scalar<float>("tauPhiEt15"+tauid+"Loose", 0.0);
80 auto tauEtaEt15Loose = Monitored::Scalar<float>("tauEtaEt15"+tauid+"Loose", 0.0);
81
82 auto tauCharge = Monitored::Scalar<int>("tauCharge", 0.0);
83 auto JetScore = Monitored::Scalar<float>(tauid+"JetScore", 0.0);
84 auto JetScoreSigTrans =
85 Monitored::Scalar<float>(tauid+"JetScoreSigTrans", 0.0);
86
87 auto RNNEleScore = Monitored::Scalar<float>("RNNEleScore", 0.0);
88 auto RNNEleScoreSigTrans =
89 Monitored::Scalar<float>("RNNEleScoreSigTrans", 0.0);
90
91 auto NumTracks = Monitored::Scalar<int>("NumTracks", 0.0);
92 auto NumTracksEt15Loose =
93 Monitored::Scalar<int>("NumTracksEt15"+tauid+"Loose", 0.0);
94
95 auto nTauCandidates = Monitored::Scalar<int>("nTauCandidates", 0.0);
96 auto nHighPtTauCandidates =
97 Monitored::Scalar<int>("nHighPtTauCandidates", 0.0);
98 auto nClusters = Monitored::Scalar<int>("nClusters", 0.0);
99 auto nClustersEt15Loose =
100 Monitored::Scalar<int>("nClustersEt15"+tauid+"Loose", 0.0);
101
102 auto tauEtLoose = Monitored::Scalar<float>("tauEt"+tauid+"Loose", 0.0);
103 auto tauEtaLoose = Monitored::Scalar<float>("tauEta"+tauid+"Loose", 0.0);
104 auto tauPhiLoose = Monitored::Scalar<float>("tauPhi"+tauid+"Loose", 0.0);
105 auto NumTracksLoose = Monitored::Scalar<float>("NumTracks"+tauid+"Loose", 0.0);
106
107 auto tauEtMedium = Monitored::Scalar<float>("tauEt"+tauid+"Medium", 0.0);
108 auto tauEtaMedium = Monitored::Scalar<float>("tauEta"+tauid+"Medium", 0.0);
109 auto tauPhiMedium = Monitored::Scalar<float>("tauPhi"+tauid+"Medium", 0.0);
110 auto NumTracksMedium = Monitored::Scalar<float>("NumTracks"+tauid+"Medium", 0.0);
111
112 auto tauEtTight = Monitored::Scalar<float>("tauEt"+tauid+"Tight", 0.0);
113 auto tauEtaTight = Monitored::Scalar<float>("tauEta"+tauid+"Tight", 0.0);
114 auto tauPhiTight = Monitored::Scalar<float>("tauPhi"+tauid+"Tight", 0.0);
115 auto NumTracksTight = Monitored::Scalar<float>("NumTracks"+tauid+"Tight", 0.0);
116
117 auto LB = Monitored::Scalar<int>("LB", 0.0);
118
119 auto isolFrac = Monitored::Scalar<float>("isolFrac", 0.0);
120 auto etEMAtEMScale = Monitored::Scalar<float>("etEMAtEMScale", 0.0);
121
122 auto etHadAtEMScale = Monitored::Scalar<float>("etHadAtEMScale", 0.0);
123 auto centFrac = Monitored::Scalar<float>("centFrac", 0.0);
124 auto jetSeedEta = Monitored::Scalar<float>("jetSeedEta", 0.0);
125 auto jetSeedPhi = Monitored::Scalar<float>("jetSeedPhi", 0.0);
126 auto jetSeedPt = Monitored::Scalar<float>("jetSeedPt", 0.0);
127
128 auto muonVeto = Monitored::Scalar<float>("muonVeto", 0.0);
129
130 auto tauLoose = Monitored::Scalar<float>("tau"+tauid+"Loose", 0.0);
131 auto tauMedium = Monitored::Scalar<float>("tau"+tauid+"Medium", 0.0);
132 auto tauTight = Monitored::Scalar<float>("tau"+tauid+"Tight", 0.0);
133
134 auto PSSFrac = Monitored::Scalar<float>("PSSFrac", 0.0);
135 auto EMFrac = Monitored::Scalar<float>("EMFrac", 0.0);
136
137 auto EMFracTrk = Monitored::Scalar<float>("EMFracTrk", 0.0);
138 auto nNeutPFO = Monitored::Scalar<float>("nNeutPFO", 0.0);
139 auto nShot = Monitored::Scalar<float>("nShot", 0.0);
140
141 auto BDTScoreAsP0 = Monitored::Scalar<float>("BDTScoreAsP0", 0.0);
142 auto dRmax = Monitored::Scalar<float>("dRmax", 0.0);
143
144 auto ipSigLeadTrk = Monitored::Scalar<float>("ipSigLeadTrk", 0.0);
145 auto massTrkSys = Monitored::Scalar<float>("massTrkSys", 0.0);
146 auto etOverPtLeadTrack = Monitored::Scalar<float>("etOverPtLeadTrack", 0.0);
147 auto ptRatioEflowApprox = Monitored::Scalar<float>("ptRatioEflowApprox", 0.0);
148 auto trFlightPathSig = Monitored::Scalar<float>("trFlightPathSig", 0.0);
149 auto trkAvgDist = Monitored::Scalar<float>("trkAvgDist", 0.0);
150
151 auto panEta = Monitored::Scalar<float>("panEta", 0.0);
152 auto panPhi = Monitored::Scalar<float>("panPhi", 0.0);
153 auto panPt = Monitored::Scalar<float>("panPt", 0.0);
154 auto d0 = Monitored::Scalar<float>("d0", 0.0);
155 auto dRJetSeedAxis = Monitored::Scalar<float>("dRJetSeedAxis", 0.0);
156 auto z0 = Monitored::Scalar<float>("z0", 0.0);
157
158 auto etaTrack = Monitored::Scalar<float>("etaTrack", 0.0);
159 auto ptTrack = Monitored::Scalar<float>("ptTrack", 0.0);
160 auto phiTrack = Monitored::Scalar<float>("phiTrack", 0.0);
161 auto leadTrkPt = Monitored::Scalar<float>("leadTrkPt", 0.0);
162 auto nHighPtTaus = Monitored::Scalar<float>("nHighPtTaus", 0.0);
163 auto numberOfTRTHighThresholdHits =
164 Monitored::Scalar<float>("numberOfTRTHighThresholdHits", 0.0);
165 auto numberOfTRTHighThresholdOutliers =
166 Monitored::Scalar<float>("numberOfTRTHighThresholdOutliers", 0.0);
167 auto numberOfTRTHits = Monitored::Scalar<float>("numberOfTRTHits", 0.0);
168 auto numberOfTRTOutliers =
169 Monitored::Scalar<float>("numberOfTRTOutliers", 0.0);
170 auto ipZ0SinThetaSigLeadTrk =
171 Monitored::Scalar<float>("ipZ0SinThetaSigLeadTrk", 0.0);
172 auto numberOfPixelHits = Monitored::Scalar<float>("numberOfPixelHits", 0.0);
173 auto numberOfPixelSharedHits =
174 Monitored::Scalar<float>("numberOfPixelSharedHits", 0.0);
175 auto numberOfSCTHits = Monitored::Scalar<float>("numberOfSCTHits", 0.0);
176 auto numberOfSCTSharedHits =
177 Monitored::Scalar<float>("numberOfSCTSharedHits", 0.0);
178 auto rConv = Monitored::Scalar<float>("rConv", 0.0);
179 auto rConvII = Monitored::Scalar<float>("rConvII", 0.0);
180
181 // trackLogSeedJetPt
182 auto trackLogSeedJetPt = Monitored::Scalar<float>("trackLogSeedJetPt", 0.0);
183 auto trackLogPt = Monitored::Scalar<float>("trackLogPt", 0.0);
184 auto trackEta = Monitored::Scalar<float>("trackEta", 0.0);
185 auto trackd0TJVA = Monitored::Scalar<float>("trackd0TJVA", 0.0);
186 auto trackZ0SinthetaTJVA =
187 Monitored::Scalar<float>("trackZ0SinthetaTJVA", 0.0);
188 auto trackD0SigTJVA = Monitored::Scalar<float>("trackD0SigTJVA", 0.0);
189 auto trackZ0sinthetaSigTJVA =
190 Monitored::Scalar<float>("trackZ0sinthetaSigTJVA", 0.0);
191 auto trackCharge = Monitored::Scalar<float>("trackCharge", 0.0);
192 auto trackqOverP = Monitored::Scalar<float>("trackqOverP", 0.0);
193 auto trackLogRConv = Monitored::Scalar<float>("trackLogRConv", 0.0);
194 auto trackTanhRConvII = Monitored::Scalar<float>("trackTanhRConvII", 0.0);
195 auto trackPtRatioSeedJet =
196 Monitored::Scalar<float>("trackPtRatioSeedJet", 0.0);
197 auto trackdRJetSeedAxis = Monitored::Scalar<float>("trackdRJetSeedAxis", 0.0);
198 auto trackNInnermostPixHits =
199 Monitored::Scalar<float>("trackNInnermostPixHits", 0.0);
200 auto trackNPixHits = Monitored::Scalar<float>("trackNPixHits", 0.0);
201 auto trackNSiHits = Monitored::Scalar<float>("trackNSiHits", 0.0);
202 auto trackeProbabilityHT =
203 Monitored::Scalar<float>("trackeProbabilityHT", 0.0);
204 auto trackeProbabilityNN =
205 Monitored::Scalar<float>("trackeProbabilityNN", 0.0);
206 auto trackeProbabilityHTorNN =
207 Monitored::Scalar<float>("trackeProbabilityHTorNN", 0.0);
208 auto trackIdScoreCharged = Monitored::Scalar<float>("track", 0.0);
209 auto trackIdScoreIso = Monitored::Scalar<float>("track", 0.0);
210 auto trackIdScoreConv = Monitored::Scalar<float>("track", 0.0);
211 auto trackIdScoreFake = Monitored::Scalar<float>("track", 0.0);
212
213 auto clusterLogEt = Monitored::Scalar<float>("clusterLogEt", 0.0);
214 auto clusterEta = Monitored::Scalar<float>("clusterEta", 0.0);
215 auto clusterPhi = Monitored::Scalar<float>("clusterPhi", 0.0);
216 auto clusterSecondR = Monitored::Scalar<float>("clusterSecondR", 0.0);
217 auto clusterSecondLambda =
218 Monitored::Scalar<float>("clusterSecondLambda", 0.0);
219 auto clusterCenterLambda =
220 Monitored::Scalar<float>("clusterCenterLambda", 0.0);
221 auto clusterFirstEngDens =
222 Monitored::Scalar<float>("clusterFirstEngDens", 0.0);
223 auto clusterEMproba = Monitored::Scalar<float>("clusterEMproba", 0.0);
224 auto clustersMeanCenterLambda =
225 Monitored::Scalar<float>("clustersMeanCenterLambda", 0.0);
226 auto clustersMeanFirstEngDens =
227 Monitored::Scalar<float>("clustersMeanFirstEngDens", 0.0);
228 auto clustersMeanEMProbability =
229 Monitored::Scalar<float>("clustersMeanEMProbability", 0.0);
230 auto clustersMeanSecondLambda =
231 Monitored::Scalar<float>("clustersMeanSecondLambda", 0.0);
232 auto clustersMeanPresamplerFrac =
233 Monitored::Scalar<float>("clustersMeanPresamplerFrac", 0.0);
234 auto clustersPFOEngRelDiff =
235 Monitored::Scalar<float>("clustersPFOEngRelDiff", 0.0);
236
237 nTauCandidates = 0;
238
239 // access decorations
244
245 static const SG::ConstAccessor<char> passThinningAcc("passThinning");
246 static const SG::ConstAccessor<float> scoreAcc("GNTauScore_v0prune");
247 static const SG::ConstAccessor<float> EMFracFixedAcc("EMFracFixed");
248 static const SG::ConstAccessor<float> d0SigTJVAAcc("d0SigTJVA");
249 static const SG::ConstAccessor<float> z0sinthetaSigTJVAAcc("z0sinthetaSigTJVA");
250 static const SG::ConstAccessor<float> acc_trackScoreCharged("rnn_chargedScore");
251 static const SG::ConstAccessor<float> acc_trackScoreIso("rnn_isolationScore");
252 static const SG::ConstAccessor<float> acc_trackScoreConv("rnn_conversionScore");
253 static const SG::ConstAccessor<float> z0sinthetaTJVAAcc("z0sinthetaTJVA");
254 static const SG::ConstAccessor<float> eProbabilityNNAcc("eProbabilityNN");
255
256 static const SG::Accessor< xAOD::TauTrack::TrackParticleLinks_t>trackAcc("trackLinks");
257
258 for (const auto tau : *shallowTaus) {
259
260 if (!passThinningAcc.withDefault(*tau, true)) continue;
261
262 tauEta = tau->eta();
263 tauPhi = tau->phi();
264 tauEt = tau->pt() / GeV;
265 tauCharge = tau->charge();
266 NumTracks = tau->nTracks();
267 nClusters = tau->detail<int>(xAOD::TauJetParameters::numTopoClusters);
268 LB = GetEventInfo(ctx)->lumiBlock();
269
270 // calo
271 isolFrac = tau->detail<float>(xAOD::TauJetParameters::isolFrac);
272 etEMAtEMScale = tau->detail<float>(xAOD::TauJetParameters::etEMAtEMScale);
273 etHadAtEMScale = tau->detail<float>(xAOD::TauJetParameters::etHadAtEMScale);
274
275 centFrac = tau->detail<float>(xAOD::TauJetParameters::centFrac);
276 jetSeedEta = tau->etaJetSeed();
277 jetSeedPhi = tau->phiJetSeed();
278 jetSeedPt = tau->ptJetSeed() / GeV;
279
280 RNNEleScore = tau->discriminant(xAOD::TauJetParameters::TauID::RNNEleScore);
281 RNNEleScoreSigTrans =
283
284 muonVeto = tau->isTau(xAOD::TauJetParameters::MuonVeto);
285
286 // check to understand which TauID we can use
287 if( trans_score.isAvailable()) {
288
289 // we are using a special container decorated with GNTau
290 JetScore = scoreAcc(*tau);
291
292 JetScoreSigTrans = trans_score(*tau);
293
294 tauLoose = tauid_loose.isAvailable() ? tauid_loose(*tau) : -1234;
295
296 tauMedium = tauid_medium.isAvailable() ? tauid_medium(*tau) : -1234;
297
298 tauTight = tauid_tight.isAvailable() ? tauid_tight(*tau) : -1234;
299
300 } else{
301 // GNTau is not present -> use RNN based TauID
302 JetScore = tau->discriminant(xAOD::TauJetParameters::TauID::RNNJetScore);
303 JetScoreSigTrans =
305
306 tauLoose = tau->isTau(xAOD::TauJetParameters::JetRNNSigLoose);
307 tauMedium = tau->isTau(xAOD::TauJetParameters::JetRNNSigMedium);
308 tauTight = tau->isTau(xAOD::TauJetParameters::JetRNNSigTight);
309 }
310
311 dRmax = tau->detail<float>(xAOD::TauJetParameters::dRmax);
312 ptRatioEflowApprox =
314 trkAvgDist = tau->detail<float>(xAOD::TauJetParameters::trkAvgDist);
315
316 panEta = tau->etaPanTauCellBased();
317 panPhi = tau->phiPanTauCellBased();
318 panPt = tau->ptPanTauCellBased() / GeV; // GeV ;
319
320 // TauB/Identification/EleVetoBDTinputs
321 PSSFrac = tau->detail<float>(xAOD::TauJetParameters::PSSFraction);
322 EMFrac = EMFracFixedAcc(*tau);
323
324 // TauB/SubStructure
325 EMFracTrk = tau->detail<float>(xAOD::TauJetParameters::ChPiEMEOverCaloEME);
326 nNeutPFO = tau->nProtoNeutralPFOs();
327 nShot = tau->nShotPFOs();
328
329 int panModeDummy = -1;
330 int panModeSubstructureDummy = -1;
331
332 if (m_etaMin < std::abs(tauEta) && std::abs(tauEta) < m_etaMax) {
333
334 if( tauEt > lowerEtThreshold) {
335 nTauCandidates += 1;
336 }
337
338 if (tauEt > higherEtThreshold) {
339 nHighPtTauCandidates += 1;
340 nHighPtTaus += 1;
341 }
342
343 if (m_kinGroupName != "tauMonKinGroupGlobal" &&
344 tauEt > lowerEtThreshold && tauLoose) {
345
346 tauPhiEt15Loose = tau->phi();
347 tauEtaEt15Loose = tau->eta();
348 tauEtEt15Loose = tau->pt() / GeV;
349 nClustersEt15Loose =
351 NumTracksEt15Loose = tau->nTracks();
352
354 panModeDummy);
355 panModeEt15Loose = panModeDummy;
356 fill(tool, tauPhiEt15Loose, tauEtaEt15Loose,
357 nClustersEt15Loose, NumTracksEt15Loose, tauEtEt15Loose,
358 panModeEt15Loose);
359 }
360
361 if (m_kinGroupName != "tauMonKinGroupGlobal" && tauLoose) {
362 tauPhiLoose = tau->phi();
363 tauEtaLoose = tau->eta();
364 tauEtLoose = tau->pt() / GeV;
365 NumTracksLoose = tau->nTracks();
366
367 fill(tool, tauPhiLoose, tauEtaLoose, NumTracksLoose,
368 tauEtLoose);
369 }
370
371 if (m_kinGroupName != "tauMonKinGroupGlobal" && tauMedium) {
372 tauPhiMedium = tau->phi();
373 tauEtaMedium = tau->eta();
374 tauEtMedium = tau->pt() / GeV;
375 NumTracksMedium = tau->nTracks();
376
377 fill(tool, tauPhiMedium, tauEtaMedium, NumTracksMedium,
378 tauEtMedium);
379 }
380
381 if (m_kinGroupName != "tauMonKinGroupGlobal" && tauTight) {
382 tauPhiTight = tau->phi();
383 tauEtaTight = tau->eta();
384 tauEtTight = tau->pt() / GeV;
385 NumTracksTight = tau->nTracks();
386
387 fill(tool, tauPhiTight, tauEtaTight, NumTracksTight,
388 tauEtTight);
389 }
390
391
392 // tracks - old
393 if (tau->nTracks() != 0) {
394
395 massTrkSys =
396 tau->detail<float>(xAOD::TauJetParameters::massTrkSys) / GeV; // GeV
397 trFlightPathSig =
398 tau->detail<float>(xAOD::TauJetParameters::trFlightPathSig);
399
400 if (d0SigTJVAAcc.isAvailable(*tau->track(0))) {
401 ipSigLeadTrk = tau->track(0)->d0SigTJVA();
402 }
403 else {
404 ipSigLeadTrk = tau->detail<float>(xAOD::TauJetParameters::ipSigLeadTrk);
405 }
406
407 if (z0sinthetaSigTJVAAcc.isAvailable(*tau->track(0))) {
408 ipZ0SinThetaSigLeadTrk = tau->track(0)->z0sinthetaSigTJVA();
409 }
410 else {
411 ipZ0SinThetaSigLeadTrk = tau->detail<float>(xAOD::TauJetParameters::ipZ0SinThetaSigLeadTrk);
412 }
413
414 etOverPtLeadTrack =
415 tau->detail<float>(xAOD::TauJetParameters::etOverPtLeadTrk);
416 leadTrkPt = tau->detail<float>(xAOD::TauJetParameters::leadTrkPt) / GeV;
417
418 fill(tool, massTrkSys, etOverPtLeadTrack, trFlightPathSig,
419 ipSigLeadTrk, ipZ0SinThetaSigLeadTrk, leadTrkPt);
420
422 const xAOD::TrackParticle *track = tau->track(0)->track();
423 const Trk::Perigee perigee = track->perigeeParameters();
424
425 uint8_t dummy(0);
426
427 if (track->summaryValue(dummy, xAOD::numberOfSCTSharedHits)) {
428 numberOfSCTSharedHits = dummy;
429 fill(tool, numberOfSCTSharedHits);
430 }
431
432 if (track->summaryValue(dummy, xAOD::numberOfSCTHits)) {
433 numberOfSCTHits = dummy;
434 fill(tool, numberOfSCTHits);
435 }
436
437 if (track->summaryValue(dummy, xAOD::numberOfPixelSharedHits)) {
438 numberOfPixelSharedHits = dummy;
439 fill(tool, numberOfPixelSharedHits);
440 }
441
442 if (track->summaryValue(dummy, xAOD::numberOfPixelHits)) {
443 numberOfPixelHits = dummy;
444 fill(tool, numberOfPixelHits);
445 }
446 if (track->summaryValue(dummy, xAOD::numberOfTRTHighThresholdHits)) {
447 numberOfTRTHighThresholdHits = dummy;
448 fill(tool, numberOfTRTHighThresholdHits);
449 }
450 if (track->summaryValue(dummy,
452 numberOfTRTHighThresholdOutliers = dummy;
453 fill(tool, numberOfTRTHighThresholdOutliers);
454 }
455 if (track->summaryValue(dummy, xAOD::numberOfTRTHits)) {
456 numberOfTRTHits = dummy;
457 fill(tool, numberOfTRTHits);
458 }
459 if (track->summaryValue(dummy, xAOD::numberOfTRTOutliers)) {
460 numberOfTRTOutliers = dummy;
461 fill(tool, numberOfTRTOutliers);
462 }
463
464 d0 = perigee.parameters()[Trk::d0];
465 z0 = perigee.parameters()[Trk::z0];
466
467 phiTrack = perigee.parameters()[Trk::phi];
468 etaTrack = perigee.eta();
469 ptTrack = perigee.pT() / GeV;
470
471 fill(tool, d0, z0, phiTrack, etaTrack, ptTrack);
472 }
473 }
474 // this else can be removed, but it sets any track variable to 0 if
475 // there are no tracks this solution makes entry numbers match calo which
476 // is desired but there are too many zeros.
477 else {
478 leadTrkPt = 0;
479 fill(tool, leadTrkPt);
480 }
481
482 // Code for All Tracks and Mean track variables.
483
484 // pre loop variables:
485 double tauSeedPt = tau->ptJetSeed();
486 double logTauSeedPt = std::log(tauSeedPt);
487 trackLogSeedJetPt = logTauSeedPt;
488
489 fill(tool, trackLogSeedJetPt);
490
491 for (const xAOD::TauTrack *track : tau->allTracks()) {
492 if (!trackAcc(*track)[0]) {
493 continue;
494 }
495
496 const xAOD::TrackParticle *trackParticle = track->track();
497
498 float d0TJVA = track->track()->d0();
499 trackZ0SinthetaTJVA = track->z0sinThetaTJVA(*tau);
500 trackD0SigTJVA = 999.;
501 trackZ0sinthetaSigTJVA = 999.;
502 float rConv = 999.;
503 float rConvII = 999.;
504 if (z0sinthetaTJVAAcc.isAvailable(*track)) {
505 d0TJVA = track->d0TJVA();
506 trackZ0SinthetaTJVA = track->z0sinthetaTJVA();
507 trackD0SigTJVA = track->d0SigTJVA();
508 trackZ0sinthetaSigTJVA = track->z0sinthetaSigTJVA();
509 rConv = track->rConv();
510 rConvII = track->rConvII();
511 }
512 trackdRJetSeedAxis =
513 track->p4().DeltaR(tau->p4(xAOD::TauJetParameters::JetSeed));
514 double qOverP = trackParticle->qOverP();
515 double trackPt = trackParticle->pt();
516 uint8_t nInnermostPixelLayerHits = 0;
517 trackParticle->summaryValue(nInnermostPixelLayerHits,
519 uint8_t nPixelHits = 0;
520 trackParticle->summaryValue(nPixelHits, xAOD::numberOfPixelHits);
521 uint8_t nPixelDeadSensors = 0;
522 trackParticle->summaryValue(nPixelDeadSensors,
524 uint8_t nSCTHits = 0;
525 trackParticle->summaryValue(nSCTHits, xAOD::numberOfSCTHits);
526 uint8_t nSCTDeadSensors = 0;
527 trackParticle->summaryValue(nSCTDeadSensors,
529 uint8_t nTRTHighThresholdHits = 0;
530 trackParticle->summaryValue(nTRTHighThresholdHits,
532 uint8_t numberOfPixelHoles = 0;
533 trackParticle->summaryValue(numberOfPixelHoles,
535 uint8_t numberOfSCTHoles = 0;
536 trackParticle->summaryValue(numberOfSCTHoles, xAOD::numberOfSCTHoles);
537 float eProbabilityHT = 0.;
538
539 float eProbabilityNN = eProbabilityNNAcc.withDefault(*trackParticle, -1);
540 // hybrid variable (eProbabilityNN is not computed for tracks with pt
541 // < 2 GeV)
542 trackeProbabilityHTorNN =
543 (trackPt > 2000.) ? eProbabilityNN : eProbabilityHT;
544
545 trackeProbabilityNN = eProbabilityNN;
546 trackeProbabilityHT = eProbabilityHT;
547 trackLogPt = std::log(trackPt);
548 trackEta = track->eta();
549 trackd0TJVA = std::tanh(d0TJVA / 10.);
550 trackCharge = trackParticle->charge();
551 trackqOverP = qOverP * 1000.;
552 trackLogRConv = std::log(rConv);
553 trackTanhRConvII = std::tanh(rConvII / 500.0);
554 trackPtRatioSeedJet = trackPt / tauSeedPt;
555 trackNInnermostPixHits = nInnermostPixelLayerHits;
556 trackNPixHits = nPixelHits + nPixelDeadSensors;
557 trackNSiHits =
558 nPixelHits + nPixelDeadSensors + nSCTHits + nSCTDeadSensors;
559
560 fill(tool, trackLogPt, trackEta, trackd0TJVA, trackZ0SinthetaTJVA,
561 trackD0SigTJVA, trackZ0sinthetaSigTJVA, trackCharge, trackqOverP,
562 trackLogRConv, trackTanhRConvII, trackPtRatioSeedJet,
563 trackdRJetSeedAxis, trackNInnermostPixHits,
564 trackNPixHits,
565 trackNSiHits,
566 trackeProbabilityHT, trackeProbabilityNN, trackeProbabilityHTorNN);
567
568 if (acc_trackScoreCharged.isAvailable(*track)) {
569 float chargedScore = acc_trackScoreCharged(*track);
570 float isolationScore = acc_trackScoreIso(*track);
571 float conversionScore = acc_trackScoreConv(*track);
572 float fakeScore = 1. - chargedScore - isolationScore - conversionScore;
573 // ensure the probability is within [0.,1.]
574 fakeScore = std::max(0.f, fakeScore);
575 fakeScore = std::min(1.f, fakeScore);
576
577 trackIdScoreCharged = chargedScore;
578 trackIdScoreIso = isolationScore;
579 trackIdScoreConv = conversionScore;
580 trackIdScoreFake = fakeScore;
581
582 fill(tool, trackIdScoreCharged, trackIdScoreIso, trackIdScoreConv,
583 trackIdScoreFake);
584 }
585 }
586
587 // clusters
588 std::vector<const xAOD::IParticle *> particleList = tau->clusters();
589 std::vector<xAOD::CaloVertexedTopoCluster> clusters;
590 const xAOD::Vertex *vertex = nullptr;
591 if (tau->vertexLink().isValid())
592 vertex = tau->vertex();
593
594 for (const xAOD::IParticle *particle : particleList) {
595 const xAOD::CaloCluster *cluster =
596 static_cast<const xAOD::CaloCluster *>(particle);
597 if (vertex) {
598 clusters.emplace_back(*cluster, xAOD::CaloCluster::State::CALIBRATED,
599 vertex->position());
600 } else {
601 clusters.emplace_back(*cluster, xAOD::CaloCluster::State::CALIBRATED);
602 }
603 }
604
605 // sort by decreasing Et
606 auto et_cmp = [](const xAOD::CaloVertexedTopoCluster &lhs,
608 return lhs.p4().Et() > rhs.p4().Et();
609 };
610 std::sort(clusters.begin(), clusters.end(), et_cmp);
611
612 // keep first 6 leading clusters as in RNN ID
613 if (clusters.size() > 6) {
614 clusters.resize(6, clusters[0]);
615 }
616
617 double moment;
618 for (const auto& vertexedCluster : clusters) {
619 const xAOD::CaloCluster &cluster = vertexedCluster.clust();
620
621 clusterLogEt = std::log10(vertexedCluster.p4().Et());
622 clusterEta = vertexedCluster.eta();
623 clusterPhi = vertexedCluster.phi();
624
626 clusterSecondR = std::log10(moment + 0.1);
627
629 moment);
630 clusterSecondLambda = std::log10(moment + 0.1);
631
633 moment);
634 clusterCenterLambda = std::log10(moment + 1e-6);
635
637 moment);
638 if (moment != 0.)
639 moment = std::log10(std::abs(moment));
640 clusterFirstEngDens = moment;
641
643 moment);
644 clusterEMproba = moment;
645
646 fill(tool, clusterLogEt, clusterEta, clusterPhi, clusterSecondR,
647 clusterSecondLambda, clusterCenterLambda, clusterFirstEngDens,
648 clusterEMproba);
649 }
650
651 // Et-weighted average of cluster moments (MVA TES)
652 float avariable = 0.;
654 avariable);
655 if (test)
656 clustersMeanCenterLambda = avariable;
657
659 avariable);
660 if (test)
661 clustersMeanFirstEngDens = avariable;
662
664 avariable);
665 if (test)
666 clustersMeanEMProbability = avariable;
667
669 avariable);
670 if (test)
671 clustersMeanSecondLambda = avariable;
672
674 avariable);
675 if (test)
676 clustersMeanPresamplerFrac = avariable;
677
678 test = tau->detail(xAOD::TauJetParameters::PFOEngRelDiff, avariable);
679 if (test)
680 clustersPFOEngRelDiff = avariable;
681
682 fill(tool, clustersMeanCenterLambda, clustersMeanFirstEngDens,
683 clustersMeanEMProbability, clustersMeanSecondLambda,
684 clustersMeanPresamplerFrac, clustersPFOEngRelDiff);
685
686 for (unsigned int np = 0; np < nNeutPFO; np++) {
687 const xAOD::PFO *npfo = tau->protoNeutralPFO(np);
688 BDTScoreAsP0 = npfo->bdtPi0Score();
689 fill(tool, BDTScoreAsP0);
690 }
691
692 if (tauEt > lowerEtThreshold) {
693 tauPhiEt15 = tau->phi();
694 tauEtaEt15 = tau->eta();
695 fill(tool, tauPhiEt15, tauEtaEt15);
696 }
697
698 fill(tool, tauPhi, tauEta, LB, tauEt, centFrac, isolFrac,etEMAtEMScale, etHadAtEMScale,
699 tauCharge, JetScore, JetScoreSigTrans, RNNEleScore, RNNEleScoreSigTrans,
700 muonVeto, tauLoose, tauMedium, tauTight, PSSFrac, EMFrac, EMFracTrk, nNeutPFO,
701 nShot, NumTracks, nClusters, jetSeedEta, jetSeedPhi, jetSeedPt,
702 dRmax, ptRatioEflowApprox, trkAvgDist);
703
705 panModeSubstructureDummy);
706 panModeSubstructure = panModeSubstructureDummy;
707
708 fill(tool, panModeSubstructure);
709 if (panPhi > -100) {
710 fill(tool, panEta, panPhi, panPt);
711 }
712 }
713 }
714
715 fill(tool, nHighPtTauCandidates, nTauCandidates, nHighPtTaus);
716
717 return StatusCode::SUCCESS;
718}
719
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x,...)
Helper class to provide constant type-safe access to aux data.
static Double_t taus
Environment_t environment() const
Accessor functions for the environment.
virtual StatusCode initialize() override
initialize
const ToolHandle< GenericMonitoringTool > & getGroup(std::string_view name) const
Get a specific monitoring tool from the tool handle array.
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.).
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Declare a monitored scalar variable.
Helper class to provide type-safe access to aux data.
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
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.
bool isAvailable()
Test to see if this variable exists in the store, for the referenced object.
double eta() const
Access method for pseudorapidity - from momentum.
double pT() const
Access method for transverse momentum.
Gaudi::Property< float > m_etaMax
tauMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Gaudi::Property< std::string > m_kinGroupName
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_offlineGNTauMediumWPDecorKey
virtual StatusCode initialize() override
initialize
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_offlineGNTauLooseWPDecorKey
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_offlineGNTauTransScoreDecorKey
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_offlineGNTauTightWPDecorKey
SG::ReadHandleKey< xAOD::TauJetContainer > m_TauContainerKey
Gaudi::Property< float > m_etaMin
bool retrieveMoment(MomentType type, double &value) const
Retrieve individual moment.
@ SECOND_LAMBDA
Second Moment in .
@ EM_PROBABILITY
Classification probability to be em-like.
@ SECOND_R
Second Moment in .
@ FIRST_ENG_DENS
First Moment in E/V.
@ CENTER_LAMBDA
Shower depth at Cluster Centroid.
virtual FourMom_t p4() const final
The full 4-momentum of the particle.
Evaluate cluster kinematics with a different vertex / signal state.
Class providing the definition of the 4-vector interface.
float bdtPi0Score() const
get BDT Score used to classify clusters as Pi0 like or not
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
float qOverP() const
Returns the parameter.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
float charge() const
Returns the charge.
Generic monitoring tool for athena components.
void fill(const ToolHandle< GenericMonitoringTool > &tool, T &&... variables)
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ phi
Definition ParamDefs.h:75
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
@ etHadAtEMScale
Get Hadronic energy at EM scale.
Definition TauDefs.h:196
@ isolFrac
Get isolation fraction.
Definition TauDefs.h:198
@ trkAvgDist
Get calibrated EM transverse energy (DEPRECATED since r19).
Definition TauDefs.h:214
@ etEMAtEMScale
Get EM energy at EM scale.
Definition TauDefs.h:194
@ centFrac
Get centrality fraction.
Definition TauDefs.h:200
@ numTopoClusters
get number of topocluster constituents of jet associated to tau candidate
Definition TauDefs.h:173
@ dRmax
Get maximal dR of tracks associated to calo-seeded tau.
Definition TauDefs.h:226
@ RNNEleScore
RNN score for Ele rejection (not transformed).
Definition TauDefs.h:94
@ RNNEleScoreSigTrans
RNN score which is signal transformed/flattened.
Definition TauDefs.h:96
@ RNNJetScore
RNN score for Jet rejection (not transformed).
Definition TauDefs.h:90
@ RNNJetScoreSigTrans
RNN score which is signal transformed/flattened.
Definition TauDefs.h:92
PFO_v1 PFO
Definition of the current "pfo version".
Definition PFO.h:17
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
TauTrack_v1 TauTrack
Definition of the current version.
Definition TauTrack.h:16
ShallowCopyResult_t< T > shallowCopy(const T &cont, const EventContext &ctx)
Create a shallow copy of an existing container.
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfTRTHighThresholdOutliers
number of TRT high threshold outliers (only xenon counted) [unit8_t].
@ numberOfTRTHits
number of TRT hits [unit8_t].
@ 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].
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
@ numberOfTRTHighThresholdHits
number of TRT hits which pass the high threshold (only xenon counted) [unit8_t].
@ numberOfTRTOutliers
number of TRT outliers [unit8_t].
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].
@ numberOfSCTHoles
number of SCT holes [unit8_t].