ATLAS Offline Software
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 //-----------------------------------------------------
11 #include "TrkVKalVrtCore/VtCFitE.h"
15 #include <cmath>
16 
17 namespace 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 
26 int 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 //--------------------------------------------------------------------------------------------------
83 int 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 
CommonPars.h
Trk::py
@ py
Definition: ParamDefs.h:60
test_pyathena.pt
pt
Definition: test_pyathena.py:11
Trk::VKVertex::refIterV
double refIterV[3]
Definition: TrkVKalVrtCoreBase.h:146
Trk::VKTrack
Definition: TrkVKalVrtCoreBase.h:64
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
Trk::pz
@ pz
global momentum (cartesian)
Definition: ParamDefs.h:61
VKalVrtBMag.h
cfTotCov.h
Trk::VKTrack::fitP
double fitP[3]
Definition: TrkVKalVrtCoreBase.h:76
TrkVKalVrtCoreBase.h
Trk::VKVertex::TrackList
std::vector< std::unique_ptr< VKTrack > > TrackList
Definition: TrkVKalVrtCoreBase.h:167
Trk::vkalMagFld::getCnvCst
static double getCnvCst()
Definition: VKalVrtBMag.h:59
Trk::afterFit
int afterFit(VKVertex *vk, double *ader, double *dcv, double *ptot, double *VrtMomCov, const VKalVrtControlBase *CONTROL)
Definition: cfTotCov.cxx:26
Trk::getFullVrtCov
int getFullVrtCov(VKVertex *vk, double *ader, const double *dcv, double verr[6][6])
Definition: VtCFitE.cxx:25
lumiFormat.i
int i
Definition: lumiFormat.py:85
Trk::px
@ px
Definition: ParamDefs.h:59
Trk::vkalMagFld::getMagFld
static void getMagFld(const double, const double, const double, double &, double &, double &, const VKalVrtControlBase *)
Definition: VKalVrtBMag.cxx:24
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
Trk
Ensure that the ATLAS eigen extensions are properly loaded.
Definition: FakeTrackBuilder.h:9
Trk::vkalMagFld::getEffField
static double getEffField(double bx, double by, double bz, double phi, double theta)
Definition: VKalVrtBMag.h:60
Trk::VKVertex
Definition: TrkVKalVrtCoreBase.h:128
VtCFitE.h
Trk::VKTrack::iniP
double iniP[3]
Definition: TrkVKalVrtCoreBase.h:83
Trk::VKalVrtControlBase
Definition: TrkVKalVrtCore.h:26
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
Utilities.h
Trk::afterFitWithIniPar
int afterFitWithIniPar(VKVertex *vk, double *ader, double *dcv, double *ptot, double *VrtMomCov, const VKalVrtControlBase *CONTROL)
Definition: cfTotCov.cxx:83
Trk::cfsetdiag
void cfsetdiag(long int n, double *matr, double value) noexcept
Definition: Tracking/TrkVertexFitter/TrkVKalVrtCore/src/Utilities.cxx:236