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/Math/interface/AlgebraicROOTObjects.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 AlgebraicSymMatrix33 & err) :
00061 theCartesianError(err) { }
00062
00063 ~GlobalErrorBase() {}
00064
00065 T cxx() const {
00066 return theCartesianError(0,0);
00067 }
00068
00069 T cyx() const {
00070 return theCartesianError(1,0);
00071 }
00072
00073 T cyy() const {
00074 return theCartesianError(1,1);
00075 }
00076
00077 T czx() const {
00078 return theCartesianError(2,0);
00079 }
00080
00081 T czy() const {
00082 return theCartesianError(2,1);
00083 }
00084
00085 T czz() const {
00086 return theCartesianError(2,2);
00087 }
00088
00093 const AlgebraicSymMatrix33 & matrix() const {
00094 return theCartesianError;
00095 }
00096 const AlgebraicSymMatrix33 & matrix_new() const {
00097 return theCartesianError;
00098 }
00099
00100
00101 T rerr(const GlobalPoint& aPoint) const {
00102 T r2 = aPoint.perp2();
00103 T x2 = aPoint.x()*aPoint.x();
00104 T y2 = aPoint.y()*aPoint.y();
00105 T xy = aPoint.x()*aPoint.y();
00106 if(r2 != 0)
00107 return std::max<T>(0, (1./r2)*(x2*cxx() + 2.*xy*cyx() + y2*cyy()));
00108 else
00109 return 0.5*(cxx() + cyy());
00110 }
00111
00112 T phierr(const GlobalPoint& aPoint) const {
00113 T r2 = aPoint.perp2();
00114 T x2 = aPoint.x()*aPoint.x();
00115 T y2 = aPoint.y()*aPoint.y();
00116 T xy = aPoint.x()*aPoint.y();
00117 if (r2 != 0)
00118 return std::max<T>(0, (1./(r2*r2))*(y2*cxx() - 2.*xy*cyx() + x2*cyy()));
00119 else
00120 return 0;
00121 }
00122
00123 GlobalErrorBase operator+ (const GlobalErrorBase& err) const {
00124 return GlobalErrorBase(theCartesianError + err.theCartesianError);
00125 }
00126 GlobalErrorBase operator- (const GlobalErrorBase& err) const {
00127 return GlobalErrorBase(theCartesianError - err.theCartesianError);
00128 }
00129
00130 private:
00131
00132 AlgebraicSymMatrix33 theCartesianError;
00133
00134 };
00135
00136 #endif
00137
00138