CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/DataFormats/GeometryCommonDetAlgo/interface/ErrorFrameTransformer.h

Go to the documentation of this file.
00001 #ifndef ErrorFrameTransformer_H
00002 #define ErrorFrameTransformer_H
00003 
00004 #include "DataFormats/GeometrySurface/interface/Surface.h"
00005 #include "DataFormats/GeometryCommonDetAlgo/interface/GlobalError.h"
00006 #include "DataFormats/GeometryCommonDetAlgo/interface/LocalError.h"
00007 
00008 struct   ErrorFrameTransformer {
00009   
00010   typedef Surface::Scalar         Scalar;
00011   
00012   static GlobalError transform(const LocalError& le, const Surface& surf) {
00013     // the GlobalError is a sym matrix, initialisation takes only
00014     // 6 T because GlobalError is stored as a lower triangular matrix.
00015     Scalar cxx = le.xx();
00016     Scalar cxy = le.xy();
00017     Scalar cyy = le.yy();
00018     
00019     Surface::RotationType r=surf.rotation();
00020     
00021     return GlobalError( r.xx()*(r.xx()*cxx+r.yx()*cxy) + r.yx()*(r.xx()*cxy+r.yx()*cyy) ,
00022                         r.xx()*(r.xy()*cxx+r.yy()*cxy) + r.yx()*(r.xy()*cxy+r.yy()*cyy) ,
00023                         r.xy()*(r.xy()*cxx+r.yy()*cxy) + r.yy()*(r.xy()*cxy+r.yy()*cyy) ,
00024                         r.xx()*(r.xz()*cxx+r.yz()*cxy) + r.yx()*(r.xz()*cxy+r.yz()*cyy) ,
00025                         r.xy()*(r.xz()*cxx+r.yz()*cxy) + r.yy()*(r.xz()*cxy+r.yz()*cyy) ,
00026                         r.xz()*(r.xz()*cxx+r.yz()*cxy) + r.yz()*(r.xz()*cxy+r.yz()*cyy) );
00027   }
00028   
00029   static LocalError transform(const GlobalError& ge, const Surface& surf) {
00030     Scalar cxx = ge.cxx(); Scalar cyx = ge.cyx(); Scalar cyy = ge.cyy();
00031     Scalar czx = ge.czx(); Scalar czy = ge.czy(); Scalar czz = ge.czz();
00032     
00033     Surface::RotationType r=surf.rotation();
00034     
00035     Scalar l11 
00036       = r.xx()*(r.xx()*cxx + r.xy()*cyx + r.xz()*czx)
00037       + r.xy()*(r.xx()*cyx + r.xy()*cyy + r.xz()*czy)
00038       + r.xz()*(r.xx()*czx + r.xy()*czy + r.xz()*czz);
00039     Scalar l12 
00040       = r.yx()*(r.xx()*cxx + r.xy()*cyx + r.xz()*czx)
00041       + r.yy()*(r.xx()*cyx + r.xy()*cyy + r.xz()*czy)
00042       + r.yz()*(r.xx()*czx + r.xy()*czy + r.xz()*czz);
00043     Scalar l22
00044       = r.yx()*(r.yx()*cxx + r.yy()*cyx + r.yz()*czx)
00045       + r.yy()*(r.yx()*cyx + r.yy()*cyy + r.yz()*czy)
00046       + r.yz()*(r.yx()*czx + r.yy()*czy + r.yz()*czz);
00047     
00048     return LocalError( l11, l12, l22);
00049   }
00050 
00051 };
00052 
00053 #endif