ATLAS Offline Software
IsolationTrackDecorator.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 // IsolationDecorator.cxx, (c) ATLAS Detector software
8 
11 #include <vector>
12 #include <string>
13 
14 #include "CLHEP/Units/SystemOfUnits.h"
15 
22 
23 // Constructor
25  const std::string& n,
26  const IInterface* p):
27  base_class(t, n, p){}
28 
29 // Athena initialize and finalize
31 {
32  ATH_MSG_DEBUG("initialize() ...");
33 
34  // load the matching tool
35  if( ! m_caloIsolationTool.empty() ) {
36  ATH_CHECK( m_caloIsolationTool.retrieve() );
37  ATH_MSG_INFO( "Successfully retrieved the CaloIsolationTool!" );
38  }
39 
40  if( ! m_trackIsolationTool.empty() ) {
41  ATH_CHECK( m_trackIsolationTool.retrieve() );
42  ATH_MSG_INFO( "Successfully retrieved the TrackIsolationTool!" );
43  }
44 
45  ATH_CHECK(m_trackContainerKey.initialize());
46 
47  m_trkCorrList.trackbitset.set(static_cast<unsigned int>(xAOD::Iso::coreTrackPtr));
48  m_topoconeCorrList.calobitset.set(static_cast<unsigned int>(xAOD::Iso::coreCone));
49  m_topoconeCorrList.calobitset.set(static_cast<unsigned int>(xAOD::Iso::pileupCorrection));
50  m_topoclusCorrList.calobitset.set(static_cast<unsigned int>(xAOD::Iso::pileupCorrection));
51 
53  m_ptconeTypes.clear();
54  m_ptvarconeTypes.clear();
55  m_topoetconeTypes.clear();
56 
57  for(unsigned int i=0; i<m_iso.size(); i++){
58  xAOD::Iso::IsolationType isoType = static_cast<xAOD::Iso::IsolationType>(m_iso[i]);
59  xAOD::Iso::IsolationFlavour flavour = static_cast<xAOD::Iso::IsolationFlavour>(isoType/10.);
60 
61  if(flavour == xAOD::Iso::ptcone) {
62  m_ptconeTypes.push_back(isoType);
63  m_ptconeDecoratorsKey.emplace_back(m_trackContainerKey.key() + "." + m_prefix + m_iso_suffix[i]);
64  }
65  if(flavour == xAOD::Iso::ptvarcone) {
66  m_ptvarconeTypes.push_back(isoType);
67  m_ptvarconeDecoratorsKey.emplace_back(m_trackContainerKey.key() + "." + m_prefix + m_iso_suffix[i]);
68  }
69  if(flavour == xAOD::Iso::topoetcone) {
70  m_topoetconeTypes.push_back(isoType);
71  m_topoetconeDecoratorsKey.emplace_back(m_trackContainerKey.key() + "." + m_prefix + m_iso_suffix[i]);
72  m_topoetconeNonCoreConeDecoratorsKey.emplace_back(m_trackContainerKey.key() + "." + m_prefix + m_iso_suffix[i] + "NonCoreCone");
73  }
74  }
75  ATH_CHECK(m_ptconeDecoratorsKey.initialize());
76  ATH_CHECK(m_ptvarconeDecoratorsKey.initialize());
77  ATH_CHECK(m_topoetconeDecoratorsKey.initialize());
78  ATH_CHECK(m_topoetconeNonCoreConeDecoratorsKey.initialize());
79 
80  // Set up the text-parsing machinery for thinning the tracks directly according to user cuts
81  if (not m_selectionString.empty()) {
82  ATH_CHECK(initializeParser(m_selectionString));
83  }
84 
85  if(not m_selFlag.empty()){
86  m_dec_trkFlagKey = m_trackContainerKey.key() + "." + m_selFlag;
87  } else {
88  m_dec_trkFlagKey = m_trackContainerKey.key() + ".no_key";
89  }
90  ATH_CHECK(m_dec_trkFlagKey.initialize());
91 
92  return StatusCode::SUCCESS;
93 }
94 
96 {
97  ATH_MSG_DEBUG("finalize() ...");
98  ATH_CHECK(finalizeParser());
99 
100  return StatusCode::SUCCESS;
101 }
102 
104 {
105  // retrieve track container
106  SG::ReadHandle<xAOD::TrackParticleContainer> toDecorate(m_trackContainerKey,ctx);
107  ATH_CHECK( toDecorate.isValid() );
108 
109  // Execute the text parser and update the mask
110  std::vector<int> entries(toDecorate->size(), 1);
111  if (m_parser) {
112  entries = m_parser->evaluateAsVector();
113  if (entries.size() != toDecorate->size()) {
114  ATH_MSG_ERROR("Sizes incompatible! Are you sure your selection string used ID TrackParticles?");
115  return StatusCode::FAILURE;
116  }
117  }
118 
119  // build the decorators
120  std::vector<SG::WriteDecorHandle<xAOD::TrackParticleContainer, float>> ptconeDecorators;
121  for(unsigned int i=0; i<m_ptconeTypes.size(); i++){
122  ptconeDecorators.emplace_back(m_ptconeDecoratorsKey[i], ctx);
123  }
124  std::vector<SG::WriteDecorHandle<xAOD::TrackParticleContainer, float>> ptvarconeDecorators;
125  for(unsigned int i=0; i<m_ptvarconeTypes.size(); i++){
126  ptvarconeDecorators.emplace_back(m_ptconeDecoratorsKey[i], ctx);
127  }
128  std::vector<SG::WriteDecorHandle<xAOD::TrackParticleContainer, float>> topoetconeDecorators;
129  for(unsigned int i=0; i<m_topoetconeTypes.size(); i++){
130  topoetconeDecorators.emplace_back(m_topoetconeDecoratorsKey[i], ctx);
131  }
132  std::vector<SG::WriteDecorHandle<xAOD::TrackParticleContainer, float>> topoetconeNonCoreConeDecorators;
133  for(unsigned int i=0; i<m_topoetconeTypes.size(); i++){
134  topoetconeNonCoreConeDecorators.emplace_back(m_topoetconeNonCoreConeDecoratorsKey[i], ctx);
135  }
136 
137  SG::WriteDecorHandle<xAOD::TrackParticleContainer, int> dec_trkFlag(m_dec_trkFlagKey, ctx);
138 
140  int ipar=0;
141  for(auto particle : *toDecorate) {
142  bool IsPassed=true;
143 
145  if (!entries[ipar++]) IsPassed=false;
146 
148  if(not m_selFlag.empty()){
149  if(dec_trkFlag(*particle)!=m_selFlagValue) IsPassed=false;
150  }
151 
152  if(m_iso.size()>0){
153  if(IsPassed){
155  xAOD::TrackIsolation resultTrack;
156  xAOD::TrackIsolation resultTrackVar;
157  xAOD::CaloIsolation resultCalo;
158  xAOD::CaloIsolation resultCaloNonCoreCone;
159  if(m_ptconeTypes.size()) {
160 
161  if (m_trackIsolationTool->trackIsolation(resultTrack, *particle, m_ptconeTypes, m_trkCorrList)){
162  for(unsigned int i=0; i<m_ptconeTypes.size(); i++){
163  ptconeDecorators[i](*particle) = resultTrack.ptcones[i];
164  }
165  }else{
166  ATH_MSG_WARNING("Failed to apply the track isolation for a particle");
167  }
168  }
169 
170  if(m_ptvarconeTypes.size()) {
171 
172  std::vector<xAOD::Iso::IsolationType> ptconeTypes = {};
173  for(auto isoType : m_ptvarconeTypes) {
174  int iso_tmp = static_cast<int>(isoType);
175  iso_tmp -= m_diff_ptvarcone;
176  ptconeTypes.push_back(static_cast<xAOD::Iso::IsolationType>(iso_tmp));
177  }
178 
179  if (m_trackIsolationTool->trackIsolation(resultTrackVar, *particle, ptconeTypes, m_trkCorrList)){
180  for(unsigned int i=0; i<m_ptvarconeTypes.size(); i++){
181  ptvarconeDecorators[i](*particle) = resultTrackVar.ptvarcones_10GeVDivPt[i];
182  }
183  }else{
184  ATH_MSG_WARNING("Failed to apply the track isolation for a particle");
185  }
186  }
187 
188  if(m_topoetconeTypes.size()) {
189 
190  if (m_caloIsolationTool->caloTopoClusterIsolation(resultCalo, *particle, m_topoetconeTypes, m_topoconeCorrList)){
191  for(unsigned int i=0; i<m_topoetconeTypes.size(); i++){
192  topoetconeDecorators[i](*particle) = resultCalo.etcones[i];
193  }
194  }else{
195  ATH_MSG_WARNING("Failed to apply the track isolation for a particle");
196  }
197 
198  if (m_caloIsolationTool->caloTopoClusterIsolation(resultCaloNonCoreCone, *particle, m_topoetconeTypes, m_topoclusCorrList)){
199  for(unsigned int i=0; i<m_topoetconeTypes.size(); i++){
200  topoetconeNonCoreConeDecorators[i](*particle) = resultCaloNonCoreCone.etcones[i];
201  }
202  }else {
203  ATH_MSG_WARNING("Failed to apply the topo calo isolation for a particle ( non CoreCone )");
204  }
205 
206  }
207 
208  }else{
209  for(unsigned int i=0; i<m_ptconeTypes.size(); i++){
210  ptconeDecorators[i](*particle) = -999.e3;
211  }
212  for(unsigned int i=0; i<m_ptvarconeTypes.size(); i++){
213  ptvarconeDecorators[i](*particle) = -999.e3;
214  }
215  for(unsigned int i=0; i<m_topoetconeTypes.size(); i++){
216  topoetconeDecorators[i](*particle) = -999.e3;
217  topoetconeNonCoreConeDecorators[i](*particle) = -999.e3;
218  }
219  }
220  }
221  }
222 
223  return StatusCode::SUCCESS;
224 }
xAOD::Iso::topoetcone
@ topoetcone
Topo-cluster ET-sum.
Definition: IsolationFlavour.h:25
SGxAODProxyLoader.h
Trk::ParticleSwitcher::particle
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:79
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
xAOD::TrackIsolation::ptvarcones_10GeVDivPt
std::vector< float > ptvarcones_10GeVDivPt
Definition: IsolationCommon.h:37
IsolationTrackDecorator.h
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
xAOD::Iso::IsolationFlavour
IsolationFlavour
Enumeration for different ways of calculating isolation in xAOD files.
Definition: IsolationFlavour.h:17
xAOD::Iso::coreTrackPtr
@ coreTrackPtr
tracks pointer
Definition: Event/xAOD/xAODPrimitives/xAODPrimitives/IsolationCorrection.h:66
DerivationFramework::IsolationTrackDecorator::initialize
virtual StatusCode initialize() override
Definition: IsolationTrackDecorator.cxx:30
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
xAOD::CaloIsolation
Definition: IsolationCommon.h:22
xAOD::Iso::ptvarcone
@ ptvarcone
mini isolation
Definition: IsolationFlavour.h:28
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:209
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
DerivationFramework::IsolationTrackDecorator::addBranches
virtual StatusCode addBranches(const EventContext &ctx) const override
Definition: IsolationTrackDecorator.cxx:103
lumiFormat.i
int i
Definition: lumiFormat.py:85
beamspotman.n
n
Definition: beamspotman.py:727
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
xAOD::Iso::IsolationType
IsolationType
Overall enumeration for isolation types in xAOD files.
Definition: IsolationType.h:26
SG::WriteDecorHandle
Handle class for adding a decoration to an object.
Definition: StoreGate/StoreGate/WriteDecorHandle.h:100
WriteDecorHandle.h
Handle class for adding a decoration to an object.
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::Iso::ptcone
@ ptcone
Track isolation.
Definition: IsolationFlavour.h:22
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAOD::TrackIsolation
Definition: IsolationCommon.h:33
DerivationFramework::IsolationTrackDecorator::finalize
virtual StatusCode finalize() override
Definition: IsolationTrackDecorator.cxx:95
errorcheck.h
Helpers for checking error return status codes and reporting errors.
xAOD::CaloIsolation::etcones
std::vector< float > etcones
Definition: IsolationCommon.h:30
xAOD::Iso::coreCone
@ coreCone
core energy (in dR<0.1).
Definition: Event/xAOD/xAODPrimitives/xAODPrimitives/IsolationCorrection.h:29
EventInfo.h
MultipleProxyLoader.h
xAOD::TrackIsolation::ptcones
std::vector< float > ptcones
Definition: IsolationCommon.h:36
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
DerivationFramework::IsolationTrackDecorator::IsolationTrackDecorator
IsolationTrackDecorator(const std::string &t, const std::string &n, const IInterface *p)
Constructor with parameters.
Definition: IsolationTrackDecorator.cxx:24
entries
double entries
Definition: listroot.cxx:49
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
TrackingPrimitives.h
TrackParticleContainer.h
xAOD::Iso::pileupCorrection
@ pileupCorrection
fully corrected
Definition: Event/xAOD/xAODPrimitives/xAODPrimitives/IsolationCorrection.h:35