Go to the documentation of this file.00001 #ifndef GsfMatrixTools_h_
00002 #define GsfMatrixTools_h_
00003
00004 #include "Math/SVector.h"
00005 #include "Math/SMatrix.h"
00006
00007 namespace GsfMatrixTools {
00008
00009
00010
00011
00012
00013
00014
00015 template <unsigned int N>
00016 double trace (const ROOT::Math::SMatrix<double, N, N>& matrix) {
00017 double result(0.);
00018 for ( unsigned int i=0; i<N; i++ ) result += matrix(i,i);
00019 return result;
00020 }
00021
00022
00023
00024
00025
00026 template<typename T, unsigned int N>
00027 double trace(ROOT::Math::SMatrix<T,N,N,ROOT::Math::MatRepSym<T,N> > const & a,
00028 ROOT::Math::SMatrix<T,N,N,ROOT::Math::MatRepSym<T,N> > const & b) {
00029 typedef typename ROOT::Math::SMatrix<T,N,N,ROOT::Math::MatRepSym<T,N> >::const_iterator CI;
00030 CI i1 = a.begin();
00031 CI e1 = a.end();
00032 CI i2 = b.begin();
00033
00034
00035 T res =0;
00036
00037 for (;i1!=e1; i1++, i2++)
00038 res += (*i1)*(*i2);
00039 res *=2.;
00040
00041 for (unsigned int i=0;i<N;i++)
00042 res -= a(i,i)*b(i,i);
00043 return res;
00044 }
00045
00046 }
00047 #endif
00048