24 #include <Eigen/Geometry>
33 m_SCTresidualTool(
"InDet::SCT_ResidualPullCalculator/SCT_ResidualPullCalculator"),
34 m_RPCresidualTool(
"Muon::RPC_ResidualPullCalculator/RPC_ResidualPullCalculator"),
35 m_TGCresidualTool(
"Muon::TGC_ResidualPullCalculator/TGC_ResidualPullCalculator"),
37 declareInterface<IResidualPullCalculator>(
this);
54 if ( ! m_SCTresidualTool.empty() ) {
57 ATH_MSG_DEBUG (
"No residual calculator for SCT given, will ignore SCT measurements!");
62 if ( ! m_RPCresidualTool.empty() ) {
65 ATH_MSG_DEBUG (
"No residual calculator for RPC given, will ignore RPC measurements!");
70 if ( ! m_TGCresidualTool.empty() ) {
73 ATH_MSG_DEBUG (
"No residual calculator for TGC given, will ignore TGC measurements!");
76 return StatusCode::SUCCESS;
81 return StatusCode::SUCCESS;
94 std::array<double,5> residuals{-999.,-999.,-999.,-999.,-999};
98 measType = helper.defineType(measurement);
127 if ( ! m_SCTresidualTool.empty() ) {
131 ATH_MSG_WARNING (
"No SCT ResidualPullCalculator given, cannot calculate residual and pull for SCT measurement!");
136 if ( ! m_RPCresidualTool.empty() ) {
140 ATH_MSG_WARNING (
"No RPC ResidualPullCalculator given, cannot calculate residual and pull for RPC measurement!");
145 if ( ! m_TGCresidualTool.empty() ) {
149 ATH_MSG_WARNING (
"No TGC ResidualPullCalculator given, cannot calculate residual and pull for TGC measurement!");
159 for (
unsigned int i=0;
i<5; ++
i) {
163 - trkPar->parameters()[iPar];
181 if (!measurement || !trkPar)
return std::nullopt;
184 bool pullIsValid = trkPar->covariance();
189 measType = helper.defineType(measurement);
192 std::vector<double>
residual(dimOfLocPars);
193 std::vector<double>
pull(dimOfLocPars);
195 unsigned int iColRow=0;
196 ATH_MSG_VERBOSE (
"Calculating residual for type " << measType <<
" dimension " << dimOfLocPars);
240 if ( ! m_SCTresidualTool.empty() ) {
244 ATH_MSG_WARNING (
"No SCT ResidualPullCalculator given, cannot calculate residual and pull for SCT measurement!");
250 if ( ! m_RPCresidualTool.empty() ) {
254 ATH_MSG_WARNING (
"No RPC ResidualPullCalculator given, cannot calculate residual and pull for RPC measurement!");
260 if ( ! m_TGCresidualTool.empty() ) {
264 ATH_MSG_WARNING (
"No TGC ResidualPullCalculator given, cannot calculate residual and pull for TGC measurement!");
275 for (
unsigned int i=0;
i<5; ++
i) {
279 - trkPar->parameters()[iPar];
294 residual.resize(HEPresidual.rows());
295 pull.resize(HEPresidual.rows());
296 for (
int i = 0;
i < HEPresidual.rows();
i++) {
301 return std::make_optional<Trk::ResidualPull>(
302 std::move(
residual), std::move(
pull), pullIsValid, resType,
314 const std::vector<const Trk::AlignmentEffectsOnTrack*>& aeots)
const {
321 measType = helper.defineType(measurement);
331 std::unique_ptr<Trk::TrackParameters> trkPar = originalTrkPar->
uniqueClone();
337 <<
parameters[0] <<
" trkPar->parameters()[Trk::loc1] "
339 <<
" measurement->localParameters()[Trk::loc1] "
345 for (
const auto & aeot : aeots ){
346 ATH_MSG_VERBOSE(
" ResidualPullCalculator aeots deltaTranslation " << aeot->deltaTranslation() <<
" angle " << aeot->deltaAngle());
353 aeot->associatedSurface().center().x(),
355 aeot->associatedSurface().center().y(),
357 aeot->associatedSurface().center().z());
358 if (displacementVector.dot(originalTrkPar->
momentum().unit()) < 0)
365 const double originalPhi=originalTrkPar->
momentum().phi();
366 double distanceR =
std::cos(originalPhi)*distanceX +
std::sin(originalPhi)*distanceY;
368 << originalTrkPar->
position().x() <<
" y "
369 << originalTrkPar->
position().y() <<
" z "
372 << aeot->associatedSurface().center().x() <<
" y "
373 << aeot->associatedSurface().center().y() <<
" z "
374 << aeot->associatedSurface().center().z());
380 driftDirection = driftDirection.unit();
382 ATH_MSG_VERBOSE(
" sensorDirection x " << sensorDirection.x() <<
" y " << sensorDirection.y() <<
" z " << sensorDirection.z() );
383 ATH_MSG_VERBOSE(
" driftDirection x " << driftDirection.x() <<
" y " << driftDirection.y() <<
" z " << driftDirection.z() );
387 double projection = driftDirection.z();
389 const double originalTheta=originalTrkPar->
momentum().theta();
390 const double sinOriginalTheta=
std::sin(originalTheta);
391 double factor = (distanceR/sinOriginalTheta)/sinOriginalTheta;
392 const Surface& surface = aeot->associatedSurface();
394 if(std::fabs(surface.
normal().z()) > 0.5) {
396 projection = (driftDirection.x()*surface.
center().x() + driftDirection.y()*surface.
center().y()) /
406 localPos[0] += projection*aeot->deltaTranslation() - projection*factor*aeot->deltaAngle();
414 double projection = aeot->associatedSurface().normal().dot(originalTrkPar->
momentum().unit());
415 localPos[0] += aeot->deltaTranslation()*projection +
distance*aeot->deltaAngle();
419 <<
" proj " << projection <<
" new localPos "
420 << localPos[0] <<
" simple " << localPosSimple[0]);
429 const AmgSymMatrix(5)* originalCov = trkPar->covariance();
437 return residualPull(measurement, trkPar.get(), resType, detType );
446 const double locMesCov,
447 const double locTrkCov,
450 double CovarianceSum = 0.0;
452 CovarianceSum = locMesCov + locTrkCov;
454 CovarianceSum = locMesCov - locTrkCov;
455 }
else CovarianceSum = locMesCov;
457 if (CovarianceSum <= 0.0) {
458 ATH_MSG_DEBUG(
"instable calculation: total covariance is non-positive, MeasCov = "<<
459 locMesCov<<
", TrkCov = "<<locTrkCov<<
", resType = "<<resType);
462 return residual/sqrt(CovarianceSum);