File indexing completed on 2023-03-17 11:23:25
0001 #include "RecoVertex/KinematicFit/interface/VertexKinematicConstraintT.h"
0002 #include "RecoVertex/VertexPrimitives/interface/VertexException.h"
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004
0005 VertexKinematicConstraintT::VertexKinematicConstraintT() {}
0006
0007 VertexKinematicConstraintT::~VertexKinematicConstraintT() {}
0008
0009 void VertexKinematicConstraintT::init(const std::vector<KinematicState>& states,
0010 const GlobalPoint& ipoint,
0011 const GlobalVector& fieldValue) {
0012 int num = states.size();
0013 if (num != 2)
0014 throw VertexException("VertexKinematicConstraintT !=2 states passed");
0015 double mfz = fieldValue.z();
0016
0017 int j = 0;
0018 for (std::vector<KinematicState>::const_iterator i = states.begin(); i != states.end(); i++) {
0019 mom[j] = i->globalMomentum();
0020 dpos[j] = ipoint - i->globalPosition();
0021 a_i[j] = -i->particleCharge() * mfz;
0022
0023 double pvx = mom[j].x() - a_i[j] * dpos[j].y();
0024 double pvy = mom[j].y() + a_i[j] * dpos[j].x();
0025 double pvt2 = pvx * pvx + pvy * pvy;
0026 novera[j] = (dpos[j].x() * mom[j].x() + dpos[j].y() * mom[j].y());
0027 n[j] = a_i[j] * novera[j];
0028 m[j] = (pvx * mom[j].x() + pvy * mom[j].y());
0029 k[j] = -mom[j].z() / (mom[j].perp2() * pvt2);
0030 delta[j] = std::atan2(n[j], m[j]);
0031
0032 ++j;
0033 }
0034 }
0035
0036 void VertexKinematicConstraintT::fillValue() const {
0037
0038 for (int j = 0; j != 2; ++j) {
0039 if (a_i[j] != 0) {
0040
0041 super::vl(j * 2) = dpos[j].y() * mom[j].x() - dpos[j].x() * mom[j].y() -
0042 a_i[j] * (dpos[j].x() * dpos[j].x() + dpos[j].y() * dpos[j].y()) * 0.5;
0043 super::vl(j * 2 + 1) = dpos[j].z() - mom[j].z() * delta[j] / a_i[j];
0044 } else {
0045
0046 double pt2Inverse = 1. / mom[j].perp2();
0047 super::vl(j * 2) = dpos[j].y() * mom[j].x() - dpos[j].x() * mom[j].y();
0048 super::vl(j * 2 + 1) =
0049 dpos[j].z() - mom[j].z() * ((dpos[j].x() * mom[j].x() + dpos[j].y() * mom[j].y()) * pt2Inverse);
0050 }
0051 }
0052 }
0053
0054 void VertexKinematicConstraintT::fillParametersDerivative() const {
0055 ROOT::Math::SMatrix<double, 2, 7> el_part_d;
0056 for (int j = 0; j != 2; ++j) {
0057 if (a_i[j] != 0) {
0058
0059
0060
0061 el_part_d(0, 0) = mom[j].y() + a_i[j] * dpos[j].x();
0062 el_part_d(0, 1) = -mom[j].x() + a_i[j] * dpos[j].y();
0063 el_part_d(1, 0) = -k[j] * (m[j] * mom[j].x() - n[j] * mom[j].y());
0064 el_part_d(1, 1) = -k[j] * (m[j] * mom[j].y() + n[j] * mom[j].x());
0065 el_part_d(1, 2) = -1.;
0066 el_part_d(0, 3) = dpos[j].y();
0067 el_part_d(0, 4) = -dpos[j].x();
0068 el_part_d(1, 3) = k[j] * (m[j] * dpos[j].x() - novera[j] * (2 * mom[j].x() - a_i[j] * dpos[j].y()));
0069 el_part_d(1, 4) = k[j] * (m[j] * dpos[j].y() - novera[j] * (2 * mom[j].y() + a_i[j] * dpos[j].x()));
0070 el_part_d(1, 5) = -delta[j] / a_i[j];
0071 super::jac_d().Place_at(el_part_d, j * 2, j * 7);
0072 } else {
0073
0074 double pt2Inverse = 1. / mom[j].perp2();
0075 el_part_d(0, 0) = mom[j].y();
0076 el_part_d(0, 1) = -mom[j].x();
0077 el_part_d(1, 0) = mom[j].x() * (mom[j].z() * pt2Inverse);
0078 el_part_d(1, 1) = mom[j].y() * (mom[j].z() * pt2Inverse);
0079 el_part_d(1, 2) = -1.;
0080 el_part_d(0, 3) = dpos[j].y();
0081 el_part_d(0, 4) = -dpos[j].x();
0082 el_part_d(1, 3) = 2 * (dpos[j].x() * mom[j].x() + dpos[j].y() * mom[j].y()) * pt2Inverse * mom[j].x() *
0083 (mom[j].z() * pt2Inverse) -
0084 dpos[j].x() * (mom[j].z() * pt2Inverse);
0085 el_part_d(1, 4) = 2 * (dpos[j].x() * mom[j].x() + dpos[j].y() * mom[j].y()) * pt2Inverse * mom[j].y() *
0086 (mom[j].z() * pt2Inverse) -
0087 dpos[j].x() * (mom[j].z() * pt2Inverse);
0088 el_part_d(1, 5) = -(dpos[j].x() * mom[j].x() + dpos[j].y() * mom[j].y()) * pt2Inverse;
0089 super::jac_d().Place_at(el_part_d, j * 2, j * 7);
0090 }
0091 }
0092 }
0093
0094 void VertexKinematicConstraintT::fillPositionDerivative() const {
0095 ROOT::Math::SMatrix<double, 2, 3> el_part_e;
0096 for (int j = 0; j != 2; ++j) {
0097 if (a_i[j] != 0) {
0098
0099
0100
0101 el_part_e(0, 0) = -(mom[j].y() + a_i[j] * dpos[j].x());
0102 el_part_e(0, 1) = mom[j].x() - a_i[j] * dpos[j].y();
0103 el_part_e(1, 0) = k[j] * (m[j] * mom[j].x() - n[j] * mom[j].y());
0104 el_part_e(1, 1) = k[j] * (m[j] * mom[j].y() + n[j] * mom[j].x());
0105 el_part_e(1, 2) = 1;
0106 super::jac_e().Place_at(el_part_e, 2 * j, 0);
0107 } else {
0108
0109 double pt2Inverse = 1. / mom[j].perp2();
0110 el_part_e(0, 0) = -mom[j].y();
0111 el_part_e(0, 1) = mom[j].x();
0112 el_part_e(1, 0) = -mom[j].x() * mom[j].z() * pt2Inverse;
0113 el_part_e(1, 1) = -mom[j].y() * mom[j].z() * pt2Inverse;
0114 el_part_e(1, 2) = 1;
0115 super::jac_e().Place_at(el_part_e, 2 * j, 0);
0116 }
0117 }
0118 }
0119
0120 int VertexKinematicConstraintT::numberOfEquations() const { return 2; }