ATLAS Offline Software
Loading...
Searching...
No Matches
TauJetRNNUtils.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#define GeV 1000
8
9namespace TauJetRNNUtils {
10
11VarCalc::VarCalc() : asg::AsgMessaging("TauJetRNNUtils::VarCalc") {
12}
13
14bool VarCalc::compute(const std::string &name, const xAOD::TauJet &tau,
15 double &out) const {
16 // Retrieve calculator function
17 ScalarCalc func = nullptr;
18 try {
19 func = m_scalar_map.at(name);
20 } catch (const std::out_of_range &e) {
21 ATH_MSG_ERROR("Variable '" << name << "' not defined");
22 throw;
23 }
24
25 // Calculate variable
26 return func(tau, out);
27}
28
29bool VarCalc::compute(const std::string &name, const xAOD::TauJet &tau,
30 const std::vector<const xAOD::TauTrack *> &tracks,
31 std::vector<double> &out) const {
32 out.clear();
33
34 // Retrieve calculator function
35 TrackCalc func = nullptr;
36 try {
37 func = m_track_map.at(name);
38 } catch (const std::out_of_range &e) {
39 ATH_MSG_ERROR("Variable '" << name << "' not defined");
40 throw;
41 }
42
43 // Calculate variables for selected tracks
44 bool success = true;
45 double value;
46 for (const auto *const trk : tracks) {
47 success = success && func(tau, *trk, value);
48 out.push_back(value);
49 }
50
51 return success;
52}
53
54bool VarCalc::compute(const std::string &name, const xAOD::TauJet &tau,
55 const std::vector<xAOD::CaloVertexedTopoCluster> &clusters,
56 std::vector<double> &out) const {
57 out.clear();
58
59 // Retrieve calculator function
60 ClusterCalc func = nullptr;
61 try {
62 func = m_cluster_map.at(name);
63 } catch (const std::out_of_range &e) {
64 ATH_MSG_ERROR("Variable '" << name << "' not defined");
65 throw;
66 }
67
68 // Calculate variables for selected clusters
69 bool success = true;
70 double value;
71 for (const xAOD::CaloVertexedTopoCluster& cluster : clusters) {
72 success = success && func(tau, cluster, value);
73 out.push_back(value);
74 }
75
76 return success;
77}
78
79void VarCalc::insert(const std::string &name, ScalarCalc func, const std::vector<std::string>& scalar_vars) {
80 if (std::find(scalar_vars.begin(), scalar_vars.end(), name) == scalar_vars.end()) {
81 return;
82 }
83 if (!func) {
84 throw std::invalid_argument("Nullptr passed to VarCalc::insert");
85 }
86 m_scalar_map[name] = func;
87}
88
89void VarCalc::insert(const std::string &name, TrackCalc func, const std::vector<std::string>& track_vars) {
90 if (std::find(track_vars.begin(), track_vars.end(), name) == track_vars.end()) {
91 return;
92 }
93 if (!func) {
94 throw std::invalid_argument("Nullptr passed to VarCalc::insert");
95 }
96 m_track_map[name] = func;
97}
98
99void VarCalc::insert(const std::string &name, ClusterCalc func, const std::vector<std::string>& cluster_vars) {
100 if (std::find(cluster_vars.begin(), cluster_vars.end(), name) == cluster_vars.end()) {
101 return;
102 }
103 if (!func) {
104 throw std::invalid_argument("Nullptr passed to VarCalc::insert");
105 }
106 m_cluster_map[name] = func;
107}
108
109std::unique_ptr<VarCalc> get_calculator(const std::vector<std::string>& scalar_vars,
110 const std::vector<std::string>& track_vars,
111 const std::vector<std::string>& cluster_vars,
112 bool useTRT) {
113 auto calc = std::make_unique<VarCalc>();
114
115 // Scalar variable calculator functions
116 calc->insert("centFrac", Variables::centFrac, scalar_vars);
117 calc->insert("etOverPtLeadTrk", Variables::etOverPtLeadTrk, scalar_vars);
118 calc->insert("innerTrkAvgDist", Variables::innerTrkAvgDist, scalar_vars);
119 calc->insert("absipSigLeadTrk", Variables::absipSigLeadTrk, scalar_vars);
120 calc->insert("SumPtTrkFrac", Variables::SumPtTrkFrac, scalar_vars);
121 calc->insert("EMPOverTrkSysP", Variables::EMPOverTrkSysP, scalar_vars);
122 calc->insert("ptRatioEflowApprox", Variables::ptRatioEflowApprox, scalar_vars);
123 calc->insert("mEflowApprox", Variables::mEflowApprox, scalar_vars);
124 calc->insert("dRmax", Variables::dRmax, scalar_vars);
125 calc->insert("trFlightPathSig", Variables::trFlightPathSig, scalar_vars);
126 calc->insert("massTrkSys", Variables::massTrkSys, scalar_vars);
127 calc->insert("pt", Variables::pt, scalar_vars);
128 calc->insert("pt_tau_log", Variables::pt_tau_log, scalar_vars);
129 calc->insert("ptDetectorAxis", Variables::ptDetectorAxis, scalar_vars);
130 //---added for the eVeto
131 calc->insert("ptJetSeed_log", Variables::ptJetSeed_log, scalar_vars);
132 calc->insert("absleadTrackEta", Variables::absleadTrackEta, scalar_vars);
133 calc->insert("leadTrackDeltaEta", Variables::leadTrackDeltaEta, scalar_vars);
134 calc->insert("leadTrackDeltaPhi", Variables::leadTrackDeltaPhi, scalar_vars);
135 calc->insert("leadTrackProbNNorHT", useTRT ? Variables::leadTrackProbNNorHT : Variables::leadTrackProbNNorHT_noTRT, scalar_vars);
136 calc->insert("EMFracFixed", Variables::EMFracFixed, scalar_vars);
137 calc->insert("etHotShotWinOverPtLeadTrk", Variables::etHotShotWinOverPtLeadTrk, scalar_vars);
138 calc->insert("hadLeakFracFixed", Variables::hadLeakFracFixed, scalar_vars);
139 calc->insert("PSFrac", Variables::PSFrac, scalar_vars);
140 calc->insert("ClustersMeanCenterLambda", Variables::ClustersMeanCenterLambda, scalar_vars);
141 calc->insert("ClustersMeanFirstEngDens", Variables::ClustersMeanFirstEngDens, scalar_vars);
142 calc->insert("ClustersMeanPresamplerFrac", Variables::ClustersMeanPresamplerFrac, scalar_vars);
143
144 // Track variable calculator functions
145 calc->insert("pt_log", Variables::Track::pt_log, track_vars);
146 calc->insert("pt_tau_log", Variables::Track::pt_tau_log, track_vars);
147 calc->insert("pt_jetseed_log", Variables::Track::pt_jetseed_log, track_vars);
148 calc->insert("d0_abs_log", Variables::Track::d0_abs_log, track_vars);
149 calc->insert("z0sinThetaTJVA_abs_log", Variables::Track::z0sinThetaTJVA_abs_log, track_vars);
150 calc->insert("z0sinthetaTJVA", Variables::Track::z0sinthetaTJVA, track_vars);
151 calc->insert("z0sinthetaSigTJVA", Variables::Track::z0sinthetaSigTJVA, track_vars);
152 calc->insert("d0TJVA", Variables::Track::d0TJVA, track_vars);
153 calc->insert("d0SigTJVA", Variables::Track::d0SigTJVA, track_vars);
154 calc->insert("dEta", Variables::Track::dEta, track_vars);
155 calc->insert("dPhi", Variables::Track::dPhi, track_vars);
156 calc->insert("nInnermostPixelHits", Variables::Track::nInnermostPixelHits, track_vars);
157 calc->insert("nPixelHits", Variables::Track::nPixelHits, track_vars);
158 calc->insert("nSCTHits", Variables::Track::nSCTHits, track_vars);
159 calc->insert("nIBLHitsAndExp", Variables::Track::nIBLHitsAndExp, track_vars);
160 calc->insert("nPixelHitsPlusDeadSensors", Variables::Track::nPixelHitsPlusDeadSensors, track_vars);
161 calc->insert("nSCTHitsPlusDeadSensors", Variables::Track::nSCTHitsPlusDeadSensors, track_vars);
162 calc->insert("eProbabilityNNorHT", useTRT ? Variables::Track::eProbabilityNNorHT : Variables::Track::eProbabilityNNorHT_noTRT, track_vars);
163
164 // Cluster variable calculator functions
165 calc->insert("et_log", Variables::Cluster::et_log, cluster_vars);
166 calc->insert("pt_tau_log", Variables::Cluster::pt_tau_log, cluster_vars);
167 calc->insert("pt_jetseed_log", Variables::Cluster::pt_jetseed_log, cluster_vars);
168 calc->insert("dEta", Variables::Cluster::dEta, cluster_vars);
169 calc->insert("dPhi", Variables::Cluster::dPhi, cluster_vars);
170 calc->insert("SECOND_R", Variables::Cluster::SECOND_R, cluster_vars);
171 calc->insert("SECOND_LAMBDA", Variables::Cluster::SECOND_LAMBDA, cluster_vars);
172 calc->insert("CENTER_LAMBDA", Variables::Cluster::CENTER_LAMBDA, cluster_vars);
173 //---added for the eVeto
174 calc->insert("SECOND_LAMBDAOverClustersMeanSecondLambda", Variables::Cluster::SECOND_LAMBDAOverClustersMeanSecondLambda, cluster_vars);
175 calc->insert("CENTER_LAMBDAOverClustersMeanCenterLambda", Variables::Cluster::CENTER_LAMBDAOverClustersMeanCenterLambda, cluster_vars);
176 calc->insert("FirstEngDensOverClustersMeanFirstEngDens" , Variables::Cluster::FirstEngDensOverClustersMeanFirstEngDens, cluster_vars);
177
178 return calc;
179}
180
181
182namespace Variables {
184
185bool centFrac(const xAOD::TauJet &tau, double &out) {
186 float centFrac;
187 const auto success = tau.detail(TauDetail::centFrac, centFrac);
188 out = std::min(centFrac, 1.0f);
189 return success;
190}
191
192bool etOverPtLeadTrk(const xAOD::TauJet &tau, double &out) {
193 float etOverPtLeadTrk;
194 const auto success = tau.detail(TauDetail::etOverPtLeadTrk, etOverPtLeadTrk);
195 out = std::log10(std::max(etOverPtLeadTrk, 0.1f));
196 return success;
197}
198
199bool innerTrkAvgDist(const xAOD::TauJet &tau, double &out) {
200 float innerTrkAvgDist;
201 const auto success = tau.detail(TauDetail::innerTrkAvgDist, innerTrkAvgDist);
202 out = innerTrkAvgDist;
203 return success;
204}
205
206bool absipSigLeadTrk(const xAOD::TauJet &tau, double &out) {
207 float ipSigLeadTrk = (tau.nTracks()>0) ? tau.track(0)->d0SigTJVA() : 0.;
208 out = std::min(std::abs(ipSigLeadTrk), 30.0f);
209 return true;
210}
211
212bool SumPtTrkFrac(const xAOD::TauJet &tau, double &out) {
213 float SumPtTrkFrac;
214 const auto success = tau.detail(TauDetail::SumPtTrkFrac, SumPtTrkFrac);
215 out = SumPtTrkFrac;
216 return success;
217}
218
219bool EMPOverTrkSysP(const xAOD::TauJet &tau, double &out) {
220 float EMPOverTrkSysP;
221 const auto success = tau.detail(TauDetail::EMPOverTrkSysP, EMPOverTrkSysP);
222 out = std::log10(std::max(EMPOverTrkSysP, 1e-3f));
223 return success;
224}
225
226bool ptRatioEflowApprox(const xAOD::TauJet &tau, double &out) {
227 float ptRatioEflowApprox;
228 const auto success = tau.detail(TauDetail::ptRatioEflowApprox, ptRatioEflowApprox);
229 out = std::min(ptRatioEflowApprox, 4.0f);
230 return success;
231}
232
233bool mEflowApprox(const xAOD::TauJet &tau, double &out) {
234 float mEflowApprox;
235 const auto success = tau.detail(TauDetail::mEflowApprox, mEflowApprox);
236 out = std::log10(std::max(mEflowApprox, 140.0f));
237 return success;
238}
239
240bool dRmax(const xAOD::TauJet &tau, double &out) {
241 float dRmax;
242 const auto success = tau.detail(TauDetail::dRmax, dRmax);
243 out = dRmax;
244 return success;
245}
246
247bool trFlightPathSig(const xAOD::TauJet &tau, double &out) {
248 float trFlightPathSig;
249 const auto success = tau.detail(TauDetail::trFlightPathSig, trFlightPathSig);
250 out = std::log10(std::max(trFlightPathSig, 0.01f));
251 return success;
252}
253
254bool massTrkSys(const xAOD::TauJet &tau, double &out) {
255 float massTrkSys;
256 const auto success = tau.detail(TauDetail::massTrkSys, massTrkSys);
257 out = std::log10(std::max(massTrkSys, 140.0f));
258 return success;
259}
260
261bool pt(const xAOD::TauJet &tau, double &out) {
262 out = std::log10(std::min(tau.pt() / GeV, 100.0));
263 return true;
264}
265
266bool pt_tau_log(const xAOD::TauJet &tau, double &out) {
267 out = std::log10(std::max(tau.pt() / GeV, 1e-6));
268 return true;
269}
270
271bool ptDetectorAxis(const xAOD::TauJet &tau, double &out) {
272 out = std::log10(std::min(tau.ptDetectorAxis() / GeV, 100.0));
273 return true;
274}
275
276bool ptJetSeed_log(const xAOD::TauJet &tau, double &out) {
277 out = std::log10(std::max(tau.ptJetSeed(), 1e-3));
278 return true;
279}
280
281
282bool absleadTrackEta(const xAOD::TauJet &tau, double &out){
283 static const SG::ConstAccessor<float> acc_absEtaLeadTrack("ABS_ETA_LEAD_TRACK");
284 float absEtaLeadTrack = acc_absEtaLeadTrack(tau);
285 out = std::max(0.f, absEtaLeadTrack);
286 return true;
287}
288
289// -1111 is a default/fallback value used in the original code where this variable was previously calculated
290bool leadTrackDeltaEta(const xAOD::TauJet &tau, double &out){
291 float absDeltaEta = tau.nTracks() > 0 ? std::abs( tau.track(0)->track()->eta() - tau.eta() ) : -1111.;
292 out = std::max(0.f, absDeltaEta);
293 return true;
294}
295
296// -1111 is a default/fallback value used in the original code where this variable was previously calculated.
297bool leadTrackDeltaPhi(const xAOD::TauJet &tau, double &out){
298 float absDeltaPhi = tau.nTracks() > 0 ? std::abs( tau.track(0)->track()->p4().DeltaPhi(tau.p4()) ) : -1111.;
299 out = std::max(0.f, absDeltaPhi);
300 return true;
301}
302
303bool leadTrackProbNNorHT(const xAOD::TauJet &tau, double &out){
304 auto tracks = tau.allTracks();
305
306 // Sort tracks in descending pt order
307 if (!tracks.empty()) {
308 auto cmp_pt = [](const xAOD::TauTrack *lhs, const xAOD::TauTrack *rhs) {
309 return lhs->pt() > rhs->pt();
310 };
311 std::sort(tracks.begin(), tracks.end(), cmp_pt);
312
313 const xAOD::TauTrack* tauLeadTrack = tracks.at(0);
314 const xAOD::TrackParticle* xTrackParticle = tauLeadTrack->track();
315 float eProbabilityHT = xTrackParticle->summaryValue(eProbabilityHT, xAOD::eProbabilityHT);
316 static const SG::ConstAccessor<float> acc_eProbabilityNN("eProbabilityNN");
317 float eProbabilityNN = acc_eProbabilityNN(*xTrackParticle);
318 out = (tauLeadTrack->pt()>2000.) ? eProbabilityNN : eProbabilityHT;
319 }
320 else {
321 out = 0.;
322 }
323 return true;
324}
325
326bool leadTrackProbNNorHT_noTRT(const xAOD::TauJet &tau, double &out){
327 auto tracks = tau.allTracks();
328
329 // Sort tracks in descending pt order
330 if (!tracks.empty()) {
331 auto cmp_pt = [](const xAOD::TauTrack *lhs, const xAOD::TauTrack *rhs) {
332 return lhs->pt() > rhs->pt();
333 };
334 std::sort(tracks.begin(), tracks.end(), cmp_pt);
335
336 const xAOD::TauTrack* tauLeadTrack = tracks.at(0);
337 // Dummy values for eProbNN = 0.5, eProbHT = 1.
338 out = (tauLeadTrack->pt()>2000.) ? 0.5 : 1.;
339 }
340 else {
341 out = 0.;
342 }
343 return true;
344}
345
346
347
348bool EMFracFixed(const xAOD::TauJet &tau, double &out){
349 static const SG::ConstAccessor<float> acc_emFracFixed("EMFracFixed");
350 float emFracFixed = acc_emFracFixed(tau);
351 out = std::max(emFracFixed, 0.0f);
352 return true;
353}
354
355bool etHotShotWinOverPtLeadTrk(const xAOD::TauJet &tau, double &out){
356 static const SG::ConstAccessor<float> acc_etHotShotWinOverPtLeadTrk("etHotShotWinOverPtLeadTrk");
357 float etHotShotWinOverPtLeadTrk = acc_etHotShotWinOverPtLeadTrk(tau);
358 out = std::max(etHotShotWinOverPtLeadTrk, 1e-6f);
359 out = std::log10(out);
360 return true;
361}
362
363bool hadLeakFracFixed(const xAOD::TauJet &tau, double &out){
364 static const SG::ConstAccessor<float> acc_hadLeakFracFixed("hadLeakFracFixed");
365 float hadLeakFracFixed = acc_hadLeakFracFixed(tau);
366 out = std::max(0.f, hadLeakFracFixed);
367 return true;
368}
369
370bool PSFrac(const xAOD::TauJet &tau, double &out){
371 float PSFrac;
372 const auto success = tau.detail(TauDetail::PSSFraction, PSFrac);
373 out = std::max(0.f,PSFrac);
374 return success;
375}
376
377bool ClustersMeanCenterLambda(const xAOD::TauJet &tau, double &out){
379 const auto success = tau.detail(TauDetail::ClustersMeanCenterLambda, ClustersMeanCenterLambda);
380 out = std::max(0.f, ClustersMeanCenterLambda);
381 return success;
382}
383
384bool ClustersMeanEMProbability(const xAOD::TauJet &tau, double &out){
386 const auto success = tau.detail(TauDetail::ClustersMeanEMProbability, ClustersMeanEMProbability);
387 out = std::max(0.f, ClustersMeanEMProbability);
388 return success;
389}
390
391bool ClustersMeanFirstEngDens(const xAOD::TauJet &tau, double &out){
393 const auto success = tau.detail(TauDetail::ClustersMeanFirstEngDens, ClustersMeanFirstEngDens);
394 out = std::max(-10.f, ClustersMeanFirstEngDens);
395 return success;
396}
397
398bool ClustersMeanPresamplerFrac(const xAOD::TauJet &tau, double &out){
400 const auto success = tau.detail(TauDetail::ClustersMeanPresamplerFrac, ClustersMeanPresamplerFrac);
401 out = std::max(0.f, ClustersMeanPresamplerFrac);
402 return success;
403}
404
405bool ClustersMeanSecondLambda(const xAOD::TauJet &tau, double &out){
407 const auto success = tau.detail(TauDetail::ClustersMeanSecondLambda, ClustersMeanSecondLambda);
408 out = std::max(0.f, ClustersMeanSecondLambda);
409 return success;
410}
411
412namespace Track {
413
414bool pt_log(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
415 out = std::log10(track.pt());
416 return true;
417}
418
419bool pt_tau_log(const xAOD::TauJet &tau, const xAOD::TauTrack& /*track*/, double &out) {
420 out = std::log10(std::max(tau.pt(), 1e-6));
421 return true;
422}
423
424bool pt_jetseed_log(const xAOD::TauJet &tau, const xAOD::TauTrack& /*track*/, double &out) {
425 out = std::log10(tau.ptJetSeed());
426 return true;
427}
428
429bool z0sinThetaTJVA_abs_log(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
430 out = std::log10(std::abs(track.z0sinthetaTJVA()) + 1e-6);
431 return true;
432}
433
434bool d0_abs_log(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
435 out = std::log10(std::abs(track.d0TJVA()) + 1e-6);
436 return true;
437}
438
439bool z0sinthetaTJVA(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
440 out = track.z0sinthetaTJVA();
441 return true;
442}
443
444bool z0sinthetaSigTJVA(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
445 out = track.z0sinthetaSigTJVA();
446 return true;
447}
448
449bool d0TJVA(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
450 out = track.d0TJVA();
451 return true;
452}
453
454bool d0SigTJVA(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
455 out = track.d0SigTJVA();
456 return true;
457}
458
459bool dEta(const xAOD::TauJet &tau, const xAOD::TauTrack &track, double &out) {
460 out = track.eta() - tau.eta();
461 return true;
462}
463
464bool dPhi(const xAOD::TauJet &tau, const xAOD::TauTrack &track, double &out) {
465 out = track.p4().DeltaPhi(tau.p4());
466 return true;
467}
468
469bool nInnermostPixelHits(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
470 uint8_t inner_pixel_hits;
471 const auto success = track.track()->summaryValue(inner_pixel_hits, xAOD::numberOfInnermostPixelLayerHits);
472 out = inner_pixel_hits;
473 return success;
474}
475
476bool nPixelHits(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
477 uint8_t pixel_hits;
478 const auto success = track.track()->summaryValue(pixel_hits, xAOD::numberOfPixelHits);
479 out = pixel_hits;
480 return success;
481}
482
483bool nSCTHits(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
484 uint8_t sct_hits;
485 const auto success = track.track()->summaryValue(sct_hits, xAOD::numberOfSCTHits);
486 out = sct_hits;
487 return success;
488}
489
490// same as in tau track classification for trigger
491bool nIBLHitsAndExp(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
492 uint8_t inner_pixel_hits, inner_pixel_exp;
493 const auto success1 = track.track()->summaryValue(inner_pixel_hits, xAOD::numberOfInnermostPixelLayerHits);
494 const auto success2 = track.track()->summaryValue(inner_pixel_exp, xAOD::expectInnermostPixelLayerHit);
495 out = inner_pixel_exp ? inner_pixel_hits : 1.;
496 return success1 && success2;
497}
498
499bool nPixelHitsPlusDeadSensors(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
500 uint8_t pixel_hits, pixel_dead;
501 const auto success1 = track.track()->summaryValue(pixel_hits, xAOD::numberOfPixelHits);
502 const auto success2 = track.track()->summaryValue(pixel_dead, xAOD::numberOfPixelDeadSensors);
503 out = pixel_hits + pixel_dead;
504 return success1 && success2;
505}
506
507bool nSCTHitsPlusDeadSensors(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
508 uint8_t sct_hits, sct_dead;
509 const auto success1 = track.track()->summaryValue(sct_hits, xAOD::numberOfSCTHits);
510 const auto success2 = track.track()->summaryValue(sct_dead, xAOD::numberOfSCTDeadSensors);
511 out = sct_hits + sct_dead;
512 return success1 && success2;
513}
514
515bool eProbabilityNNorHT(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
516 auto atrack = track.track();
517 float eProbabilityHT = atrack->summaryValue(eProbabilityHT, xAOD::eProbabilityHT);
518 static const SG::ConstAccessor<float> acc_eProbabilityNN("eProbabilityNN");
519 float eProbabilityNN = acc_eProbabilityNN(*atrack);
520 out = (atrack->pt()>2000.) ? eProbabilityNN : eProbabilityHT;
521 return true;
522}
523
524bool eProbabilityNNorHT_noTRT(const xAOD::TauJet& /*tau*/, const xAOD::TauTrack &track, double &out) {
525 auto atrack = track.track();
526 // Dummy values for eProbNN = 0.5, eProbHT = 1
527 out = (atrack->pt()>2000.) ? 0.5 : 1.;
528 return true;
529}
530
531} // namespace Track
532
533
534namespace Cluster {
536
537bool et_log(const xAOD::TauJet& /*tau*/, const xAOD::CaloVertexedTopoCluster &cluster, double &out) {
538 out = std::log10(cluster.p4().Et());
539 return true;
540}
541
542bool pt_tau_log(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster& /*cluster*/, double &out) {
543 out = std::log10(std::max(tau.pt(), 1e-6));
544 return true;
545}
546
547bool pt_jetseed_log(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster& /*cluster*/, double &out) {
548 out = std::log10(tau.ptJetSeed());
549 return true;
550}
551
552bool dEta(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, double &out) {
553 out = cluster.eta() - tau.eta();
554 return true;
555}
556
557bool dPhi(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, double &out) {
558 out = cluster.p4().DeltaPhi(tau.p4());
559 return true;
560}
561
562bool SECOND_R(const xAOD::TauJet& /*tau*/, const xAOD::CaloVertexedTopoCluster &cluster, double &out) {
563 const auto success = cluster.clust().retrieveMoment(MomentType::SECOND_R, out);
564 out = std::log10(out + 0.1);
565 return success;
566}
567
568bool SECOND_LAMBDA(const xAOD::TauJet& /*tau*/, const xAOD::CaloVertexedTopoCluster &cluster, double &out) {
569 const auto success = cluster.clust().retrieveMoment(MomentType::SECOND_LAMBDA, out);
570 out = std::log10(out + 0.1);
571 return success;
572}
573
574bool CENTER_LAMBDA(const xAOD::TauJet& /*tau*/, const xAOD::CaloVertexedTopoCluster &cluster, double &out) {
575 const auto success = cluster.clust().retrieveMoment(MomentType::CENTER_LAMBDA, out);
576 out = std::log10(out + 1e-6);
577 return success;
578}
579
581 static const SG::ConstAccessor<float> acc_ClustersMeanSecondLambda("ClustersMeanSecondLambda");
582 float ClustersMeanSecondLambda = acc_ClustersMeanSecondLambda(tau);
583 double secondLambda(0);
584 const auto success = cluster.clust().retrieveMoment(MomentType::SECOND_LAMBDA, secondLambda);
585 out = (ClustersMeanSecondLambda != 0.) ? secondLambda/ClustersMeanSecondLambda : 0.;
586 return success;
587}
588
590 static const SG::ConstAccessor<float> acc_ClustersMeanCenterLambda("ClustersMeanCenterLambda");
591 float ClustersMeanCenterLambda = acc_ClustersMeanCenterLambda(tau);
592 double centerLambda(0);
593 const auto success = cluster.clust().retrieveMoment(MomentType::CENTER_LAMBDA, centerLambda);
594 if (ClustersMeanCenterLambda == 0.){
595 out = 250.;
596 }else {
597 out = centerLambda/ClustersMeanCenterLambda;
598 }
599
600 out = std::min(out, 250.);
601
602 return success;
603}
604
605
607 // the ClustersMeanFirstEngDens is the log10 of the energy weighted average of the First_ENG_DENS
608 // divided by ETot to make it dimension-less,
609 // so we need to evaluate the difference of log10(clusterFirstEngDens/clusterTotalEnergy) and the ClustersMeanFirstEngDens
610 double clusterFirstEngDens = 0.0;
611 bool status = cluster.clust().retrieveMoment(MomentType::FIRST_ENG_DENS, clusterFirstEngDens);
612 if (clusterFirstEngDens < 1e-6) clusterFirstEngDens = 1e-6;
613
614 static const SG::ConstAccessor<float> acc_ClusterTotalEnergy("ClusterTotalEnergy");
615 float clusterTotalEnergy = acc_ClusterTotalEnergy(tau);
616 if (clusterTotalEnergy < 1e-6) clusterTotalEnergy = 1e-6;
617
618 static const SG::ConstAccessor<float> acc_ClustersMeanFirstEngDens("ClustersMeanFirstEngDens");
619 float clustersMeanFirstEngDens = acc_ClustersMeanFirstEngDens(tau);
620
621 out = std::log10(clusterFirstEngDens/clusterTotalEnergy) - clustersMeanFirstEngDens;
622
623 return status;
624}
625
626} // namespace Cluster
627} // namespace Variables
628} // namespace TauJetRNNUtils
#define ATH_MSG_ERROR(x)
Helper class to provide constant type-safe access to aux data.
std::unordered_map< std::string, ClusterCalc > m_cluster_map
bool(*)(const xAOD::TauJet &, double &) ScalarCalc
bool compute(const std::string &name, const xAOD::TauJet &tau, double &out) const
void insert(const std::string &name, ScalarCalc func, const std::vector< std::string > &scalar_vars)
bool(*)(const xAOD::TauJet &, const xAOD::TauTrack &, double &) TrackCalc
std::unordered_map< std::string, ScalarCalc > m_scalar_map
bool(*)(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &, double &) ClusterCalc
std::unordered_map< std::string, TrackCalc > m_track_map
AsgMessaging(const std::string &name)
Constructor with a name.
bool retrieveMoment(MomentType type, double &value) const
Retrieve individual moment.
MomentType
Enums to identify different moments.
virtual FourMom_t p4() const final
The full 4-momentum of the particle.
const CaloCluster & clust() const
Return the cluster being proxied,.
virtual double eta() const final
The pseudorapidity ( ) of the particle.
Evaluate cluster kinematics with a different vertex / signal state.
double ptDetectorAxis() const
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition TauJet_v3.cxx:96
virtual double pt() const
The transverse momentum ( ) of the particle.
bool detail(TauJetParameters::Detail detail, int &value) const
Get and set values of common details variables via enum.
const TauTrack * track(size_t i, TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged, int *container_index=0) const
Get the pointer to a given tauTrack associated with this tau /*container index needed by trackNonCons...
double ptJetSeed() const
std::vector< const TauTrack * > allTracks() const
Get the v<const pointer> to all tracks associated with this tau, regardless of classification.
virtual double eta() const
The pseudorapidity ( ) of the particle.
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
virtual double pt() const
The transverse momentum ( ) of the particle.
float d0SigTJVA() const
const TrackParticle * track() const
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
xAOD::CaloCluster::MomentType MomentType
bool pt_tau_log(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &, double &out)
bool dPhi(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
bool SECOND_R(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
bool et_log(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
bool CENTER_LAMBDA(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
bool SECOND_LAMBDA(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
bool SECOND_LAMBDAOverClustersMeanSecondLambda(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
bool CENTER_LAMBDAOverClustersMeanCenterLambda(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
bool dEta(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
bool FirstEngDensOverClustersMeanFirstEngDens(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
bool pt_jetseed_log(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &, double &out)
bool dPhi(const xAOD::TauJet &tau, const xAOD::TauTrack &track, double &out)
bool pt_jetseed_log(const xAOD::TauJet &tau, const xAOD::TauTrack &, double &out)
bool pt_tau_log(const xAOD::TauJet &tau, const xAOD::TauTrack &, double &out)
bool d0TJVA(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool z0sinthetaSigTJVA(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool nPixelHits(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool nSCTHitsPlusDeadSensors(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool nInnermostPixelHits(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool nIBLHitsAndExp(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool pt_log(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool d0_abs_log(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool nPixelHitsPlusDeadSensors(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool nSCTHits(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool z0sinthetaTJVA(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool dEta(const xAOD::TauJet &tau, const xAOD::TauTrack &track, double &out)
bool eProbabilityNNorHT_noTRT(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool eProbabilityNNorHT(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool z0sinThetaTJVA_abs_log(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool d0SigTJVA(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
bool innerTrkAvgDist(const xAOD::TauJet &tau, double &out)
bool etOverPtLeadTrk(const xAOD::TauJet &tau, double &out)
bool ClustersMeanCenterLambda(const xAOD::TauJet &tau, double &out)
bool pt_tau_log(const xAOD::TauJet &tau, double &out)
bool ptJetSeed_log(const xAOD::TauJet &tau, double &out)
bool pt(const xAOD::TauJet &tau, double &out)
bool trFlightPathSig(const xAOD::TauJet &tau, double &out)
bool ptDetectorAxis(const xAOD::TauJet &tau, double &out)
bool ClustersMeanPresamplerFrac(const xAOD::TauJet &tau, double &out)
bool ClustersMeanFirstEngDens(const xAOD::TauJet &tau, double &out)
bool ClustersMeanEMProbability(const xAOD::TauJet &tau, double &out)
bool etHotShotWinOverPtLeadTrk(const xAOD::TauJet &tau, double &out)
bool PSFrac(const xAOD::TauJet &tau, double &out)
bool leadTrackDeltaEta(const xAOD::TauJet &tau, double &out)
bool hadLeakFracFixed(const xAOD::TauJet &tau, double &out)
bool ptRatioEflowApprox(const xAOD::TauJet &tau, double &out)
bool EMFracFixed(const xAOD::TauJet &tau, double &out)
bool leadTrackProbNNorHT(const xAOD::TauJet &tau, double &out)
bool EMPOverTrkSysP(const xAOD::TauJet &tau, double &out)
bool mEflowApprox(const xAOD::TauJet &tau, double &out)
bool absleadTrackEta(const xAOD::TauJet &tau, double &out)
bool absipSigLeadTrk(const xAOD::TauJet &tau, double &out)
bool leadTrackProbNNorHT_noTRT(const xAOD::TauJet &tau, double &out)
bool centFrac(const xAOD::TauJet &tau, double &out)
bool dRmax(const xAOD::TauJet &tau, double &out)
bool massTrkSys(const xAOD::TauJet &tau, double &out)
bool leadTrackDeltaPhi(const xAOD::TauJet &tau, double &out)
bool SumPtTrkFrac(const xAOD::TauJet &tau, double &out)
xAOD::TauJetParameters::Detail TauDetail
bool ClustersMeanSecondLambda(const xAOD::TauJet &tau, double &out)
std::unique_ptr< VarCalc > get_calculator(const std::vector< std::string > &scalar_vars, const std::vector< std::string > &track_vars, const std::vector< std::string > &cluster_vars, bool useTRT)
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
Detail
Enum for tau parameters - used mainly for backward compatibility with the analysis code.
Definition TauDefs.h:156
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TauTrack_v1 TauTrack
Definition of the current version.
Definition TauTrack.h:16
TauJet_v3 TauJet
Definition of the current "tau version".
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
@ 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].
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].