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