ATLAS Offline Software
Loading...
Searching...
No Matches
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
22
23#include "TrkTrack/Track.h"
25
29
30
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
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
58{
59 ATH_CHECK( AthAlgTool::finalize() );
60 return StatusCode::SUCCESS;
61}
62
67
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 {
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));
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];
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
167
168TrigVertex* 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 {
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));
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
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
static Double_t tc
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
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)
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:837
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.
void clear()
Erase all the elements in the collection.
double * getParametersVector()
returns vector of vertex fit parameters: vertex position + refitted track momenta at-perigee (sic !...
double m_Gk[MAX_SIZE_VERT_COVM][MAX_SIZE_VERT_COVM]
TrigPrimaryVertexFitter(const std::string &, const std::string &, const IInterface *)
virtual TrigVertex * fit(const TrackCollection *, TrackCollection &, double z=0.0) const
double getChi2Contribution()
chi2-contribution to the vertex fit
encapsulates LVL2 vertex parameters (in the global reference frame), covariance matrix,...
Definition TrigVertex.h:31
double chi2(TH1 *h0, TH1 *h1)
bool fitFailed
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
bool operator()(TrigPrimaryVertexTrack *pA, TrigPrimaryVertexTrack *pB)