![]() |
![]() |
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 class ErrorFrameTransformer { 00009 public: 00010 00011 typedef Surface::Scalar Scalar; 00012 00013 GlobalError transform(const LocalError& le, const Surface& surf) const { 00014 // the GlobalError is a sym matrix, initialisation takes only 00015 // 6 T because GlobalError is stored as a lower triangular matrix. 00016 Scalar cxx = le.xx(); 00017 Scalar cxy = le.xy(); 00018 Scalar cyy = le.yy(); 00019 00020 Surface::RotationType r=surf.rotation(); 00021 00022 return GlobalError( r.xx()*(r.xx()*cxx+r.yx()*cxy) + r.yx()*(r.xx()*cxy+r.yx()*cyy) , 00023 r.xx()*(r.xy()*cxx+r.yy()*cxy) + r.yx()*(r.xy()*cxy+r.yy()*cyy) , 00024 r.xy()*(r.xy()*cxx+r.yy()*cxy) + r.yy()*(r.xy()*cxy+r.yy()*cyy) , 00025 r.xx()*(r.xz()*cxx+r.yz()*cxy) + r.yx()*(r.xz()*cxy+r.yz()*cyy) , 00026 r.xy()*(r.xz()*cxx+r.yz()*cxy) + r.yy()*(r.xz()*cxy+r.yz()*cyy) , 00027 r.xz()*(r.xz()*cxx+r.yz()*cxy) + r.yz()*(r.xz()*cxy+r.yz()*cyy) ); 00028 } 00029 00030 LocalError transform(const GlobalError& ge, const Surface& surf) const { 00031 Scalar cxx = ge.cxx(); Scalar cyx = ge.cyx(); Scalar cyy = ge.cyy(); 00032 Scalar czx = ge.czx(); Scalar czy = ge.czy(); Scalar czz = ge.czz(); 00033 00034 Surface::RotationType r=surf.rotation(); 00035 00036 Scalar l11 00037 = r.xx()*(r.xx()*cxx + r.xy()*cyx + r.xz()*czx) 00038 + r.xy()*(r.xx()*cyx + r.xy()*cyy + r.xz()*czy) 00039 + r.xz()*(r.xx()*czx + r.xy()*czy + r.xz()*czz); 00040 Scalar l12 00041 = r.yx()*(r.xx()*cxx + r.xy()*cyx + r.xz()*czx) 00042 + r.yy()*(r.xx()*cyx + r.xy()*cyy + r.xz()*czy) 00043 + r.yz()*(r.xx()*czx + r.xy()*czy + r.xz()*czz); 00044 Scalar l22 00045 = r.yx()*(r.yx()*cxx + r.yy()*cyx + r.yz()*czx) 00046 + r.yy()*(r.yx()*cyx + r.yy()*cyy + r.yz()*czy) 00047 + r.yz()*(r.yx()*czx + r.yy()*czy + r.yz()*czz); 00048 00049 return LocalError( l11, l12, l22); 00050 } 00051 00052 }; 00053 00054 #endif