ATLAS Offline Software
Loading...
Searching...
No Matches
AlignTrack.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "TrkTrack/Track.h"
11
13
14namespace Trk {
15
16 //________________________________________________________________________
17 AlignTrack::AlignTrack(const Track& associatedTrack)
18 : Track(associatedTrack)
19 , m_originalTrack(nullptr)
22 , m_alignTSOSCollection(nullptr)
23 , m_localErrorMat(nullptr)
24 , m_localErrorMatInv(nullptr)
25 , m_derivativeMatrix(nullptr)
26 , m_fullCovarianceMatrix(nullptr)
27 , m_derivatives(nullptr)
28 , m_derivativeErr(nullptr)
30 , m_residuals(nullptr)
31 , m_weights(nullptr)
32 , m_weightsFirstDeriv(nullptr)
33 , m_chi2(0.)
34 , m_chi2dof(0.)
35 , m_trackAlignParamQuality(new double[6])
37 {
38 for (int i=0;i<6;i++) m_trackAlignParamQuality[i]=0.;
39 m_vtx=nullptr;
40 m_refitD0=true;
41 m_refitZ0=true;
42 m_refitPhi=true;
43 m_refitTheta=true;
44 m_refitQovP=true;
45 }
46
47 //________________________________________________________________________
48 AlignTrack::AlignTrack(const Track& associatedTrack,
50 : Track(associatedTrack)
51 , m_originalTrack(nullptr)
54 , m_localErrorMat(nullptr)
55 , m_localErrorMatInv(nullptr)
56 , m_derivativeMatrix(nullptr)
57 , m_fullCovarianceMatrix(nullptr)
58 , m_derivatives(nullptr)
59 , m_derivativeErr(nullptr)
61 , m_residuals(nullptr)
62 , m_weights(nullptr)
63 , m_weightsFirstDeriv(nullptr)
64 , m_chi2(0.)
65 , m_chi2dof(0.)
66 , m_trackAlignParamQuality(new double[6])
68 {
69 for (int i=0;i<6;i++) m_trackAlignParamQuality[i]=0.;
71 m_vtx=nullptr;
72 m_refitD0=true;
73 m_refitZ0=true;
74 m_refitPhi=true;
75 m_refitTheta=true;
76 m_refitQovP=true;
77 }
78
79 //________________________________________________________________________
81 : Track(atrack)
83 , m_type(atrack.m_type)
86 new Amg::SymMatrixX(*(atrack.m_localErrorMat)) : nullptr)
88 new Amg::SymMatrixX(*(atrack.m_localErrorMatInv)) : nullptr)
90 new Amg::MatrixX(*(atrack.m_derivativeMatrix)) : nullptr)
92 new Amg::SymMatrixX(*(atrack.m_fullCovarianceMatrix)) : nullptr)
94 new std::vector<AlignModuleDerivatives>(*(atrack.m_derivatives)) : nullptr)
96 new std::vector<AlignModuleDerivatives>(*(atrack.m_derivativeErr)) : nullptr)
98 new std::vector<std::pair<AlignModule*,std::vector<double> > > (*(atrack.m_actualSecondDerivatives)) : nullptr)
99 , m_residuals(atrack.m_residuals ?
100 new Amg::VectorX(*(atrack.m_residuals)) : nullptr)
101 , m_weights(atrack.m_weights ?
102 new Amg::SymMatrixX(*(atrack.m_weights)) : nullptr)
104 new Amg::SymMatrixX(*(atrack.m_weightsFirstDeriv)) : nullptr)
105 , m_chi2(atrack.m_chi2)
106 , m_chi2dof(atrack.m_chi2dof)
107 , m_trackAlignParamQuality(new double[6])
109 {
110 if (atrack.m_trackWithoutScattering) {
111 m_trackWithoutScattering.set(std::make_unique<Trk::Track>(*(atrack.m_trackWithoutScattering)));
112 }
113
114 for (int i=0;i<6;i++)
116
117 // copy AlignTSOSCollection
118 if(atrack.m_alignTSOSCollection!=nullptr) {
119 AlignTSOSCollection * aTSOScoll = new AlignTSOSCollection;
120 aTSOScoll->reserve(atrack.m_alignTSOSCollection->size());
121 AlignTSOSIt itAtsos_end = atrack.m_alignTSOSCollection->end();
122 for(AlignTSOSIt itAtsos = atrack.m_alignTSOSCollection->begin(); itAtsos!=itAtsos_end; ++itAtsos) {
123 assert(*itAtsos!=0); // check that is defined.
124 AlignTSOS * atsos = new AlignTSOS(**itAtsos);
125 aTSOScoll->push_back(atsos);
126 }
127 m_alignTSOSCollection=aTSOScoll;
128 }
129 else
130 m_alignTSOSCollection=nullptr;
131
132 findPerigee();
133 m_vtx=nullptr;
134 m_refitD0=true;
135 m_refitZ0=true;
136 m_refitPhi=true;
137 m_refitTheta=true;
138 m_refitQovP=true;
139 }
140
141 //________________________________________________________________________
142 AlignTrack& AlignTrack::operator= (const AlignTrack& atrack)
143 {
144 if (this!=&atrack) {
145
146 // assign Track content
147 Track::operator=(atrack);
148
149 // now fill the extra stuff
151 m_type = atrack.m_type;
153 m_chi2 = atrack.m_chi2;
154 m_chi2dof = atrack.m_chi2dof;
155 m_vtx = atrack.m_vtx;
156 m_refitD0 = atrack.m_refitD0;
157 m_refitZ0 = atrack.m_refitZ0;
158 m_refitPhi = atrack.m_refitPhi;
159 m_refitTheta = atrack.m_refitTheta;
160 m_refitQovP = atrack.m_refitQovP;
161
162 for (int i=0;i<6;i++)
164
165 // copy AlignTSOSCollection
167 if(atrack.m_alignTSOSCollection!=nullptr) {
169 aTSOScoll->reserve(atrack.m_alignTSOSCollection->size());
170 AlignTSOSIt itAtsos_end = atrack.m_alignTSOSCollection->end();
171 for(AlignTSOSIt itAtsos = atrack.m_alignTSOSCollection->begin(); itAtsos!=itAtsos_end; ++itAtsos) {
172 assert(*itAtsos!=0); // check that is defined.
173 AlignTSOS * atsos = new AlignTSOS(**itAtsos);
174 aTSOScoll->push_back(atsos);
175 }
176 m_alignTSOSCollection=aTSOScoll;
177 }
178 else
179 m_alignTSOSCollection=nullptr;
180
181 findPerigee();
182
183 // fill matrices, vectors, etc.
184 delete m_derivatives;
186 new std::vector<AlignModuleDerivatives>(*(atrack.m_derivatives)) : nullptr;
187 delete m_derivativeErr;
189 new std::vector<AlignModuleDerivatives>(*(atrack.m_derivativeErr)) : nullptr;
192 new std::vector<std::pair<AlignModule*,std::vector<double> > > (*(atrack.m_actualSecondDerivatives)) : nullptr;
193 delete m_localErrorMat;
195 new Amg::SymMatrixX(*(atrack.m_localErrorMat)) : nullptr;
196 delete m_localErrorMatInv;
198 new Amg::SymMatrixX(*(atrack.m_localErrorMatInv)) : nullptr;
199 delete m_derivativeMatrix;
201 new Amg::MatrixX(*(atrack.m_derivativeMatrix)) : nullptr;
204 new Amg::SymMatrixX(*(atrack.m_fullCovarianceMatrix)) : nullptr;
205 delete m_residuals;
206 m_residuals = atrack.m_residuals ?
207 new Amg::VectorX(*(atrack.m_residuals)) : nullptr;
208 delete m_weights;
209 m_weights = atrack.m_weights ?
210 new Amg::SymMatrixX(*(atrack.m_weights)) : nullptr;
211 delete m_weightsFirstDeriv;
213 new Amg::SymMatrixX(*(atrack.m_weightsFirstDeriv)) : nullptr;
214 }
215
216 return *this;
217 }
218
219 //________________________________________________________________________
221 {
223 delete m_residuals; m_residuals=nullptr;
224 delete m_weights; m_weights=nullptr;
226
227 delete m_derivatives; m_derivatives=nullptr;
228 delete m_derivativeErr; m_derivativeErr=nullptr;
230
231 delete m_localErrorMat; m_localErrorMat=nullptr;
233
236
237 delete [] m_trackAlignParamQuality;
238 }
239
240 //________________________________________________________________________
241 bool AlignTrack::isSLTrack(const Track* track)
242 {
243 const Perigee* pp = track->perigeeParameters();
244 if( pp ){
245
246
247 const AmgSymMatrix(5)* covMatrix = pp->covariance();
248 if( covMatrix ){
249 // sum covariance terms of momentum, use it to determine whether fit was SL fit
250 double momCov = 0.;
251 for( int i=0;i<5;++i )
252 momCov += fabs( (*covMatrix)(4,i));
253 for( int i=0;i<4;++i )
254 momCov += fabs( (*covMatrix)(i,4));
255 if( momCov < 1e-10 )
256 return true;
257 }
258 }
259 return false;
260 }
261
262 //________________________________________________________________________
264 {
265 return isSLTrack(this);
266 }
267
268 //________________________________________________________________________
269 void AlignTrack::dumpTrackInfo(const Track& track, MsgStream& msg)
270 {
271 for (const TrackStateOnSurface* tsos : *track.trackStateOnSurfaces())
272 msg<<*tsos;
273 }
274
275 //________________________________________________________________________
276 void AlignTrack::dumpLessTrackInfo(const Track& track, MsgStream& msg)
277 {
278 int ntsos(0);
279 for (const TrackStateOnSurface* tsos : *track.trackStateOnSurfaces()) {
280 msg<<"ntsos "<<ntsos<<":"<<", type "<<tsos->dumpType();
281 //msg << " perigee center of this TSOS: "<< tsos->trackParameters()->associatedSurface()->center() << endmsg;
282
283 if (tsos->type(TrackStateOnSurface::Perigee))
284 msg << ", Perigee"<<endmsg;
285
286 else if (tsos->type(TrackStateOnSurface::Outlier))
287 msg << ", Outlier"<<endmsg;
288
289 else if ( !tsos->type(TrackStateOnSurface::Scatterer) &&
291 msg << "," << ( tsos->fitQualityOnSurface() )<<endmsg;
292 }
293
294 else {
295
296 const MaterialEffectsBase* meb = tsos->materialEffectsOnTrack();
297 const MaterialEffectsOnTrack* meot = dynamic_cast<const MaterialEffectsOnTrack*>(meb);
298
299 if (meot) {
300 msg<<", meot";
301 if (meot->scatteringAngles())
302 msg<<", have angles"<<endmsg;
303 else
304 msg<<", no angles"<<endmsg;
305 }
306 else if (tsos->type(TrackStateOnSurface::InertMaterial))
307 msg<<", InertMaterial"<<endmsg;
308 else
309 msg << ", hmm... no material effects on track!"<<endmsg;
310 }
311 ++ntsos;
312 }
313 }
314
315 //________________________________________________________________________
316 void AlignTrack::dump(MsgStream& msg)
317 {
318 msg<<"dumping AlignTrack"<<endmsg;
319 double chi2=0.;
320 int imeas(1);
322 int natsos = m_alignTSOSCollection->size();
323 for (int iatsos=0;iatsos<natsos;iatsos++) {
324 const AlignTSOS* atsos=(*m_alignTSOSCollection)[iatsos];
325 std::vector<Residual>::const_iterator itRes = atsos->firstResidual();
326 std::vector<Residual>::const_iterator itRes_end = atsos->lastResidual();
327 for ( ; itRes != itRes_end; ++itRes,++imeas) {
328 double resNorm = itRes->residualNorm();
329 chi2 += resNorm*resNorm;
330 //msg<<"resNorm="<<resNorm
331 // <<", errorMat("<<imeas<<")="<<(*m_localErrorMat)(imeas,imeas)
332 // <<endmsg;
333 }
334 msg<<"iatsos "<<iatsos<<", chi2="<<chi2<<*atsos<<endmsg;
335 }
336 }
337 msg<<"total chi2: "<<m_chi2<<endmsg;
338 }
339
340 //________________________________________________________________________
342 {
343 m_alignTSOSCollection=atsosColl;
344
345 // calculate m_nAlignTSOSMeas
346 int natsos = m_alignTSOSCollection->size();
347 for (int iatsos=0;iatsos<natsos;iatsos++)
348 m_nAlignTSOSMeas += (*m_alignTSOSCollection)[iatsos]->nResDim();
349
350 // calculate V and Vinv
352 m_localErrorMat->setZero();
354 m_localErrorMatInv->setZero();
355
356 int matrixindex(0);
359 for ( ; itAtsos != itAtsos_end; ++itAtsos) {
360 const AlignTSOS * atsos = *itAtsos;
361 std::vector<Residual>::const_iterator itRes = atsos->firstResidual();
362 std::vector<Residual>::const_iterator itRes_end = atsos->lastResidual();
363 for ( ; itRes != itRes_end; ++itRes) {
364 (*m_localErrorMat)(matrixindex,matrixindex) = itRes->errSq();
365 (*m_localErrorMatInv)(matrixindex,matrixindex) = 1./itRes->errSq();
366 matrixindex++;
367 }
368 }
369 }
370
371 //________________________________________________________________________
372 MsgStream& operator<< (MsgStream& sl, const AlignTrack::AlignTrackType type)
373 {
374 switch(type) {
376 return sl<<"Unknown ";
378 return sl<<"Original ";
380 return sl<<"NormalRefitted ";
382 return sl<<"BeamspotConstrained ";
384 return sl<<"VertexConstrained ";
385 default:
386 return sl<<"UNDEFINED ";
387 }
388 }
389
390 //________________________________________________________________________
391 std::ostream& operator<< (std::ostream& sl, const AlignTrack::AlignTrackType type)
392 {
393 switch(type) {
395 return sl<<"Unknown ";
397 return sl<<"Original ";
399 return sl<<"NormalRefitted ";
401 return sl<<"BeamspotConstrained ";
403 return sl<<"VertexConstrained ";
404 default:
405 return sl<<"UNDEFINED ";
406 }
407 }
408
409 //________________________________________________________________________
411 {
412 switch(type) {
413 case AlignTrack::Unknown: return "Unknown";
414 case AlignTrack::Original: return "Original";
415 case AlignTrack::NormalRefitted: return "NormalRefitted";
416 case AlignTrack::BeamspotConstrained: return "BeamspotConstrained";
417 case AlignTrack::VertexConstrained: return "VertexConstrained";
418 default: return "UNDEFINED";
419 }
420 }
421
422 //________________________________________________________________________
424 {
425 if (not m_trackWithoutScattering) {
426
427 const Trk::TrackStates* states = this->trackStateOnSurfaces();
428 if (!states) return nullptr;
429
430 // loop over TSOSs
431 Trk::TrackStates::const_iterator tsit = states->begin();
432 Trk::TrackStates::const_iterator tsit_end = states->end();
433
434 // This is the list of new TSOS
435 auto newTrackStateOnSurfaces = std::make_unique<Trk::TrackStates>();
436 newTrackStateOnSurfaces->reserve( states->size() );
437
438 for (; tsit!=tsit_end ; ++tsit) {
439 auto newMeas = (*tsit)->measurementOnTrack() ? (*tsit)->measurementOnTrack()->uniqueClone() : nullptr;
440 auto newPars = (*tsit)->trackParameters() ? (*tsit)->trackParameters()->uniqueClone() : nullptr;
441 auto newFitQoS= (*tsit)->fitQualityOnSurface();
442 auto meb = (*tsit)->materialEffectsOnTrack() ? (*tsit)->materialEffectsOnTrack()->uniqueClone() : nullptr;
443
444 if (meb) {
445 //meot is just used as observer, not owner, so can safely duplicate the pointer
446 const auto *meot=dynamic_cast<const Trk::MaterialEffectsOnTrack*>(meb.get());
447 if (meot) {
448 double tinX0=meot->thicknessInX0();
449 std::unique_ptr<Trk::EnergyLoss> eLoss =
450 meot->energyLoss()
451 ? std::unique_ptr<Trk::EnergyLoss>(meot->energyLoss()->clone())
452 : nullptr;
453 const Trk::Surface& surf = meot->associatedSurface();
454 std::bitset<MaterialEffectsBase::NumberOfMaterialEffectsTypes> typeMaterial;
455 if (eLoss) typeMaterial.set(MaterialEffectsBase::EnergyLossEffects);
457 new Trk::MaterialEffectsOnTrack(tinX0,std::nullopt,std::move(eLoss),surf,typeMaterial);
458 meb.reset(newmeot);
459 }
460 }
461
462 std::bitset<TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
465 typePattern.set(i);
466 }
467 const Trk::TrackStateOnSurface* newTsos =
468 new Trk::TrackStateOnSurface(newFitQoS,
469 std::move(newMeas),
470 std::move(newPars),
471 std::move(meb),
472 typePattern);
473 newTrackStateOnSurfaces->push_back(newTsos);
474 }
475
476 m_trackWithoutScattering.set(std::make_unique<Trk::Track>( this->info(), std::move(newTrackStateOnSurfaces),
477 this->fitQuality() ?
478 this->fitQuality()->uniqueClone() : nullptr ));
479 }
480 return m_trackWithoutScattering.get();
481 }
482
483} // end namespace
#define endmsg
#define AmgSymMatrix(dim)
std::ostream & operator<<(std::ostream &lhs, const TestGaudiProperty &rhs)
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
std::vector< Residual >::const_iterator lastResidual() const
returns last Residual iterator
Definition AlignTSOS.h:107
std::vector< Residual >::const_iterator firstResidual() const
returns first Residual iterator
Definition AlignTSOS.h:104
Amg::VectorX * m_residuals
Definition AlignTrack.h:241
static void dumpTrackInfo(const Track &track, MsgStream &msg)
dump track information
AlignTSOSCollection::const_iterator lastAtsos() const
returns iterator pointer to last element in collection
Definition AlignTrack.h:280
double chi2() const
locally calculated chi2
Definition AlignTrack.h:165
std::vector< AlignModuleDerivatives > * m_derivativeErr
Definition AlignTrack.h:238
Amg::MatrixX * m_weights
Definition AlignTrack.h:242
virtual ~AlignTrack()
destructor
const Amg::SymMatrixX * m_fullCovarianceMatrix
matrix containing full covariance matrix from track fitter
Definition AlignTrack.h:235
const Amg::MatrixX * m_derivativeMatrix
matrix containing derivative matrix from track fitter
Definition AlignTrack.h:232
@ NormalRefitted
normally refitted, without adding any pseudo-measurement
Definition AlignTrack.h:48
@ Original
not refitted, just copy constructed from original Track
Definition AlignTrack.h:47
@ Unknown
default type
Definition AlignTrack.h:46
@ BeamspotConstrained
refitted with beamspot constraint
Definition AlignTrack.h:49
@ VertexConstrained
refitted with vertex constraint
Definition AlignTrack.h:50
AlignVertex * m_vtx
pointer to the associated vertex
Definition AlignTrack.h:249
static void dumpLessTrackInfo(const Track &track, MsgStream &msg)
dump less track information
Amg::MatrixX * m_weightsFirstDeriv
Definition AlignTrack.h:243
AlignTSOSCollection::const_iterator firstAtsos() const
retrieve iterator pointer to first element in collection
Definition AlignTrack.h:279
const AlignTSOSCollection * alignTSOSCollection() const
returns collection of alignTSOS
Definition AlignTrack.h:267
const Track * m_originalTrack
point to original track
Definition AlignTrack.h:214
const Trk::Track * trackWithoutScattering() const
returns track with ScatteringAngle pointers all set to zero (used for refit by iPat)
std::vector< AlignModuleDerivatives > * m_derivatives
Definition AlignTrack.h:237
AlignTrackType m_type
refit type of this alignTrack
Definition AlignTrack.h:217
std::vector< std::pair< AlignModule *, std::vector< double > > > * m_actualSecondDerivatives
Definition AlignTrack.h:239
AlignTrack(const Track &associatedTrack)
constructor takes the track containing the original TrackStateOnSurface objects
double * m_trackAlignParamQuality
Definition AlignTrack.h:257
int m_nAlignTSOSMeas
variables
Definition AlignTrack.h:220
AlignTSOSCollection * m_alignTSOSCollection
collection of alignTSOS that make up the alignTrack
Definition AlignTrack.h:223
Amg::SymMatrixX * m_localErrorMat
matrix containing local error matrices along diagonal
Definition AlignTrack.h:226
void setAlignTSOSCollection(AlignTSOSCollection *atsosColl)
sets collection of AlignTSOS
CxxUtils::CachedUniquePtr< Trk::Track > m_trackWithoutScattering
Definition AlignTrack.h:259
bool isSLTrack() const
method to determine whether a straight line track or not
Amg::SymMatrixX * m_localErrorMatInv
inverse matrix containing local error matrices along diagonal
Definition AlignTrack.h:229
void dump(MsgStream &msg)
dump align track information
base class to integrate material effects on Trk::Track in a flexible way.
@ EnergyLossEffects
contains energy loss corrections
represents the full description of deflection and e-loss of a track in material.
const ScatteringAngles * scatteringAngles() const
returns the MCS-angles object.
Abstract Base Class for tracking surfaces.
represents the track state (measurement, material, fit parameters and quality) at a surface.
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
@ Outlier
This TSoS contains an outlier, that is, it contains a MeasurementBase/RIO_OnTrack which was not used ...
@ InertMaterial
This represents inert material, and so will contain MaterialEffectsBase.
@ Scatterer
This represents a scattering point on the track, and so will contain TrackParameters and MaterialEffe...
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
Track & operator=(const Track &rhs)
assignment operator
const FitQuality * fitQuality() const
return a pointer to the fit quality const-overload
void findPerigee() const
Find perigee in the vector of track parameters.
STL class.
Definition of ATLAS Math & Geometry primitives (Amg)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > SymMatrixX
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.
Ensure that the ATLAS eigen extensions are properly loaded.
DataVector< const Trk::TrackStateOnSurface > TrackStates
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
DataVector< AlignTSOS >::const_iterator AlignTSOSIt
Definition AlignTrack.h:38
DataVector< AlignTSOS > AlignTSOSCollection
Definition AlignTrack.h:37
std::string dumpAlignTrackType(const AlignTrack::AlignTrackType type)
std::pair< AlignModule *, std::vector< Amg::VectorX > > AlignModuleDerivatives
Definition AlignTrack.h:39
STL namespace.
MsgStream & msg
Definition testRead.cxx:32