ATLAS Offline Software
InDetImprovedJetFitterVxFinder.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 /***************************************************************************
6  InDetImprovedJetFitterVxFinder.cxx - Description
7  -------------------
8 
9  begin : January 2008
10  authors: Giacinto Piacquadio (University of Freiburg)
11  email : nicola.giacinto.piacquadio@cern.ch
12  changes: new version in January 2008!
13 
14 
15  2008 (c) Atlas Detector Software
16 
17  Look at the header file for more information.
18 
19  ***************************************************************************/
20 
21 
28 #include <TMath.h>
31 #include "VxVertex/RecVertex.h"
32 #include "TrkTrack/Track.h"
33 #include "TrkTrack/LinkToTrack.h"
38 #include "CLHEP/Vector/LorentzVector.h"
39 #include "CLHEP/Vector/ThreeVector.h"
40 #include "CLHEP/Geometry/Vector3D.h"
45 
46 #include "xAODTracking/Vertex.h"
50 
51 //17.5.2015 This is for the EDM migration
53 
54 // Hackathon includes
59 
60 
61 #define InDetImprovedJetFitterVxFinder_DEBUGAddOns
62 
63 namespace InDet
64 {
65 
67  {
68  double first;
71  : first (p1), second (p2) {}
72  bool operator< (const TrackParticle_pair& other) const
73  { return first > other.first; }
74  };
75 
76  struct Track_pair
77  {
78  double first;
80  Track_pair(double p1, const Trk::Track* p2)
81  : first (p1), second (p2) {}
82  bool operator< (const Track_pair& other) const
83  { return first > other.first; }
84  };
85 
86  InDetImprovedJetFitterVxFinder::InDetImprovedJetFitterVxFinder(const std::string& t, const std::string& n, const IInterface* p) :
87  AthAlgTool(t,n,p)
88  {
89  // new package for hackathon
90  declareInterface< ISecVertexInJetFinder >(this) ;
91  }
92 
93 
95 
96 
98 
99  if (m_theTrackSelector.retrieve().isFailure()) {
100  msg(MSG::ERROR) << "Could not find TrackSelector tool." << endmsg;
101  return StatusCode::FAILURE;
102  } else msg(MSG::INFO) << " JetFitterTrackSelector retrieved" << endmsg;
103 
104  if (m_theTwoTrackVtxFinderTool.retrieve().isFailure()) {
105  msg(MSG::ERROR) << "Could not find TwoTrackVtxFinder tool." << endmsg;
106  return StatusCode::FAILURE;
107  } else msg(MSG::INFO) << " JetFitterTwoTrackVtxFinder retrieved" << endmsg;
108 
109  if (m_theV0FinderTool.retrieve().isFailure()) {
110  msg(MSG::ERROR) << "Could not find V0Finder tool." << endmsg;
111  return StatusCode::FAILURE;
112  } else msg(MSG::INFO) << " JetFitterV0Finder retrieved" << endmsg;
113 
114  if (m_multiStageFitter.retrieve().isFailure()) {
115  msg(MSG::ERROR) << "Could not find JetFitterMultiStageFit tool." << endmsg;
116  return StatusCode::FAILURE;
117  } else msg(MSG::INFO) << " JetFitterMultiStageFit retrieved" << endmsg;
118 
119  return StatusCode::SUCCESS;
120  }
121 
122 
124  const TLorentzVector & jetMomentum,
125  const std::vector<const xAOD::IParticle*> & inputTracks) const
126  {
127  // This function when called performs JetFitter secondary vertex finding
128  // It returns the JetFitter Vertex Info, VxJetFitterVertexInfo:
129  // The VxJetCandidate, the TwoTrackVerticesInJet (V0s and neutrals), the selected tracks (primary and secondary)
130  // So we need to do track selection, v0 finding, and then the fit with JetFitter.
131 
132 //
133 // // Initial track selection, track filter applied, separate primary and secondary tracks
134  const Trk::SelectedTracksInJet* mySelectedTracksInJet = m_theTrackSelector->doTrackSelection( primaryVertex, jetMomentum, inputTracks );
135 
136  ATH_MSG_DEBUG( "the selected tracks now are " << mySelectedTracksInJet );
137  std::vector< const Trk::ITrackLink* > primaryTracks = mySelectedTracksInJet->getPrimaryTrackLinks();
138  std::vector< const Trk::ITrackLink* > secondaryTracks = mySelectedTracksInJet->getSecondaryTrackLinks();
139 
140  // Two track vertex candidates
141  const Trk::TwoTrackVerticesInJet* twoTrackVertexCandidates = m_theTwoTrackVtxFinderTool->doVertexFinding( primaryVertex, jetMomentum, secondaryTracks );
142  const std::vector< const xAOD::Vertex* > vertexCandidates = twoTrackVertexCandidates->getTwoTrackVertice();
143 
144 // // V0 finding AND further track selection, these could even be further separated
145 // // neutral identification, material interactions, ..., a lot is done here
146  std::vector< const Trk::ITrackLink* > tracksToUseInFirstFit;
147  std::vector< const Trk::ITrackLink* > tracksToUseInSecondFit;
148  Amg::Vector3D JFseedDirection;
149 
150  const Trk::TwoTrackVerticesInJet* myTwoTrackVerticesInJet = m_theV0FinderTool->doV0Finding( primaryVertex, jetMomentum, secondaryTracks, vertexCandidates,
151  tracksToUseInFirstFit, tracksToUseInSecondFit, JFseedDirection );
152 
153  // Sort track collection by pT
154  ATH_MSG_DEBUG( "Sorting track collection (tracksToUseInFirstFit) by pT..." );
155  sortTrackCollectionByPt( tracksToUseInFirstFit );
156  ATH_MSG_DEBUG( "Sorting track collection (tracksToUseInSecondFit) by pT..." );
157  sortTrackCollectionByPt( tracksToUseInSecondFit );
158 
159  delete twoTrackVertexCandidates;
160 //
161 
162 // // One last complication, primaryVertex needs to be a different object (old edm)
163 // // see lines 524-537 in old code and create primaryVertexRecVertex using the vertex edm factory
164 
165  Trk::RecVertex primaryVertexRecVertex( primaryVertex.position(),
166  primaryVertex.covariancePosition(),
167  primaryVertex.numberDoF(),
168  primaryVertex.chiSquared());
169 
170 
171  // Refactoring: Instead at this point use JetFitterMultiStageFit:
172  Trk::VxJetCandidate* myJetCandidate= m_multiStageFitter->doTwoStageFit(primaryVertexRecVertex,
173  jetMomentum,
174  tracksToUseInFirstFit,
175  tracksToUseInSecondFit,
176  JFseedDirection);
177 
178 
179  if (myJetCandidate == nullptr) {
180  ATH_MSG_DEBUG( "JetFitter multi stage fit returned 0" );
181  return nullptr;
182  }
183  else {
184  ATH_MSG_DEBUG( "USING JetFitterMultiStageFit return" );
185  }
186 
187 // // Lastly create the jetfitter info, ('save' our results)
188 
189  std::vector<Trk::VxJetCandidate*> myCandidates;
190  // This push_back is problematic for the migration to xAOD::Vertex, it works simply because VxJetCandidate inherits from VxCandidate
191  myCandidates.push_back(myJetCandidate);
192 
193  Trk::VxJetFitterVertexInfo* myOutputInfo=new Trk::VxJetFitterVertexInfo(myCandidates,
194  myTwoTrackVerticesInJet,
195  mySelectedTracksInJet);
196 
197  myOutputInfo->setSVOwnership(true);
198  return myOutputInfo;
199  }
200 
201 
202 
204  const TLorentzVector & /*jetMomentum*/,
205  const std::vector<const Trk::ITrackLink*> & /*firstInputTracks*/,
206  const std::vector<const Trk::ITrackLink*> & /*secondInputTracks*/,
207  const Amg::Vector3D & /*vtxSeedDirection*/ )
208  {
209 
210  // The overload is legacy. This is where we interface to JetFitter proper
211  // m_jetFitterMultiStageFit->performTwoStageFit(const Trk::RecVertex & primaryVertex,
212  // const TLorentzVector & jetMomentum,
213  // const std::vector<const Trk::ITrackLink*> & firstInputTracks,
214  // const std::vector<const Trk::ITrackLink*> & secondInputTracks,
215  // const Amg::Vector3D & vtxSeedDirection
216 
217  // return myOutputInfo
218  return nullptr;
219 
220  }
221 
223  bool /*performClustering*/ ) const {
224 
225  }
226 
227  void InDetImprovedJetFitterVxFinder::sortTrackCollectionByPt( std::vector< const Trk::ITrackLink* >& trackCollection ) const {
228 
229  if ( trackCollection.empty() ) return;
230 
231  ATH_MSG_DEBUG("re-order the tracks by pT: " <<
232  ( trackCollection.front()->parameters() )->pT() <<
233  " -- " <<
234  ( trackCollection.back()->parameters() )->pT() );
235 
236  std::sort( trackCollection.begin(),
237  trackCollection.end(),
238  //Lambda func to sort by pt
239  [](const Trk::ITrackLink* TL1, const Trk::ITrackLink* TL2) {
240  return ( (TL1->parameters())->pT() < (TL2->parameters())->pT() );
241  } );
242 
243  ATH_MSG_DEBUG("after re-order the tracks by pT: " <<
244  ( trackCollection.front()->parameters() )->pT() <<
245  " -- " <<
246  ( trackCollection.back()->parameters() )->pT() );
247 
248  }
249 
253  std::vector<std::string>
255  {
256  return m_theTrackSelector->trackDecorationNames();
257  }
258 
259 }//end namespace Rec
Trk::VxSecVertexInfo::setSVOwnership
void setSVOwnership(bool Ownership)
Definition: VxSecVertexInfo.h:118
RecVertex.h
LinkToTrack.h
Trk::SelectedTracksInJet
Definition: SelectedTracksInJet.h:62
PerigeeSurface.h
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
InDet::InDetImprovedJetFitterVxFinder::~InDetImprovedJetFitterVxFinder
~InDetImprovedJetFitterVxFinder()
InDet
Primary Vertex Finder.
Definition: VP1ErrorUtils.h:36
EventPrimitivesHelpers.h
VxVertexOnJetAxis.h
TRTCalib_cfilter.p1
p1
Definition: TRTCalib_cfilter.py:130
VxJetCandidate.h
Trk::SelectedTracksInJet::getSecondaryTrackLinks
const std::vector< const ITrackLink * > & getSecondaryTrackLinks() const
Get the secondary tracks (please do not delete the pointers)
Definition: SelectedTracksInJet.cxx:172
InDet::InDetImprovedJetFitterVxFinder::trackDecorationNames
virtual std::vector< std::string > trackDecorationNames() const override
Return a list of the names of track decorations created by this tool, in order to allow them to be lo...
Definition: InDetImprovedJetFitterVxFinder.cxx:254
SelectedTracksInJet.h
xAOD::Vertex_v1::position
const Amg::Vector3D & position() const
Returns the 3-pos.
NeutralParameters.h
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
INeutralParticleParameterCalculator.h
InDet::InDetImprovedJetFitterVxFinder::doTheFit
void doTheFit(Trk::VxJetCandidate *myJetCandidate, bool performClustering=true) const
Definition: InDetImprovedJetFitterVxFinder.cxx:222
InDet::Track_pair
Definition: InDetImprovedJetFitterVxFinder.cxx:77
InDet::InDetImprovedJetFitterVxFinder::InDetImprovedJetFitterVxFinder
InDetImprovedJetFitterVxFinder(const std::string &t, const std::string &n, const IInterface *p)
Definition: InDetImprovedJetFitterVxFinder.cxx:86
Trk::RecVertex
Trk::RecVertex inherits from Trk::Vertex.
Definition: RecVertex.h:44
Track.h
VxClusteringTable.h
Trk::TrackParticleBase
Definition: TrackParticleBase.h:41
TRTCalib_cfilter.p2
p2
Definition: TRTCalib_cfilter.py:131
Trk::TwoTrackVerticesInJet
Definition: TwoTrackVerticesInJet.h:45
PairOfVxVertexOnJetAxis.h
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
InDet::Track_pair::operator<
bool operator<(const Track_pair &other) const
Definition: InDetImprovedJetFitterVxFinder.cxx:82
LinkToXAODTrackParticle.h
InDet::TrackParticle_pair::first
double first
Definition: InDetImprovedJetFitterVxFinder.cxx:68
python.TrigInDetConfig.inputTracks
inputTracks
Definition: TrigInDetConfig.py:183
Trk::SelectedTracksInJet::getPrimaryTrackLinks
const std::vector< const ITrackLink * > & getPrimaryTrackLinks() const
Get the priamry tracks (please do not delete the pointers)
Definition: SelectedTracksInJet.cxx:167
beamspotman.n
n
Definition: beamspotman.py:731
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
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
InDet::InDetImprovedJetFitterVxFinder::m_multiStageFitter
ToolHandle< JetFitterMultiStageFit > m_multiStageFitter
Definition: InDetImprovedJetFitterVxFinder.h:103
JetFitterMultiStageFit.h
VxTrackAtVertex.h
InDet::TrackParticle_pair::TrackParticle_pair
TrackParticle_pair(double p1, const Trk::TrackParticleBase *p2)
Definition: InDetImprovedJetFitterVxFinder.cxx:70
Vertex.h
Trk::VxJetFitterVertexInfo
Definition: VxJetFitterVertexInfo.h:58
InDet::Track_pair::Track_pair
Track_pair(double p1, const Trk::Track *p2)
Definition: InDetImprovedJetFitterVxFinder.cxx:80
InDet::Track_pair::first
double first
Definition: InDetImprovedJetFitterVxFinder.cxx:78
SeedFinderParamDefs.h
Trk::VxSecVertexInfo
Definition: VxSecVertexInfo.h:63
InDet::InDetImprovedJetFitterVxFinder::initialize
virtual StatusCode initialize() override
Definition: InDetImprovedJetFitterVxFinder.cxx:97
Trk::VxJetCandidate
Definition: VxJetCandidate.h:72
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
VertexType.h
InDet::InDetImprovedJetFitterVxFinder::m_theV0FinderTool
ToolHandle< JetFitterV0FinderTool > m_theV0FinderTool
Definition: InDetImprovedJetFitterVxFinder.h:102
xAOD::Vertex_v1::numberDoF
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
TrackParticle.h
JetFitterTrackSelectorTool.h
VertexContainer.h
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
xAOD::Vertex_v1::chiSquared
float chiSquared() const
Returns the of the vertex fit as float.
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
InDetImprovedJetFitterVxFinder.h
TwoTrackVerticesInJet.h
JetFitterTwoTrackVtxFinderTool.h
InDet::TrackParticle_pair::operator<
bool operator<(const TrackParticle_pair &other) const
Definition: InDetImprovedJetFitterVxFinder.cxx:72
InDet::InDetImprovedJetFitterVxFinder::m_theTrackSelector
ToolHandle< JetFitterTrackSelectorTool > m_theTrackSelector
Definition: InDetImprovedJetFitterVxFinder.h:100
InDet::InDetImprovedJetFitterVxFinder::sortTrackCollectionByPt
void sortTrackCollectionByPt(std::vector< const Trk::ITrackLink * > &) const
Definition: InDetImprovedJetFitterVxFinder.cxx:227
InDet::TrackParticle_pair::second
const Trk::TrackParticleBase * second
Definition: InDetImprovedJetFitterVxFinder.cxx:69
VxJetFitterVertexInfo.h
JetFitterV0FinderTool.h
AthAlgTool
Definition: AthAlgTool.h:26
InDet::InDetImprovedJetFitterVxFinder::findSecVertex
virtual Trk::VxSecVertexInfo * findSecVertex(const xAOD::Vertex &primaryVertex, const TLorentzVector &jetMomentum, const std::vector< const xAOD::IParticle * > &inputTracks) const override
Definition: InDetImprovedJetFitterVxFinder.cxx:123
InDet::TrackParticle_pair
Definition: InDetImprovedJetFitterVxFinder.cxx:67
FitQuality.h
Trk::TwoTrackVerticesInJet::getTwoTrackVertice
const std::vector< const xAOD::Vertex * > & getTwoTrackVertice() const
Get the two track vertices (please do not delete the pointers)
Definition: TwoTrackVerticesInJet.cxx:149
InDet::Track_pair::second
const Trk::Track * second
Definition: InDetImprovedJetFitterVxFinder.cxx:79
InDet::InDetImprovedJetFitterVxFinder::m_theTwoTrackVtxFinderTool
ToolHandle< JetFitterTwoTrackVtxFinderTool > m_theTwoTrackVtxFinderTool
Definition: InDetImprovedJetFitterVxFinder.h:101
TrackParticleContainer.h