ATLAS Offline Software
Loading...
Searching...
No Matches
InDetImprovedJetFitterVxFinder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 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"
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
63namespace 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
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 xAOD::Vertex & primaryVertex,
125 const TLorentzVector & jetMomentum,
126 const std::vector<const xAOD::IParticle*> & inputTracks) const
127 {
128 // This function when called performs JetFitter secondary vertex finding
129 // It returns the JetFitter Vertex Info, VxJetFitterVertexInfo:
130 // The VxJetCandidate, the TwoTrackVerticesInJet (V0s and neutrals), the selected tracks (primary and secondary)
131 // So we need to do track selection, v0 finding, and then the fit with JetFitter.
132
133//
134// // Initial track selection, track filter applied, separate primary and secondary tracks
135 const Trk::SelectedTracksInJet* mySelectedTracksInJet = m_theTrackSelector->doTrackSelection( primaryVertex, jetMomentum, inputTracks );
136
137 ATH_MSG_DEBUG( "the selected tracks now are " << mySelectedTracksInJet );
138 std::vector< const Trk::ITrackLink* > primaryTracks = mySelectedTracksInJet->getPrimaryTrackLinks();
139 std::vector< const Trk::ITrackLink* > secondaryTracks = mySelectedTracksInJet->getSecondaryTrackLinks();
140
141 // Two track vertex candidates
142 const Trk::TwoTrackVerticesInJet* twoTrackVertexCandidates = m_theTwoTrackVtxFinderTool->doVertexFinding( ctx, primaryVertex, jetMomentum, secondaryTracks );
143 const std::vector< const xAOD::Vertex* > vertexCandidates = twoTrackVertexCandidates->getTwoTrackVertice();
144
145// // V0 finding AND further track selection, these could even be further separated
146// // neutral identification, material interactions, ..., a lot is done here
147 std::vector< const Trk::ITrackLink* > tracksToUseInFirstFit;
148 std::vector< const Trk::ITrackLink* > tracksToUseInSecondFit;
149 Amg::Vector3D JFseedDirection;
150
151 const Trk::TwoTrackVerticesInJet* myTwoTrackVerticesInJet = m_theV0FinderTool->doV0Finding( primaryVertex, jetMomentum, secondaryTracks, vertexCandidates,
152 tracksToUseInFirstFit, tracksToUseInSecondFit, JFseedDirection );
153
154 // Sort track collection by pT
155 ATH_MSG_DEBUG( "Sorting track collection (tracksToUseInFirstFit) by pT..." );
156 sortTrackCollectionByPt( tracksToUseInFirstFit );
157 ATH_MSG_DEBUG( "Sorting track collection (tracksToUseInSecondFit) by pT..." );
158 sortTrackCollectionByPt( tracksToUseInSecondFit );
159
160 delete twoTrackVertexCandidates;
161//
162
163// // One last complication, primaryVertex needs to be a different object (old edm)
164// // see lines 524-537 in old code and create primaryVertexRecVertex using the vertex edm factory
165
166 Trk::RecVertex primaryVertexRecVertex( primaryVertex.position(),
167 primaryVertex.covariancePosition(),
168 primaryVertex.numberDoF(),
169 primaryVertex.chiSquared());
170
171
172 // Refactoring: Instead at this point use JetFitterMultiStageFit:
173 Trk::VxJetCandidate* myJetCandidate= m_multiStageFitter->doTwoStageFit(primaryVertexRecVertex,
174 jetMomentum,
175 tracksToUseInFirstFit,
176 tracksToUseInSecondFit,
177 JFseedDirection);
178
179
180 if (myJetCandidate == nullptr) {
181 ATH_MSG_DEBUG( "JetFitter multi stage fit returned 0" );
182 return nullptr;
183 }
184 else {
185 ATH_MSG_DEBUG( "USING JetFitterMultiStageFit return" );
186 }
187
188// // Lastly create the jetfitter info, ('save' our results)
189
190 std::vector<Trk::VxJetCandidate*> myCandidates;
191 // This push_back is problematic for the migration to xAOD::Vertex, it works simply because VxJetCandidate inherits from VxCandidate
192 myCandidates.push_back(myJetCandidate);
193
194 Trk::VxJetFitterVertexInfo* myOutputInfo=new Trk::VxJetFitterVertexInfo(myCandidates,
195 myTwoTrackVerticesInJet,
196 mySelectedTracksInJet);
197
198 myOutputInfo->setSVOwnership(true);
199 return myOutputInfo;
200 }
201
202
203
205 const TLorentzVector & /*jetMomentum*/,
206 const std::vector<const Trk::ITrackLink*> & /*firstInputTracks*/,
207 const std::vector<const Trk::ITrackLink*> & /*secondInputTracks*/,
208 const Amg::Vector3D & /*vtxSeedDirection*/ )
209 {
210
211 // The overload is legacy. This is where we interface to JetFitter proper
212 // m_jetFitterMultiStageFit->performTwoStageFit(const Trk::RecVertex & primaryVertex,
213 // const TLorentzVector & jetMomentum,
214 // const std::vector<const Trk::ITrackLink*> & firstInputTracks,
215 // const std::vector<const Trk::ITrackLink*> & secondInputTracks,
216 // const Amg::Vector3D & vtxSeedDirection
217
218 // return myOutputInfo
219 return nullptr;
220
221 }
222
224 bool /*performClustering*/ ) const {
225
226 }
227
228 void InDetImprovedJetFitterVxFinder::sortTrackCollectionByPt( std::vector< const Trk::ITrackLink* >& trackCollection ) const {
229
230 if ( trackCollection.empty() ) return;
231
232 ATH_MSG_DEBUG("re-order the tracks by pT: " <<
233 ( trackCollection.front()->parameters() )->pT() <<
234 " -- " <<
235 ( trackCollection.back()->parameters() )->pT() );
236
237 std::sort( trackCollection.begin(),
238 trackCollection.end(),
239 //Lambda func to sort by pt
240 [](const Trk::ITrackLink* TL1, const Trk::ITrackLink* TL2) {
241 return ( (TL1->parameters())->pT() < (TL2->parameters())->pT() );
242 } );
243
244 ATH_MSG_DEBUG("after re-order the tracks by pT: " <<
245 ( trackCollection.front()->parameters() )->pT() <<
246 " -- " <<
247 ( trackCollection.back()->parameters() )->pT() );
248
249 }
250
254 std::vector<std::string>
256 {
257 return m_theTrackSelector->trackDecorationNames();
258 }
259
260}//end namespace Rec
#define endmsg
#define ATH_MSG_DEBUG(x)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
MsgStream & msg() const
InDetImprovedJetFitterVxFinder(const std::string &t, const std::string &n, const IInterface *p)
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...
ToolHandle< JetFitterTrackSelectorTool > m_theTrackSelector
void sortTrackCollectionByPt(std::vector< const Trk::ITrackLink * > &) const
ToolHandle< JetFitterMultiStageFit > m_multiStageFitter
ToolHandle< JetFitterTwoTrackVtxFinderTool > m_theTwoTrackVtxFinderTool
virtual Trk::VxSecVertexInfo * findSecVertex(const EventContext &ctx, const xAOD::Vertex &primaryVertex, const TLorentzVector &jetMomentum, const std::vector< const xAOD::IParticle * > &inputTracks) const override
ToolHandle< JetFitterV0FinderTool > m_theV0FinderTool
void doTheFit(Trk::VxJetCandidate *myJetCandidate, bool performClustering=true) const
Trk::RecVertex inherits from Trk::Vertex.
Definition RecVertex.h:44
const std::vector< const ITrackLink * > & getSecondaryTrackLinks() const
Get the secondary tracks (please do not delete the pointers).
const std::vector< const ITrackLink * > & getPrimaryTrackLinks() const
Get the priamry tracks (please do not delete the pointers).
const std::vector< const xAOD::Vertex * > & getTwoTrackVertice() const
Get the two track vertices (please do not delete the pointers).
void setSVOwnership(bool Ownership)
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
float chiSquared() const
Returns the of the vertex fit as float.
const Amg::Vector3D & position() const
Returns the 3-pos.
Eigen::Matrix< double, 3, 1 > Vector3D
Primary Vertex Finder.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
Vertex_v1 Vertex
Define the latest version of the vertex class.
bool operator<(const TrackParticle_pair &other) const
const Trk::TrackParticleBase * second
TrackParticle_pair(double p1, const Trk::TrackParticleBase *p2)
bool operator<(const Track_pair &other) const
Track_pair(double p1, const Trk::Track *p2)