ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Trigger
TrigTools
TrigVertexFitter
src
TrigPrimaryVertexFitter.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3
*/
4
6
// TrigPrimaryVertexFitter tool
7
// -------------------------------
8
// ATLAS Collaboration
9
//
10
// 04.05.2008 Package created
11
//
12
// Author: Dmitry Emeliyanov, RAL
13
// e-mail: D.Emeliyanov@rl.ac.uk
14
//
16
#include <cmath>
17
#include <iostream>
18
#include <algorithm>
19
20
#include "
TrigInDetEvent/TrigL2Vertex.h
"
21
#include "
TrigInDetEvent/TrigVertex.h
"
22
23
#include "
TrkTrack/Track.h
"
24
#include "
TrkTrack/TrackCollection.h
"
25
26
#include "
TrigInDetToolInterfaces/ITrigPrimaryVertexFitter.h
"
27
#include "
TrigPrimaryVertexFitter.h
"
28
#include "
TrigPrimaryVertexTrack.h
"
29
30
31
TrigPrimaryVertexFitter::TrigPrimaryVertexFitter
(
const
std::string& t,
32
const
std::string& n,
33
const
IInterface* p ):
AthAlgTool
(t,n,p),
34
m_createTrackLists
(false),
35
m_xyVariance
(10.0)
36
{
37
declareInterface< ITrigPrimaryVertexFitter >(
this
);
38
declareProperty
(
"numberOfIterations"
,
m_numIter
=3);
39
declareProperty
(
"maxChi2Increase"
,
m_maxChi2Increase
=1000.0);
40
declareProperty
(
"zVariance"
,
m_zVariance
=1.0);
41
declareProperty
(
"Chi2Cut"
,
m_chi2cut
=15.0);
42
declareProperty
(
"Chi2CutLoose"
,
m_chi2cut_loose
=100.0);
43
declareProperty
(
"CreateTrackLists"
,
m_createTrackLists
=
false
);
44
declareProperty
(
"xyVariance"
,
m_xyVariance
=10.0);
45
}
46
47
StatusCode
TrigPrimaryVertexFitter::initialize
()
48
{
49
ATH_CHECK
( AthAlgTool::initialize() );
50
51
ATH_MSG_INFO
(
"Number of iterations is set to "
<<
m_numIter
);
52
ATH_MSG_INFO
(
"Accuracy of starting z-position is "
<<
m_zVariance
<<
" mm"
);
53
ATH_MSG_INFO
(
"Track lists created ? "
<< std::boolalpha<<
m_createTrackLists
);
54
return
StatusCode::SUCCESS;
55
}
56
57
StatusCode
TrigPrimaryVertexFitter::finalize
()
58
{
59
ATH_CHECK
( AthAlgTool::finalize() );
60
return
StatusCode::SUCCESS;
61
}
62
63
TrigPrimaryVertexFitter::~TrigPrimaryVertexFitter
()
64
{
65
66
}
67
68
TrigVertex
*
TrigPrimaryVertexFitter::fit
(
const
TrackCollection
*
tc
,
TrackCollection
& output_tc,
double
z0)
const
69
{
70
71
TrigVertex
* pVertex=NULL;
72
73
double
chi2
;
74
int
ndof;
75
76
std::vector<TrigPrimaryVertexTrack*> tracks;
77
tracks.clear();
78
int
idx=1;
79
for
(
TrackCollection::const_iterator
ptIt=
tc
->begin();ptIt!=
tc
->end();++ptIt)
80
{
81
TrigPrimaryVertexTrack
* pT=
new
TrigPrimaryVertexTrack
(*ptIt);
82
if
(pT!=NULL) {
83
pT->setIndex(idx++);
84
tracks.push_back(pT);
85
}
86
}
87
88
TrigL2Vertex
* pV =
new
TrigL2Vertex
();
89
90
pV->
getParametersVector
()[0]=0.0;
91
pV->
getParametersVector
()[1]=0.0;
92
pV->
getParametersVector
()[2]=z0;
93
bool
fitFailed
=
false
;
94
chi2
=0.0;ndof=-3;
95
for
(
int
nIter=0;nIter<
m_numIter
;nIter++)
96
{
97
memset(&pV->
m_Gk
[0][0],0,
sizeof
(pV->
m_Gk
));
98
pV->
m_Gk
[0][0]=
m_xyVariance
*
m_xyVariance
;
99
pV->
m_Gk
[1][1]=
m_xyVariance
*
m_xyVariance
;
100
pV->
m_Gk
[2][2]=
m_zVariance
*
m_zVariance
;
101
chi2
=0.0;ndof=-3;
102
fitFailed
=
false
;
103
104
for
(std::vector<TrigPrimaryVertexTrack*>::iterator it=tracks.begin();it!=tracks.end();++it)
105
{
106
if
(!(*it)->isActive())
107
(*it)->activate();
108
109
double
dchi2=(*it)->getChi2Distance(pV);
110
ATH_MSG_VERBOSE
(
"Track "
<<(*it)->getIndex()<<
" dchi2="
<<dchi2 );
111
if
(std::isnan(dchi2)||(dchi2<0.0)||(dchi2>
m_maxChi2Increase
))
112
{
113
fitFailed
=
true
;
114
break
;
115
}
116
if
(dchi2<
m_chi2cut
)
117
{
118
chi2
+=dchi2;ndof+=2;
119
(*it)->updateVertex(pV);
120
}
121
else
122
{
123
(*it)->mask();
124
ATH_MSG_DEBUG
(
"Skipping track "
<<(*it)->getIndex()<<
"due to large dchi2="
<<dchi2 );
125
}
126
}
127
if
(
fitFailed
)
break
;
128
}
129
130
131
if
(!
fitFailed
&& (ndof>0))
132
{
133
ATH_MSG_DEBUG
(
"Primary vertex fit OK, chi2 = "
<<
chi2
<<
" NDOF = "
<<ndof );
134
ATH_MSG_DEBUG
(
"x= "
<<pV->
getParametersVector
()[0]<<
135
" y= "
<<pV->
getParametersVector
()[1]<<
" z= "
<<pV->
getParametersVector
()[2] );
136
double
cv[6];
137
cv[0]=pV->
m_Gk
[0][0];cv[1]=pV->
m_Gk
[0][1];cv[2]=pV->
m_Gk
[1][1];
138
cv[3]=pV->
m_Gk
[0][2];cv[4]=pV->
m_Gk
[1][2];cv[5]=pV->
m_Gk
[2][2];
139
if
(
m_createTrackLists
) {
140
output_tc.
clear
();
141
output_tc.
reserve
(tracks.size());
142
143
for
(std::vector<TrigPrimaryVertexTrack*>::iterator it=tracks.begin();it!=tracks.end();++it) {
144
if
((*it)->isActive())
145
output_tc.
push_back
(
new
Trk::Track
(*(*it)->getTrkTrack()));
146
}
147
}
148
pVertex =
new
TrigVertex
(pV->
getParametersVector
()[0],
149
pV->
getParametersVector
()[1],
150
pV->
getParametersVector
()[2],cv,
chi2
,ndof,
nullptr
);
151
}
152
delete
pV;
153
for
(std::vector<TrigPrimaryVertexTrack*>::iterator it=tracks.begin();it!=tracks.end();++it)
154
{
155
delete
(*it);
156
}
157
return
pVertex;
158
}
159
160
struct
TrigPrimaryTrackSortPredicate
161
{
162
bool
operator()
(
TrigPrimaryVertexTrack
* pA,
TrigPrimaryVertexTrack
* pB)
163
{
164
return
(pA->
getChi2Contribution
() < pB->
getChi2Contribution
());
165
}
166
};
167
168
TrigVertex
*
TrigPrimaryVertexFitter::fit
(
const
TrackCollection
*
tc
, std::vector<double>& Chi2V,
double
z0)
const
169
{
170
171
TrigVertex
* pVertex=NULL;
172
173
double
chi2
;
174
int
ndof;
175
176
std::vector<TrigPrimaryVertexTrack*> tracks;
177
tracks.clear();
178
Chi2V.clear();
179
int
idx=1;
180
for
(
TrackCollection::const_iterator
ptIt=
tc
->begin();ptIt!=
tc
->end();++ptIt)
181
{
182
TrigPrimaryVertexTrack
* pT=
new
TrigPrimaryVertexTrack
(*ptIt);
183
if
(pT!=NULL)
184
{
185
pT->setIndex(idx++);
186
tracks.push_back(pT);
187
Chi2V.push_back(-100.0);
188
}
189
}
190
191
TrigL2Vertex
* pV =
new
TrigL2Vertex
();
192
193
// 1. preliminary fit
194
195
pV->
getParametersVector
()[0]=0.0;
196
pV->
getParametersVector
()[1]=0.0;
197
pV->
getParametersVector
()[2]=z0;
198
199
memset(&pV->
m_Gk
[0][0],0,
sizeof
(pV->
m_Gk
));
200
pV->
m_Gk
[0][0]=
m_xyVariance
*
m_xyVariance
;
201
pV->
m_Gk
[1][1]=
m_xyVariance
*
m_xyVariance
;
202
pV->
m_Gk
[2][2]=
m_zVariance
*
m_zVariance
;
203
204
bool
fitFailed
=
false
;
205
for
(std::vector<TrigPrimaryVertexTrack*>::iterator it=tracks.begin();it!=tracks.end();++it)
206
{
207
double
dchi2=(*it)->getChi2Distance(pV);
208
if
(std::isnan(dchi2)||(dchi2<0.0)||(dchi2>
m_maxChi2Increase
))
209
{
210
fitFailed
=
true
;
211
break
;
212
}
213
if
(dchi2<
m_chi2cut_loose
) (*it)->updateVertex(pV);
214
}
215
if
(
fitFailed
)
216
{
217
delete
pV;
218
for
(std::vector<TrigPrimaryVertexTrack*>::iterator it=tracks.begin();
219
it!=tracks.end();++it)
delete
(*it);
220
return
pVertex;
221
}
222
223
// 2. calculation of "smoothed" chi2s
224
225
memset(&pV->
m_Gk
[0][0],0,
sizeof
(pV->
m_Gk
));
226
227
for
(std::vector<TrigPrimaryVertexTrack*>::iterator it=tracks.begin();it!=tracks.end();++it)
228
{
229
double
dchi2=(*it)->getChi2Distance(pV);
230
ATH_MSG_DEBUG
(
"Track "
<<(*it)->getIndex()<<
" dchi2="
<<dchi2 );
231
}
232
233
// 3. sort tracks in accordance with their chi2s
234
235
std::sort
(tracks.begin(),tracks.end(),
TrigPrimaryTrackSortPredicate
());
236
237
// 4. Final track fit
238
239
pV->
getParametersVector
()[0]=0.0;
240
pV->
getParametersVector
()[1]=0.0;
241
pV->
getParametersVector
()[2]=z0;
242
fitFailed
=
false
;
243
chi2
=0.0;ndof=-3;
244
for
(
int
nIter=0;nIter<
m_numIter
;nIter++)
245
{
246
memset(&pV->
m_Gk
[0][0],0,
sizeof
(pV->
m_Gk
));
247
pV->
m_Gk
[0][0]=100.0;
248
pV->
m_Gk
[1][1]=100.0;
249
pV->
m_Gk
[2][2]=
m_zVariance
*
m_zVariance
;
250
chi2
=0.0;ndof=-3;
251
fitFailed
=
false
;
252
253
for
(std::vector<TrigPrimaryVertexTrack*>::iterator it=tracks.begin();it!=tracks.end();++it)
254
{
255
double
dchi2=(*it)->getChi2Distance(pV);
256
Chi2V[(*it)->getIndex()-1]=dchi2;
257
ATH_MSG_VERBOSE
(
"Track "
<<(*it)->getIndex()<<
" dchi2="
<<dchi2 );
258
if
(std::isnan(dchi2)||(dchi2<0.0)||(dchi2>
m_maxChi2Increase
))
259
{
260
fitFailed
=
true
;
261
break
;
262
}
263
if
(dchi2<
m_chi2cut
)
264
{
265
chi2
+=dchi2;ndof+=2;
266
(*it)->updateVertex(pV);
267
}
268
else
269
{
270
ATH_MSG_DEBUG
(
"Skipping track "
<<(*it)->getIndex()<<
"due to large dchi2="
<<dchi2 );
271
}
272
}
273
if
(
fitFailed
)
break
;
274
}
275
for
(std::vector<TrigPrimaryVertexTrack*>::iterator it=tracks.begin();it!=tracks.end();++it)
276
{
277
delete
(*it);
278
}
279
280
if
(!
fitFailed
&& (ndof>0))
281
{
282
ATH_MSG_DEBUG
(
"Primary vertex fit OK, chi2 = "
<<
chi2
<<
" NDOF = "
<<ndof );
283
ATH_MSG_DEBUG
(
"x= "
<<pV->
getParametersVector
()[0]<<
284
" y= "
<<pV->
getParametersVector
()[1]<<
" z= "
<<pV->
getParametersVector
()[2] );
285
double
cv[6];
286
cv[0]=pV->
m_Gk
[0][0];cv[1]=pV->
m_Gk
[0][1];cv[2]=pV->
m_Gk
[1][1];
287
cv[3]=pV->
m_Gk
[0][2];cv[4]=pV->
m_Gk
[1][2];cv[5]=pV->
m_Gk
[2][2];
288
pVertex =
new
TrigVertex
(pV->
getParametersVector
()[0],
289
pV->
getParametersVector
()[1],
290
pV->
getParametersVector
()[2],cv,
chi2
,ndof,NULL);
291
}
292
delete
pV;
293
294
return
pVertex;
295
}
296
ATH_CHECK
#define ATH_CHECK
Evaluate an expression and check for errors.
Definition
AthCheckMacros.h:40
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x,...)
Definition
AthMsgStreamMacros.h:43
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x,...)
Definition
AthMsgStreamMacros.h:42
ATH_MSG_INFO
#define ATH_MSG_INFO(x,...)
Definition
AthMsgStreamMacros.h:45
ITrigPrimaryVertexFitter.h
tc
static Double_t tc
Definition
LArPhysWaveHECTool.cxx:38
TrackCollection.h
TrackCollection
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
Definition
TrackCollection.h:19
Track.h
TrigL2Vertex.h
TrigPrimaryVertexFitter.h
TrigPrimaryVertexTrack.h
TrigVertex.h
AthAlgTool::AthAlgTool
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Definition
AthAlgTool.cxx:16
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
Definition
AthCommonDataStore.h:145
DataVector< Trk::Track >::const_iterator
DataModel_detail::const_iterator< DataVector > const_iterator
Definition
DataVector.h:837
DataVector::reserve
void reserve(size_type n)
Attempt to preallocate enough memory for a specified number of elements.
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
DataVector::clear
void clear()
Erase all the elements in the collection.
TrigL2Vertex
Definition
TrigL2Vertex.h:146
TrigL2Vertex::getParametersVector
double * getParametersVector()
returns vector of vertex fit parameters: vertex position + refitted track momenta at-perigee (sic !...
Definition
TrigL2Vertex.cxx:651
TrigL2Vertex::m_Gk
double m_Gk[MAX_SIZE_VERT_COVM][MAX_SIZE_VERT_COVM]
Definition
TrigL2Vertex.h:182
TrigPrimaryVertexFitter::m_xyVariance
double m_xyVariance
Definition
TrigPrimaryVertexFitter.h:25
TrigPrimaryVertexFitter::TrigPrimaryVertexFitter
TrigPrimaryVertexFitter(const std::string &, const std::string &, const IInterface *)
Definition
TrigPrimaryVertexFitter.cxx:31
TrigPrimaryVertexFitter::fit
virtual TrigVertex * fit(const TrackCollection *, TrackCollection &, double z=0.0) const
Definition
TrigPrimaryVertexFitter.cxx:68
TrigPrimaryVertexFitter::m_chi2cut
double m_chi2cut
Definition
TrigPrimaryVertexFitter.h:23
TrigPrimaryVertexFitter::m_chi2cut_loose
double m_chi2cut_loose
Definition
TrigPrimaryVertexFitter.h:23
TrigPrimaryVertexFitter::m_numIter
int m_numIter
Definition
TrigPrimaryVertexFitter.h:22
TrigPrimaryVertexFitter::~TrigPrimaryVertexFitter
virtual ~TrigPrimaryVertexFitter()
Definition
TrigPrimaryVertexFitter.cxx:63
TrigPrimaryVertexFitter::initialize
virtual StatusCode initialize()
Definition
TrigPrimaryVertexFitter.cxx:47
TrigPrimaryVertexFitter::m_zVariance
double m_zVariance
Definition
TrigPrimaryVertexFitter.h:23
TrigPrimaryVertexFitter::m_createTrackLists
bool m_createTrackLists
Definition
TrigPrimaryVertexFitter.h:24
TrigPrimaryVertexFitter::finalize
virtual StatusCode finalize()
Definition
TrigPrimaryVertexFitter.cxx:57
TrigPrimaryVertexFitter::m_maxChi2Increase
double m_maxChi2Increase
Definition
TrigPrimaryVertexFitter.h:23
TrigPrimaryVertexTrack
Definition
TrigPrimaryVertexTrack.h:14
TrigPrimaryVertexTrack::getChi2Contribution
double getChi2Contribution()
chi2-contribution to the vertex fit
Definition
TrigPrimaryVertexTrack.cxx:194
TrigVertex
encapsulates LVL2 vertex parameters (in the global reference frame), covariance matrix,...
Definition
TrigVertex.h:31
Trk::Track
The ATLAS Track class.
Definition
Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition
comparitor.cxx:775
fitFailed
bool fitFailed
Definition
fbtTestToyMC.cxx:117
std::sort
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
Definition
DVL_algorithms.h:554
TrigPrimaryTrackSortPredicate
Definition
TrigPrimaryVertexFitter.cxx:161
TrigPrimaryTrackSortPredicate::operator()
bool operator()(TrigPrimaryVertexTrack *pA, TrigPrimaryVertexTrack *pB)
Definition
TrigPrimaryVertexFitter.cxx:162
Generated on
for ATLAS Offline Software by
1.17.0