ATLAS Offline Software
Loading...
Searching...
No Matches
JetFitterInitializationHelper.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 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
34namespace Trk
35{
36
37 namespace {
38 int numRow(int numVertex) {
39 return numVertex+5;
40 }
41
42 Amg::Vector3D getSingleVtxPositionWithSignFlip(const Amg::VectorX & myPosition,
43 int numVertex,
44 bool signFlipTreatment) {
45
46 int numbRow=numRow(numVertex);
47 double xv=myPosition[Trk::jet_xv];
48 double yv=myPosition[Trk::jet_yv];
49 double zv=myPosition[Trk::jet_zv];
50 double phi=myPosition[Trk::jet_phi];
51 double theta=myPosition[Trk::jet_theta];
52 double dist=0.;
53 CxxUtils::sincos sc_theta (theta);
54 CxxUtils::sincos sc_phi (phi);
55 if (numbRow>=0) {
56 dist=myPosition[numbRow];
57 if (fabs(dist)*sc_theta.sn>300.) {//MAX 30cm
58 dist=dist/fabs(dist)*300./sc_theta.sn;
59 }
60 if (dist<0) {
61 if (signFlipTreatment) {
62 dist=-dist;
63 } else {
64 dist=0.;
65 }
66 }
67 }
68 return Amg::Vector3D(xv+dist*sc_phi.cs*sc_theta.sn,
69 yv+dist*sc_phi.sn*sc_theta.sn,
70 zv+dist*sc_theta.cs);
71 }
72
73 }//end anonymous namespace
74
75 JetFitterInitializationHelper::JetFitterInitializationHelper(const std::string& t, const std::string& n, const IInterface* p) :
76 AthAlgTool(t,n,p),
77 m_linearizedFactory("Trk::FullLinearizedTrackFactory", this),
78 m_errphiJetAxis(0.07),
79 m_erretaJetAxis(0.065)
80 {
81 declareProperty("errphiJetAxis",m_errphiJetAxis);
82 declareProperty("erretaJetAxis",m_erretaJetAxis);
83 declareProperty("LinearizedTrackFactory",m_linearizedFactory);
84 declareInterface< JetFitterInitializationHelper >(this) ;
85
86 }
87
88
89
90
91
93
94
96
97 StatusCode sc=m_linearizedFactory.retrieve();
98 if(sc.isFailure()) {
99 ATH_MSG_ERROR( " Unable to retrieve "<<m_linearizedFactory );
100 return StatusCode::FAILURE;
101 }
102
103
104 return StatusCode::SUCCESS;
105
106 }
107
108
114
115 VxJetCandidate * JetFitterInitializationHelper::initializeJetCandidate(const std::vector<const Trk::ITrackLink*> & vectorOfLink,
116 const RecVertex* primaryVertex,
117 const Amg::Vector3D* jetdirection,
118 const Amg::Vector3D* linearizationjetdirection) const
119 {
120
121 ATH_MSG_VERBOSE (" Entered initializeJetCandidate() ");
122
123 VxJetCandidate* myJetCandidate=new VxJetCandidate();
124
125 std::vector<Trk::VxVertexOnJetAxis*> setOfVertices=myJetCandidate->getVerticesOnJetAxis();
126 std::vector<Trk::VxTrackAtVertex*>* setOfTracks=myJetCandidate->vxTrackAtVertex();
127
128 std::vector<const Trk::ITrackLink*>::const_iterator vectorOfLinkBegin=vectorOfLink.begin();
129 std::vector<const Trk::ITrackLink*>::const_iterator vectorOfLinkEnd=vectorOfLink.end();
130
131 for (std::vector<const Trk::ITrackLink*>::const_iterator vectorOfLinkIter=vectorOfLinkBegin;
132 vectorOfLinkIter!=vectorOfLinkEnd;++vectorOfLinkIter)
133 {
134 std::vector<Trk::VxTrackAtVertex*> temp_vector_tracksAtVertex;
135 Trk::VxTrackAtVertex* newVxTrack=new Trk::VxTrackAtVertex((*vectorOfLinkIter)->clone());
136 temp_vector_tracksAtVertex.push_back(newVxTrack);
137 setOfTracks->push_back(newVxTrack);
138 setOfVertices.push_back(new Trk::VxVertexOnJetAxis(std::move(temp_vector_tracksAtVertex)));
139 }
140 myJetCandidate->setVerticesOnJetAxis(setOfVertices);
141 return initializeJetClusters(myJetCandidate,primaryVertex,jetdirection,linearizationjetdirection);
142
143 }
144
145
146
147
148 VxJetCandidate * JetFitterInitializationHelper::initializeJetCandidate(const std::vector<const Trk::TrackParticleBase*> & vectorOfTP,
149 const RecVertex* primaryVertex,
150 const Amg::Vector3D* jetdirection,
151 const Amg::Vector3D* linearizationjetdirection) const {
152
153
154 //creates VxJetCandidate. Constructor takes care of adding VxTrackAtVertex
155 //and creating one VxVertexOnJetAxis for each added track
156
157 VxJetCandidate* myJetCandidate=new VxJetCandidate(vectorOfTP);
158
159
160 return initializeJetClusters(myJetCandidate,primaryVertex,jetdirection,linearizationjetdirection);
161
162 }
163
164 VxJetCandidate * JetFitterInitializationHelper::initializeJetCandidate(const std::vector<const Trk::Track*> & vectorOfT,
165 const RecVertex* primaryVertex,
166 const Amg::Vector3D* jetdirection,
167 const Amg::Vector3D* linearizationjetdirection) const {
168
169
170 //creates VxJetCandidate. Constructor takes care of adding VxTrackAtVertex
171 //and creating one VxVertexOnJetAxis for each added track
172
173 VxJetCandidate* myJetCandidate=new VxJetCandidate(vectorOfT);
174
175 return initializeJetClusters(myJetCandidate,primaryVertex,jetdirection,linearizationjetdirection);
176
177 }
178
180 const RecVertex* primaryVertex,
181 const Amg::Vector3D* jetdirection,
182 const Amg::Vector3D* linearizationjetdirection) const {
183
184 //now create a new m_fittedPositions for the VxJetCandidate
185 //start from position...
186
187 if (primaryVertex==nullptr) {
188 std::cout << "ERROR. No valid primary vertex pointer provided to the JetFitterInitializationHelper." << std::endl;
189 throw std::runtime_error ("No valid primary vertex pointer provided to the JetFitterInitializationHelper.");
190 }
191 AmgVector(5) startPosition;
192 startPosition[Trk::jet_xv]=primaryVertex->position().x();
193 startPosition[Trk::jet_yv]=primaryVertex->position().y();
194 startPosition[Trk::jet_zv]=primaryVertex->position().z();
195
196 if (jetdirection!=nullptr) {
197 startPosition[Trk::jet_theta]=jetdirection->theta();
198 startPosition[Trk::jet_phi]=jetdirection->phi();
199 } else {
200 std::cout << "JetFitterInitializationHelper: Error! no starting jet direction provided. Using (0,0)" << std::endl;
201 startPosition[Trk::jet_theta]=0;
202 startPosition[Trk::jet_phi]=0;
203 }
204
205 //override default setting...
206 std::pair<double,double> phiAndThetaError(m_errphiJetAxis,m_erretaJetAxis);
207
208 /*
209 if (jetdirection!=0)
210 {
211
212 //override default setting...
213 phiAndThetaError=getPhiAndThetaError(*jetdirection);
214
215 std::cout << " Using phi error: " << phiAndThetaError.first << " and eta error: " << phiAndThetaError.second << " for pt: " << jetdirection->perp() <<
216 " and eta: " << jetdirection->pseudoRapidity() << std::endl;
217
218 }
219 */
220
221 AmgSymMatrix(3) primaryCovariance(primaryVertex->covariancePosition().block<3,3>(0,0));
222 AmgSymMatrix(5) startCovariance; startCovariance.setZero();
223 startCovariance.block<3,3>(0,0) = primaryCovariance;
224 startCovariance(Trk::jet_theta,Trk::jet_theta) =
225 std::pow(phiAndThetaError.second*sin(startPosition(Trk::jet_theta)),2);
226 startCovariance(Trk::jet_phi,Trk::jet_phi) = std::pow(phiAndThetaError.first,2);
227
228 RecVertexPositions startRecVertexPositions(startPosition,
229 startCovariance,
230 0.,0.);
231
232 //initialize the RecVertexPositions object of the VxJetCandidate
233 myJetCandidate->setRecVertexPositions(startRecVertexPositions);
234 myJetCandidate->setConstraintVertexPositions(startRecVertexPositions);
235
236 VertexPositions linVertexPositions;
237 if (linearizationjetdirection!=nullptr) {
238 Amg::VectorX linPosition=startPosition;
239 linPosition[Trk::jet_theta]=linearizationjetdirection->theta();
240 linPosition[Trk::jet_phi]=linearizationjetdirection->phi();
241 linVertexPositions=VertexPositions(linPosition);
242 } else {
243 linVertexPositions = std::move(startRecVertexPositions);
244 }
245
246 myJetCandidate->setLinearizationVertexPositions(linVertexPositions);
247 //initialize the linearizationPosition exactly to the same object or
248 //to something custom if requested by an additional argument
249
250 updateTrackNumbering(myJetCandidate);
251
252 const VxVertexOnJetAxis* primaryVertexJC(myJetCandidate->getPrimaryVertex());
253
254 if (primaryVertexJC==nullptr) {
255
256 // VxVertexOnJetAxis* newPrimaryVertex=new VxVertexOnJetAxis();
257 VxVertexOnJetAxis newPrimaryVertex;
258 //set numVertex of primaryVertex to -10
259 newPrimaryVertex.setNumVertex(-10);
260 // newPrimaryVertex->setLinearizationPosition(0.);//should be the same as default, but...
261 myJetCandidate->setPrimaryVertex(&newPrimaryVertex);
262
263 } else {
264
265 ATH_MSG_WARNING ("Primary Vertex was already initialized. Check...");
266
267 }
268 return myJetCandidate;
269 }
270
271
273
274 const std::vector<VxVertexOnJetAxis*> & associatedVertices=myJetCandidate->getVerticesOnJetAxis();
275
276 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxBegin=associatedVertices.begin();
277 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxEnd=associatedVertices.end();
278
279 int numTrack(0);//start from 0 in counting the vertex "clusters"
280 //Horrible but a map is not suited here
281
282 if (!associatedVertices.empty()) {//Was that your intention? to be checked... 15.03.2007
283 for (std::vector<VxVertexOnJetAxis*>::const_iterator VtxIter=VtxBegin;VtxIter!=VtxEnd;++VtxIter) {
284 VxVertexOnJetAxis* myVertex=(*VtxIter);
285 if (myVertex!=nullptr) {
286 myVertex->setNumVertex(numTrack);
287 numTrack+=1;
288 } else {
289 std::cout << "Warning in JetFitterInitializationHelper.Inconsistency found. Pointer to VxVertexOnJetAxis should be different from zero. Skipping track..." << std::endl;
290 throw std::runtime_error ("Warning in JetFitterInitializationHelper.Inconsistency found. Pointer to VxVertexOnJetAxis should be different from zero. Skipping track...");
291 }
292 }
293
294 int sizeOfRecVertex=myJetCandidate->getRecVertexPositions().position().rows();
295
296 //if the size of the RecVertexPositions is not big enough, enlarge it...
297 if (numRow(numTrack)>sizeOfRecVertex) {
298
299 //Added 2. October 2014 !! (BUG...)
300 myJetCandidate->setRecVertexPositions(myJetCandidate->getConstraintVertexPositions());
301
302 Amg::VectorX myPosition = myJetCandidate->getRecVertexPositions().position();
303 Amg::MatrixX myCovariance = myJetCandidate->getRecVertexPositions().covariancePosition();
304 Amg::VectorX newPosition(numRow(numTrack)); newPosition.setZero();
305 newPosition.segment(0,myPosition.rows()) = myPosition;
306 Amg::MatrixX newCovariance(numRow(numTrack),numRow(numTrack));
307 newCovariance.setZero();
308 newCovariance.block(0,0,myCovariance.rows(),myCovariance.cols()) = myCovariance;
309 for (int i=sizeOfRecVertex;i<numRow(numTrack);++i) {
310 newCovariance(i,i)=500.*500.;
311 }
312
313 RecVertexPositions newRecVertexPositions(newPosition,
314 newCovariance,
315 myJetCandidate->getRecVertexPositions().fitQuality().chiSquared(),
316 myJetCandidate->getRecVertexPositions().fitQuality().numberDoF());
317
318
319 Amg::VectorX myPositionLinearization = myJetCandidate->getLinearizationVertexPositions().position();
320 Amg::VectorX newPositionLinearization(numRow(numTrack));
321 newPositionLinearization.setZero();
322 newPositionLinearization.segment(0,myPositionLinearization.rows()) = myPositionLinearization;
323
324 myJetCandidate->setRecVertexPositions(newRecVertexPositions);//needed here?
325 myJetCandidate->setConstraintVertexPositions(newRecVertexPositions);
326 myJetCandidate->setLinearizationVertexPositions(newPositionLinearization);
327
328 } else if (numRow(numTrack)<sizeOfRecVertex) {
329 std::cout << "Strange: size of RecVertexPosition's position in JetFitterInitializationHelper is bigger than actual numTracks plus 5. CHECK..." << std::endl;
330 throw std::runtime_error ("Strange: size of RecVertexPosition's position in JetFitterInitializationHelper is bigger than actual numTracks plus 5. CHECK...");
331 }
332
333 }
334 //succesfully initialized ordering (+ enlarging of RecVertexPositions if needed)
335 }
336
338 bool signFlipTreatment,
339 double maxdistance) const {
340
341 const VertexPositions & myLinVertexPosition=myJetCandidate->getLinearizationVertexPositions();
342 const Amg::VectorX & myPosition=myLinVertexPosition.position();
343
344 const VxVertexOnJetAxis* myPrimary=myJetCandidate->getPrimaryVertex();
345 const std::vector<VxTrackAtVertex*> & primaryVectorTracks=myPrimary->getTracksAtVertex();
346
347 Amg::Vector3D primary3Pos = myPosition.segment(0,3);
348 const Amg::Vector3D& primaryVertexPos(primary3Pos);
349
350 const std::vector<VxTrackAtVertex*>::const_iterator primaryVectorTracksBegin=primaryVectorTracks.begin();
351 const std::vector<VxTrackAtVertex*>::const_iterator primaryVectorTracksEnd=primaryVectorTracks.end();
352
353 for (std::vector<VxTrackAtVertex*>::const_iterator primaryVectorIter=primaryVectorTracksBegin;
354 primaryVectorIter!=primaryVectorTracksEnd;++primaryVectorIter) {
355
356// std::cout << " New track to linearize at PV" << primaryVertexPos << std::endl;
357
358 const Trk::LinearizedTrack* linTrack=(*primaryVectorIter)->linState();
359
360 if (linTrack!=nullptr) {
361 // std::cout << "distance is: " << (linTrack->linearizationPoint()-primary3Pos).mag() << std::endl;
362 if ((linTrack->linearizationPoint()-primary3Pos).mag()>maxdistance) {
363 // std::cout << " redoing linearization" << std::endl;
364 m_linearizedFactory->linearize(**primaryVectorIter,primaryVertexPos);
365 }
366 } else {
367 // std::cout << " linearizing for the first time " << std::endl;
368 m_linearizedFactory->linearize(**primaryVectorIter,primaryVertexPos);
369 }
370
371
372 }
373
374 const std::vector<VxVertexOnJetAxis*> & associatedVertices=myJetCandidate->getVerticesOnJetAxis();
375
376 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxBegin=associatedVertices.begin();
377 const std::vector<VxVertexOnJetAxis*>::const_iterator VtxEnd=associatedVertices.end();
378
379 for (std::vector<VxVertexOnJetAxis*>::const_iterator VtxIter=VtxBegin;VtxIter!=VtxEnd;++VtxIter) {
380
381 int numVertex=(*VtxIter)->getNumVertex();
382 Amg::Vector3D secondaryVertexPos(getSingleVtxPositionWithSignFlip(myPosition,numVertex,signFlipTreatment));
383
384// std::cout << " Considering linearization at n. vertex " << numVertex << " pos " << secondaryVertexPos << std::endl;
385
386 const std::vector<VxTrackAtVertex*> & tracksAtVertex=(*VtxIter)->getTracksAtVertex();
387
388 const std::vector<VxTrackAtVertex*>::const_iterator TracksBegin=tracksAtVertex.begin();
389 const std::vector<VxTrackAtVertex*>::const_iterator TracksEnd=tracksAtVertex.end();
390
391 for (std::vector<VxTrackAtVertex*>::const_iterator TrackVectorIter=TracksBegin;
392 TrackVectorIter!=TracksEnd;++TrackVectorIter) {
393
394 const Trk::LinearizedTrack* linTrack=(*TrackVectorIter)->linState();
395
396 if (linTrack!=nullptr) {
397 // std::cout << "distance not primary is: " << (linTrack->linearizationPoint()-secondaryVertexPos.position()).mag() << std::endl;
398 if ((linTrack->linearizationPoint()-secondaryVertexPos).mag()>maxdistance) {
399 // std::cout << " redoing linearization" << std::endl;
400 m_linearizedFactory->linearize(**TrackVectorIter,secondaryVertexPos);
401 }
402 } else {
403 // std::cout << " linearizing for the first time " << std::endl;
404 m_linearizedFactory->linearize(**TrackVectorIter,secondaryVertexPos);
405 }
406
407
408
409 }
410
411 }
412
413 }//end linearizeAllTracks
414
415}//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.