diff --git a/Tracking/TrkFitter/TrkiPatFitterUtils/TrkiPatFitterUtils/FitMatrices.h b/Tracking/TrkFitter/TrkiPatFitterUtils/TrkiPatFitterUtils/FitMatrices.h index 5befd0c65ae566a12cbbe67ea5f30db4d1ee0605..227d19ce57bc1d0c732ad48e7657955bbdd7afe3 100755 --- a/Tracking/TrkFitter/TrkiPatFitterUtils/TrkiPatFitterUtils/FitMatrices.h +++ b/Tracking/TrkFitter/TrkiPatFitterUtils/TrkiPatFitterUtils/FitMatrices.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////////////////// @@ -42,10 +42,14 @@ class FitMatrices { public: FitMatrices(bool constrainedAlignmentEffects); - ~FitMatrices(void); - - // forbidden copy constructor - // forbidden assignment operator + // copy, assignment deleted + FitMatrices(const FitMatrices&) = delete; + FitMatrices& operator=(const FitMatrices&) = delete; + //move defaulted + FitMatrices(FitMatrices&&) = default; + FitMatrices& operator=(FitMatrices&&) = default; + //dtor default + ~FitMatrices() = default ; // debugging aid: check 'smart' pointers void checkPointers(MsgStream& log) const; @@ -54,13 +58,13 @@ class FitMatrices { static double chiSquaredChange(void); // accessor to DerivativeMatrix (eigen) - Amg::MatrixX* derivativeMatrix(void); + Amg::MatrixX& derivativeMatrix(); // accessor to final covariance (5*5) // includes leading material effects on construction, but // field gradient effects have to be added by MeasurementProcessor as // 'extrapolation aware' - Amg::MatrixX* finalCovariance(void); + Amg::MatrixX& finalCovariance(); // produce full covariance (including scatterer parameters) i.e. invert weight // matrix NOTE: this does not contain the external errors which will be @@ -103,11 +107,7 @@ class FitMatrices { void usePerigee(const FitMeasurement& measurement); private: - // copy, assignment: no semantics, no implementation - FitMatrices(const FitMatrices&) = delete; - FitMatrices& operator=(const FitMatrices&) = delete; - - // add perigee measurement + // add perigee measurement void addPerigeeMeasurement(void); // fix for momentum singularity void avoidMomentumSingularity(void); // using Eigen @@ -115,35 +115,35 @@ class FitMatrices { fitMatrix m_fitMatrix; int m_columnsDM; bool m_constrainedAlignmentEffects; - Amg::MatrixX* m_covariance; - Amg::MatrixX* m_derivativeMatrix; - Amg::MatrixX* m_finalCovariance; + Amg::MatrixX m_covariance{}; + Amg::MatrixX m_derivativeMatrix{}; + Amg::MatrixX m_finalCovariance{}; std::vector<int> m_firstRowForParameter; double m_largePhiWeight; std::vector<int> m_lastRowForParameter; bool m_matrixFromCLHEP; - std::vector<FitMeasurement*>* m_measurements; + std::vector<FitMeasurement*>* m_measurements; // not owning ptr int m_numberDoF; int m_numberDriftCircles; int m_numberPerigee; FitParameters* m_parameters; - const Amg::VectorX* m_perigee; + const Amg::VectorX* m_perigee; // not owning ptr Amg::MatrixX m_perigeeDifference; - const Amg::MatrixX* m_perigeeWeight; - std::vector<double>* m_residuals; + const Amg::MatrixX* m_perigeeWeight; // not owning ptr + std::vector<double> m_residuals; int m_rowsDM; bool m_usePerigee; - Amg::MatrixX* m_weight; - Amg::VectorX* m_weightedDifference; + Amg::MatrixX m_weight; + Amg::VectorX m_weightedDifference; }; //<<<<<< INLINE MEMBER FUNCTIONS >>>>>> -inline Amg::MatrixX* FitMatrices::derivativeMatrix(void) { +inline Amg::MatrixX& FitMatrices::derivativeMatrix(void) { return m_derivativeMatrix; } -inline Amg::MatrixX* FitMatrices::finalCovariance(void) { +inline Amg::MatrixX& FitMatrices::finalCovariance(void) { return m_finalCovariance; } diff --git a/Tracking/TrkFitter/TrkiPatFitterUtils/src/FitMatrices.cxx b/Tracking/TrkFitter/TrkiPatFitterUtils/src/FitMatrices.cxx index 7dca41c2ae777c46a5fd55775f65f2bb30a9ee5f..5f8224aa38003ec8eae8614fee6cafbff6437022 100755 --- a/Tracking/TrkFitter/TrkiPatFitterUtils/src/FitMatrices.cxx +++ b/Tracking/TrkFitter/TrkiPatFitterUtils/src/FitMatrices.cxx @@ -42,9 +42,6 @@ FitMatrices::FitMatrices(bool constrainedAlignmentEffects) : m_fitMatrix{}, m_columnsDM(0), m_constrainedAlignmentEffects(constrainedAlignmentEffects), - m_covariance(nullptr), - m_derivativeMatrix(nullptr), - m_finalCovariance(nullptr), m_largePhiWeight(10000.), // arbitrary - equiv to 10um m_matrixFromCLHEP(false), m_measurements(nullptr), @@ -55,20 +52,8 @@ FitMatrices::FitMatrices(bool constrainedAlignmentEffects) m_perigee(nullptr), m_perigeeDifference(Amg::MatrixX(1, m_numberPerigee)), m_perigeeWeight(nullptr), - m_residuals(nullptr), m_rowsDM(0), - m_usePerigee(false), - m_weight(nullptr), - m_weightedDifference(nullptr) {} - -FitMatrices::~FitMatrices(void) { - delete m_covariance; - delete m_derivativeMatrix; - delete m_finalCovariance; - delete m_residuals; - delete m_weight; - delete m_weightedDifference; -} + m_usePerigee(false){} void FitMatrices::checkPointers(MsgStream& log) const { // debugging: check smart pointers @@ -102,10 +87,10 @@ double FitMatrices::chiSquaredChange(void) { const Amg::MatrixX* FitMatrices::fullCovariance(void) { // return result if matrix already inverted - if (m_covariance) { - return m_covariance; + if (m_covariance.size()!=0) { + return &m_covariance; } - m_covariance = new Amg::MatrixX(m_columnsDM, m_columnsDM); + m_covariance = Amg::MatrixX(m_columnsDM, m_columnsDM); // fix weighting ???? shouldn't we just remove large phi weight? if (m_parameters->phiInstability()) { @@ -113,7 +98,7 @@ const Amg::MatrixX* FitMatrices::fullCovariance(void) { } // invert weight matrix - Amg::MatrixX& covariance = *m_covariance; + Amg::MatrixX& covariance = m_covariance; // avoid singularity through ill-defined momentum ???? again avoidMomentumSingularity(); @@ -127,13 +112,12 @@ const Amg::MatrixX* FitMatrices::fullCovariance(void) { weight.selfadjointView<0x2>(); // check if m_weights makes sense before inverting - if (!Amg::saneCovarianceDiagonal(*m_weight)) { - delete m_covariance; - m_covariance = nullptr; + if (!Amg::saneCovarianceDiagonal(m_weight)) { + m_covariance.resize(0, 0); return nullptr; } - weight = (*m_weight).inverse(); + weight = (m_weight).inverse(); for (int row = 0; row != m_columnsDM; ++row) { for (int col = 0; col != m_columnsDM; ++col) covariance(row, col) = weight(col, row); @@ -164,16 +148,15 @@ const Amg::MatrixX* FitMatrices::fullCovariance(void) { // FIXME: errors underestimated on d0,z0 when large scatterer precedes precise // measurements final covariance starts with 5*5 representing perigee from // full covariance - delete m_finalCovariance; - m_finalCovariance = new Amg::MatrixX(5, 5); + m_finalCovariance = Amg::MatrixX(5, 5); for (int i = 0; i != 5; ++i) { for (int j = 0; j != 5; ++j) { - (*m_finalCovariance)(i, j) = covariance(i, j); + (m_finalCovariance)(i, j) = covariance(i, j); } } // return pointer to full covariance - return m_covariance; + return &m_covariance; } double FitMatrices::perigeeChiSquared(void) { @@ -276,7 +259,7 @@ void FitMatrices::printWeightMatrix(void) { << row << " col 0 "; for (int col = 0; col <= row; ++col) { std::cout << std::setiosflags(std::ios::scientific) << std::setbase(10) - << std::setw(10) << (*m_weight)(row, col) << " "; + << std::setw(10) << (m_weight)(row, col) << " "; if ((col + 1) % 13 == 0 && col < row) std::cout << std::endl @@ -306,12 +289,9 @@ void FitMatrices::refinePointers(void) { } void FitMatrices::releaseMemory(void) { - delete m_derivativeMatrix; - delete m_weight; - delete m_weightedDifference; - m_derivativeMatrix = nullptr; - m_weight = nullptr; - m_weightedDifference = nullptr; + m_derivativeMatrix.resize(0,0); + m_weight.resize(0,0); + m_weightedDifference.resize(0,0); } int FitMatrices::setDimensions(std::vector<FitMeasurement*>& measurements, @@ -328,8 +308,7 @@ int FitMatrices::setDimensions(std::vector<FitMeasurement*>& measurements, m_lastRowForParameter.clear(); m_lastRowForParameter.reserve(128); m_parameters = parameters; - delete m_residuals; - m_residuals = new std::vector<double>(2 * measurements.size(), 0.); + m_residuals = std::vector<double>(2 * measurements.size(), 0.); m_numberDriftCircles = 0; bool haveMeasurement = false; bool haveVertex = false; @@ -348,7 +327,7 @@ int FitMatrices::setDimensions(std::vector<FitMeasurement*>& measurements, // set pointers into big matrix (**m).derivative(&m_fitMatrix.derivative[row][0]); - (**m).residual(row + m_residuals->begin()); + (**m).residual(row + m_residuals.begin()); ++row; if ((**m).is2Dimensional()) { m_firstRowForParameter[row] = row; @@ -410,7 +389,7 @@ int FitMatrices::setDimensions(std::vector<FitMeasurement*>& measurements, // set pointers into big matrix (**m).derivative(&m_fitMatrix.derivative[row][0]); - (**m).residual(row + m_residuals->begin()); + (**m).residual(row + m_residuals.begin()); ++row; if ((**m).is2Dimensional()) { (**m).derivative2(&m_fitMatrix.derivative[row][0]); @@ -426,7 +405,7 @@ int FitMatrices::setDimensions(std::vector<FitMeasurement*>& measurements, // set pointers into big matrix (**m).derivative(&m_fitMatrix.derivative[row][0]); - (**m).residual(row + m_residuals->begin()); + (**m).residual(row + m_residuals.begin()); ++row; if ((**m).is2Dimensional()) { (**m).derivative2(&m_fitMatrix.derivative[row][0]); @@ -541,7 +520,7 @@ int FitMatrices::setDimensions(std::vector<FitMeasurement*>& measurements, for (int i = 0; i != numberParameters; ++i) m_fitMatrix.derivative[row][i] = 0.; (**m).derivative(&m_fitMatrix.derivative[row][0]); - (**m).residual(row + m_residuals->begin()); + (**m).residual(row + m_residuals.begin()); ++row; } for (int i = 0; i != numberParameters; ++i) @@ -562,30 +541,25 @@ int FitMatrices::setDimensions(std::vector<FitMeasurement*>& measurements, ++m_numberDoF; // we don't have any fit results yet - delete m_covariance; - m_covariance = nullptr; - delete m_finalCovariance; - m_finalCovariance = nullptr; + m_covariance.resize(0,0); + m_finalCovariance.resize(0,0); // reallocate to get correct matrix sizes - if (!m_derivativeMatrix || !m_weight || numberParameters != m_columnsDM) { + if (m_derivativeMatrix.size() == 0 || m_weight.size() == 0 || + numberParameters != m_columnsDM) { m_columnsDM = numberParameters; - delete m_derivativeMatrix; - m_derivativeMatrix = new Amg::MatrixX(m_rowsDM, m_columnsDM); - delete m_weight; - m_weight = new Amg::MatrixX(m_columnsDM, m_columnsDM); + m_derivativeMatrix = Amg::MatrixX(m_rowsDM, m_columnsDM); + m_weight = Amg::MatrixX(m_columnsDM, m_columnsDM); // isn't this faster? indicating that we have a symmetric matrix <0x2> = // <Upper> any gain seems to be negated by additional for loop copies to // recover full cov matrix introduces some rounding differences - keep for // release 21 to respect strict Tier0 policy - (*m_weight).selfadjointView<0x2>(); - - delete m_weightedDifference; - m_weightedDifference = new Amg::VectorX(m_columnsDM); + (m_weight).selfadjointView<0x2>(); + m_weightedDifference = Amg::VectorX(m_columnsDM); } // this should never happen - if (!m_derivativeMatrix) + if (m_derivativeMatrix.size()==0) fitCode = 13; return fitCode; @@ -604,12 +578,12 @@ ATH_FLATTEN // storage // hence the loops are nested to optimise row-major and to form the // Eigen transpose - Amg::MatrixX& weight = *m_weight; - Amg::VectorX& weightedDifference = *m_weightedDifference; + Amg::MatrixX& weight = m_weight; + Amg::VectorX& weightedDifference = m_weightedDifference; Amg::MatrixX fitMatrixDerivativeT(m_columnsDM, m_rowsDM); Amg::MatrixX residuals(m_rowsDM, 1); for (int row = 0; row < m_rowsDM; ++row) { - residuals(row, 0) = (*m_residuals)[row]; + residuals(row, 0) = (m_residuals)[row]; for (int col = 0; col < m_columnsDM; ++col) { fitMatrixDerivativeT(col, row) = m_fitMatrix.derivative[row][col]; } @@ -626,10 +600,10 @@ ATH_FLATTEN // solve is faster than inverse: wait for explicit request for covariance // before inversion - *m_weightedDifference = + m_weightedDifference = weight.colPivHouseholderQr().solve(weightedDifference); - m_parameters->update(*m_weightedDifference); + m_parameters->update(m_weightedDifference); return true; } @@ -659,7 +633,7 @@ void FitMatrices::addPerigeeMeasurement(void) { void FitMatrices::avoidMomentumSingularity(void) { // fix momentum if line-fit or fit attempted with negligible field integral - Amg::MatrixX& weight = *m_weight; + Amg::MatrixX& weight = m_weight; if (m_parameters->fitEnergyDeposit() && weight(5, 5) < 1. / Gaudi::Units::TeV) { for (int i = 0; i != m_columnsDM; ++i) { diff --git a/Tracking/TrkFitter/TrkiPatFitterUtils/src/FitProcedure.cxx b/Tracking/TrkFitter/TrkiPatFitterUtils/src/FitProcedure.cxx index 5809c5f751e1db9bdc6dc6316cfe09c70bb746ac..9e119f23f1be5d585aac058be52c6b7dfd2b9527 100755 --- a/Tracking/TrkFitter/TrkiPatFitterUtils/src/FitProcedure.cxx +++ b/Tracking/TrkFitter/TrkiPatFitterUtils/src/FitProcedure.cxx @@ -370,7 +370,7 @@ const FitProcedureQuality& FitProcedure::execute( cache.numberParameters = parameters->numberParameters(); cache.worstMeasurement = 0; MeasurementProcessor measurementProcessor( - asymmetricCaloEnergy, *cache.fitMatrices->derivativeMatrix(), intersector, + asymmetricCaloEnergy, cache.fitMatrices->derivativeMatrix(), intersector, measurements, parameters, m_rungeKuttaIntersector, m_stepPropagator, m_useStepPropagator); @@ -593,14 +593,14 @@ const FitProcedureQuality& FitProcedure::execute( // field integral const Amg::MatrixX* fullCovariance = cache.fitMatrices->fullCovariance(); if (fullCovariance) { - Amg::MatrixX* finalCovariance = cache.fitMatrices->finalCovariance(); + Amg::MatrixX& finalCovariance = cache.fitMatrices->finalCovariance(); if (!for_iPatTrack) { if (!m_lineFit) measurementProcessor.fieldIntegralUncertainty(*cache.log, - *finalCovariance); + finalCovariance); measurementProcessor.propagationDerivatives(); } - parameters->covariance(finalCovariance, fullCovariance); + parameters->covariance(&finalCovariance, fullCovariance); // fit quality if (perigeeQuality) {