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
30#include "VxVertex/RecVertex.h"
31#include "TrkTrack/Track.h"
37#include "CLHEP/Vector/LorentzVector.h"
38#include "CLHEP/Vector/ThreeVector.h"
39#include "CLHEP/Geometry/Vector3D.h"
44
45#include "xAODTracking/Vertex.h"
49
50//17.5.2015 This is for the EDM migration
52
53// Hackathon includes
58
59
60#define InDetImprovedJetFitterVxFinder_DEBUGAddOns
61
62namespace InDet
63{
64
66 {
67 double first;
70 : first (p1), second (p2) {}
71 bool operator< (const TrackParticle_pair& other) const
72 { return first > other.first; }
73 };
74
76 {
77 double first;
79 Track_pair(double p1, const Trk::Track* p2)
80 : first (p1), second (p2) {}
81 bool operator< (const Track_pair& other) const
82 { return first > other.first; }
83 };
84
85 InDetImprovedJetFitterVxFinder::InDetImprovedJetFitterVxFinder(const std::string& t, const std::string& n, const IInterface* p) :
86 AthAlgTool(t,n,p)
87 {
88 // new package for hackathon
89 declareInterface< ISecVertexInJetFinder >(this) ;
90 }
91
92
94
95
97
98 if (m_theTrackSelector.retrieve().isFailure()) {
99 msg(MSG::ERROR) << "Could not find TrackSelector tool." << endmsg;
100 return StatusCode::FAILURE;
101 } else msg(MSG::INFO) << " JetFitterTrackSelector retrieved" << endmsg;
102
103 if (m_theTwoTrackVtxFinderTool.retrieve().isFailure()) {
104 msg(MSG::ERROR) << "Could not find TwoTrackVtxFinder tool." << endmsg;
105 return StatusCode::FAILURE;
106 } else msg(MSG::INFO) << " JetFitterTwoTrackVtxFinder retrieved" << endmsg;
107
108 if (m_theV0FinderTool.retrieve().isFailure()) {
109 msg(MSG::ERROR) << "Could not find V0Finder tool." << endmsg;
110 return StatusCode::FAILURE;
111 } else msg(MSG::INFO) << " JetFitterV0Finder retrieved" << endmsg;
112
113 if (m_multiStageFitter.retrieve().isFailure()) {
114 msg(MSG::ERROR) << "Could not find JetFitterMultiStageFit tool." << endmsg;
115 return StatusCode::FAILURE;
116 } else msg(MSG::INFO) << " JetFitterMultiStageFit retrieved" << endmsg;
117
118 return StatusCode::SUCCESS;
119 }
120
121
123 const xAOD::Vertex & primaryVertex,
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( ctx, 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 delete myTwoTrackVerticesInJet;
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)