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);