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"
9#include <algorithm>
10
11using Gaudi::Units::GeV;
12using namespace Monitored;
13
15 ISvcLocator *pSvcLocator)
16 : AthMonitorAlgorithm(name, pSvcLocator)
17{}
18
20
22
23 ATH_CHECK(m_TauContainerKey.initialize());
24
25 ATH_CHECK(m_TauTrackContainer.initialize());
26
29
32
35
38
41
44
46 ATH_CHECK(m_EMFracFixedDecorKey.initialize());
47
49 ATH_CHECK(m_d0SigTJVADecorKey.initialize());
50
53
56
59
62
65
68
70}
71
72StatusCode tauMonitorAlgorithm::fillHistograms(const EventContext &ctx) const {
73
75
76 if (!taus.isValid()) {
77 ATH_MSG_ERROR("evtStore() does not contain tau Collection with name "
79 return StatusCode::FAILURE;
80 }
81
82 auto [shallowTaus, shallowTausAux] = xAOD::shallowCopy(*taus,ctx);
83
84 const int lowerEtThreshold = 15;
85 const int higherEtThreshold = 75;
86 auto tool = getGroup(m_kinGroupName);
87
88 auto tauEta = Monitored::Scalar<float>("tauEta", 0.0);
89
90 auto tauPhi = Monitored::Scalar<float>("tauPhi", 0.0);
91 auto tauEt = Monitored::Scalar<float>("tauEt", 0.0);
92
93 std::string tauid = "";
94 if(m_TauContainerKey.key().find("TauMonTauJets") != std::string::npos)
95 {
96 tauid = "GNTau";
97 } else {
98 tauid = "RNN";
99 }
100
101 auto tauEtEt15Loose = Monitored::Scalar<float>("tauEtEt15"+tauid+"Loose", 0.0);
102 auto panModeEt15Loose =
103 Monitored::Scalar<float>("panModeEt15"+tauid+"Loose", 0.0);
104 auto panModeSubstructure =
105 Monitored::Scalar<float>("panModeSubstructure", 0.0);
106
107 auto tauPhiEt15 = Monitored::Scalar<float>("tauPhiEt15", 0.0);
108 auto tauEtaEt15 = Monitored::Scalar<float>("tauEtaEt15", 0.0);
109
110 auto tauPhiEt15Loose = Monitored::Scalar<float>("tauPhiEt15"+tauid+"Loose", 0.0);
111 auto tauEtaEt15Loose = Monitored::Scalar<float>("tauEtaEt15"+tauid+"Loose", 0.0);
112
113 auto tauCharge = Monitored::Scalar<int>("tauCharge", 0.0);
114 auto JetScore = Monitored::Scalar<float>(tauid+"JetScore", 0.0);
115 auto JetScoreSigTrans =
116 Monitored::Scalar<float>(tauid+"JetScoreSigTrans", 0.0);
117
118 auto RNNEleScore = Monitored::Scalar<float>("RNNEleScore", 0.0);
119 auto RNNEleScoreSigTrans =
120 Monitored::Scalar<float>("RNNEleScoreSigTrans", 0.0);
121
122 auto NumTracks = Monitored::Scalar<int>("NumTracks", 0.0);
123 auto NumTracksEt15Loose =
124 Monitored::Scalar<int>("NumTracksEt15"+tauid+"Loose", 0.0);
125
126 auto nTauCandidates = Monitored::Scalar<int>("nTauCandidates", 0.0);
127 auto nHighPtTauCandidates =
128 Monitored::Scalar<int>("nHighPtTauCandidates", 0.0);
129 auto nClusters = Monitored::Scalar<int>("nClusters", 0.0);
130 auto nClustersEt15Loose =
131 Monitored::Scalar<int>("nClustersEt15"+tauid+"Loose", 0.0);
132
133 auto tauEtLoose = Monitored::Scalar<float>("tauEt"+tauid+"Loose", 0.0);
134 auto tauEtaLoose = Monitored::Scalar<float>("tauEta"+tauid+"Loose", 0.0);
135 auto tauPhiLoose = Monitored::Scalar<float>("tauPhi"+tauid+"Loose", 0.0);
136 auto NumTracksLoose = Monitored::Scalar<float>("NumTracks"+tauid+"Loose", 0.0);
137
138 auto tauEtMedium = Monitored::Scalar<float>("tauEt"+tauid+"Medium", 0.0);
139 auto tauEtaMedium = Monitored::Scalar<float>("tauEta"+tauid+"Medium", 0.0);
140 auto tauPhiMedium = Monitored::Scalar<float>("tauPhi"+tauid+"Medium", 0.0);
141 auto NumTracksMedium = Monitored::Scalar<float>("NumTracks"+tauid+"Medium", 0.0);
142
143 auto tauEtTight = Monitored::Scalar<float>("tauEt"+tauid+"Tight", 0.0);
144 auto tauEtaTight = Monitored::Scalar<float>("tauEta"+tauid+"Tight", 0.0);
145 auto tauPhiTight = Monitored::Scalar<float>("tauPhi"+tauid+"Tight", 0.0);
146 auto NumTracksTight = Monitored::Scalar<float>("NumTracks"+tauid+"Tight", 0.0);
147
148 auto LB = Monitored::Scalar<int>("LB", 0.0);
149
150 auto isolFrac = Monitored::Scalar<float>("isolFrac", 0.0);
151 auto etEMAtEMScale = Monitored::Scalar<float>("etEMAtEMScale", 0.0);
152
153 auto etHadAtEMScale = Monitored::Scalar<float>("etHadAtEMScale", 0.0);
154 auto centFrac = Monitored::Scalar<float>("centFrac", 0.0);
155 auto jetSeedEta = Monitored::Scalar<float>("jetSeedEta", 0.0);
156 auto jetSeedPhi = Monitored::Scalar<float>("jetSeedPhi", 0.0);
157 auto jetSeedPt = Monitored::Scalar<float>("jetSeedPt", 0.0);
158
159 auto muonVeto = Monitored::Scalar<float>("muonVeto", 0.0);
160
161 auto tauLoose = Monitored::Scalar<float>("tau"+tauid+"Loose", 0.0);
162 auto tauMedium = Monitored::Scalar<float>("tau"+tauid+"Medium", 0.0);
163 auto tauTight = Monitored::Scalar<float>("tau"+tauid+"Tight", 0.0);
164
165 auto PSSFrac = Monitored::Scalar<float>("PSSFrac", 0.0);
166 auto EMFrac = Monitored::Scalar<float>("EMFrac", 0.0);
167
168 auto EMFracTrk = Monitored::Scalar<float>("EMFracTrk", 0.0);
169 auto nNeutPFO = Monitored::Scalar<float>("nNeutPFO", 0.0);
170 auto nShot = Monitored::Scalar<float>("nShot", 0.0);
171
172 auto BDTScoreAsP0 = Monitored::Scalar<float>("BDTScoreAsP0", 0.0);
173 auto dRmax = Monitored::Scalar<float>("dRmax", 0.0);
174
175 auto ipSigLeadTrk = Monitored::Scalar<float>("ipSigLeadTrk", 0.0);
176 auto massTrkSys = Monitored::Scalar<float>("massTrkSys", 0.0);
177 auto etOverPtLeadTrack = Monitored::Scalar<float>("etOverPtLeadTrack", 0.0);
178 auto ptRatioEflowApprox = Monitored::Scalar<float>("ptRatioEflowApprox", 0.0);
179 auto trFlightPathSig = Monitored::Scalar<float>("trFlightPathSig", 0.0);
180 auto trkAvgDist = Monitored::Scalar<float>("trkAvgDist", 0.0);
181
182 auto panEta = Monitored::Scalar<float>("panEta", 0.0);
183 auto panPhi = Monitored::Scalar<float>("panPhi", 0.0);
184 auto panPt = Monitored::Scalar<float>("panPt", 0.0);
185 auto d0 = Monitored::Scalar<float>("d0", 0.0);
186 auto dRJetSeedAxis = Monitored::Scalar<float>("dRJetSeedAxis", 0.0);
187 auto z0 = Monitored::Scalar<float>("z0", 0.0);
188
189 auto etaTrack = Monitored::Scalar<float>("etaTrack", 0.0);
190 auto ptTrack = Monitored::Scalar<float>("ptTrack", 0.0);
191 auto phiTrack = Monitored::Scalar<float>("phiTrack", 0.0);
192 auto leadTrkPt = Monitored::Scalar<float>("leadTrkPt", 0.0);
193 auto nHighPtTaus = Monitored::Scalar<float>("nHighPtTaus", 0.0);
194 auto numberOfTRTHighThresholdHits =
195 Monitored::Scalar<float>("numberOfTRTHighThresholdHits", 0.0);
196 auto numberOfTRTHighThresholdOutliers =
197 Monitored::Scalar<float>("numberOfTRTHighThresholdOutliers", 0.0);
198 auto numberOfTRTHits = Monitored::Scalar<float>("numberOfTRTHits", 0.0);
199 auto numberOfTRTOutliers =
200 Monitored::Scalar<float>("numberOfTRTOutliers", 0.0);
201 auto ipZ0SinThetaSigLeadTrk =
202 Monitored::Scalar<float>("ipZ0SinThetaSigLeadTrk", 0.0);
203 auto numberOfPixelHits = Monitored::Scalar<float>("numberOfPixelHits", 0.0);
204 auto numberOfPixelSharedHits =
205 Monitored::Scalar<float>("numberOfPixelSharedHits", 0.0);
206 auto numberOfSCTHits = Monitored::Scalar<float>("numberOfSCTHits", 0.0);
207 auto numberOfSCTSharedHits =
208 Monitored::Scalar<float>("numberOfSCTSharedHits", 0.0);
209 auto rConv = Monitored::Scalar<float>("rConv", 0.0);
210 auto rConvII = Monitored::Scalar<float>("rConvII", 0.0);
211
212 // trackLogSeedJetPt
213 auto trackLogSeedJetPt = Monitored::Scalar<float>("trackLogSeedJetPt", 0.0);
214 auto trackLogPt = Monitored::Scalar<float>("trackLogPt", 0.0);
215 auto trackEta = Monitored::Scalar<float>("trackEta", 0.0);
216 auto trackd0TJVA = Monitored::Scalar<float>("trackd0TJVA", 0.0);
217 auto trackZ0SinthetaTJVA =
218 Monitored::Scalar<float>("trackZ0SinthetaTJVA", 0.0);
219 auto trackD0SigTJVA = Monitored::Scalar<float>("trackD0SigTJVA", 0.0);
220 auto trackZ0sinthetaSigTJVA =
221 Monitored::Scalar<float>("trackZ0sinthetaSigTJVA", 0.0);
222 auto trackCharge = Monitored::Scalar<float>("trackCharge", 0.0);
223 auto trackqOverP = Monitored::Scalar<float>("trackqOverP", 0.0);
224 auto trackLogRConv = Monitored::Scalar<float>("trackLogRConv", 0.0);
225 auto trackTanhRConvII = Monitored::Scalar<float>("trackTanhRConvII", 0.0);
226 auto trackPtRatioSeedJet =
227 Monitored::Scalar<float>("trackPtRatioSeedJet", 0.0);
228 auto trackdRJetSeedAxis = Monitored::Scalar<float>("trackdRJetSeedAxis", 0.0);
229 auto trackNInnermostPixHits =
230 Monitored::Scalar<float>("trackNInnermostPixHits", 0.0);
231 auto trackNPixHits = Monitored::Scalar<float>("trackNPixHits", 0.0);
232 auto trackNSiHits = Monitored::Scalar<float>("trackNSiHits", 0.0);
233 auto trackeProbabilityHT =
234 Monitored::Scalar<float>("trackeProbabilityHT", 0.0);
235 auto trackeProbabilityNN =
236 Monitored::Scalar<float>("trackeProbabilityNN", 0.0);
237 auto trackeProbabilityHTorNN =
238 Monitored::Scalar<float>("trackeProbabilityHTorNN", 0.0);
239 auto trackIdScoreCharged = Monitored::Scalar<float>("track", 0.0);
240 auto trackIdScoreIso = Monitored::Scalar<float>("track", 0.0);
241 auto trackIdScoreConv = Monitored::Scalar<float>("track", 0.0);
242 auto trackIdScoreFake = Monitored::Scalar<float>("track", 0.0);
243
244 auto clusterLogEt = Monitored::Scalar<float>("clusterLogEt", 0.0);
245 auto clusterEta = Monitored::Scalar<float>("clusterEta", 0.0);
246 auto clusterPhi = Monitored::Scalar<float>("clusterPhi", 0.0);
247 auto clusterSecondR = Monitored::Scalar<float>("clusterSecondR", 0.0);
248 auto clusterSecondLambda =
249 Monitored::Scalar<float>("clusterSecondLambda", 0.0);
250 auto clusterCenterLambda =
251 Monitored::Scalar<float>("clusterCenterLambda", 0.0);
252 auto clusterFirstEngDens =
253 Monitored::Scalar<float>("clusterFirstEngDens", 0.0);
254 auto clusterEMproba = Monitored::Scalar<float>("clusterEMproba", 0.0);
255 auto clustersMeanCenterLambda =
256 Monitored::Scalar<float>("clustersMeanCenterLambda", 0.0);
257 auto clustersMeanFirstEngDens =
258 Monitored::Scalar<float>("clustersMeanFirstEngDens", 0.0);
259 auto clustersMeanEMProbability =
260 Monitored::Scalar<float>("clustersMeanEMProbability", 0.0);
261 auto clustersMeanSecondLambda =
262 Monitored::Scalar<float>("clustersMeanSecondLambda", 0.0);
263 auto clustersMeanPresamplerFrac =
264 Monitored::Scalar<float>("clustersMeanPresamplerFrac", 0.0);
265 auto clustersPFOEngRelDiff =
266 Monitored::Scalar<float>("clustersPFOEngRelDiff", 0.0);
267
268 nTauCandidates = 0;
269
270 // access decorations
285
286 for (const auto tau : *shallowTaus) {
287
288 if (!passThinning.withDefault(*tau, true)) continue;
289
290 tauEta = tau->eta();
291 tauPhi = tau->phi();
292 tauEt = tau->pt() / GeV;
293 tauCharge = tau->charge();
294 NumTracks = tau->nTracks();
295 nClusters = tau->detail<int>(xAOD::TauJetParameters::numTopoClusters);
296 LB = GetEventInfo(ctx)->lumiBlock();
297
298 // calo
299 isolFrac = tau->detail<float>(xAOD::TauJetParameters::isolFrac);
300 etEMAtEMScale = tau->detail<float>(xAOD::TauJetParameters::etEMAtEMScale);
301 etHadAtEMScale = tau->detail<float>(xAOD::TauJetParameters::etHadAtEMScale);
302
303 centFrac = tau->detail<float>(xAOD::TauJetParameters::centFrac);
304 jetSeedEta = tau->etaJetSeed();
305 jetSeedPhi = tau->phiJetSeed();
306 jetSeedPt = tau->ptJetSeed() / GeV;
307
308 RNNEleScore = tau->discriminant(xAOD::TauJetParameters::TauID::RNNEleScore);
309 RNNEleScoreSigTrans =
311
312 muonVeto = tau->isTau(xAOD::TauJetParameters::MuonVeto);
313
314 // check to understand which TauID we can use
315 if( trans_score.isAvailable()) {
316
317 // we are using a special container decorated with GNTau
318 JetScore = score.isAvailable() ? score(*tau) : -1234;
319
320 JetScoreSigTrans = trans_score(*tau);
321
322 tauLoose = tauid_loose.isAvailable() ? tauid_loose(*tau) : -1234;
323
324 tauMedium = tauid_medium.isAvailable() ? tauid_medium(*tau) : -1234;
325
326 tauTight = tauid_tight.isAvailable() ? tauid_tight(*tau) : -1234;
327
328 } else{
329 // GNTau is not present -> use RNN based TauID
330 JetScore = tau->discriminant(xAOD::TauJetParameters::TauID::RNNJetScore);
331 JetScoreSigTrans =
333
334 tauLoose = tau->isTau(xAOD::TauJetParameters::JetRNNSigLoose);
335 tauMedium = tau->isTau(xAOD::TauJetParameters::JetRNNSigMedium);
336 tauTight = tau->isTau(xAOD::TauJetParameters::JetRNNSigTight);
337 }
338
339 dRmax = tau->detail<float>(xAOD::TauJetParameters::dRmax);
340 ptRatioEflowApprox =
342 trkAvgDist = tau->detail<float>(xAOD::TauJetParameters::trkAvgDist);
343
344 panEta = tau->etaPanTauCellBased();
345 panPhi = tau->phiPanTauCellBased();
346 panPt = tau->ptPanTauCellBased() / GeV; // GeV ;
347
348 // TauB/Identification/EleVetoBDTinputs
349 PSSFrac = tau->detail<float>(xAOD::TauJetParameters::PSSFraction);
350 EMFrac = EMFracFixed(*tau);
351
352 // TauB/SubStructure
353 EMFracTrk = tau->detail<float>(xAOD::TauJetParameters::ChPiEMEOverCaloEME);
354 nNeutPFO = tau->nProtoNeutralPFOs();
355 nShot = tau->nShotPFOs();
356
357 int panModeDummy = -1;
358 int panModeSubstructureDummy = -1;
359
360 if (m_etaMin < std::abs(tauEta) && std::abs(tauEta) < m_etaMax) {
361
362 if( tauEt > lowerEtThreshold) {
363 nTauCandidates += 1;
364 }
365
366 if (tauEt > higherEtThreshold) {
367 nHighPtTauCandidates += 1;
368 nHighPtTaus += 1;
369 }
370
371 if (m_kinGroupName != "tauMonKinGroupGlobal" &&
372 tauEt > lowerEtThreshold && tauLoose) {
373
374 tauPhiEt15Loose = tau->phi();
375 tauEtaEt15Loose = tau->eta();
376 tauEtEt15Loose = tau->pt() / GeV;
377 nClustersEt15Loose =
379 NumTracksEt15Loose = tau->nTracks();
380
382 panModeDummy);
383 panModeEt15Loose = panModeDummy;
384 fill(tool, tauPhiEt15Loose, tauEtaEt15Loose,
385 nClustersEt15Loose, NumTracksEt15Loose, tauEtEt15Loose,
386 panModeEt15Loose);
387 }
388
389 if (m_kinGroupName != "tauMonKinGroupGlobal" && tauLoose) {
390 tauPhiLoose = tau->phi();
391 tauEtaLoose = tau->eta();
392 tauEtLoose = tau->pt() / GeV;
393 NumTracksLoose = tau->nTracks();
394
395 fill(tool, tauPhiLoose, tauEtaLoose, NumTracksLoose,
396 tauEtLoose);
397 }
398
399 if (m_kinGroupName != "tauMonKinGroupGlobal" && tauMedium) {
400 tauPhiMedium = tau->phi();
401 tauEtaMedium = tau->eta();
402 tauEtMedium = tau->pt() / GeV;
403 NumTracksMedium = tau->nTracks();
404
405 fill(tool, tauPhiMedium, tauEtaMedium, NumTracksMedium,
406 tauEtMedium);
407 }
408
409 if (m_kinGroupName != "tauMonKinGroupGlobal" && tauTight) {
410 tauPhiTight = tau->phi();
411 tauEtaTight = tau->eta();
412 tauEtTight = tau->pt() / GeV;
413 NumTracksTight = tau->nTracks();
414
415 fill(tool, tauPhiTight, tauEtaTight, NumTracksTight,
416 tauEtTight);
417 }
418
419
420 // tracks - old
421 if (tau->nTracks() != 0) {
422
423 massTrkSys =
424 tau->detail<float>(xAOD::TauJetParameters::massTrkSys) / GeV; // GeV
425 trFlightPathSig =
426 tau->detail<float>(xAOD::TauJetParameters::trFlightPathSig);
427
428 if (d0SigTJVA.isAvailable()){
429 ipSigLeadTrk = tau->track(0)->d0SigTJVA();
430 }
431 else {
432 ipSigLeadTrk = tau->detail<float>(xAOD::TauJetParameters::ipSigLeadTrk);
433 }
434
435 if (z0sinthetaSigTJVA.isAvailable()) {
436 ipZ0SinThetaSigLeadTrk = tau->track(0)->z0sinthetaSigTJVA();
437 }
438 else {
439 ipZ0SinThetaSigLeadTrk = tau->detail<float>(xAOD::TauJetParameters::ipZ0SinThetaSigLeadTrk);
440 }
441
442 etOverPtLeadTrack =
443 tau->detail<float>(xAOD::TauJetParameters::etOverPtLeadTrk);
444 leadTrkPt = tau->detail<float>(xAOD::TauJetParameters::leadTrkPt) / GeV;
445
446 fill(tool, massTrkSys, etOverPtLeadTrack, trFlightPathSig,
447 ipSigLeadTrk, ipZ0SinThetaSigLeadTrk, leadTrkPt);
448
450 const xAOD::TrackParticle *track = tau->track(0)->track();
451 const Trk::Perigee perigee = track->perigeeParameters();
452
453 uint8_t dummy(0);
454
455 if (track->summaryValue(dummy, xAOD::numberOfSCTSharedHits)) {
456 numberOfSCTSharedHits = dummy;
457 fill(tool, numberOfSCTSharedHits);
458 }
459
460 if (track->summaryValue(dummy, xAOD::numberOfSCTHits)) {
461 numberOfSCTHits = dummy;
462 fill(tool, numberOfSCTHits);
463 }
464
465 if (track->summaryValue(dummy, xAOD::numberOfPixelSharedHits)) {
466 numberOfPixelSharedHits = dummy;
467 fill(tool, numberOfPixelSharedHits);
468 }
469
470 if (track->summaryValue(dummy, xAOD::numberOfPixelHits)) {
471 numberOfPixelHits = dummy;
472 fill(tool, numberOfPixelHits);
473 }
474 if (track->summaryValue(dummy, xAOD::numberOfTRTHighThresholdHits)) {
475 numberOfTRTHighThresholdHits = dummy;
476 fill(tool, numberOfTRTHighThresholdHits);
477 }
478 if (track->summaryValue(dummy,
480 numberOfTRTHighThresholdOutliers = dummy;
481 fill(tool, numberOfTRTHighThresholdOutliers);
482 }
483 if (track->summaryValue(dummy, xAOD::numberOfTRTHits)) {
484 numberOfTRTHits = dummy;
485 fill(tool, numberOfTRTHits);
486 }
487 if (track->summaryValue(dummy, xAOD::numberOfTRTOutliers)) {
488 numberOfTRTOutliers = dummy;
489 fill(tool, numberOfTRTOutliers);
490 }
491
492 d0 = perigee.parameters()[Trk::d0];
493 z0 = perigee.parameters()[Trk::z0];
494
495 phiTrack = perigee.parameters()[Trk::phi];
496 etaTrack = perigee.eta();
497 ptTrack = perigee.pT() / GeV;
498
499 fill(tool, d0, z0, phiTrack, etaTrack, ptTrack);
500 }
501 }
502 // this else can be removed, but it sets any track variable to 0 if
503 // there are no tracks this solution makes entry numbers match calo which
504 // is desired but there are too many zeros.
505 else {
506 leadTrkPt = 0;
507 fill(tool, leadTrkPt);
508 }
509
510 // Code for All Tracks and Mean track variables.
511
512 // pre loop variables:
513 double tauSeedPt = tau->ptJetSeed();
514 double logTauSeedPt = std::log(tauSeedPt);
515 trackLogSeedJetPt = logTauSeedPt;
516
517 fill(tool, trackLogSeedJetPt);
518
519 for (const xAOD::TauTrack *track : tau->allTracks()) {
520
521 static const SG::Accessor<
523 trackAcc("trackLinks");
524 if (!trackAcc(*track)[0]) {
525 continue;
526 }
527
528 const xAOD::TrackParticle *trackParticle = track->track();
529
530 float d0TJVA = track->track()->d0();
531 trackZ0SinthetaTJVA = track->z0sinThetaTJVA(*tau);
532 trackD0SigTJVA = 999.;
533 trackZ0sinthetaSigTJVA = 999.;
534 float rConv = 999.;
535 float rConvII = 999.;
536 if (z0sinthetaTJVA.isAvailable()) {
537 d0TJVA = track->d0TJVA();
538 trackZ0SinthetaTJVA = track->z0sinthetaTJVA();
539 trackD0SigTJVA = track->d0SigTJVA();
540 trackZ0sinthetaSigTJVA = track->z0sinthetaSigTJVA();
541 rConv = track->rConv();
542 rConvII = track->rConvII();
543 }
544 trackdRJetSeedAxis =
545 track->p4().DeltaR(tau->p4(xAOD::TauJetParameters::JetSeed));
546 double qOverP = trackParticle->qOverP();
547 double trackPt = trackParticle->pt();
548 uint8_t nInnermostPixelLayerHits = 0;
549 trackParticle->summaryValue(nInnermostPixelLayerHits,
551 uint8_t nPixelHits = 0;
552 trackParticle->summaryValue(nPixelHits, xAOD::numberOfPixelHits);
553 uint8_t nPixelDeadSensors = 0;
554 trackParticle->summaryValue(nPixelDeadSensors,
556 uint8_t nSCTHits = 0;
557 trackParticle->summaryValue(nSCTHits, xAOD::numberOfSCTHits);
558 uint8_t nSCTDeadSensors = 0;
559 trackParticle->summaryValue(nSCTDeadSensors,
561 uint8_t nTRTHighThresholdHits = 0;
562 trackParticle->summaryValue(nTRTHighThresholdHits,
564 uint8_t numberOfPixelHoles = 0;
565 trackParticle->summaryValue(numberOfPixelHoles,
567 uint8_t numberOfSCTHoles = 0;
568 trackParticle->summaryValue(numberOfSCTHoles, xAOD::numberOfSCTHoles);
569 float eProbabilityHT = 0.;
570 trackParticle->summaryValue(eProbabilityHT, xAOD::eProbabilityHT);
571
572 float eProbabilityNN = eProbabilityNNAcc.withDefault(*trackParticle, -1);
573 // hybrid variable (eProbabilityNN is not computed for tracks with pt
574 // < 2 GeV)
575 trackeProbabilityHTorNN =
576 (trackPt > 2000.) ? eProbabilityNN : eProbabilityHT;
577
578 trackeProbabilityNN = eProbabilityNN;
579 trackeProbabilityHT = eProbabilityHT;
580 trackLogPt = std::log(trackPt);
581 trackEta = track->eta();
582 trackd0TJVA = std::tanh(d0TJVA / 10.);
583 trackCharge = trackParticle->charge();
584 trackqOverP = qOverP * 1000.;
585 trackLogRConv = std::log(rConv);
586 trackTanhRConvII = std::tanh(rConvII / 500.0);
587 trackPtRatioSeedJet = trackPt / tauSeedPt;
588 trackNInnermostPixHits = nInnermostPixelLayerHits;
589 trackNPixHits = nPixelHits + nPixelDeadSensors;
590 trackNSiHits =
591 nPixelHits + nPixelDeadSensors + nSCTHits + nSCTDeadSensors;
592
593 fill(tool, trackLogPt, trackEta, trackd0TJVA, trackZ0SinthetaTJVA,
594 trackD0SigTJVA, trackZ0sinthetaSigTJVA, trackCharge, trackqOverP,
595 trackLogRConv, trackTanhRConvII, trackPtRatioSeedJet,
596 trackdRJetSeedAxis, trackNInnermostPixHits,
597 trackNPixHits,
598 trackNSiHits,
599 trackeProbabilityHT, trackeProbabilityNN, trackeProbabilityHTorNN);
600
601 if (rnn_chargedScore.isAvailable()) {
602 float chargedScore = rnn_chargedScore(*track);
603 float isolationScore = rnn_isolationScore(*track);
604 float conversionScore = rnn_conversionScore(*track);
605 float fakeScore = 1. - chargedScore - isolationScore - conversionScore;
606 // ensure the probability is within [0.,1.]
607 fakeScore = std::max(0.f, fakeScore);
608 fakeScore = std::min(1.f, fakeScore);
609
610 trackIdScoreCharged = chargedScore;
611 trackIdScoreIso = isolationScore;
612 trackIdScoreConv = conversionScore;
613 trackIdScoreFake = fakeScore;
614
615 fill(tool, trackIdScoreCharged, trackIdScoreIso, trackIdScoreConv,
616 trackIdScoreFake);
617 }
618 }
619
620 // clusters
621 std::vector<const xAOD::IParticle *> particleList = tau->clusters();
622 std::vector<xAOD::CaloVertexedTopoCluster> clusters;
623 const xAOD::Vertex *vertex = nullptr;
624 if (tau->vertexLink().isValid())
625 vertex = tau->vertex();
626
627 for (const xAOD::IParticle *particle : particleList) {
628 const xAOD::CaloCluster *cluster =
629 static_cast<const xAOD::CaloCluster *>(particle);
630 if (vertex) {
631 clusters.emplace_back(*cluster, xAOD::CaloCluster::State::CALIBRATED,
632 vertex->position());
633 } else {
634 clusters.emplace_back(*cluster, xAOD::CaloCluster::State::CALIBRATED);
635 }
636 }
637
638 // sort by decreasing Et
639 auto et_cmp = [](const xAOD::CaloVertexedTopoCluster &lhs,
641 return lhs.p4().Et() > rhs.p4().Et();
642 };
643 std::sort(clusters.begin(), clusters.end(), et_cmp);
644
645 // keep first 6 leading clusters as in RNN ID
646 if (clusters.size() > 6) {
647 clusters.resize(6, clusters[0]);
648 }
649
650 double moment;
651 for (const auto& vertexedCluster : clusters) {
652 const xAOD::CaloCluster &cluster = vertexedCluster.clust();
653
654 clusterLogEt = std::log10(vertexedCluster.p4().Et());
655 clusterEta = vertexedCluster.eta();
656 clusterPhi = vertexedCluster.phi();
657
659 clusterSecondR = std::log10(moment + 0.1);
660
662 moment);
663 clusterSecondLambda = std::log10(moment + 0.1);
664
666 moment);
667 clusterCenterLambda = std::log10(moment + 1e-6);
668
670 moment);
671 if (moment != 0.)
672 moment = std::log10(std::abs(moment));
673 clusterFirstEngDens = moment;
674
676 moment);
677 clusterEMproba = moment;
678
679 fill(tool, clusterLogEt, clusterEta, clusterPhi, clusterSecondR,
680 clusterSecondLambda, clusterCenterLambda, clusterFirstEngDens,
681 clusterEMproba);
682 }
683
684 // Et-weighted average of cluster moments (MVA TES)
685 float avariable = 0.;
687 avariable);
688 if (test)
689 clustersMeanCenterLambda = avariable;
690
692 avariable);
693 if (test)
694 clustersMeanFirstEngDens = avariable;
695
697 avariable);
698 if (test)
699 clustersMeanEMProbability = avariable;
700
702 avariable);
703 if (test)
704 clustersMeanSecondLambda = avariable;
705
707 avariable);
708 if (test)
709 clustersMeanPresamplerFrac = avariable;
710
711 test = tau->detail(xAOD::TauJetParameters::PFOEngRelDiff, avariable);
712 if (test)
713 clustersPFOEngRelDiff = avariable;
714
715 fill(tool, clustersMeanCenterLambda, clustersMeanFirstEngDens,
716 clustersMeanEMProbability, clustersMeanSecondLambda,
717 clustersMeanPresamplerFrac, clustersPFOEngRelDiff);
718
719 for (unsigned int np = 0; np < nNeutPFO; np++) {
720 const xAOD::PFO *npfo = tau->protoNeutralPFO(np);
721 BDTScoreAsP0 = npfo->bdtPi0Score();
722 fill(tool, BDTScoreAsP0);
723 }
724
725 if (tauEt > lowerEtThreshold) {
726 tauPhiEt15 = tau->phi();
727 tauEtaEt15 = tau->eta();
728 fill(tool, tauPhiEt15, tauEtaEt15);
729 }
730
731 fill(tool, tauPhi, tauEta, LB, tauEt, centFrac, isolFrac,etEMAtEMScale, etHadAtEMScale,
732 tauCharge, JetScore, JetScoreSigTrans, RNNEleScore, RNNEleScoreSigTrans,
733 muonVeto, tauLoose, tauMedium, tauTight, PSSFrac, EMFrac, EMFracTrk, nNeutPFO,
734 nShot, NumTracks, nClusters, jetSeedEta, jetSeedPhi, jetSeedPt,
735 dRmax, ptRatioEflowApprox, trkAvgDist);
736
738 panModeSubstructureDummy);
739 panModeSubstructure = panModeSubstructureDummy;
740
741 fill(tool, panModeSubstructure);
742 if (panPhi > -100) {
743 fill(tool, panEta, panPhi, panPt);
744 }
745 }
746 }
747
748 fill(tool, nHighPtTauCandidates, nTauCandidates, nHighPtTaus);
749
750 return StatusCode::SUCCESS;
751}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
static Double_t taus
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
Environment_t environment() const
Accessor functions for the environment.
virtual StatusCode initialize() override
initialize
SG::ReadHandle< xAOD::EventInfo > GetEventInfo(const EventContext &) const
Return a ReadHandle for an EventInfo object (get run/event numbers, etc.).
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Declare a monitored scalar variable.
Helper class to provide type-safe access to aux data.
Handle class for reading a decoration on an object.
const_reference_type withDefault(size_t index, const D &deflt)
Fetch the variable for one element, as a const reference.
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
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_EMFracFixedDecorKey
tauMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadDecorHandleKey< xAOD::TauTrackContainer > m_eProbabilityNNDecorKey
SG::ReadDecorHandleKey< xAOD::TauTrackContainer > m_z0sinthetaSigTJVADecorKey
Gaudi::Property< std::string > m_kinGroupName
SG::ReadDecorHandleKey< xAOD::TauTrackContainer > m_z0sinthetaTJVADecorKey
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_offlineGNTauScoreDecorKey
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_offlineGNTauMediumWPDecorKey
SG::ReadDecorHandleKey< xAOD::TauTrackContainer > m_rnn_chargedScoreDecorKey
virtual StatusCode initialize() override
initialize
SG::ReadDecorHandleKey< xAOD::TauTrackContainer > m_rnn_isolationScoreDecorKey
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_offlineGNTauLooseWPDecorKey
SG::ReadDecorHandleKey< xAOD::TauTrackContainer > m_d0SigTJVADecorKey
SG::ReadDecorHandleKey< xAOD::TauTrackContainer > m_rnn_conversionScoreDecorKey
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_offlineGNTauTransScoreDecorKey
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_passThinningDecorKey
SG::ReadHandleKey< xAOD::TauTrackContainer > m_TauTrackContainer
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
std::vector< ElementLink< xAOD::TrackParticleContainer > > TrackParticleLinks_t
Definition TauTrack_v1.h:91
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].
@ eProbabilityHT
Electron probability from High Threshold (HT) information [float].
@ 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].