37 std::unique_ptr<StraightPatRec> sfitter = std::make_unique<StraightPatRec>();
41 std::vector<unsigned int> hit_index;
42 unsigned int try_nb_hits;
43 bool segment_found(
false);
49 std::vector<Amg::Vector3D>
points;
62 throw std::runtime_error(
63 Form(
"File: %s, Line: %d\nCurvedPatRec::fit - Size of selection vector does not match the number of hits on track!", __FILE__,
76 if (sfitter->fit(r_segment, r_selection,
track)) { est_dir =
track.directionVector(); }
81 if (r_selection[
k] == 0 && hit->sigmaDriftRadius() < 100) { loc_track_hits.push_back(hit); };
86 if (loc_track_hits.size() < 4) {
return false; }
92 try_nb_hits = loc_track_hits.size();
97 while (!segment_found && try_nb_hits > 3) {
99 combination.setNewParameters(loc_track_hits.size(), try_nb_hits);
100 for (
unsigned int cb = 0; cb < combination.numberOfCombinations(); cb++) {
106 log << MSG::WARNING <<
"Class CurvedPatRec, method fit: time-out for track finding after " <<
m_time_out <<
" seconds!"
113 combination.currentCombination(hit_index);
115 combination.nextCombination(hit_index);
118 for (
unsigned int k = 0;
k < try_nb_hits; ++
k) { track_hits.push_back(loc_track_hits[hit_index[
k] - 1]); }
125 segment_found =
true;
128 std::vector<Amg::Vector3D>
errors(track_hits.size());
129 for (
unsigned int k = 0;
k <
errors.size();
k++) {
130 if (track_hits[
k]->sigmaDriftRadius() > 0.0) {
144 double tmp_chi2(0.0);
145 for (
auto & track_hit : track_hits) {
149 double d(std::abs(tang.signDistFrom(wire)));
150 if (track_hit->sigma2DriftRadius() != 0) {
151 tmp_chi2 = tmp_chi2 +
std::pow(
d - track_hit->driftRadius(), 2) / track_hit->sigma2DriftRadius();
153 tmp_chi2 = tmp_chi2 +
std::pow(
d - track_hit->driftRadius(), 2) / 0.01;
160 curved_track = aux_line;
162 stored_track_hits = track_hits;
167 try_nb_hits = try_nb_hits - 1;
170 if (!segment_found) {
return false; }
178 std::vector<Amg::Vector3D>
errors(stored_track_hits.size());
179 for (
unsigned int k = 0;
k <
errors.size();
k++) {
180 if (stored_track_hits[
k]->sigmaDriftRadius() > 0.0) {
195 for (
auto & stored_track_hit : stored_track_hits) {
199 double d(std::abs(tang.signDistFrom(wire)));
200 if (stored_track_hit->sigma2DriftRadius() != 0) {
201 chi2 +=
std::pow(
d - stored_track_hit->driftRadius(), 2) / stored_track_hit->sigma2DriftRadius();
203 chi2 +=
std::pow(
d - stored_track_hit->driftRadius(), 2) / 0.01;
217 double dist(tang.signDistFrom(aux_line));
218 double dist_err(1.0);
219 hit->setDistanceToTrack(dist, dist_err);
222 if (std::isnan(
chi2)) {
chi2 = 1.0e6; }
229 r_segment.
set(
chi2 / (stored_track_hits.size() - 3), tangent.positionVector(), tangent.directionVector());