Minimal implementation of the quality estimation Calculates quality indicator in range [0,1].
measurements - std::vector<SpacePoint const*> ordered from innermost to outermost measurement
24 const int nHits = measurements.size();
25 if (nHits < 3)
return 0;
29 Eigen::Matrix<Precision, Eigen::Dynamic, Eigen::Dynamic> W = Eigen::Matrix<Precision, Eigen::Dynamic, Eigen::Dynamic>::Zero(nHits,
31 Eigen::Matrix<Precision, Eigen::Dynamic, Eigen::Dynamic> Wz = Eigen::Matrix<Precision, Eigen::Dynamic, Eigen::Dynamic>::Zero(nHits,
33 Eigen::Matrix<Precision, Eigen::Dynamic, 3> X = Eigen::Matrix<Precision, Eigen::Dynamic, 3>::Zero(nHits, 3);
34 Eigen::Matrix<Precision, Eigen::Dynamic, 1> Z = Eigen::Matrix<Precision, Eigen::Dynamic, 1>::Zero(nHits, 1);
35 Precision traceOfW = 0.;
39 auto position = hit->getPosition();
40 auto positionError = hit->getPositionError();
41 double x = position.X();
42 double y = position.Y();
43 double z = position.Z();
44 double sigmaX = positionError.X();
45 double sigmaY = positionError.Y();
46 double sigmaZ = positionError.Z();
48 double r2 = x * x + y * y;
49 double inverseVarianceXY = 1. / sqrt(sigmaX * sigmaX + sigmaY * sigmaY);
55 W(index, index) = inverseVarianceXY;
56 traceOfW += inverseVarianceXY;
63 Wz(index, index) = 1. / sigmaZ;
69 Eigen::Matrix<Precision, 1, 3> xBar = Eigen::Matrix<Precision, Eigen::Dynamic, 1>::Ones(nHits, 1).transpose() * W * X / traceOfW;
70 Eigen::Matrix<Precision, 3, 3> Vx = X.transpose() * W * X - xBar.transpose() * xBar * traceOfW;
73 Eigen::EigenSolver<Eigen::Matrix<Precision, 3, 3>> eigencollection(Vx);
74 Eigen::Matrix<Precision, 3, 1> eigenvalues = eigencollection.eigenvalues().real();
75 Eigen::Matrix<std::complex<Precision>, 3, 3> eigenvectors = eigencollection.eigenvectors();
76 Eigen::Matrix<Precision, 3, 1>::Index minRow, minCol;
77 eigenvalues.minCoeff(&minRow, &minCol);
79 Eigen::Matrix<Precision, 3, 1> n = eigenvectors.col(minRow).real();
82 Precision c = - xBar * n;
83 Precision x0 = - 0.5 * n(0) / n(2);
84 Precision y0 = - 0.5 * n(1) / n(2);
85 Precision rho2 = (1 - n(2) * (n(2) + 4 * c)) / (4 * n(2) * n(2));
86 Precision rho = sqrt(rho2);
89 Precision divisor = 1. / traceOfW;
90 Eigen::Matrix<Precision, Eigen::Dynamic, 1> unitvec = Eigen::Matrix<Precision, Eigen::Dynamic, 1>::Ones(nHits, 1);
91 Precision meanX = unitvec.transpose() * W * X.col(0);
93 Precision meanY = unitvec.transpose() * W * X.col(1);
95 Precision meanXY = unitvec.transpose() * W * (X.col(0).cwiseProduct(X.col(1)));
97 Precision meanX2 = unitvec.transpose() * W * (X.col(0).cwiseProduct(X.col(0)));
99 Precision meanY2 = unitvec.transpose() * W * (X.col(1).cwiseProduct(X.col(1)));
101 Precision meanXR2 = unitvec.transpose() * W * (X.col(0).cwiseProduct(X.col(2)));
103 Precision meanYR2 = unitvec.transpose() * W * (X.col(1).cwiseProduct(X.col(2)));
105 Precision meanR2 = unitvec.transpose() * W * X.col(2);
107 Precision meanR4 = unitvec.transpose() * W * (X.col(2).cwiseProduct(X.col(2)));
111 Precision covXX = meanX2 - meanX * meanX;
112 Precision covXY = meanXY - meanX * meanY;
113 Precision covYY = meanY2 - meanY * meanY;
114 Precision covXR2 = meanXR2 - meanX * meanR2;
115 Precision covYR2 = meanYR2 - meanY * meanR2;
116 Precision covR2R2 = meanR4 - meanR2 * meanR2;
119 Precision q1 = covR2R2 * covXY - covXR2 * covYR2;
120 Precision q2 = covR2R2 * (covXX - covYY) - covXR2 * covXR2 + covYR2 * covYR2;
122 Precision pocaPhi = 0.5 * atan2(2. * q1, q2);
124 Precision sinPhi = sin(pocaPhi);
125 Precision cosPhi = cos(pocaPhi);
126 Precision kappa = (sinPhi * covXR2 - cosPhi * covYR2) / covR2R2;
127 Precision delta = -kappa * meanR2 + sinPhi * meanX - cosPhi * meanY;
128 Precision rootTerm = sqrt(1. - 4.*delta * kappa);
129 Precision curvature = 2.*kappa / (rootTerm);
130 Precision pocaD = 2.*delta / (1. + rootTerm);
133 if ((curvature < 0 && curvatureSign >= 0) || (curvature > 0 && curvatureSign < 0)) {
134 curvature = -curvature;
139 Precision chi2 = traceOfW * (1. + pocaD / rho) * (1. + curvature * pocaD) *
140 (sinPhi * sinPhi * covXX - 2.*sinPhi * cosPhi * covXY + cosPhi * cosPhi * covYY - kappa * kappa * covR2R2);
143 Precision x_first = X.col(0)(0) - x0;
144 Precision y_first = X.col(1)(0) - y0;
145 Precision r_mag_first = sqrt(x_first * x_first + y_first * y_first);
146 Eigen::Matrix<Precision, Eigen::Dynamic, 1> x0s = Eigen::Matrix<Precision, Eigen::Dynamic, 1>::Ones(nHits, 1) * x0;
147 Eigen::Matrix<Precision, Eigen::Dynamic, 1> y0s = Eigen::Matrix<Precision, Eigen::Dynamic, 1>::Ones(nHits, 1) * y0;
148 Eigen::Matrix<Precision, Eigen::Dynamic, 1> r_mags = ((X.col(0) - x0s).cwiseProduct(X.col(0) - x0s) + (X.col(1) - y0s).cwiseProduct(
149 X.col(1) - y0s)).cwiseSqrt();
151 Eigen::Matrix<Precision, Eigen::Dynamic, 1> arc_angles = (x_first * (X.col(0) - x0s) + y_first * (X.col(1) - y0s)).cwiseQuotient(
152 r_mags) / r_mag_first;
153 Eigen::Matrix<Precision, Eigen::Dynamic, 1> arc_lengths = rho * arc_angles.array().acos().matrix();
155 Eigen::Matrix<Precision, Eigen::Dynamic, 2> A = Eigen::Matrix<Precision, Eigen::Dynamic, 2>::Ones(nHits, 2);
157 A.col(1) = arc_lengths;
160 Eigen::Matrix<Precision, 2, 1> p = (A.transpose() * Wz * A).inverse() * A.transpose() * Wz * Z;
163 Eigen::Matrix<Precision, 3, 1> momVec = Eigen::Matrix<Precision, 3, 1>::Zero();
164 momVec(0) = y0 - X.col(1)(0);
165 momVec(1) = - (x0 - X.col(0)(0));
167 Precision pT = Precision(
calcPt(rho));
168 momVec = pT * momVec.normalized();
170 Eigen::Matrix<Precision, 3, 1> vec01 = X.row(1) - X.row(0);
171 vec01(2) = Z(1) - Z(0);
172 Precision angle01 = std::acos(vec01.dot(momVec) / momVec.norm() / vec01.norm());
173 if (angle01 > 0.5 * M_PI) { momVec *= -1.; }
176 Eigen::Matrix<Precision, Eigen::Dynamic, 1> ones = Eigen::Matrix<Precision, Eigen::Dynamic, 1>::Ones(nHits, 1);
177 Precision chi2_z = ((Z - p(0) * ones - p(1) * arc_lengths).cwiseQuotient(Wz * ones)).transpose() * ((Z - p(0) * ones - p(
178 1) * arc_lengths).cwiseQuotient(Wz * ones));
182 B2DEBUG(75,
"Chi Squared of extended Riemann = " << * (
m_results.
chiSquared) << std::endl);
184 Precision pZ = pT * p(1);
187 m_results.
p = TVector3(momVec(0), momVec(1), momVec(2));