ATLAS Offline Software
Loading...
Searching...
No Matches
VtDeriv.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
12#include <cmath>
13
14namespace Trk {
15
16void vpderiv(bool UseTrackErr, long int Charge, const double *pari0, double *covi, double *vrtref, double *covvrtref,
17 double *drdpar, double *dwgt, double *rv0, VKalVrtControl * FitCONTROL)
18{
19 /* Initialized data */
20
21 double dshft[6] = { 1.e-4, 1.e-4, 1.e-4, 1.e-4, 1.e-4, 1.e-4}; //step for each parameter
22 /* Symmetric version for derivatives calculation*/
23 double DrvCoef[4] = {-2., -1., 1.,2.};
24
25 /* Local variables */
26 double pari[6], covd[15], dcov[3], rvec[50]; /* was [2][6*4+1] */
27 double paro[5];
28 int j, ij, ip, ipp, id=0;
29 double dwgt0[3]={0.,0.,0.};
30 //double deriv[6], dchi2[4*6+1]; //VK for debugging
31 double cs, pp, sn, pt, rho;
32 double covdtr[15], ctg, par[5], cnv[36]; /* was [6][6] */
33
34#define rvec_ref(a_1,a_2) rvec[(a_2)*2 + (a_1) - 1]
35#define drdpar_ref(a_1,a_2) drdpar[(a_2)*2 + (a_1)]
36#define cnv_ref(a_1,a_2) cnv[(a_2)*6 + (a_1) - 7]
37
38/* ---------------------------------------------------------- */
39/* Subroutine for derivative calculations */
40/* Input: */
41/* Charge - charge of track ( +1,0,-1 ) */
42/* PARI0(1:3) - Vertex of particle */
43/* PARI0(4:6) - Momentum of particle */
44/* COVI(21) - symmetric covariance matrix */
45/* BMAG - magnetic field */
46/* UseTrackErr =false Fitted track is assumed errorless */
47/* only vertex error is used */
48/* may be used for constraint */
49/* =true Fitted track error is added */
50/* Output: */
51/* Deriv(6) - Chi2 derivatives for debugging */
52/* drdpar - derivatives */
53/* rv0[2] - track impact vs vertex */
54/* dwgt[3] - track impact covarinance */
55/* ---------------------------------------------------------- */
56 /* Parameter adjustments */
57 drdpar -= 3;
58 --covvrtref;
59
60 /* Function Body */
61/* --------------------- */
62 double constB =FitCONTROL->vk_forcft.localbmag * vkalMagCnvCst ;
63
64 for (ip = 0; ip <= 4*6; ++ip) { // Number of points * Number of parameters
65/* -- Input parameters */
66 pari[0] = pari0[0];
67 pari[1] = pari0[1];
68 pari[2] = pari0[2];
69 pari[3] = pari0[3];
70 pari[4] = pari0[4];
71 pari[5] = pari0[5];
72// ipp - parameter number, id - number of step
73 ipp = ip; while(ipp>6)ipp-=6;
74 if(ip>=1 && ip<=6 ) id=0;
75 if(ip>=7 && ip<=12) id=1;
76 if(ip>=13 && ip<=18) id=2;
77 if(ip>=19 && ip<=24) id=3;
78 if (ip != 0) pari[ipp - 1] *= (dshft[ipp-1]*DrvCoef[id] + 1.);
79/* -- */
80 pt = sqrt(pari[3]*pari[3] + pari[4]*pari[4]);
81 pp = pt*pt + pari[5]*pari[5];
82 cs = pari[3] / pt;
83 sn = pari[4] / pt;
84 ctg = pari[5] / pt;
85 rho = Charge * constB / pt; // Sign of charge coinside with sign of curvature!!!
86/* -- Output parameters */
87 par[0] = 0.;
88 par[1] = 0.;
89 par[2] = acos(pari[5] / sqrt(pp));
90 if(par[2]<1.e-5) par[2]=1.e-5;
91 if(par[2]>M_PI-1.e-5) par[2]=M_PI-1.e-5;
92 par[3] = atan2(pari[4], pari[3]);
93 par[4] = rho;
94 if (Charge == 0) par[4] = constB / pt;
95/* -- */
96 cnv_ref(1, 1) = sn;
97 cnv_ref(2, 1) = -cs;
98 cnv_ref(3, 1) = 0.;
99 cnv_ref(4, 1) = 0.;
100 cnv_ref(5, 1) = 0.;
101 cnv_ref(6, 1) = 0.;
102/* -- */
103 cnv_ref(1, 2) = -cs * ctg;
104 cnv_ref(2, 2) = -sn * ctg;
105 cnv_ref(3, 2) = 1.;
106 cnv_ref(4, 2) = 0.;
107 cnv_ref(5, 2) = 0.;
108 cnv_ref(6, 2) = 0.;
109/* -- */
110 cnv_ref(1, 3) = 0.;
111 cnv_ref(2, 3) = 0.;
112 cnv_ref(3, 3) = 0.;
113 cnv_ref(4, 3) = pari[5] * pari[3] / pp / pt;
114 cnv_ref(5, 3) = pari[5] * pari[4] / pp / pt;
115 cnv_ref(6, 3) = -pt / pp;
116/* -- */
117 cnv_ref(1, 4) = 0.;
118 cnv_ref(2, 4) = 0.;
119 if (Charge)cnv_ref(1, 4) = -cs * rho; // For charged tracks only
120 if (Charge)cnv_ref(2, 4) = -sn * rho; //
121 cnv_ref(3, 4) = 0.;
122 cnv_ref(4, 4) = -pari[4] / (pt * pt);
123 cnv_ref(5, 4) = pari[3] / (pt * pt);
124 cnv_ref(6, 4) = 0.;
125/* -- */
126 cnv_ref(1, 5) = 0.;
127 cnv_ref(2, 5) = 0.;
128 cnv_ref(3, 5) = 0.;
129 cnv_ref(4, 5) = -pari[3] * rho / (pt * pt);
130 cnv_ref(5, 5) = -pari[4] * rho / (pt * pt);
131 if ( Charge == 0) {cnv_ref(4, 5) = -pari[3] * constB / (pt*pt*pt);}
132 if ( Charge == 0) {cnv_ref(5, 5) = -pari[4] * constB / (pt*pt*pt);}
133 cnv_ref(6, 5) = 0.;
134/* -- not needed really but... */
135 cnv_ref(1, 6) = cnv_ref(2, 6) = cnv_ref(3, 6) = cnv_ref(4, 6) = cnv_ref(5, 6) = cnv_ref(6, 6) = 0.;
136
137 tdasatVK(cnv, &covi[0], covd, 5, 6);
138
139/* -- Translation to New Reference Point */
140 Trk::vkalPropagator::Propagate(-999, Charge, par, covd, pari, vrtref, paro, covdtr, FitCONTROL);
141
142
143
144/* -- Now impact significance */
145/* X=paro(1)*sn, Y=-paro(1)*cs */
146 sn = sin(paro[3]);
147 cs = cos(paro[3]);
148/* -- New error version */
149 cnv_ref(1, 1) = -sn;
150 cnv_ref(1, 2) = cs;
151 cnv_ref(1, 3) = 0.;
152 cnv_ref(2, 1) = sn / tan(paro[2]);
153 cnv_ref(2, 2) = cs / tan(paro[2]);
154 cnv_ref(2, 3) = -1.;
155 dcov[0] = 0.;
156 dcov[1] = 0.;
157 dcov[2] = 0.;
158 for (int i = 1; i <= 3; ++i) {
159 for (j = 1; j <= 3; ++j) {
160 ij = i > j ? i : j;
161 ij = ij * (ij - 1) / 2 + ( i < j ? i : j );
162 dcov[0] += cnv_ref(1, i) * cnv_ref(1, j) * covvrtref[ij];
163 dcov[2] += cnv_ref(2, i) * cnv_ref(2, j) * covvrtref[ij];
164 dcov[1] += cnv_ref(1, i) * cnv_ref(2, j) * covvrtref[ij];
165 }
166 }
167/* --------------------------------------------------------------- */
168 if( UseTrackErr ){ // Add track error if needed
169 dcov[0] += covdtr[0];
170 dcov[1] += covdtr[1];
171 dcov[2] += covdtr[2];
172 }
173/*---------------------------------------------------------------- */
174// Weight matrix and chi2 for given shift
175//
176 int jerr=cfdinv(dcov, &dwgt[0], -2); if(jerr){jerr=cfdinv(dcov, &dwgt[0], 2); if(jerr){dwgt[0]=dwgt[2]=1.e6; dwgt[1]=0.;}};
177 //dchi2[ip] = sqrt(fabs(dwgt[0]*paro[0]*paro[0] + 2.*dwgt[1]*paro[0]*paro[1] + dwgt[2]*paro[1]*paro[1]));
178 rvec_ref(1, ip) = paro[0];
179 rvec_ref(2, ip) = paro[1];
180 if (ip == 0) { //Save weight matrix for output
181 dwgt0[0] = dwgt[0];
182 dwgt0[1] = dwgt[1];
183 dwgt0[2] = dwgt[2];
184 }
185 }
186/* ---------------------------------------------------------------- */
187// Now calculate derivatives themselves
188//
189 for (int i = 1; i <= 6; ++i) {
190 //deriv[i-1] = (dchi2[i] -8.*dchi2[i+6] +8.*dchi2[i+12]-dchi2[i+18] ) / (12.*dshft[i-1]*pari0[i-1]);
191 drdpar_ref(1,i) = (rvec_ref(1,i) -8.*rvec_ref(1,i+6) +8.*rvec_ref(1,i+12) -rvec_ref(1,i+18)) / (12.*dshft[i-1]*pari0[i-1]);
192 drdpar_ref(2,i) = (rvec_ref(2,i) -8.*rvec_ref(2,i+6) +8.*rvec_ref(2,i+12) -rvec_ref(2,i+18)) / (12.*dshft[i-1]*pari0[i-1]);
193 }
194//std::cout<<deriv[0]<<", "<<deriv[1]<<", "<<deriv[2]<<", "<<deriv[3]<<", "<<deriv[4]<<", "<<deriv[5]<<'\n';
195//std::cout<<drdpar_ref(1, 1)<<", "<<drdpar_ref(1, 2)<<", "<<drdpar_ref(1, 3)<<", "<<drdpar_ref(1, 4)<<
196// ", "<<drdpar_ref(1, 5)<<", "<<drdpar_ref(1, 6)<<'\n';
197//std::cout<<drdpar_ref(2, 1)<<", "<<drdpar_ref(2, 2)<<", "<<drdpar_ref(2, 3)<<", "<<drdpar_ref(1, 4)<<
198// ", "<<drdpar_ref(2, 5)<<", "<<drdpar_ref(2, 6)<<'\n';
199//std::cout<<"---------------------"<<'\n';
200//
201// Output parameters
202//
203
204 rv0[0] = rvec_ref(1, 0);
205 rv0[1] = rvec_ref(2, 0);
206 dwgt[0] = dwgt0[0];
207 dwgt[1] = dwgt0[1];
208 dwgt[2] = dwgt0[2];
209
210//std::cout<<" VpDerivR,Z="<<rv0[0]<<", "<<rv0[1]<<'\n';
211//std::cout<<" Ref="<<vrtref[0]<<", "<<vrtref[1]<<", "<<vrtref[2]<<'\n';
212#undef cnv_ref
213#undef drdpar_ref
214#undef rvec_ref
215}
216} /* End of namespace */
#define M_PI
#define vkalMagCnvCst
Definition CommonPars.h:23
#define rvec_ref(a_1, a_2)
#define drdpar_ref(a_1, a_2)
#define cnv_ref(a_1, a_2)
static void Propagate(long int TrkID, long int Charge, double *ParOld, double *CovOld, double *RefStart, double *RefEnd, double *ParNew, double *CovNew, VKalVrtControlBase *FitControl=0)
Ensure that the ATLAS eigen extensions are properly loaded.
void vpderiv(bool UseTrackErr, long int Charge, const double *pari0, double *covi, double *vrtref, double *covvrtref, double *drdpar, double *dwgt, double *rv0, VKalVrtControl *FitCONTROL)
Definition VtDeriv.cxx:16
int cfdinv(double *cov, double *wgt, long int NI)
void tdasatVK(const double *Der, const double *CovI, double *CovF, long int M, long int N)
double localbmag
Definition ForCFT.h:29