ATLAS Offline Software
Loading...
Searching...
No Matches
TrigPrimaryVertexTrack.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
8#include "TrkTrack/Track.h"
9
10
12{
14 m_pTrkTrack=pT;m_dChi2=-100.0;
15
16 const Trk::Perigee* pP= pT->perigeeParameters();
17
18 if(pP!=NULL) {
19 m_u[0]=pP->parameters()[Trk::d0];
20 m_u[1]=pP->parameters()[Trk::z0];
21 m_q[0]=pP->parameters()[Trk::phi0];
22 m_q[1]=pP->parameters()[Trk::theta];
23
24 const double ptC=1000.0*pP->parameters()[Trk::qOverP];
25 const double inv_ptC = 1. / ptC;
26
27 m_q[2]=sin(pP->parameters()[Trk::theta])*inv_ptC;
28
29 const AmgSymMatrix(5)& TC= (*pP->covariance());
30
31 const double a=cos(pP->parameters()[Trk::theta])*inv_ptC;
32 const double b=-sin(pP->parameters()[Trk::theta])/(pP->parameters()[Trk::qOverP]*ptC);
33
34
35 const double Ck[5][5] = {{TC(0,0), TC(1,0), TC(2,0), TC(3,0), a*TC(3,0) + b*TC(4,0)},
36 {TC(1,0), TC(1,1), TC(2,1), TC(3,1), a*TC(3,1) + b*TC(4,1)},
37 {TC(2,0), TC(2,1), TC(2,2), TC(3,2), a*TC(3,2) + b*TC(4,2)},
38 {TC(3,0), TC(3,1), TC(3,2), TC(3,3), a*TC(3,3) + b*TC(4,3)},
39 {a*TC(3,0) + b*TC(4,0), a*TC(3,1) + b*TC(4,1), a*TC(3,2) + b*TC(4,2), a*TC(3,3) + b*TC(4,3), a*a*TC(3,3) + 2*a*b*TC(4,3) + b*b*TC(4,4)}};
40
41 for(int i=0;i<2;i++) for(int j=0;j<2;j++) m_Vuu[i][j]=Ck[i][j];
42 for(int i=0;i<3;i++) for(int j=0;j<3;j++) m_Vqq[i][j]=Ck[i+2][j+2];
43 for(int i=0;i<2;i++) for(int j=0;j<3;j++) m_Vuq[i][j]=Ck[i][j+2];
44
45 m_Perigee[0]=m_u[0];m_Perigee[1]=m_u[1];m_Perigee[2]=m_q[0];m_Perigee[3]=m_q[1];m_Perigee[4]=m_q[2];
46 }
47}
48
53
55{
56 m_active=false;
57}
58
63
68
73
74
79
81{
82 m_index=i;
83}
84
86{
87 return m_index;
88}
89
91{
92 return &m_Perigee[0];
93}
94
96{
97 return m_PerigeeCovariance[i][j];
98}
99
101{
102 const double C=0.02997;
103 const double B=20.84;
104
105 double Sk[2][2],detr,chi2;
106 double AC[2][3],BV[2][3],h[2];
107 int i,j,k;
108 double psi,sinPsi,xv,yv,zv,
109 cosPhi0,sinPhi0,ctt,sint,phi0,theta0,P0;
110 const double alpha = C*B*1e-3;
111 const double inv_alpha = 1. / alpha;
112
113 xv=pV->getParametersVector()[0];
114 yv=pV->getParametersVector()[1];
115 zv=pV->getParametersVector()[2];
116
117 phi0=m_q[0];
118 theta0=m_q[1];
119 P0=m_q[2];
120
121 cosPhi0=cos(phi0);sinPhi0=sin(phi0);
122 sinPsi=-alpha*(xv*cosPhi0+yv*sinPhi0)/P0;
123 if(fabs(sinPsi)>1.0) return -999.9;
124 const double cosPsi=sqrt(1.0-sinPsi*sinPsi);
125 const double inv_cosPsi = 1. / cosPsi;
126 psi=asin(sinPsi);
127 sint=sin(theta0);
128 ctt=cos(theta0)/sint;
129
130 m_A[0][0]=-sin(phi0+psi)*inv_cosPsi;
131 m_A[0][1]= cos(phi0+psi)*inv_cosPsi;
132 m_A[0][2]=0.0;
133
134 m_A[1][0]=-ctt*cosPhi0*inv_cosPsi;
135 m_A[1][1]=-ctt*sinPhi0*inv_cosPsi;
136 m_A[1][2]=1.0;
137
138 m_B[0][0]=-xv*m_A[0][1]+yv*m_A[0][0];
139 m_B[0][1]=0.0;
140 m_B[0][2]=(1.0-inv_cosPsi)*inv_alpha;
141
142 m_B[1][0]=-xv*m_A[1][1]+yv*m_A[1][0];
143 m_B[1][1]=-P0*psi/(alpha*sint*sint);
144 m_B[1][2]=ctt*(psi-sinPsi*inv_cosPsi)*inv_alpha;
145
146 h[0]=yv*cosPhi0-xv*sinPhi0+P0*(1-cosPsi)*inv_alpha;
147 h[1]=zv+P0*ctt*psi*inv_alpha;
148
149 m_resid[0]=m_u[0]-h[0];
150 m_resid[1]=m_u[1]-h[1];
151
152 for(i=0;i<2;i++) for(j=0;j<2;j++) Sk[i][j]=m_Vuu[i][j];
153 for(i=0;i<2;i++) for(j=0;j<3;j++)
154 {
155 AC[i][j]=0.0;
156 for(k=0;k<3;k++) AC[i][j]+=m_A[i][k]*pV->m_Gk[k][j];
157 }
158 for(i=0;i<2;i++) for(j=0;j<2;j++)
159 {
160 for(k=0;k<3;k++) Sk[i][j]+=AC[i][k]*m_A[j][k];
161 }
162 for(i=0;i<2;i++)
163 for(j=0;j<3;j++)
164 {
165 BV[i][j]=0.0;
166 for(k=0;k<3;k++) BV[i][j]+=m_B[i][k]*m_Vqq[k][j];
167 }
168 for(i=0;i<2;i++)
169 for(j=0;j<2;j++)
170 {
171 for(k=0;k<3;k++) Sk[i][j]+=BV[i][k]*m_B[j][k];
172 }
173 Sk[0][0]-=2.0*(m_Vuq[0][0]*m_B[0][0]+m_Vuq[0][1]*m_B[0][1]+m_Vuq[0][2]*m_B[0][2]);
174 Sk[1][1]-=2.0*(m_Vuq[1][0]*m_B[1][0]+m_Vuq[1][1]*m_B[1][1]+m_Vuq[1][2]*m_B[1][2]);
175 Sk[0][1]-=m_Vuq[1][0]*m_B[0][0]+m_Vuq[1][1]*m_B[0][1]+m_Vuq[1][2]*m_B[0][2]+
176 m_Vuq[0][0]*m_B[1][0]+m_Vuq[0][1]*m_B[1][1]+m_Vuq[0][2]*m_B[1][2];
177 Sk[1][0]=Sk[0][1];
178
179 detr=1.0/(Sk[0][0]*Sk[1][1]-Sk[0][1]*Sk[1][0]);
180 m_V[0][0]=Sk[1][1]*detr;
181 m_V[1][1]=Sk[0][0]*detr;
182 m_V[0][1]=m_V[1][0]=-Sk[0][1]*detr;
183
184 chi2=m_V[0][0]*m_resid[0]*m_resid[0]+m_V[1][1]*m_resid[1]*m_resid[1]+
185 2.0*m_V[0][1]*m_resid[1]*m_resid[0];
186
187 for(i=0;i<2;i++)
188 for(j=0;j<3;j++) m_D[i][j]=AC[i][j];
189
191 return chi2;
192}
193
198
200{
201 int i,j,k;
202
203 double K[2][3];
204
205 for(i=0;i<2;i++)
206 {
207 for(j=0;j<3;j++)
208 {
209 K[i][j]=0.0;
210 for(k=0;k<2;k++) K[i][j]+=m_D[k][j]*m_V[k][i];
211 }
212 }
213 for(i=0;i<3;i++)
214 {
215 pV->getParametersVector()[i]+=K[0][i]*m_resid[0]+K[1][i]*m_resid[1];
216 for(j=i;j<3;j++)
217 {
218 pV->m_Gk[i][j]-=K[0][i]*m_D[0][j]+K[1][i]*m_D[1][j];
219 pV->m_Gk[j][i]=pV->m_Gk[i][j];
220 }
221 }
222}
223
224MsgStream& TrigPrimaryVertexTrack::report( MsgStream& out ) const
225{
226 int i;
227
228 out<<"Primary track "<<m_index<<endmsg;
229 for(i=0;i<2;i++)
230 {
231 out<<" u"<<i<<" = "<<m_u[i]<<" "<<m_Vuu[i][0]<<" "<<m_Vuu[i][1]<<endmsg;
232 }
233 for(i=0;i<3;i++)
234 {
235 out<<" q"<<i<<" = "<<m_q[i]<<" "<<m_Vqq[i][0]<<" "<<m_Vqq[i][1]<<" "<<m_Vqq[i][2]<<endmsg;
236 }
237 return out;
238}
239
240
241
#define endmsg
#define AmgSymMatrix(dim)
static Double_t a
Header file for AthHistogramAlgorithm.
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]
virtual void updateVertex(TrigL2Vertex *)
implementation of abstract method from the base class
void setIndex(int)
to be used by TrigVertexingTool
void activate()
sets m_isActive to true
TrigPrimaryVertexTrack(const Trk::Track *)
constructor for EF (offline) tracks
int getIndex() const
to be used by TrigVertexingTool
virtual MsgStream & report(MsgStream &) const
void mask()
sets m_isActive to false
double PerigeeCovariance(int, int) const
covariance of track parameters at the perigee
double getChi2Contribution()
chi2-contribution to the vertex fit
const Trk::Track * getTrkTrack()
getter for EF (offline) tracks
const double * Perigee() const
track parameters at the perigee
int getTrackType()
0: L2 track, 1: EF(offline) track
virtual double getChi2Distance(TrigL2Vertex *)
implementation of abstract method from the base class
bool isActive()
if true this track will be used in the vertex fit otherwise it will be masked
double m_D[2][MAX_SIZE_VERT_COVM]
double chi2(TH1 *h0, TH1 *h1)
struct color C
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ phi0
Definition ParamDefs.h:65
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64