ATLAS Offline Software
TauIDVarCalculator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
13 
14 #include "CaloGeoHelpers/CaloSampling.h"
16 
17 #include "TLorentzVector.h"
18 
19 const float TauIDVarCalculator::LOW_NUMBER = -1111.;
20 
23 }
24 
25 
26 
28  static const SG::Accessor<float> acc_absipSigLeadTrk("absipSigLeadTrk");
29  acc_absipSigLeadTrk(tau) = (tau.nTracks()>0) ? std::abs(tau.track(0)->d0SigTJVA()) : 0.;
30 
31  if(inTrigger()) return StatusCode::SUCCESS;
32 
33  //everything below is just for EleBDT!
34  static const SG::Accessor<float> acc_absEtaLead("ABS_ETA_LEAD_TRACK");
35  static const SG::Accessor<float> acc_absDeltaEta("TAU_ABSDELTAETA");
36  static const SG::Accessor<float> acc_absDeltaPhi("TAU_ABSDELTAPHI");
37  static const SG::ConstAccessor<float> acc_sumEMCellEtOverLeadTrkPt("sumEMCellEtOverLeadTrkPt");
38  static const SG::ConstAccessor<float> acc_etHadAtEMScale("etHadAtEMScale");
39  static const SG::ConstAccessor<float> acc_etEMAtEMScale("etEMAtEMScale");
40  static const SG::Accessor<float> acc_EMFractionAtEMScaleMOVEE3("EMFRACTIONATEMSCALE_MOVEE3");
41  static const SG::Accessor<float> acc_seedTrkSecMaxStripEtOverPt("TAU_SEEDTRK_SECMAXSTRIPETOVERPT");
42  static const SG::ConstAccessor<float> acc_secMaxStripEt("secMaxStripEt");
43  static const SG::ConstAccessor<float> acc_centFrac("centFrac");
44 
45  // Will: Fixed variables for R21
46  static const SG::Accessor<float> acc_EMFracFixed("EMFracFixed");
47  static const SG::Accessor<float> acc_hadLeakFracFixed("hadLeakFracFixed");
48  static const SG::Accessor<float> acc_etHotShotDR1("etHotShotDR1"); // replace secMaxStripEt
49  static const SG::Accessor<float> acc_etHotShotWin("etHotShotWin"); // replace secMaxStripEt
50  static const SG::Accessor<float> acc_etHotShotDR1OverPtLeadTrk("etHotShotDR1OverPtLeadTrk"); // replace TAU_SEEDTRK_SECMAXSTRIPETOVERPT
51  static const SG::Accessor<float> acc_etHotShotWinOverPtLeadTrk("etHotShotWinOverPtLeadTrk"); // replace TAU_SEEDTRK_SECMAXSTRIPETOVERPT
52 
53 
54  // EMFracFixed and eHad1AtEMScaleFixed (for acc_hadLeakFracFixed)
55  // --------------------------------------------------------------
56  // ECAL Layers: 0, 1, 2. Don't include 3 because it is mismodelled!
57  std::vector<CaloSampling::CaloSample> EMSamps = {
61  // All HCAL Layers
62  std::vector<CaloSampling::CaloSample> HadSamps = {
67  // First HCal Layer
68  std::vector<CaloSampling::CaloSample> Had1Samps = {
70 
71  float eEMAtEMScaleFixed = 0.;
72  float eHadAtEMScaleFixed = 0.;
73  float eHad1AtEMScaleFixed = 0.;
74 
75  TLorentzVector tauAxis = tauRecTools::getTauAxis(tau, m_doVertexCorrection);
76 
77  std::vector<xAOD::CaloVertexedTopoCluster> vertexedClusterList = tau.vertexedClusters();
78  for (const xAOD::CaloVertexedTopoCluster& vertexedCluster : vertexedClusterList){
79  TLorentzVector clusterP4 = vertexedCluster.p4();
80 
81  if( clusterP4.DeltaR(tauAxis) > 0.2 ) continue;
82 
83  const xAOD::CaloCluster& cluster = vertexedCluster.clust();
84  for( auto samp : EMSamps )
85  eEMAtEMScaleFixed += cluster.eSample(samp);
86  for( auto samp : HadSamps )
87  eHadAtEMScaleFixed += cluster.eSample(samp);
88  for( auto samp : Had1Samps )
89  eHad1AtEMScaleFixed += cluster.eSample(samp);
90  }
91  acc_EMFracFixed(tau) = ( eEMAtEMScaleFixed + eHadAtEMScaleFixed ) != 0. ?
92  eEMAtEMScaleFixed / ( eEMAtEMScaleFixed + eHadAtEMScaleFixed ) : LOW_NUMBER;
93 
94  if(tau.nTracks() > 0){
95  const xAOD::TrackParticle* track = tau.track(0)->track();
96  acc_absEtaLead(tau) = std::abs( track->eta() );
97  acc_absDeltaEta(tau) = std::abs( track->eta() - tau.eta() );
98  acc_absDeltaPhi(tau) = std::abs( track->p4().DeltaPhi(tau.p4()) );
99  //EMFRACTIONATEMSCALE_MOVEE3:
100  float etEMScale1 = acc_etEMAtEMScale(tau);
101  float etEMScale2 = acc_etHadAtEMScale(tau);
102  float tau_sumETCellsLAr = acc_sumEMCellEtOverLeadTrkPt(tau) * track->pt();
103  float tau_E3 = tau_sumETCellsLAr - etEMScale1;
104  float tau_seedCalo_etHadAtEMScale_noE3 = etEMScale2 - tau_E3;
105  float tau_seedCalo_etEMAtEMScale_yesE3 = etEMScale1 + tau_E3;
106  acc_EMFractionAtEMScaleMOVEE3(tau) = tau_seedCalo_etEMAtEMScale_yesE3 / (tau_seedCalo_etEMAtEMScale_yesE3 + tau_seedCalo_etHadAtEMScale_noE3);
107  //TAU_SEEDTRK_SECMAXSTRIPETOVERPT:
108  acc_seedTrkSecMaxStripEtOverPt(tau) = (track->pt() != 0.) ? acc_secMaxStripEt(tau) / track->pt() : LOW_NUMBER;
109 
110  // hadLeakFracFixed
111  acc_hadLeakFracFixed(tau) = (track->p4().P() != 0.) ? eHad1AtEMScaleFixed / track->p4().P() : LOW_NUMBER;
112 
113  // HOT SHOTS!!!!!
114  // --------------
115  // Get track position extrapolated to EM1
116  const xAOD::TauTrack* tauTrack = tau.track(0);
117  float etaCalo = -10.0;
118  float phiCalo = -10.0;
119  if( not tauTrack->detail(xAOD::TauJetParameters::CaloSamplingEtaEM, etaCalo))
120  ATH_MSG_WARNING("Failed to retrieve extrapolated chargedPFO eta");
121  if( not tauTrack->detail(xAOD::TauJetParameters::CaloSamplingPhiEM, phiCalo))
122  ATH_MSG_WARNING("Failed to retrieve extrapolated chargedPFO phi");
123  ATH_MSG_DEBUG("track EM " << ", eta: " << etaCalo << ", phi: " << phiCalo );
124 
125  // Get hottest shot in dR<0.1 and in 0.05 x 0.1 window
126  float etHotShotDR1 = 0.;
127  float etHotShotWin = 0.;
128  for( const auto& shotLink : tau.shotPFOLinks() ){
129  if( not shotLink.isValid() ){
130  ATH_MSG_WARNING("Invalid shotLink");
131  continue;
132  }
133  const xAOD::PFO* shot = *shotLink;
134  float etShot = 0.;
136 
137  // In dR < 0.1
138  if(xAOD::P4Helpers::deltaR(*shot, etaCalo, phiCalo, false) and etShot > etHotShotDR1){
139  etHotShotDR1 = etShot;
140  }
141  // In 0.012 x 0.1 window
142  if(std::abs(shot->eta() - etaCalo) > 0.012 ) continue;
143  if(std::abs(xAOD::P4Helpers::deltaPhi(shot->phi(), phiCalo)) > 0.1 ) continue;
144  if(etShot > etHotShotWin) etHotShotWin = etShot;
145  }
146  acc_etHotShotDR1(tau) = etHotShotDR1;
147  acc_etHotShotWin(tau) = etHotShotWin;
148  acc_etHotShotDR1OverPtLeadTrk(tau) = (track->pt() != 0.) ? etHotShotDR1 / track->pt() : LOW_NUMBER;
149  acc_etHotShotWinOverPtLeadTrk(tau) = (track->pt() != 0.) ? etHotShotWin / track->pt() : LOW_NUMBER;
150 
151  }
152  else{
153  acc_absEtaLead(tau) = LOW_NUMBER;
154  acc_absDeltaEta(tau) = LOW_NUMBER;
155  acc_absDeltaPhi(tau) = LOW_NUMBER;
156  acc_EMFractionAtEMScaleMOVEE3(tau) = LOW_NUMBER;
157  acc_seedTrkSecMaxStripEtOverPt(tau) = LOW_NUMBER;
158  acc_hadLeakFracFixed(tau) = LOW_NUMBER;
159  acc_etHotShotDR1(tau) = LOW_NUMBER;
160  acc_etHotShotWin(tau) = LOW_NUMBER;
161  acc_etHotShotDR1OverPtLeadTrk(tau) = LOW_NUMBER;
162  acc_etHotShotWinOverPtLeadTrk(tau) = LOW_NUMBER;
163  }
164 
165  return StatusCode::SUCCESS;
166 }
TauIDVarCalculator::execute
virtual StatusCode execute(xAOD::TauJet &) const override
Execute - called for each tau candidate.
Definition: TauIDVarCalculator.cxx:27
CaloCell_ID_FCS::TileExt2
@ TileExt2
Definition: FastCaloSim_CaloCell_ID.h:39
constants.EMB1
int EMB1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:53
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.
SG::Accessor< float >
xAODP4Helpers.h
xAOD::TauJetParameters::CaloSamplingPhiEM
@ CaloSamplingPhiEM
Definition: TauDefs.h:422
tauRecTools::getTauAxis
TLorentzVector getTauAxis(const xAOD::TauJet &tau, bool doVertexCorrection=true)
Return the four momentum of the tau axis The tau axis is widely used to select clusters and cells in ...
Definition: Reconstruction/tauRecTools/Root/HelperFunctions.cxx:33
CaloCell_ID_FCS::TileExt0
@ TileExt0
Definition: FastCaloSim_CaloCell_ID.h:37
CaloCell_ID_FCS::TileBar1
@ TileBar1
Definition: FastCaloSim_CaloCell_ID.h:32
xAOD::PFO_v1::attribute
bool attribute(PFODetails::PFOAttributes AttributeType, T &anAttribute) const
get a PFO Variable via enum
xAOD::PFO_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition: PFO_v1.cxx:60
xAOD::TauJet_v3::nTracks
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
Definition: TauJet_v3.cxx:488
TauRecToolBase
The base class for all tau tools.
Definition: TauRecToolBase.h:21
xAOD::P4Helpers::deltaPhi
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
Definition: xAODP4Helpers.h:69
SG::ConstAccessor< float >
xAOD::PFODetails::tauShots_pt3
@ tauShots_pt3
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:145
CaloCell_ID_FCS::HEC2
@ HEC2
Definition: FastCaloSim_CaloCell_ID.h:29
TauRecToolBase::inTrigger
bool inTrigger() const
Definition: TauRecToolBase.h:87
TauIDVarCalculator::TauIDVarCalculator
TauIDVarCalculator(const std::string &name="TauIDVarCalculator")
Definition: TauIDVarCalculator.cxx:21
CaloCell_ID_FCS::TileGap3
@ TileGap3
Definition: FastCaloSim_CaloCell_ID.h:36
xAOD::TauTrack_v1::detail
bool detail(TauJetParameters::TrackDetail detail, float &value) const
Definition: TauTrack_v1.cxx:152
TauIDVarCalculator.h
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:62
CaloCell_ID_FCS::HEC1
@ HEC1
Definition: FastCaloSim_CaloCell_ID.h:28
constants.EMB2
int EMB2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:54
xAOD::P4Helpers::deltaR
double deltaR(double rapidity1, double phi1, double rapidity2, double phi2)
from bare bare rapidity,phi
Definition: xAODP4Helpers.h:150
CaloCell_ID_FCS::TileBar0
@ TileBar0
Definition: FastCaloSim_CaloCell_ID.h:31
xAOD::TauJet_v3::shotPFOLinks
const PFOLinks_t & shotPFOLinks() const
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
CaloCell_ID_FCS::TileGap2
@ TileGap2
Definition: FastCaloSim_CaloCell_ID.h:35
TauIDVarCalculator::m_doVertexCorrection
Gaudi::Property< bool > m_doVertexCorrection
Definition: TauIDVarCalculator.h:34
xAOD::TauJet_v3
Class describing a tau jet.
Definition: TauJet_v3.h:41
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
constants.EME1
int EME1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:55
xAOD::PFO_v1::phi
virtual double phi() const
The azimuthal angle ( ) of the particle.
Definition: PFO_v1.cxx:67
CaloCell_ID_FCS::TileGap1
@ TileGap1
Definition: FastCaloSim_CaloCell_ID.h:34
xAOD::PFO_v1
Class describing a particle flow object.
Definition: PFO_v1.h:35
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
CaloCell_ID_FCS::TileExt1
@ TileExt1
Definition: FastCaloSim_CaloCell_ID.h:38
xAOD::TauJet_v3::vertexedClusters
std::vector< xAOD::CaloVertexedTopoCluster > vertexedClusters() const
Definition: TauJet_v3.cxx:586
TauIDVarCalculator::LOW_NUMBER
static const float LOW_NUMBER
Tau ID input variable calculator tool.
Definition: TauIDVarCalculator.h:30
CaloCell_ID_FCS::HEC0
@ HEC0
Definition: FastCaloSim_CaloCell_ID.h:27
xAOD::CaloCluster_v1::eSample
float eSample(const CaloSample sampling) const
Definition: CaloCluster_v1.cxx:514
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CaloCell_ID_FCS::PreSamplerE
@ PreSamplerE
Definition: FastCaloSim_CaloCell_ID.h:23
xAOD::TauTrack_v1
Definition: TauTrack_v1.h:27
CaloCell_ID_FCS::PreSamplerB
@ PreSamplerB
Definition: FastCaloSim_CaloCell_ID.h:19
xAOD::TauJet_v3::p4
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition: TauJet_v3.cxx:96
HelperFunctions.h
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
xAOD::CaloVertexedTopoCluster
Evaluate cluster kinematics with a different vertex / signal state.
Definition: Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloVertexedTopoCluster.h:38
xAOD::TauJetParameters::CaloSamplingEtaEM
@ CaloSamplingEtaEM
Definition: TauDefs.h:420
CaloCell_ID_FCS::HEC3
@ HEC3
Definition: FastCaloSim_CaloCell_ID.h:30
CaloCell_ID_FCS::TileBar2
@ TileBar2
Definition: FastCaloSim_CaloCell_ID.h:33
constants.EME2
int EME2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:56