From 99149e3491c857b80da6230be82484664d20e751 Mon Sep 17 00:00:00 2001
From: Maksim Penzin <penzin.maksim@gmail.com>
Date: Sat, 15 Aug 2020 20:17:38 +0200
Subject: [PATCH 1/2] Style fix (auto)

---
 .../src/MuonTrackTagTestTool.cxx              | 540 ++++++++++--------
 .../src/MuonTrackTagTestTool.h                |  51 +-
 2 files changed, 313 insertions(+), 278 deletions(-)

diff --git a/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.cxx b/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.cxx
index b54fdd21c05a..5231f616defc 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.cxx
+++ b/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.cxx
@@ -2,291 +2,325 @@
   Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 */
 
-#include "GaudiKernel/MsgStream.h"
-#include "TrkTrack/Track.h"
-#include "TrkParameters/TrackParameters.h"
 #include "MuonTrackTagTestTool.h"
-#include "TrkSurfaces/StraightLineSurface.h"
-#include "TrkSurfaces/CylinderSurface.h"
-#include "TrkSurfaces/DiscSurface.h"
-#include "TrkMeasurementBase/MeasurementBase.h"
-#include "TrkGeometry/TrackingVolume.h"
-#include "TrkGeometry/TrackingGeometry.h"
 
+#include "GaudiKernel/MsgStream.h"
 #include "InDetRIO_OnTrack/PixelClusterOnTrack.h"
 #include "InDetRIO_OnTrack/TRT_DriftCircleOnTrack.h"
+#include "TrkGeometry/TrackingGeometry.h"
+#include "TrkGeometry/TrackingVolume.h"
+#include "TrkMeasurementBase/MeasurementBase.h"
+#include "TrkParameters/TrackParameters.h"
+#include "TrkSurfaces/CylinderSurface.h"
+#include "TrkSurfaces/DiscSurface.h"
+#include "TrkSurfaces/StraightLineSurface.h"
+#include "TrkTrack/Track.h"
 
 #ifdef MUONCOMBDEBUG
-#include "TrkTruthData/TrackTruth.h" 
+#include "AtlasHepMC/GenParticle.h"
+#include "TrkTruthData/TrackTruth.h"
 #include "TrkTruthData/TrackTruthCollection.h"
-#include "AtlasHepMC/GenParticle.h" 
 #endif
 
 using namespace MuonCombined;
-  
 
-MuonTrackTagTestTool::MuonTrackTagTestTool(const std::string& type, const std::string& name, const IInterface* parent) :
-  AthAlgTool(type, name, parent),
-  m_extrapolator("Trk::Extrapolator/AtlasExtrapolator", this),
-  m_trackingGeometrySvc("AtlasTrackingGeometrySvc",name)
+
+MuonTrackTagTestTool::MuonTrackTagTestTool(const std::string &type, const std::string &name, const IInterface *parent)
+    : AthAlgTool(type, name, parent),
+      m_extrapolator("Trk::Extrapolator/AtlasExtrapolator", this),
+      m_trackingGeometrySvc("AtlasTrackingGeometrySvc", name)
 {
-   
-  declareInterface<IMuonTrackTagTool>(this);
-  declareProperty("Chi2Cut", m_chi2cut=50.);
-  declareProperty("ExtrapolatorTool",m_extrapolator);
-  declareProperty("TrackingGeometrySvc", m_trackingGeometrySvc);
+
+    declareInterface<IMuonTrackTagTool>(this);
+    declareProperty("Chi2Cut", m_chi2cut = 50.);
+    declareProperty("ExtrapolatorTool", m_extrapolator);
+    declareProperty("TrackingGeometrySvc", m_trackingGeometrySvc);
 #ifdef MUONCOMBDEBUG
-  declareProperty("Truth", m_truth=false);
+    declareProperty("Truth", m_truth = false);
 #endif
-  m_msEntrance=0;
-  m_trackingGeometry=0;
-
+    m_msEntrance       = 0;
+    m_trackingGeometry = 0;
 }
 
 
-StatusCode MuonTrackTagTestTool::initialize() {
+StatusCode
+MuonTrackTagTestTool::initialize()
+{
+    StatusCode sc = m_extrapolator.retrieve();
+    if (sc == StatusCode::FAILURE) {
+        msg(MSG::FATAL) << "Could not retrieve extrapolator tool" << endmsg;
+        return sc;
+    }
 
-  StatusCode sc=m_extrapolator.retrieve(); 
-  if (sc==StatusCode::FAILURE){
-    msg(MSG::FATAL) << "Could not retrieve extrapolator tool" << endmsg;
-    return sc;
+    if (!m_trackingGeometrySvc.empty()) {
+        sc = m_trackingGeometrySvc.retrieve();
+        if (sc.isFailure()) {
+            msg(MSG::ERROR) << " failed to retrieve geometry Svc " << m_trackingGeometrySvc << endmsg;
+            return StatusCode::FAILURE;
+        }
+        msg(MSG::INFO) << "  geometry Svc " << m_trackingGeometrySvc << " retrieved " << endmsg;
+    }
 
-  }
+    msg(MSG::INFO) << "Initialized successfully" << endmsg;
 
-  if(!m_trackingGeometrySvc.empty()){
-    sc = m_trackingGeometrySvc.retrieve();
-    if( sc.isFailure() ){
-      msg(MSG::ERROR) << " failed to retrieve geometry Svc " << m_trackingGeometrySvc << endmsg;
-      return StatusCode::FAILURE;
-    }
-    msg(MSG::INFO) << "  geometry Svc " << m_trackingGeometrySvc << " retrieved " << endmsg;
-  }
- 
-  msg(MSG::INFO) << "Initialized successfully" << endmsg;
-  
-  return StatusCode::SUCCESS;
+    return StatusCode::SUCCESS;
 }
 
 
-StatusCode MuonTrackTagTestTool::finalize() {
-  
-  msg(MSG::INFO) << "Finalized successfully" << endmsg;
-  
-  
-  return StatusCode::SUCCESS;
+StatusCode
+MuonTrackTagTestTool::finalize()
+{
+
+    msg(MSG::INFO) << "Finalized successfully" << endmsg;
+
+
+    return StatusCode::SUCCESS;
 }
 
 
-double MuonTrackTagTestTool::chi2(const Trk::Track& idTrack, const Trk::Track& msTrack) const {
-  std::call_once(m_trackingOnceFlag, [&](){
-    m_trackingGeometry = m_trackingGeometrySvc->trackingGeometry();
-    if (m_trackingGeometry) m_msEntrance = m_trackingGeometry->trackingVolume("MuonSpectrometerEntrance");
-    if (!m_msEntrance) msg(MSG::ERROR) << "MS entrance not available" << endmsg;
-  });
-  
-  if(idTrack.perigeeParameters()==0) {
-    msg(MSG::WARNING) << "Skipping track combination - no perigee parameters for ID track" << endmsg;
-    return 1e15;
-  }
-  if(msTrack.perigeeParameters()==0) {
-    msg(MSG::WARNING) << "Skipping track combination - no perigee parameters for MS track" << endmsg;
-    return 1e5;
-  }
-  // skip tracks from backtracking
-  if (dynamic_cast<const Trk::StraightLineSurface*>(&(**idTrack.measurementsOnTrack()->begin()).associatedSurface())) return 0;  
-  if (idTrack.measurementsOnTrack()->size()<7 || dynamic_cast<const Trk::StraightLineSurface*>(&(*idTrack.measurementsOnTrack())[6]->associatedSurface()) || !dynamic_cast<const InDet::PixelClusterOnTrack*>(*idTrack.measurementsOnTrack()->begin()) ) return 0;
-  DataVector<const Trk::TrackStateOnSurface>::const_iterator itStates = idTrack.trackStateOnSurfaces()->begin();
-  DataVector<const Trk::TrackStateOnSurface>::const_iterator endState = idTrack.trackStateOnSurfaces()->end();
-  int noutl=0,ntrt=0;
-  for (;itStates!=endState;++itStates){
-    if ((**itStates).measurementOnTrack()) {
-      const InDet::TRT_DriftCircleOnTrack *trthit=dynamic_cast<const InDet::TRT_DriftCircleOnTrack *>((**itStates).measurementOnTrack());
-      if (trthit) {
-        if ((**itStates).type(Trk::TrackStateOnSurface::Outlier)) noutl++;
-        else ntrt++;
-      }
+double
+MuonTrackTagTestTool::chi2(const Trk::Track &idTrack, const Trk::Track &msTrack) const
+{
+    std::call_once(m_trackingOnceFlag, [&]() {
+        m_trackingGeometry = m_trackingGeometrySvc->trackingGeometry();
+        if (m_trackingGeometry) m_msEntrance = m_trackingGeometry->trackingVolume("MuonSpectrometerEntrance");
+        if (!m_msEntrance) msg(MSG::ERROR) << "MS entrance not available" << endmsg;
+    });
+
+    if (idTrack.perigeeParameters() == 0) {
+        msg(MSG::WARNING) << "Skipping track combination - no perigee parameters for ID track" << endmsg;
+        return 1e15;
     }
-  }
-  //std::cout << "noutl: " << noutl << std::endl;
-  double eta=idTrack.perigeeParameters()->eta();
-  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "ntrt: " << ntrt << " ntrtoutl: " << noutl << " eta: " << eta << endmsg;
-  if (noutl>=15 || (ntrt==0 && std::abs(eta)>.1 && std::abs(eta)<1.9)) return 0;
-
-  // skip tracks below 2.5 GeV
-  double idqoverp=idTrack.perigeeParameters()->parameters()[Trk::qOverP];
-  if (idqoverp!=0 && fabs(1/idqoverp)<2500) return 0;
-
-  const Trk::TrackParameters *muonpar=msTrack.trackParameters()->front();
-
-  bool checkphiflip=false,muonisstraight=false;
-  /* double p_ms= (!idqoverp) ? 1.e9 : fabs(1/idqoverp)-4*GeV;
-  if (p_ms<.5*GeV) p_ms=.5*GeV;
-  double deltatheta=.3e3*10/p_ms;
-  if (idTrack.perigeeParameters()->parameters()[Trk::theta]+deltatheta>M_PI || idTrack.perigeeParameters()->parameters()[Trk::theta]-deltatheta<0) checkphiflip=true;
-  */
-  if (std::abs(muonpar->parameters()[Trk::qOverP])<1.e-9) checkphiflip=muonisstraight=true; 
-
-  double phiID=(**idTrack.trackParameters()->rbegin()).parameters()[Trk::phi],     phiMS=muonpar->position().phi();
-  double thetaID=(**idTrack.trackParameters()->rbegin()).parameters()[Trk::theta], thetaMS=muonpar->parameters()[Trk::theta];
-  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "phi ID: " << phiID << " phi MS: " << phiMS << " diff: " << phiID-phiMS << " pt ID: " << idTrack.perigeeParameters()->pT() << " pt ms: " << muonpar->pT() << endmsg;
-  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "theta ID: " << thetaID << " theta MS: " << thetaMS << " diff: " << thetaID-thetaMS << endmsg; 
-  double phidiff=fabs(phiID-phiMS);
-  if (fabs(phidiff-2*M_PI)<phidiff) phidiff=2*M_PI-phidiff;
-  if (checkphiflip && fabs(phidiff-M_PI)<phidiff) phidiff=fabs(M_PI-phidiff);
-  double thetalimit=.6,philimit=.8;
-  if (muonisstraight) {
-    thetalimit=1.;
-    philimit=2;
-  }
-  if (!(fabs(thetaID-thetaMS)<thetalimit && fabs(phidiff)< philimit)) return 0;
-
-  const Trk::TrackParameters *lastmeasidpar=0;
-  int index=(int)idTrack.trackParameters()->size();
-  while (!lastmeasidpar && index>0){
-    index--;
-    lastmeasidpar = (*idTrack.trackParameters())[index]->covariance() ? (*idTrack.trackParameters())[index] : 0;
-  }  
-  if (!lastmeasidpar) {
-     msg(MSG::WARNING) << "ID track parameters don't have error matrix!" << endmsg;
-     return 0;     
-  }
-
-  const Trk::TrackParameters *mspar=0;
-  DataVector<const Trk::TrackStateOnSurface>::const_iterator tsosit=msTrack.trackStateOnSurfaces()->begin();
-
-  while (tsosit!=msTrack.trackStateOnSurfaces()->end() && !mspar) {
-    if ((**tsosit).type(Trk::TrackStateOnSurface::Measurement) && !(**tsosit).type(Trk::TrackStateOnSurface::Outlier)) {
-      mspar=(**tsosit).trackParameters();  
+    if (msTrack.perigeeParameters() == 0) {
+        msg(MSG::WARNING) << "Skipping track combination - no perigee parameters for MS track" << endmsg;
+        return 1e5;
     }
-    tsosit++;
-  }
-
-  if (!mspar) {
-     msg(MSG::WARNING) << "Could not find muon track parameters!" << endmsg;
-     return 0;     
-  }
-
-  std::unique_ptr<const Trk::TrackParameters> idextrapolatedpar =
-    std::unique_ptr<const Trk::TrackParameters>
-    ( m_extrapolator->extrapolateToVolume(*lastmeasidpar,*m_msEntrance,Trk::alongMomentum,Trk::muon) );
-
-  if (!idextrapolatedpar && lastmeasidpar->parameters()[Trk::qOverP]!=0 && std::abs(1./lastmeasidpar->parameters()[Trk::qOverP])<5.*CLHEP::GeV) {
-    if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Extrapolating with p=5 GeV" << endmsg;
-    AmgVector(5) params=lastmeasidpar->parameters();
-    double sign= (params[Trk::qOverP]>0) ? 1 : -1;
-    double newqoverp=sign/(5.*CLHEP::GeV);
-    params[Trk::qOverP]=newqoverp;
-    std::unique_ptr<const Trk::TrackParameters> newlastidpar =
-      std::unique_ptr<const Trk::TrackParameters>
-      ( lastmeasidpar->associatedSurface().createTrackParameters(params[0],params[1],params[2],params[3],params[4],new AmgSymMatrix(5)(*lastmeasidpar->covariance())) );
-    if(newlastidpar) {
-      idextrapolatedpar =
-        std::unique_ptr<const Trk::TrackParameters>
-        ( m_extrapolator->extrapolateToVolume(*newlastidpar,*m_msEntrance,Trk::alongMomentum,Trk::muon) );
+    // skip tracks from backtracking
+    if (dynamic_cast<const Trk::StraightLineSurface *>(&(**idTrack.measurementsOnTrack()->begin()).associatedSurface()))
+        return 0;
+    if (idTrack.measurementsOnTrack()->size() < 7
+        || dynamic_cast<const Trk::StraightLineSurface *>(&(*idTrack.measurementsOnTrack())[6]->associatedSurface())
+        || !dynamic_cast<const InDet::PixelClusterOnTrack *>(*idTrack.measurementsOnTrack()->begin()))
+        return 0;
+    DataVector<const Trk::TrackStateOnSurface>::const_iterator itStates = idTrack.trackStateOnSurfaces()->begin();
+    DataVector<const Trk::TrackStateOnSurface>::const_iterator endState = idTrack.trackStateOnSurfaces()->end();
+    int                                                        noutl = 0, ntrt = 0;
+    for (; itStates != endState; ++itStates) {
+        if ((**itStates).measurementOnTrack()) {
+            const InDet::TRT_DriftCircleOnTrack *trthit =
+                dynamic_cast<const InDet::TRT_DriftCircleOnTrack *>((**itStates).measurementOnTrack());
+            if (trthit) {
+                if ((**itStates).type(Trk::TrackStateOnSurface::Outlier))
+                    noutl++;
+                else
+                    ntrt++;
+            }
+        }
     }
-  }
-
-  if (!idextrapolatedpar || !idextrapolatedpar->covariance()) {
-    if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "ID extrapolated par null or missing error matrix, par: " << idextrapolatedpar.get() << endmsg;
-    return 0;
-  }
-  const Trk::TrackParameters *msparforextrapolator=mspar;
-  std::unique_ptr<const Trk::TrackParameters> created_mspar;
-  if (muonisstraight){
-    const AmgSymMatrix(5) &idcovmat=*idextrapolatedpar->covariance();
-    AmgVector(5) params=mspar->parameters();
-    params[Trk::qOverP]=idextrapolatedpar->parameters()[Trk::qOverP];
-    if(!mspar->covariance()){
-      ATH_MSG_DEBUG( "Muons parameters missing Error matrix: " << mspar);
-      return 1e5; // Sometimes it's 0, sometimes 1e15. Maybe for comparison of chi2? Just in case, will copy this value from earlier check on ms track. EJWM.
-    } 
-    AmgSymMatrix(5) *newcovmat=new AmgSymMatrix(5)(*mspar->covariance());
-    for (int i=0;i<5;i++) (*newcovmat)(i,4)=idcovmat(i,4);
-    created_mspar = 
-      std::unique_ptr<const Trk::TrackParameters>
-      ( msparforextrapolator->associatedSurface().createTrackParameters(params[0],params[1],params[2],params[3],params[4],newcovmat) );
-    msparforextrapolator = created_mspar.get();
-  }
-  Trk::PropDirection propdir=Trk::oppositeMomentum;
-  Trk::DistanceSolution distsol=idextrapolatedpar->associatedSurface().straightLineDistanceEstimate(msparforextrapolator->position(),msparforextrapolator->momentum().unit());
-  double distance=0;
-  if (distsol.numberOfSolutions()==1) distance=distsol.first();
-  else if (distsol.numberOfSolutions()==2) {
-    distance= (std::abs(distsol.first())<std::abs(distsol.second())) ? distsol.first() : distsol.second();
-  }
-  //std::cout << "distance: " << distance << std::endl;
-  if (distance>0 && distsol.numberOfSolutions()>0) propdir=Trk::alongMomentum;
-
-  std::unique_ptr<const Trk::TrackParameters> msextrapolatedpar =
-    std::unique_ptr<const Trk::TrackParameters>
-    ( m_extrapolator->extrapolate(*msparforextrapolator,idextrapolatedpar->associatedSurface(),propdir,false,Trk::muon) );
-    
-  if (muonisstraight){
-    if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Muon track is straight line" << endmsg;
-  }
-  //std::cout << "idpar: " << measidpar << " mspar: " << measmspar << std::endl;
-
-  if ((!msextrapolatedpar && !muonisstraight)){
-    msg(MSG::DEBUG) << "extrapolation failed, id:" << idextrapolatedpar.get() << " ms: " << msextrapolatedpar.get() << endmsg;
-
-    return 0;
-  }
-  double mychi2=1e15;
-  if (msextrapolatedpar) mychi2=chi2(*idextrapolatedpar,*msextrapolatedpar);
-  if (muonisstraight) {
-    std::unique_ptr<const Trk::TrackParameters> idpar_firsthit =
-      std::unique_ptr<const Trk::TrackParameters>
-      ( m_extrapolator->extrapolate(*idextrapolatedpar,mspar->associatedSurface(),Trk::alongMomentum,false,Trk::muon) );
-    if (idpar_firsthit) {
-      double chi2_2=chi2(*idpar_firsthit,*mspar);
-      if (chi2_2<mychi2) mychi2=chi2_2;
+    // std::cout << "noutl: " << noutl << std::endl;
+    double eta = idTrack.perigeeParameters()->eta();
+    if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "ntrt: " << ntrt << " ntrtoutl: " << noutl << " eta: " << eta << endmsg;
+    if (noutl >= 15 || (ntrt == 0 && std::abs(eta) > .1 && std::abs(eta) < 1.9)) return 0;
+
+    // skip tracks below 2.5 GeV
+    double idqoverp = idTrack.perigeeParameters()->parameters()[Trk::qOverP];
+    if (idqoverp != 0 && fabs(1 / idqoverp) < 2500) return 0;
+
+    const Trk::TrackParameters *muonpar = msTrack.trackParameters()->front();
+
+    bool checkphiflip = false, muonisstraight = false;
+    /* double p_ms= (!idqoverp) ? 1.e9 : fabs(1/idqoverp)-4*GeV;
+    if (p_ms<.5*GeV) p_ms=.5*GeV;
+    double deltatheta=.3e3*10/p_ms;
+    if (idTrack.perigeeParameters()->parameters()[Trk::theta]+deltatheta>M_PI ||
+    idTrack.perigeeParameters()->parameters()[Trk::theta]-deltatheta<0) checkphiflip=true;
+    */
+    if (std::abs(muonpar->parameters()[Trk::qOverP]) < 1.e-9) checkphiflip = muonisstraight = true;
+
+    double phiID = (**idTrack.trackParameters()->rbegin()).parameters()[Trk::phi], phiMS = muonpar->position().phi();
+    double thetaID = (**idTrack.trackParameters()->rbegin()).parameters()[Trk::theta],
+           thetaMS = muonpar->parameters()[Trk::theta];
+    if (msgLvl(MSG::DEBUG))
+        msg(MSG::DEBUG) << "phi ID: " << phiID << " phi MS: " << phiMS << " diff: " << phiID - phiMS
+                        << " pt ID: " << idTrack.perigeeParameters()->pT() << " pt ms: " << muonpar->pT() << endmsg;
+    if (msgLvl(MSG::DEBUG))
+        msg(MSG::DEBUG) << "theta ID: " << thetaID << " theta MS: " << thetaMS << " diff: " << thetaID - thetaMS
+                        << endmsg;
+    double phidiff = fabs(phiID - phiMS);
+    if (fabs(phidiff - 2 * M_PI) < phidiff) phidiff = 2 * M_PI - phidiff;
+    if (checkphiflip && fabs(phidiff - M_PI) < phidiff) phidiff = fabs(M_PI - phidiff);
+    double thetalimit = .6, philimit = .8;
+    if (muonisstraight) {
+        thetalimit = 1.;
+        philimit   = 2;
     }
-  }
-  return mychi2;
-}
+    if (!(fabs(thetaID - thetaMS) < thetalimit && fabs(phidiff) < philimit)) return 0;
+
+    const Trk::TrackParameters *lastmeasidpar = 0;
+    int                         index         = (int)idTrack.trackParameters()->size();
+    while (!lastmeasidpar && index > 0) {
+        index--;
+        lastmeasidpar = (*idTrack.trackParameters())[index]->covariance() ? (*idTrack.trackParameters())[index] : 0;
+    }
+    if (!lastmeasidpar) {
+        msg(MSG::WARNING) << "ID track parameters don't have error matrix!" << endmsg;
+        return 0;
+    }
+
+    const Trk::TrackParameters *                               mspar  = 0;
+    DataVector<const Trk::TrackStateOnSurface>::const_iterator tsosit = msTrack.trackStateOnSurfaces()->begin();
 
+    while (tsosit != msTrack.trackStateOnSurfaces()->end() && !mspar) {
+        if ((**tsosit).type(Trk::TrackStateOnSurface::Measurement)
+            && !(**tsosit).type(Trk::TrackStateOnSurface::Outlier)) {
+            mspar = (**tsosit).trackParameters();
+        }
+        tsosit++;
+    }
+
+    if (!mspar) {
+        msg(MSG::WARNING) << "Could not find muon track parameters!" << endmsg;
+        return 0;
+    }
 
+    std::unique_ptr<const Trk::TrackParameters> idextrapolatedpar = std::unique_ptr<const Trk::TrackParameters>(
+        m_extrapolator->extrapolateToVolume(*lastmeasidpar, *m_msEntrance, Trk::alongMomentum, Trk::muon));
+
+    if (!idextrapolatedpar && lastmeasidpar->parameters()[Trk::qOverP] != 0
+        && std::abs(1. / lastmeasidpar->parameters()[Trk::qOverP]) < 5. * CLHEP::GeV)
+    {
+        if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Extrapolating with p=5 GeV" << endmsg;
+        AmgVector(5) params = lastmeasidpar->parameters();
+        double sign         = (params[Trk::qOverP] > 0) ? 1 : -1;
+        double newqoverp    = sign / (5. * CLHEP::GeV);
+        params[Trk::qOverP] = newqoverp;
+        std::unique_ptr<const Trk::TrackParameters> newlastidpar =
+            std::unique_ptr<const Trk::TrackParameters>(lastmeasidpar->associatedSurface().createTrackParameters(
+                params[0], params[1], params[2], params[3], params[4],
+                new AmgSymMatrix(5)(*lastmeasidpar->covariance())));
+        if (newlastidpar) {
+            idextrapolatedpar = std::unique_ptr<const Trk::TrackParameters>(
+                m_extrapolator->extrapolateToVolume(*newlastidpar, *m_msEntrance, Trk::alongMomentum, Trk::muon));
+        }
+    }
 
-double MuonTrackTagTestTool::chi2(const Trk::TrackParameters& idextrapolatedpar,const Trk::TrackParameters& msextrapolatedpar) const{
-  double loc1ID=idextrapolatedpar.parameters()[Trk::loc1];
-  double loc2ID=idextrapolatedpar.parameters()[Trk::loc2];
-  double phiID=idextrapolatedpar.parameters()[Trk::phi];
-  double thetaID=idextrapolatedpar.parameters()[Trk::theta];
-     
-  double loc1MS=msextrapolatedpar.parameters()[Trk::loc1];
-  double loc2MS=msextrapolatedpar.parameters()[Trk::loc2];
-  double phiMS=msextrapolatedpar.parameters()[Trk::phi];
-  double thetaMS=msextrapolatedpar.parameters()[Trk::theta];
-  //std::cout << "idpar: " << *idpar << " mspar: " << *mspar << std::endl;
-  if (!idextrapolatedpar.covariance() || !msextrapolatedpar.covariance()) {
-    if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "track parameters don't have error matrix! id: " << idextrapolatedpar.covariance() << " ms: " << msextrapolatedpar.covariance() << endmsg;
-    return 1e15;
-  }
-  const AmgSymMatrix(5) &idcovmat=*idextrapolatedpar.covariance();
-  const AmgSymMatrix(5) &mscovmat=*msextrapolatedpar.covariance();
-  //std::cout << "idpar: " << *idextrapolatedpar << " pos: " << idextrapolatedpar.position() << " mspar: " << *msextrapolatedpar << " position: " << msextrapolatedpar.position() << std::endl;   
-  double loc1diff=fabs(loc1ID-loc1MS);
-  double loc2diff=fabs(loc2ID-loc2MS);
-  const Trk::CylinderSurface *cylsurf=dynamic_cast<const Trk::CylinderSurface *>(&idextrapolatedpar.associatedSurface());
-  const Trk::DiscSurface *discsurf=dynamic_cast<const Trk::DiscSurface *>(&idextrapolatedpar.associatedSurface());
-  
-  if (cylsurf){
-    double length=2*M_PI*cylsurf->bounds().r();
-    if (fabs(loc1diff-length  )<loc1diff) loc1diff=length-loc1diff;
-  }
-  if (discsurf){
-    if (fabs(loc2diff-2*M_PI)<loc2diff) loc2diff=2*M_PI-loc2diff;
-  }
-  double phidiff=fabs(phiID-phiMS);
-  if (fabs(phidiff-2*M_PI)<phidiff) phidiff=2*M_PI-phidiff;
-  if (fabs(phidiff-M_PI)<phidiff) phidiff-=M_PI;  // catch singularity in phi near theta=0
-  
-  double thetadiff=thetaID-thetaMS;
-  //std::cout << "loc1diff: " << loc1diff << " loc2diff: " << loc2diff << " phidiff: " << phidiff << " thetadiff: " << thetadiff << " idcov: " << idcovmat << " mscov: " << mscovmat << " idcovmat+mscovmat: " << idcovmat+mscovmat << std::endl;
-  double chi2=loc1diff*loc1diff/(idcovmat(0,0)+mscovmat(0,0))+loc2diff*loc2diff/(idcovmat(1,1)+mscovmat(1,1))+phidiff*phidiff/(idcovmat(2,2)+mscovmat(2,2))+thetadiff*thetadiff/(idcovmat(3,3)+mscovmat(3,3));
-  chi2=std::abs(chi2);
-  //if (goodmatch) std::cout << "chi2 " << chi2 << std::endl;
-  if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " chi2: " << chi2 << endmsg;
-  return chi2;
+    if (!idextrapolatedpar || !idextrapolatedpar->covariance()) {
+        if (msgLvl(MSG::DEBUG))
+            msg(MSG::DEBUG) << "ID extrapolated par null or missing error matrix, par: " << idextrapolatedpar.get()
+                            << endmsg;
+        return 0;
+    }
+    const Trk::TrackParameters *                msparforextrapolator = mspar;
+    std::unique_ptr<const Trk::TrackParameters> created_mspar;
+    if (muonisstraight) {
+        const AmgSymMatrix(5) &idcovmat = *idextrapolatedpar->covariance();
+        AmgVector(5) params             = mspar->parameters();
+        params[Trk::qOverP]             = idextrapolatedpar->parameters()[Trk::qOverP];
+        if (!mspar->covariance()) {
+            ATH_MSG_DEBUG("Muons parameters missing Error matrix: " << mspar);
+            return 1e5;  // Sometimes it's 0, sometimes 1e15. Maybe for comparison of chi2? Just in case, will copy this
+                         // value from earlier check on ms track. EJWM.
+        }
+        AmgSymMatrix(5) *newcovmat = new AmgSymMatrix(5)(*mspar->covariance());
+        for (int i = 0; i < 5; i++) (*newcovmat)(i, 4) = idcovmat(i, 4);
+        created_mspar =
+            std::unique_ptr<const Trk::TrackParameters>(msparforextrapolator->associatedSurface().createTrackParameters(
+                params[0], params[1], params[2], params[3], params[4], newcovmat));
+        msparforextrapolator = created_mspar.get();
+    }
+    Trk::PropDirection    propdir = Trk::oppositeMomentum;
+    Trk::DistanceSolution distsol = idextrapolatedpar->associatedSurface().straightLineDistanceEstimate(
+        msparforextrapolator->position(), msparforextrapolator->momentum().unit());
+    double distance = 0;
+    if (distsol.numberOfSolutions() == 1)
+        distance = distsol.first();
+    else if (distsol.numberOfSolutions() == 2) {
+        distance = (std::abs(distsol.first()) < std::abs(distsol.second())) ? distsol.first() : distsol.second();
+    }
+    // std::cout << "distance: " << distance << std::endl;
+    if (distance > 0 && distsol.numberOfSolutions() > 0) propdir = Trk::alongMomentum;
+
+    std::unique_ptr<const Trk::TrackParameters> msextrapolatedpar =
+        std::unique_ptr<const Trk::TrackParameters>(m_extrapolator->extrapolate(
+            *msparforextrapolator, idextrapolatedpar->associatedSurface(), propdir, false, Trk::muon));
+
+    if (muonisstraight) {
+        if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Muon track is straight line" << endmsg;
+    }
+    // std::cout << "idpar: " << measidpar << " mspar: " << measmspar << std::endl;
+
+    if ((!msextrapolatedpar && !muonisstraight)) {
+        msg(MSG::DEBUG) << "extrapolation failed, id:" << idextrapolatedpar.get() << " ms: " << msextrapolatedpar.get()
+                        << endmsg;
+
+        return 0;
+    }
+    double mychi2 = 1e15;
+    if (msextrapolatedpar) mychi2 = chi2(*idextrapolatedpar, *msextrapolatedpar);
+    if (muonisstraight) {
+        std::unique_ptr<const Trk::TrackParameters> idpar_firsthit =
+            std::unique_ptr<const Trk::TrackParameters>(m_extrapolator->extrapolate(
+                *idextrapolatedpar, mspar->associatedSurface(), Trk::alongMomentum, false, Trk::muon));
+        if (idpar_firsthit) {
+            double chi2_2 = chi2(*idpar_firsthit, *mspar);
+            if (chi2_2 < mychi2) mychi2 = chi2_2;
+        }
+    }
+    return mychi2;
 }
 
+
+double
+MuonTrackTagTestTool::chi2(const Trk::TrackParameters &idextrapolatedpar,
+                           const Trk::TrackParameters &msextrapolatedpar) const
+{
+    double loc1ID  = idextrapolatedpar.parameters()[Trk::loc1];
+    double loc2ID  = idextrapolatedpar.parameters()[Trk::loc2];
+    double phiID   = idextrapolatedpar.parameters()[Trk::phi];
+    double thetaID = idextrapolatedpar.parameters()[Trk::theta];
+
+    double loc1MS  = msextrapolatedpar.parameters()[Trk::loc1];
+    double loc2MS  = msextrapolatedpar.parameters()[Trk::loc2];
+    double phiMS   = msextrapolatedpar.parameters()[Trk::phi];
+    double thetaMS = msextrapolatedpar.parameters()[Trk::theta];
+    // std::cout << "idpar: " << *idpar << " mspar: " << *mspar << std::endl;
+    if (!idextrapolatedpar.covariance() || !msextrapolatedpar.covariance()) {
+        if (msgLvl(MSG::DEBUG))
+            msg(MSG::DEBUG) << "track parameters don't have error matrix! id: " << idextrapolatedpar.covariance()
+                            << " ms: " << msextrapolatedpar.covariance() << endmsg;
+        return 1e15;
+    }
+    const AmgSymMatrix(5) &idcovmat = *idextrapolatedpar.covariance();
+    const AmgSymMatrix(5) &mscovmat = *msextrapolatedpar.covariance();
+    // std::cout << "idpar: " << *idextrapolatedpar << " pos: " << idextrapolatedpar.position() << " mspar: " <<
+    // *msextrapolatedpar << " position: " << msextrapolatedpar.position() << std::endl;
+    double                      loc1diff = fabs(loc1ID - loc1MS);
+    double                      loc2diff = fabs(loc2ID - loc2MS);
+    const Trk::CylinderSurface *cylsurf =
+        dynamic_cast<const Trk::CylinderSurface *>(&idextrapolatedpar.associatedSurface());
+    const Trk::DiscSurface *discsurf = dynamic_cast<const Trk::DiscSurface *>(&idextrapolatedpar.associatedSurface());
+
+    if (cylsurf) {
+        double length = 2 * M_PI * cylsurf->bounds().r();
+        if (fabs(loc1diff - length) < loc1diff) loc1diff = length - loc1diff;
+    }
+    if (discsurf) {
+        if (fabs(loc2diff - 2 * M_PI) < loc2diff) loc2diff = 2 * M_PI - loc2diff;
+    }
+    double phidiff = fabs(phiID - phiMS);
+    if (fabs(phidiff - 2 * M_PI) < phidiff) phidiff = 2 * M_PI - phidiff;
+    if (fabs(phidiff - M_PI) < phidiff) phidiff -= M_PI;  // catch singularity in phi near theta=0
+
+    double thetadiff = thetaID - thetaMS;
+    // std::cout << "loc1diff: " << loc1diff << " loc2diff: " << loc2diff << " phidiff: " << phidiff << " thetadiff: "
+    // << thetadiff << " idcov: " << idcovmat << " mscov: " << mscovmat << " idcovmat+mscovmat: " << idcovmat+mscovmat
+    // << std::endl;
+    double chi2 = loc1diff * loc1diff / (idcovmat(0, 0) + mscovmat(0, 0))
+                  + loc2diff * loc2diff / (idcovmat(1, 1) + mscovmat(1, 1))
+                  + phidiff * phidiff / (idcovmat(2, 2) + mscovmat(2, 2))
+                  + thetadiff * thetadiff / (idcovmat(3, 3) + mscovmat(3, 3));
+    chi2 = std::abs(chi2);
+    // if (goodmatch) std::cout << "chi2 " << chi2 << std::endl;
+    if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " chi2: " << chi2 << endmsg;
+    return chi2;
+}
diff --git a/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.h b/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.h
index f1fc3039c4cc..1dedcb58e04b 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.h
+++ b/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.h
@@ -7,51 +7,52 @@
 
 //#define MUONCOMBDEBUG
 
+#include <mutex>
+#include <string>
+
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "GaudiKernel/ToolHandle.h"
-#include <string>
-#include <mutex>
-#include "TrkExInterfaces/IExtrapolator.h"
+#include "MuonCombinedToolInterfaces/IMuonTrackTagTool.h"
 #include "TrkDetDescrInterfaces/ITrackingGeometrySvc.h"
+#include "TrkExInterfaces/IExtrapolator.h"
 #include "TrkParameters/TrackParameters.h"
-#include "MuonCombinedToolInterfaces/IMuonTrackTagTool.h"
 
-namespace Trk{
-  class TrackingGeometry;
-  class TrackingVolume;
-}
+namespace Trk {
+class TrackingGeometry;
+class TrackingVolume;
+}  // namespace Trk
 
 namespace MuonCombined {
-  
-  class MuonTrackTagTestTool : public AthAlgTool, virtual public IMuonTrackTagTool {
-    
+
+class MuonTrackTagTestTool : public AthAlgTool, virtual public IMuonTrackTagTool {
+
   public:
-    
-    MuonTrackTagTestTool(const std::string& type,const std::string& name, const IInterface* parent);
+    MuonTrackTagTestTool(const std::string& type, const std::string& name, const IInterface* parent);
     ~MuonTrackTagTestTool() {}
-    
+
     StatusCode initialize();
     StatusCode finalize();
-    
-    double chi2(const Trk::TrackParameters& idParsAtEntry,const Trk::TrackParameters& msParsAtEntry) const;
+
+    double chi2(const Trk::TrackParameters& idParsAtEntry, const Trk::TrackParameters& msParsAtEntry) const;
     double chi2(const Trk::Track& id, const Trk::Track& ms) const;
 
   private:
-
     ToolHandle<Trk::IExtrapolator> m_extrapolator;
-    mutable ServiceHandle<Trk::ITrackingGeometrySvc> m_trackingGeometrySvc ATLAS_THREAD_SAFE; // Services are assumed to be thread-safe
-    mutable const Trk::TrackingGeometry*  m_trackingGeometry ATLAS_THREAD_SAFE; // Initialized with call_once, then used read-only
-    mutable const Trk::TrackingVolume*    m_msEntrance ATLAS_THREAD_SAFE; // Initialized with call_once, then used read-only
-    mutable std::once_flag                m_trackingOnceFlag ATLAS_THREAD_SAFE;
-    
+    mutable ServiceHandle<Trk::ITrackingGeometrySvc> m_trackingGeometrySvc
+        ATLAS_THREAD_SAFE;  // Services are assumed to be thread-safe
+    mutable const Trk::TrackingGeometry* m_trackingGeometry
+        ATLAS_THREAD_SAFE;  // Initialized with call_once, then used read-only
+    mutable const Trk::TrackingVolume* m_msEntrance
+                                              ATLAS_THREAD_SAFE;  // Initialized with call_once, then used read-only
+    mutable std::once_flag m_trackingOnceFlag ATLAS_THREAD_SAFE;
+
     double m_chi2cut;
 #ifdef MUONCOMBDEBUG
     bool m_truth;
 #endif
-    
-  };
+};
 
-}
+}  // namespace MuonCombined
 
 
 #endif
-- 
GitLab


From 21012b79b7f533bc1127e5b8f12fa58c1fb54e2c Mon Sep 17 00:00:00 2001
From: Maksim Penzin <penzin.maksim@gmail.com>
Date: Sat, 15 Aug 2020 20:18:50 +0200
Subject: [PATCH 2/2] private tools

---
 .../src/MuonTrackTagTestTool.cxx               | 18 +++---------------
 .../src/MuonTrackTagTestTool.h                 |  6 +++++-
 2 files changed, 8 insertions(+), 16 deletions(-)

diff --git a/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.cxx b/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.cxx
index 5231f616defc..36724f80a970 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.cxx
+++ b/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.cxx
@@ -26,14 +26,10 @@ using namespace MuonCombined;
 
 
 MuonTrackTagTestTool::MuonTrackTagTestTool(const std::string &type, const std::string &name, const IInterface *parent)
-    : AthAlgTool(type, name, parent),
-      m_extrapolator("Trk::Extrapolator/AtlasExtrapolator", this),
-      m_trackingGeometrySvc("AtlasTrackingGeometrySvc", name)
+    : AthAlgTool(type, name, parent), m_trackingGeometrySvc("AtlasTrackingGeometrySvc", name)
 {
-
     declareInterface<IMuonTrackTagTool>(this);
     declareProperty("Chi2Cut", m_chi2cut = 50.);
-    declareProperty("ExtrapolatorTool", m_extrapolator);
     declareProperty("TrackingGeometrySvc", m_trackingGeometrySvc);
 #ifdef MUONCOMBDEBUG
     declareProperty("Truth", m_truth = false);
@@ -46,18 +42,10 @@ MuonTrackTagTestTool::MuonTrackTagTestTool(const std::string &type, const std::s
 StatusCode
 MuonTrackTagTestTool::initialize()
 {
-    StatusCode sc = m_extrapolator.retrieve();
-    if (sc == StatusCode::FAILURE) {
-        msg(MSG::FATAL) << "Could not retrieve extrapolator tool" << endmsg;
-        return sc;
-    }
+    ATH_CHECK(m_extrapolator.retrieve());
 
     if (!m_trackingGeometrySvc.empty()) {
-        sc = m_trackingGeometrySvc.retrieve();
-        if (sc.isFailure()) {
-            msg(MSG::ERROR) << " failed to retrieve geometry Svc " << m_trackingGeometrySvc << endmsg;
-            return StatusCode::FAILURE;
-        }
+        ATH_CHECK(m_trackingGeometrySvc.retrieve());
         msg(MSG::INFO) << "  geometry Svc " << m_trackingGeometrySvc << " retrieved " << endmsg;
     }
 
diff --git a/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.h b/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.h
index 1dedcb58e04b..c80d624db144 100644
--- a/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.h
+++ b/Reconstruction/MuonIdentification/MuonCombinedTestTools/src/MuonTrackTagTestTool.h
@@ -37,7 +37,11 @@ class MuonTrackTagTestTool : public AthAlgTool, virtual public IMuonTrackTagTool
     double chi2(const Trk::Track& id, const Trk::Track& ms) const;
 
   private:
-    ToolHandle<Trk::IExtrapolator> m_extrapolator;
+    ToolHandle<Trk::IExtrapolator> m_extrapolator{
+        this,
+        "ExtrapolatorTool",
+        "Trk::Extrapolator/AtlasExtrapolator",
+    };
     mutable ServiceHandle<Trk::ITrackingGeometrySvc> m_trackingGeometrySvc
         ATLAS_THREAD_SAFE;  // Services are assumed to be thread-safe
     mutable const Trk::TrackingGeometry* m_trackingGeometry
-- 
GitLab