ATLAS Offline Software
TauElectronVetoVariables.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef XAOD_ANALYSIS
6 
8 
9 #include "xAODTau/TauJet.h"
13 
14 #include "GaudiKernel/SystemOfUnits.h"
15 
16 #include <algorithm>
17 #include <cmath>
18 #include <unordered_map>
19 #include <array>
20 
21 #include "TVector2.h"
22 
23 using Gaudi::Units::GeV;
24 
25 
28 }
29 
30 
31 
33  ATH_CHECK( m_caloExtensionTool.retrieve() );
34  if (!m_ParticleCacheKey.key().empty()) {
35  ATH_CHECK(m_ParticleCacheKey.initialize());
36  } else {
37  m_useOldCalo = true;
38  }
39  return StatusCode::SUCCESS;
40 }
41 
42 
43 
45  if (pTau.nTracks() < 1) {
46  return StatusCode::SUCCESS;
47  }
48  ATH_MSG_DEBUG("in execute()");
49  float detPhiTrk = 0.;
50  float detEtaTrk = 0.;
51  float clEtaTrk = 0.;
52  float distEtaTrk = 0.;
53  float energy_3phi[101] = {0.0};
54  float eta[101] = {0.0};
55  int max1 = 0;
56  int max2 = 0;
57  int max = 0;
58  int n = 0;
59  float Emax1 = 0.;
60  float Emax2 = 0.;
61  float etamaxcut = 0.158;
62  float phimaxcut = 0.1;
63  float signum_eta = 0.;
64  signum_eta = pTau.track(0)->eta() / std::abs(pTau.track(0)->eta());
65  float sumETCellsLAr = 0.;
66  float eta0cut = 0.075;
67  float eta1cut = 0.0475;
68  float eta2cut = 0.075;
69  float eta3cut = 1.5;
70  float phi0cut = 0.3;
71  float phi1cut = 0.3;
72  float phi2cut = 0.075;
73  float phi3cut = 0.075;
74  float etareg = 0.;
75  float etacase1 = 1.8;
76  float etagran1 = 0.00315;
77  float etagran2 = 0.00415;
78  float sumETCellsHad1 = 0.;
79  float etahadcut = 0.2;
80  float phihadcut = 0.2;
81  const CaloCell *pCell;
82  int trackIndex = -1;
83 
84  //---------------------------------------------------------------------
85  // Calculate eta, phi impact point of leading track at calorimeter layers EM 0,1,2,3
86  //---------------------------------------------------------------------
87  Trk::TrackParametersIdHelper parsIdHelper;
88  constexpr size_t numberOfEM_Layers{4};
89  constexpr double invalidCoordinate{-11111.};
90  constexpr double invalidCoordinateThreshold{-11110.};
91  std::array<double, numberOfEM_Layers> extrapolatedEta{};
92  std::array<double, numberOfEM_Layers> extrapolatedPhi{};
93  extrapolatedEta.fill(invalidCoordinate);
94  extrapolatedPhi.fill(invalidCoordinate);
95 
96  /*get the CaloExtension object*/
97  const Trk::CaloExtension * caloExtension = nullptr;
98  std::unique_ptr<Trk::CaloExtension> uniqueExtension ;
99  const xAOD::TrackParticle *orgTrack = pTau.track(0)->track();
100  trackIndex = orgTrack->index();
101  if (m_useOldCalo) {
102  /* If CaloExtensionBuilder is unavailable, use the calo extension tool */
103  ATH_MSG_VERBOSE("Using the CaloExtensionTool");
104  uniqueExtension = m_caloExtensionTool->caloExtension(
105  Gaudi::Hive::currentContext(), *orgTrack);
106  caloExtension = uniqueExtension.get();
107  } else {
108  /*get the CaloExtension object*/
109  ATH_MSG_VERBOSE("Using the CaloExtensionBuilder Cache");
111  caloExtension = (*particleCache)[trackIndex];
112  ATH_MSG_VERBOSE("Getting element " << trackIndex << " from the particleCache");
113  if( not caloExtension ){
114  ATH_MSG_VERBOSE("Cache does not contain a calo extension -> Calculating with the a CaloExtensionTool" );
115  uniqueExtension = m_caloExtensionTool->caloExtension(
116  Gaudi::Hive::currentContext(), *orgTrack);
117  caloExtension = uniqueExtension.get();
118  }
119  }
120  if( not caloExtension){
121  ATH_MSG_WARNING("extrapolation of leading track to calo surfaces failed : caloExtension is nullptr" );
122  return StatusCode::RECOVERABLE;
123  }
124  const std::vector<Trk::CurvilinearParameters>& clParametersVector = caloExtension->caloLayerIntersections();
125  if(clParametersVector.empty() ){
126  ATH_MSG_WARNING("extrapolation of leading track to calo surfaces failed : caloLayerIntersection is empty" );
127  return StatusCode::RECOVERABLE;
128  }
129  // loop over calo layers
130  for( const Trk::CurvilinearParameters& cur : clParametersVector ){
131  // only use entry layer
132  if( !parsIdHelper.isEntryToVolume(cur.cIdentifier()) ) continue;
133  CaloSampling::CaloSample sample = parsIdHelper.caloSample(cur.cIdentifier());
134  int index = -1;
136  else if( sample == CaloSampling::EME1 || sample == CaloSampling::EMB1 ) index = 1;
137  else if( sample == CaloSampling::EME2 || sample == CaloSampling::EMB2 ) index = 2;
138  else if( sample == CaloSampling::EME3 || sample == CaloSampling::EMB3 ) index = 3;
139  if( index < 0 ) continue;
140  extrapolatedEta[index] = cur.position().eta();
141  extrapolatedPhi[index] = cur.position().phi();
142  }
143  for (size_t i = 0; i < numberOfEM_Layers; ++i) {
144  if ( extrapolatedEta[i] < invalidCoordinateThreshold || extrapolatedPhi[i] < invalidCoordinateThreshold ){
145  ATH_MSG_DEBUG("extrapolation of leading track to calo surfaces failed for sampling : " << i );
146  return StatusCode::SUCCESS;
147  }
148  }
149 
150  // Loop through jets, get links to clusters
151  std::bitset<200000> cellSeen{};
152  const std::unordered_map<int, int> samplingLookup{
153  {4,0}, {5,1}, {6,2}, {7,3}, {8,12},
154  {15, 12}, {16,13}, {17,14}, {18,12}, {19, 13}, {20,14}
155  };
156  const auto notFound{samplingLookup.end()};
157 
158  std::vector<xAOD::CaloVertexedTopoCluster> vertexedClusterList = pTau.vertexedClusters();
159  for (const xAOD::CaloVertexedTopoCluster& vertexedCluster : vertexedClusterList){
160 
161  const xAOD::CaloCluster& cluster = vertexedCluster.clust();
162  auto cell_links = cluster.getCellLinks();
163  if (cell_links == nullptr) {
164  ATH_MSG_DEBUG("NO Cell links found for cluster with pT " << cluster.pt());
165  continue;
166  }
167  CaloClusterCellLink::const_iterator pCellIter = cluster.getCellLinks()->begin();
168  CaloClusterCellLink::const_iterator pCellIterE = cluster.getCellLinks()->end();
169  for (; pCellIter != pCellIterE; ++pCellIter) {
170  double cellEta{}, cellPhi{}, cellET{};
171  pCell = *pCellIter;
172  if (cellSeen.test(pCell->caloDDE()->calo_hash())) continue;
173  else cellSeen.set(pCell->caloDDE()->calo_hash());
174  if (m_doVertexCorrection && pTau.vertex()!=nullptr) {
175  CaloVertexedCell vxCell (*pCell, pTau.vertex()->position());
176  cellPhi = vxCell.phi();
177  cellEta = vxCell.eta();
178  cellET = vxCell.et();
179  } else {
180  cellPhi = pCell->phi();
181  cellEta = pCell->eta();
182  cellET = pCell->et();
183  }
184  int sampling = pCell->caloDDE()->getSampling();
185  if (const auto & pElement {samplingLookup.find(sampling)};pElement != notFound){
186  sampling = pElement->second;
187  }
188  int i = 2;
189  if (sampling < 4) i = sampling;
190  if (sampling == 12 || sampling == 13 || sampling == 14) i = 3;
191  detPhiTrk = TVector2::Phi_mpi_pi(cellPhi-extrapolatedPhi[i]);
192  detEtaTrk = std::abs( cellEta - extrapolatedEta[i] );
193  clEtaTrk = extrapolatedEta[i];
194  distEtaTrk = cellEta - extrapolatedEta[i];
195  if ((sampling == 0 && detEtaTrk < eta0cut && detPhiTrk < phi0cut) ||
196  (sampling == 1 && detEtaTrk < eta1cut && detPhiTrk < phi1cut) ||
197  (sampling == 2 && detEtaTrk < eta2cut && detPhiTrk < phi2cut) ||
198  (sampling == 3 && detEtaTrk < eta3cut && detPhiTrk < phi3cut)) {
199  sumETCellsLAr += cellET;
200  }
201  if (sampling == 12 && detEtaTrk < etahadcut && detPhiTrk < phihadcut) sumETCellsHad1 += cellET;
202  if (std::abs(cellEta) > 0.8 && std::abs(cellEta) <= 1.2 && (sampling == 13 || sampling == 14) && detEtaTrk < etahadcut && detPhiTrk < phihadcut) {
203  sumETCellsHad1 += cellET;
204  }
205  if (std::abs(pTau.track(0)->eta()) <= 1.7) {
206  if (sampling == 1 && detEtaTrk < etamaxcut && detPhiTrk <= phimaxcut) {
207  if ((std::abs(cellEta) < 1.37 || std::abs(cellEta) > 1.52) && std::abs(cellEta) < 1.85) {
208  if (std::abs(clEtaTrk) <= etacase1 && std::abs(cellEta) <= etacase1) {
209  n = 50 + int(distEtaTrk / etagran1);
210  }
211  if (std::abs(clEtaTrk) <= etacase1 && std::abs(cellEta) > etacase1) {
212  n = 50 + int(signum_eta * ((etacase1 - std::abs(clEtaTrk)) / etagran1 + (-etacase1 + std::abs(cellEta)) / etagran2));
213  }
214  energy_3phi[n] = energy_3phi[n] + cellET / GeV;
215  eta[n] = signum_eta * (clEtaTrk - cellEta);
216  } else {
217  energy_3phi[n] = 0;
218  eta[n] = 0;
219  }
220  }
221  } else {
222  energy_3phi[n] = 0;
223  eta[n] = 0;
224  }
225  if (std::abs(cellEta) <= etacase1) {
226  etareg = 0.00315;
227  } else {
228  etareg = 0.00415;
229  }
230  } //end cell loop
231  }// end jet constituent loop
232  for (int m1 = 0; m1 < 101; m1++) {
233  if ((energy_3phi[m1] > Emax1)) {
234  Emax1 = energy_3phi[m1];
235  max1 = m1;
236  }
237  }
238  for (int m2 = 1; m2 < 100; m2++) {
239  if (m2 == max1) continue;
240  if ((energy_3phi[m2] > Emax2) && (energy_3phi[m2] > energy_3phi[m2 - 1]) && (energy_3phi[m2] > energy_3phi[m2 + 1])) {
241  Emax2 = energy_3phi[m2];
242  max2 = m2;
243  }
244  }
245  if (std::abs(eta[max1]) >= etareg) {
246  max = max1;
247  } else {
248  max = max2;
249  }
250 
251  const xAOD::TrackParticle* leadTrack = pTau.track(0)->track();
252 
253  uint8_t TRTHits{0};
254  if ( !leadTrack->summaryValue( TRTHits, xAOD::SummaryType::numberOfTRTHits ) ){
255  ATH_MSG_DEBUG("retrieval of track summary value failed. Not filling electron veto variables for this one prong candidate");
256  return StatusCode::SUCCESS;
257  }
258 
259  uint8_t TRTHTHits{0};
260  if ( !leadTrack->summaryValue( TRTHTHits, xAOD::SummaryType::numberOfTRTHighThresholdHits ) ){
261  ATH_MSG_DEBUG("retrieval of track summary value failed. Not filling electron veto variables for this one prong candidate");
262  return StatusCode::SUCCESS;
263  }
264 
265  uint8_t TRTOutliers{0};
266  if ( !leadTrack->summaryValue( TRTOutliers, xAOD::SummaryType::numberOfTRTOutliers ) ){
267  ATH_MSG_DEBUG("retrieval of track summary value failed. Not filling electron veto variables for this one prong candidate");
268  return StatusCode::SUCCESS;
269  }
270 
271  uint8_t TRTHTOutliers{0};
272  if ( !leadTrack->summaryValue( TRTHTOutliers, xAOD::SummaryType::numberOfTRTHighThresholdOutliers ) ) {
273  ATH_MSG_DEBUG("retrieval of track summary value failed. Not filling electron veto variables for this one prong candidate");
274  return StatusCode::SUCCESS;
275  }
276 
277  float TRTratio = -9999.0;
278  if (TRTHits + TRTOutliers != 0) {
279  TRTratio = float( TRTHTHits + TRTHTOutliers) / float( TRTHits + TRTOutliers );
280  } else {
281  TRTratio = 0.0;
282  }
283 
286  pTau.setDetail(xAOD::TauJetParameters::hadLeakEt , static_cast<float>( sumETCellsHad1 / ( pTau.track(0)->pt() ) ) );
287  pTau.setDetail(xAOD::TauJetParameters::sumEMCellEtOverLeadTrkPt , static_cast<float>( ( sumETCellsLAr / ( pTau.track(0)->pt() ) ) ) );
288  return StatusCode::SUCCESS;
289 }
290 
291 #endif
CaloCell::phi
virtual double phi() const override final
get phi (through CaloDetDescrElement)
Definition: CaloCell.h:359
python.SystemOfUnits.m2
int m2
Definition: SystemOfUnits.py:92
CaloVertexedCell::eta
virtual double eta() const final
The pseudorapidity of the particle.
Definition: CaloVertexedCell.h:65
constants.EMB1
int EMB1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:53
TileDCSDataPlotter.max1
max1
Definition: TileDCSDataPlotter.py:884
xAOD::TauJetParameters::hadLeakEt
@ hadLeakEt
Definition: TauDefs.h:232
max
#define max(a, b)
Definition: cfImp.cxx:41
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
TauElectronVetoVariables::m_useOldCalo
Gaudi::Property< bool > m_useOldCalo
Definition: TauElectronVetoVariables.h:44
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
Trk::CaloExtension
Tracking class to hold the extrapolation from a particle from the ID to the muon system (or the other...
Definition: CaloExtension.h:18
beamspotman.cur
def cur
Definition: beamspotman.py:671
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
index
Definition: index.py:1
xAOD::TauTrack_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
xAOD::TrackParticle_v1::summaryValue
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
Definition: TrackParticle_v1.cxx:736
xAOD::TauJet_v3::nTracks
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
Definition: TauJet_v3.cxx:526
TauRecToolBase
The base class for all tau tools.
Definition: TauRecToolBase.h:21
Trk::TrackParametersIdHelper::caloSample
CaloSampling::CaloSample caloSample(TrackParametersIdentifier id) const
CaloSample encoded in id, returns CaloSampling::Unknown if id is not valid
Definition: TrackParametersIdHelper.h:91
xAOD::numberOfTRTHits
@ numberOfTRTHits
number of TRT hits [unit8_t].
Definition: TrackingPrimitives.h:275
xAOD::TauJetParameters::secMaxStripEt
@ secMaxStripEt
migrate only seedTrk_ variables which are used in reco and ID and without prefix
Definition: TauDefs.h:230
xAOD::Vertex_v1::position
const Amg::Vector3D & position() const
Returns the 3-pos.
CaloVertexedCell::phi
virtual double phi() const final
The aximuthal angle of the particle.
Definition: CaloVertexedCell.h:68
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
Phi_mpi_pi
__HOSTDEV__ double Phi_mpi_pi(double)
Definition: GeoRegion.cxx:7
Trk::TrackParametersIdHelper::isEntryToVolume
bool isEntryToVolume(TrackParametersIdentifier id) const
returns true if the id belongs to the volume entrance
Definition: TrackParametersIdHelper.h:81
xAOD::numberOfTRTHighThresholdHits
@ numberOfTRTHighThresholdHits
number of TRT hits which pass the high threshold (only xenon counted) [unit8_t].
Definition: TrackingPrimitives.h:278
Trk::TrackParametersIdHelper
helper class to encode and decode a TrackParametersIdentifier
Definition: TrackParametersIdHelper.h:18
xAOD::numberOfTRTHighThresholdOutliers
@ numberOfTRTHighThresholdOutliers
number of TRT high threshold outliers (only xenon counted) [unit8_t].
Definition: TrackingPrimitives.h:281
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
TauElectronVetoVariables::m_doVertexCorrection
Gaudi::Property< bool > m_doVertexCorrection
Definition: TauElectronVetoVariables.h:43
CaloDetDescrElement::calo_hash
IdentifierHash calo_hash() const
cell calo hash
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:412
python.changerun.m1
m1
Definition: changerun.py:32
TrackParametersIdHelper.h
TauElectronVetoVariables::m_ParticleCacheKey
SG::ReadHandleKey< CaloExtensionCollection > m_ParticleCacheKey
Definition: TauElectronVetoVariables.h:47
constants.EMB2
int EMB2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:54
FullCPAlgorithmsTest_eljob.sample
sample
Definition: FullCPAlgorithmsTest_eljob.py:100
TauElectronVetoVariables::execute
virtual StatusCode execute(xAOD::TauJet &pTau) const override
Execute - called for each tau candidate.
Definition: TauElectronVetoVariables.cxx:44
lumiFormat.i
int i
Definition: lumiFormat.py:92
CaloSampling::CaloSample
CaloSample
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:22
beamspotman.n
n
Definition: beamspotman.py:731
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::caloDDE
const CaloDetDescrElement * caloDDE() const
get pointer to CaloDetDescrElement (data member)
Definition: CaloCell.h:305
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:450
CaloCell::et
virtual double et() const override final
get et
Definition: CaloCell.h:407
constants.EME1
int EME1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:55
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TauElectronVetoVariables::TauElectronVetoVariables
TauElectronVetoVariables(const std::string &name)
Definition: TauElectronVetoVariables.cxx:26
Trk::CurvilinearParametersT
Definition: CurvilinearParametersT.h:48
SG::AuxElement::index
size_t index() const
Return the index of this element within its container.
xAOD::CaloCluster_v1::getCellLinks
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version)
Definition: CaloCluster_v1.cxx:905
xAOD::CaloCluster_v1::pt
virtual double pt() const
The transverse momentum ( ) of the particle (negative for negative-energy clusters)
Definition: CaloCluster_v1.cxx:247
xAOD::TauTrack_v1::pt
virtual double pt() const
The transverse momentum ( ) of the particle.
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
CaloCell_ID_FCS::EME3
@ EME3
Definition: FastCaloSim_CaloCell_ID.h:26
TauElectronVetoVariables.h
xAOD::TauJet_v3::vertexedClusters
std::vector< xAOD::CaloVertexedTopoCluster > vertexedClusters() const
Definition: TauJet_v3.cxx:626
xAOD::TauJetParameters::TRT_NHT_OVER_NLT
@ TRT_NHT_OVER_NLT
TRT hits high threshold over low threshold.
Definition: TauDefs.h:260
xAOD::numberOfTRTOutliers
@ numberOfTRTOutliers
number of TRT outliers [unit8_t].
Definition: TrackingPrimitives.h:276
IParticleCaloExtensionTool.h
DeMoScan.index
string index
Definition: DeMoScan.py:362
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
CaloVertexedCell
Evaluate cell kinematics with a different vertex.
Definition: CaloVertexedCell.h:37
TauElectronVetoVariables::initialize
virtual StatusCode initialize() override
Tool initializer.
Definition: TauElectronVetoVariables.cxx:32
CaloDetDescrElement::getSampling
CaloCell_ID::CaloSample getSampling() const
cell sampling
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:395
xAOD::TauJet_v3::vertex
const Vertex * vertex() const
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAOD::TauJetParameters::sumEMCellEtOverLeadTrkPt
@ sumEMCellEtOverLeadTrkPt
Definition: TauDefs.h:231
CaloCell_ID_FCS::PreSamplerE
@ PreSamplerE
Definition: FastCaloSim_CaloCell_ID.h:23
CaloCell_ID_FCS::PreSamplerB
@ PreSamplerB
Definition: FastCaloSim_CaloCell_ID.h:19
TauJet.h
xAOD::TauJet_v3::setDetail
void setDetail(TauJetParameters::Detail detail, int value)
Definition: TauJet_v3.cxx:337
P4EEtaPhiMBase::et
virtual double et() const
transverse energy defined to be e*sin(theta)
Definition: P4EEtaPhiMBase.cxx:106
xAOD::TauTrack_v1::track
const TrackParticle * track() const
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
CaloCell_ID_FCS::EMB3
@ EMB3
Definition: FastCaloSim_CaloCell_ID.h:22
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
readCCLHist.float
float
Definition: readCCLHist.py:83
constants.EME2
int EME2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:56
CaloVertexedCell.h
Evaluate cell kinematics with a different vertex.
CaloCell::eta
virtual double eta() const override final
get eta (through CaloDetDescrElement)
Definition: CaloCell.h:366
TauElectronVetoVariables::m_caloExtensionTool
ToolHandle< Trk::IParticleCaloExtensionTool > m_caloExtensionTool
Definition: TauElectronVetoVariables.h:45