181 B2DEBUG(20,
"Trying fit with " << nHits <<
" hits...");
183 if (nHits < minSPs) { B2DEBUG(20,
"Only " << nHits <<
" hits!");
return false; };
185 Eigen::Matrix<double, 3, 1> average = Eigen::Matrix<double, 3, 1>::Zero(3, 1);
186 Eigen::Matrix<double, Eigen::Dynamic, 3> data = Eigen::Matrix<double, Eigen::Dynamic, 3>::Zero(nHits, 3);
187 Eigen::Matrix<double, Eigen::Dynamic, 3> P = Eigen::Matrix<double, Eigen::Dynamic, 3>::Zero(nHits, 3);
190 average(0) += sp->getPosition().X();
191 average(1) += sp->getPosition().Y();
192 average(2) += sp->getPosition().Z();
194 average *= 1. / nHits;
198 data(index, 0) = sp->getPosition().X();
199 data(index, 1) = sp->getPosition().Y();
200 data(index, 2) = sp->getPosition().Z();
202 P(index, 0) = sp->getPosition().X() - average(0);
203 P(index, 1) = sp->getPosition().Y() - average(1);
204 P(index, 2) = sp->getPosition().Z() - average(2);
209 Eigen::Matrix<double, 3, 3> product = P.transpose() * P;
211 Eigen::EigenSolver<Eigen::Matrix<double, 3, 3>> eigencollection(product);
212 Eigen::Matrix<double, 3, 1> eigenvalues = eigencollection.eigenvalues().real();
213 Eigen::Matrix<std::complex<double>, 3, 3> eigenvectors = eigencollection.eigenvectors();
214 Eigen::Matrix<double, 3, 1>::Index maxRow, maxCol;
215 eigenvalues.maxCoeff(&maxRow, &maxCol);
217 Eigen::Matrix<double, 3, 1> e = eigenvectors.col(maxRow).real();
220 Eigen::Matrix<double, 3, 1> start = data.row(nHits - 1).transpose();
221 Eigen::Matrix<double, 3, 1> second = data.row(nHits - 2).transpose();
222 m_start = {start(0), start(1), start(2)};
225 Eigen::Hyperplane<double, 3> plane(e.normalized(), start);
226 Eigen::ParametrizedLine<double, 3> line(second, e.normalized());
227 double factor = line.intersectionParameter(plane);
239 int largestChi2_index = 0;
241 Eigen::Matrix<double, 3, 1> origin(sp->getPosition().X(), sp->getPosition().Y(), sp->getPosition().Z());
242 plane = Eigen::Hyperplane<double, 3>(e.normalized(), origin);
244 Eigen::Matrix<double, 3, 1> point = line.intersectionPoint(plane);
246 double delta_chi2 = (point - origin).transpose() * (point - origin);
257 B2DEBUG(20,
"Reduced chi2 result is " <<
m_reducedChi2 <<
"...");
319 Eigen::Matrix<double, 3, 1> posA(a->getPosition().X(), a->getPosition().Y(), a->getPosition().Z());
320 Eigen::Matrix<double, 3, 1> posB(b->getPosition().X(), b->getPosition().Y(), b->getPosition().Z());
325 Eigen::ParametrizedLine<double, 3> line(origin, direction.normalized());
326 Eigen::Hyperplane<double, 3> planeA(direction.normalized(), posA);
327 Eigen::Hyperplane<double, 3> planeB(direction.normalized(), posB);
329 double parA = line.intersectionParameter(planeA);
330 double parB = line.intersectionParameter(planeB);