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
8 
11 #include <vector>
12 #include <string>
13 
14 #include "CLHEP/Units/SystemOfUnits.h"
15 
22 
23 // Athena initialize and finalize
25 {
26  ATH_MSG_DEBUG("initialize() ...");
27 
28  // load the matching tool
29  if( ! m_caloIsolationTool.empty() ) {
30  ATH_CHECK( m_caloIsolationTool.retrieve() );
31  ATH_MSG_INFO( "Successfully retrieved the CaloIsolationTool!" );
32  }
33 
34  if( ! m_trackIsolationTool.empty() ) {
35  ATH_CHECK( m_trackIsolationTool.retrieve() );
36  ATH_MSG_INFO( "Successfully retrieved the TrackIsolationTool!" );
37  }
38 
40 
41  m_trkCorrList.trackbitset.set(static_cast<unsigned int>(xAOD::Iso::coreTrackPtr));
42  m_topoconeCorrList.calobitset.set(static_cast<unsigned int>(xAOD::Iso::coreCone));
43  m_topoconeCorrList.calobitset.set(static_cast<unsigned int>(xAOD::Iso::pileupCorrection));
44  m_topoclusCorrList.calobitset.set(static_cast<unsigned int>(xAOD::Iso::pileupCorrection));
45 
47  m_ptconeTypes.clear();
48  m_ptvarconeTypes.clear();
49  m_topoetconeTypes.clear();
50 
51  for(unsigned int i=0; i<m_iso.size(); i++){
53  xAOD::Iso::IsolationFlavour flavour = static_cast<xAOD::Iso::IsolationFlavour>(isoType/10.);
54 
55  if(flavour == xAOD::Iso::ptcone) {
56  m_ptconeTypes.push_back(isoType);
58  }
59  if(flavour == xAOD::Iso::ptvarcone) {
60  m_ptvarconeTypes.push_back(isoType);
62  }
63  if(flavour == xAOD::Iso::topoetcone) {
64  m_topoetconeTypes.push_back(isoType);
66  m_topoetconeNonCoreConeDecoratorsKey.emplace_back(m_trackContainerKey.key() + "." + m_prefix + m_iso_suffix[i] + "NonCoreCone");
67  }
68  }
69  ATH_CHECK(m_ptconeDecoratorsKey.initialize());
70  ATH_CHECK(m_ptvarconeDecoratorsKey.initialize());
73 
74  // Set up the text-parsing machinery for thinning the tracks directly according to user cuts
75  if (not m_selectionString.empty()) {
76  ATH_CHECK(initializeParser(m_selectionString));
77  }
78 
79  if(not m_selFlag.empty()){
81  } else {
83  }
85 
86  return StatusCode::SUCCESS;
87 }
88 
90 {
91  ATH_MSG_DEBUG("finalize() ...");
92  ATH_CHECK(finalizeParser());
93 
94  return StatusCode::SUCCESS;
95 }
96 
98 {
99  // retrieve track container
100  SG::ReadHandle<xAOD::TrackParticleContainer> toDecorate(m_trackContainerKey,ctx);
101  ATH_CHECK( toDecorate.isValid() );
102 
103  // Execute the text parser and update the mask
104  std::vector<int> entries(toDecorate->size(), 1);
105  if (m_parser) {
106  entries = m_parser->evaluateAsVector();
107  if (entries.size() != toDecorate->size()) {
108  ATH_MSG_ERROR("Sizes incompatible! Are you sure your selection string used ID TrackParticles?");
109  return StatusCode::FAILURE;
110  }
111  }
112 
113  // build the decorators
114  std::vector<SG::WriteDecorHandle<xAOD::TrackParticleContainer, float>> ptconeDecorators;
115  for(unsigned int i=0; i<m_ptconeTypes.size(); i++){
116  ptconeDecorators.emplace_back(m_ptconeDecoratorsKey[i], ctx);
117  }
118  std::vector<SG::WriteDecorHandle<xAOD::TrackParticleContainer, float>> ptvarconeDecorators;
119  for(unsigned int i=0; i<m_ptvarconeTypes.size(); i++){
120  ptvarconeDecorators.emplace_back(m_ptconeDecoratorsKey[i], ctx);
121  }
122  std::vector<SG::WriteDecorHandle<xAOD::TrackParticleContainer, float>> topoetconeDecorators;
123  for(unsigned int i=0; i<m_topoetconeTypes.size(); i++){
124  topoetconeDecorators.emplace_back(m_topoetconeDecoratorsKey[i], ctx);
125  }
126  std::vector<SG::WriteDecorHandle<xAOD::TrackParticleContainer, float>> topoetconeNonCoreConeDecorators;
127  for(unsigned int i=0; i<m_topoetconeTypes.size(); i++){
128  topoetconeNonCoreConeDecorators.emplace_back(m_topoetconeNonCoreConeDecoratorsKey[i], ctx);
129  }
130 
131  SG::WriteDecorHandle<xAOD::TrackParticleContainer, int> dec_trkFlag(m_dec_trkFlagKey, ctx);
132 
134  int ipar=0;
135  for(auto particle : *toDecorate) {
136  bool IsPassed=true;
137 
139  if (!entries[ipar++]) IsPassed=false;
140 
142  if(not m_selFlag.empty()){
143  if(dec_trkFlag(*particle)!=m_selFlagValue) IsPassed=false;
144  }
145 
146  if(m_iso.size()>0){
147  if(IsPassed){
149  xAOD::TrackIsolation resultTrack;
150  xAOD::TrackIsolation resultTrackVar;
151  xAOD::CaloIsolation resultCalo;
152  xAOD::CaloIsolation resultCaloNonCoreCone;
153  if(m_ptconeTypes.size()) {
154 
155  if (m_trackIsolationTool->trackIsolation(resultTrack, *particle, m_ptconeTypes, m_trkCorrList)){
156  for(unsigned int i=0; i<m_ptconeTypes.size(); i++){
157  ptconeDecorators[i](*particle) = resultTrack.ptcones[i];
158  }
159  }else{
160  ATH_MSG_WARNING("Failed to apply the track isolation for a particle");
161  }
162  }
163 
164  if(m_ptvarconeTypes.size()) {
165 
166  std::vector<xAOD::Iso::IsolationType> ptconeTypes = {};
167  for(auto isoType : m_ptvarconeTypes) {
168  int iso_tmp = static_cast<int>(isoType);
169  iso_tmp -= m_diff_ptvarcone;
170  ptconeTypes.push_back(static_cast<xAOD::Iso::IsolationType>(iso_tmp));
171  }
172 
173  if (m_trackIsolationTool->trackIsolation(resultTrackVar, *particle, ptconeTypes, m_trkCorrList)){
174  for(unsigned int i=0; i<m_ptvarconeTypes.size(); i++){
175  ptvarconeDecorators[i](*particle) = resultTrackVar.ptvarcones_10GeVDivPt[i];
176  }
177  }else{
178  ATH_MSG_WARNING("Failed to apply the track isolation for a particle");
179  }
180  }
181 
182  if(m_topoetconeTypes.size()) {
183 
184  if (m_caloIsolationTool->caloTopoClusterIsolation(resultCalo, *particle, m_topoetconeTypes, m_topoconeCorrList)){
185  for(unsigned int i=0; i<m_topoetconeTypes.size(); i++){
186  topoetconeDecorators[i](*particle) = resultCalo.etcones[i];
187  }
188  }else{
189  ATH_MSG_WARNING("Failed to apply the track isolation for a particle");
190  }
191 
192  if (m_caloIsolationTool->caloTopoClusterIsolation(resultCaloNonCoreCone, *particle, m_topoetconeTypes, m_topoclusCorrList)){
193  for(unsigned int i=0; i<m_topoetconeTypes.size(); i++){
194  topoetconeNonCoreConeDecorators[i](*particle) = resultCaloNonCoreCone.etcones[i];
195  }
196  }else {
197  ATH_MSG_WARNING("Failed to apply the topo calo isolation for a particle ( non CoreCone )");
198  }
199 
200  }
201 
202  }else{
203  for(unsigned int i=0; i<m_ptconeTypes.size(); i++){
204  ptconeDecorators[i](*particle) = -999.e3;
205  }
206  for(unsigned int i=0; i<m_ptvarconeTypes.size(); i++){
207  ptvarconeDecorators[i](*particle) = -999.e3;
208  }
209  for(unsigned int i=0; i<m_topoetconeTypes.size(); i++){
210  topoetconeDecorators[i](*particle) = -999.e3;
211  topoetconeNonCoreConeDecorators[i](*particle) = -999.e3;
212  }
213  }
214  }
215  }
216 
217  return StatusCode::SUCCESS;
218 }
DerivationFramework::IsolationTrackDecorator::m_ptvarconeTypes
std::vector< xAOD::Iso::IsolationType > m_ptvarconeTypes
Definition: IsolationTrackDecorator.h:79
DerivationFramework::IsolationTrackDecorator::m_iso_suffix
StringArrayProperty m_iso_suffix
Definition: IsolationTrackDecorator.h:65
xAOD::Iso::topoetcone
@ topoetcone
Topo-cluster ET-sum.
Definition: IsolationFlavour.h:25
SGxAODProxyLoader.h
DerivationFramework::IsolationTrackDecorator::m_trackContainerKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackContainerKey
Definition: IsolationTrackDecorator.h:59
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
DerivationFramework::IsolationTrackDecorator::addBranches
virtual StatusCode addBranches(const EventContext &ctx) const override final
Definition: IsolationTrackDecorator.cxx:97
xAOD::TrackIsolation::ptvarcones_10GeVDivPt
std::vector< float > ptvarcones_10GeVDivPt
Definition: IsolationCommon.h:37
DerivationFramework::IsolationTrackDecorator::m_topoclusCorrList
xAOD::CaloCorrection m_topoclusCorrList
Definition: IsolationTrackDecorator.h:85
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::m_trackIsolationTool
ToolHandle< xAOD::ITrackIsolationTool > m_trackIsolationTool
Athena configured tools.
Definition: IsolationTrackDecorator.h:75
DerivationFramework::IsolationTrackDecorator::m_topoetconeDecoratorsKey
SG::WriteDecorHandleKeyArray< xAOD::TrackParticleContainer > m_topoetconeDecoratorsKey
Definition: IsolationTrackDecorator.h:91
xAOD::TrackCorrection::trackbitset
Iso::IsolationTrackCorrectionBitset trackbitset
Definition: IsolationCommon.h:19
DerivationFramework::IsolationTrackDecorator::m_trkCorrList
xAOD::TrackCorrection m_trkCorrList
Definition: IsolationTrackDecorator.h:83
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
DerivationFramework::IsolationTrackDecorator::m_selFlag
StringProperty m_selFlag
Definition: IsolationTrackDecorator.h:67
DerivationFramework::IsolationTrackDecorator::initialize
virtual StatusCode initialize() override final
Definition: IsolationTrackDecorator.cxx:24
xAOD::CaloIsolation
Definition: IsolationCommon.h:22
xAOD::Iso::ptvarcone
@ ptvarcone
mini isolation
Definition: IsolationFlavour.h:28
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
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.
DerivationFramework::IsolationTrackDecorator::m_topoetconeTypes
std::vector< xAOD::Iso::IsolationType > m_topoetconeTypes
Definition: IsolationTrackDecorator.h:80
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
DerivationFramework::IsolationTrackDecorator::m_prefix
StringProperty m_prefix
Definition: IsolationTrackDecorator.h:63
xAOD::Iso::ptcone
@ ptcone
Track isolation.
Definition: IsolationFlavour.h:22
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
DerivationFramework::IsolationTrackDecorator::m_ptconeTypes
std::vector< xAOD::Iso::IsolationType > m_ptconeTypes
Definition: IsolationTrackDecorator.h:78
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAOD::TrackIsolation
Definition: IsolationCommon.h:33
DerivationFramework::IsolationTrackDecorator::m_dec_trkFlagKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_dec_trkFlagKey
Definition: IsolationTrackDecorator.h:95
DerivationFramework::IsolationTrackDecorator::m_selectionString
StringProperty m_selectionString
Definition: IsolationTrackDecorator.h:61
DerivationFramework::IsolationTrackDecorator::m_ptconeDecoratorsKey
SG::WriteDecorHandleKeyArray< xAOD::TrackParticleContainer > m_ptconeDecoratorsKey
Definition: IsolationTrackDecorator.h:87
DerivationFramework::IsolationTrackDecorator::m_topoconeCorrList
xAOD::CaloCorrection m_topoconeCorrList
Definition: IsolationTrackDecorator.h:84
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
DerivationFramework::IsolationTrackDecorator::m_topoetconeNonCoreConeDecoratorsKey
SG::WriteDecorHandleKeyArray< xAOD::TrackParticleContainer > m_topoetconeNonCoreConeDecoratorsKey
Definition: IsolationTrackDecorator.h:93
MultipleProxyLoader.h
xAOD::TrackIsolation::ptcones
std::vector< float > ptcones
Definition: IsolationCommon.h:36
DerivationFramework::IsolationTrackDecorator::finalize
virtual StatusCode finalize() override final
Definition: IsolationTrackDecorator.cxx:89
SG::WriteDecorHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
entries
double entries
Definition: listroot.cxx:49
DerivationFramework::IsolationTrackDecorator::m_ptvarconeDecoratorsKey
SG::WriteDecorHandleKeyArray< xAOD::TrackParticleContainer > m_ptvarconeDecoratorsKey
Definition: IsolationTrackDecorator.h:89
DerivationFramework::IsolationTrackDecorator::m_caloIsolationTool
ToolHandle< xAOD::ICaloTopoClusterIsolationTool > m_caloIsolationTool
Definition: IsolationTrackDecorator.h:76
DerivationFramework::IsolationTrackDecorator::m_iso
IntegerArrayProperty m_iso
Definition: IsolationTrackDecorator.h:81
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
TrackingPrimitives.h
TrackParticleContainer.h
xAOD::CaloCorrection::calobitset
Iso::IsolationCaloCorrectionBitset calobitset
Definition: IsolationCommon.h:15
xAOD::Iso::pileupCorrection
@ pileupCorrection
fully corrected
Definition: Event/xAOD/xAODPrimitives/xAODPrimitives/IsolationCorrection.h:35