ATLAS Offline Software
JetQGTaggerVariableTool.cxx
Go to the documentation of this file.
1 
3 /*
4  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
5 */
6 
8 
16 
17 
18 using std::string;
19 using xAOD::JetFourMom_t;
20 
21 //**********************************************************************
22 
24 : asg::AsgTool(name){
25 }
26 
27 //**********************************************************************
28 
30  ATH_MSG_INFO("Initializing JetQGTaggerVariableTool " << name());
31 
32  if(m_jetContainerName.empty()){
33  ATH_MSG_ERROR("JetQGTaggerVariableTool needs to have its input jet container configured!");
34  return StatusCode::FAILURE;
35  }
36 
37  m_nTrkKey = m_jetContainerName + "." + m_nTrkKey.key();
43 
44  ATH_CHECK(m_vertexContainer_key.initialize());
46 
48 
49  ATH_CHECK(m_nTrkKey.initialize());
50  ATH_CHECK(m_trkWidthKey.initialize());
51  ATH_CHECK(m_trkC1Key.initialize());
52  ATH_CHECK(m_nChargedKey.initialize());
53  ATH_CHECK(m_truthPtKey.initialize());
54  ATH_CHECK(m_truthEtaKey.initialize());
55 
56  return StatusCode::SUCCESS;
57 }
58 
59 //**********************************************************************
60 
62 
63 
70 
71  // Get input vertex collection
72  auto vertexContainer = SG::makeHandle (m_vertexContainer_key);
73  if (!vertexContainer.isValid()){
74  ATH_MSG_ERROR("Invalid VertexContainer datahandle: " << m_vertexContainer_key.key());
75  return StatusCode::FAILURE;
76  }
77 
78  const auto *vertices = vertexContainer.cptr();
79 
80  ATH_MSG_DEBUG("Successfully retrieved VertexContainer: " << m_vertexContainer_key.key());
81 
82  if (vertices->empty() ) {
83  ATH_MSG_WARNING("There are no vertices in the container. Exiting");
84 
85  for(const xAOD::Jet* jet : jetCont){
86  nTrkHandle(*jet) = -1;
87  trkWidthHandle(*jet) = -1.;
88  trkC1Handle(*jet) = -1.;
89  nChargedHandle(*jet) = -1;
90  truthPtHandle(*jet) = -1.;
91  truthEtaHandle(*jet) = -1.;
92  }
93 
94  return StatusCode::SUCCESS;
95  }
96 
97  //Find the HS vertex
98  const xAOD::Vertex* HSvertex = findHSVertex(vertices);
99 
100  // Get the track-vertex association
101  auto handle_tva = SG::makeHandle (m_tva_key);
102  if (!handle_tva.isValid()){
103  ATH_MSG_ERROR("Could not retrieve the TrackVertexAssociation: " << m_tva_key.key());
104  return StatusCode::FAILURE;
105  }
106 
107  const auto *tva = handle_tva.cptr();
108 
109  //Loop over the jets
110  for(const xAOD::Jet* jet : jetCont){
111 
112  int nTracksCount = 0;
113  float TracksWidth = 0., SumTracks_pTs = 0., TracksC1 = 0., beta = 0.2;
114 
115  //Get ghost-associated tracks
116  std::vector<const xAOD::IParticle*> jettracks;
117  jet->getAssociatedObjects<xAOD::IParticle>(xAOD::JetAttribute::GhostTrack,jettracks);
118 
119  //Loop over the tracks
120  std::vector<bool> IsGoodTrack;
121  TLorentzVector tracki_TLV, trackj_TLV;
122  TLorentzVector jet_TLV = jet -> p4();
123  for (size_t i = 0; i < jettracks.size(); i++) {
124 
125  if(!jettracks[i]){
126  IsGoodTrack.push_back(false);
127  continue;
128  }
129 
130  const xAOD::TrackParticle* trk = static_cast<const xAOD::TrackParticle*>(jettracks[i]);
131 
132  // only count tracks with selections
133  // 1) pt>500 MeV
134  // 2) accepted track from InDetTrackSelectionTool with CutLevel==Loose
135  // 3) associated to primary vertex OR within 3mm of the primary vertex
136 
137  bool accept = (trk->pt()>500 &&
138  m_trkSelectionTool->keep(*trk) &&
139  (HSvertex == tva->associatedVertex(trk) || (HSvertex != tva->associatedVertex(trk) && std::abs((trk->z0()+trk->vz()-HSvertex->z())*sin(trk->theta()))<3.))
140  );
141 
142  IsGoodTrack.push_back(accept);
143  if (!accept) continue;
144 
145  nTracksCount++;
146 
147  tracki_TLV = trk -> p4();
148  double DR_tracki_jet = tracki_TLV.DeltaR(jet_TLV);
149  TracksWidth += trk -> pt() * DR_tracki_jet;
150  SumTracks_pTs += trk -> pt();
151 
152  }// end loop over jettracks
153 
154  if(SumTracks_pTs>0.) TracksWidth = TracksWidth / SumTracks_pTs;
155  else TracksWidth = -1.;
156 
157  //Calculate C1 from tracks
158  for(size_t i = 0; i < jettracks.size(); i++) {
159  const xAOD::TrackParticle* trki = static_cast<const xAOD::TrackParticle*>(jettracks[i]);
160  if( !( IsGoodTrack.at(i) ) ) continue;
161 
162  for(size_t j = i+1; j < jettracks.size(); j++) {
163  const xAOD::TrackParticle* trkj = static_cast<const xAOD::TrackParticle*>(jettracks[j]);
164  if( !( IsGoodTrack.at(j) ) ) continue;
165 
166  tracki_TLV = trki -> p4();
167  trackj_TLV = trkj -> p4();
168  double DR_tracki_trackj = tracki_TLV.DeltaR(trackj_TLV);
169  TracksC1 += trki -> pt() * trkj -> pt() * pow( DR_tracki_trackj, beta) ;
170 
171  }//end loop over j
172  }//end double loop over ij
173 
174  if(SumTracks_pTs>0.) TracksC1 = TracksC1 / ( pow(SumTracks_pTs, 2.) );
175  else TracksC1 = -1.;
176 
177  // Add truth variables for QG tagging
178 
179  auto eventInfoContainer = SG::makeHandle (m_eventInfo_key);
180  if (!eventInfoContainer.isValid()){
181  ATH_MSG_ERROR("Invalid EventInfo datahandle: " << m_eventInfo_key.key());
182  return StatusCode::FAILURE;
183  }
184 
185  const auto *eventInfo = eventInfoContainer.cptr();
186 
187  bool isMC = eventInfo->eventType(xAOD::EventInfo::IS_SIMULATION);
188  int tntrk = 0;
189  float truthjet_pt = -999.0;
190  float truthjet_eta = -999.0;
191 
192  if(isMC){
193  const xAOD::Jet* tjet=nullptr;
194  static const SG::ConstAccessor< ElementLink<xAOD::JetContainer> > GhostTruthAssociationLinkAcc ("GhostTruthAssociationLink");
195  if(GhostTruthAssociationLinkAcc.isAvailable(*jet) ){
196  ATH_MSG_DEBUG("Accessing GhostTruthAssociationLink: is available");
197  ElementLink<xAOD::JetContainer> truthlink = GhostTruthAssociationLinkAcc(*jet);
198  if(truthlink.isValid() ){
199  ATH_MSG_DEBUG("Accessing GhostTruthAssociationLink: is valid");
200  if(truthlink)
201  tjet = * truthlink;
202  else{
203  ATH_MSG_DEBUG("Skipping...truth link is broken");
204  }//endelse NULL pointer
205  }
206  else {
207  ATH_MSG_DEBUG("Invalid truth link: setting weight to 1");
208  } //endelse isValid
209  } //endif isAvailable
210  else {
211  ATH_MSG_DEBUG("Cannot access truth Link: setting weight to 1");
212  }//endelse isAvailable
213 
214  if(tjet){
215  ATH_MSG_DEBUG("Truth Jet: " << tjet->numConstituents());
216 
217  truthjet_pt = tjet->pt();
218  truthjet_eta = tjet->eta();
219 
220  //Calculate the number of charged final state particles with pT > 500 MeV
221  for (size_t ind = 0; ind < tjet->numConstituents(); ind++) {
222  const xAOD::TruthParticle *part = static_cast<const xAOD::TruthParticle*>(tjet->rawConstituent(ind));
223  ATH_MSG_DEBUG("part: " << part );
224  // dont count invalid truth particles
225  if (!part || ! MC::isStable(part) || HepMC::is_simulation_particle(part)) continue;
226  // pt>500 MeV
227  ATH_MSG_DEBUG("pt: " << (part->pt()) );
228  if( ! (part->pt()>500.) ) continue;
229  // charged
230  ATH_MSG_DEBUG("isCharged: " << (part->isCharged()) );
231  if( !(part->isCharged()) ) continue;
232  tntrk++;
233  }
234  }
235  }
236 
237  nTrkHandle(*jet) = nTracksCount;
238  trkWidthHandle(*jet) = TracksWidth;
239  trkC1Handle(*jet) = TracksC1;
240  nChargedHandle(*jet) = tntrk;
241  truthPtHandle(*jet) = truthjet_pt;
242  truthEtaHandle(*jet) = truthjet_eta;
243 
244  }
245 
246  return StatusCode::SUCCESS;
247 }
248 
249 //**********************************************************************
250 
252 {
253  for ( size_t iVertex = 0; iVertex < vertices->size(); ++iVertex ) {
254  if(vertices->at(iVertex)->vertexType() == xAOD::VxType::PriVtx) {
255 
256  ATH_MSG_VERBOSE("JetQGTaggerVariableTool " << name() << " Found HS vertex at index: "<< iVertex);
257  return vertices->at(iVertex);
258  }
259  }
260  ATH_MSG_VERBOSE("There is no vertex of type PriVx. Taking default vertex.");
261  return vertices->at(0);
262 }
LArG4FSStartPointFilter.part
part
Definition: LArG4FSStartPointFilter.py:21
xAOD::TrackParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TrackParticle_v1.cxx:73
JetQGTaggerVariableTool::m_eventInfo_key
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo_key
Definition: JetQGTaggerVariableTool.h:64
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CutsMETMaker::accept
StatusCode accept(const xAOD::Muon *mu)
Definition: CutsMETMaker.cxx:18
xAOD::TrackParticle_v1::vz
float vz() const
The z origin for the parameters.
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
JetQGTaggerVariableTool::m_truthEtaKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_truthEtaKey
Definition: JetQGTaggerVariableTool.h:74
asg
Definition: DataHandleTestTool.h:28
test_pyathena.pt
pt
Definition: test_pyathena.py:11
xAOD::TrackParticle_v1::z0
float z0() const
Returns the parameter.
JetQGTaggerVariableTool::m_tva_key
SG::ReadHandleKey< jet::TrackVertexAssociation > m_tva_key
Definition: JetQGTaggerVariableTool.h:67
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:54
JetQGTaggerVariableTool::m_nChargedKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_nChargedKey
Definition: JetQGTaggerVariableTool.h:72
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
xAOD::IParticle
Class providing the definition of the 4-vector interface.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:40
xAOD::EventInfo_v1::IS_SIMULATION
@ IS_SIMULATION
true: simulation, false: data
Definition: EventInfo_v1.h:151
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:269
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
HepMC::is_simulation_particle
bool is_simulation_particle(const T &p)
Method to establish if a particle (or barcode) was created during the simulation (TODO update to be s...
Definition: MagicNumbers.h:299
lumiFormat.i
int i
Definition: lumiFormat.py:92
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::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:41
SG::WriteDecorHandle
Handle class for adding a decoration to an object.
Definition: StoreGate/StoreGate/WriteDecorHandle.h:99
xAOD::VxType::PriVtx
@ PriVtx
Primary vertex.
Definition: TrackingPrimitives.h:571
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
JetQGTaggerVariableTool::JetQGTaggerVariableTool
JetQGTaggerVariableTool(const std::string &name)
Definition: JetQGTaggerVariableTool.cxx:23
xAOD::Vertex_v1::z
float z() const
Returns the z position.
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
JetQGTaggerVariableTool::decorate
virtual StatusCode decorate(const xAOD::JetContainer &jetCont) const override
Decorate a jet collection without otherwise modifying it.
Definition: JetQGTaggerVariableTool.cxx:61
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
WriteDecorHandle.h
Handle class for adding a decoration to an object.
JetQGTaggerVariableTool::m_truthPtKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_truthPtKey
Definition: JetQGTaggerVariableTool.h:73
xAOD::Jet_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition: Jet_v1.cxx:49
xAOD::JetFourMom_t
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< double > > JetFourMom_t
Base 4 Momentum type for Jet.
Definition: JetTypes.h:17
PathResolver.h
JetQGTaggerVariableTool::m_jetContainerName
Gaudi::Property< std::string > m_jetContainerName
Definition: JetQGTaggerVariableTool.h:62
JetQGTaggerVariableTool::m_trkWidthKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_trkWidthKey
Definition: JetQGTaggerVariableTool.h:70
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
MagicNumbers.h
JetQGTaggerVariableTool.h
xAOD::Jet_v1::rawConstituent
const IParticle * rawConstituent(size_t i) const
Direct access to constituents. WARNING expert use only.
Definition: Jet_v1.cxx:158
JetQGTaggerVariableTool::m_vertexContainer_key
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexContainer_key
Definition: JetQGTaggerVariableTool.h:63
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
MC::isStable
bool isStable(const T &p)
Definition: HepMCHelpers.h:30
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
JetQGTaggerVariableTool::initialize
StatusCode initialize() override
Dummy implementation of the initialisation function.
Definition: JetQGTaggerVariableTool.cxx:29
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
ReadDecorHandle.h
Handle class for reading a decoration on an object.
JetQGTaggerVariableTool::findHSVertex
const xAOD::Vertex * findHSVertex(const xAOD::VertexContainer *&) const
Definition: JetQGTaggerVariableTool.cxx:251
EventInfoRead.isMC
isMC
Definition: EventInfoRead.py:11
SG::ConstAccessor::isAvailable
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
JetQGTaggerVariableTool::m_trkC1Key
SG::WriteDecorHandleKey< xAOD::JetContainer > m_trkC1Key
Definition: JetQGTaggerVariableTool.h:71
DataVector::at
const T * at(size_type n) const
Access an element, as an rvalue.
ConstAccessor.h
Helper class to provide constant type-safe access to aux data.
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
MuonParameters::beta
@ beta
Definition: MuonParamDefs.h:144
JetQGTaggerVariableTool::m_nTrkKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_nTrkKey
Definition: JetQGTaggerVariableTool.h:69
xAOD::Jet_v1::numConstituents
size_t numConstituents() const
Number of constituents in this jets (this is valid even when reading a file where the constituents ha...
Definition: Jet_v1.cxx:153
xAOD::JetAttribute::GhostTrack
@ GhostTrack
Definition: JetAttributes.h:252
JetQGTaggerVariableTool::m_trkSelectionTool
ToolHandle< IJetTrackSelector > m_trkSelectionTool
Definition: JetQGTaggerVariableTool.h:66
xAOD::Jet_v1::pt
virtual double pt() const
The transverse momentum ( ) of the particle.
Definition: Jet_v1.cxx:44
xAOD::TrackParticle_v1::theta
float theta() const
Returns the parameter, which has range 0 to .
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
checkFileSG.ind
list ind
Definition: checkFileSG.py:118
HepMCHelpers.h