ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Tracking
TrkAlignment
TrkAlignEvent
src
AlignVertex.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
#include "
TrkAlignEvent/AlignVertex.h
"
6
#include "GaudiKernel/MsgStream.h"
7
#include <iostream>
8
9
namespace
Trk
{
10
11
//________________________________________________________________________
12
AlignVertex::AlignVertex
()
13
: m_matrix(nullptr)
14
,
m_vector
(nullptr)
15
,
m_original
(nullptr)
16
,
m_originalPosition
(nullptr)
17
,
m_position
(nullptr)
18
, m_covariance(nullptr)
19
,
m_derivatives
(nullptr)
20
, m_qMatrix(nullptr)
21
,
m_vVector
(nullptr)
22
,
m_constrained
(false)
23
,
m_type
(
Unknown
)
24
{
25
m_vector
=
new
Amg::Vector3D
(0.,0.,0.);
26
m_matrix=
new
AmgSymMatrix
(3);
27
m_derivatives
=
new
std::vector<AlignModuleVertexDerivatives >(0);
28
m_qMatrix=
new
AmgSymMatrix
(3);
29
m_vVector
=
new
Amg::Vector3D
(0.,0.,0.);
30
m_nTracks
=0;
31
}
32
33
//copy constructor
34
AlignVertex::AlignVertex
(
const
AlignVertex
& rhs)
35
:
m_nTracks
(rhs.
m_nTracks
)
36
, m_matrix(new
AmgSymMatrix
(3)(*(rhs.m_matrix)))
37
,
m_vector
(new
Amg
::
Vector3D
(*(rhs.
m_vector
)))
38
,
m_original
(rhs.
m_original
)
//non-owning
39
,
m_originalPosition
(new
Amg
::
Vector3D
( *(rhs.
m_originalPosition
)))
40
,
m_position
(new
Amg
::
Vector3D
(*(rhs.
m_position
)))
41
, m_covariance(new
AmgSymMatrix
(3) (*(rhs.m_covariance)) )
42
,
m_derivatives
(new auto(*(rhs.
m_derivatives
)))
43
, m_qMatrix(new
AmgSymMatrix
(3) (*(rhs.m_qMatrix)) )
44
,
m_vVector
(new
Amg
::
Vector3D
(*(rhs.
m_vVector
)))
45
,
m_constrained
(rhs.
m_constrained
)
46
,
m_type
(rhs.
m_type
)
47
{
48
49
}
50
51
//assignment
52
AlignVertex
&
AlignVertex::operator =
(
const
AlignVertex
& rhs) {
53
if
(&rhs!=
this
){
54
m_nTracks
= rhs.
m_nTracks
;
55
delete
m_matrix; m_matrix =
new
AmgSymMatrix
(3)(*(rhs.m_matrix));
56
delete
m_vector
;
m_vector
=
new
Amg::Vector3D
(*(rhs.
m_vector
));
57
m_original
= rhs.
m_original
;
//non-owning
58
delete
m_originalPosition
;
m_originalPosition
=
new
Amg::Vector3D
( *(rhs.
m_originalPosition
));
59
delete
m_position
;
m_position
=
new
Amg::Vector3D
(*(rhs.
m_position
));
60
delete
m_covariance; m_covariance =
new
AmgSymMatrix
(3) (*(rhs.m_covariance));
61
delete
m_derivatives
;
m_derivatives
=
new
auto
(*(rhs.
m_derivatives
));
62
delete
m_qMatrix; m_qMatrix =
new
AmgSymMatrix
(3) (*(rhs.m_qMatrix));
63
delete
m_vVector
;
m_vVector
=
new
Amg::Vector3D
(*(rhs.
m_vVector
));
64
m_constrained
= rhs.
m_constrained
;
65
m_type
= rhs.
m_type
;
66
}
67
return
*
this
;
68
}
69
70
71
72
73
//________________________________________________________________________
74
AlignVertex::AlignVertex
(
const
xAOD::Vertex
*
vertex
)
75
: m_matrix(nullptr)
76
,
m_vector
(nullptr)
77
,
m_original
(
vertex
)
78
,
m_originalPosition
(nullptr)
79
,
m_position
(nullptr)
80
, m_covariance(nullptr)
81
,
m_derivatives
(nullptr)
82
, m_qMatrix(nullptr)
83
,
m_vVector
(nullptr)
84
,
m_constrained
(false)
85
,
m_type
(
Unknown
)
86
{
87
m_vector
=
new
Amg::Vector3D
(0.,0.,0.);
88
m_matrix=
new
AmgSymMatrix
(3);
89
m_original
=
vertex
;
90
m_originalPosition
=
new
Amg::Vector3D
(
vertex
->position() );
91
m_derivatives
=
new
std::vector<AlignModuleVertexDerivatives >(0);
92
m_qMatrix=
new
AmgSymMatrix
(3);
93
m_vVector
=
new
Amg::Vector3D
(0.,0.,0.);
94
m_nTracks
=0;
95
}
96
97
98
//________________________________________________________________________
99
AlignVertex::~AlignVertex
()
100
{
101
if
( m_matrix )
delete
m_matrix;
102
if
(
m_vector
)
delete
m_vector
;
103
104
if
(
m_originalPosition
)
delete
m_originalPosition
;
105
106
if
(
m_position
)
delete
m_position
;
107
if
( m_covariance )
delete
m_covariance;
108
if
(
m_derivatives
)
delete
m_derivatives
;
109
110
if
( m_qMatrix )
delete
m_qMatrix;
111
if
(
m_vVector
)
delete
m_vVector
;
112
}
113
114
//________________________________________________________________________
115
void
AlignVertex::setConstraint
(
AmgSymMatrix
(3)* Q,
Amg::Vector3D
* V)
116
{
117
if
( Q->rows()!=3 || V->rows()!=3 ) {
118
std::cout <<
"Unexpected size of the constraint:"
<< std::endl;
119
std::cout <<
" Q size = "
<< Q->rows() <<
", V size = "
<< V->rows() << std::endl;
120
return
;
121
}
122
if
( Q->determinant() < 1.0e-24 ) {
123
std::cout <<
" Suspicious Q determinant: detQ = "
<< Q->determinant() << std::endl;
124
return
;
125
}
126
(*m_qMatrix) = (*Q);
127
(*m_vVector) = (*V);
128
m_constrained
=
true
;
129
}
130
131
132
//________________________________________________________________________
133
void
AlignVertex::addDerivatives
(std::vector<AlignModuleVertexDerivatives>*
vec
)
134
{
135
std::vector<AlignModuleVertexDerivatives>::iterator derivIt =
vec
->begin();
136
std::vector<AlignModuleVertexDerivatives>::iterator derivIt_end =
vec
->end();
137
138
for
( ; derivIt!=derivIt_end ; ++derivIt) {
139
m_derivatives
->push_back(*derivIt);
140
}
141
142
}
143
144
//________________________________________________________________________
145
void
AlignVertex::fitVertex
()
146
{
147
148
m_type
=
Unknown
;
149
150
if
(
Ntracks
() < 2 )
return
;
// this is not a good vertex!
151
152
153
if
( !m_matrix ) {
154
std::cout <<
"NULL pointer to the matrix! Bailing out..."
<< std::endl;
155
return
;
156
}
157
158
Amg::Vector3D
vec
= (*m_vector);
159
AmgSymMatrix
(3) cov = (*m_matrix);
160
AmgSymMatrix
(3) covcons = (*m_matrix);
161
162
AmgSymMatrix
(3) Qinv;
163
if
(
m_constrained
&& m_qMatrix->determinant() > 1.0e-24 ) {
// just my guess sigma>0.1 micron ???
164
165
bool
invertible;
166
m_qMatrix->computeInverseWithCheck(Qinv,invertible);
167
168
if
(!invertible) {
169
std::cout <<
"fitVertex: Q inversion failed. "
<< std::endl;
170
return
;
171
}
172
173
174
Amg::Vector3D
vtemp(3, 0);
175
176
vtemp = *
m_originalPosition
;
177
vtemp -= *
m_vVector
;
178
179
covcons += 2.0*Qinv;
180
vec
+= 2.0*Qinv*vtemp;
181
}
182
183
// invert the constrained covariance:
184
AmgSymMatrix
(3) invcovcons;
185
186
bool
invertible;
187
covcons.computeInverseWithCheck(invcovcons,invertible);
188
189
if
(!invertible) {
190
std::cout <<
"fitVertex: covcons inversion failed. "
<< std::endl;
191
return
;
192
}
193
194
// invert the covariance matrix:
195
AmgSymMatrix
(3) invcov;
196
cov.computeInverseWithCheck(invcov,invertible);
197
198
if
(!invertible) {
199
std::cout <<
"fitVertex: cov inversion failed. "
<< std::endl;
200
return
;
201
}
202
203
204
205
// calculate corrections (mind the sign!)
206
Amg::Vector3D
delta(invcovcons *
vec
);
207
208
if
( !
m_position
)
m_position
=
new
Amg::Vector3D
(0.,0.,0.);
209
*
m_position
= *
m_originalPosition
;
210
*
m_position
-= delta;
211
212
213
if
( !m_covariance ) m_covariance=
new
AmgSymMatrix
(3);
214
(*m_covariance)=invcov;
// this one is unconstrained!
215
216
m_type
=
Refitted
;
217
}
218
//________________________________________________________________________
219
void
AlignVertex::dump
(MsgStream&
msg
)
220
{
221
msg
<<
"dumping AlignVertex: "
<<
endmsg
;
222
223
msg
<<
" vertex Position: "
<< (*m_position) <<
endmsg
;
224
msg
<<
" vertex Covariance: "
<< (*m_covariance) <<
endmsg
;
225
msg
<<
endmsg
;
226
227
}
228
229
230
231
}
// end namespace
AlignVertex.h
endmsg
#define endmsg
Definition
AnalysisConfig_Ntuple.cxx:61
vec
std::vector< size_t > vec
Definition
CombinationsGeneratorTest.cxx:9
AmgSymMatrix
#define AmgSymMatrix(dim)
Definition
EventPrimitives.h:50
Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition
GeoPrimitives.h:47
Trk::AlignVertex::operator=
AlignVertex & operator=(const AlignVertex &rhs)
assignment
Definition
AlignVertex.cxx:52
Trk::AlignVertex::m_type
AlignVertexType m_type
Definition
AlignVertex.h:132
Trk::AlignVertex::Unknown
@ Unknown
default type
Definition
AlignVertex.h:39
Trk::AlignVertex::Refitted
@ Refitted
normally refitted, without adding any pseudo-measurement
Definition
AlignVertex.h:41
Trk::AlignVertex::m_originalPosition
Amg::Vector3D * m_originalPosition
Definition
AlignVertex.h:119
Trk::AlignVertex::~AlignVertex
~AlignVertex()
destructor
Definition
AlignVertex.cxx:99
Trk::AlignVertex::m_vVector
Amg::Vector3D * m_vVector
Definition
AlignVertex.h:128
Trk::AlignVertex::dump
void dump(MsgStream &msg)
dump align vertex information
Definition
AlignVertex.cxx:219
Trk::AlignVertex::m_constrained
bool m_constrained
Definition
AlignVertex.h:129
Trk::AlignVertex::AlignVertex
AlignVertex()
default constructor
Definition
AlignVertex.cxx:12
Trk::AlignVertex::Ntracks
int Ntracks() const
get the number of contributing tracks
Definition
AlignVertex.h:98
Trk::AlignVertex::m_derivatives
std::vector< AlignModuleVertexDerivatives > * m_derivatives
Definition
AlignVertex.h:125
Trk::AlignVertex::m_nTracks
int m_nTracks
Definition
AlignVertex.h:113
Trk::AlignVertex::fitVertex
void fitVertex()
fit the vertex internally
Definition
AlignVertex.cxx:145
Trk::AlignVertex::addDerivatives
void addDerivatives(std::vector< AlignModuleVertexDerivatives > *vec)
Definition
AlignVertex.cxx:133
Trk::AlignVertex::setConstraint
void setConstraint(AmgSymMatrix(3) *, Amg::Vector3D *)
set and get the constraint on VTX position
Definition
AlignVertex.cxx:115
Trk::AlignVertex::m_position
Amg::Vector3D * m_position
Definition
AlignVertex.h:122
Trk::AlignVertex::m_original
const xAOD::Vertex * m_original
Definition
AlignVertex.h:118
Trk::AlignVertex::AmgSymMatrix
const AmgSymMatrix(3) *covariance() const
Definition
AlignVertex.h:77
Trk::AlignVertex::m_vector
Amg::Vector3D * m_vector
Definition
AlignVertex.h:116
Amg
Definition of ATLAS Math & Geometry primitives (Amg).
Definition
AmgStringHelpers.h:19
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition
GeoPrimitives.h:47
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition
FakeTrackBuilder.h:9
Trk::vertex
@ vertex
Definition
MeasurementType.h:21
xAOD::Vertex
Vertex_v1 Vertex
Define the latest version of the vertex class.
Definition
Event/xAOD/xAODTracking/xAODTracking/Vertex.h:16
msg
MsgStream & msg
Definition
testRead.cxx:32
Generated on
for ATLAS Offline Software by
1.17.0