ATLAS Offline Software
JetManagerTool.cxx
Go to the documentation of this file.
1 /*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "src/JetManagerTool.h"
7 
8 namespace Trig {
9 
10 //**********************************************************************
11 
13  : asg::AsgTool(name)
14 {}
15 
17  ATH_MSG_DEBUG( "Initializing " << name() );
18 
19  m_jetInputKey = m_jetcontainer.value();
20 
22 
23  m_bjetInputKey = m_jetcontainer.value() + "_bJets";
25 
26  ATH_CHECK(m_btagInputKey.initialize(m_LHCPeriod == 2));
27 
28 
29  return StatusCode::SUCCESS;
30 }
31 
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 
195 const std::vector<TrigBtagEmulationJet>& JetManagerTool::getJets(const EmulContext& emulCtx) const
196 {
197  return *emulCtx.get<std::vector<TrigBtagEmulationJet>>(m_jetcontainer.value());
198 }
199 const 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 //**********************************************************************
DataVector::reserve
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
Trig::JetManagerTool::m_btagging_link
Gaudi::Property< std::string > m_btagging_link
Definition: JetManagerTool.h:56
python.BuildSignatureFlags.bjet
AthConfigFlags bjet(AthConfigFlags flags, str instanceName, str recoMode)
Definition: BuildSignatureFlags.py:375
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
Trig
The common trigger namespace for trigger analysis tools.
Definition: LArCellMonAlg.h:33
Trig::TrigBtagEmulationJet
Definition: TrigBtagEmulationJet.h:17
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
Trig::JetManagerTool::m_bjetInputKey
SG::ReadHandleKey< xAOD::JetContainer > m_bjetInputKey
Definition: JetManagerTool.h:53
asg
Definition: DataHandleTestTool.h:28
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
xAOD::Jet_v1::phi
virtual double phi() const
The azimuthal angle ( ) of the particle.
Definition: Jet_v1.cxx:54
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:55
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
Trig::JetManagerTool::retrieveByContainer
StatusCode retrieveByContainer(const EventContext &ctx, EmulContext &emulCtx) const
Definition: JetManagerTool.cxx:32
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:270
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
lumiFormat.i
int i
Definition: lumiFormat.py:85
Trig::JetManagerTool::m_LHCPeriod
Gaudi::Property< int > m_LHCPeriod
Definition: JetManagerTool.h:58
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
Trig::EmulContext::get
const T * get(const std::string &name) const
Definition: EmulContext.h:94
Trig::JetManagerTool::m_btagInputKey
SG::ReadHandleKey< xAOD::BTaggingContainer > m_btagInputKey
Definition: JetManagerTool.h:54
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Trig::EmulContext
Definition: EmulContext.h:16
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
xAOD::BTagging_v1
Definition: BTagging_v1.h:39
DataVector
Derived DataVector<T>.
Definition: DataVector.h:795
DeMoUpdate.toAdd
bool toAdd
Definition: DeMoUpdate.py:1304
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAOD::Jet_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition: Jet_v1.cxx:49
Trig::JetManagerTool::JetManagerTool
JetManagerTool(const std::string &name)
Definition: JetManagerTool.cxx:12
Trig::JetManagerTool::jetContainerName
const std::string & jetContainerName() const
Definition: JetManagerTool.h:63
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
ReadHandle.h
Handle class for reading from StoreGate.
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
Trig::EmulContext::store
void store(const std::string &name, std::unique_ptr< T > &&object)
Definition: EmulContext.h:77
xAOD::Jet_v1::p4
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition: Jet_v1.cxx:71
JetManagerTool.h
Trig::JetManagerTool::initialize
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
Definition: JetManagerTool.cxx:16
Trig::JetManagerTool::m_jetInputKey
SG::ReadHandleKey< xAOD::JetContainer > m_jetInputKey
Definition: JetManagerTool.h:52
DEBUG
#define DEBUG
Definition: page_access.h:11
Trig::JetManagerTool::getJets
const std::vector< TrigBtagEmulationJet > & getJets(const EmulContext &emulCtx) const
Definition: JetManagerTool.cxx:195
Trig::JetManagerTool::matchedSPLITjet
bool matchedSPLITjet(const xAOD::Jet *, const xAOD::Jet *) const
Definition: JetManagerTool.cxx:204
SG::ConstAccessor::isAvailable
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
DataVector::at
const T * at(size_type n) const
Access an element, as an rvalue.
Trig::JetManagerTool::m_jetcontainer
Gaudi::Property< std::string > m_jetcontainer
Definition: JetManagerTool.h:57
SG::AllowEmpty
@ AllowEmpty
Definition: StoreGate/StoreGate/VarHandleKey.h:27
xAOD::Jet_v1::pt
virtual double pt() const
The transverse momentum ( ) of the particle.
Definition: Jet_v1.cxx:44
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
Trig::JetManagerTool::getSortedPreselJets
const std::vector< TrigBtagEmulationJet > & getSortedPreselJets(const EmulContext &emulCtx) const
Definition: JetManagerTool.cxx:199