22 declareInterface<ITrackToVertexIPEstimator>(
this);
34 return StatusCode::FAILURE;
40 return StatusCode::FAILURE;
47 return StatusCode::FAILURE;
50 return StatusCode::SUCCESS;
58 return estimate(&(
track->perigeeParameters()),&(
track->perigeeParameters()),vtx,doRemoval);
60 ATH_MSG_INFO(
"Empty TrackParticle or Vertex pointer passed. Returning zero " );
71 ATH_MSG_INFO(
"Empty TrackParticle or Vertex pointer passed. Returning zero " );
84 ATH_MSG_INFO(
"Empty TrackParticle or Vertex pointer passed. Returning zero " );
95 ATH_MSG_WARNING(
"Vertex is zero pointer. Will not estimate IP of track.");
103 if (newVertex ==
nullptr) {
104 ATH_MSG_WARNING(
"Unbiasing of vertex failed. Will not estimate IP of track.");
109 std::unique_ptr<ImpactParametersAndSigma> IPandSigma=
calculate(newtrack,*newVertex);
133 ->extrapolate(Gaudi::Hive::currentContext(), *
track, perigeeSurface)
135 if (extrapolatedParameters && extrapolatedParameters->covariance()) {
138 const AmgVector(5) &
par = extrapolatedParameters->parameters();
144 AmgSymMatrix(2) vrtXYCov = vtx.covariancePosition().block<2,2>(0,0);
146 const AmgSymMatrix(5) & perigeeCov = *(extrapolatedParameters->covariance());
153 auto newIPandSigma=std::make_unique<ImpactParametersAndSigma>();
154 newIPandSigma->IPd0=
d0;
155 double d0_PVcontrib=d0JacXY.transpose()*(vrtXYCov*d0JacXY);
158 newIPandSigma->sigmad0=sqrt(d0_PVcontrib+perigeeCov(
Trk::d0,
Trk::d0));
159 newIPandSigma->PVsigmad0=sqrt(d0_PVcontrib);
163 msg(MSG::WARNING) <<
" The contribution to d0_err: " << d0_PVcontrib <<
" from PV is negative: critical error in PV error matrix! Removing contribution from PV ... " <<
endmsg;
165 newIPandSigma->PVsigmad0=0;
174 double vrtZZCov = vtx.covariancePosition()(
Trk::z,
Trk::z);
180 newIPandSigma->sigmaz0SinTheta=
181 sqrt(IPz0JacZ0Theta.transpose()*(covPerigeeZ0Theta*IPz0JacZ0Theta)+
sin(
theta)*vrtZZCov*
sin(
theta));
183 newIPandSigma->IPz0 =
z0;
184 newIPandSigma->sigmaz0 = std::sqrt( vrtZZCov + perigeeCov(
Trk::z0,
Trk::z0) );
185 newIPandSigma->PVsigmaz0 = std::sqrt( vrtZZCov );
189 ATH_MSG_WARNING(
" The contribution to z0_err: " << vrtZZCov <<
" from PV is negative: critical error in PV error matrix! Removing contribution from PV ... ");
191 double temp = (IPz0JacZ0Theta.transpose()*(covPerigeeZ0Theta*IPz0JacZ0Theta));
192 newIPandSigma->sigmaz0SinTheta=sqrt(
temp);
193 newIPandSigma->PVsigmaz0SinTheta=0;
195 newIPandSigma->IPz0 =
z0;
196 newIPandSigma->sigmaz0 = std::sqrt( perigeeCov(
Trk::z0,
Trk::z0) );
197 newIPandSigma->PVsigmaz0 = 0;
201 delete extrapolatedParameters;
202 return newIPandSigma;
204 ATH_MSG_DEBUG (
"Cannot extrapolate the trajectory state. Returning null. ");
215 const CLHEP::Hep3Vector & jetMomentum,
218 Amg::Vector3D eigenJetMomentum(jetMomentum.x(), jetMomentum.y(), jetMomentum.z());
229 std::unique_ptr<const Trk::TrackParameters> extrapolatedParameters =
231 Gaudi::Hive::currentContext(),
track, perigeeSurface);
233 if (!extrapolatedParameters)
return 0.;
239 double sign=(jetMomentum.cross(trackMom)).
dot(trackMom.cross(primaryPos-trackPos));
241 return sign>=0.?1.:-1;
247 const CLHEP::Hep3Vector & jetMomentum,
250 Amg::Vector3D eigenJetMomentum(jetMomentum.x(), jetMomentum.y(), jetMomentum.z());
261 std::unique_ptr<const Trk::TrackParameters> extrapolatedParameters =
263 Gaudi::Hive::currentContext(),
track, perigeeSurface);
265 if (!extrapolatedParameters)
return 0.;
267 double trackD0 = extrapolatedParameters->parameters()[
Trk::d0];
269 double vs = sinf( atan2(jetMomentum.y(),jetMomentum.x()) -
trackPhi )*trackD0;
271 return (vs>=0. ? 1. : -1.);
278 const CLHEP::Hep3Vector & jetMomentum,
281 Amg::Vector3D eigenJetMomentum(jetMomentum.x(), jetMomentum.y(), jetMomentum.z());
293 std::unique_ptr<const Trk::TrackParameters> extrapolatedParameters =
295 Gaudi::Hive::currentContext(),
track, perigeeSurface);
297 if (!extrapolatedParameters)
return 0.;
299 double trackTheta = extrapolatedParameters->parameters()[
Trk::theta];
300 double trackZ0 = extrapolatedParameters->parameters()[
Trk::z0];
301 double trackEta = -logf(tanf(trackTheta/2.));
302 double jetEta = jetMomentum.eta();
303 double zs = (jetEta -
trackEta)*trackZ0;
304 return (zs>=0. ? 1. : -1.);
337 msg(MSG::INFO) <<
"Empty xAOD::TrackParticle pointer passed. Returning zero " <<
endmsg;
345 msg(MSG::INFO) <<
"Empty Trk::TrackParameter pointer passed. Returning zero " <<
endmsg;
349 msg(MSG::INFO) <<
"Empty xAOD::Vertex pointer passed. Returning zero " <<
endmsg;
355 ATH_MSG_DEBUG(
"This vertex has no associated tracks. Normal if beam spot is used. Vertex already unbiased");
364 bool tmpLinTrack =
false;
371 if ((testTP.position() ==
pos) and (testTP.momentum() ==
mom)) {
374 double trackWeight(0.0);
387 ATH_MSG_INFO(
"Failing to linearized track. Returning biased vertex.");
401 double trk_chi =
m_Updator->trackParametersChi2( reducedVertex, linTrack );
402 chi2 += -1 * (
m_Updator->vertexPositionChi2(*vtx, reducedVertex) + trackWeight * trk_chi);
406 ndf += -1 * trackWeight * (2.0);
415 if (tmpLinTrack)
delete linTrack;