00001
00002
00003 #ifndef LHCBMATH_MATRIXTRANSFORMS_H
00004 #define LHCBMATH_MATRIXTRANSFORMS_H 1
00005
00006
00007
00008
00009
00010 #include "Math/SMatrix.h"
00011 #include "Math/SVector.h"
00012 #include "Math/Point3D.h"
00013 #include "Math/Vector4D.h"
00014 #include "Math/Vector3D.h"
00015
00034
00035 namespace Gaudi
00036 {
00037 namespace Math
00038 {
00039
00058 template <class C,class T>
00059 inline
00060 const ROOT::Math::SVector<T,3>&
00061 geo2LA
00062 ( const ROOT::Math::PositionVector3D<C>& source ,
00063 ROOT::Math::SVector<T,3>& dest )
00064 {
00065 dest ( 0 ) = source.X () ;
00066 dest ( 1 ) = source.Y () ;
00067 dest ( 2 ) = source.Z () ;
00068 return dest ;
00069 }
00070
00089 template <class C,class T>
00090 inline
00091 const ROOT::Math::SVector<T,3>&
00092 geo2LA
00093 ( const ROOT::Math::DisplacementVector3D<C>& source ,
00094 ROOT::Math::SVector<T,3>& dest )
00095 {
00096 dest ( 0 ) = source.X () ;
00097 dest ( 1 ) = source.Y () ;
00098 dest ( 2 ) = source.Z () ;
00099 return dest ;
00100 }
00101
00120 template <class C,class T>
00121 inline
00122 const ROOT::Math::SVector<T,4>&
00123 geo2LA
00124 ( const ROOT::Math::LorentzVector<C>& source ,
00125 ROOT::Math::SVector<T,4>& dest )
00126 {
00127 dest ( 0 ) = source.X () ;
00128 dest ( 1 ) = source.Y () ;
00129 dest ( 2 ) = source.Z () ;
00130 dest ( 3 ) = source.E () ;
00131 return dest ;
00132 }
00133
00153 template <class C,class T>
00154 inline
00155 const ROOT::Math::SVector<T,3>&
00156 geo2LA
00157 ( const ROOT::Math::LorentzVector<C>& source ,
00158 ROOT::Math::SVector<T,3>& dest )
00159 {
00160 dest ( 0 ) = source.X () ;
00161 dest ( 1 ) = source.Y () ;
00162 dest ( 2 ) = source.Z () ;
00163 return dest ;
00164 }
00165
00184 template <class C,class T>
00185 inline
00186 const ROOT::Math::PositionVector3D<C>&
00187 la2geo
00188 ( const ROOT::Math::SVector<T,3>& source ,
00189 ROOT::Math::PositionVector3D<C>& dest )
00190 {
00191 dest.SetX ( source ( 0 ) ) ;
00192 dest.SetY ( source ( 1 ) ) ;
00193 dest.SetZ ( source ( 2 ) ) ;
00194 return dest ;
00195 }
00196
00215 template <class C,class T>
00216 inline
00217 const ROOT::Math::DisplacementVector3D<C>&
00218 la2geo
00219 ( const ROOT::Math::SVector<T,3>& source ,
00220 ROOT::Math::DisplacementVector3D<C>& dest )
00221 {
00222 dest.SetX ( source ( 0 ) ) ;
00223 dest.SetY ( source ( 1 ) ) ;
00224 dest.SetZ ( source ( 2 ) ) ;
00225 return dest ;
00226 }
00227
00246 template <class C,class T>
00247 inline
00248 const ROOT::Math::LorentzVector<C>&
00249 la2geo
00250 ( const ROOT::Math::SVector<T,4>& source ,
00251 ROOT::Math::LorentzVector<C>& dest )
00252 {
00253 dest.SetPx ( source ( 0 ) ) ;
00254 dest.SetPy ( source ( 1 ) ) ;
00255 dest.SetPz ( source ( 2 ) ) ;
00256 dest.SetE ( source ( 3 ) ) ;
00257 return dest ;
00258 }
00259
00286 template <class C,class T>
00287 inline T
00288 Similarity
00289 ( const ROOT::Math::DisplacementVector3D<C>& delta ,
00290 const ROOT::Math::SMatrix<T,3,3,ROOT::Math::MatRepSym<T,3> > & matrix )
00291 {
00292 ROOT::Math::SVector<T,3> tmp ;
00293 return ROOT::Math::Similarity ( geo2LA ( delta , tmp ) , matrix ) ;
00294 }
00295
00322 template <class C,class T>
00323 inline T
00324 Similarity
00325 ( const ROOT::Math::SMatrix<T,3,3,ROOT::Math::MatRepSym<T,3> > & matrix ,
00326 const ROOT::Math::DisplacementVector3D<C>& delta )
00327 { return Similarity ( delta , matrix ) ; }
00328
00355 template <class C,class T>
00356 inline T
00357 Similarity
00358 ( const ROOT::Math::LorentzVector<C>& delta ,
00359 const ROOT::Math::SMatrix<T,4,4,ROOT::Math::MatRepSym<T,4> > & matrix )
00360 {
00361 ROOT::Math::SVector<T,4> tmp ;
00362 return ROOT::Math::Similarity ( geo2LA( delta , tmp ) , matrix ) ;
00363 }
00364
00391 template <class C,class T>
00392 inline T
00393 Similarity
00394 ( const ROOT::Math::SMatrix<T,4,4,ROOT::Math::MatRepSym<T,4> > & matrix ,
00395 const ROOT::Math::LorentzVector<C>& delta )
00396 { return Similarity ( delta , matrix ) ; }
00397
00416 template <class C, class T>
00417 inline
00418 const ROOT::Math::LorentzVector<C>&
00419 add
00420 ( ROOT::Math::LorentzVector<C>& v1 , const ROOT::Math::SVector<T,4> & v2 )
00421 { return v1 += ROOT::Math::LorentzVector<C>
00422 ( v2 ( 0 ) , v2 ( 1 ) , v2 ( 2 ) , v2 ( 3 ) ) ; }
00423
00442 template <class T1,class T2,unsigned int D, class R>
00443 inline
00444 ROOT::Math::SMatrix<T1,D,D,ROOT::Math::MatRepSym<T1,D> >&
00445 add
00446 ( ROOT::Math::SMatrix<T1,D,D,ROOT::Math::MatRepSym<T1,D> >& matrix ,
00447 const ROOT::Math::SMatrix<T2,D,D,R>& other )
00448 {
00449 for ( unsigned int i = 0 ; i < D ; ++i )
00450 { for ( unsigned int j = i ; j < D ; ++j ) { matrix(i,j) += other(i,j); } }
00451 return matrix ;
00452 }
00453
00469 template<class T, class C, class M>
00470 inline
00471 const ROOT::Math::LorentzVector<C>&
00472 geo2LA
00473 ( const ROOT::Math::SVector<T, 3>& source ,
00474 const M mass ,
00475 ROOT::Math::LorentzVector<C>& dest )
00476 {
00477
00478 const double p = 1/fabs(source(2)) ;
00479 const double n = sqrt( 1 + source(0)*source(0)+source(1)*source(1)) ;
00480 const double pz = p/n ;
00481 const double px = pz*source(0) ;
00482 const double py = pz*source(1) ;
00483 dest.SetPx ( px ) ;
00484 dest.SetPy ( py ) ;
00485 dest.SetPz ( pz ) ;
00486 dest.SetE ( std::sqrt ( p*p + mass*mass ) ) ;
00487 return dest ;
00488 }
00489
00514 template <class T,class R, class M >
00515 inline void JacobdP4dMom
00516 ( const ROOT::Math::SVector<T,3>& mom ,
00517 const M mass ,
00518 ROOT::Math::SMatrix<R,4,3>& J )
00519 {
00520 double tx = mom(0) ;
00521 double ty = mom(1) ;
00522 double qop = mom(2) ;
00523 double p = 1/fabs(qop) ;
00524 double n2 = 1 + tx*tx + ty*ty ;
00525 double n = std::sqrt(n2) ;
00526 double n3 = n2*n ;
00527 double px = p*tx/n ;
00528 double py = p*ty/n ;
00529 double pz = p/n ;
00530 double E = sqrt(p*p+mass*mass) ;
00531
00532 J(0,0) = p * (1+ty*ty)/n3 ;
00533 J(0,1) = p * tx * -ty/n3 ;
00534 J(0,2) = -px/qop ;
00535
00536 J(1,0) = p * ty * -tx/n3 ;
00537 J(1,1) = p * (1+tx*tx)/n3 ;
00538 J(1,2) = -py/qop ;
00539
00540 J(2,0) = pz * -tx/n2 ;
00541 J(2,1) = pz * -ty/n2 ;
00542 J(2,2) = -pz/qop ;
00543
00544 J(3,0) = 0.0 ;
00545 J(3,1) = 0.0 ;
00546 J(3,2) = p/E * -p/qop ;
00547
00548 return ;
00549 }
00550
00551 }
00552 }
00553
00554 namespace Gaudi
00555 {
00556 namespace Math
00557 {
00558
00825 namespace Operators
00826 {
00827
00846 template <class C, class T>
00847 inline
00848 ROOT::Math::PositionVector3D<C>
00849 operator+
00850 ( const ROOT::Math::PositionVector3D<C>& p1 ,
00851 const ROOT::Math::SVector<T,3>& v2 )
00852 {
00853 ROOT::Math::PositionVector3D<C> result ;
00854 result.SetXYZ( p1 . X () + v2 ( 0 ) ,
00855 p1 . Y () + v2 ( 1 ) ,
00856 p1 . Z () + v2 ( 2 ) ) ;
00857 return result ;
00858 }
00859
00860 template <class C, class B, class T>
00861 inline
00862 ROOT::Math::PositionVector3D<C>
00863 operator+
00864 ( const ROOT::Math::PositionVector3D<C>& p1 ,
00865 const ROOT::Math::VecExpr<B,T,3>& v2 )
00866 {
00867 ROOT::Math::PositionVector3D<C> result ;
00868 result.SetXYZ( p1 . X () + v2 ( 0 ) ,
00869 p1 . Y () + v2 ( 1 ) ,
00870 p1 . Z () + v2 ( 2 ) ) ;
00871 return result ;
00872 }
00873
00892 template <class C, class T>
00893 inline
00894 ROOT::Math::DisplacementVector3D<C>
00895 operator+
00896 ( const ROOT::Math::DisplacementVector3D<C>& p1 ,
00897 const ROOT::Math::SVector<T,3>& v2 )
00898 {
00899 ROOT::Math::PositionVector3D<C> result ;
00900 result.SetXYZ( p1 . X () + v2 ( 0 ) ,
00901 p1 . Y () + v2 ( 1 ) ,
00902 p1 . Z () + v2 ( 2 ) ) ;
00903 return result ;
00904 }
00905
00906 template <class C, class B, class T>
00907 inline
00908 ROOT::Math::DisplacementVector3D<C>
00909 operator+
00910 ( const ROOT::Math::DisplacementVector3D<C>& p1 ,
00911 const ROOT::Math::VecExpr<B,T,3>& v2 )
00912 {
00913 ROOT::Math::PositionVector3D<C> result ;
00914 result.SetXYZ( p1 . X () + v2 ( 0 ) ,
00915 p1 . Y () + v2 ( 1 ) ,
00916 p1 . Z () + v2 ( 2 ) ) ;
00917 return result ;
00918 }
00919
00938 template <class C, class T>
00939 inline
00940 ROOT::Math::LorentzVector<C>
00941 operator+
00942 ( const ROOT::Math::LorentzVector<C>& p1 ,
00943 const ROOT::Math::SVector<T,4>& v2 )
00944 {
00945 ROOT::Math::LorentzVector<C> result ;
00946 result.SetXYZT
00947 ( p1 . Px () + v2 ( 0 ) ,
00948 p1 . Py () + v2 ( 1 ) ,
00949 p1 . Pz () + v2 ( 2 ) ,
00950 p1 . E () + v2 ( 3 ) ) ;
00951 return result ;
00952 }
00953
00954 template <class C, class B , class T>
00955 inline
00956 ROOT::Math::LorentzVector<C>
00957 operator+
00958 ( const ROOT::Math::LorentzVector<C>& p1 ,
00959 const ROOT::Math::VecExpr<B,T,4>& v2 )
00960 {
00961 ROOT::Math::LorentzVector<C> result ;
00962 result.SetXYZT
00963 ( p1 . Px () + v2 ( 0 ) ,
00964 p1 . Py () + v2 ( 1 ) ,
00965 p1 . Pz () + v2 ( 2 ) ,
00966 p1 . E () + v2 ( 3 ) ) ;
00967 return result ;
00968 }
00969
00988 template <class C, class T>
00989 inline
00990 ROOT::Math::SVector<T,3>
00991 operator+
00992 ( const ROOT::Math::SVector<T,3>& v2 ,
00993 const ROOT::Math::PositionVector3D<C>& p1 )
00994 {
00995 ROOT::Math::SVector<T,3> result ( v2 ) ;
00996 result ( 0 ) += p1 . X () ;
00997 result ( 1 ) += p1 . Y () ;
00998 result ( 2 ) += p1 . Z () ;
00999 return result ;
01000 }
01001
01002 template <class C, class B, class T>
01003 inline
01004 ROOT::Math::SVector<T,3>
01005 operator+
01006 ( const ROOT::Math::VecExpr<B,T,3>& v2 ,
01007 const ROOT::Math::PositionVector3D<C>& p1 )
01008 {
01009 ROOT::Math::SVector<T,3> result = v2 ;
01010 result ( 0 ) += p1 . X () ;
01011 result ( 1 ) += p1 . Y () ;
01012 result ( 2 ) += p1 . Z () ;
01013 return result ;
01014 }
01015
01034 template <class C, class T>
01035 inline
01036 ROOT::Math::SVector<T,3>
01037 operator+
01038 ( const ROOT::Math::SVector<T,3>& v2 ,
01039 const ROOT::Math::DisplacementVector3D<C>& p1 )
01040 {
01041 ROOT::Math::SVector<T,3> result ( v2 ) ;
01042 result ( 0 ) += p1 . X () ;
01043 result ( 1 ) += p1 . Y () ;
01044 result ( 2 ) += p1 . Z () ;
01045 return result ;
01046 }
01047
01048 template <class C, class B, class T>
01049 inline
01050 ROOT::Math::SVector<T,3>
01051 operator+
01052 ( const ROOT::Math::VecExpr<B,T,3>& v2 ,
01053 const ROOT::Math::DisplacementVector3D<C>& p1 )
01054 {
01055 ROOT::Math::SVector<T,3> result = v2 ;
01056 result ( 0 ) += p1 . X () ;
01057 result ( 1 ) += p1 . Y () ;
01058 result ( 2 ) += p1 . Z () ;
01059 return result ;
01060 }
01061
01081 template <class C, class T>
01082 inline
01083 ROOT::Math::SVector<T,4>
01084 operator+
01085 ( const ROOT::Math::SVector<T,4>& v2 ,
01086 const ROOT::Math::LorentzVector<C>& p1 )
01087 {
01088 ROOT::Math::SVector<T,4> result ( v2 ) ;
01089 result ( 0 ) += p1 . Px () ;
01090 result ( 1 ) += p1 . Py () ;
01091 result ( 2 ) += p1 . Pz () ;
01092 result ( 3 ) += p1 . E () ;
01093 return result ;
01094 }
01095
01096 template <class C, class B, class T>
01097 inline
01098 ROOT::Math::SVector<T,4>
01099 operator+
01100 ( const ROOT::Math::VecExpr<B,T,4>& v2 ,
01101 const ROOT::Math::LorentzVector<C>& p1 )
01102 {
01103 ROOT::Math::SVector<T,4> result = v2 ;
01104 result ( 0 ) += p1 . Px () ;
01105 result ( 1 ) += p1 . Py () ;
01106 result ( 2 ) += p1 . Pz () ;
01107 result ( 3 ) += p1 . E () ;
01108 return result ;
01109 }
01110
01129 template <class C, class T>
01130 inline
01131 ROOT::Math::PositionVector3D<C>
01132 operator-
01133 ( const ROOT::Math::PositionVector3D<C>& p1 ,
01134 const ROOT::Math::SVector<T,3>& v2 )
01135 {
01136 ROOT::Math::PositionVector3D<C> result ;
01137 result.SetXYZ
01138 ( p1 . X () - v2 ( 0 ) ,
01139 p1 . Y () - v2 ( 1 ) ,
01140 p1 . Z () - v2 ( 2 ) ) ;
01141 return result ;
01142 }
01143
01144 template <class C, class B , class T>
01145 inline
01146 ROOT::Math::PositionVector3D<C>
01147 operator-
01148 ( const ROOT::Math::PositionVector3D<C>& p1 ,
01149 const ROOT::Math::VecExpr<B,T,3>& v2 )
01150 {
01151 ROOT::Math::PositionVector3D<C> result ;
01152 result.SetXYZ
01153 ( p1 . X () - v2 ( 0 ) ,
01154 p1 . Y () - v2 ( 1 ) ,
01155 p1 . Z () - v2 ( 2 ) ) ;
01156 return result ;
01157 }
01158
01159
01178 template <class C, class T>
01179 inline
01180 ROOT::Math::DisplacementVector3D<C>
01181 operator-
01182 ( const ROOT::Math::DisplacementVector3D<C>& p1 ,
01183 const ROOT::Math::SVector<T,3>& v2 )
01184 {
01185 ROOT::Math::PositionVector3D<C> result ;
01186 result.SetXYZ
01187 ( p1 . X () - v2 ( 0 ) ,
01188 p1 . Y () - v2 ( 1 ) ,
01189 p1 . Z () - v2 ( 2 ) ) ;
01190 return result ;
01191 }
01192
01193 template <class C, class B, class T>
01194 inline
01195 ROOT::Math::DisplacementVector3D<C>
01196 operator-
01197 ( const ROOT::Math::DisplacementVector3D<C>& p1 ,
01198 const ROOT::Math::VecExpr<B,T,3>& v2 )
01199 {
01200 ROOT::Math::PositionVector3D<C> result ;
01201 result.SetXYZ
01202 ( p1 . X () - v2 ( 0 ) ,
01203 p1 . Y () - v2 ( 1 ) ,
01204 p1 . Z () - v2 ( 2 ) ) ;
01205 return result ;
01206 }
01207
01226 template <class C, class T>
01227 inline
01228 ROOT::Math::LorentzVector<C>
01229 operator-
01230 ( const ROOT::Math::LorentzVector<C>& p1 ,
01231 const ROOT::Math::SVector<T,4>& v2 )
01232 {
01233 ROOT::Math::LorentzVector<C> result ;
01234 result.SetXYZT
01235 ( p1 . Px () - v2 ( 0 ) ,
01236 p1 . Py () - v2 ( 1 ) ,
01237 p1 . Pz () - v2 ( 2 ) ,
01238 p1 . E () - v2 ( 3 ) ) ;
01239 return result ;
01240 }
01241
01242 template <class C, class B, class T>
01243 inline
01244 ROOT::Math::LorentzVector<C>
01245 operator-
01246 ( const ROOT::Math::LorentzVector<C>& p1 ,
01247 const ROOT::Math::VecExpr<B,T,4>& v2 )
01248 {
01249 ROOT::Math::LorentzVector<C> result ;
01250 result.SetXYZT
01251 ( p1 . Px () - v2 ( 0 ) ,
01252 p1 . Py () - v2 ( 1 ) ,
01253 p1 . Pz () - v2 ( 2 ) ,
01254 p1 . E () - v2 ( 3 ) ) ;
01255 return result ;
01256 }
01257
01272 template <class C, class T>
01273 inline
01274 ROOT::Math::SVector<T,4>
01275 operator-
01276 ( const ROOT::Math::SVector<T,4>& v1 ,
01277 const ROOT::Math::LorentzVector<C>& v2 )
01278 {
01279 ROOT::Math::SVector<T,4> result = v1 ;
01280 result ( 0 ) -= v2 . Px () ;
01281 result ( 1 ) -= v2 . Py () ;
01282 result ( 2 ) -= v2 . Pz () ;
01283 result ( 3 ) -= v2 . E () ;
01284 return result ;
01285 }
01286
01287 template <class C, class B, class T>
01288 inline
01289 ROOT::Math::SVector<T,4>
01290 operator-
01291 ( const ROOT::Math::VecExpr<B,T,4>& v1 ,
01292 const ROOT::Math::LorentzVector<C>& v2 )
01293 {
01294 ROOT::Math::SVector<T,4> result = v1 ;
01295 result ( 0 ) -= v2 . Px () ;
01296 result ( 1 ) -= v2 . Py () ;
01297 result ( 2 ) -= v2 . Pz () ;
01298 result ( 3 ) -= v2 . E () ;
01299 return result ;
01300 }
01301
01316 template <class C, class T>
01317 inline
01318 ROOT::Math::SVector<T,3>
01319 operator-
01320 ( const ROOT::Math::SVector<T,3>& v1 ,
01321 const ROOT::Math::PositionVector3D<C>& v2 )
01322 {
01323 ROOT::Math::SVector<T,3> result = v1 ;
01324 result ( 0 ) -= v2 . X () ;
01325 result ( 1 ) -= v2 . Y () ;
01326 result ( 2 ) -= v2 . Z () ;
01327 return result ;
01328 }
01329
01330 template <class C, class B, class T>
01331 inline
01332 ROOT::Math::SVector<T,3>
01333 operator-
01334 ( const ROOT::Math::VecExpr<B,T,3>& v1 ,
01335 const ROOT::Math::PositionVector3D<C>& v2 )
01336 {
01337 ROOT::Math::SVector<T,3> result = v1 ;
01338 result ( 0 ) -= v2 . X () ;
01339 result ( 1 ) -= v2 . Y () ;
01340 result ( 2 ) -= v2 . Z () ;
01341 return result ;
01342 }
01343
01358 template <class C, class T>
01359 inline
01360 ROOT::Math::SVector<T,3>
01361 operator-
01362 ( const ROOT::Math::SVector<T,3>& v1 ,
01363 const ROOT::Math::DisplacementVector3D<C>& v2 )
01364 {
01365 ROOT::Math::SVector<T,3> result = v1 ;
01366 result ( 0 ) -= v2 . X () ;
01367 result ( 1 ) -= v2 . Y () ;
01368 result ( 2 ) -= v2 . Z () ;
01369 return result ;
01370 }
01371
01372 template <class C, class B, class T>
01373 inline
01374 ROOT::Math::SVector<T,3>
01375 operator-
01376 ( const ROOT::Math::VecExpr<B,T,3>& v1 ,
01377 const ROOT::Math::DisplacementVector3D<C>& v2 )
01378 {
01379 ROOT::Math::SVector<T,3> result = v1 ;
01380 result ( 0 ) -= v2 . X () ;
01381 result ( 1 ) -= v2 . Y () ;
01382 result ( 2 ) -= v2 . Z () ;
01383 return result ;
01384 }
01385
01400 template <class T, class C, class R, unsigned int D>
01401 inline
01402 ROOT::Math::SVector<T,D>
01403 operator*
01404 ( const ROOT::Math::SMatrix<T,D,4,R>& mrtx ,
01405 const ROOT::Math::LorentzVector<C>& vect )
01406 {
01407 const ROOT::Math::SVector<T,4> vct
01408 ( vect . Px () , vect . Py () , vect . Pz () , vect.E () ) ;
01409 return mrtx * vct ;
01410 }
01411
01412 template <class T, class C, class B, class R, unsigned int D>
01413 inline
01414 ROOT::Math::SVector<T,D>
01415 operator*
01416 ( const ROOT::Math::Expr<B,T,D,4,R>& mtrx ,
01417 const ROOT::Math::LorentzVector<C>& vect )
01418 {
01419 const ROOT::Math::SVector<T,4> vct
01420 ( vect . Px () , vect . Py () , vect . Pz () , vect.E () ) ;
01421 return mtrx * vct ;
01422 }
01423
01438 template <class T, class C, class R, unsigned int D>
01439 inline
01440 ROOT::Math::SVector<T,D>
01441 operator*
01442 ( const ROOT::Math::LorentzVector<C>& vect ,
01443 const ROOT::Math::SMatrix<T,4,D,R>& mtrx )
01444 {
01445 const ROOT::Math::SVector<T,4> vct
01446 ( vect . Px () , vect . Py () , vect . Pz () , vect.E () ) ;
01447 return vct * mtrx ;
01448 }
01449
01450 template <class T, class C, class B, class R, unsigned int D>
01451 inline
01452 ROOT::Math::SVector<T,D>
01453 operator*
01454 ( const ROOT::Math::LorentzVector<C>& vect ,
01455 const ROOT::Math::Expr<B,T,4,D,R>& mtrx )
01456 {
01457 const ROOT::Math::SVector<T,4> vct
01458 ( vect . Px () , vect . Py () , vect . Pz () , vect.E () ) ;
01459 return vct * mtrx ;
01460 }
01461
01476 template <class T, class C, class R, unsigned int D>
01477 inline
01478 ROOT::Math::SVector<T,D>
01479 operator*
01480 ( const ROOT::Math::SMatrix<T,D,3,R>& mtrx ,
01481 const ROOT::Math::DisplacementVector3D<C>& vect )
01482 {
01483 const ROOT::Math::SVector<T,3> vct
01484 ( vect . X () , vect . Y () , vect . Z () ) ;
01485 return mtrx * vct ;
01486 }
01487
01488 template <class T, class C, class B, class R, unsigned int D>
01489 inline
01490 ROOT::Math::SVector<T,D>
01491 operator*
01492 ( const ROOT::Math::Expr<B,T,D,3,R>& mtrx ,
01493 const ROOT::Math::DisplacementVector3D<C>& vect )
01494 {
01495 const ROOT::Math::SVector<T,3> vct
01496 ( vect . X () , vect . Y () , vect . Z () ) ;
01497 return mtrx * vct ;
01498 }
01499
01514 template <class T, class C, class R, unsigned int D>
01515 inline
01516 ROOT::Math::SVector<T,D>
01517 operator*
01518 ( const ROOT::Math::DisplacementVector3D<C>& vect ,
01519 const ROOT::Math::SMatrix<T,3,D,R>& mtrx )
01520 {
01521 const ROOT::Math::SVector<T,3> vct
01522 ( vect . X () , vect . Y () , vect . Z () ) ;
01523 return vct * mtrx ;
01524 }
01525
01526 template <class T, class C, class B, class R, unsigned int D>
01527 inline
01528 ROOT::Math::SVector<T,D>
01529 operator*
01530 ( const ROOT::Math::DisplacementVector3D<C>& vect ,
01531 const ROOT::Math::Expr<B,T,3,D,R>& mtrx )
01532 {
01533 const ROOT::Math::SVector<T,3> vct
01534 ( vect . X () , vect . Y () , vect . Z () ) ;
01535 return vct * mtrx ;
01536 }
01537
01552 template <class T, class C, class R, unsigned int D>
01553 inline
01554 ROOT::Math::SVector<T,D>
01555 operator*
01556 ( const ROOT::Math::SMatrix<T,D,3,R>& mtrx ,
01557 const ROOT::Math::PositionVector3D<C>& vect )
01558 {
01559 const ROOT::Math::SVector<T,3> vct
01560 ( vect . X () , vect . Y () , vect . Z () ) ;
01561 return mtrx * vct ;
01562 }
01563
01564 template <class T, class C, class B, class R, unsigned int D>
01565 inline
01566 ROOT::Math::SVector<T,D>
01567 operator*
01568 ( const ROOT::Math::Expr<B,T,D,3,R>& mtrx ,
01569 const ROOT::Math::PositionVector3D<C>& vect )
01570 {
01571 const ROOT::Math::SVector<T,3> vct
01572 ( vect . X () , vect . Y () , vect . X () ) ;
01573 return mtrx * vct ;
01574 }
01575
01590 template <class T, class C, class R, unsigned int D>
01591 inline
01592 ROOT::Math::SVector<T,D>
01593 operator*
01594 ( const ROOT::Math::PositionVector3D<C>& vect ,
01595 const ROOT::Math::SMatrix<T,3,D,R>& mtrx )
01596 {
01597 const ROOT::Math::SVector<T,3> vct
01598 ( vect . X () , vect . Y () , vect . Z () ) ;
01599 return vct * mtrx ;
01600 }
01601
01602 template <class T, class C, class B, class R, unsigned int D>
01603 inline
01604 ROOT::Math::SVector<T,D>
01605 operator*
01606 ( const ROOT::Math::PositionVector3D<C>& vect ,
01607 const ROOT::Math::Expr<B,T,3,D,R>& mtrx )
01608 {
01609 const ROOT::Math::SVector<T,3> vct
01610 ( vect . X () , vect . Y () , vect . Z () ) ;
01611 return vct * mtrx ;
01612 }
01613
01614 }
01615
01616 }
01617
01618 }
01619
01620
01621
01622 #endif // LHCBMATH_XXX_H
01623