File indexing completed on 2024-04-06 12:29:12
0001 #include "RecoVertex/KinematicFit/interface/MassKinematicConstraint.h"
0002 #include "RecoVertex/VertexPrimitives/interface/VertexException.h"
0003
0004 MassKinematicConstraint::MassKinematicConstraint(const ParticleMass& m, const float sigma) {
0005 mass = m;
0006 AlgebraicVector deviation_l(7, 0);
0007 deviation_l(7) = sigma * sigma;
0008 dd = deviation_l;
0009 }
0010
0011 std::pair<AlgebraicVector, AlgebraicVector> MassKinematicConstraint::value(const AlgebraicVector& exPoint) const {
0012
0013
0014 if (exPoint.num_row() == 0)
0015 throw VertexException("MomentumKinematicConstraint::value requested for zero Linearization point");
0016
0017
0018 int inSize = exPoint.num_row();
0019 if ((inSize % 7) != 0)
0020 throw VertexException("MomentumKinematicConstraint::linearization point has a wrong dimension");
0021 int nStates = inSize / 7;
0022 if (nStates != 1)
0023 throw VertexException("MassKinematicConstraint::multiple state refit is not supported in this version");
0024 AlgebraicVector vl(1, 0);
0025 AlgebraicVector point = exPoint;
0026 vl(1) = point(7) - mass;
0027 return std::pair<AlgebraicVector, AlgebraicVector>(vl, point);
0028 }
0029
0030 std::pair<AlgebraicMatrix, AlgebraicVector> MassKinematicConstraint::derivative(const AlgebraicVector& exPoint) const {
0031 if (exPoint.num_row() == 0)
0032 throw VertexException("MomentumKinematicConstraint::deriavtive requested for zero Linearization point");
0033
0034
0035 int inSize = exPoint.num_row();
0036 if ((inSize % 7) != 0)
0037 throw VertexException("MomentumKinematicConstraint::linearization point has a wrong dimension");
0038 int nStates = inSize / 7;
0039 if (nStates != 1)
0040 throw VertexException("MassKinematicConstraint::multiple state refit is not supported in this version");
0041 AlgebraicMatrix dr(1, 7, 0);
0042 dr(1, 7) = 1;
0043 AlgebraicVector point = exPoint;
0044 return std::pair<AlgebraicMatrix, AlgebraicVector>(dr, point);
0045 }
0046
0047 std::pair<AlgebraicVector, AlgebraicVector> MassKinematicConstraint::value(
0048 const std::vector<RefCountedKinematicParticle>& par) const {
0049 int nStates = par.size();
0050 if (nStates == 0)
0051 throw VertexException("MassKinematicConstraint::empty vector of particles passed");
0052 if (nStates != 1)
0053 throw VertexException("MassKinematicConstraint::multiple state refit is not supported in this version");
0054
0055 AlgebraicVector point = asHepVector<7>(par.front()->currentState().kinematicParameters().vector());
0056 AlgebraicVector vl(1, 0);
0057 vl(1) = point(7) - mass;
0058 return std::pair<AlgebraicVector, AlgebraicVector>(vl, point);
0059 }
0060
0061 std::pair<AlgebraicMatrix, AlgebraicVector> MassKinematicConstraint::derivative(
0062 const std::vector<RefCountedKinematicParticle>& par) const {
0063 int nStates = par.size();
0064 if (nStates == 0)
0065 throw VertexException("MassKinematicConstraint::empty vector of particles passed");
0066 if (nStates != 1)
0067 throw VertexException("MassKinematicConstraint::multiple state refit is not supported in this version");
0068
0069 AlgebraicVector point = asHepVector<7>(par.front()->currentState().kinematicParameters().vector());
0070 AlgebraicMatrix dr(1, 7, 0);
0071 dr(1, 7) = 1;
0072 return std::pair<AlgebraicMatrix, AlgebraicVector>(dr, point);
0073 }
0074
0075 AlgebraicVector MassKinematicConstraint::deviations(int nStates) const {
0076 if (nStates == 0)
0077 throw VertexException("MassKinematicConstraint::empty vector of particles passed");
0078 if (nStates != 1)
0079 throw VertexException("MassKinematicConstraint::multiple state refit is not supported in this version");
0080 AlgebraicVector res = dd;
0081 return res;
0082 }
0083
0084 int MassKinematicConstraint::numberOfEquations() const { return 1; }