diff --git a/InnerDetector/InDetExample/InDetAlignExample/CalibrationLoopScripts/Solve_trf.py b/InnerDetector/InDetExample/InDetAlignExample/CalibrationLoopScripts/Solve_trf.py index bc2a3f9447092c14d063b9c4e83b7100c0c8ffb4..970f470275224d8b74cbe2c8ff10e224387cc28c 100644 --- a/InnerDetector/InDetExample/InDetAlignExample/CalibrationLoopScripts/Solve_trf.py +++ b/InnerDetector/InDetExample/InDetAlignExample/CalibrationLoopScripts/Solve_trf.py @@ -194,7 +194,7 @@ solvingOption = 1 ## solving options ## 0 - No global solving ## 1 - Lapack -## 2 - ***REMOVED*** +## 2 - Eigen ## 6 - ROOT ## 7 - CLHEP @@ -342,7 +342,7 @@ solvingOption = 1 ## solving options ## 0 - No global solving ## 1 - Lapack -## 2 - ***REMOVED*** +## 2 - Eigen ## 6 - ROOT ## 7 - CLHEP diff --git a/InnerDetector/InDetExample/InDetAlignExample/python/IteratorGridClasses.py b/InnerDetector/InDetExample/InDetAlignExample/python/IteratorGridClasses.py index c7e37a97b9884d9d32b00f97b536286ad7379a00..c4a8c776d30628a80426c388bdb08f52103ddada 100644 --- a/InnerDetector/InDetExample/InDetAlignExample/python/IteratorGridClasses.py +++ b/InnerDetector/InDetExample/InDetAlignExample/python/IteratorGridClasses.py @@ -418,7 +418,7 @@ class writeScriptGridForTFile : ("pixelAlignmentLevel" in self.AlignmentOptions and self.AlignmentOptions["pixelAlignmentLevel"] == 3) or ("pixelAlignmentLevelBarrel" in self.AlignmentOptions and self.AlignmentOptions["pixelAlignmentLevelBarrel"] == 3) or ("pixelAlignmentLevelEndcaps" in self.AlignmentOptions and self.AlignmentOptions["pixelAlignmentLevelEndcaps"] == 3) ) : - print "hmn, you are going to run L3 alignment, ***REMOVED*** is using, so no eigen informations!!! " + print "hmn, you are going to run L3 alignment, Eigen is being used, so no eigen value information!!! " else : @@ -1103,7 +1103,7 @@ class writeScriptGrid : ("pixelAlignmentLevel" in self.AlignmentOptions and self.AlignmentOptions["pixelAlignmentLevel"] == 3) or ("pixelAlignmentLevelBarrel" in self.AlignmentOptions and self.AlignmentOptions["pixelAlignmentLevelBarrel"] == 3) or ("pixelAlignmentLevelEndcaps" in self.AlignmentOptions and self.AlignmentOptions["pixelAlignmentLevelEndcaps"] == 3) ) : - print "hmn, you are going to run L3 alignment, ***REMOVED*** is using, so no eigen informations!!! " + print "hmn, you are going to run L3 alignment, Eigen is going to be used, so no eigen value information!!! " else : if ( "writeEigenMat" in self.GridOptions and self.GridOptions["writeEigenMat"] == True ) and ( self.AlignmentOptions["runLocal"] == False ): diff --git a/InnerDetector/InDetExample/InDetAlignExample/share/AlignmentATNSimple.py b/InnerDetector/InDetExample/InDetAlignExample/share/AlignmentATNSimple.py index c3bf2fb0c60f8ce004e3a7cd80b7cab018bc031e..936b0d37d2089aaaceb87dd7cb9b7c73c9cd05f0 100644 --- a/InnerDetector/InDetExample/InDetAlignExample/share/AlignmentATNSimple.py +++ b/InnerDetector/InDetExample/InDetAlignExample/share/AlignmentATNSimple.py @@ -256,7 +256,7 @@ runLocal = False ## solving option ## 0 - No global solving ## 1 - Lapack -## 2 - ***REMOVED*** +## 2 - Eigen ## 6 - ROOT ## 7 - CLHEP solvingOption = 1 diff --git a/InnerDetector/InDetExample/InDetAlignExample/share/InDetAlignAlgSetup_DBM.py b/InnerDetector/InDetExample/InDetAlignExample/share/InDetAlignAlgSetup_DBM.py index 7a9ba8861b2ebddc3eed186744314ca9627a9e78..74cd5bc82ebcc07fcb3275031d6810b104a387df 100644 --- a/InnerDetector/InDetExample/InDetAlignExample/share/InDetAlignAlgSetup_DBM.py +++ b/InnerDetector/InDetExample/InDetAlignExample/share/InDetAlignAlgSetup_DBM.py @@ -35,7 +35,7 @@ newInDetAlignAlg_Options = { ,"inputMatrixFiles" : [ "matrix.bin" ] # list of matrix files when solving only ,"inputVectorFiles" : [ "vector.bin" ] # list of vector files when solving only ,"inputTFiles" : ["AlignmentTFile.root"] # list of the Alignment TFiles, used only if WriteTFile is True - ,"solvingOption" : 3 # which global solver to run 0-none, 1-Lapack, 2-***REMOVED***, 6-ROOT, 7-CLHEP + ,"solvingOption" : 3 # which global solver to run 0-none, 1-Lapack, 2-Eigen, 6-ROOT, 7-CLHEP ,"solveLocal" : True # whether to run locaal solving ,"writeMatrixFile" : True # whether to write matrix to file before solving ,"writeMatrixFileTxt" : True # whether to write matrix to text file @@ -264,7 +264,7 @@ if not newInDetAlignAlg_Options["runLocal"]: ): matrixTool.WriteEigenMat = False matrixTool.UseSparse = True - matrixTool.SolveOption = 2 # run ***REMOVED*** for L3 by default + matrixTool.SolveOption = 2 # run Eigen for L3 by default matrixTool.WriteMatTxt = False matrixTool.WriteHitmapTxt = False matrixTool.CalculateFullCovariance = False diff --git a/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignAlgSetup.py b/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignAlgSetup.py index f021c34f418dae94f74e9c9e039d484ddc279bd7..64ef5afcffc4529e74f2d8f9ac100aadbc688575 100644 --- a/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignAlgSetup.py +++ b/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignAlgSetup.py @@ -41,7 +41,7 @@ newInDetAlignAlg_Options = { ,"inputMatrixFiles" : [ "matrix.bin" ] # list of matrix files when solving only ,"inputVectorFiles" : [ "vector.bin" ] # list of vector files when solving only ,"inputTFiles" : ["AlignmentTFile.root"] # list of the Alignment TFiles, used only if WriteTFile is True - ,"solvingOption" : 3 # which global solver to run 0-none, 1-Lapack, 2-***REMOVED***, 6-ROOT, 7-CLHEP + ,"solvingOption" : 3 # which global solver to run 0-none, 1-Lapack, 2-Eigen, 6-ROOT, 7-CLHEP ,"solveLocal" : True # whether to run locaal solving ,"writeMatrixFile" : True # whether to write matrix to file before solving ,"writeMatrixFileTxt" : True # whether to write matrix to text file @@ -307,7 +307,7 @@ if not newInDetAlignAlg_Options["runLocal"]: ): matrixTool.WriteEigenMat = False matrixTool.UseSparse = True - matrixTool.SolveOption = 2 # run ***REMOVED*** for L3 by default + matrixTool.SolveOption = 2 # run Eigen for L3 by default matrixTool.WriteMatTxt = False matrixTool.WriteHitmapTxt = False matrixTool.CalculateFullCovariance = False diff --git a/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_DBMRel17.py b/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_DBMRel17.py index ec431f65f8f8dd7b6a61b9ed1dc65670231de2ff..c5e33ca483e6aefcc121a4b0c597c2498ea57351 100644 --- a/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_DBMRel17.py +++ b/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_DBMRel17.py @@ -156,7 +156,7 @@ runLocal = True ## solving option ## 0 - No global solving ## 1 - Lapack -## 2 - ***REMOVED*** +## 2 - Eigen ## 6 - ROOT ## 7 - CLHEP solvingOption = 1 diff --git a/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_Run2Rel17.py b/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_Run2Rel17.py index 99c1b14041ede80ce48bcc7c477bb6df7cbd1a9b..c9574e5b9dd6c8a7568d8819791aab2e5fb7ea6b 100644 --- a/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_Run2Rel17.py +++ b/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_Run2Rel17.py @@ -326,7 +326,7 @@ runLocal = False ## solving option ## 0 - No global solving ## 1 - Lapack -## 2 - ***REMOVED*** +## 2 - Eigen ## 6 - ROOT ## 7 - CLHEP solvingOption = 1 diff --git a/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_Run2Rel19.py b/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_Run2Rel19.py index 1d6d95783e0871c6a97679e2e584d00d52d47f3a..b1b7c21021336b32251290dfcf8de0a78be23bac 100644 --- a/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_Run2Rel19.py +++ b/InnerDetector/InDetExample/InDetAlignExample/share/NewInDetAlignment_Run2Rel19.py @@ -328,7 +328,7 @@ runLocal = True ## solving option ## 0 - No global solving ## 1 - Lapack -## 2 - ***REMOVED*** +## 2 - Eigen ## 6 - ROOT ## 7 - CLHEP solvingOption = 1 diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/CMakeLists.txt b/Tracking/TrkAlignment/TrkAlgebraUtils/CMakeLists.txt index e280a0e1f104ccffd355c8afe016c0a0fe04e618..cb2f982db3fbebf1532a67f81c001c2fbd65de02 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/CMakeLists.txt +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/CMakeLists.txt @@ -11,14 +11,16 @@ atlas_depends_on_subdirs( PRIVATE TestPolicy ) # External dependencies: +find_package( BLAS ) find_package( LAPACK ) +find_package( Eigen ) find_package( ROOT COMPONENTS Core Matrix Tree MathCore Hist RIO pthread ) # Component(s) in the package: atlas_add_library( TrkAlgebraUtils src/*.cxx - ***REMOVED***/*.f PUBLIC_HEADERS TrkAlgebraUtils - PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${LAPACK_INCLUDE_DIRS} - PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} ${LAPACK_LIBRARIES} GaudiKernel ) + PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${LAPACK_INCLUDE_DIRS} ${BLAS_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS} + PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES} ${EIGEN_LIBRARIES} GaudiKernel ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) + diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlMat.h b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlMat.h index 1aa61aa11399d99dc22fffe9b3296993b87f77bc..3c495e3e75f87411789a710879dc9d4a0310022d 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlMat.h +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlMat.h @@ -7,6 +7,7 @@ #include <iostream> #include <string> +#include <exception> class StatusCode; @@ -37,8 +38,8 @@ class AlMat { inline AlMat_row(AlMat&,int); double & operator[](int); private: - AlMat& _a; - int _r; + AlMat& m_a; + int m_r; }; class AlMat_row_const { @@ -46,8 +47,8 @@ class AlMat { inline AlMat_row_const(const AlMat&,int); const double & operator[](int) const; private: - const AlMat& _a; - int _r; + const AlMat& m_a; + int m_r; }; // helper class to implement m[i][j] @@ -104,12 +105,12 @@ class AlMat { void copy(const AlSymMatBase& m); protected: - int _ncol, _nrow; - int _nele; + int m_ncol, m_nrow; + int m_nele; std::string m_pathbin; std::string m_pathtxt; - double* ptr_data; - bool transpose; + double* m_ptr_data; + bool m_transpose; virtual long int elem(long int, long int) const; @@ -128,41 +129,41 @@ inline AlMat::AlMat_row_const AlMat::operator[] (int r) const{ } inline double &AlMat::AlMat_row::operator[](int c){ - if(_r<0||_r>=_a.nrow() || c<0||c>=_a.ncol()) - std::cerr << "Range error in AlMat::operator[][]" << std::endl; + if(m_r<0||m_r>=m_a.nrow() || c<0||c>=m_a.ncol()) + throw std::out_of_range( "Range error in AlMat::operator[][]" ); - return *(_a.ptr_data+_r*_a.ncol()+c); + return *(m_a.m_ptr_data+m_r*m_a.ncol()+c); } inline const double & AlMat::AlMat_row_const::operator[](int c) const { - if(_r<0||_r>=_a.nrow() || c<0||c>=_a.ncol()) - std::cerr << "Range error in AlMat::operator[][]" << std::endl; + if(m_r<0||m_r>=m_a.nrow() || c<0||c>=m_a.ncol()) + throw std::out_of_range( "Range error in AlMat::operator[][]" ); - return *(_a.ptr_data+_r*_a.ncol()+c); + return *(m_a.m_ptr_data+m_r*m_a.ncol()+c); } inline AlMat::AlMat_row::AlMat_row(AlMat &a,int r) - : _a(a), _r(r) + : m_a(a), m_r(r) {} inline AlMat::AlMat_row_const::AlMat_row_const (const AlMat&a,int r) - : _a(a), _r(r) + : m_a(a), m_r(r) {} inline long int AlMat::nrow() const { - if( transpose ) return _ncol; - return _nrow; + if( m_transpose ) return m_ncol; + return m_nrow; } inline long int AlMat::ncol() const { - if( transpose ) return _nrow; - return _ncol; + if( m_transpose ) return m_nrow; + return m_ncol; } inline double* AlMat::ptrData() const { - return ptr_data; + return m_ptr_data; } inline std::string AlMat::pathBin() const { diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSpaMat.h b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSpaMat.h index 4a771249ca13eb24c13765eef926ba0fd028f7c7..6ae73cdfd775aa61b811b06bf7748ce00078e523 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSpaMat.h +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSpaMat.h @@ -7,7 +7,7 @@ #include "TrkAlgebraUtils/AlSymMatBase.h" -#include <iostream> +#include <exception> class StatusCode; template<class Element> class TMatrixTSparse; @@ -50,7 +50,7 @@ class AlSpaMat : public AlSymMatBase { virtual AlSpaMat& operator*=(const double&); // ADVANCED: - int ***REMOVED***Solve(AlVec& RHS); + int SolveWithEigen(AlVec& RHS); virtual void RemoveModule( int); virtual void RemoveAlignPar(int, int); virtual void RemoveDoF( int, int nelem=1); @@ -85,8 +85,8 @@ class AlSpaMat : public AlSymMatBase { std::string m_pathbin; std::string m_pathtxt; - int* ptr_row; - int* ptr_col; + int* m_ptr_row; + int* m_ptr_col; }; @@ -95,15 +95,15 @@ class AlSpaMat : public AlSymMatBase { inline void AlSpaMat::elem(const indices& key, long int& i, long int& j) const { i = key.first; j = key.second; - if(j>i) std::cerr << "AlSpaMat::elem: i<j ! " << std::endl; + if(j>i) throw std::out_of_range( "AlSpaMat::elem: i<j ! " ); return; } inline long int AlSpaMat::nele() { // first check for intrinsic consistency: - if( int(ptr_map.size()) != _nele ) std::cerr << "AlSpaMat::_nele has been corrupted!" << std::endl; - _nele = ptr_map.size(); - return _nele; + if( int(m_ptr_map.size()) != m_nele ) throw std::range_error( "AlSpaMat::m_nele has been corrupted!" ); + m_nele = m_ptr_map.size(); + return m_nele; } inline std::string AlSpaMat::pathBin() const { diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSymMat.h b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSymMat.h index f70a5c9d929055e761960f1caf636ed7fbfc87f2..7c3e717c85ecc7b011b36d55f1e2ec9c698b8a09 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSymMat.h +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSymMat.h @@ -83,7 +83,7 @@ class AlSymMat : public AlSymMatBase { virtual void copy(const AlSpaMat& m); virtual void copy(const AlMat& m); - double* ptr_data; + double* m_ptr_data; std::string m_pathbin; std::string m_pathtxt; @@ -94,10 +94,10 @@ class AlSymMat : public AlSymMatBase { inline long int AlSymMat::elem(long int i,long int j) const { #ifdef _DEBUG - if( i<0 ) { std::cerr << "AlSymMat::elem: Index 1 < zero! " << i << std::endl; return *(ptr_data); }; - if( i>=size() ) { std::cerr << "AlSymMat::elem: Index 1 too large! " << i << std::endl; return *(ptr_data); }; - if( j<0 ) { std::cerr << "AlSymMat::elem: Index 2 < zero! " << j << std::endl; return *(ptr_data); }; - if( j>=size() ) { std::cerr << "AlSymMat::elem: Index 2 too large! " << j << std::endl; return *(ptr_data); }; + if( i<0 ) { throw std::out_of_range( "AlSymMat::elem: Index 1 < zero! " ); }; + if( i>=size() ) { throw std::out_of_range( "AlSymMat::elem: Index 1 too large! " ); }; + if( j<0 ) { throw std::out_of_range( "AlSymMat::elem: Index 2 < zero! " ); }; + if( j>=size() ) { throw std::out_of_range( "AlSymMat::elem: Index 2 too large! " ); }; #endif if( j<=i ) { return ((i+1)*i/2+j); @@ -108,7 +108,7 @@ inline long int AlSymMat::elem(long int i,long int j) const { } inline double* AlSymMat::ptrData() const { - return ptr_data; + return m_ptr_data; } inline std::string AlSymMat::pathBin() const { diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSymMatBase.h b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSymMatBase.h index 93ee825e8c9e980b62b155209001842809184c08..47353fe1a6554bd92b84b491ade316cc375589cc 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSymMatBase.h +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlSymMatBase.h @@ -9,7 +9,7 @@ // modified from SiGlobalChi2AlgebrUtils::AlSymMatBase, modified to make // pure virtual -#include <iostream> +#include <exception> #include <map> #include <vector> @@ -46,8 +46,8 @@ class AlSymMatBase { inline AlSymMatBase_row(AlSymMatBase&,long int); double & operator[](long int); private: - AlSymMatBase& _a; - long int _r; + AlSymMatBase& m_a; + long int m_r; }; class AlSymMatBase_row_const { @@ -55,8 +55,8 @@ class AlSymMatBase { inline AlSymMatBase_row_const(const AlSymMatBase&,long int); double operator[](long int) const; private: - const AlSymMatBase& _a; - long int _r; + const AlSymMatBase& m_a; + long int m_r; }; // helper class to implement m[i][j] @@ -97,11 +97,11 @@ class AlSymMatBase { AlSymMatBase(const AlSymMatBase&); AlSymMatBase& operator=(const AlSymMatBase&); - int _matrix_type; - datamap ptr_map; + int m_matrix_type; + datamap m_ptr_map; - long int _size; - long int _nele; + long int m_size; + long int m_nele; }; @@ -118,38 +118,36 @@ inline AlSymMatBase::AlSymMatBase_row_const AlSymMatBase::operator[] (long int r } inline double & AlSymMatBase::AlSymMatBase_row::operator[](long int c) { - if(_r<0||_r>=_a.nrow() || c<0||c>=_a.ncol()) { - std::cerr << "Range error in AlSymMatBase::operator[][]" << std::endl; - return _a.elemr(0,0); + if(m_r<0||m_r>=m_a.nrow() || c<0||c>=m_a.ncol()) { + throw std::out_of_range( "Range error in AlSymMatBase::operator[][]" ); } else { - return _a.elemr(_r,c); + return m_a.elemr(m_r,c); } } inline double AlSymMatBase::AlSymMatBase_row_const::operator[](long int c) const { - if(_r<0||_r>=_a.nrow() || c<0||c>=_a.ncol()) { - std::cerr << "Range error in AlSymMatBase::operator[][]" << std::endl; - return _a.elemc(0,0); + if(m_r<0||m_r>=m_a.nrow() || c<0||c>=m_a.ncol()) { + throw std::out_of_range( "Range error in AlSymMatBase::operator[][]" ); } else { - return _a.elemc(_r,c); + return m_a.elemc(m_r,c); } } inline AlSymMatBase::AlSymMatBase_row::AlSymMatBase_row(AlSymMatBase &a,long int r) - : _a(a), _r(r) + : m_a(a), m_r(r) {} inline AlSymMatBase::AlSymMatBase_row_const::AlSymMatBase_row_const (const AlSymMatBase&a,long int r) - : _a(a), _r(r) + : m_a(a), m_r(r) {} -inline long int AlSymMatBase::size() const { return _size; } -inline long int AlSymMatBase::nrow() const { return _size; } -inline long int AlSymMatBase::ncol() const { return _size; } -inline int AlSymMatBase::matrix_type() const { return _matrix_type; } -inline const datamap * AlSymMatBase::ptrMap() const { return &ptr_map; } +inline long int AlSymMatBase::size() const { return m_size; } +inline long int AlSymMatBase::nrow() const { return m_size; } +inline long int AlSymMatBase::ncol() const { return m_size; } +inline int AlSymMatBase::matrix_type() const { return m_matrix_type; } +inline const datamap * AlSymMatBase::ptrMap() const { return &m_ptr_map; } } // end namespace Trk diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlVec.h b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlVec.h index 18ba7c3f7999d6b0809f322aa4cfe6d5deeca9b1..e32c8ca5c359460968523476f2cce2a04ee70d99 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlVec.h +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/AlVec.h @@ -7,7 +7,7 @@ // PBdR (17Apr2007) -#include <iostream> +#include <exception> #include <map> #include <vector> @@ -66,8 +66,8 @@ class AlVec { inline double* ptrData() const; protected: - int _size; - double* ptr_data; + int m_size; + double* m_ptr_data; std::string m_pathbin; std::string m_pathtxt; @@ -82,39 +82,35 @@ class AlVec { // inline methods: inline int AlVec::size() const { - return _size; + return m_size; } inline double* AlVec::ptrData() const { - return ptr_data; + return m_ptr_data; } inline double& AlVec::operator[](int i) { if( i < 0 ) { - std::cerr << "AlVec: Index < zero! " << std::endl; - return ptr_data[0]; + throw std::out_of_range( "AlVec: Index < zero! " ); } - if( i >= _size ) { - std::cerr << "AlVec: Index too large! " << std::endl; - return ptr_data[0]; + if( i >= m_size ) { + throw std::out_of_range( "AlVec: Index too large! "); } - return *(ptr_data+i); + return *(m_ptr_data+i); } inline const double& AlVec::operator[](int i) const { if( i < 0 ) { - std::cerr << "AlVec: Index < zero! " << std::endl; - return ptr_data[0]; + throw std::out_of_range( "AlVec: Index < zero! " ); } - if( i >= _size ) { - std::cerr << "AlVec: Index too large! " << std::endl; - return ptr_data[0]; + if( i >= m_size ) { + throw std::out_of_range( "AlVec: Index too large! " ); } - return *(ptr_data+i); + return *(m_ptr_data+i); } } // end namespace Trk diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/IntVec.h b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/IntVec.h index 3d41b0cba467e79706a06df463db46c546449106..ef2ebec8caed37c04bedf5f559adb1aa5f35ace5 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/IntVec.h +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/TrkAlgebraUtils/IntVec.h @@ -24,11 +24,11 @@ class IntVec { IntVec& operator-=(const IntVec&); void reSize(int); - int n_elem() const { return Nele; } + int n_elem() const { return m_Nele; } private: - int Nele; - int* ptr_data; + int m_Nele; + int* m_ptr_data; }; } // end namespace Trk diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/cmt/requirements b/Tracking/TrkAlignment/TrkAlgebraUtils/cmt/requirements index c9abc1d7b0d019f6251d0186cd179f86763a49eb..37ec1df5871343209b18ecb64beaeb017f13167c 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/cmt/requirements +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/cmt/requirements @@ -19,5 +19,5 @@ public macro_append ROOT_linkopts " -lMatrix" -library TrkAlgebraUtils *.cxx -s=../***REMOVED*** *.f +library TrkAlgebraUtils *.cxx apply_pattern installed_library diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlMat.cxx b/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlMat.cxx index 3f0e87d02b046b9494c79a146c264594016efb24..27a4f310eee9dd1170de72aec27ecf1f002ab528 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlMat.cxx +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlMat.cxx @@ -14,49 +14,50 @@ #include <fstream> #include <sstream> #include <stdint.h> +#include <exception> namespace Trk { AlMat::AlMat() { - _ncol = 0; _nrow = 0; _nele = 0; - ptr_data = 0; // set pointer to null - transpose = false; + m_ncol = 0; m_nrow = 0; m_nele = 0; + m_ptr_data = 0; // set pointer to null + m_transpose = false; m_pathbin="./"; m_pathtxt="./"; } AlMat::AlMat(int N, int M) { - _nrow = N; - _ncol = M; - _nele = N*M; - ptr_data = new double[_nele]; - transpose = false; + m_nrow = N; + m_ncol = M; + m_nele = N*M; + m_ptr_data = new double[m_nele]; + m_transpose = false; m_pathbin="./"; m_pathtxt="./"; - double* p = ptr_data + _nele; - while (p > ptr_data) *(--p) = 0.; + double* p = m_ptr_data + m_nele; + while (p > m_ptr_data) *(--p) = 0.; } AlMat::AlMat(const AlMat& m) { - _nrow = m.nrow(); _ncol = m.ncol(); _nele = _nrow*_ncol; - ptr_data = new double[_nele]; - transpose = false; + m_nrow = m.nrow(); m_ncol = m.ncol(); m_nele = m_nrow*m_ncol; + m_ptr_data = new double[m_nele]; + m_transpose = false; m_pathbin = m.m_pathbin; m_pathtxt = m.m_pathtxt; copy(m); } AlMat::~AlMat() -{if( ptr_data != NULL) delete [] ptr_data;} +{if( m_ptr_data != nullptr ) delete [] m_ptr_data;} void AlMat::copy(const AlMat& m) { int nr = nrow(); int nc = ncol(); if( nr != m.nrow() || nc != m.ncol() ) { - std::cerr << "AlMat::copy: sizes do not match!" << std::endl; - return; } + throw std::range_error( "AlMat::copy: sizes do not match!" ); + } for( int i=0; i<nr; i++ ) { for( int j=0; j<nc; j++ ) { @@ -68,57 +69,57 @@ void AlMat::copy(const AlMat& m) { void AlMat::copy(const AlSymMatBase& m) { long int n = m.size(); if( nrow() != n || ncol() != n ) { - std::cerr << "AlMat::copy: sizes do not match!" << std::endl; - return; } + throw std::range_error( "AlMat::copy: sizes do not match!" ); + } for( int i=0; i<n; i++ ) { for( int j=0; j<n; j++ ) { - *(ptr_data+i*_ncol+j) = m.elemc(i, j); + *(m_ptr_data+i*m_ncol+j) = m.elemc(i, j); } } } double& AlMat::elemr(long int i,long int j) { #ifdef _DEBUG - if( i<0 ) { std::cerr << "AlMat::elemr: Index 1 < zero! " << i << std::endl; return *(ptr_data); }; - if( i>=size ) { std::cerr << "AlMat::elemr: Index 1 too large! " << i << std::endl; return *(ptr_data); }; - if( j<0 ) { std::cerr << "AlMat::elemr: Index 2 < zero! " << j << std::endl; return *(ptr_data); }; - if( j>=size ) { std::cerr << "AlMat::elemr: Index 2 too large! " << j << std::endl; return *(ptr_data); }; + if( i<0 ) { throw std::out_of_range( "AlMat::elemr: Index 1 < zero! " ); }; + if( i>=size ) { throw std::out_of_range( "AlMat::elemr: Index 1 too large!" ); }; + if( j<0 ) { throw std::out_of_range( "AlMat::elemr: Index 2 < zero! " ); }; + if( j>=size ) { throw std::out_of_range( "AlMat::elemr: Index 2 too large!" ); }; #endif - if( transpose ) return *(ptr_data+j*_ncol+i); - return *(ptr_data+i*_ncol+j); + if( m_transpose ) return *(m_ptr_data+j*m_ncol+i); + return *(m_ptr_data+i*m_ncol+j); } double AlMat::elemc(long int i,long int j) const { #ifdef _DEBUG - if( i<0 ) { std::cerr << "AlMat::elemc: Index 1 < zero! " << i << std::endl; return *(ptr_data); }; - if( i>=size ) { std::cerr << "AlMat::elemc: Index 1 too large! " << i << std::endl; return *(ptr_data); }; - if( j<0 ) { std::cerr << "AlMat::elemc: Index 2 < zero! " << j << std::endl; return *(ptr_data); }; - if( j>=size ) { std::cerr << "AlMat::elemc: Index 2 too large! " << j << std::endl; return *(ptr_data); }; + if( i<0 ) { throw std::out_of_range( "AlMat::elemr: Index 1 < zero! " ); }; + if( i>=size ) { throw std::out_of_range( "AlMat::elemr: Index 1 too large!" ); }; + if( j<0 ) { throw std::out_of_range( "AlMat::elemr: Index 2 < zero! " ); }; + if( j>=size ) { throw std::out_of_range( "AlMat::elemr: Index 2 too large!" ); }; #endif - if( transpose ) return *(ptr_data+j*_ncol+i); - return *(ptr_data+i*_ncol+j); + if( m_transpose ) return *(m_ptr_data+j*m_ncol+i); + return *(m_ptr_data+i*m_ncol+j); } long int AlMat::elem(long int i,long int j) const { #ifdef _DEBUG - if( i<0 ) { std::cerr << "AlMat::elem: Index 1 < zero! " << i << std::endl; return *(ptr_data); }; - if( i>=size ) { std::cerr << "AlMat::elem: Index 1 too large! " << i << std::endl; return *(ptr_data); }; - if( j<0 ) { std::cerr << "AlMat::elem: Index 2 < zero! " << j << std::endl; return *(ptr_data); }; - if( j>=size ) { std::cerr << "AlMat::elem: Index 2 too large! " << j << std::endl; return *(ptr_data); }; + if( i<0 ) { throw std::out_of_range( "AlMat::elemr: Index 1 < zero! " ); }; + if( i>=size ) { throw std::out_of_range( "AlMat::elemr: Index 1 too large!" ); }; + if( j<0 ) { throw std::out_of_range( "AlMat::elemr: Index 2 < zero! " ); }; + if( j>=size ) { throw std::out_of_range( "AlMat::elemr: Index 2 too large!" ); }; #endif - if( transpose ) return (j*_ncol+i); - return (i*_ncol+j); + if( m_transpose ) return (j*m_ncol+i); + return (i*m_ncol+j); } AlMat& AlMat::operator=(const double& d) { - double* p = ptr_data + _nele; - while (p > ptr_data) *(--p) = d; + double* p = m_ptr_data + m_nele; + while (p > m_ptr_data) *(--p) = d; return *this; } @@ -126,10 +127,12 @@ AlMat& AlMat::operator=(const double& d) { AlMat& AlMat::operator=(const AlMat& m) { if (this==&m) return *this; - if(( _nrow!=0 || _ncol!=0) && (_nrow != m.nrow() || _ncol != m.ncol() )) - { std::cerr << "AlMat=AlMat Assignment: size do not match!" << std::endl; return *this; } + if(( m_nrow!=0 || m_ncol!=0) && (m_nrow != m.nrow() || m_ncol != m.ncol() )) + { + throw std::range_error( "AlMat=AlMat Assignment: size do not match!" ); + } - if ( ptr_data != m.ptr_data ) { + if ( m_ptr_data != m.m_ptr_data ) { reSize(m.nrow(), m.ncol()); copy(m); }; @@ -137,10 +140,12 @@ AlMat& AlMat::operator=(const AlMat& m) { } AlMat& AlMat::operator=(const AlSymMat& m) { - if( ( _nrow!=0 || _ncol!=0) && (_nrow != m.size() || _ncol != m.size() )) - { std::cerr << "AlMat=AlSymMatBase Assignment: size do not match!" << std::endl; return *this; } + if( ( m_nrow!=0 || m_ncol!=0) && (m_nrow != m.size() || m_ncol != m.size() )) + { + throw std::range_error( "AlMat=AlSymMatBase Assignment: size do not match!" ); + } - if ( ptr_data != m.ptrData() ) { + if ( m_ptr_data != m.ptrData() ) { reSize(m.size(), m.size()); copy(m); } @@ -148,59 +153,69 @@ AlMat& AlMat::operator=(const AlSymMat& m) { } AlMat AlMat::operator+(const AlMat& m) const { - if( _nrow != m._nrow || _ncol != m._ncol ) - { std::cerr << "AlMat: operator+: size do not match!" << std::endl; return *this; } + if( m_nrow != m.m_nrow || m_ncol != m.m_ncol ) + { + throw std::range_error( "AlMat: operator+: size do not match!" ); + } - AlMat b( _nrow, _ncol ); + AlMat b( m_nrow, m_ncol ); - double* p = ptr_data + _nele; - double* q = m.ptr_data + _nele; - double* r = b.ptr_data + _nele; - while (p > ptr_data) *(--r) = (*(--p))+(*(--q)); + double* p = m_ptr_data + m_nele; + double* q = m.m_ptr_data + m_nele; + double* r = b.m_ptr_data + m_nele; + while (p > m_ptr_data) *(--r) = (*(--p))+(*(--q)); return b; } AlMat& AlMat::operator+=(const AlMat& m) { - if( _nrow != m._nrow || _ncol != m._ncol ) - { std::cerr << "AlMat: operator+=: size do not match!" << std::endl; return *this; } + if( m_nrow != m.m_nrow || m_ncol != m.m_ncol ) + { + throw std::range_error( "AlMat: operator+=: size do not match!" ); + } - double* p = ptr_data + _nele; - double* q = m.ptr_data + _nele; - while (p > ptr_data) *(--p) += *(--q); + double* p = m_ptr_data + m_nele; + double* q = m.m_ptr_data + m_nele; + while (p > m_ptr_data) *(--p) += *(--q); return *this; } AlMat AlMat::operator-(const AlMat& m) const { - if( _nrow != m._nrow || _ncol != m._ncol ) - { std::cerr << "AlMat: operator-: size do not match!" << std::endl; return *this; } + if( m_nrow != m.m_nrow || m_ncol != m.m_ncol ) + { + throw std::range_error( "AlMat: operator-: size do not match!" ); + } - AlMat b( _nrow, _ncol ); + AlMat b( m_nrow, m_ncol ); - double* p = ptr_data + _nele; - double* q = m.ptr_data + _nele; - double* r = b.ptr_data + _nele; - while (p > ptr_data) *(--r) = (*(--p))-(*(--q)); + double* p = m_ptr_data + m_nele; + double* q = m.m_ptr_data + m_nele; + double* r = b.m_ptr_data + m_nele; + while (p > m_ptr_data) *(--r) = (*(--p))-(*(--q)); return b; } AlMat& AlMat::operator-=(const AlMat& m) { - if( _nrow != m._nrow || _ncol != m._ncol ) - { std::cerr << "AlMat: operator-=: size do not match!" << std::endl; return *this; } + if( m_nrow != m.m_nrow || m_ncol != m.m_ncol ) + { + throw std::range_error( "AlMat: operator-=: size do not match!"); + } - double* p = ptr_data + _nele; - double* q = m.ptr_data + _nele; - while (p > ptr_data) *(--p) -= *(--q); + double* p = m_ptr_data + m_nele; + double* q = m.m_ptr_data + m_nele; + while (p > m_ptr_data) *(--p) -= *(--q); return *this; } AlMat AlMat::operator*(const AlMat& m) const { - if( ncol() != m.nrow() ) { std::cerr << "AlMat: operator*: size do not match!" << std::endl; - return m; } + if( ncol() != m.nrow() ) + { + throw std::range_error( "AlMat: operator*: size do not match!" ); + } int k(nrow()); int l(m.ncol()); @@ -216,8 +231,10 @@ AlMat AlMat::operator*(const AlMat& m) const { } AlMat AlMat::operator*(const AlSymMatBase& m) const { - if( ncol() != m.size()) { std::cerr << "AlMat: operator*: size do not match!" << std::endl; - return *this; } + if( ncol() != m.size()) + { + throw std::range_error( "AlMat: operator*: size do not match!" ); + } int k(nrow()); int l(m.size()); @@ -234,7 +251,9 @@ AlMat AlMat::operator*(const AlSymMatBase& m) const { AlVec AlMat::operator*(const AlVec& v) const { if( ncol() != v.size() ) - { std::cerr << "AlMat: operator*: size do not match! " << std::endl; return v; } + { + throw std::range_error( "AlMat: operator*: size do not match! " ); + } int k(nrow()); int l(ncol()); @@ -244,7 +263,7 @@ AlVec AlMat::operator*(const AlVec& v) const { AlVec b(k); for( int i=0; i<k; i++ ) { p = b.ptrData()+i; - q = ptr_data+i*l; + q = m_ptr_data+i*l; for( int j=0; j<l; j++ ) *p += (*(q+j))*(*(v.ptrData()+j)); } @@ -252,8 +271,8 @@ AlVec AlMat::operator*(const AlVec& v) const { } AlMat& AlMat::operator*=(const double& d) { - double* p = ptr_data+_nele; - while (p > ptr_data) + double* p = m_ptr_data+m_nele; + while (p > m_ptr_data) *(--p) *= d; return *this; @@ -261,10 +280,10 @@ AlMat& AlMat::operator*=(const double& d) { // transposition AlMat AlMat::T() const { - AlMat b(_ncol,_nrow); - for( int i=0; i<b._nrow; i++ ) { - for( int j=0; j<b._ncol; j++ ) { - b[i][j]= *(ptr_data+j*_ncol+i); + AlMat b(m_ncol,m_nrow); + for( int i=0; i<b.m_nrow; i++ ) { + for( int j=0; j<b.m_ncol; j++ ) { + b[i][j]= *(m_ptr_data+j*m_ncol+i); } } return b; @@ -273,7 +292,7 @@ AlMat AlMat::T() const { // transposition AlMat& AlMat::Transpose() { - transpose = true; + m_transpose = true; return *this; } @@ -281,7 +300,7 @@ AlMat& AlMat::Transpose() { // normal position AlMat& AlMat::Normal() { - transpose = false; + m_transpose = false; return *this; } @@ -289,12 +308,11 @@ AlMat& AlMat::Normal() { //invert sym matrix declared as non-symetric for convenience void AlMat::invertS(int& ierr, double Norm = 1.) { - if(_nrow!=_ncol) { - std::cerr << "AlMat invertS: non-square matrix!" << std::endl; - return; + if(m_nrow!=m_ncol) { + throw std::range_error( "AlMat invertS: non-square matrix!" ); } - AlSymMat b(_nrow); + AlSymMat b(m_nrow); for( int i=0; i<b.size(); i++ ) { for( int j=0; j<=i; j++ ) { b.elemr(i, j) = elemc(i, j); @@ -311,23 +329,23 @@ void AlMat::invertS(int& ierr, double Norm = 1.) { // reSize void AlMat::reSize(int Nnew, int Mnew) { - if ( Nnew != _nrow || Mnew != _ncol ) { + if ( Nnew != m_nrow || Mnew != m_ncol ) { - double* p = ptr_data; - _nele = Nnew*Mnew; - ptr_data = new double[_nele]; - int _nrow_old = _nrow; - int _ncol_old = _ncol; - transpose = false; + double* p = m_ptr_data; + m_nele = Nnew*Mnew; + m_ptr_data = new double[m_nele]; + int m_nrow_old = m_nrow; + int m_ncol_old = m_ncol; + m_transpose = false; - _nrow = Nnew; - _ncol = Mnew; - int k = _nrow <= _nrow_old ? _nrow : _nrow_old; - int l = _ncol <= _ncol_old ? _ncol : _ncol_old; + m_nrow = Nnew; + m_ncol = Mnew; + int k = m_nrow <= m_nrow_old ? m_nrow : m_nrow_old; + int l = m_ncol <= m_ncol_old ? m_ncol : m_ncol_old; for( int i=0; i<k; i++ ) { for( int j=0; j<l; j++ ) { - *(ptr_data+i*_ncol+j) = *(p+i*_ncol_old+j); + *(m_ptr_data+i*m_ncol+j) = *(p+i*m_ncol_old+j); } } @@ -341,25 +359,25 @@ StatusCode AlMat::ReadScalaPack(const std::string &filename){ if(inmat.fail()) return StatusCode::FAILURE; - int32_t mNrow = _nrow; + int32_t mNrow = m_nrow; inmat.read((char*)&mNrow, sizeof (mNrow)); - int32_t mNcol = _ncol; + int32_t mNcol = m_ncol; inmat.read((char*)&mNcol, sizeof (mNcol)); - _nrow=abs(mNrow); - _ncol=abs(mNcol); - _nele=_ncol*_nrow; - transpose = false; + m_nrow=abs(mNrow); + m_ncol=abs(mNcol); + m_nele=m_ncol*m_nrow; + m_transpose = false; - // printf("ALMat::nrow: %d \n",_nrow); - // printf("ALMat::ncol: %d \n",_ncol); - // printf("ALMat::nele: %d \n",_nele); + // printf("ALMat::nrow: %d \n",m_nrow); + // printf("ALMat::ncol: %d \n",m_ncol); + // printf("ALMat::nele: %d \n",m_nele); double melem=0; - for(int i=0; i<_nrow; i++) { - for(int j=0; j<_ncol; j++) { + for(int i=0; i<m_nrow; i++) { + for(int j=0; j<m_ncol; j++) { inmat.read((char*)&melem, sizeof (melem)); - *(ptr_data+i*_ncol+j) = melem; + *(m_ptr_data+i*m_ncol+j) = melem; // printf("(%d,%d) = %.16lf \n",i,j,melem); } } @@ -390,9 +408,9 @@ StatusCode AlMat::Write(const std::string &filename, bool binary, unsigned int p if(outmat.fail()) return StatusCode::FAILURE; - int32_t mNrow = _nrow; + int32_t mNrow = m_nrow; outmat.write((char*)&mNrow, sizeof (mNrow)); - int32_t mNcol = _ncol; + int32_t mNcol = m_ncol; outmat.write((char*)&mNcol, sizeof (mNcol)); } else { @@ -407,9 +425,9 @@ StatusCode AlMat::Write(const std::string &filename, bool binary, unsigned int p double melem=0; - for( int i=0; i<_nrow; i++) { - for( int j=0; j<_ncol; j++) { - melem = *(ptr_data+i*_ncol+j); + for( int i=0; i<m_nrow; i++) { + for( int j=0; j<m_ncol; j++) { + melem = *(m_ptr_data+i*m_ncol+j); if(binary) outmat.write((char*)&(melem), sizeof (melem)); else @@ -455,7 +473,7 @@ const std::string AlMat::Print(const int NColsPerSet) for (int row=0; row<nrow(); row++) { textmatrix << " |" << std::setw(6) << row << " | "; for (int col=FirstCol; col<LastCol; col++) { - double melem = *(ptr_data+row*ncol()+col); + double melem = *(m_ptr_data+row*ncol()+col); textmatrix << std::setprecision(5) << std:: setw(6) << melem << " | "; } textmatrix << std::endl; diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSpaMat.cxx b/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSpaMat.cxx index 84b7bde47b1bf796bdc28daddeff7ce742afd8b7..528a06926685e515c74805a424e967a162f25f11 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSpaMat.cxx +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSpaMat.cxx @@ -19,88 +19,76 @@ #include <math.h> #include <float.h> #include <stdint.h> +#include <stdexcept> #include <TMatrixDSparse.h> -extern"C" { - void ma27id_(int ICNTL[],double CNTL[]); - void ma27ad_(int *N,int *NZ,int IRN[],int ICN[], - int IW[],int *LIW,int IKEEP[],int IW1p[], - int *NSTEPS,int *IFLAG,int ICNTL[],double CNTL[], - int INFO[],double *OPS); +#include <Eigen/Core> +#include <Eigen/IterativeLinearSolvers> +#include <Eigen/SparseCholesky> - void ma27bd_(int *N,int *NZ,int IRN[],int ICN[], - double A[],int *LA,int IW[],int *LIW,int IKEEP[], - int *NSTEPS,int *MAXFRT, int IW1[],int ICNTL[], - double CNTL[], int INFO[]); - - void ma27cd_(int *N, double A[],int *LA,int IW[],int *LIW, - double W[],int *MAXFRT,double RHS[],int IW1[],int *NSTEPS, - int ICNTL[], int INFO[]); -} namespace Trk { //______________________________________________________________________________ AlSpaMat::AlSpaMat() { - _matrix_type = 2; - _size = 0; - _nele = 0; - ptr_row = NULL; - ptr_col = NULL; // set pointer to null + m_matrix_type = 2; + m_size = 0; + m_nele = 0; + m_ptr_row = nullptr; + m_ptr_col = nullptr; // set pointer to null } //______________________________________________________________________________ AlSpaMat::AlSpaMat(long int N) { - _matrix_type = 2; - _size = N; - _nele = 0; - ptr_row = NULL; - ptr_col = NULL; // set pointer to null + m_matrix_type = 2; + m_size = N; + m_nele = 0; + m_ptr_row = nullptr; + m_ptr_col = nullptr; // set pointer to null } //______________________________________________________________________________ AlSpaMat::AlSpaMat(const AlSpaMat& m) : AlSymMatBase(m) { - _matrix_type = 2; - _size = m.size(); - ptr_row = NULL; - ptr_col = NULL; // set pointer to null + m_matrix_type = 2; + m_size = m.size(); + m_ptr_row = nullptr; + m_ptr_col = nullptr; // set pointer to null copy(m); } //______________________________________________________________________________ AlSpaMat::AlSpaMat(const AlSymMat& m) { - _matrix_type = 2; - _size = m.size(); - ptr_row = NULL; - ptr_col = NULL; // set pointer to null + m_matrix_type = 2; + m_size = m.size(); + m_ptr_row = nullptr; + m_ptr_col = nullptr; // set pointer to null copy(m); } //______________________________________________________________________________ AlSpaMat::~AlSpaMat() { - ptr_map.clear(); - if( ptr_row != NULL ) delete [] ptr_row; - if( ptr_col != NULL ) delete [] ptr_col; + m_ptr_map.clear(); + if( m_ptr_row != nullptr ) delete [] m_ptr_row; + if( m_ptr_col != nullptr ) delete [] m_ptr_col; } //______________________________________________________________________________ void AlSpaMat::copy(const AlSpaMat& m) { if( size() != m.size()) { - std::cerr << "AlSpaMat::copy: size do not match!" << std::endl; - return; + throw std::range_error( "AlSpaMat::copy: size do not match!" ); } - ptr_map.clear(); - _nele=m._nele; - ptr_map = m.ptr_map; + m_ptr_map.clear(); + m_nele=m.m_nele; + m_ptr_map = m.m_ptr_map; return; } @@ -108,18 +96,17 @@ void AlSpaMat::copy(const AlSpaMat& m) void AlSpaMat::copy(const AlSymMat& m) { if( size() != m.size()) { - std::cerr << "AlSpaMat::copy: size do not match!" << std::endl; - return; + throw std::range_error( "AlSpaMat::copy: size do not match!" ); } - ptr_map.clear(); - _nele=0; + m_ptr_map.clear(); + m_nele=0; // Convert Storage System - for (int i = 0; i<_size; i++) + for (int i = 0; i<m_size; i++) for (int j = 0; j<=i; j++) if (m.elemc(i,j) != 0.) { - ptr_map.insert(std::make_pair(std::make_pair(i,j), m.elemc(i,j))); - _nele++; + m_ptr_map.insert(std::make_pair(std::make_pair(i,j), m.elemc(i,j))); + m_nele++; } return; @@ -129,20 +116,19 @@ void AlSpaMat::copy(const AlSymMat& m) void AlSpaMat::copy(const AlMat& m) { if( size() != m.nrow() || size() != m.ncol() ) { - std::cerr << "AlSpaMat::copy: size do not match!" << std::endl; - return; + throw std::range_error( "AlSpaMat::copy: size do not match!" ); } // copy just the lower triangle: - ptr_map.clear(); - _nele=0; + m_ptr_map.clear(); + m_nele=0; //Convert Storage System - for (int i = 0; i<_size; i++) + for (int i = 0; i<m_size; i++) for (int j = 0; j<=i; j++) if (m.elemc(i,j) != 0.) { - ptr_map.insert(std::make_pair(std::make_pair(i,j), m.elemc(i,j))); - _nele++; + m_ptr_map.insert(std::make_pair(std::make_pair(i,j), m.elemc(i,j))); + m_nele++; } return; @@ -153,38 +139,34 @@ double& AlSpaMat::elemr(long int i,long int j) { #ifdef _DEBUG if( i<0 ) { - std::cerr << "AlSpaMat::elemr: Index 1 < zero! " << i << std::endl; - return ptr_map.begin()->second; + throw std::out_of_range( "AlSpaMat::elemr: Index 1 < zero! " ); } if( i>=size() ) { - std::cerr << "AlSpaMat::elemr: Index 1 too large! " << i << std::endl; - return ptr_map.begin()->second; + throw std::out_of_range( "AlSpaMat::elemr: Index 1 too large! " ); } if( j<0 ) { - std::cerr << "AlSpaMat::elemr: Index 2 < zero! " << j << std::endl; - return ptr_map.begin()->second; + throw std::out_of_range( "AlSpaMat::elemr: Index 2 < zero! " ); } if( j>=size() ) { - std::cerr << "AlSpaMat::elemr: Index 2 too large! " << j << std::endl; - return ptr_map.begin()->second; + throw std::out_of_range("AlSpaMat::elemr: Index 2 too large! " );; } #endif // try fast referencing: mapiterator pos; indices key = j < i ? std::make_pair(i,j) : std::make_pair(j,i); - pos=ptr_map.find(key); - if( pos!=ptr_map.end() ) // already exists + pos=m_ptr_map.find(key); + if( pos!=m_ptr_map.end() ) // already exists return pos->second; else { // does not yet exist // create it with the null value: - _nele++; - return (ptr_map.insert(std::make_pair(key, 0.))).first->second; + m_nele++; + return (m_ptr_map.insert(std::make_pair(key, 0.))).first->second; } // simpler implementation of the above: /* - ptr_map[key]=0; - _nele = ptr_map.size(); - return ptr_map[key]; + m_ptr_map[key]=0; + m_nele = m_ptr_map.size(); + return m_ptr_map[key]; */ } @@ -193,28 +175,24 @@ double AlSpaMat::elemc(long int i,long int j) const { #ifdef _DEBUG if( i<0 ) { - std::cerr << "AlSpaMat::elemc: Index 1 < zero! " << i << std::endl; - return 0.0; + throw std::out_of_range( "AlSpaMat::elemc: Index 1 < zero! " ); } if( i>=size() ) { - std::cerr << "AlSpaMat::elemc: Index 1 too large! " << i << std::endl; - return 0.0; + throw std::out_of_range( "AlSpaMat::elemc: Index 1 too large! " ); } if( j<0 ) { - std::cerr << "AlSpaMat::elemc: Index 2 < zero! " << j << std::endl; - return 0.0; + throw std::out_of_range( "AlSpaMat::elemc: Index 2 < zero! " ); } if( j>=size() ) { - std::cerr << "AlSpaMat::elemc: Index 2 too large! " << j << std::endl; - return 0.0; + throw std::out_of_range( "AlSpaMat::elemc: Index 2 too large! " ); } #endif // try fast referencing: const_mapiterator pos; indices key = j < i ? std::make_pair(i,j) : std::make_pair(j,i); - pos=ptr_map.find(key); + pos=m_ptr_map.find(key); - if( pos!=ptr_map.end() ) // already exists + if( pos!=m_ptr_map.end() ) // already exists return pos->second; // does not yet exist @@ -228,20 +206,16 @@ indices AlSpaMat::elem(long int i,long int j) const // ATTENTION! the key value is returned: #ifdef _DEBUG if( i<0 ) { - std::cerr << "AlSpaMat::elem: Index 1 < zero! " << i << std::endl; - return std::make_pair(0,0); + throw std::out_of_range( "AlSpaMat::elem: Index 1 < zero! " ); } if( i>=size() ) { - std::cerr << "AlSpaMat::elem: Index 1 too large! " << i << std::endl; - return std::make_pair(0,0); + throw std::out_of_range( "AlSpaMat::elem: Index 1 too large! " ); } if( j<0 ) { - std::cerr << "AlSpaMat::elem: Index 2 < zero! " << j << std::endl; - return std::make_pair(0,0); + throw std::out_of_range( "AlSpaMat::elem: Index 2 < zero! " ); } if( j>=size() ) { - std::cerr << "AlSpaMat::elem: Index 2 too large! " << j << std::endl; - return std::make_pair(0,0); + throw std::out_of_range( "AlSpaMat::elem: Index 2 too large! " ); } #endif @@ -254,7 +228,7 @@ AlSpaMat& AlSpaMat::operator=(const AlSpaMat& m) { if ( this != &m ) { - _size=m.size(); + m_size=m.size(); copy(m); } return *this; @@ -263,7 +237,7 @@ AlSpaMat& AlSpaMat::operator=(const AlSpaMat& m) //______________________________________________________________________________ AlSpaMat& AlSpaMat::operator=(const AlSymMat& m) { - _size=m.size(); + m_size=m.size(); copy(m); return *this; } @@ -272,11 +246,10 @@ AlSpaMat& AlSpaMat::operator=(const AlSymMat& m) AlSpaMat& AlSpaMat::operator=(const AlMat& m) { if( m.nrow() != m.ncol() ) { - std::cerr << "AlSpaMat::=operator: allowed for square matrices only!" << std::endl; - return *this; + throw std::range_error( "AlSpaMat::=operator: allowed for square matrices only!" ); } - _size=m.nrow(); + m_size=m.nrow(); copy(m); return *this; } @@ -285,7 +258,7 @@ AlSpaMat& AlSpaMat::operator=(const AlMat& m) AlSpaMat& AlSpaMat::operator=(const double& d) { mapiterator pos; - for (pos = ptr_map.begin(); pos!=ptr_map.end(); pos++) + for (pos = m_ptr_map.begin(); pos!=m_ptr_map.end(); pos++) pos->second = d; return *this; @@ -295,15 +268,14 @@ AlSpaMat& AlSpaMat::operator=(const double& d) AlSpaMat AlSpaMat::operator+(const AlSpaMat& m) const { if( size() != m.size()) { - std::cerr << "AlSpaMat::operator+: size do not match!" << std::endl; - return *this; + throw std::range_error( "AlSpaMat::operator+: size do not match!" ); } AlSpaMat b(m); const_mapiterator pos; - for (pos = ptr_map.begin(); pos!=ptr_map.end(); pos++) - b.ptr_map[pos->first] += pos->second; - b._nele = b.ptr_map.size(); + for (pos = m_ptr_map.begin(); pos!=m_ptr_map.end(); pos++) + b.m_ptr_map[pos->first] += pos->second; + b.m_nele = b.m_ptr_map.size(); return b; } @@ -312,14 +284,13 @@ AlSpaMat AlSpaMat::operator+(const AlSpaMat& m) const AlSpaMat& AlSpaMat::operator+=(const AlSpaMat& m) { if( size() != m.size()) { - std::cerr << "AlSpaMat::operator+=: size do not match!" << std::endl; - return *this; + throw std::range_error( "AlSpaMat::operator+=: size do not match!" ); } const_mapiterator pos; - for (pos = m.ptr_map.begin(); pos!=m.ptr_map.end(); pos++) - (*this).ptr_map[pos->first] += pos->second; - _nele = ptr_map.size(); + for (pos = m.m_ptr_map.begin(); pos!=m.m_ptr_map.end(); pos++) + (*this).m_ptr_map[pos->first] += pos->second; + m_nele = m_ptr_map.size(); return *this; } @@ -328,15 +299,14 @@ AlSpaMat& AlSpaMat::operator+=(const AlSpaMat& m) AlSpaMat AlSpaMat::operator-(const AlSpaMat& m) const { if( size() != m.size()) { - std::cerr << "AlSpaMat::operator-: size do not match!" << std::endl; - return *this; + throw std::range_error( "AlSpaMat::operator-: size do not match!" ); } AlSpaMat b(m); const_mapiterator pos; - for (pos = ptr_map.begin(); pos!=ptr_map.end(); pos++) - b.ptr_map[pos->first] -= pos->second; - b._nele = b.ptr_map.size(); + for (pos = m_ptr_map.begin(); pos!=m_ptr_map.end(); pos++) + b.m_ptr_map[pos->first] -= pos->second; + b.m_nele = b.m_ptr_map.size(); return b; } @@ -345,14 +315,13 @@ AlSpaMat AlSpaMat::operator-(const AlSpaMat& m) const AlSpaMat& AlSpaMat::operator-=(const AlSpaMat& m) { if( size() != m.size()) { - std::cerr << "AlSpaMat::operator-=: size do not match!" << std::endl; - return *this; + throw std::range_error( "AlSpaMat::operator-=: size do not match!" ); } const_mapiterator pos; - for (pos = m.ptr_map.begin(); pos!=m.ptr_map.end(); pos++) - (*this).ptr_map[pos->first] -= pos->second; - _nele = ptr_map.size(); + for (pos = m.m_ptr_map.begin(); pos!=m.m_ptr_map.end(); pos++) + (*this).m_ptr_map[pos->first] -= pos->second; + m_nele = m_ptr_map.size(); return *this; } @@ -361,9 +330,7 @@ AlSpaMat& AlSpaMat::operator-=(const AlSpaMat& m) AlMat AlSpaMat::operator*(const AlSymMatBase& m) const { if( size() != m.size() ) { - std::cerr << "AlSpaMat::operator*: size do not match!" << std::endl; - AlMat b( size(), m.size()); - return b; + throw std::range_error( "AlSpaMat::operator*: size do not match!" ); } long int isiz(size()); @@ -380,8 +347,7 @@ AlMat AlSpaMat::operator*(const AlSymMatBase& m) const //______________________________________________________________________________ AlMat AlSpaMat::operator*(const AlMat& m) const { if( size() != m.nrow() ) { - std::cerr << "AlSpaMat::operator*: size do not match!" << std::endl; - return m; + throw std::range_error( "AlSpaMat::operator*: size do not match!" ); } long int isiz(size()); @@ -400,8 +366,7 @@ AlMat AlSpaMat::operator*(const AlMat& m) const { AlVec AlSpaMat::operator*(const AlVec& v) const { if( size() != v.size() ) { - std::cerr << "AlSpaMat::operator*: size do not match! " << std::endl; - return v; + throw std::range_error( "AlSpaMat::operator*: size do not match! " ); } long int isiz(size()); @@ -418,7 +383,7 @@ AlVec AlSpaMat::operator*(const AlVec& v) const AlSpaMat& AlSpaMat::operator*=(const double& d) { mapiterator pos; - for (pos = ptr_map.begin(); pos!=ptr_map.end(); pos++) + for (pos = m_ptr_map.begin(); pos!=m_ptr_map.end(); pos++) pos->second *= d; return *this; @@ -429,8 +394,8 @@ AlSpaMat AlSpaMat::operator*(const double& d) const { AlSpaMat a(size()); const_mapiterator pos; - for (pos = ptr_map.begin(); pos!=ptr_map.end(); pos++) - a.ptr_map.insert(std::make_pair(pos->first, (pos->second)*d)); + for (pos = m_ptr_map.begin(); pos!=m_ptr_map.end(); pos++) + a.m_ptr_map.insert(std::make_pair(pos->first, (pos->second)*d)); return a; } @@ -438,118 +403,94 @@ AlSpaMat AlSpaMat::operator*(const double& d) const //______________________________________________________________________________ double AlSpaMat::determinant() { - double deter = 1.; - - std::cerr << "AlSpaMat::determinant: not implemented!" << std::endl; - - return deter; + throw std::invalid_argument( "AlSpaMat::determinant: not implemented!" ); } -//______________________________________________________________________________ -int AlSpaMat::***REMOVED***Solve(AlVec& RHS) -{ - int ICNTL[30]; - double CNTL[5]; - ma27id_(ICNTL,CNTL); - - double* ptr_data = new double[_nele]; - ptr_row = new int[_nele]; - ptr_col = new int[_nele]; - - int Size(_size); - int Nele(_nele); - - //Convert Storage System +int AlSpaMat::SolveWithEigen(AlVec& RHS){ + + if(RHS.size() != size() ){ + throw std::range_error( "AlSpaMat::SolveWithEigen vector size is incorrect" ); + } + + Eigen::VectorXd eigenBigVector( RHS.size() ); + for(int i(0); i< RHS.size(); ++i ){ + eigenBigVector[i] = RHS[i]; + } + Eigen::SparseMatrix<double> eigenBigMatrix( m_size, m_size ); + + typedef Eigen::Triplet<double> Triplet; + std::vector<Triplet> tripletList; + tripletList.reserve(m_nele); long int i, j; long int counter(0); mapiterator pos; - for (pos = ptr_map.begin(); pos!=ptr_map.end(); pos++){ + for (pos = m_ptr_map.begin(); pos!=m_ptr_map.end(); pos++){ elem(pos->first, i, j); - *(ptr_data+counter)=pos->second; - *(ptr_row+counter)= i+1; - *(ptr_col+counter)= j+1; + tripletList.push_back(Triplet(i,j,pos->second)); + if(i!=j) tripletList.push_back(Triplet(j,i,pos->second)); counter++; } + eigenBigMatrix.setFromTriplets(tripletList.begin(), tripletList.end()); - int LIW =3/2*(2*Nele+3*Size+1); - int* IW = new int[LIW]; - int* IKEEP = new int[3*Size]; - int* IW1 = new int[2*Size]; - int NSTEPS; - int IFLAG = 0; - int INFO[20]; - double OPS; - - ma27ad_(&Size, &Nele,ptr_row,ptr_col, - IW,&LIW,IKEEP,IW1, - &NSTEPS,&IFLAG,ICNTL,CNTL, - INFO,&OPS); - - int MAXFRT; - int LA =2*INFO[4]; + // Eigen::CholmodSupernodalLLT is much much quicker (x50) so it would be great to move to that in the future + // requires an external package SuiteSparse + // BiCGSTAB was the fastest iterative solver in Eigen from a quick test + // SimplicialLDLT was the fastest direct solver in Eigen (x2 slower than BiCGSTAB ) - double* TempA = new double[Nele]; - for (int i=0; i<Nele ;i++) - *(TempA+i) = *(ptr_data+i); + // Eigen::BiCGSTAB<Eigen::SparseMatrix<double> > solver; + Eigen::SimplicialLDLT<Eigen::SparseMatrix<double> > solver; - delete [] ptr_data; - ptr_data = new double[LA]; - - for (int i=0; i<LA ;i++) - *(ptr_data+i)=0; - - for (int i=0; i<Nele ;i++) - *(ptr_data+i)= *(TempA+i); - - delete [] TempA; - - ma27bd_(&Size,&Nele,ptr_row,ptr_col, - ptr_data,&LA,IW,&LIW,IKEEP, - &NSTEPS,&MAXFRT,IW1,ICNTL, - CNTL,INFO); + solver.compute(eigenBigMatrix); + if(solver.info()!=Eigen::Success) { + // decomposition failed + throw std::domain_error("AlSpaMat::SolveWithEigen: failed to compute: -- is the input matrix singular?" ); + return 1; + } - double* W =new double[MAXFRT]; + Eigen::VectorXd x = solver.solve( eigenBigVector ); + if(solver.info()!=Eigen::Success) { + // solving failed + throw std::domain_error("AlSpaMat::SolveWithEigen: Failed to solve: -- is your matrix singular? "); + return 2; + } + + //Copy results into vector + for(int i(0); i< RHS.size(); ++i ){ + RHS[i] = x[i]; + } - double* RHStemp =new double[Size]; - for (int i=0; i<Size; i++) - RHStemp[i] = RHS[i]; + //Check accuracy + Eigen::VectorXd residual = eigenBigMatrix * x - eigenBigVector; + double sumresidual = 0; + for( int i=0; i<residual.size(); ++i){ + sumresidual += fabs(residual[i]); + } + sumresidual /= (double) residual.size(); + + if( sumresidual > 1e-3 ){ + throw std::overflow_error( "AlSpaMat::SolveWithEigen: your solution is no good! "); + return 3; + } - ma27cd_(&Size, ptr_data,&LA,IW,&LIW, - W,&MAXFRT,RHStemp,IW1,&NSTEPS, - ICNTL,INFO); + return 0; - for (int i=0; i<Size; i++) - RHS[i] = RHStemp[i]; - delete [] RHStemp; - delete [] IW; - delete [] IKEEP; - delete [] IW1; - delete [] W; +} - delete [] ptr_data; ptr_data=NULL; - delete [] ptr_row; ptr_row=NULL; - delete [] ptr_col; ptr_col=NULL; - return INFO[0]; -} //______________________________________________________________________________ //jlove int AlSpaMat::diagonalize(char jobz, AlVec& w, AlMat& z) { int AlSpaMat::diagonalize(char, AlVec&, AlMat&) { - std::cerr << "AlSpaMat::diagonalize: not implemented!" << std::endl; - int ierr = -1; - return ierr; + throw std::invalid_argument( "AlSpaMat::diagonalize: not implemented!" ); } //______________________________________________________________________________ int AlSpaMat::invert() { - std::cerr << "AlSpaMat::invert: not implemented!" << std::endl; - int ierr = -1; - return ierr; + throw std::invalid_argument( "AlSpaMat::invert: not implemented!" ); } //______________________________________________________________________________ @@ -557,16 +498,16 @@ void AlSpaMat::RemoveDoF(int index, int nelem) { // index here is the first alignment parameter to remove, nelem number of consecutive ones - _size-=nelem; + m_size-=nelem; long int n=index+nelem-1; mapiterator pos; - mapiterator pos_obs=ptr_map.end(); - for (pos = ptr_map.begin(); pos!=ptr_map.end(); pos++) { + mapiterator pos_obs=m_ptr_map.end(); + for (pos = m_ptr_map.begin(); pos!=m_ptr_map.end(); pos++) { - if( pos_obs!=ptr_map.end() ) - ptr_map.erase(pos_obs); + if( pos_obs!=m_ptr_map.end() ) + m_ptr_map.erase(pos_obs); - pos_obs = ptr_map.end(); + pos_obs = m_ptr_map.end(); long int k, l; elem(pos->first, k, l); @@ -585,9 +526,9 @@ void AlSpaMat::RemoveDoF(int index, int nelem) } } - if( pos_obs!=ptr_map.end() ) - ptr_map.erase(pos_obs); - _nele = ptr_map.size(); + if( pos_obs!=m_ptr_map.end() ) + m_ptr_map.erase(pos_obs); + m_nele = m_ptr_map.size(); } //______________________________________________________________________________ @@ -595,12 +536,11 @@ int AlSpaMat::RemoveCollsRows(std::vector<int> indices) { int n = indices.size(); if (n==0) { - std::cerr<<"Vector of indices to remove is empty."<<std::endl; - return _size; + return m_size; } - if (n>_size) { - std::cerr<<"Vector of indices larger than matrix size."<<std::endl; - return _size; + if (n>m_size) { + throw std::invalid_argument( "AlSpaMat::RemoveCollsRows: Vector of indices larger than matrix size." ); + return m_size; } // first sort the list of indices descending @@ -615,14 +555,13 @@ int AlSpaMat::RemoveCollsRows(std::vector<int> indices) // remove rows and columns starting from largest indices for (int i=0;i<n;i++) { - if (indices[i] > _size-1) { - std::cerr<<"Index "<<indices[i]<<" goes beyond matrix (size "<<_size<<")."<<std::endl; - continue; + if (indices[i] > m_size-1) { + throw std::out_of_range( "AlSpaMat::RemoveCollsRows: Index goes beyond matrix." ); } RemoveDoF(indices[i]); } - return _size; + return m_size; } //______________________________________________________________________________ @@ -652,15 +591,15 @@ void AlSpaMat::RemoveAlignPar(int index, int control) counterCol=0; } - pos = ptr_map.find(std::make_pair(row+shiftRow,col+shiftCol)); - if( pos!=ptr_map.end() ) { // exists + pos = m_ptr_map.find(std::make_pair(row+shiftRow,col+shiftCol)); + if( pos!=m_ptr_map.end() ) { // exists elemr(row,col) = pos->second; - ptr_map.erase(pos); + m_ptr_map.erase(pos); } else { - pos = ptr_map.find(std::make_pair(row,col)); - if( pos!=ptr_map.end() ) - ptr_map.erase(pos); + pos = m_ptr_map.find(std::make_pair(row,col)); + if( pos!=m_ptr_map.end() ) + m_ptr_map.erase(pos); } counterCol++; if (counterCol==5-control) { @@ -676,7 +615,7 @@ void AlSpaMat::RemoveAlignPar(int index, int control) } } - _nele = ptr_map.size(); + m_nele = m_ptr_map.size(); } //______________________________________________________________________________ @@ -694,21 +633,21 @@ void AlSpaMat::RemoveModule(int index) void AlSpaMat::reSize(long int n) { // balanced binary tree! - if( n!=_size ) { + if( n!=m_size ) { // make a temporary copy: AlSpaMat m(*this); - ptr_map.clear(); - _size = n; + m_ptr_map.clear(); + m_size = n; long int i, j; mapiterator pos; - for (pos = m.ptr_map.begin(); pos!=m.ptr_map.end(); pos++) { + for (pos = m.m_ptr_map.begin(); pos!=m.m_ptr_map.end(); pos++) { m.elem(pos->first, i, j); if( i<n && j<n ) - ptr_map.insert(*pos); + m_ptr_map.insert(*pos); } } - _nele = ptr_map.size(); + m_nele = m_ptr_map.size(); return; } @@ -728,12 +667,12 @@ void AlSpaMat::SetPathTxt(const std::string &path) //jlove StatusCode AlSpaMat::Write(const std::string &filename, bool binary, // bool square, double scale, float version){ StatusCode AlSpaMat::Write(const std::string &filename, bool binary, - bool square, double, float version) + bool /*square*/, double, float version) { std::ofstream outmat; int32_t msizz = 1000000+size(); - int32_t nelem = ptr_map.size(); + int32_t nelem = m_ptr_map.size(); if(binary) { outmat.open((m_pathbin+filename).c_str(), std::ios::binary); @@ -744,9 +683,6 @@ StatusCode AlSpaMat::Write(const std::string &filename, bool binary, outmat.write((char*)&msizz, sizeof (msizz)); outmat.write((char*)&version, sizeof (version)); outmat.write((char*)&nelem, sizeof (nelem)); - // std::cout << "AlSpaMat::Write: msizz = " << msizz << std::endl; - // std::cout << "AlSpaMat::Write: version = " << version << std::endl; - // std::cout << "AlSpaMat::Write: nelem = " << nelem << std::endl; } else { outmat.open((m_pathtxt+filename).c_str()); @@ -765,7 +701,7 @@ StatusCode AlSpaMat::Write(const std::string &filename, bool binary, int32_t i, j; mapiterator pos; - for (pos = ptr_map.begin(); pos!=ptr_map.end(); pos++) { + for (pos = m_ptr_map.begin(); pos!=m_ptr_map.end(); pos++) { melem = pos->second; elem(pos->first, ii, jj); i=ii; j=jj; // just a type conversion if(binary) { @@ -777,8 +713,6 @@ StatusCode AlSpaMat::Write(const std::string &filename, bool binary, outmat << std::setw(6) << i << std::setw(6) << j << std::setw(18) << melem << std::endl; } outmat.close(); - if(square) - std::cout << "AlSpaMat::Write: square flag has been ignored!" << std::endl; return StatusCode::SUCCESS; } @@ -790,7 +724,7 @@ StatusCode AlSpaMat::CheckMatVersion(const std::string filename, bool &StdUnits) if(inmat.fail()) return StatusCode::FAILURE; - ptr_map.clear(); + m_ptr_map.clear(); int32_t msiz=0; inmat.read((char*)&msiz, sizeof (msiz)); @@ -805,8 +739,6 @@ StatusCode AlSpaMat::CheckMatVersion(const std::string filename, bool &StdUnits) inmat.close(); - // std::cout << "AlSpaMat::StdUnits: " << StdUnits << std::endl; - return StatusCode::SUCCESS; } @@ -817,13 +749,11 @@ StatusCode AlSpaMat::Read(const std::string &filename, int &dofs, bool &triang, if (StatusCode::SUCCESS != CheckMatVersion(m_pathbin+filename, m_StdUnits)) return StatusCode::FAILURE; - // std::cout << "AlSpaMat::StdUnits: " << m_StdUnits << std::endl; - std::ifstream inmat((m_pathbin+filename).c_str(), std::ios::binary); if(inmat.fail()) return StatusCode::FAILURE; - ptr_map.clear(); + m_ptr_map.clear(); int32_t msiz=0; int32_t nelem; @@ -832,11 +762,10 @@ StatusCode AlSpaMat::Read(const std::string &filename, int &dofs, bool &triang, dofs = msiz-1000000; else dofs = abs(msiz); - _size = dofs; + m_size = dofs; if (m_StdUnits) inmat.read((char*)&version, sizeof (version)); - // std::cout << "AlSpaMat::Write: version = " << version << std::endl; double melem=0; int32_t i, j; @@ -844,13 +773,12 @@ StatusCode AlSpaMat::Read(const std::string &filename, int &dofs, bool &triang, if(msiz>999999) { // sparse format triang=false; inmat.read((char*)&nelem, sizeof (nelem)); - _nele=nelem; - // std::cout << "AlSpaMat::Write: nelem = " << nelem << std::endl; + m_nele=nelem; for(int k=0; k<nelem; k++) { inmat.read((char*)&i, sizeof (i)); inmat.read((char*)&j, sizeof (j)); inmat.read((char*)&melem, sizeof (melem)); - ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); + m_ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); } } else if(msiz>0) { // square format @@ -858,26 +786,24 @@ StatusCode AlSpaMat::Read(const std::string &filename, int &dofs, bool &triang, for(int32_t i=0; i<msiz; i++) { for(int32_t j=0; j<msiz; j++) { inmat.read((char*)&melem, sizeof (melem)); - // std::cout << "AlSpaMat::Write: nelem = " << nelem << std::endl; if( i>=j && melem!=0. ) - ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); + m_ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); } } } else { // triangular format triang=true; msiz = (-1)*msiz; - // std::cout << "msiz=" << msiz << std::endl; for( int32_t i=0; i<msiz; i++) { for( int32_t j=0; j<=i; j++) { inmat.read((char*)&melem, sizeof (melem)); if( melem!=0. ) - ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); + m_ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); } } } - _nele = ptr_map.size(); + m_nele = m_ptr_map.size(); inmat.close(); return StatusCode::SUCCESS; } @@ -890,7 +816,7 @@ StatusCode AlSpaMat::ReadProjected(const std::string &filename, int &dofs, if(inmat.fail()) return StatusCode::FAILURE; - ptr_map.clear(); + m_ptr_map.clear(); int32_t msiz=0; int32_t nelem; @@ -899,7 +825,7 @@ StatusCode AlSpaMat::ReadProjected(const std::string &filename, int &dofs, dofs = msiz-1000000; else dofs = abs(msiz); - _size = dofs; + m_size = dofs; inmat.read((char*)&version, sizeof (version)); @@ -909,13 +835,12 @@ StatusCode AlSpaMat::ReadProjected(const std::string &filename, int &dofs, if(msiz>999999) { // sparse format triang=false; inmat.read((char*)&nelem, sizeof (nelem)); - _nele=nelem; -// std::cout << "AlSpaMat::Write: nelem = " << nelem << std::endl; + m_nele=nelem; for(int k=0; k<nelem; k++) { inmat.read((char*)&i, sizeof (i)); inmat.read((char*)&j, sizeof (j)); inmat.read((char*)&melem, sizeof (melem)); - ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); + m_ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); } } else if(msiz>0) { // square format @@ -924,24 +849,23 @@ StatusCode AlSpaMat::ReadProjected(const std::string &filename, int &dofs, for(int32_t j=0; j<msiz; j++) { inmat.read((char*)&melem, sizeof (melem)); if( i>=j && melem!=0. ) - ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); + m_ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); } } } else { // triangular format triang=true; msiz = (-1)*msiz; -// std::cout << "msiz=" << msiz << std::endl; for( int32_t i=0; i<msiz; i++) { for( int32_t j=0; j<=i; j++) { inmat.read((char*)&melem, sizeof (melem)); if( melem!=0. ) - ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); + m_ptr_map.insert(std::make_pair(std::make_pair(i,j), melem)); } } } - _nele = ptr_map.size(); + m_nele = m_ptr_map.size(); inmat.close(); return StatusCode::SUCCESS; } @@ -949,15 +873,15 @@ StatusCode AlSpaMat::ReadProjected(const std::string &filename, int &dofs, TMatrixDSparse* AlSpaMat::makeTMatrix() { - long int nonZeroElements = ptr_map.size(); + long int nonZeroElements = m_ptr_map.size(); int *irow = new int[nonZeroElements]; int *icol = new int[nonZeroElements]; double *val = new double[nonZeroElements]; long int i, j; long int counter(0); - const_mapiterator pos = ptr_map.begin(); - for(pos=ptr_map.begin(); pos!=ptr_map.end(); pos++){ + const_mapiterator pos = m_ptr_map.begin(); + for(pos=m_ptr_map.begin(); pos!=m_ptr_map.end(); pos++){ i = pos->first.first; j = pos->first.second; *(val+counter)=pos->second; @@ -966,9 +890,7 @@ TMatrixDSparse* AlSpaMat::makeTMatrix() counter++; } - std::cout << counter << " " << nonZeroElements << " size " << _size <<std::endl; - - TMatrixDSparse* myTMatrix = new TMatrixDSparse(0,_size-1,0,_size-1); + TMatrixDSparse* myTMatrix = new TMatrixDSparse(0,m_size-1,0,m_size-1); myTMatrix->SetMatrixArray(nonZeroElements,irow,icol,val); delete [] irow; diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSymMat.cxx b/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSymMat.cxx index c31c41e2ea5372400ad5c25c40e18f131f46bdfa..b63210ce40c59c064edbfb918a6327d407cc922f 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSymMat.cxx +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSymMat.cxx @@ -16,6 +16,7 @@ #include <math.h> #include <float.h> //for DBL_EPSILON #include <stdint.h> +#include <stdexcept> #include <TMatrixDSparse.h> @@ -38,10 +39,10 @@ namespace Trk { //______________________________________________________________________________ AlSymMat::AlSymMat() { - _matrix_type = 1; - _size = 0; - _nele = 0; - ptr_data = NULL; // set pointer to null + m_matrix_type = 1; + m_size = 0; + m_nele = 0; + m_ptr_data = nullptr; // set pointer to null m_pathbin="./"; m_pathtxt="./"; } @@ -50,15 +51,15 @@ AlSymMat::AlSymMat() //______________________________________________________________________________ AlSymMat::AlSymMat(long int N) { - _matrix_type = 1; - _size = N; - _nele = N*(N+1)/2; - ptr_data = new double[_nele]; + m_matrix_type = 1; + m_size = N; + m_nele = N*(N+1)/2; + m_ptr_data = new double[m_nele]; m_pathbin="./"; m_pathtxt="./"; - double* p = ptr_data + _nele; - while (p > ptr_data) *(--p) = 0.; + double* p = m_ptr_data + m_nele; + while (p > m_ptr_data) *(--p) = 0.; } @@ -66,12 +67,12 @@ AlSymMat::AlSymMat(long int N) AlSymMat::AlSymMat(const AlSymMat& m) : AlSymMatBase(m) { - _matrix_type = 1; - _size = m.size(); - _nele = m._nele; + m_matrix_type = 1; + m_size = m.size(); + m_nele = m.m_nele; m_pathbin = m.m_pathbin; m_pathtxt = m.m_pathtxt; - ptr_data = new double[_nele]; + m_ptr_data = new double[m_nele]; copy(m); } @@ -79,25 +80,25 @@ AlSymMat::AlSymMat(const AlSymMat& m) //______________________________________________________________________________ AlSymMat::AlSymMat(const AlSpaMat& m) { - _matrix_type = 1; - _size = m.size(); - _nele = _size*(_size+1)/2; + m_matrix_type = 1; + m_size = m.size(); + m_nele = m_size*(m_size+1)/2; m_pathbin = m.pathBin(); m_pathtxt = m.pathTxt(); - ptr_data = new double[_nele]; + m_ptr_data = new double[m_nele]; copy(m); } //______________________________________________________________________________ AlSymMat& AlSymMat::operator=(const AlSpaMat& m) { - _matrix_type = 1; - _size = m.size(); - _nele = _size*(_size+1)/2; + m_matrix_type = 1; + m_size = m.size(); + m_nele = m_size*(m_size+1)/2; m_pathbin = m.pathBin(); m_pathtxt = m.pathTxt(); - ptr_data = new double[_nele]; + m_ptr_data = new double[m_nele]; copy(m); return *this; } @@ -105,7 +106,7 @@ AlSymMat& AlSymMat::operator=(const AlSpaMat& m) //______________________________________________________________________________ AlSymMat::~AlSymMat() { - if( ptr_data != NULL ) delete [] ptr_data; + if( m_ptr_data != nullptr ) delete [] m_ptr_data; //ptr_map.clear(); } @@ -114,13 +115,12 @@ void AlSymMat::copy(const AlSymMat& m) { // this one implements the fast copy alg. if( size() != m.size()) { - std::cerr << "AlSymMat::copy: size do not match!" << std::endl; - return; + throw std::range_error( "AlSymMat::copy: size do not match!" ); } - double * p = ptr_data + _nele; - double* r = m.ptr_data + _nele; - while (p > ptr_data) *(--p) = *(--r); + double * p = m_ptr_data + m_nele; + double* r = m.m_ptr_data + m_nele; + while (p > m_ptr_data) *(--p) = *(--r); return; } @@ -130,8 +130,7 @@ void AlSymMat::copy(const AlSpaMat& m) { // if( size() != m.size()) { - std::cerr << "AlSymMat::copy: size do not match!" << std::endl; - return; + throw std::range_error( "AlSymMat::copy: size do not match!" ); } (*this) = 0.; @@ -152,8 +151,7 @@ void AlSymMat::copy(const AlMat& m) // copy the lower triangle only! int si = size(); if( si != m.nrow() || si != m.ncol() ) { - std::cerr << "AlSymMat::copy: sizes do not match!" << std::endl; - return; + throw std::range_error("AlSymMat::copy: sizes do not match!" ); } for( int i=0; i<si; i++ ) @@ -167,7 +165,7 @@ AlSymMat& AlSymMat::operator=(const AlSymMat& m) if (this==&m) return *this; - if ( ptr_data != m.ptr_data ) { + if ( m_ptr_data != m.m_ptr_data ) { reSize(m.size()); copy(m); } @@ -178,8 +176,7 @@ AlSymMat& AlSymMat::operator=(const AlSymMat& m) AlSymMat& AlSymMat::operator=(const AlMat& m) { if( m.nrow() != m.ncol() ) { - std::cerr << "AlSymMat::operator=: a squared matrix is required!" << std::endl; - return *this; + throw std::range_error( "AlSymMat::operator=: a squared matrix is required!" ); } reSize(m.nrow()); @@ -191,8 +188,8 @@ AlSymMat& AlSymMat::operator=(const AlMat& m) //______________________________________________________________________________ AlSymMat& AlSymMat::operator=(const double& d) { - double * p = ptr_data + _nele; - while (p > ptr_data) *(--p) = d; + double * p = m_ptr_data + m_nele; + while (p > m_ptr_data) *(--p) = d; return *this; } @@ -201,15 +198,14 @@ AlSymMat& AlSymMat::operator=(const double& d) AlSymMat AlSymMat::operator+(const AlSymMat& m) const { if( size() != m.size()) { - std::cerr << "AlSymMat::operator+: size do not match!" << std::endl; - return *this; + throw std::range_error( "AlSymMat::operator+: size do not match!" ); } AlSymMat b(size()); - double * p = ptr_data + _nele; - double * q = m.ptr_data + _nele; - double * r = b.ptr_data + _nele; - while (p > ptr_data) *(--r) = (*(--p))+(*(--q)); + double * p = m_ptr_data + m_nele; + double * q = m.m_ptr_data + m_nele; + double * r = b.m_ptr_data + m_nele; + while (p > m_ptr_data) *(--r) = (*(--p))+(*(--q)); return b; } @@ -218,13 +214,12 @@ AlSymMat AlSymMat::operator+(const AlSymMat& m) const AlSymMat& AlSymMat::operator+=(const AlSymMat& m) { if( size() != m.size()){ - std::cerr << "AlSymMat::operator+=: size do not match!" << std::endl; - return *this; + throw std::range_error( "AlSymMat::operator+=: size do not match!" ); } - double * p = ptr_data + _nele; - double * q = m.ptr_data + _nele; - while (p > ptr_data) *(--p) += *(--q); + double * p = m_ptr_data + m_nele; + double * q = m.m_ptr_data + m_nele; + while (p > m_ptr_data) *(--p) += *(--q); return *this; } @@ -233,15 +228,14 @@ AlSymMat& AlSymMat::operator+=(const AlSymMat& m) AlSymMat AlSymMat::operator-(const AlSymMat& m) const { if( size() != m.size()) { - std::cerr << "AlSymMat::operator-: size do not match!" << std::endl; - return *this; + throw std::range_error( "AlSymMat::operator-: size do not match!" ); } AlSymMat b(size()); - double * p = ptr_data + _nele; - double * q = m.ptr_data + _nele; - double * r = b.ptr_data + _nele; - while (p > ptr_data) *(--r) = (*(--p))-(*(--q)); + double * p = m_ptr_data + m_nele; + double * q = m.m_ptr_data + m_nele; + double * r = b.m_ptr_data + m_nele; + while (p > m_ptr_data) *(--r) = (*(--p))-(*(--q)); return b; } @@ -250,13 +244,12 @@ AlSymMat AlSymMat::operator-(const AlSymMat& m) const AlSymMat& AlSymMat::operator-=(const AlSymMat& m) { if( size() != m.size()) { - std::cerr << "AlSymMat::operator-=: size do not match!" << std::endl; - return *this; + throw std::range_error( "AlSymMat::operator-=: size do not match!" ); } - double * p = ptr_data + _nele; - double * q = m.ptr_data + _nele; - while (p > ptr_data) *(--p) -= *(--q); + double * p = m_ptr_data + m_nele; + double * q = m.m_ptr_data + m_nele; + while (p > m_ptr_data) *(--p) -= *(--q); return *this; } @@ -265,9 +258,7 @@ AlSymMat& AlSymMat::operator-=(const AlSymMat& m) AlMat AlSymMat::operator*(const AlSymMat& m) const { if( size() != m.size() ) { - std::cerr << "AlSymMat::operator*: size do not match!" << std::endl; - AlMat b( size(), m.size()); - return b; + throw std::range_error( "AlSymMat::operator*: size do not match!" ); } AlMat b( size(), size()); @@ -284,17 +275,17 @@ AlMat AlSymMat::operator*(const AlSymMat& m) const ii = (i+1)*i/2; jj = (j+1)*j/2; for( k=0; k<l; k++) - x += (*(ptr_data+ii+k))*(*(m.ptr_data+jj+k)); + x += (*(m_ptr_data+ii+k))*(*(m.m_ptr_data+jj+k)); if( i<j ) { for( k=l; k<n; k++) - x += (*(ptr_data+(k+1)*k/2+i))*(*(m.ptr_data+jj+k)); + x += (*(m_ptr_data+(k+1)*k/2+i))*(*(m.m_ptr_data+jj+k)); } else { for( k=l; k<n; k++) - x += (*(ptr_data+ii+k))*(*(m.ptr_data+(k+1)*k/2+j)); + x += (*(m_ptr_data+ii+k))*(*(m.m_ptr_data+(k+1)*k/2+j)); } for( k=n; k<siz; k++) - x += (*(ptr_data+(k+1)*k/2+i))*(*(m.ptr_data+(k+1)*k/2+j)); + x += (*(m_ptr_data+(k+1)*k/2+i))*(*(m.m_ptr_data+(k+1)*k/2+j)); b.elemr(i,j) = x; } @@ -305,8 +296,7 @@ AlMat AlSymMat::operator*(const AlSymMat& m) const AlMat AlSymMat::operator*(const AlMat& m) const { if( size() != m.nrow() ) { - std::cerr << "AlSymMat::operator*: size do not match!" << std::endl; - return m; + throw std::range_error("AlSymMat::operator*: size do not match!" ); } AlMat b( size(), m.ncol()); @@ -321,9 +311,9 @@ AlMat AlSymMat::operator*(const AlMat& m) const x = 0.; ii = (i+1)*i/2; for( k=0; k<i; k++) - x += (*(ptr_data+ii+k))*m.elemc(k,j); + x += (*(m_ptr_data+ii+k))*m.elemc(k,j); for( k=i; k<siz; k++) - x += (*(ptr_data+(k+1)*k/2+i))*m.elemc(k,j); + x += (*(m_ptr_data+(k+1)*k/2+i))*m.elemc(k,j); b.elemr(i,j) = x; } @@ -334,8 +324,7 @@ AlMat AlSymMat::operator*(const AlMat& m) const AlVec AlSymMat::operator*(const AlVec& v) const { if( size() != v.size() ) { - std::cerr << "AlSymMat::operator*: size do not match! " << std::endl; - return v; + throw std::range_error( "AlSymMat::operator*: size do not match! " ); } AlVec b(size()); @@ -345,9 +334,9 @@ AlVec AlSymMat::operator*(const AlVec& v) const for( long int i=0; i<size(); i++ ) { ii = (i+1)*i/2; for( long int j=0; j<i; j++ ) - b[i] += (*(ptr_data+ii+j))*v[j]; + b[i] += (*(m_ptr_data+ii+j))*v[j]; for( long int j=i; j<size(); j++ ) - b[i] += (*(ptr_data+(j+1)*j/2+i))*v[j]; + b[i] += (*(m_ptr_data+(j+1)*j/2+i))*v[j]; } return b; @@ -356,8 +345,8 @@ AlVec AlSymMat::operator*(const AlVec& v) const //______________________________________________________________________________ AlSymMat& AlSymMat::operator*=(const double& d) { - double * p = ptr_data + _nele; - while (p > ptr_data) *(--p) *= d; + double * p = m_ptr_data + m_nele; + while (p > m_ptr_data) *(--p) *= d; return *this; } @@ -366,9 +355,9 @@ AlSymMat& AlSymMat::operator*=(const double& d) AlSymMat AlSymMat::operator*(const double& d) const { AlSymMat a(size()); - double * p = ptr_data + _nele; - double * q = a.ptr_data + _nele; - while (p > ptr_data) *(--q) = (*(--p))*d; + double * p = m_ptr_data + m_nele; + double * q = a.m_ptr_data + m_nele; + while (p > m_ptr_data) *(--q) = (*(--p))*d; return a; } @@ -387,7 +376,7 @@ int AlSymMat::invert() int N = size(); int * ipiv = new int[N]; double * work = new double[N]; - double * mx = ptr_data; + double * mx = m_ptr_data; dsptrf_(&uplo, &N, mx, ipiv, &ierr); @@ -475,7 +464,7 @@ int AlSymMat::diagonalize(char jobz, AlVec &w, AlMat &z) int N = size(); double * work = new double[3*N]; - double * ap = ptr_data; + double * ap = m_ptr_data; dspev_(&jobz, &uplo, &N, ap, w.ptrData(), z.ptrData(), &N, work, &info); @@ -494,12 +483,12 @@ void AlSymMat::RemoveModule(int index) for(int row=(shift*index); row<(size()-shift); row+=shift) { for(int k=0; k<shift; k++) { for(int col=0; col<row+k+1; col++) { - // cout << "(" << row+k << "," << col << ") -> " << *(ptr_data+elem(row+k,col)) << endl; + // cout << "(" << row+k << "," << col << ") -> " << *(m_ptr_data+elem(row+k,col)) << endl; if(col<shift*index) - *(ptr_data+elem(row+k,col))=*(ptr_data+elem(row+k+shift,col)); + *(m_ptr_data+elem(row+k,col))=*(m_ptr_data+elem(row+k+shift,col)); else - *(ptr_data+elem(row+k,col))=*(ptr_data+elem(row+k+shift,col+shift)); + *(m_ptr_data+elem(row+k,col))=*(m_ptr_data+elem(row+k+shift,col+shift)); } } } @@ -512,12 +501,10 @@ int AlSymMat::RemoveCollsRows(std::vector<int> indices) { int n = indices.size(); if (n==0) { - std::cerr<<"Vector of indices to remove is empty."<<std::endl; - return _size; + return m_size; } - if (n>_size) { - std::cerr<<"Vector of indices larger than matrix size."<<std::endl; - return _size; + if (n>m_size) { + throw std::range_error("Vector of indices larger than matrix size."); } // first sort the list of indices descending @@ -533,22 +520,21 @@ int AlSymMat::RemoveCollsRows(std::vector<int> indices) // remove rows and columns starting from largest indices for (int i=0;i<n;i++) { int index = indices[i]; - if (index > _size-1) { - std::cerr<<"Index "<<index<<" goes beyond matrix (size "<<_size<<")."<<std::endl; - continue; + if (index > m_size-1) { + throw std::out_of_range("AlSymMat::RemoveCollsRows: Index goes beyond matrix."); } - for (int j=index; j<_size-1; j++) + for (int j=index; j<m_size-1; j++) for (int col=0; col<=j; col++) if(col<index) - *(ptr_data+elem(j,col)) = *(ptr_data+elem(j+1,col)); + *(m_ptr_data+elem(j,col)) = *(m_ptr_data+elem(j+1,col)); else - *(ptr_data+elem(j,col)) = *(ptr_data+elem(j+1,col+1)); + *(m_ptr_data+elem(j,col)) = *(m_ptr_data+elem(j+1,col+1)); - _size--; + m_size--; } - return _size; + return m_size; } //______________________________________________________________________________ @@ -577,7 +563,7 @@ void AlSymMat::RemoveAlignPar(int index, int control) counterCol=0; } - *(ptr_data+elem(row,col))=*(ptr_data+elem(row+shiftRow,col+shiftCol)); + *(m_ptr_data+elem(row,col))=*(m_ptr_data+elem(row+shiftRow,col+shiftCol)); counterCol++; if (counterCol==5-control) { @@ -639,7 +625,7 @@ StatusCode AlSymMat::Write(const std::string &filename, bool binary, if (!square) { for( int i=0; i<size(); i++) { for( int j=0; j<=i; j++) { - melem = *(ptr_data+(i+1)*i/2+j); + melem = *(m_ptr_data+(i+1)*i/2+j); if(binary) outmat.write((char*)&(melem), sizeof (melem)); else @@ -652,8 +638,8 @@ StatusCode AlSymMat::Write(const std::string &filename, bool binary, else { for( int i=0; i<size(); i++) { for( int j=0; j<size(); j++) { - if(i>=j) melem = *(ptr_data+(i+1)*i/2+j); - else melem = *(ptr_data+(j+1)*j/2+i); + if(i>=j) melem = *(m_ptr_data+(i+1)*i/2+j); + else melem = *(m_ptr_data+(j+1)*j/2+i); if(binary) outmat.write((char*)&(melem), sizeof (melem)); else @@ -709,7 +695,7 @@ StatusCode AlSymMat::Read(const std::string &filename, int &dofs, int32_t msiz=0; inmat.read((char*)&msiz, sizeof (msiz)); dofs = abs(msiz); - _size = abs(msiz); + m_size = abs(msiz); if (m_StdUnits) inmat.read((char*)&version, sizeof (version)); @@ -722,7 +708,7 @@ StatusCode AlSymMat::Read(const std::string &filename, int &dofs, for(int j=0; j<msiz; j++) { inmat.read((char*)&melem, sizeof (melem)); if( i>=j ) - *(ptr_data+(i+1)*i/2+j) = melem; + *(m_ptr_data+(i+1)*i/2+j) = melem; } } } @@ -733,7 +719,7 @@ StatusCode AlSymMat::Read(const std::string &filename, int &dofs, for( int i=0; i<msiz; i++) { for( int j=0; j<=i; j++) { inmat.read((char*)&melem, sizeof (melem)); - *(ptr_data+(i+1)*i/2+j) = melem; + *(m_ptr_data+(i+1)*i/2+j) = melem; } } } @@ -753,7 +739,7 @@ StatusCode AlSymMat::ReadProjected(const std::string &filename, int &dofs, int32_t msiz=0; inmat.read((char*)&msiz, sizeof (msiz)); dofs = abs(msiz); - _size = abs(msiz); + m_size = abs(msiz); inmat.read((char*)&version, sizeof (version)); @@ -765,7 +751,7 @@ StatusCode AlSymMat::ReadProjected(const std::string &filename, int &dofs, for(int j=0; j<msiz; j++) { inmat.read((char*)&melem, sizeof (melem)); if( i>=j ) - *(ptr_data+(i+1)*i/2+j) = melem; + *(m_ptr_data+(i+1)*i/2+j) = melem; } } } @@ -776,7 +762,7 @@ StatusCode AlSymMat::ReadProjected(const std::string &filename, int &dofs, for( int i=0; i<msiz; i++) { for( int j=0; j<=i; j++) { inmat.read((char*)&melem, sizeof (melem)); - *(ptr_data+(i+1)*i/2+j) = melem; + *(m_ptr_data+(i+1)*i/2+j) = melem; } } } @@ -789,18 +775,18 @@ StatusCode AlSymMat::ReadProjected(const std::string &filename, int &dofs, void AlSymMat::reSize(long int Nnew) { if ( Nnew != size() ) { - double * p = ptr_data; + double * p = m_ptr_data; long int ii; - _nele = Nnew*(Nnew+1)/2; - ptr_data = new double[_nele]; + m_nele = Nnew*(Nnew+1)/2; + m_ptr_data = new double[m_nele]; long int Size_old = size(); - _size = Nnew; + m_size = Nnew; long int k = size() <= Size_old ? size() : Size_old; for( long int i=0; i<k; i++ ) { ii = (i+1)*i/2; for( long int j=0; j<=i; j++ ) - *(ptr_data+ii+j) = *(p+ii+j); + *(m_ptr_data+ii+j) = *(p+ii+j); } delete [] p; } @@ -811,26 +797,22 @@ double& AlSymMat::elemr(long int i,long int j) { #ifdef _DEBUG if( i<0 ) { - std::cerr << "AlSymMat::elemr: Index 1 < zero! " << i << std::endl; - return *(ptr_data); + throw std::underflow_error( "AlSymMat::elemr: Index 1 < zero!" ); } if( i>=size() ) { - std::cerr << "AlSymMat::elemr: Index 1 too large! " << i << std::endl; - return *(ptr_data); + throw std::overflow_error( "AlSymMat::elemr: Index 1 too large!" ); } if( j<0 ) { - std::cerr << "AlSymMat::elemr: Index 2 < zero! " << j << std::endl; - return *(ptr_data); + throw std::underflow_error( "AlSymMat::elemr: Index 2 < zero!" ); } if( j>=size() ) { - std::cerr << "AlSymMat::elemr: Index 2 too large! " << j << std::endl; - return *(ptr_data); + throw std::overflow_error( "AlSymMat::elemr: Index 2 too large!" ); } #endif if( j<=i ) - return *(ptr_data+(i+1)*i/2+j); + return *(m_ptr_data+(i+1)*i/2+j); - return *(ptr_data+(j+1)*j/2+i); + return *(m_ptr_data+(j+1)*j/2+i); } //______________________________________________________________________________ @@ -838,26 +820,22 @@ double AlSymMat::elemc(long int i,long int j) const { #ifdef _DEBUG if( i<0 ) { - std::cerr << "AlSymMat::elemc: Index 1 < zero! " << i << std::endl; - return *(ptr_data); + throw std::underflow_error( "AlSymMat::elemc: Index 1 < zero!" ); } if( i>=size() ) { - std::cerr << "AlSymMat::elemc: Index 1 too large! " << i << std::endl; - return *(ptr_data); + throw std::overflow_error( "AlSymMat::elemc: Index 1 too large!" ); } if( j<0 ) { - std::cerr << "AlSymMat::elemc: Index 2 < zero! " << j << std::endl; - return *(ptr_data); + throw std::underflow_error( "AlSymMat::elemc: Index 2 < zero!" ); } if( j>=size() ) { - std::cerr << "AlSymMat::elemc: Index 2 too large! " << j << std::endl; - return *(ptr_data); + throw std::overflow_error( "AlSymMat::elemc: Index 2 too large!" ); } #endif if( j<=i ) - return *(ptr_data+(i+1)*i/2+j); + return *(m_ptr_data+(i+1)*i/2+j); - return *(ptr_data+(j+1)*j/2+i); + return *(m_ptr_data+(j+1)*j/2+i); } @@ -869,7 +847,7 @@ TMatrixDSparse* AlSymMat::makeTMatrix(){ for( int i=0; i<si; i++ ) for( int j=0; j<=i; j++ ) - if( *(ptr_data+(i+1)*i/2+j) != 0 ) + if( *(m_ptr_data+(i+1)*i/2+j) != 0 ) ++nnz; @@ -880,10 +858,10 @@ TMatrixDSparse* AlSymMat::makeTMatrix(){ for (int i=0;i<si;i++) { for (int j=0;j<=i;j++) { - if ( *(ptr_data+(i+1)*i/2+j) != 0.) { + if ( *(m_ptr_data+(i+1)*i/2+j) != 0.) { irow[n] = i; icol[n] = j; - val[n] = *(ptr_data+(i+1)*i/2+j); + val[n] = *(m_ptr_data+(i+1)*i/2+j); ++n; } } diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSymMatBase.cxx b/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSymMatBase.cxx index 2da1a90f68af883201cdc8cd59f6a50fc27f5d59..f5c61b7a228f743ebcffbfe7b0e67476896af7da 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSymMatBase.cxx +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlSymMatBase.cxx @@ -19,26 +19,26 @@ namespace Trk { //______________________________________________________________________________ AlSymMatBase::AlSymMatBase() { - _matrix_type = 0; - _size = 0; - _nele = 0; + m_matrix_type = 0; + m_size = 0; + m_nele = 0; } //______________________________________________________________________________ AlSymMatBase::AlSymMatBase(long int N) { - _matrix_type = 0; - _size = N; - _nele = N*(N+1)/2; + m_matrix_type = 0; + m_size = N; + m_nele = N*(N+1)/2; } //______________________________________________________________________________ AlSymMatBase::AlSymMatBase(const AlSymMatBase & m) { - _matrix_type = 0; - _size = m.size(); - _nele = m._nele; + m_matrix_type = 0; + m_size = m.size(); + m_nele = m.m_nele; } //______________________________________________________________________________ @@ -46,8 +46,8 @@ AlSymMatBase & AlSymMatBase::operator=(const AlSymMatBase & m) { if (this==&m) return *this; - _matrix_type=m._matrix_type; - _nele=m._nele; + m_matrix_type=m.m_matrix_type; + m_nele=m.m_nele; return *this; } diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlVec.cxx b/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlVec.cxx index 35b3893858a21e1719309d26efb7aa5d74167514..ccdafd5be070a1508e4b60be39622e63f0544520 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlVec.cxx +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/src/AlVec.cxx @@ -12,34 +12,35 @@ #include <fstream> #include <stdint.h> #include <math.h> +#include <exception> namespace Trk { //______________________________________________________________________________ AlVec::AlVec() { - _size = 0; - ptr_data = 0; // set pointer to null + m_size = 0; + m_ptr_data = 0; // set pointer to null m_pathbin="./"; m_pathtxt="./"; } //______________________________________________________________________________ AlVec::AlVec(int N) { - _size = N; - ptr_data = new double[_size]; + m_size = N; + m_ptr_data = new double[m_size]; m_pathbin="./"; m_pathtxt="./"; - double* p = ptr_data + _size; - while (p > ptr_data) *(--p) = 0.; + double* p = m_ptr_data + m_size; + while (p > m_ptr_data) *(--p) = 0.; } //______________________________________________________________________________ AlVec::AlVec(const AlVec& v) { - _size = v._size; + m_size = v.m_size; m_pathbin = v.m_pathbin; m_pathtxt = v.m_pathtxt; - ptr_data = new double[_size]; + m_ptr_data = new double[m_size]; copy(v); } @@ -47,26 +48,25 @@ AlVec::AlVec(const AlVec& v) { //______________________________________________________________________________ AlVec::~AlVec() { - delete [] ptr_data; + delete [] m_ptr_data; } //______________________________________________________________________________ void AlVec::copy(const AlVec& v) { - if(_size!=v._size) { - std::cerr << "AlVec Assignment: size does not match!" << std::endl; - return; + if(m_size!=v.m_size) { + throw std::range_error( "AlVec Assignment: size does not match!" ); } - double* p = ptr_data + _size; - double* q = v.ptr_data + _size; - while (p > ptr_data) *(--p) = (*(--q)); + double* p = m_ptr_data + m_size; + double* q = v.m_ptr_data + m_size; + while (p > m_ptr_data) *(--p) = (*(--q)); } //______________________________________________________________________________ AlVec& AlVec::operator=(const double& d) { - double* p = ptr_data + _size; - while (p > ptr_data) *(--p) = d; + double* p = m_ptr_data + m_size; + while (p > m_ptr_data) *(--p) = d; return *this; } @@ -75,74 +75,69 @@ AlVec& AlVec::operator=(const double& d) { AlVec& AlVec::operator=(const AlVec& v) { if (this==&v) return *this; - if(_size!=0 && _size!=v._size) { - std::cerr << "AlVec Assignment: size does not match!" << std::endl; - return *this; + if(m_size!=0 && m_size!=v.m_size) { + throw std::range_error( "AlVec Assignment: size does not match!" ); } - if ( ptr_data != v.ptr_data ) copy(v); + if ( m_ptr_data != v.m_ptr_data ) copy(v); return *this; } //______________________________________________________________________________ AlVec AlVec::operator+(const AlVec& v) const { - if( _size != v._size ) { - std::cerr << "operator+: vectors size does not match!" << std::endl; - return *this; + if( m_size != v.m_size ) { + throw std::range_error( "operator+: vectors size does not match!" ); } - AlVec b(_size); + AlVec b(m_size); - double* p = ptr_data + _size; - double* q = v.ptr_data + _size; - double* r = b.ptr_data + _size; - while (p > ptr_data) *(--r) = (*(--p))+(*(--q)); + double* p = m_ptr_data + m_size; + double* q = v.m_ptr_data + m_size; + double* r = b.m_ptr_data + m_size; + while (p > m_ptr_data) *(--r) = (*(--p))+(*(--q)); return b; } //______________________________________________________________________________ AlVec& AlVec::operator+=(const AlVec& v) { - if( _size != v._size ) { - std::cerr << "operator+=: vectors size does not match!" << std::endl; - return *this; + if( m_size != v.m_size ) { + throw std::range_error( "operator+=: vectors size does not match!" ); } - double* p = ptr_data + _size; - double* q = v.ptr_data + _size; - while (p > ptr_data) *(--p) += (*(--q)); + double* p = m_ptr_data + m_size; + double* q = v.m_ptr_data + m_size; + while (p > m_ptr_data) *(--p) += (*(--q)); return *this; } //______________________________________________________________________________ AlVec AlVec::operator-(const AlVec& v) const { - if( _size != v._size ) { - std::cerr << "operator-: vectors size does not match!" << std::endl; - return *this; + if( m_size != v.m_size ) { + throw std::range_error( "operator-: vectors size does not match!" ); } - AlVec b(_size); + AlVec b(m_size); - double* p = ptr_data + _size; - double* q = v.ptr_data + _size; - double* r = b.ptr_data + _size; - while (p > ptr_data) *(--r) = (*(--p))-(*(--q)); + double* p = m_ptr_data + m_size; + double* q = v.m_ptr_data + m_size; + double* r = b.m_ptr_data + m_size; + while (p > m_ptr_data) *(--r) = (*(--p))-(*(--q)); return b; } //______________________________________________________________________________ AlVec& AlVec::operator-=(const AlVec& v) { - if( _size != v._size ) { - std::cerr << "operator+=: vectors size does not match!" << std::endl; - return *this; + if( m_size != v.m_size ) { + throw std::range_error( "operator+=: vectors size does not match!" ); } - double* p = ptr_data + _size; - double* q = v.ptr_data + _size; - while (p > ptr_data) *(--p) -= (*(--q)); + double* p = m_ptr_data + m_size; + double* q = v.m_ptr_data + m_size; + while (p > m_ptr_data) *(--p) -= (*(--q)); return *this; } @@ -150,44 +145,41 @@ AlVec& AlVec::operator-=(const AlVec& v) { //______________________________________________________________________________ double AlVec::operator*(const AlVec& v) const { double b=0.; - if( _size != v._size ) { - std::cerr << "scalar product: vectors size does not match!" << std::endl; - return b; + if( m_size != v.m_size ) { + throw std::range_error( "scalar product: vectors size does not match!" ); } - double* p = ptr_data + _size; - double* q = v.ptr_data + _size; - while (p > ptr_data) b += *(--p)*(*(--q)); + double* p = m_ptr_data + m_size; + double* q = v.m_ptr_data + m_size; + while (p > m_ptr_data) b += *(--p)*(*(--q)); return b; } //______________________________________________________________________________ AlVec AlVec::operator*(const AlMat& m) const { - if (_size != m.nrow()) { - std::cerr << "Left hand vector-matrix multiplication: size does not match!" << std::endl; - return *this; + if (m_size != m.nrow()) { + throw std::range_error( "Left hand vector-matrix multiplication: size does not match!" ); } AlVec b(m.ncol()); for (int i=0;i<m.ncol();i++) { - for (int j=0;j<_size;j++) *(b.ptr_data+i) += *(ptr_data+j)*m.elemc(j, i); + for (int j=0;j<m_size;j++) *(b.m_ptr_data+i) += *(m_ptr_data+j)*m.elemc(j, i); } return b; } //______________________________________________________________________________ AlVec AlVec::operator*(const AlSymMatBase& m) const { - if (_size != m.size()) { - std::cerr << "Left hand vector-matrix multiplication: size does not match!" << std::endl; - return *this; + if (m_size != m.size()) { + throw std::range_error( "Left hand vector-matrix multiplication: size does not match!" ); } - AlVec b(_size); + AlVec b(m_size); - for (int i=0;i<_size;i++) { - for (int j=0;j<_size;j++) *(b.ptr_data+i) += *(ptr_data+j)*m.elemc(j, i); + for (int i=0;i<m_size;i++) { + for (int j=0;j<m_size;j++) *(b.m_ptr_data+i) += *(m_ptr_data+j)*m.elemc(j, i); } return b; } @@ -195,8 +187,8 @@ AlVec AlVec::operator*(const AlSymMatBase& m) const { //______________________________________________________________________________ AlVec& AlVec::operator*=(const double& d) { - double* p = ptr_data + _size; - while (p > ptr_data) *(--p) *= d; + double* p = m_ptr_data + m_size; + while (p > m_ptr_data) *(--p) *= d; return *this; } @@ -207,8 +199,8 @@ AlVec& AlVec::operator*=(const double& d) { double AlVec::norm() const { double result(0.); - double * p = ptr_data + _size; - while (p > ptr_data) { + double * p = m_ptr_data + m_size; + while (p > m_ptr_data) { --p; result += *p * *p ; } @@ -218,16 +210,16 @@ double AlVec::norm() const { //______________________________________________________________________________ void AlVec::reSize(int Nnew) { - if ( Nnew>=0 && Nnew != _size ) { - double* p = ptr_data; - int _size_old = _size; - ptr_data = new double[Nnew]; - _size = Nnew; - int k = _size <= _size_old ? _size : _size_old; + if ( Nnew>=0 && Nnew != m_size ) { + double* p = m_ptr_data; + int m_size_old = m_size; + m_ptr_data = new double[Nnew]; + m_size = Nnew; + int k = m_size <= m_size_old ? m_size : m_size_old; p += k; - double* q = ptr_data + k; - while (q > ptr_data) *(--q) = *(--p); + double* q = m_ptr_data + k; + while (q > m_ptr_data) *(--q) = *(--p); delete [] p; } @@ -239,9 +231,9 @@ void AlVec::RemoveModule(int index) { const int shift=6; const int start = shift*index; - if(start<_size && index>=0){ - for(int row=start; row<_size; row++) { - *(ptr_data+row)=*(ptr_data+row+shift); + if(start<m_size && index>=0){ + for(int row=start; row<m_size; row++) { + *(m_ptr_data+row)=*(m_ptr_data+row+shift); } } } @@ -256,8 +248,8 @@ void AlVec::RemoveAlignPar(int index, int control) index = index-control; // std::cout << "index: " << index << " - control: " << control << std::endl; - for(int row=index; row<_size; row++) { - *(ptr_data+row) = *(ptr_data+row+shift); + for(int row=index; row<m_size; row++) { + *(m_ptr_data+row) = *(m_ptr_data+row+shift); counter++; if (counter==5-control) { counter=0; shift++; } } @@ -268,12 +260,10 @@ int AlVec::RemoveElements(std::vector<int> indices) { int n = indices.size(); if (n==0) { - std::cerr<<"Vector of indices to remove is empty."<<std::endl; - return _size; + return m_size; } - if (n>_size) { - std::cerr<<"Vector of indices larger than matrix size."<<std::endl; - return _size; + if (n>m_size) { + throw std::range_error( "Vector of indices larger than matrix size." ); } // first sort the list of indices descending @@ -289,18 +279,18 @@ int AlVec::RemoveElements(std::vector<int> indices) // remove elements starting from largest indices for (int i=0;i<n;i++) { int index = indices[i]; - if (index > _size-1) { - std::cerr<<"Index "<<index<<" goes beyond matrix (size "<<_size<<")."<<std::endl; + if (index > m_size-1) { + throw std::out_of_range( "AlVec::RemoveElements: Index goes beyond matrix " ); continue; } - for (int j=index; j<_size-1; j++) - *(ptr_data+j) = *(ptr_data+j+1); + for (int j=index; j<m_size-1; j++) + *(m_ptr_data+j) = *(m_ptr_data+j+1); - _size--; + m_size--; } - return _size; + return m_size; } //______________________________________________________________________________ @@ -320,7 +310,7 @@ StatusCode AlVec::Write(const std::string &filename, bool binary, double scale, std::map<int,unsigned long long> moduleIndexMap, float version) { std::ofstream outvec; - int32_t io_size=_size; + int32_t io_size=m_size; // int32_t io_scale=scale; if(binary) { @@ -338,7 +328,7 @@ StatusCode AlVec::Write(const std::string &filename, bool binary, double scale, outvec.setf(std::ios::fixed); outvec.setf(std::ios::showpoint); outvec.precision(6); - outvec << "DoF: " << std::setw(6) << _size << std::endl; + outvec << "DoF: " << std::setw(6) << m_size << std::endl; outvec << "scale: " << std::setw(18) << scale << std::endl; outvec << "AlVec version: " << std::setw(6) << version << std::endl; } @@ -347,13 +337,13 @@ StatusCode AlVec::Write(const std::string &filename, bool binary, double scale, double velem=0; std::map<int,unsigned long long>::iterator itcod; - for( int i=0; i<_size; i++) { + for( int i=0; i<m_size; i++) { itcod=moduleIndexMap.find(i/6); if (itcod != moduleIndexMap.end()) { ielem = (itcod->second); } - velem = *(ptr_data+i); + velem = *(m_ptr_data+i); if(binary){ outvec.write((char*)&(ielem), sizeof (ielem)); @@ -373,7 +363,7 @@ StatusCode AlVec::WritePartial(const std::string &filename, bool binary, double std::ofstream outvec; /* - int32_t io_size=_size; + int32_t io_size=m_size; // int32_t io_scale=scale; if(binary) { @@ -392,7 +382,7 @@ StatusCode AlVec::WritePartial(const std::string &filename, bool binary, double outvec.setf(std::ios::fixed); outvec.setf(std::ios::showpoint); outvec.precision(6); - outvec << "DoF: " << std::setw(6) << _size << std::endl; + outvec << "DoF: " << std::setw(6) << m_size << std::endl; outvec << "scale: " << std::setw(18) << scale << std::endl; outvec << "AlVec version: " << std::setw(6) << version << std::endl; } @@ -405,12 +395,12 @@ StatusCode AlVec::WritePartial(const std::string &filename, bool binary, double double velem=0; std::map<int,unsigned long long>::iterator itcod; - for( int i=0; i<_size; i++) { + for( int i=0; i<m_size; i++) { itcod=moduleIndexMap.find(i); if (itcod != moduleIndexMap.end()) ielem = (itcod->second); - velem = *(ptr_data+i); + velem = *(m_ptr_data+i); if(binary){ outvec.write((char*)&(ielem), sizeof (ielem)); @@ -436,13 +426,13 @@ StatusCode AlVec::WritePartial(const std::string &filename, bool binary, double double velem=0; std::map<int,std::string>::iterator itcod; - for( int i=0; i<_size; i++) { + for( int i=0; i<m_size; i++) { itcod=moduleNameMap.find(i); if (itcod != moduleNameMap.end()) { elem = (itcod->second); } - velem = *(ptr_data+i); + velem = *(m_ptr_data+i); if(binary){ std::cout<<"can't write module name in binary output!"<<std::endl; @@ -459,7 +449,7 @@ StatusCode AlVec::WritePartial(const std::string &filename, bool binary, double StatusCode AlVec::InitializeOutputVector(const std::string& filename, bool binary, double scale, float version, std::ofstream& outvec) { - int32_t io_size=_size; + int32_t io_size=m_size; if(binary) { outvec.open((m_pathbin+filename).c_str(), std::ios::binary); @@ -477,7 +467,7 @@ StatusCode AlVec::InitializeOutputVector(const std::string& filename, bool binar outvec.setf(std::ios::fixed); outvec.setf(std::ios::showpoint); outvec.precision(6); - outvec << "DoF: " << std::setw(6) << _size << std::endl; + outvec << "DoF: " << std::setw(6) << m_size << std::endl; outvec << "scale: " << std::setw(18) << scale << std::endl; outvec << "AlVec version: " << std::setw(6) << version << std::endl; } @@ -490,19 +480,19 @@ StatusCode AlVec::ReadPartial(const std::string &filename, double &scale, { bool m_StdUnits = true; if (StatusCode::SUCCESS != CheckVecVersion(m_pathbin+filename, m_StdUnits)) { - std::cout<<"CheckVecVersion failed"<<std::endl; + //std::cout<<"CheckVecVersion failed"<<std::endl; return StatusCode::FAILURE; } std::ifstream invec((m_pathbin+filename).c_str(), std::ios::binary); if(invec.fail()) { - std::cout<<"ifstream failed"<<std::endl; + //std::cout<<"ifstream failed"<<std::endl; return StatusCode::FAILURE; } int32_t vsiz=0; invec.read((char*)&vsiz, sizeof (vsiz)); - _size = vsiz; + m_size = vsiz; // int32_t io_scale; invec.read((char*)&scale, sizeof(scale)); @@ -517,12 +507,12 @@ StatusCode AlVec::ReadPartial(const std::string &filename, double &scale, int64_t ielem=0; double velem=0.0; - for( int i=0; i<_size; i++) { + for( int i=0; i<m_size; i++) { invec.read((char*)&ielem, sizeof (ielem)); modmap[i] = ielem; invec.read((char*)&velem, sizeof (velem)); - *(ptr_data+i) = velem; + *(m_ptr_data+i) = velem; // std::cout << "AlVec (" << i << "):: " << ielem << ", " << velem << std::endl; @@ -568,7 +558,7 @@ StatusCode AlVec::Read(const std::string &filename, double &scale, bool m_StdUnits = true; if (StatusCode::SUCCESS != CheckVecVersion(m_pathbin+filename, m_StdUnits)) { - std::cout<<"CheckVecVersion failed"<<std::endl; + //std::cout<<"CheckVecVersion failed"<<std::endl; return StatusCode::FAILURE; } @@ -578,8 +568,8 @@ StatusCode AlVec::Read(const std::string &filename, double &scale, int32_t vsiz=0; invec.read((char*)&vsiz, sizeof (vsiz)); - _size = vsiz; -// std::cout<<"size="<<_size<<std::endl; + m_size = vsiz; +// std::cout<<"size="<<m_size<<std::endl; // int32_t io_scale; invec.read((char*)&scale, sizeof (scale)); @@ -595,12 +585,12 @@ StatusCode AlVec::Read(const std::string &filename, double &scale, int64_t ielem=0; double velem=0.0; - for( int i=0; i<_size; i++) { + for( int i=0; i<m_size; i++) { invec.read((char*)&ielem, sizeof (ielem)); modmap[i/6] = ielem; invec.read((char*)&velem, sizeof (velem)); - *(ptr_data+i) = velem; + *(m_ptr_data+i) = velem; // std::cout << "AlVec (" << i << "):: " << ielem << ", " << velem << std::endl; @@ -620,7 +610,7 @@ StatusCode AlVec::ReadProjected(const std::string &filename, double &scale, int32_t vsiz=0; invec.read((char*)&vsiz, sizeof (vsiz)); - _size = vsiz; + m_size = vsiz; // int32_t io_scale; invec.read((char*)&scale, sizeof (scale)); @@ -633,12 +623,12 @@ StatusCode AlVec::ReadProjected(const std::string &filename, double &scale, int64_t ielem=0; double velem=0.0; - for( int i=0; i<_size; i++) { + for( int i=0; i<m_size; i++) { invec.read((char*)&ielem, sizeof (ielem)); modmap[i/6] = ielem; invec.read((char*)&velem, sizeof (velem)); - *(ptr_data+i) = velem; + *(m_ptr_data+i) = velem; // std::cout << "AlVec (" << i << "):: " << ielem << ", " << velem << std::endl; @@ -656,13 +646,13 @@ StatusCode AlVec::ReadScalaPack(const std::string &filename){ int32_t vsiz=0; eigenvec.read((char*)&vsiz, sizeof (vsiz)); - _size=vsiz; + m_size=vsiz; double velem=0; - for( int i=0; i<_size; i++) { + for( int i=0; i<m_size; i++) { eigenvec.read((char*)&velem, sizeof (velem)); // printf("v[%d] = %.16lf \n",i,velem); - *(ptr_data+i) = velem; + *(m_ptr_data+i) = velem; } eigenvec.close(); @@ -673,7 +663,7 @@ StatusCode AlVec::ReadScalaPack(const std::string &filename){ StatusCode AlVec::WriteEigenvalueVec(const std::string &filename, bool binary){ std::ofstream outvec; - int32_t io_size=_size; + int32_t io_size=m_size; if(binary) { outvec.open((m_pathbin+filename).c_str(), std::ios::binary); @@ -692,16 +682,16 @@ StatusCode AlVec::WriteEigenvalueVec(const std::string &filename, bool binary){ outvec.setf(std::ios::fixed); outvec.setf(std::ios::showpoint); outvec.precision(6); - outvec << "AlVec::DoF: " << std::setw(6) << _size << std::endl; + outvec << "AlVec::DoF: " << std::setw(6) << m_size << std::endl; } //jlove int32_t ielem=0; double velem=0; // std::map<int,int>::iterator itcod; - for( int i=0; i<_size; i++) { + for( int i=0; i<m_size; i++) { - velem = *(ptr_data+i); + velem = *(m_ptr_data+i); if(binary) outvec.write((char*)&(velem), sizeof (velem)); diff --git a/Tracking/TrkAlignment/TrkAlgebraUtils/src/IntVec.cxx b/Tracking/TrkAlignment/TrkAlgebraUtils/src/IntVec.cxx index d52767e7b634075cb02dccb4af6c4029dcaaba60..b9dbfde12b1b14e0993986a83f0721366c82460a 100644 --- a/Tracking/TrkAlignment/TrkAlgebraUtils/src/IntVec.cxx +++ b/Tracking/TrkAlignment/TrkAlgebraUtils/src/IntVec.cxx @@ -6,48 +6,48 @@ #include "TrkAlgebraUtils/IntVec.h" #include <iostream> #include <stdint.h> +#include <exception> namespace Trk { IntVec::IntVec() - : Nele(0), ptr_data(0) + : m_Nele(0), m_ptr_data(0) {} IntVec::IntVec(int N) { - Nele = N; - ptr_data = new int[Nele]; - for(int i=0;i<Nele;i++) - *(ptr_data+i)=0; + m_Nele = N; + m_ptr_data = new int[m_Nele]; + for(int i=0;i<m_Nele;i++) + *(m_ptr_data+i)=0; } IntVec::IntVec(int N, int init) { - Nele = N; - ptr_data = new int[Nele]; - for(int i=0;i<Nele;i++) - *(ptr_data+i)=init; + m_Nele = N; + m_ptr_data = new int[m_Nele]; + for(int i=0;i<m_Nele;i++) + *(m_ptr_data+i)=init; } IntVec::IntVec(const IntVec& v) { - Nele = v.Nele; - ptr_data = new int[Nele]; - for(int i=0;i<Nele;i++) - *(ptr_data+i)=v[i]; + m_Nele = v.m_Nele; + m_ptr_data = new int[m_Nele]; + for(int i=0;i<m_Nele;i++) + *(m_ptr_data+i)=v[i]; } IntVec::~IntVec(){ - delete [] ptr_data; + delete [] m_ptr_data; } IntVec& IntVec::operator=(const IntVec& v) { - if(Nele!=0 && Nele!=v.Nele) { - std::cerr << "IntVec Assignment: size does not match!" << std::endl; - return *this; + if(m_Nele!=0 && m_Nele!=v.m_Nele) { + throw std::range_error( "IntVec Assignment: size does not match!" ); } - if ( ptr_data != v.ptr_data ) { - reSize(v.Nele); - for(int i=0;i<Nele;i++) - *(ptr_data+i)=v[i]; + if ( m_ptr_data != v.m_ptr_data ) { + reSize(v.m_Nele); + for(int i=0;i<m_Nele;i++) + *(m_ptr_data+i)=v[i]; } return *this; @@ -55,92 +55,84 @@ IntVec& IntVec::operator=(const IntVec& v) { int& IntVec::operator[](int i) { if(i<0) { - std::cerr << "IntVec: Index < zero! " << std::endl; - return ptr_data[0]; + throw std::out_of_range( "IntVec: Index < zero! " ); } - else if(i>=Nele) { - std::cerr << "IntVec: Index too large! " << std::endl; - return ptr_data[0]; + else if(i>=m_Nele) { + throw std::out_of_range( "IntVec: Index too large! " ); } - return *(ptr_data+i); + return *(m_ptr_data+i); } const int& IntVec::operator[](int i) const { if(i<0) { - std::cerr << "IntVec: Index < zero! " << std::endl; - return ptr_data[0]; + throw std::out_of_range( "IntVec: Index < zero! " ); } - else if(i>=Nele) { - std::cerr << "IntVec: Index too large! " << std::endl; - return ptr_data[0]; + else if(i>=m_Nele) { + throw std::out_of_range( "IntVec: Index too large! " ); } - return *(ptr_data+i); + return *(m_ptr_data+i); } IntVec IntVec::operator+(const IntVec& v) { - if( Nele != v.Nele ) { - std::cerr << "operator+: vectors size does not match!" << std::endl; - return *this; + if( m_Nele != v.m_Nele ) { + throw std::range_error( "operator+: vectors size does not match!" ); } - IntVec b(Nele); - for (int i=0;i<Nele;i++) - b[i] = *(ptr_data+i) + v[i]; + IntVec b(m_Nele); + for (int i=0;i<m_Nele;i++) + b[i] = *(m_ptr_data+i) + v[i]; return b; } IntVec& IntVec::operator+=(const IntVec& v) { - if( Nele != v.Nele ) { - std::cerr << "operator+=: vectors size does not match!" << std::endl; - return *this; + if( m_Nele != v.m_Nele ) { + throw std::range_error( "operator+=: vectors size does not match!" ); } - for (int i=0;i<Nele;i++) - *(ptr_data+i)+=v[i]; + for (int i=0;i<m_Nele;i++) + *(m_ptr_data+i)+=v[i]; return *this; } IntVec IntVec::operator-(const IntVec& v) { - if( Nele != v.Nele ) { - std::cerr << "operator+: vectors size does not match!" << std::endl; - return *this; + if( m_Nele != v.m_Nele ) { + throw std::range_error( "operator+: vectors size does not match!" ); } - IntVec b(Nele); - for (int i=0;i<Nele;i++) - b[i] = *(ptr_data+i) - v[i]; + IntVec b(m_Nele); + for (int i=0;i<m_Nele;i++) + b[i] = *(m_ptr_data+i) - v[i]; return b; } IntVec& IntVec::operator-=(const IntVec& v) { - if( Nele != v.Nele ) { - std::cerr << "operator+=: vectors size does not match!" << std::endl; - return *this; + if( m_Nele != v.m_Nele ) { + throw std::range_error( "operator+=: vectors size does not match!" ); } - for (int i=0;i<Nele;i++) - *(ptr_data+i)-=v[i]; + for (int i=0;i<m_Nele;i++) + *(m_ptr_data+i)-=v[i]; return *this; } void IntVec::reSize(int Nnew) { - if ( Nnew>=0 && Nnew != Nele ) { - int* p = ptr_data; - int Nele_old = Nele; - ptr_data = new int[Nnew]; - Nele = Nnew; - int k = Nele <= Nele_old ? Nele : Nele_old; + if ( Nnew>=0 && Nnew != m_Nele ) { + int* p = m_ptr_data; + int Nele_old = m_Nele; + m_ptr_data = new int[Nnew]; + m_Nele = Nnew; + int k = m_Nele <= Nele_old ? m_Nele : Nele_old; p += k; - int* q = ptr_data + k; - while (q > ptr_data) + int* q = m_ptr_data + k; + while (q > m_ptr_data) *(--q) = *(--p); delete [] p; diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/MatrixTool.h b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/MatrixTool.h index b3cf31e85c98192c568ea10e1ba3dd183a411cfb..26a6bdb38b7322ec26b043c38ebfe56805f8f7b2 100644 --- a/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/MatrixTool.h +++ b/Tracking/TrkAlignment/TrkAlignGenTools/TrkAlignGenTools/MatrixTool.h @@ -58,9 +58,9 @@ namespace Trk { enum SolveOption { NONE = 0, //!< not solve in any case (to be used when ipc) SOLVE = 1, //!< solving after data accumulation (LAPACK) - SOLVE_FAST = 2, //!< Fast (***REMOVED*** method) solving after data accumulation + SOLVE_FAST = 2, //!< Fast (Eigen method) solving after data accumulation DIRECT_SOLVE = 3, //!< direct solving (LAPACK), already available matrix & vector - DIRECT_SOLVE_FAST = 4, //!< direct Fast (***REMOVED*** method) solving, already available matrix & vector + DIRECT_SOLVE_FAST = 4, //!< direct Fast (Eigen method) solving, already available matrix & vector DIRECT_SOLVE_CLUSTER = 5, //!< computation of alignment parameters from SCALAPAK already solved matrix SOLVE_ROOT = 6, //!< computation using ROOT SOLVE_CLHEP = 7 //!< computation using CLHEP @@ -128,7 +128,7 @@ namespace Trk { int solveROOT(); int solveCLHEP(); int solveLapack(); - int solve***REMOVED***(); + int solveSparseEigen(); int solveLocal(); StatusCode spuriousRemoval(); diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/src/MatrixTool.cxx b/Tracking/TrkAlignment/TrkAlignGenTools/src/MatrixTool.cxx index a477f5f25402349c89a067cb8cadf1867f9ceec1..b7c9846b05cf126d70934b04570800c968897e85 100644 --- a/Tracking/TrkAlignment/TrkAlignGenTools/src/MatrixTool.cxx +++ b/Tracking/TrkAlignment/TrkAlignGenTools/src/MatrixTool.cxx @@ -1426,7 +1426,7 @@ namespace Trk { case SOLVE_FAST: case DIRECT_SOLVE_FAST: - info = solve***REMOVED***(); + info = solveSparseEigen(); break; default: @@ -2147,13 +2147,13 @@ namespace Trk { } //________________________________________________________________________ - int MatrixTool::solve***REMOVED***() + int MatrixTool::solveSparseEigen() { - ATH_MSG_INFO("solving Global using ***REMOVED***"); + ATH_MSG_INFO("solving Global using SparseEigen"); if(m_logStream) { *m_logStream<<"*************************************************************"<<std::endl; *m_logStream<<"************** solving using Global method ****************"<<std::endl; - *m_logStream<<"************** using ***REMOVED*** ****************"<<std::endl; + *m_logStream<<"************** using SparseEigen ****************"<<std::endl; *m_logStream<<"*************************************************************"<<std::endl; } @@ -2205,17 +2205,17 @@ namespace Trk { ATH_MSG_DEBUG("running the solving"); // solve - int info = (*aBetterMat).***REMOVED***Solve(*aBetterVec); + int info = (*aBetterMat).SolveWithEigen(*aBetterVec); if(info == 0) { - ATH_MSG_INFO("***REMOVED*** solving OK"); + ATH_MSG_INFO("SolveWithEigen solving OK"); if(m_logStream) - *m_logStream<<"***REMOVED*** solving OK."<<std::endl; + *m_logStream<<"SolveWithEigen solving OK."<<std::endl; } else { - msg(MSG::ERROR)<<"***REMOVED*** error code (0 if OK) = "<<info<<endreq; + msg(MSG::ERROR)<<"SolveWithEigen error code (0 if OK) = "<<info<<endreq; if(m_logStream) - *m_logStream<<"***REMOVED*** error code (0 if OK) = "<<info<<std::endl; + *m_logStream<<"SolveWithEigen error code (0 if OK) = "<<info<<std::endl; } if( isCopy ) @@ -2225,11 +2225,11 @@ namespace Trk { // stop measuring time clock_t stoptime = clock(); double totaltime = (stoptime-starttime)/double(CLOCKS_PER_SEC); - ATH_MSG_INFO("Time spent in solve***REMOVED***: "<<totaltime<<" s"); + ATH_MSG_INFO("Time spent in SolveWithEigen: "<<totaltime<<" s"); ATH_MSG_DEBUG("Alignment constants:"); // compute alignment corrections (translations in mm and rotations in rad) - // for ***REMOVED*** variances are not calculated + // for solveSparseEigen variances are not calculated for(int i=0; i<m_aNDoF; i++) { double param = -(*aBetterVec)[i]; @@ -2273,7 +2273,7 @@ namespace Trk { delete aBetterVec; // need to do this since success return value from Lapack is 0 - // and from solve***REMOVED***() it is 1 + // and from SolveWithEigen() it is 1 if (info==0) info = 1; diff --git a/Tracking/TrkAlignment/TrkAlignInterfaces/TrkAlignInterfaces/IDerivCalcTool.h b/Tracking/TrkAlignment/TrkAlignInterfaces/TrkAlignInterfaces/IDerivCalcTool.h index d5bb42b75811f6f0c532f4f39220c763c9bc9713..5d80d02c73f0d4a26aec5c574e0f781093c0232d 100644 --- a/Tracking/TrkAlignment/TrkAlignInterfaces/TrkAlignInterfaces/IDerivCalcTool.h +++ b/Tracking/TrkAlignment/TrkAlignInterfaces/TrkAlignInterfaces/IDerivCalcTool.h @@ -41,9 +41,9 @@ namespace Trk { enum SolveOption { NONE = 0, //!< not solve in any case (to be used when ipc) SOLVE = 1, //!< solving after data accumulation (LAPACK) - SOLVE_FAST = 2, //!< Fast (***REMOVED*** method) solving after data accumulation + SOLVE_FAST = 2, //!< Fast (Eigen method) solving after data accumulation DIRECT_SOLVE = 3, //!< direct solving (LAPACK), already available matrix & vector - DIRECT_SOLVE_FAST = 4, //!< direct Fast (***REMOVED*** method) solving, already available matrix & vector + DIRECT_SOLVE_FAST = 4, //!< direct Fast (Eigen method) solving, already available matrix & vector DIRECT_SOLVE_CLUSTER = 5 //!< computation of alignment parameters from SCALAPAK already solved matrix }; // this is also defined in TrkGlobAlign class