ATLAS Offline Software
Loading...
Searching...
No Matches
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"
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 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
#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
virtual Trk::VxSecVertexInfo * findSecVertex(const xAOD::Vertex &primaryVertex, const TLorentzVector &jetMomentum, const std::vector< const xAOD::IParticle * > &inputTracks) const override
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
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)