ATLAS Offline Software
Loading...
Searching...
No Matches
cfTotCov.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Calculates COVF(21) - symmetric 6x6 covariance matrix
6// for combined (X,Y,Z,Px,Py,Pz) vector after vertex fit
7//
8//-----------------------------------------------------
15#include <cmath>
16
17namespace Trk {
18//
19// Function calculates complete error matrix ADER and derivatives
20// of fitted track parameters with respect to initial ones.
21// It calculates also combined momentum and (VxVyVzPxPyPz) covarinace
22// Complete error matrix is recalculated here via getFullVrtCov,
23// so CPU CONSUMING!!!
24//--------------------------------------------------------------
25
26int afterFit(VKVertex *vk, double *ader, double * dcv, double * ptot, double * VrtMomCov, const VKalVrtControlBase* CONTROL )
27{
28 int i,j;
29 double px,py,pz,pt,invR,cth;
30 double verr[6][6]={{0.}}; //for (i=0; i<6*6; i++) verr[i]=0;
31
32 int NTRK = vk->TrackList.size();
33 int NVar = NTRK*3+3;
34 for (i=1; i<=6; ++i) {
35 for (j=1; j<=NVar ; ++j) dcv[i + j*6 - 7] = 0.;
36 }
37 cfsetdiag( 6, VrtMomCov, 100.);
38 ptot[0] = 0.;
39 ptot[1] = 0.;
40 ptot[2] = 0.;
41
42 double vBx,vBy,vBz,constBF;
43 Trk::vkalMagFld::getMagFld(vk->refIterV[0],vk->refIterV[1],vk->refIterV[2],vBx,vBy,vBz,CONTROL);
44
45 for (i = 1; i <= NTRK; ++i) {
46 VKTrack *trk=vk->TrackList[i-1].get();
47 invR = trk->fitP[2];
48 cth = 1. / tan(trk->fitP[0]);
49 constBF=Trk::vkalMagFld::getEffField(vBx, vBy, vBz, trk->fitP[1], trk->fitP[0]) * Trk::vkalMagFld::getCnvCst();
50 pt = std::abs( constBF / invR);
51 px = pt * cos(trk->fitP[1]);
52 py = pt * sin(trk->fitP[1]);
53 pz = pt * cth;
54 ptot[0] += px;
55 ptot[1] += py;
56 ptot[2] += pz;
57 dcv[ (i*3 + 0)*6 + 5] = -pt * (cth * cth + 1); /* dPz/d(theta) */
58 dcv[ (i*3 + 1)*6 + 3] = -py; /* dPx/d(phi) */
59 dcv[ (i*3 + 1)*6 + 4] = px; /* dPy/d(phi) */
60 dcv[ (i*3 + 2)*6 + 3] = -px / invR; /* dPx/d(rho) */
61 dcv[ (i*3 + 2)*6 + 4] = -py / invR; /* dPy/d(rho) */
62 dcv[ (i*3 + 2)*6 + 5] = -pz / invR; /* dPz/d(rho) */
63 }
64 dcv[0] = 1.;
65 dcv[7] = 1.;
66 dcv[14] = 1.;
67 if(!ader)return 0;
68 int IERR=getFullVrtCov(vk, ader, dcv, verr); if (IERR) return IERR;
69 int ijk = 0;
70 for ( i=0; i<6; ++i) {
71 for (j=0; j<=i; ++j) {
72 VrtMomCov[ijk++] = verr[i][j];
73 }
74 }
75 return 0;
76}
77
78// The same as afterFit(), but instead of fitted track parameters
79// it uses guessed track parameters. ( it's needed for cascade)
80// Complete error matrix is recalculated here via getFullVrtCov,
81// so CPU CONSUMING!!!
82//--------------------------------------------------------------------------------------------------
83int afterFitWithIniPar(VKVertex *vk, double *ader, double * dcv, double * ptot, double * VrtMomCov, const VKalVrtControlBase* CONTROL )
84{
85 int i,j;
86 double px,py,pz,pt,invR,cth;
87 double verr[6][6]={{0.}};
88
89
90 int NTRK = vk->TrackList.size();
91 int NVar = NTRK*3+3;
92 for (i=1; i<=6; ++i) {
93 for (j=1; j<=NVar ; ++j) dcv[i + j*6 - 7] = 0.;
94 }
95 cfsetdiag( 6, VrtMomCov, 10.);
96 ptot[0] = 0.;
97 ptot[1] = 0.;
98 ptot[2] = 0.;
99
100 double vBx,vBy,vBz,constBF;
101 Trk::vkalMagFld::getMagFld(vk->refIterV[0],vk->refIterV[1],vk->refIterV[2],vBx,vBy,vBz,CONTROL);
102
103 for (i = 1; i <= NTRK; ++i) {
104 VKTrack *trk=vk->TrackList[i-1].get();
105 invR = trk->iniP[2];
106 cth = 1. / tan(trk->iniP[0]);
107 constBF=Trk::vkalMagFld::getEffField(vBx, vBy, vBz, trk->fitP[1], trk->fitP[0]) * Trk::vkalMagFld::getCnvCst();
108 pt = std::abs( constBF/invR );
109 px = pt * cos(trk->iniP[1]);
110 py = pt * sin(trk->iniP[1]);
111 pz = pt * cth;
112 ptot[0] += px;
113 ptot[1] += py;
114 ptot[2] += pz;
115 dcv[ (i*3 + 0)*6 + 5] = -pt * (cth * cth + 1); /* dPz/d(theta) */
116 dcv[ (i*3 + 1)*6 + 3] = -py; /* dPx/d(phi) */
117 dcv[ (i*3 + 1)*6 + 4] = px; /* dPy/d(phi) */
118 dcv[ (i*3 + 2)*6 + 3] = -px / invR; /* dPx/d(rho) */
119 dcv[ (i*3 + 2)*6 + 4] = -py / invR; /* dPy/d(rho) */
120 dcv[ (i*3 + 2)*6 + 5] = -pz / invR; /* dPz/d(rho) */
121 }
122 dcv[0] = 1.;
123 dcv[7] = 1.;
124 dcv[14] = 1.;
125 if(!ader)return 0;
126 int IERR=getFullVrtCov(vk, ader, dcv, verr); if (IERR) return IERR;
127 int ijk = 0;
128 for ( i=0; i<6; ++i) {
129 for (j=0; j<=i; ++j) {
130 VrtMomCov[ijk++] = verr[i][j];
131 }
132 }
133 return 0;
134}
135
136} /* End of namespace */
137
138
std::vector< std::unique_ptr< VKTrack > > TrackList
static void getMagFld(const double, const double, const double, double &, double &, double &, const VKalVrtControlBase *)
static double getEffField(double bx, double by, double bz, double phi, double theta)
Definition VKalVrtBMag.h:60
static double getCnvCst()
Definition VKalVrtBMag.h:59
Ensure that the ATLAS eigen extensions are properly loaded.
void cfsetdiag(long int n, double *matr, double value) noexcept
int afterFitWithIniPar(VKVertex *vk, double *ader, double *dcv, double *ptot, double *VrtMomCov, const VKalVrtControlBase *CONTROL)
Definition cfTotCov.cxx:83
@ pz
global momentum (cartesian)
Definition ParamDefs.h:61
@ px
Definition ParamDefs.h:59
@ py
Definition ParamDefs.h:60
int getFullVrtCov(VKVertex *vk, double *ader, const double *dcv, double verr[6][6])
Definition VtCFitE.cxx:25
int afterFit(VKVertex *vk, double *ader, double *dcv, double *ptot, double *VrtMomCov, const VKalVrtControlBase *CONTROL)
Definition cfTotCov.cxx:26