14 #include <FairLogger.h>
33 std::unique_ptr<AtPatterns::AtPattern>
34 AtSampleConsensus::GeneratePatternFromHits(
const std::vector<const AtHit *> &hitArray)
37 if (hitArray.size() < fMinPatternPoints) {
40 LOG(debug) <<
"Creating pattern";
42 LOG(debug) <<
"Sampling points";
43 auto points = fRandSampler->SamplePoints(pattern->GetNumPoints());
44 LOG(debug) <<
"Defining pattern";
45 pattern->DefinePattern(points);
47 LOG(debug) <<
"Testing pattern";
49 LOG(debug) <<
"Found " << nInliers <<
" inliers" << std::endl;
52 if (nInliers > fMinPatternPoints) {
53 LOG(debug) <<
"Adding pattern with nInliers: " << nInliers << std::endl;
63 return Solve(hitVec, event);
69 return Solve(hitVec, event);
75 if (event !=
nullptr && !event->
IsGood())
78 if (hitArray.size() < fMinPatternPoints) {
79 LOG(error) <<
"Not enough points to solve. Has " << hitArray.size() <<
" requires " << fMinPatternPoints;
82 LOG(info) <<
"Solving with " << hitArray.size() <<
" points";
84 auto comp = [](
const PatternPtr &a,
const PatternPtr &b) {
return a->GetChi2() < b->GetChi2(); };
85 auto sortedPatterns = std::set<PatternPtr, decltype(comp)>(comp);
87 LOG(debug2) <<
"Generating " << fIterations <<
" patterns";
88 fRandSampler->SetHitsToSample(hitArray);
89 for (
int i = 0; i < fIterations; i++) {
91 LOG(debug) <<
"Iteration: " << i <<
"/" << fIterations;
93 auto pattern = GeneratePatternFromHits(hitArray);
94 if (pattern !=
nullptr)
95 sortedPatterns.insert(std::move(pattern));
97 LOG(debug2) <<
"Created " << sortedPatterns.size() <<
" valid patterns.";
100 auto remainHits = hitArray;
105 for (
const auto &pattern : sortedPatterns) {
106 if (remainHits.size() < fMinPatternPoints)
109 auto inlierHits = movePointsInPattern(pattern.get(), remainHits);
110 if (inlierHits.size() > fMinPatternPoints) {
111 auto track = CreateTrack(pattern.get(), inlierHits);
118 for (
auto &hit : remainHits)
124 AtTrack AtSampleConsensus::CreateTrack(AtPattern *pattern, std::vector<const AtHit *> &inliers)
129 for (
auto hit : inliers)
130 track.
AddHit(std::move(*hit));
133 pattern->FitPattern(inliers, fChargeThres);
146 std::vector<const AtHit *> AtSampleConsensus::movePointsInPattern(AtPattern *pattern, std::vector<const AtHit *> &hits)
149 auto isInPattern = [pattern,
this](
const AtHit *hit) {
150 double error = pattern->DistanceToPattern(hit->GetPosition());
151 return (error * error) < (fDistanceThreshold * fDistanceThreshold);