ATLAS Offline Software
Loading...
Searching...
No Matches
tauMonitorAlgorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 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
43
44StatusCode tauMonitorAlgorithm::fillHistograms(const EventContext &ctx) const {
45
47
48 if (!taus.isValid()) {
49 ATH_MSG_ERROR("evtStore() does not contain tau Collection with name "
51 return StatusCode::FAILURE;
52 }
53
54 auto shallowCopy = xAOD::shallowCopyContainer(*taus);
55 std::unique_ptr<xAOD::TauJetContainer> shallowTaus(shallowCopy.first);
56 std::unique_ptr<xAOD::ShallowAuxContainer> shallowTausAux(shallowCopy.second);
57
58 const int lowerEtThreshold = 15;
59 const int higherEtThreshold = 75;
60 auto tool = getGroup(m_kinGroupName);
61
62 auto tauEta = Monitored::Scalar<float>("tauEta", 0.0);
63
64 auto tauPhi = Monitored::Scalar<float>("tauPhi", 0.0);
65 auto tauEt = Monitored::Scalar<float>("tauEt", 0.0);
66
67 std::string tauid = "";
68 if(m_TauContainerKey.key().find("TMTauJets") != std::string::npos)
69 {
70 tauid = "GNTau";
71 } else {
72 tauid = "RNN";
73 }
74
75 auto tauEtEt15Loose = Monitored::Scalar<float>("tauEtEt15"+tauid+"Loose", 0.0);
76 auto panModeEt15Loose =
77 Monitored::Scalar<float>("panModeEt15"+tauid+"Loose", 0.0);
78 auto panModeSubstructure =
79 Monitored::Scalar<float>("panModeSubstructure", 0.0);
80
81 auto tauPhiEt15 = Monitored::Scalar<float>("tauPhiEt15", 0.0);
82 auto tauEtaEt15 = Monitored::Scalar<float>("tauEtaEt15", 0.0);
83
84 auto tauPhiEt15Loose = Monitored::Scalar<float>("tauPhiEt15"+tauid+"Loose", 0.0);
85 auto tauEtaEt15Loose = Monitored::Scalar<float>("tauEtaEt15"+tauid+"Loose", 0.0);
86
87 auto tauCharge = Monitored::Scalar<int>("tauCharge", 0.0);
88 auto JetScore = Monitored::Scalar<float>(tauid+"JetScore", 0.0);
89 auto JetScoreSigTrans =
90 Monitored::Scalar<float>(tauid+"JetScoreSigTrans", 0.0);
91
92 auto RNNEleScore = Monitored::Scalar<float>("RNNEleScore", 0.0);
93 auto RNNEleScoreSigTrans =
94 Monitored::Scalar<float>("RNNEleScoreSigTrans", 0.0);
95
96 auto NumTracks = Monitored::Scalar<int>("NumTracks", 0.0);
97 auto NumTracksEt15Loose =
98 Monitored::Scalar<int>("NumTracksEt15"+tauid+"Loose", 0.0);
99
100 auto nTauCandidates = Monitored::Scalar<int>("nTauCandidates", 0.0);
101 auto nHighPtTauCandidates =
102 Monitored::Scalar<int>("nHighPtTauCandidates", 0.0);
103 auto nClusters = Monitored::Scalar<int>("nClusters", 0.0);
104 auto nClustersEt15Loose =
105 Monitored::Scalar<int>("nClustersEt15"+tauid+"Loose", 0.0);
106
107 auto tauEtLoose = Monitored::Scalar<float>("tauEt"+tauid+"Loose", 0.0);
108 auto tauEtaLoose = Monitored::Scalar<float>("tauEta"+tauid+"Loose", 0.0);
109 auto tauPhiLoose = Monitored::Scalar<float>("tauPhi"+tauid+"Loose", 0.0);
110 auto NumTracksLoose = Monitored::Scalar<float>("NumTracks"+tauid+"Loose", 0.0);
111
112 auto tauEtMedium = Monitored::Scalar<float>("tauEt"+tauid+"Medium", 0.0);
113 auto tauEtaMedium = Monitored::Scalar<float>("tauEta"+tauid+"Medium", 0.0);
114 auto tauPhiMedium = Monitored::Scalar<float>("tauPhi"+tauid+"Medium", 0.0);
115 auto NumTracksMedium = Monitored::Scalar<float>("NumTracks"+tauid+"Medium", 0.0);
116
117 auto tauEtTight = Monitored::Scalar<float>("tauEt"+tauid+"Tight", 0.0);
118 auto tauEtaTight = Monitored::Scalar<float>("tauEta"+tauid+"Tight", 0.0);
119 auto tauPhiTight = Monitored::Scalar<float>("tauPhi"+tauid+"Tight", 0.0);
120 auto NumTracksTight = Monitored::Scalar<float>("NumTracks"+tauid+"Tight", 0.0);
121
122 auto LB = Monitored::Scalar<int>("LB", 0.0);
123
124 auto EMRadius = Monitored::Scalar<float>("EMRadius", 0.0);
125 auto hadRadius = Monitored::Scalar<float>("hadRadius", 0.0);
126 auto isolFrac = Monitored::Scalar<float>("isolFrac", 0.0);
127 auto etEMAtEMScale = Monitored::Scalar<float>("etEMAtEMScale", 0.0);
128
129 auto etHadAtEMScale = Monitored::Scalar<float>("etHadAtEMScale", 0.0);
130 auto centFrac = Monitored::Scalar<float>("centFrac", 0.0);
131 auto jetSeedEta = Monitored::Scalar<float>("jetSeedEta", 0.0);
132 auto jetSeedPhi = Monitored::Scalar<float>("jetSeedPhi", 0.0);
133 auto jetSeedPt = Monitored::Scalar<float>("jetSeedPt", 0.0);
134
135 auto muonVeto = Monitored::Scalar<float>("muonVeto", 0.0);
136
137 auto tauLoose = Monitored::Scalar<float>("tau"+tauid+"Loose", 0.0);
138 auto tauMedium = Monitored::Scalar<float>("tau"+tauid+"Medium", 0.0);
139 auto tauTight = Monitored::Scalar<float>("tau"+tauid+"Tight", 0.0);
140
141 auto PSSFrac = Monitored::Scalar<float>("PSSFrac", 0.0);
142 auto EMFrac = Monitored::Scalar<float>("EMFrac", 0.0);
143
144 auto EMFracTrk = Monitored::Scalar<float>("EMFracTrk", 0.0);
145 auto nNeutPFO = Monitored::Scalar<float>("nNeutPFO", 0.0);
146 auto nShot = Monitored::Scalar<float>("nShot", 0.0);
147
148 auto BDTScoreAsP0 = Monitored::Scalar<float>("BDTScoreAsP0", 0.0);
149 auto dRmax = Monitored::Scalar<float>("dRmax", 0.0);
150
151 auto ipSigLeadTrk = Monitored::Scalar<float>("ipSigLeadTrk", 0.0);
152 auto massTrkSys = Monitored::Scalar<float>("massTrkSys", 0.0);
153 auto etOverPtLeadTrack = Monitored::Scalar<float>("etOverPtLeadTrack", 0.0);
154 auto ptRatioEflowApprox = Monitored::Scalar<float>("ptRatioEflowApprox", 0.0);
155 auto trFlightPathSig = Monitored::Scalar<float>("trFlightPathSig", 0.0);
156 auto trkAvgDist = Monitored::Scalar<float>("trkAvgDist", 0.0);
157
158 auto panEta = Monitored::Scalar<float>("panEta", 0.0);
159 auto panPhi = Monitored::Scalar<float>("panPhi", 0.0);
160 auto panPt = Monitored::Scalar<float>("panPt", 0.0);
161 auto d0 = Monitored::Scalar<float>("d0", 0.0);
162 auto dRJetSeedAxis = Monitored::Scalar<float>("dRJetSeedAxis", 0.0);
163 auto z0 = Monitored::Scalar<float>("z0", 0.0);
164
165 auto etaTrack = Monitored::Scalar<float>("etaTrack", 0.0);
166 auto ptTrack = Monitored::Scalar<float>("ptTrack", 0.0);
167 auto phiTrack = Monitored::Scalar<float>("phiTrack", 0.0);
168 auto leadTrkPt = Monitored::Scalar<float>("leadTrkPt", 0.0);
169 auto nHighPtTaus = Monitored::Scalar<float>("nHighPtTaus", 0.0);
170 auto numberOfTRTHighThresholdHits =
171 Monitored::Scalar<float>("numberOfTRTHighThresholdHits", 0.0);
172 auto numberOfTRTHighThresholdOutliers =
173 Monitored::Scalar<float>("numberOfTRTHighThresholdOutliers", 0.0);
174 auto numberOfTRTHits = Monitored::Scalar<float>("numberOfTRTHits", 0.0);
175 auto numberOfTRTOutliers =
176 Monitored::Scalar<float>("numberOfTRTOutliers", 0.0);
177 auto ipZ0SinThetaSigLeadTrk =
178 Monitored::Scalar<float>("ipZ0SinThetaSigLeadTrk", 0.0);
179 auto numberOfPixelHits = Monitored::Scalar<float>("numberOfPixelHits", 0.0);
180 auto numberOfPixelSharedHits =
181 Monitored::Scalar<float>("numberOfPixelSharedHits", 0.0);
182 auto numberOfSCTHits = Monitored::Scalar<float>("numberOfSCTHits", 0.0);
183 auto numberOfSCTSharedHits =
184 Monitored::Scalar<float>("numberOfSCTSharedHits", 0.0);
185 auto rConv = Monitored::Scalar<float>("rConv", 0.0);
186 auto rConvII = Monitored::Scalar<float>("rConvII", 0.0);
187
188 // trackLogSeedJetPt
189 auto trackLogSeedJetPt = Monitored::Scalar<float>("trackLogSeedJetPt", 0.0);
190 auto trackLogPt = Monitored::Scalar<float>("trackLogPt", 0.0);
191 auto trackEta = Monitored::Scalar<float>("trackEta", 0.0);
192 auto trackd0TJVA = Monitored::Scalar<float>("trackd0TJVA", 0.0);
193 auto trackZ0SinthetaTJVA =
194 Monitored::Scalar<float>("trackZ0SinthetaTJVA", 0.0);
195 auto trackD0SigTJVA = Monitored::Scalar<float>("trackD0SigTJVA", 0.0);
196 auto trackZ0sinthetaSigTJVA =
197 Monitored::Scalar<float>("trackZ0sinthetaSigTJVA", 0.0);
198 auto trackCharge = Monitored::Scalar<float>("trackCharge", 0.0);
199 auto trackqOverP = Monitored::Scalar<float>("trackqOverP", 0.0);
200 auto trackLogRConv = Monitored::Scalar<float>("trackLogRConv", 0.0);
201 auto trackTanhRConvII = Monitored::Scalar<float>("trackTanhRConvII", 0.0);
202 auto trackPtRatioSeedJet =
203 Monitored::Scalar<float>("trackPtRatioSeedJet", 0.0);
204 auto trackdRJetSeedAxis = Monitored::Scalar<float>("trackdRJetSeedAxis", 0.0);
205 auto trackNInnermostPixHits =
206 Monitored::Scalar<float>("trackNInnermostPixHits", 0.0);
207 auto trackNPixHits = Monitored::Scalar<float>("trackNPixHits", 0.0);
208 auto trackNSiHits = Monitored::Scalar<float>("trackNSiHits", 0.0);
209 auto trackeProbabilityHT =
210 Monitored::Scalar<float>("trackeProbabilityHT", 0.0);
211 auto trackeProbabilityNN =
212 Monitored::Scalar<float>("trackeProbabilityNN", 0.0);
213 auto trackeProbabilityHTorNN =
214 Monitored::Scalar<float>("trackeProbabilityHTorNN", 0.0);
215 auto trackIdScoreCharged = Monitored::Scalar<float>("track", 0.0);
216 auto trackIdScoreIso = Monitored::Scalar<float>("track", 0.0);
217 auto trackIdScoreConv = Monitored::Scalar<float>("track", 0.0);
218 auto trackIdScoreFake = Monitored::Scalar<float>("track", 0.0);
219
220 auto clusterLogEt = Monitored::Scalar<float>("clusterLogEt", 0.0);
221 auto clusterEta = Monitored::Scalar<float>("clusterEta", 0.0);
222 auto clusterPhi = Monitored::Scalar<float>("clusterPhi", 0.0);
223 auto clusterSecondR = Monitored::Scalar<float>("clusterSecondR", 0.0);
224 auto clusterSecondLambda =
225 Monitored::Scalar<float>("clusterSecondLambda", 0.0);
226 auto clusterCenterLambda =
227 Monitored::Scalar<float>("clusterCenterLambda", 0.0);
228 auto clusterFirstEngDens =
229 Monitored::Scalar<float>("clusterFirstEngDens", 0.0);
230 auto clusterEMproba = Monitored::Scalar<float>("clusterEMproba", 0.0);
231 auto clustersMeanCenterLambda =
232 Monitored::Scalar<float>("clustersMeanCenterLambda", 0.0);
233 auto clustersMeanFirstEngDens =
234 Monitored::Scalar<float>("clustersMeanFirstEngDens", 0.0);
235 auto clustersMeanEMProbability =
236 Monitored::Scalar<float>("clustersMeanEMProbability", 0.0);
237 auto clustersMeanSecondLambda =
238 Monitored::Scalar<float>("clustersMeanSecondLambda", 0.0);
239 auto clustersMeanPresamplerFrac =
240 Monitored::Scalar<float>("clustersMeanPresamplerFrac", 0.0);
241 auto clustersPFOEngRelDiff =
242 Monitored::Scalar<float>("clustersPFOEngRelDiff", 0.0);
243
244 nTauCandidates = 0;
245
246 static const SG::ConstAccessor<char> passThinningAcc("passThinning");
247
248 for (const auto tau : *shallowTaus) {
249
250 if (!passThinningAcc.withDefault(*tau, true)) continue;
251
252 tauEta = tau->eta();
253 tauPhi = tau->phi();
254 tauEt = tau->pt() / GeV;
255 tauCharge = tau->charge();
256 NumTracks = tau->nTracks();
257 nClusters = tau->detail<int>(xAOD::TauJetParameters::numTopoClusters);
258 LB = GetEventInfo(ctx)->lumiBlock();
259
260 // calo
261 EMRadius = tau->detail<float>(xAOD::TauJetParameters::EMRadius);
262 hadRadius = tau->detail<float>(xAOD::TauJetParameters::hadRadius);
263 isolFrac = tau->detail<float>(xAOD::TauJetParameters::isolFrac);
264 etEMAtEMScale = tau->detail<float>(xAOD::TauJetParameters::etEMAtEMScale);
265 etHadAtEMScale = tau->detail<float>(xAOD::TauJetParameters::etHadAtEMScale);
266
267 centFrac = tau->detail<float>(xAOD::TauJetParameters::centFrac);
268 jetSeedEta = tau->etaJetSeed();
269 jetSeedPhi = tau->phiJetSeed();
270 jetSeedPt = tau->ptJetSeed() / GeV;
271
272 RNNEleScore = tau->discriminant(xAOD::TauJetParameters::TauID::RNNEleScore);
273 RNNEleScoreSigTrans =
275
276 muonVeto = tau->isTau(xAOD::TauJetParameters::MuonVeto);
277
278 // check to understand which TauID we can use
280 if( trans_score.isAvailable()) {
281
282 // we are using a special container decorated with GNTau
284 JetScore = score.isAvailable() ? score(*tau) : -1234;
285
286 JetScoreSigTrans = trans_score(*tau);
287
289 tauLoose = tauid_loose.isAvailable() ? tauid_loose(*tau) : -1234;
290
292 tauMedium = tauid_medium.isAvailable() ? tauid_medium(*tau) : -1234;
293
295 tauTight = tauid_tight.isAvailable() ? tauid_tight(*tau) : -1234;
296
297 } else{
298 // GNTau is not present -> use RNN based TauID
299 JetScore = tau->discriminant(xAOD::TauJetParameters::TauID::RNNJetScore);
300 JetScoreSigTrans =
302
303 tauLoose = tau->isTau(xAOD::TauJetParameters::JetRNNSigLoose);
304 tauMedium = tau->isTau(xAOD::TauJetParameters::JetRNNSigMedium);
305 tauTight = tau->isTau(xAOD::TauJetParameters::JetRNNSigTight);
306 }
307
308 dRmax = tau->detail<float>(xAOD::TauJetParameters::dRmax);
309 ptRatioEflowApprox =
311 trkAvgDist = tau->detail<float>(xAOD::TauJetParameters::trkAvgDist);
312
313 panEta = tau->etaPanTauCellBased();
314 panPhi = tau->phiPanTauCellBased();
315 panPt = tau->ptPanTauCellBased() / GeV; // GeV ;
316
317 // TauB/Identification/EleVetoBDTinputs
318 PSSFrac = tau->detail<float>(xAOD::TauJetParameters::PSSFraction);
319 static const SG::ConstAccessor<float> EMFracFixedAcc("EMFracFixed");
320 EMFrac = EMFracFixedAcc(*tau);
321
322 // TauB/SubStructure
323 EMFracTrk = tau->detail<float>(xAOD::TauJetParameters::ChPiEMEOverCaloEME);
324 nNeutPFO = tau->nProtoNeutralPFOs();
325 nShot = tau->nShotPFOs();
326
327 int panModeDummy = -1;
328 int panModeSubstructureDummy = -1;
329
330 if (m_etaMin < std::abs(tauEta) && std::abs(tauEta) < m_etaMax) {
331
332 if( tauEt > lowerEtThreshold) {
333 nTauCandidates += 1;
334 }
335
336 if (tauEt > higherEtThreshold) {
337 nHighPtTauCandidates += 1;
338 nHighPtTaus += 1;
339 }
340
341 if (m_kinGroupName != "tauMonKinGroupGlobal" &&
342 tauEt > lowerEtThreshold && tauLoose) {
343
344 tauPhiEt15Loose = tau->phi();
345 tauEtaEt15Loose = tau->eta();
346 tauEtEt15Loose = tau->pt() / GeV;
347 nClustersEt15Loose =
349 NumTracksEt15Loose = tau->nTracks();
350
352 panModeDummy);
353 panModeEt15Loose = panModeDummy;
354 fill(tool, tauPhiEt15Loose, tauEtaEt15Loose,
355 nClustersEt15Loose, NumTracksEt15Loose, tauEtEt15Loose,
356 panModeEt15Loose);
357 }
358
359 if (m_kinGroupName != "tauMonKinGroupGlobal" && tauLoose) {
360 tauPhiLoose = tau->phi();
361 tauEtaLoose = tau->eta();
362 tauEtLoose = tau->pt() / GeV;
363 NumTracksLoose = tau->nTracks();
364
365 fill(tool, tauPhiLoose, tauEtaLoose, NumTracksLoose,
366 tauEtLoose);
367 }
368
369 if (m_kinGroupName != "tauMonKinGroupGlobal" && tauMedium) {
370 tauPhiMedium = tau->phi();
371 tauEtaMedium = tau->eta();
372 tauEtMedium = tau->pt() / GeV;
373 NumTracksMedium = tau->nTracks();
374
375 fill(tool, tauPhiMedium, tauEtaMedium, NumTracksMedium,
376 tauEtMedium);
377 }
378
379 if (m_kinGroupName != "tauMonKinGroupGlobal" && tauTight) {
380 tauPhiTight = tau->phi();
381 tauEtaTight = tau->eta();
382 tauEtTight = tau->pt() / GeV;
383 NumTracksTight = tau->nTracks();
384
385 fill(tool, tauPhiTight, tauEtaTight, NumTracksTight,
386 tauEtTight);
387 }
388
389
390 // tracks - old
391 if (tau->nTracks() != 0) {
392
393 massTrkSys =
394 tau->detail<float>(xAOD::TauJetParameters::massTrkSys) / GeV; // GeV
395 trFlightPathSig =
396 tau->detail<float>(xAOD::TauJetParameters::trFlightPathSig);
397
398 static const SG::ConstAccessor<float> d0SigTJVAAcc("d0SigTJVA");
399 if (d0SigTJVAAcc.isAvailable(*tau->track(0))) {
400 ipSigLeadTrk = tau->track(0)->d0SigTJVA();
401 }
402 else {
403 ipSigLeadTrk = tau->detail<float>(xAOD::TauJetParameters::ipSigLeadTrk);
404 }
405
406 static const SG::ConstAccessor<float> z0sinthetaSigTJVAAcc("z0sinthetaSigTJVA");
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 static const SG::ConstAccessor<float> acc_trackScoreCharged("rnn_chargedScore");
492 static const SG::ConstAccessor<float> acc_trackScoreIso("rnn_isolationScore");
493 static const SG::ConstAccessor<float> acc_trackScoreConv("rnn_conversionScore");
494 // rnn_fakeScore may not be available (it is not provided by the TauJets smart slimming list), it can be obtained from unitarity
495
496 for (const xAOD::TauTrack *track : tau->allTracks()) {
497
498 static const SG::Accessor<
500 trackAcc("trackLinks");
501 if (!trackAcc(*track)[0]) {
502 continue;
503 }
504
505 const xAOD::TrackParticle *trackParticle = track->track();
506
507 float d0TJVA = track->track()->d0();
508 trackZ0SinthetaTJVA = track->z0sinThetaTJVA(*tau);
509 trackD0SigTJVA = 999.;
510 trackZ0sinthetaSigTJVA = 999.;
511 float rConv = 999.;
512 float rConvII = 999.;
513 static const SG::ConstAccessor<float> z0sinthetaTJVAAcc("z0sinthetaTJVA");
514 if (z0sinthetaTJVAAcc.isAvailable(*track)) {
515 d0TJVA = track->d0TJVA();
516 trackZ0SinthetaTJVA = track->z0sinthetaTJVA();
517 trackD0SigTJVA = track->d0SigTJVA();
518 trackZ0sinthetaSigTJVA = track->z0sinthetaSigTJVA();
519 rConv = track->rConv();
520 rConvII = track->rConvII();
521 }
522 trackdRJetSeedAxis =
523 track->p4().DeltaR(tau->p4(xAOD::TauJetParameters::JetSeed));
524 double qOverP = trackParticle->qOverP();
525 double trackPt = trackParticle->pt();
526 uint8_t nInnermostPixelLayerHits = 0;
527 trackParticle->summaryValue(nInnermostPixelLayerHits,
529 uint8_t nPixelHits = 0;
530 trackParticle->summaryValue(nPixelHits, xAOD::numberOfPixelHits);
531 uint8_t nPixelDeadSensors = 0;
532 trackParticle->summaryValue(nPixelDeadSensors,
534 uint8_t nSCTHits = 0;
535 trackParticle->summaryValue(nSCTHits, xAOD::numberOfSCTHits);
536 uint8_t nSCTDeadSensors = 0;
537 trackParticle->summaryValue(nSCTDeadSensors,
539 uint8_t nTRTHighThresholdHits = 0;
540 trackParticle->summaryValue(nTRTHighThresholdHits,
542 uint8_t numberOfPixelHoles = 0;
543 trackParticle->summaryValue(numberOfPixelHoles,
545 uint8_t numberOfSCTHoles = 0;
546 trackParticle->summaryValue(numberOfSCTHoles, xAOD::numberOfSCTHoles);
547 float eProbabilityHT = 0.;
548 trackParticle->summaryValue(eProbabilityHT, xAOD::eProbabilityHT);
549 static const SG::ConstAccessor<float> eProbabilityNNAcc("eProbabilityNN");
550 float eProbabilityNN = eProbabilityNNAcc.withDefault(*trackParticle, -1);
551 // hybrid variable (eProbabilityNN is not computed for tracks with pt
552 // < 2 GeV)
553 trackeProbabilityHTorNN =
554 (trackPt > 2000.) ? eProbabilityNN : eProbabilityHT;
555
556 trackeProbabilityNN = eProbabilityNN;
557 trackeProbabilityHT = eProbabilityHT;
558 trackLogPt = std::log(trackPt);
559 trackEta = track->eta();
560 trackd0TJVA = std::tanh(d0TJVA / 10.);
561 trackCharge = trackParticle->charge();
562 trackqOverP = qOverP * 1000.;
563 trackLogRConv = std::log(rConv);
564 trackTanhRConvII = std::tanh(rConvII / 500.0);
565 trackPtRatioSeedJet = trackPt / tauSeedPt;
566 trackNInnermostPixHits = nInnermostPixelLayerHits;
567 trackNPixHits = nPixelHits + nPixelDeadSensors;
568 trackNSiHits =
569 nPixelHits + nPixelDeadSensors + nSCTHits + nSCTDeadSensors;
570
571 fill(tool, trackLogPt, trackEta, trackd0TJVA, trackZ0SinthetaTJVA,
572 trackD0SigTJVA, trackZ0sinthetaSigTJVA, trackCharge, trackqOverP,
573 trackLogRConv, trackTanhRConvII, trackPtRatioSeedJet,
574 trackdRJetSeedAxis, trackNInnermostPixHits,
575 trackNPixHits,
576 trackNSiHits,
577 trackeProbabilityHT, trackeProbabilityNN, trackeProbabilityHTorNN);
578
579 if (acc_trackScoreCharged.isAvailable(*track)) {
580 float chargedScore = acc_trackScoreCharged(*track);
581 float isolationScore = acc_trackScoreIso(*track);
582 float conversionScore = acc_trackScoreConv(*track);
583 float fakeScore = 1. - chargedScore - isolationScore - conversionScore;
584 // ensure the probability is within [0.,1.]
585 fakeScore = std::max(0.f, fakeScore);
586 fakeScore = std::min(1.f, fakeScore);
587
588 trackIdScoreCharged = chargedScore;
589 trackIdScoreIso = isolationScore;
590 trackIdScoreConv = conversionScore;
591 trackIdScoreFake = fakeScore;
592
593 fill(tool, trackIdScoreCharged, trackIdScoreIso, trackIdScoreConv,
594 trackIdScoreFake);
595 }
596 }
597
598 // clusters
599 std::vector<const xAOD::IParticle *> particleList = tau->clusters();
600 std::vector<xAOD::CaloVertexedTopoCluster> clusters;
601 const xAOD::Vertex *vertex = nullptr;
602 if (tau->vertexLink().isValid())
603 vertex = tau->vertex();
604
605 for (const xAOD::IParticle *particle : particleList) {
606 const xAOD::CaloCluster *cluster =
607 static_cast<const xAOD::CaloCluster *>(particle);
608 if (vertex) {
609 clusters.emplace_back(*cluster, xAOD::CaloCluster::State::CALIBRATED,
610 vertex->position());
611 } else {
612 clusters.emplace_back(*cluster, xAOD::CaloCluster::State::CALIBRATED);
613 }
614 }
615
616 // sort by decreasing Et
617 auto et_cmp = [](const xAOD::CaloVertexedTopoCluster &lhs,
619 return lhs.p4().Et() > rhs.p4().Et();
620 };
621 std::sort(clusters.begin(), clusters.end(), et_cmp);
622
623 // keep first 6 leading clusters as in RNN ID
624 if (clusters.size() > 6) {
625 clusters.resize(6, clusters[0]);
626 }
627
628 double moment;
629 for (const auto& vertexedCluster : clusters) {
630 const xAOD::CaloCluster &cluster = vertexedCluster.clust();
631
632 clusterLogEt = std::log10(vertexedCluster.p4().Et());
633 clusterEta = vertexedCluster.eta();
634 clusterPhi = vertexedCluster.phi();
635
637 clusterSecondR = std::log10(moment + 0.1);
638
640 moment);
641 clusterSecondLambda = std::log10(moment + 0.1);
642
644 moment);
645 clusterCenterLambda = std::log10(moment + 1e-6);
646
648 moment);
649 if (moment != 0.)
650 moment = std::log10(std::abs(moment));
651 clusterFirstEngDens = moment;
652
654 moment);
655 clusterEMproba = moment;
656
657 fill(tool, clusterLogEt, clusterEta, clusterPhi, clusterSecondR,
658 clusterSecondLambda, clusterCenterLambda, clusterFirstEngDens,
659 clusterEMproba);
660 }
661
662 // Et-weighted average of cluster moments (MVA TES)
663 float avariable = 0.;
665 avariable);
666 if (test)
667 clustersMeanCenterLambda = avariable;
668
670 avariable);
671 if (test)
672 clustersMeanFirstEngDens = avariable;
673
675 avariable);
676 if (test)
677 clustersMeanEMProbability = avariable;
678
680 avariable);
681 if (test)
682 clustersMeanSecondLambda = avariable;
683
685 avariable);
686 if (test)
687 clustersMeanPresamplerFrac = avariable;
688
689 test = tau->detail(xAOD::TauJetParameters::PFOEngRelDiff, avariable);
690 if (test)
691 clustersPFOEngRelDiff = avariable;
692
693 fill(tool, clustersMeanCenterLambda, clustersMeanFirstEngDens,
694 clustersMeanEMProbability, clustersMeanSecondLambda,
695 clustersMeanPresamplerFrac, clustersPFOEngRelDiff);
696
697 for (unsigned int np = 0; np < nNeutPFO; np++) {
698 const xAOD::PFO *npfo = tau->protoNeutralPFO(np);
699 BDTScoreAsP0 = npfo->bdtPi0Score();
700 fill(tool, BDTScoreAsP0);
701 }
702
703 if (tauEt > lowerEtThreshold) {
704 tauPhiEt15 = tau->phi();
705 tauEtaEt15 = tau->eta();
706 fill(tool, tauPhiEt15, tauEtaEt15);
707 }
708
709 fill(tool, tauPhi, tauEta, LB, tauEt, centFrac, isolFrac, EMRadius,
710 hadRadius, etEMAtEMScale, etHadAtEMScale,
711 tauCharge, JetScore, JetScoreSigTrans, RNNEleScore, RNNEleScoreSigTrans,
712 muonVeto, tauLoose, tauMedium, tauTight, PSSFrac, EMFrac, EMFracTrk, nNeutPFO,
713 nShot, NumTracks, nClusters, jetSeedEta, jetSeedPhi, jetSeedPt,
714 dRmax, ptRatioEflowApprox, trkAvgDist);
715
717 panModeSubstructureDummy);
718 panModeSubstructure = panModeSubstructureDummy;
719
720 fill(tool, panModeSubstructure);
721 if (panPhi > -100) {
722 fill(tool, panEta, panPhi, panPt);
723 }
724 }
725 }
726
727 fill(tool, nHighPtTauCandidates, nTauCandidates, nHighPtTaus);
728
729 return StatusCode::SUCCESS;
730}
#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
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.
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_offlineGNTauScoreDecorKey
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
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.
@ hadRadius
Get hadron calorimeter radius.
Definition TauDefs.h:192
@ EMRadius
Get E_T radius.
Definition TauDefs.h:190
@ 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.
std::pair< std::unique_ptr< T >, std::unique_ptr< ShallowAuxContainer > > shallowCopyContainer(const T &cont, const EventContext &ctx)
Function making a shallow copy of a constant container.
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
@ 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].