10 #include "GaudiKernel/MsgStream.h"
17 std::vector<FPGATrackSimTrack>::const_iterator
getBestChi2(std::vector<FPGATrackSimTrack>
const & tracks);
18 bool hasGoodFit(std::vector<FPGATrackSimTrack>
const & track_cands,
float minchi2);
26 const std::vector<const FPGATrackSimFitConstantBank*>& droppedLayerbanks,
bool guessingHits) :
34 for (
auto bank : droppedLayerbanks)
56 int TrackFitter::fitTracks(
const std::vector<std::shared_ptr<const FPGATrackSimRoad>>& roads, std::vector<FPGATrackSimTrack>& tracks) {
58 for (
const std::shared_ptr<const FPGATrackSimRoad>& cur_road : roads) {
59 std::vector<FPGATrackSimTrack>
t;
62 else tracks.insert(tracks.end(),
t.begin(),
t.end());
74 int TrackFitter::fitTracks(
const std::shared_ptr<const FPGATrackSimRoad> &road, std::vector<FPGATrackSimTrack>& tracks)
88 ATH_MSG_DEBUG(
"Attempting to fit Hough road with y = " <<
y <<
", x = " <<
x <<
", sector = " << road->getSector() <<
"and nhits = " << road->getNHits());
94 sector = road->getSector();
104 ATH_MSG_WARNING(
"Constants for sector " << sector <<
" are not valid");
115 getMissingInfo(*road, nMissing, missPixel, missStrip, missing_mask, norecovery_mask);
144 std::vector<FPGATrackSimTrack> track_cands;
147 std::vector<std::vector<int>> comboIndices =
getComboIndices(road->getNHits_layer());
148 ATH_MSG_DEBUG(
"There are theoretically " << comboIndices.size() <<
" combinations to process for this road");
150 for (
size_t icomb = 0; icomb < comboIndices.size(); icomb++) {
163 track_cand.
setChi2(road->getFitChi2());
166 track_cand.
setPars(road->getFitParams());
167 ATH_MSG_DEBUG(
"Assigned chi2 = " << track_cand.
getChi2() <<
" and parameters from genscan tool");
173 tracks.push_back(track_cand);
185 if (!( (missing_mask >>
ic) & 0
x1))
break;
202 bitmask &= ~(1 << icoord);
204 bitmask &= ~(1 << (icoord+1));
217 tracks.push_back(track_cand);
226 ATH_MSG_DEBUG(
"Processed " << tracks.size() <<
" actual/valid tracks for this road");
288 missing_mask |= 1 << ix;
293 missing_mask |= (1<<ix) | (1<<iy);
300 else missPixel =
true;
303 else if (!((wclayers >>
layer) & 1)) {
308 missing_mask |= 1 << ix;
313 missing_mask |= (1<<ix) | (1<<iy);
319 norecovery_mask |= (1<<
layer);
339 track_cands.resize(combs.size(), temp);
343 for (
size_t icomb = 0; icomb < combs.size(); icomb++)
346 track_cands[icomb].setTrackID(
m_idbase + icomb);
355 if (hit_indices[
layer] < 0)
363 if (wcbits & (1 <<
layer ) ) {
368 track_cands[icomb].setFPGATrackSimHit(
layer, newhit);
372 const std::shared_ptr<const FPGATrackSimHit> hit = road.
getHits(
layer)[hit_indices[
layer]];
380 track_cands[icomb].setValidCand(
false);
383 track_cands[icomb].setFPGATrackSimHit(
layer, *hit);
410 if (hit_indices[
layer] < 0)
418 if (wcbits & (1 <<
layer ) ) {
427 const std::shared_ptr<const FPGATrackSimHit> hit = road.
getHits(
layer)[hit_indices[
layer]];
459 float best_chi2ndof =
t.getChi2ndof();
466 if (norecovery_mask & (1<<
layer))
continue;
474 recovered_tracks[
layer].setFPGATrackSimHit(
layer,newhit);
478 unsigned int missing_mask =
t.getHitMap();
479 missing_mask &= ~(1 << ix);
483 recovered_tracks[
layer].setHitMap(missing_mask);
487 recovered_tracks[
layer].setQOverPt(qoverpt);
497 if (recovered_tracks[
layer].getChi2ndof() < best_chi2ndof)
499 best_chi2ndof = recovered_tracks[
layer].getChi2ndof();
505 return recovered_tracks[best_i];
517 std::vector<FPGATrackSimMultiTruth> mtv;
523 if (
layer <
t.getFPGATrackSimHits().size()) mtv.push_back(
t.getFPGATrackSimHits().at(
layer).getTruth());
526 mtv.back().assign_equal_normalization();
534 const bool ok = mt.
best(tbarcode, tfrac);
537 t.setEventIndex(tbarcode.first);
538 t.setBarcode(tbarcode.second);
539 t.setBarcodeFrac(tfrac);
549 bool hasGoodFit(std::vector<FPGATrackSimTrack>
const & track_cands,
float minchi2ndof)
553 if (
t.getChi2ndof() > 0 &&
t.getChi2ndof() < minchi2ndof)