182 B2DEBUG(20,
"Trying fit with " << nHits <<
" hits...");
184 if (nHits < minSPs) { B2DEBUG(20,
"Only " << nHits <<
" hits!");
return false; };
186 Eigen::Matrix<double, 3, 1> average = Eigen::Matrix<double, 3, 1>::Zero(3, 1);
187 Eigen::Matrix<double, Eigen::Dynamic, 3> data = Eigen::Matrix<double, Eigen::Dynamic, 3>::Zero(nHits, 3);
188 Eigen::Matrix<double, Eigen::Dynamic, 3> P = Eigen::Matrix<double, Eigen::Dynamic, 3>::Zero(nHits, 3);
191 average(0) += sp->getPosition().X();
192 average(1) += sp->getPosition().Y();
193 average(2) += sp->getPosition().Z();
195 average *= 1. / nHits;
199 data(index, 0) = sp->getPosition().X();
200 data(index, 1) = sp->getPosition().Y();
201 data(index, 2) = sp->getPosition().Z();
203 P(index, 0) = sp->getPosition().X() - average(0);
204 P(index, 1) = sp->getPosition().Y() - average(1);
205 P(index, 2) = sp->getPosition().Z() - average(2);
210 Eigen::Matrix<double, 3, 3> product = P.transpose() * P;
212 Eigen::EigenSolver<Eigen::Matrix<double, 3, 3>> eigencollection(product);
213 Eigen::Matrix<double, 3, 1> eigenvalues = eigencollection.eigenvalues().real();
214 Eigen::Matrix<std::complex<double>, 3, 3> eigenvectors = eigencollection.eigenvectors();
215 Eigen::Matrix<double, 3, 1>::Index maxRow, maxCol;
216 eigenvalues.maxCoeff(&maxRow, &maxCol);
218 Eigen::Matrix<double, 3, 1> e = eigenvectors.col(maxRow).real();
221 Eigen::Matrix<double, 3, 1> start = data.row(nHits - 1).transpose();
222 Eigen::Matrix<double, 3, 1> second = data.row(nHits - 2).transpose();
223 m_start = {start(0), start(1), start(2)};
226 Eigen::Hyperplane<double, 3> plane(e.normalized(), start);
227 Eigen::ParametrizedLine<double, 3> line(second, e.normalized());
228 double factor = line.intersectionParameter(plane);
240 int largestChi2_index = 0;
242 Eigen::Matrix<double, 3, 1> origin(sp->getPosition().X(), sp->getPosition().Y(), sp->getPosition().Z());
243 plane = Eigen::Hyperplane<double, 3>(e.normalized(), origin);
245 Eigen::Matrix<double, 3, 1> point = line.intersectionPoint(plane);
247 double delta_chi2 = (point - origin).transpose() * (point - origin);
258 B2DEBUG(20,
"Reduced chi2 result is " <<
m_reducedChi2 <<
"...");
320 Eigen::Matrix<double, 3, 1> posA(a->getPosition().X(), a->getPosition().Y(), a->getPosition().Z());
321 Eigen::Matrix<double, 3, 1> posB(b->getPosition().X(), b->getPosition().Y(), b->getPosition().Z());
326 Eigen::ParametrizedLine<double, 3> line(origin, direction.normalized());
327 Eigen::Hyperplane<double, 3> planeA(direction.normalized(), posA);
328 Eigen::Hyperplane<double, 3> planeB(direction.normalized(), posB);
330 double parA = line.intersectionParameter(planeA);
331 double parB = line.intersectionParameter(planeB);