CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch13/src/DataFormats/GeometryCommonDetAlgo/interface/GlobalErrorBase.h

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 // Exceptions
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       //throw DetLogicError("Not 3x3 Error Matrix: set pointer to 0");
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