CMS 3D CMS Logo

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

Generated on Tue Jun 9 17:30:49 2009 for CMSSW by  doxygen 1.5.4