ATLAS Offline Software
Loading...
Searching...
No Matches
OfflineJetDecoratorAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
9
13
14
19 const std::string& name,
20 ISvcLocator* pSvcLocator ) :
21 AthReentrantAlgorithm( name, pSvcLocator ) { }
22
23
28
30 not m_offlineTrkParticlesName.key().empty() ) );
31
32 ATH_CHECK( m_jetsName.initialize( not m_jetsName.key().empty() ) );
33
38
39 if( m_decor_jet.size() != NDecorations ) {
40 ATH_MSG_ERROR( "Incorrect booking of jet decorations" );
41 return StatusCode::FAILURE;
42 }
43
44 return StatusCode::SUCCESS;
45}
46
47
51StatusCode IDTPM::OfflineJetDecoratorAlg::execute( const EventContext& ctx ) const {
52
55 if( not ptracks.isValid() ) {
56 ATH_MSG_ERROR( "Failed to retrieve track particles container" );
57 return StatusCode::FAILURE;
58 }
59
62 if( not pjets.isValid() ) {
63 ATH_MSG_ERROR( "Failed to retrieve jets container" );
64 return StatusCode::FAILURE;
65 }
66
68 if( IDTPM::decorationsAllExist( *ptracks, m_decor_jet ) ) {
69 ATH_MSG_DEBUG( "All decorations already exist. Exiting gracefully" );
70 return StatusCode::SUCCESS;
71 }
72
74 std::vector< IDTPM::OptionalDecoration<xAOD::TrackParticleContainer, ElementJetLink_t> >
75 jet_decor( IDTPM::createDecoratorsIfNeeded( *ptracks, m_decor_jet, ctx ) );
76
77 if( jet_decor.empty() ) {
78 ATH_MSG_ERROR( "Failed to book jet decorations" );
79 return StatusCode::FAILURE;
80 }
81
82 for( const xAOD::TrackParticle* track : *ptracks ) {
84 ATH_CHECK( decorateJetTrack( *track, jet_decor, *pjets.ptr() ) );
85 }
86
87 return StatusCode::SUCCESS;
88}
89
90
95 const xAOD::TrackParticle& track,
97 ElementJetLink_t > >& jet_decor,
98 const xAOD::JetContainer& jets ) const
99{
101 //static const SG::ConstAccessor<
102 // std::vector< ElementLink< xAOD::IParticleContainer > > > ghostTruth( "GhostTruth" );
103 static const SG::ConstAccessor< int > truthJetTagLabel( "HadronConeExclTruthLabelID" );
104
106 for( const xAOD::Jet* jet : jets ) {
108 if( not passJetCuts( *jet ) ) continue;
109
111 if( deltaR( *jet, track ) > m_maxTrkJetDR.value() ) continue;
112
114 bool isTruthCjet = false;
115 bool isTruthBjet = false;
116 if( not truthJetTagLabel.isAvailable( *jet ) ) {
117 ATH_MSG_WARNING( "Failed to extract b-tag truth label from jet" );
118 } else {
119 isTruthCjet = ( truthJetTagLabel( *jet ) == 4 );
120 isTruthBjet = ( truthJetTagLabel( *jet ) == 5 );
121 }
122
124 ElementJetLink_t jetLink;
125 jetLink.toContainedElement( jets, jet );
126
127 ATH_MSG_DEBUG( "Found matching jet (en=" << jet->e() << "). Decorating track." );
128
130 IDTPM::decorateOrRejectQuietly( track, jet_decor[DRtruthJet], jetLink );
131
132 if( isTruthBjet ) {
134 IDTPM::decorateOrRejectQuietly( track, jet_decor[DRtruthBjet], jetLink );
136 IDTPM::decorateOrRejectQuietly( track, jet_decor[DRtruthHeavyJet], jetLink );
137 } else if( isTruthCjet ) {
139 IDTPM::decorateOrRejectQuietly( track, jet_decor[DRtruthCjet], jetLink );
141 IDTPM::decorateOrRejectQuietly( track, jet_decor[DRtruthHeavyJet], jetLink );
142 } else {
144 IDTPM::decorateOrRejectQuietly( track, jet_decor[DRtruthLightJet], jetLink );
145 }
146
149
150 } // close jets loop
151
152 return StatusCode::SUCCESS;
153}
154
156{
157 const float jetPt = jet.pt();
158 const float jetEta = std::abs( jet.eta() );
159
160 if( jetEta < m_jetAbsEtaMin ) return false;
161 if( jetEta > m_jetAbsEtaMax ) return false;
162 if( jetPt < m_jetPtMin ) return false;
163 if( jetPt > m_jetPtMax ) return false;
164 return true;
165}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Algorithm to decorate offline tracks with the corresponding (reco or truth) jet object.
Utility methods to access track/truth particles parmeters in a consitent way in this package.
An algorithm that can be simultaneously executed in multiple threads.
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_offlineTrkParticlesName
virtual StatusCode initialize() override
virtual StatusCode execute(const EventContext &ctx) const override
std::vector< IDTPM::WriteKeyAccessorPair< xAOD::TrackParticleContainer, ElementJetLink_t > > m_decor_jet
StatusCode decorateJetTrack(const xAOD::TrackParticle &track, std::vector< IDTPM::OptionalDecoration< xAOD::TrackParticleContainer, ElementJetLink_t > > &jet_decor, const xAOD::JetContainer &jets) const
const std::vector< std::string > m_decor_jet_names
OfflineJetDecoratorAlg(const std::string &name, ISvcLocator *pSvcLocator)
Local includes.
bool passJetCuts(const xAOD::Jet &jet) const
SG::ReadHandleKey< xAOD::JetContainer > m_jetsName
ElementLink< xAOD::JetContainer > ElementJetLink_t
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
const_pointer_type ptr()
Dereference the pointer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
std::pair< SG::WriteDecorHandle< ContainerType, VariableType >, bool > OptionalDecoration
bool decorationsAllExist(const T_Cont &container, const std::vector< WriteKeyAccessorPair< T_Cont, T > > &keys, bool verbose=false)
Like above - FIXME: maybe not needed.
void createDecoratorKeysAndAccessor(T_Parent &parent, const SG::ReadHandleKey< T_Cont > &container_key, const std::string &prefix, const std::vector< std::string > &decor_names, std::vector< WriteKeyAccessorPair< T_Cont, T > > &decor_out)
create a pair composed of a WriteDecorHandleKey to create a decorator handle and an accessor to check...
std::vector< OptionalDecoration< T_Cont, T > > createDecoratorsIfNeeded(const T_Cont &container, const std::vector< WriteKeyAccessorPair< T_Cont, T > > &keys, const EventContext &ctx, bool verbose=false)
create/book the decorations if they do not exist already
void decorateOrRejectQuietly(const T_Cont_Elm &particle, OptionalDecoration< T_Cont, T > &decorator, const T &value)
Safe method to fill the decoration if decor flag is true.
float deltaR(const U1 &p1, const U2 &p2)
Accessor utility function for getting the DeltaR betwen two tracks.
Jet_v1 Jet
Definition of the current "jet version".
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
JetContainer_v1 JetContainer
Definition of the current "jet container version".