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) {
103 diff = difftime(end, start);
106 log << MSG::WARNING <<
"Class CurvedPatRec, method fit: time-out for track finding after " <<
m_time_out <<
" seconds!"
118 for (
unsigned int k = 0; k < try_nb_hits; ++k) { track_hits.push_back(loc_track_hits[hit_index[k] - 1]); }
122 const std::vector<CurvedLine> candidates(finder.getCandidates(
m_road_width, est_dir));
123 if (candidates.empty()) {
continue; }
125 segment_found =
true;
127 for (
const auto & candidate : candidates) {
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) {
131 errors[k] =
Amg::Vector3D(1.0, track_hits[k]->sigmaDriftRadius(), 0.0);
144 double tmp_chi2(0.0);
145 for (
auto & track_hit : track_hits) {
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) {
181 errors[k] =
Amg::Vector3D(1.0, stored_track_hits[k]->sigmaDriftRadius(), 0.0);
195 for (
auto & stored_track_hit : stored_track_hits) {
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;
212 Amg::Vector3D pos(0.0, hit->localPosition().y(), hit->localPosition().z());
218 double dist_err(1.0);
219 hit->setDistanceToTrack(dist, dist_err);
222 if (std::isnan(
chi2)) {
chi2 = 1.0e6; }