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