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