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(): theCartesianError(new AlgebraicSymMatrix(3,0)) {}
00037
00041 GlobalErrorBase(const NullMatrix &) : theCartesianError(0) {}
00042
00047 GlobalErrorBase(T c11, T c21, T c22, T c31, T c32, T c33):
00048 theCartesianError(new AlgebraicSymMatrix(3,0)) {
00049 (*theCartesianError)(1,1)=c11;
00050 (*theCartesianError)(2,1)=c21;
00051 (*theCartesianError)(2,2)=c22;
00052 (*theCartesianError)(3,1)=c31;
00053 (*theCartesianError)(3,2)=c32;
00054 (*theCartesianError)(3,3)=c33;
00055 }
00056
00060 GlobalErrorBase(const AlgebraicSymMatrix & err) {
00061 if (err.num_row() == 3)
00062 theCartesianError = new AlgebraicSymMatrix(err);
00063 else {
00064 theCartesianError = 0;
00065
00066 throw cms::Exception("DetLogicError")<<"Not 3x3 Error Matrix: set pointer to 0\n";
00067
00068 }
00069 }
00070
00074 GlobalErrorBase(const AlgebraicSymMatrix33 & err) :
00075 theCartesianError(new AlgebraicSymMatrix(asHepMatrix(err))) { }
00076
00077 ~GlobalErrorBase() {}
00078
00079 T cxx() const {
00080 return (*theCartesianError)(1,1);
00081 }
00082
00083 T cyx() const {
00084 return (*theCartesianError)(2,1);
00085 }
00086
00087 T cyy() const {
00088 return (*theCartesianError)(2,2);
00089 }
00090
00091 T czx() const {
00092 return (*theCartesianError)(3,1);
00093 }
00094
00095 T czy() const {
00096 return (*theCartesianError)(3,2);
00097 }
00098
00099 T czz() const {
00100 return (*theCartesianError)(3,3);
00101 }
00102
00107 AlgebraicSymMatrix matrix() const {
00108 return *theCartesianError;
00109 }
00114 AlgebraicSymMatrix33 matrix_new() const {
00115 return asSMatrix<3>(*theCartesianError);
00116 }
00117
00118
00119 T rerr(const GlobalPoint& aPoint) const {
00120 T r2 = aPoint.perp2();
00121 T x2 = aPoint.x()*aPoint.x();
00122 T y2 = aPoint.y()*aPoint.y();
00123 T xy = aPoint.x()*aPoint.y();
00124 if(r2 != 0)
00125 return (1./r2)*(x2*cxx() + 2.*xy*cyx() + y2*cyy());
00126 else
00127 return 0.5*(cxx() + cyy());
00128 }
00129
00130 T phierr(const GlobalPoint& aPoint) const {
00131 T r2 = aPoint.perp2();
00132 T x2 = aPoint.x()*aPoint.x();
00133 T y2 = aPoint.y()*aPoint.y();
00134 T xy = aPoint.x()*aPoint.y();
00135 if (r2 != 0)
00136 return (1./(r2*r2))*(y2*cxx() - 2.*xy*cyx() + x2*cyy());
00137 else
00138 return 0;
00139 }
00140
00141 GlobalErrorBase operator+ (const GlobalErrorBase& err) const {
00142 return GlobalErrorBase( this->cxx()+err.cxx(),
00143 this->cyx()+err.cyx(),
00144 this->cyy()+err.cyy(),
00145 this->czx()+err.czx(),
00146 this->czy()+err.czy(),
00147 this->czz()+err.czz());
00148 }
00149 GlobalErrorBase operator- (const GlobalErrorBase& err) const {
00150 return GlobalErrorBase( this->cxx()-err.cxx(),
00151 this->cyx()-err.cyx(),
00152 this->cyy()-err.cyy(),
00153 this->czx()-err.czx(),
00154 this->czy()-err.czy(),
00155 this->czz()-err.czz());
00156 }
00157
00158 private:
00159
00160 DeepCopyPointer<AlgebraicSymMatrix> theCartesianError;
00161
00162
00163
00164 };
00165
00166 #endif
00167
00168