ATLAS Offline Software
Loading...
Searching...
No Matches
JetFitterInitializationHelper.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5/***************************************************************************
6 JetFitterInitializationHelper.h - Description
7 -------------------
8
9 begin : Februar 2007
10 authors: Giacinto Piacquadio (University of Freiburg),
11 Christian Weiser (University of Freiburg)
12 email : nicola.giacinto.piacquadio@cern.ch,
13 christian.weiser@cern.ch
14
15 changes: * January 2008: added method for initializing on vector<ITrackLink>
16
17 2007 (c) Atlas Detector Software
18
19 Look at the header file for more information.
20
21 ***************************************************************************/
22
24#include "VxVertex/RecVertex.h"
31#include "TrkTrack/Track.h"
32#include "CxxUtils/sincos.h"
33//#include "TrkVertexFitterUtils/FullLinearizedTrackFactory.h"
34
35namespace Trk
36{
37
38 namespace {
39 int numRow(int numVertex) {
40 return numVertex+5;
41 }
42
43 Amg::Vector3D getSingleVtxPositionWithSignFlip(const Amg::VectorX & myPosition,
44 int numVertex,
45 bool signFlipTreatment) {
46
47 int numbRow=numRow(numVertex);
48 double xv=myPosition[Trk::jet_xv];
49 double yv=myPosition[Trk::jet_yv];
50 double zv=myPosition[Trk::jet_zv];
51 double phi=myPosition[Trk::jet_phi];
52 double theta=myPosition[Trk::jet_theta];
53 double dist=0.;
54 CxxUtils::sincos sc_theta (theta);
55 CxxUtils::sincos sc_phi (phi);
56 if (numbRow>=0) {
57 dist=myPosition[numbRow];
58 if (fabs(dist)*sc_theta.sn>300.) {//MAX 30cm
59 dist=dist/fabs(dist)*300./sc_theta.sn;
60 }
61 if (dist<0) {
62 if (signFlipTreatment) {
63 dist=-dist;
64 } else {
65 dist=0.;
66 }
67 }
68 }
69 return Amg::Vector3D(xv+dist*sc_phi.cs*sc_theta.sn,
70 yv+dist*sc_phi.sn*sc_theta.sn,
71 zv+dist*sc_theta.cs);
72 }
73
74 }//end anonymous namespace
75
76 JetFitterInitializationHelper::JetFitterInitializationHelper(const std::string& t, const std::string& n, const IInterface* p) :
77 AthAlgTool(t,n,p),
78 m_linearizedFactory("Trk::FullLinearizedTrackFactory", this),
79 m_errphiJetAxis(0.07),
80 m_erretaJetAxis(0.065)
81 {
82 declareProperty("errphiJetAxis",m_errphiJetAxis);
83 declareProperty("erretaJetAxis",m_erretaJetAxis);
84 declareProperty("LinearizedTrackFactory",m_linearizedFactory);
85 declareInterface< JetFitterInitializationHelper >(this) ;
86
87 }
88
89
90
91
92
94
95
97
98 StatusCode sc=m_linearizedFactory.retrieve();
99 if(sc.isFailure()) {
100 ATH_MSG_ERROR( " Unable to retrieve "<<m_linearizedFactory );
101 return StatusCode::FAILURE;
102 }
103
104
105 return StatusCode::SUCCESS;
106
107 }
108
109
115
116 VxJetCandidate * JetFitterInitializationHelper::initializeJetCandidate(const std::vector<const Trk::ITrackLink*> & vectorOfLink,
117 const RecVertex* primaryVertex,
118 const Amg::Vector3D* jetdirection,
119 const Amg::Vector3D* linearizationjetdirection) const
120 {
121
122 ATH_MSG_VERBOSE (" Entered initializeJetCandidate() ");
123
124 VxJetCandidate* myJetCandidate=new VxJetCandidate();
125
126 std::vector<Trk::VxVertexOnJetAxis*> setOfVertices=myJetCandidate->getVerticesOnJetAxis();
127 std::vector<Trk::VxTrackAtVertex*>* setOfTracks=myJetCandidate->vxTrackAtVertex();
128
129 std::vector<const Trk::ITrackLink*>::const_iterator vectorOfLinkBegin=vectorOfLink.begin();
130 std::vector<const Trk::ITrackLink*>::const_iterator vectorOfLinkEnd=vectorOfLink.end();
131
132 for (std::vector<const Trk::ITrackLink*>::const_iterator vectorOfLinkIter=vectorOfLinkBegin;
133 vectorOfLinkIter!=vectorOfLinkEnd;++vectorOfLinkIter)
134 {
135 std::vector<Trk::VxTrackAtVertex*> temp_vector_tracksAtVertex;
136 Trk::VxTrackAtVertex* newVxTrack=new Trk::VxTrackAtVertex((*vectorOfLinkIter)->clone());
137 temp_vector_tracksAtVertex.push_back(newVxTrack);
138 setOfTracks->push_back(newVxTrack);
139 setOfVertices.push_back(new Trk::VxVertexOnJetAxis(temp_vector_tracksAtVertex));
140 }
141 myJetCandidate->setVerticesOnJetAxis(setOfVertices);
142 return initializeJetClusters(myJetCandidate,primaryVertex,jetdirection,linearizationjetdirection);
143
144 }
145
146
147
148
149 VxJetCandidate * JetFitterInitializationHelper::initializeJetCandidate(const std::vector<const Trk::TrackParticleBase*> & vectorOfTP,
150 const RecVertex* primaryVertex,
151 const Amg::Vector3D* jetdirection,
152 const Amg::Vector3D* linearizationjetdirection) const {
153
154
155 //creates VxJetCandidate. Constructor takes care of adding VxTrackAtVertex
156 //and creating one VxVertexOnJetAxis for each added track
157
158 VxJetCandidate* myJetCandidate=new VxJetCandidate(vectorOfTP);
159
160
161 return initializeJetClusters(myJetCandidate,primaryVertex,jetdirection,linearizationjetdirection);
162
163 }
164
165 VxJetCandidate * JetFitterInitializationHelper::initializeJetCandidate(const std::vector<const Trk::Track*> & vectorOfT,
166 const RecVertex* primaryVertex,
167 const Amg::Vector3D* jetdirection,
168 const Amg::Vector3D* linearizationjetdirection) const {
169
170
171 //creates VxJetCandidate. Constructor takes care of adding VxTrackAtVertex
172 //and creating one VxVertexOnJetAxis for each added track
173
174 VxJetCandidate* myJetCandidate=new VxJetCandidate(vectorOfT);
175
176 return initializeJetClusters(myJetCandidate,primaryVertex,jetdirection,linearizationjetdirection);
177
178 }
179
181 const RecVertex* primaryVertex,
182 const Amg::Vector3D* jetdirection,
183 const Amg::Vector3D* linearizationjetdirection) const {
184
185 //now create a new m_fittedPositions for the VxJetCandidate
186 //start from position...
187
188 if (primaryVertex==nullptr) {
189 std::cout << "ERROR. No valid primary vertex pointer provided to the JetFitterInitializationHelper." << std::endl;
190 throw std::runtime_error ("No valid primary vertex pointer provided to the JetFitterInitializationHelper.");
191 }
192 AmgVector(5) startPosition;
193 startPosition[Trk::jet_xv]=primaryVertex->position().x();
194 startPosition[Trk::jet_yv]=primaryVertex->position().y();
195 startPosition[Trk::jet_zv]=primaryVertex->position().z();
196
197 if (jetdirection!=nullptr) {
198 startPosition[Trk::jet_theta]=jetdirection->theta();
199 startPosition[Trk::jet_phi]=jetdirection->phi();
200 } else {
201 std::cout << "JetFitterInitializationHelper: Error! no starting jet direction provided. Using (0,0)" << std::endl;
202 startPosition[Trk::jet_theta]=0;
203 startPosition[Trk::jet_phi]=0;
204 }
205
206 //override default setting...
207 std::pair<double,double> phiAndThetaError(m_errphiJetAxis,m_erretaJetAxis);
208
209 /*
210 if (jetdirection!=0)
211 {
212
213 //override default setting...
214 phiAndThetaError=getPhiAndThetaError(*jetdirection);
215
216 std::cout << " Using phi error: " << phiAndThetaError.first << " and eta error: " << phiAndThetaError.second << " for pt: " << jetdirection->perp() <<
217 " and eta: " << jetdirection->pseudoRapidity() << std::endl;
218
219 }
220 */
221
222 AmgSymMatrix(3) primaryCovariance(primaryVertex->covariancePosition().block<3,3>(0,0));
223 AmgSymMatrix(5) startCovariance; startCovariance.setZero();
224 startCovariance.block<3,3>(0,0) = primaryCovariance;
225 startCovariance(Trk::jet_theta,Trk::jet_theta) =
226 std::pow(phiAndThetaError.second*sin(startPosition(Trk::jet_theta)),2);
227 startCovariance(Trk::jet_phi,Trk::jet_phi) = std::pow(phiAndThetaError.first,2);
228
229 RecVertexPositions startRecVertexPositions(startPosition,
230 startCovariance,
231 0.,0.);
232
233 //initialize the RecVertexPositions object of the VxJetCandidate
234 myJetCandidate->setRecVertexPositions(startRecVertexPositions);
235 myJetCandidate->setConstraintVertexPositions(startRecVertexPositions);
236
237 VertexPositions linVertexPositions;
238 if (linearizationjetdirection!=nullptr) {
239 Amg::VectorX linPosition=startPosition;
240 linPosition[Trk::jet_theta]=linearizationjetdirection->theta();
241 linPosition[Trk::jet_phi]=linearizationjetdirection->phi();
242 linVertexPositions=VertexPositions(linPosition);
243 } else {
244 linVertexPositions=startRecVertexPositions;
245 }
246
247 myJetCandidate->setLinearizationVertexPositions(linVertexPositions);
248 //initialize the linearizationPosition exactly to the same object or
249 //to something custom if requested by an additional argument
250
251 updateTrackNumbering(myJetCandidate);
252
253 const VxVertexOnJetAxis* primaryVertexJC(myJetCandidate->getPrimaryVertex());
254
255 if (primaryVertexJC==nullptr) {
256
257 // VxVertexOnJetAxis* newPrimaryVertex=new VxVertexOnJetAxis();
258 VxVertexOnJetAxis newPrimaryVertex;
259 //set numVertex of primaryVertex to -10
260 newPrimaryVertex.setNumVertex(-10);
261 // newPrimaryVertex->setLinearizationPosition(0.);//should be the same as default, but...
262 myJetCandidate->setPrimaryVertex(&newPrimaryVertex);
263
264 } else {
265
266 ATH_MSG_WARNING ("Primary Vertex was already initialized. Check...");
267
268 }
269 return myJetCandidate;
270 }
271
272
274
275 const std::vector<VxVertexOnJetAxis*> & associatedVertices=myJetCandidate->getVerticesOnJetAxis();
276
277 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxBegin=associatedVertices.begin();
278 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxEnd=associatedVertices.end();
279
280 int numTrack(0);//start from 0 in counting the vertex "clusters"
281 //Horrible but a map is not suited here
282
283 if (!associatedVertices.empty()) {//Was that your intention? to be checked... 15.03.2007
284 for (std::vector<VxVertexOnJetAxis*>::const_iterator VtxIter=VtxBegin;VtxIter!=VtxEnd;++VtxIter) {
285 VxVertexOnJetAxis* myVertex=(*VtxIter);
286 if (myVertex!=nullptr) {
287 myVertex->setNumVertex(numTrack);
288 numTrack+=1;
289 } else {
290 std::cout << "Warning in JetFitterInitializationHelper.Inconsistency found. Pointer to VxVertexOnJetAxis should be different from zero. Skipping track..." << std::endl;
291 throw std::runtime_error ("Warning in JetFitterInitializationHelper.Inconsistency found. Pointer to VxVertexOnJetAxis should be different from zero. Skipping track...");
292 }
293 }
294
295 int sizeOfRecVertex=myJetCandidate->getRecVertexPositions().position().rows();
296
297 //if the size of the RecVertexPositions is not big enough, enlarge it...
298 if (numRow(numTrack)>sizeOfRecVertex) {
299
300 //Added 2. October 2014 !! (BUG...)
301 myJetCandidate->setRecVertexPositions(myJetCandidate->getConstraintVertexPositions());
302
303 Amg::VectorX myPosition = myJetCandidate->getRecVertexPositions().position();
304 Amg::MatrixX myCovariance = myJetCandidate->getRecVertexPositions().covariancePosition();
305 Amg::VectorX newPosition(numRow(numTrack)); newPosition.setZero();
306 newPosition.segment(0,myPosition.rows()) = myPosition;
307 Amg::MatrixX newCovariance(numRow(numTrack),numRow(numTrack));
308 newCovariance.setZero();
309 newCovariance.block(0,0,myCovariance.rows(),myCovariance.cols()) = myCovariance;
310 for (int i=sizeOfRecVertex;i<numRow(numTrack);++i) {
311 newCovariance(i,i)=500.*500.;
312 }
313
314 RecVertexPositions newRecVertexPositions(newPosition,
315 newCovariance,
316 myJetCandidate->getRecVertexPositions().fitQuality().chiSquared(),
317 myJetCandidate->getRecVertexPositions().fitQuality().numberDoF());
318
319
320 Amg::VectorX myPositionLinearization = myJetCandidate->getLinearizationVertexPositions().position();
321 Amg::VectorX newPositionLinearization(numRow(numTrack));
322 newPositionLinearization.setZero();
323 newPositionLinearization.segment(0,myPositionLinearization.rows()) = myPositionLinearization;
324
325 myJetCandidate->setRecVertexPositions(newRecVertexPositions);//needed here?
326 myJetCandidate->setConstraintVertexPositions(newRecVertexPositions);
327 myJetCandidate->setLinearizationVertexPositions(newPositionLinearization);
328
329 } else if (numRow(numTrack)<sizeOfRecVertex) {
330 std::cout << "Strange: size of RecVertexPosition's position in JetFitterInitializationHelper is bigger than actual numTracks plus 5. CHECK..." << std::endl;
331 throw std::runtime_error ("Strange: size of RecVertexPosition's position in JetFitterInitializationHelper is bigger than actual numTracks plus 5. CHECK...");
332 }
333
334 }
335 //succesfully initialized ordering (+ enlarging of RecVertexPositions if needed)
336 }
337
339 bool signFlipTreatment,
340 double maxdistance) const {
341
342 const VertexPositions & myLinVertexPosition=myJetCandidate->getLinearizationVertexPositions();
343 const Amg::VectorX & myPosition=myLinVertexPosition.position();
344
345 const VxVertexOnJetAxis* myPrimary=myJetCandidate->getPrimaryVertex();
346 const std::vector<VxTrackAtVertex*> & primaryVectorTracks=myPrimary->getTracksAtVertex();
347
348 Amg::Vector3D primary3Pos = myPosition.segment(0,3);
349 const Amg::Vector3D& primaryVertexPos(primary3Pos);
350
351 const std::vector<VxTrackAtVertex*>::const_iterator primaryVectorTracksBegin=primaryVectorTracks.begin();
352 const std::vector<VxTrackAtVertex*>::const_iterator primaryVectorTracksEnd=primaryVectorTracks.end();
353
354 for (std::vector<VxTrackAtVertex*>::const_iterator primaryVectorIter=primaryVectorTracksBegin;
355 primaryVectorIter!=primaryVectorTracksEnd;++primaryVectorIter) {
356
357// std::cout << " New track to linearize at PV" << primaryVertexPos << std::endl;
358
359 const Trk::LinearizedTrack* linTrack=(*primaryVectorIter)->linState();
360
361 if (linTrack!=nullptr) {
362 // std::cout << "distance is: " << (linTrack->linearizationPoint()-primary3Pos).mag() << std::endl;
363 if ((linTrack->linearizationPoint()-primary3Pos).mag()>maxdistance) {
364 // std::cout << " redoing linearization" << std::endl;
365 m_linearizedFactory->linearize(**primaryVectorIter,primaryVertexPos);
366 }
367 } else {
368 // std::cout << " linearizing for the first time " << std::endl;
369 m_linearizedFactory->linearize(**primaryVectorIter,primaryVertexPos);
370 }
371
372
373 }
374
375 const std::vector<VxVertexOnJetAxis*> & associatedVertices=myJetCandidate->getVerticesOnJetAxis();
376
377 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxBegin=associatedVertices.begin();
378 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxEnd=associatedVertices.end();
379
380 for (std::vector<VxVertexOnJetAxis*>::const_iterator VtxIter=VtxBegin;VtxIter!=VtxEnd;++VtxIter) {
381
382 int numVertex=(*VtxIter)->getNumVertex();
383 Amg::Vector3D secondaryVertexPos(getSingleVtxPositionWithSignFlip(myPosition,numVertex,signFlipTreatment));
384
385// std::cout << " Considering linearization at n. vertex " << numVertex << " pos " << secondaryVertexPos << std::endl;
386
387 const std::vector<VxTrackAtVertex*> & tracksAtVertex=(*VtxIter)->getTracksAtVertex();
388
389 const std::vector<VxTrackAtVertex*>::const_iterator TracksBegin=tracksAtVertex.begin();
390 const std::vector<VxTrackAtVertex*>::const_iterator TracksEnd=tracksAtVertex.end();
391
392 for (std::vector<VxTrackAtVertex*>::const_iterator TrackVectorIter=TracksBegin;
393 TrackVectorIter!=TracksEnd;++TrackVectorIter) {
394
395 const Trk::LinearizedTrack* linTrack=(*TrackVectorIter)->linState();
396
397 if (linTrack!=nullptr) {
398 // std::cout << "distance not primary is: " << (linTrack->linearizationPoint()-secondaryVertexPos.position()).mag() << std::endl;
399 if ((linTrack->linearizationPoint()-secondaryVertexPos).mag()>maxdistance) {
400 // std::cout << " redoing linearization" << std::endl;
401 m_linearizedFactory->linearize(**TrackVectorIter,secondaryVertexPos);
402 }
403 } else {
404 // std::cout << " linearizing for the first time " << std::endl;
405 m_linearizedFactory->linearize(**TrackVectorIter,secondaryVertexPos);
406 }
407
408
409
410 }
411
412 }
413
414 }//end linearizeAllTracks
415
416}//end namespace
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define AmgSymMatrix(dim)
#define AmgVector(rows)
static Double_t sc
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
Definition FitQuality.h:60
double chiSquared() const
returns the of the overall track fit
Definition FitQuality.h:56
ToolHandle< IVertexLinearizedTrackFactory > m_linearizedFactory
float m_erretaJetAxis
Error on eta on the flight direction you want to initialize the fit with (set erretaJetAxis by JobOpt...
VxJetCandidate * initializeJetCandidate(const std::vector< const Trk::ITrackLink * > &vectorOfLink, const RecVertex *primaryVertex, const Amg::Vector3D *jetdirection=0, const Amg::Vector3D *linearizationjetdirection=0) const
Initialize the JetCandidate using a vector of Trk::ITrackLink* - needed for example if you run on ESD...
void linearizeAllTracks(VxJetCandidate *, bool signfliptreatment=false, double maxdistance=1.) const
Calls the linearization of all the tracks (adds the Linearized Track data member to every VxTrackAtVe...
static void updateTrackNumbering(VxJetCandidate *)
Does the update of the ordering of the vertices along the jetaxis.
VxJetCandidate * initializeJetClusters(VxJetCandidate *myJetCandidate, const RecVertex *primaryVertex, const Amg::Vector3D *jetdirection=0, const Amg::Vector3D *linearizationjetdirection=0) const
Internal method to initialized a VxJetCandidate.
float m_errphiJetAxis
Error on phi on the flight direction you want to initialize the fit with (set errphiJetAxis by JobOpt...
JetFitterInitializationHelper(const std::string &t, const std::string &n, const IInterface *p)
Constructor.
const Amg::Vector3D & linearizationPoint() const
An access to an actual linearization point.
Amg::MatrixX const & covariancePosition() const
return the covDeltaV matrix of the vertex fit
const Trk::FitQuality & fitQuality() const
Fit quality access method.
Trk::RecVertex inherits from Trk::Vertex.
Definition RecVertex.h:44
VertexPositions class to represent and store a vertex.
const Amg::VectorX & position() const
return position of vertex
const Amg::Vector3D & position() const
return position of vertex
Definition Vertex.cxx:63
std::vector< Trk::VxTrackAtVertex * > * vxTrackAtVertex(void)
Unconst pointer to the vector of tracks Required by some of the vertex fitters.
void setLinearizationVertexPositions(const Trk::VertexPositions &)
const Trk::VertexPositions & getLinearizationVertexPositions() const
void setVerticesOnJetAxis(const std::vector< VxVertexOnJetAxis * > &)
const std::vector< VxVertexOnJetAxis * > & getVerticesOnJetAxis(void) const
const Trk::RecVertexPositions & getConstraintVertexPositions() const
void setPrimaryVertex(const VxVertexOnJetAxis *)
const VxVertexOnJetAxis * getPrimaryVertex(void) const
void setConstraintVertexPositions(const Trk::RecVertexPositions &)
const Trk::RecVertexPositions & getRecVertexPositions() const
void setRecVertexPositions(const Trk::RecVertexPositions &)
The VxTrackAtVertex is a common class for all present TrkVertexFitters The VxTrackAtVertex is designe...
VxVertexOnJetAxis inherits from Vertex.
void setNumVertex(int numVertex)
Set Method for NumVertex.
const std::vector< VxTrackAtVertex * > & getTracksAtVertex(void) const
get Tracks At Vertex Method
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.
Ensure that the ATLAS eigen extensions are properly loaded.
@ theta
Definition ParamDefs.h:66
@ phi
Definition ParamDefs.h:75
@ jet_zv
position x,y,z of primary vertex
Helper to simultaneously calculate sin and cos of the same angle.