Go to the documentation of this file.00001 #ifndef MultiTrackKinematicConstraintT_H
00002 #define MultiTrackKinematicConstraintT_H
00003
00004 #include "RecoVertex/KinematicFitPrimitives/interface/RefCountedKinematicParticle.h"
00005 #include "RecoVertex/KinematicFitPrimitives/interface/RefCountedKinematicVertex.h"
00006 #include "DataFormats/CLHEP/interface/AlgebraicObjects.h"
00007
00008
00027 class MultiTrackKinematicConstraintBaseT
00028 {
00029 public:
00030 virtual ~MultiTrackKinematicConstraintBaseT() {}
00031
00032
00033 virtual void init(const std::vector<KinematicState>& states,
00034 const GlobalPoint& point, const GlobalVector& mf) =0;
00035
00036 virtual int numberOfEquations() const = 0;
00037
00038 virtual MultiTrackKinematicConstraintBaseT * clone() const = 0;
00039
00040
00041 };
00042
00043 template<int NTRK, int DIM>
00044 class MultiTrackKinematicConstraintT : public MultiTrackKinematicConstraintBaseT
00045 {
00046 public:
00047 enum {nTrk=NTRK, nDim=DIM};
00048
00049 typedef MultiTrackKinematicConstraintT<NTRK, DIM> self;
00050
00051 typedef ROOT::Math::SVector<double, DIM> valueType;
00052
00053 typedef ROOT::Math::SMatrix<double, DIM,7*NTRK> parametersDerivativeType;
00054
00055
00056 typedef ROOT::Math::SMatrix<double, DIM,3> positionDerivativeType;
00057
00058
00059 virtual ~MultiTrackKinematicConstraintT() {}
00060
00061
00070 valueType const & value() const {
00071 fillValue();
00072 return m_vl;
00073 }
00074
00075 parametersDerivativeType const & parametersDerivative() const {
00076 fillParametersDerivative();
00077 return m_jac_d;
00078 };
00079
00080
00081 positionDerivativeType const & positionDerivative() const {
00082 fillPositionDerivative();
00083 return m_jac_e;
00084 }
00085
00086 private:
00095 virtual void fillValue() const = 0;
00096
00097 virtual void fillParametersDerivative() const = 0;
00098
00099
00100 virtual void fillPositionDerivative() const = 0;
00101
00102 protected:
00103
00104 valueType & vl() const { return m_vl; }
00105 parametersDerivativeType & jac_d() const { return m_jac_d;}
00106 positionDerivativeType & jac_e() const { return m_jac_e;}
00107
00108
00109
00110 double & vl(size_t i) const { return m_vl(i);}
00111 double & jac_d(size_t i, size_t j) const { return m_jac_d(i,j);}
00112 double & jac_e(size_t i, size_t j) const { return m_jac_e(i,j);}
00113
00114 private:
00115
00116 mutable valueType m_vl;
00117 mutable parametersDerivativeType m_jac_d;
00118 mutable positionDerivativeType m_jac_e;
00119
00120 };
00121
00122
00123 #endif