14 #include <Eigen/Dense>
15 #include <Eigen/Geometry>
17 #include <framework/datastore/StoreArray.h>
19 #include <tracking/spacePointCreation/SpacePoint.h>
35 class StandaloneCosmicsCollector {
55 if ((index < 1) or (index > 3)) {
56 B2FATAL(
"Invalid sorting mode chosen! You used " <<
m_sortingMode
57 <<
". Must be one of 1 (by radius), 2 (by x) or 3 (by y).");
74 for (
auto& spArray : SPs) {
75 for (
auto& sp : spArray) {
94 bool doFit(
double qualityCut,
int maxRejected,
int minSPs)
102 if (not fitting) {
return false;}
104 B2DEBUG(20,
"Refitting without sp with index " <<
m_shittiest.second
105 <<
" and chi2 contribution " <<
m_shittiest.first <<
"...");
109 if (rejected > maxRejected) { B2DEBUG(20,
"Rejected " << rejected <<
"!");
return false; }
124 std::pair<std::vector<double>, std::vector<double>>
getResult()
136 std::vector<const SpacePoint*>
getSPTC()
163 [
this](
const SpacePoint * lhs,
const SpacePoint * rhs)
164 ->
bool { return this->compareRads(lhs, rhs); });
184 B2DEBUG(20,
"Trying fit with " << nHits <<
" hits...");
186 if (nHits < minSPs) { B2DEBUG(20,
"Only " << nHits <<
" hits!");
return false; };
188 Eigen::Matrix<double, 3, 1> average = Eigen::Matrix<double, 3, 1>::Zero(3, 1);
189 Eigen::Matrix<double, Eigen::Dynamic, 3> data = Eigen::Matrix<double, Eigen::Dynamic, 3>::Zero(nHits, 3);
190 Eigen::Matrix<double, Eigen::Dynamic, 3> P = Eigen::Matrix<double, Eigen::Dynamic, 3>::Zero(nHits, 3);
193 average(0) += sp->getPosition().X();
194 average(1) += sp->getPosition().Y();
195 average(2) += sp->getPosition().Z();
197 average *= 1. / nHits;
201 data(index, 0) = sp->getPosition().X();
202 data(index, 1) = sp->getPosition().Y();
203 data(index, 2) = sp->getPosition().Z();
205 P(index, 0) = sp->getPosition().X() - average(0);
206 P(index, 1) = sp->getPosition().Y() - average(1);
207 P(index, 2) = sp->getPosition().Z() - average(2);
212 Eigen::Matrix<double, 3, 3> product = P.transpose() * P;
214 Eigen::EigenSolver<Eigen::Matrix<double, 3, 3>> eigencollection(product);
215 Eigen::Matrix<double, 3, 1> eigenvalues = eigencollection.eigenvalues().real();
216 Eigen::Matrix<std::complex<double>, 3, 3> eigenvectors = eigencollection.eigenvectors();
217 Eigen::Matrix<double, 3, 1>::Index maxRow, maxCol;
218 eigenvalues.maxCoeff(&maxRow, &maxCol);
220 Eigen::Matrix<double, 3, 1> e = eigenvectors.col(maxRow).real();
223 Eigen::Matrix<double, 3, 1> start = data.row(nHits - 1).transpose();
224 Eigen::Matrix<double, 3, 1> second = data.row(nHits - 2).transpose();
225 m_start = {start(0), start(1), start(2)};
228 Eigen::Hyperplane<double, 3> plane(
e.normalized(), start);
229 Eigen::ParametrizedLine<double, 3> line(second,
e.normalized());
230 double factor = line.intersectionParameter(plane);
244 Eigen::Matrix<double, 3, 1> origin(sp->getPosition().X(), sp->getPosition().Y(), sp->getPosition().Z());
245 plane = Eigen::Hyperplane<double, 3>(
e.normalized(), origin);
247 Eigen::Matrix<double, 3, 1> point = line.intersectionPoint(plane);
249 double delta_chi2 = (point - origin).transpose() * (point - origin);
260 B2DEBUG(20,
"Reduced chi2 result is " <<
m_reducedChi2 <<
"...");
272 bool compareRads(
const SpacePoint* a,
const SpacePoint* b)
275 double radA = a->getPosition().X() * a->getPosition().X() + a->getPosition().Y() * a->getPosition().Y();
276 double radB = b->getPosition().X() * b->getPosition().X() + b->getPosition().Y() * b->getPosition().Y();
279 double xA = a->getPosition().X();
280 double xB = b->getPosition().X();
283 double yA = a->getPosition().Y();
284 double yB = b->getPosition().Y();
287 B2FATAL(
"Invalid sorting mode chosen! You used " <<
m_sortingMode
288 <<
". Must be one of 1 (by radius), 2 (by x) or 3 (by y).");
301 std::vector<const SpacePoint*> sortedSPs;
303 auto forwardIt = std::lower_bound(sortedSPs.begin(), sortedSPs.end(), SP,
304 [
this](
const SpacePoint * lhs,
const SpacePoint * rhs) ->
bool {
305 return this->comparePars(lhs, rhs);
307 sortedSPs.insert(forwardIt, SP);
320 bool comparePars(
const SpacePoint* a,
const SpacePoint* b)
322 Eigen::Matrix<double, 3, 1> posA(a->getPosition().X(), a->getPosition().Y(), a->getPosition().Z());
323 Eigen::Matrix<double, 3, 1> posB(b->getPosition().X(), b->getPosition().Y(), b->getPosition().Z());
328 Eigen::ParametrizedLine<double, 3> line(origin, direction.normalized());
329 Eigen::Hyperplane<double, 3> planeA(direction.normalized(), posA);
330 Eigen::Hyperplane<double, 3> planeB(direction.normalized(), posB);
332 double parA = line.intersectionParameter(planeA);
333 double parB = line.intersectionParameter(planeB);
360 std::pair<double, int>
m_shittiest = std::pair<double, int>(0., 0);
363 std::vector<double>
m_start {0., 0., 0.};