53 if (!trackPars)
return nullptr;
65 const double extrapolationDirection = gMomentum.dot( gDirection);
72 Gaudi::Hive::currentContext(),
76 if (
dynamic_cast<const Trk::Perigee*
>(parsAtVertex)==
nullptr ||
77 parsAtVertex->covariance()==
nullptr ) {
78 ATH_MSG_INFO (
"Could not extrapolate Perigee to vertex pos: x " << lp.x() <<
" y " <<
79 lp.y() <<
" z " << lp.z() <<
". Normal if outside ID acceptance ");
81 if (
dynamic_cast<const Trk::Perigee*
>(trackPars) && trackPars->covariance()) {
82 if (parsAtVertex)
delete parsAtVertex;
83 parsAtVertex = trackPars->
clone();
85 delete parsAtVertex;
return nullptr;
89 if (parsAtVertex && parsAtVertex->covariance() && parsAtVertex->covariance()->determinant()<=0)
91 ATH_MSG_DEBUG (
"The track covariance matrix det after extrapolation is: " << parsAtVertex->covariance()->determinant() <<
92 " --> Using non extrapolated track parameters");
94 parsAtVertex=trackPars->
clone();
101 AmgVector(5) param = parsAtVertex->parameters();
106 double sin_phi_v = sin(phi_v);
107 double cos_phi_v = cos(phi_v);
111 double sin_th = sin(th);
112 double tan_th = tan(th);
116 int sgn_h = (q_ov_p<0.)? -1:1;
132 fieldCache.
getField(expPoint.data(),mField);
134 double B_z=mField[2]*299.792;
141 if(mField[2] == 0. || fabs(q_ov_p) <= 1e-15) rho = 1e+15 ;
142 else rho = sin_th / (q_ov_p * B_z);
145 double X = expPoint(0) - lp.x() + rho*sin_phi_v;
146 double Y = expPoint(1) - lp.y() - rho*cos_phi_v;
147 double SS = (X * X + Y * Y);
152 AmgVector(5) parAtExpansionPoint; parAtExpansionPoint.setZero();
153 parAtExpansionPoint[0] = rho - sgn_h * S;
157 int sgnY = (Y<0)? -1:1;
158 int sgnX = (X<0)? -1:1;
159 static constexpr double pi = std::numbers::pi_v<double>;
161 if(fabs(X)>fabs(Y)) phiAtEp = sgn_h*sgnX* acos(-sgn_h * Y / S);
164 phiAtEp = asin(sgn_h * X / S);
165 if( (sgn_h * sgnY)> 0) phiAtEp = sgn_h * sgnX *
pi - phiAtEp;
168 parAtExpansionPoint[2] = phiAtEp;
169 parAtExpansionPoint[1] = expPoint(2) - lp.z() + rho*(phi_v - parAtExpansionPoint[2])/tan_th;
170 parAtExpansionPoint[3] = th;
171 parAtExpansionPoint[4] = q_ov_p;
176 AmgMatrix(5,3) positionJacobian; positionJacobian.setZero();
179 positionJacobian(0,0) = -sgn_h * X / S;
180 positionJacobian(0,1) = -sgn_h * Y / S;
183 positionJacobian(1,0) = rho * Y / (tan_th * SS);
184 positionJacobian(1,1) = -rho * X / (tan_th * SS);
185 positionJacobian(1,2) = 1.;
188 positionJacobian(2,0) = -Y / SS;
189 positionJacobian(2,1) = X / SS;
193 AmgMatrix(5,3) momentumJacobian; momentumJacobian.setZero();
194 double R = X*cos_phi_v + Y * sin_phi_v;
195 double Q = X*sin_phi_v - Y * cos_phi_v;
196 double d_phi = parAtExpansionPoint[2] - phi_v;
199 momentumJacobian(0,0) = -sgn_h * rho * R / S ;
201 double qOvS_red = 1 - sgn_h * Q / S;
202 momentumJacobian(0,1) = qOvS_red * rho / tan_th;
203 momentumJacobian(0,2) = - qOvS_red * rho / q_ov_p;
206 momentumJacobian(1,0) = (1 - rho*Q/SS )*rho/tan_th;
207 momentumJacobian(1,1) = (d_phi + rho * R / (SS * tan_th * tan_th) ) * rho;
208 momentumJacobian(1,2) = (d_phi - rho * R /SS ) * rho / (q_ov_p*tan_th);
211 momentumJacobian(2,0) = rho * Q / SS;
212 momentumJacobian(2,1) = -rho * R / (SS*tan_th);
213 momentumJacobian(2,2) = rho * R / (q_ov_p*SS);
216 momentumJacobian(3,1) = 1.;
217 momentumJacobian(4,2) = 1.;
220 AmgVector(5) constantTerm = parAtExpansionPoint - positionJacobian*expPoint - momentumJacobian*expMomentum;
224 *parsAtVertex->covariance(),
241 if (!neutralPars)
return nullptr;
259 parsAtVertex->covariance()==
nullptr ) {
260 ATH_MSG_INFO (
"Could not extrapolate Perigee to vertex pos: x " << lp.x() <<
" y " <<
261 lp.y() <<
" z " << lp.z() <<
". Should not happen. ");
264 if (parsAtVertex)
delete parsAtVertex;
265 parsAtVertex = neutralPars->
clone();
267 delete parsAtVertex;
return nullptr;
272 AmgVector(5) param = parsAtVertex->parameters();
276 double sin_phi_v = sin(phi_v);
277 double cos_phi_v = cos(phi_v);
279 double tan_th = tan(th);
284 double X = expPoint(0) - lp.x();
285 double Y = expPoint(1) - lp.y();
287 AmgVector(5) parAtExpansionPoint; parAtExpansionPoint.setZero();
288 parAtExpansionPoint[0] = Y*cos_phi_v-X*sin_phi_v;
293 double phiAtEp=phi_v;
294 parAtExpansionPoint[2] = phiAtEp;
295 parAtExpansionPoint[1] = expPoint[2] - lp.z() - 1./tan_th*(X*cos_phi_v+Y*sin_phi_v);
296 parAtExpansionPoint[3] = th;
297 parAtExpansionPoint[4] = q_ov_p;
300 AmgMatrix(5,3) positionJacobian; positionJacobian.setZero();
303 positionJacobian(0,0) = -sin_phi_v;
304 positionJacobian(0,1) = +cos_phi_v;
307 positionJacobian(1,0) = -cos_phi_v/tan_th;
308 positionJacobian(1,1) = -sin_phi_v/tan_th;
309 positionJacobian(1,2) = 1.;
314 AmgMatrix(5,3) momentumJacobian; momentumJacobian.setZero();
315 momentumJacobian(2,0) = 1.;
316 momentumJacobian(3,1) = 1.;
317 momentumJacobian(4,2) = 1.;
320 AmgVector(5) constantTerm = parAtExpansionPoint - positionJacobian*expPoint - momentumJacobian*expMomentum;
324 *parsAtVertex->covariance(),