62 const double a_cosphi0 = -sin(a_phi0);
63 const double a_sinphi0 = cos(a_phi0);
73#ifdef TrkDistance_DEBUG
74 ATH_MSG_DEBUG(
"a_x0 " << a_x0 <<
" a_y0 " << a_y0 <<
" a_z0 " << a_z0 );
83 return "fieldCondObj is nullptr";
88 double magnFieldVect[3];
93 fieldCache.
getField(posXYZ,magnFieldVect);
97 const double a_Bz=magnFieldVect[2]*299.792;
100 const double a_Rt = getRadiusOfCurvature(firsttrack.
getPerigee(),a_Bz);
103#ifdef TrkDistance_DEBUG
104 ATH_MSG_DEBUG(
"a_Rt" << a_Rt <<
" a_cotantheta " << a_cotantheta );
105 ATH_MSG_DEBUG(
"Magnetic field at perigee is " << a_Bz <<
"GeV/mm " );
110 const double b_cosphi0 = -sin(b_phi0);
111 const double b_sinphi0 = cos(b_phi0);
121#ifdef TrkDistance_DEBUG
122 ATH_MSG_DEBUG(
"b_x0 " << b_x0 <<
" b_y0 " << b_y0 <<
" b_z0 " << b_z0 );
130 fieldCache.
getField(posXYZ,magnFieldVect);
133 const double b_Bz = magnFieldVect[2]*299.792;
137 const double b_Rt = getRadiusOfCurvature(secondtrack.
getPerigee(),b_Bz);
140#ifdef TrkDistance_DEBUG
141 ATH_MSG_DEBUG(
"b_Rt" << b_Rt <<
" b_cotantheta " << b_cotantheta );
142 ATH_MSG_DEBUG(
"Magnetic field at perigee is " << b_Bz <<
" GeV/mm " );
147 const double ab_Dx0 = a_x0-b_x0-a_Rt*a_cosphi0+b_Rt*b_cosphi0;
148 const double ab_Dy0 = a_y0-b_y0-a_Rt*a_sinphi0+b_Rt*b_sinphi0;
149 const double ab_Dz0 = a_z0-b_z0+a_Rt*a_cotantheta*a_phi0-b_Rt*b_cotantheta*b_phi0;
151#ifdef TrkDistance_DEBUG
152 ATH_MSG_DEBUG(
"ab_Dx0 " << ab_Dx0 <<
" ab_Dy0 " << ab_Dy0 <<
" ab_Dz0 " << ab_Dz0 );
164 double a_cosphi = -sin(a_phi);
165 double a_sinphi = cos(a_phi);
166 double b_cosphi = -sin(b_phi);
167 double b_sinphi = cos(b_phi);
170#ifdef TrkDistance_DEBUG
171 ATH_MSG_DEBUG(
"Beginning phi is a_phi: " << a_phi <<
" b_phi " << b_phi );
182#ifdef TrkDistance_DEBUG
184 ATH_MSG_DEBUG(
"actual value of a_phi: " << a_phi <<
" of b_phi " << b_phi );
192#ifdef TrkDistance_DEBUG
201 ATH_MSG_DEBUG(
"real Dx0 " << ab_Dx0+a_Rt*a_cosphi-b_Rt*b_cosphi );
202 ATH_MSG_DEBUG(
"real Dy0 " << ab_Dy0+a_Rt*a_sinphi-b_Rt*b_sinphi );
206 const double d1da_phi =
207 (ab_Dx0-b_Rt*b_cosphi)*(-a_Rt*a_sinphi)+
208 (ab_Dy0-b_Rt*b_sinphi)*a_cosphi*a_Rt+
209 (ab_Dz0-a_Rt*a_cotantheta*a_phi+b_Rt*b_cotantheta*b_phi)*(-a_Rt*a_cotantheta);
213 const double d1db_phi =
214 (ab_Dx0+a_Rt*a_cosphi)*b_Rt*b_sinphi-
215 (ab_Dy0+a_Rt*a_sinphi)*b_cosphi*b_Rt+
216 (ab_Dz0-a_Rt*a_cotantheta*a_phi+b_Rt*b_cotantheta*b_phi)*(+b_Rt*b_cotantheta);
220 const double d2da_phi2 =
221 (ab_Dx0-b_Rt*b_cosphi)*(-a_Rt*a_cosphi)+
222 (ab_Dy0-b_Rt*b_sinphi)*(-a_Rt*a_sinphi)+
223 +a_Rt*a_Rt*(a_cotantheta*a_cotantheta);
225 const double d2db_phi2 =
226 (ab_Dx0+a_Rt*a_cosphi)*(+b_Rt*b_cosphi)+
227 (ab_Dy0+a_Rt*a_sinphi)*(+b_Rt*b_sinphi)+
228 +b_Rt*b_Rt*(b_cotantheta*b_cotantheta);
231 const double d2da_phib_phi = -a_Rt*b_Rt*(a_sinphi*b_sinphi+a_cosphi*b_cosphi+a_cotantheta*b_cotantheta);
235 const double det = d2da_phi2*d2db_phi2-d2da_phib_phi*d2da_phib_phi;
238#ifdef TrkDistance_DEBUG
239 ATH_MSG_DEBUG(
"d1da_phi " << d1da_phi <<
" d1db_phi " << d1db_phi <<
" d2da_phi2 " << d2da_phi2 <<
" d2db_phi2 " << d2db_phi2
240 <<
" d2da_phib_phi " << d2da_phib_phi <<
" det " << det );
247 return "Hessian is negative";
249 if (det>0&&d2da_phi2<0) {
250 ATH_MSG_DEBUG(
"Hessian indicates a maximum: derivative will be zero but result incorrect" );
251 return "Maximum point found";
255 return "Hessian is zero";
258 const double deltaa_phi = -(d2db_phi2*d1da_phi-d2da_phib_phi*d1db_phi)/det;
259 const double deltab_phi = -(-d2da_phib_phi*d1da_phi+d2da_phi2*d1db_phi)/det;
261#ifdef TrkDistance_DEBUG
271 a_cosphi = -sin(a_phi);
272 a_sinphi = cos(a_phi);
273 b_cosphi = -sin(b_phi);
274 b_sinphi = cos(b_phi);
276 if (std::sqrt(std::pow(deltaa_phi,2)+std::pow(deltab_phi,2))<
m_precision ||
282 return "Could not find minimum distance: max loops number reached";
287 a_y0+a_Rt*(a_sinphi-a_sinphi0),
288 a_z0-a_Rt*(a_phi-a_phi0)*a_cotantheta),
290 b_y0+b_Rt*(b_sinphi-b_sinphi0),
291 b_z0-b_Rt*(b_phi-b_phi0)*b_cotantheta));
void getField(const double *ATH_RESTRICT xyz, double *ATH_RESTRICT bxyz, double *ATH_RESTRICT deriv=nullptr)
get B field value at given position xyz[3] is in mm, bxyz[3] is in kT if deriv[9] is given,...