CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_0/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/Math/interface/AlgebraicROOTObjects.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 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