ATLAS Offline Software
Loading...
Searching...
No Matches
JetManagerTool.cxx
Go to the documentation of this file.
1/*
2Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
7
8namespace Trig {
9
10//**********************************************************************
11
12JetManagerTool::JetManagerTool(const std::string& name)
13 : asg::AsgTool(name)
14{}
15
17 ATH_MSG_DEBUG( "Initializing " << name() );
18
20
22
23 m_bjetInputKey = m_jetcontainer.value() + "_bJets";
24 ATH_CHECK(m_bjetInputKey.initialize( !m_jetInputKey.key().empty() and m_LHCPeriod == 3 ));
25
26 ATH_CHECK(m_btagInputKey.initialize(m_LHCPeriod == 2));
27
28
29 return StatusCode::SUCCESS;
30}
31
32StatusCode JetManagerTool::retrieveByContainer(const EventContext& ctx,
33 EmulContext& emulCtx) const
34{
35 ATH_MSG_DEBUG( "Retrieving via Container ..." );
36
37 auto outputJets = std::make_unique<std::vector<TrigBtagEmulationJet>>();
38 auto sortedPreselJets = std::make_unique<std::vector<TrigBtagEmulationJet>>();
39
40 // Get Jet Objects
41 // We are retrieving xAOD::Jet object
42 // This will first retrieve the jets in the event given the jet input key <jet-key>
43 // then it retrieves the corresponding b-jet collection <jet-key>_bJets
44 // replacing the non-b-jets with the b-jets
45
46 // Retrieve jets
47 ATH_MSG_DEBUG("Retrieving jet collection: " << m_jetInputKey.key());
49 ATH_CHECK(jetContainerHandle.isValid());
50 const xAOD::JetContainer* theJetContainer = jetContainerHandle.cptr();
51 // Put in storage
52 outputJets->reserve(theJetContainer->size());
53 sortedPreselJets->reserve(theJetContainer->size());
54
55 if (m_LHCPeriod == 3) {
56 // Retrieve jets
57 for ( const xAOD::Jet *jet : *theJetContainer ) {
59 outputJets->push_back( toAdd );
60 }
61
62 // Retrieve b-Jets
63 ATH_MSG_DEBUG("Retrieving b-jet collection: " << m_bjetInputKey.key());
65 // if not valid, it means there is no corresponding b-jet collection
66 // this happens for instance for presel jets
67 // so this is ok
68 if ( bjetContainerHandle.isValid() ) {
69 ATH_CHECK( bjetContainerHandle.isValid() );
70 const xAOD::JetContainer* theBJetContainer = bjetContainerHandle.cptr();
71
72 // Replace jets with b-jets
73 // - loop on bjets
74 for ( const xAOD::Jet *bjet : *theBJetContainer ) {
75 // - loop on stored jets
76 for (std::size_t ijet(0); ijet < outputJets->size(); ijet++) {
77 const auto &emuljet = outputJets->at(ijet);
78 const xAOD::Jet* jet = emuljet.jet();
79
80 // To-Do: find better way
81 if (bjet->pt() == jet->pt() && bjet->eta() == jet->eta() &&
82 bjet->phi() == jet->phi()) {
83 outputJets->at(ijet) = TrigBtagEmulationJet(*bjet, m_btagging_link.value());
84 break;
85 }
86 }
87 }
88 } // is valid
89
90 // Prepare presel jets
91 for ( const auto& jet : *outputJets.get() ) {
92 const xAOD::Jet *theJet = jet.jet();
93 sortedPreselJets->push_back( TrigBtagEmulationJet(*theJet) );
94 }
95
96
97 // Sort presel jets
98 sort(sortedPreselJets->begin(), sortedPreselJets->end(),
99 [] (const auto& lhs, const auto& rhs) -> bool
100 { return lhs.pt() > rhs.pt(); }
101 );
102
103 ATH_MSG_DEBUG( " - Ten largest jets:");
104 for(unsigned int i = 0; i < 10 and i < sortedPreselJets->size(); i++) {
105 ATH_MSG_DEBUG( " - pt=" << (sortedPreselJets->at(i).pt() * 0.001) << " eta=" << sortedPreselJets->at(i).eta() );
106 }
107 }
108 else if (m_LHCPeriod == 2) {
109 if (jetContainerName().find("a4tcemsubjes") != std::string::npos) {
110 ATH_MSG_DEBUG(jetContainerName() << " is not a b-jet collection. Do not retrieve b-tagging information.");
111 for ( const xAOD::Jet *jet : *theJetContainer ) {
112 TrigBtagEmulationJet toAdd(*jet, nullptr);
113 outputJets->push_back( toAdd );
114 }
115
116 } else {
117
118 // Retrieve b-tagging information
119 // based on https://gitlab.cern.ch/atlas-trigger/b-jet/TrigBtagEmulationTool/-/blob/21.2/Root/JetManager.cxx#L423
120 ATH_MSG_DEBUG("Retrieving b-tagging collection: " << m_btagInputKey.key());
122 ATH_CHECK(btagContainerHandle.isValid());
123 const xAOD::BTaggingContainer *theBTagContainer = btagContainerHandle.cptr();
124 ATH_MSG_DEBUG("jet container size: " << theJetContainer->size() << ", btag container size: " << theBTagContainer->size());
125
126 if (msgLvl(MSG::DEBUG)) {
127 for (const xAOD::Jet *jet : *theJetContainer) {
128 ATH_MSG_DEBUG("Jet pt=" << (jet->pt() * 0.001) << " eta=" << jet->eta());
129 }
130 }
131
132 bool isGSCchain = jetContainerName().find("GSC")!=std::string::npos;
133
134 for ( const xAOD::BTagging *btag : *theBTagContainer ) {
135 static const SG::ConstAccessor<std::vector<ElementLink<xAOD::IParticleContainer>>> btagToJetAccessor("BTagBtagToJetAssociator");
136 if (btagToJetAccessor.isAvailable(*btag)) {
137 const auto &jetLink = btagToJetAccessor(*btag);
138 if (jetLink.size() > 0 && jetLink.at(0).isValid()) {
139 const xAOD::Jet *btaggedJet = static_cast<const xAOD::Jet *>(*jetLink.at(0));
140 double mv2c20_score, mv2c10_score;
141 btag->MVx_discriminant("MV2c20", mv2c20_score);
142 btag->MVx_discriminant("MV2c10", mv2c10_score);
143 ATH_MSG_DEBUG("BTagging jet link index "
144 << jetLink.at(0).index() << " pt=" << (btaggedJet->pt() * 0.001) << " eta=" << btaggedJet->eta()
145 << ", mv2c20=" << mv2c20_score << ", mv2c10=" << mv2c10_score);
146
147 // First check if the btagged jet is present in the jets retrieved by // the container
148 const xAOD::Jet *matchedJet = nullptr;
149
150 bool isJetPresent = false;
151 for (const xAOD::Jet *theJet : *theJetContainer) {
152
153 if ((!isGSCchain && btaggedJet == theJet) || // For non-GSC chains check if the btagged and container jets are the same
154 (isGSCchain && matchedSPLITjet( btaggedJet, theJet))) { // For GSC chains check if the container jets satisfy the dR matching with the btagged jet
155 matchedJet = theJet;
156 isJetPresent = true;
157 break;
158 }
159 }
160 if (matchedJet == nullptr) {
161 ATH_MSG_DEBUG("Matched jet pointer is invalid...");
162 continue;
163 } else {
164 ATH_MSG_DEBUG("Matched jet found: " << matchedJet);
165 }
166
167 // Check if the linked Jet has already been found
168 bool isJetUnique = true;
169 for (TrigBtagEmulationJet &j : *outputJets.get())
170 if (matchedJet->p4().Et() == j.et() &&
171 matchedJet->eta() == j.eta() && matchedJet->phi() == j.phi()) {
172 isJetUnique = false;
173 }
174
175 // Save Jet and BTagging objects if jet is found and unique
176 if (isJetPresent && isJetUnique) {
177 outputJets->push_back(TrigBtagEmulationJet(*matchedJet, btag));
178 }
179 }
180 }
181 }
182 }
183 }
184
185 // Store objects
186 const std::string storage_name = m_jetInputKey.key();
187 emulCtx.store( storage_name, std::move(outputJets) );
188 if (m_LHCPeriod == 3) {
189 emulCtx.store( storage_name + "_presel", std::move(sortedPreselJets) );
190 }
191
192 return StatusCode::SUCCESS;
193}
194
195const std::vector<TrigBtagEmulationJet>& JetManagerTool::getJets(const EmulContext& emulCtx) const
196{
197 return *emulCtx.get<std::vector<TrigBtagEmulationJet>>(m_jetcontainer.value());
198}
199const std::vector<TrigBtagEmulationJet>& JetManagerTool::getSortedPreselJets(const EmulContext& emulCtx) const
200{
201 return *emulCtx.get<std::vector<TrigBtagEmulationJet>>(m_jetcontainer.value() + "_presel");
202}
203
205 const xAOD::Jet *gscJet) const {
206 return splitJet->p4().DeltaR( gscJet->p4() ) < 0.05;
207}
208
209
210}
211
212//**********************************************************************
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
Handle class for reading from StoreGate.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
bool msgLvl(const MSG::Level lvl) const
size_type size() const noexcept
Returns the number of elements in the collection.
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
const T * get(const std::string &name) const
Definition EmulContext.h:94
void store(const std::string &name, std::unique_ptr< T > &&object)
Definition EmulContext.h:77
const std::string & jetContainerName() const
const std::vector< TrigBtagEmulationJet > & getSortedPreselJets(const EmulContext &emulCtx) const
Gaudi::Property< int > m_LHCPeriod
SG::ReadHandleKey< xAOD::BTaggingContainer > m_btagInputKey
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
SG::ReadHandleKey< xAOD::JetContainer > m_jetInputKey
SG::ReadHandleKey< xAOD::JetContainer > m_bjetInputKey
JetManagerTool(const std::string &name)
bool matchedSPLITjet(const xAOD::Jet *, const xAOD::Jet *) const
const std::vector< TrigBtagEmulationJet > & getJets(const EmulContext &emulCtx) const
Gaudi::Property< std::string > m_jetcontainer
Gaudi::Property< std::string > m_btagging_link
StatusCode retrieveByContainer(const EventContext &ctx, EmulContext &emulCtx) const
AsgTool(const std::string &name)
Constructor specifying the tool instance's name.
Definition AsgTool.cxx:58
virtual double phi() const
The azimuthal angle ( ) of the particle.
Definition Jet_v1.cxx:54
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition Jet_v1.cxx:71
virtual double pt() const
The transverse momentum ( ) of the particle.
Definition Jet_v1.cxx:44
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition Jet_v1.cxx:49
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:138
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
The common trigger namespace for trigger analysis tools.
Jet_v1 Jet
Definition of the current "jet version".
BTaggingContainer_v1 BTaggingContainer
Definition of the current "BTagging container version".
BTagging_v1 BTagging
Definition of the current "BTagging version".
Definition BTagging.h:17
JetContainer_v1 JetContainer
Definition of the current "jet container version".