Go to the documentation of this file.00001 #ifndef GlobalErrorType_H
00002 #define GlobalErrorType_H
00003
00004 #include "DataFormats/GeometryCommonDetAlgo/interface/DeepCopyPointer.h"
00005 #include "DataFormats/CLHEP/interface/AlgebraicObjects.h"
00006 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00007
00008
00009
00010 #include "FWCore/Utilities/interface/Exception.h"
00011
00025 template <class T, class ErrorWeightType>
00026 class GlobalErrorBase
00027 {
00028
00029 public:
00031 class NullMatrix{};
00032
00036 GlobalErrorBase() {}
00037
00041 GlobalErrorBase(const NullMatrix &) {}
00042
00043
00048 GlobalErrorBase(T c11, T c21, T c22, T c31, T c32, T c33) {
00049 theCartesianError(0,0)=c11;
00050 theCartesianError(1,0)=c21;
00051 theCartesianError(1,1)=c22;
00052 theCartesianError(2,0)=c31;
00053 theCartesianError(2,1)=c32;
00054 theCartesianError(2,2)=c33;
00055 }
00056
00060 GlobalErrorBase(const AlgebraicSymMatrix & err) {
00061 if (err.num_row() == 3)
00062 theCartesianError = asSMatrix<3>(err);
00063 else {
00064
00065 throw cms::Exception("DetLogicError")<<"Not 3x3 Error Matrix: set pointer to 0\n";
00066
00067 }
00068 }
00069
00073 GlobalErrorBase(const AlgebraicSymMatrix33 & err) :
00074 theCartesianError(err) { }
00075
00076 ~GlobalErrorBase() {}
00077
00078 T cxx() const {
00079 return theCartesianError(0,0);
00080 }
00081
00082 T cyx() const {
00083 return theCartesianError(1,0);
00084 }
00085
00086 T cyy() const {
00087 return theCartesianError(1,1);
00088 }
00089
00090 T czx() const {
00091 return theCartesianError(2,0);
00092 }
00093
00094 T czy() const {
00095 return theCartesianError(2,1);
00096 }
00097
00098 T czz() const {
00099 return theCartesianError(2,2);
00100 }
00101
00106 AlgebraicSymMatrix matrix() const {
00107 return asHepMatrix(theCartesianError);
00108 }
00113 const AlgebraicSymMatrix33 & matrix_new() const {
00114 return theCartesianError;
00115 }
00116
00117
00118 T rerr(const GlobalPoint& aPoint) const {
00119 T r2 = aPoint.perp2();
00120 T x2 = aPoint.x()*aPoint.x();
00121 T y2 = aPoint.y()*aPoint.y();
00122 T xy = aPoint.x()*aPoint.y();
00123 if(r2 != 0)
00124 return (1./r2)*(x2*cxx() + 2.*xy*cyx() + y2*cyy());
00125 else
00126 return 0.5*(cxx() + cyy());
00127 }
00128
00129 T phierr(const GlobalPoint& aPoint) const {
00130 T r2 = aPoint.perp2();
00131 T x2 = aPoint.x()*aPoint.x();
00132 T y2 = aPoint.y()*aPoint.y();
00133 T xy = aPoint.x()*aPoint.y();
00134 if (r2 != 0)
00135 return (1./(r2*r2))*(y2*cxx() - 2.*xy*cyx() + x2*cyy());
00136 else
00137 return 0;
00138 }
00139
00140 GlobalErrorBase operator+ (const GlobalErrorBase& err) const {
00141 return GlobalErrorBase(theCartesianError + err.theCartesianError);
00142 }
00143 GlobalErrorBase operator- (const GlobalErrorBase& err) const {
00144 return GlobalErrorBase(theCartesianError - err.theCartesianError);
00145 }
00146
00147 private:
00148
00149 AlgebraicSymMatrix33 theCartesianError;
00150
00151 };
00152
00153 #endif
00154
00155