10#include "GaudiKernel/MsgStream.h"
17std::vector<FPGATrackSimTrack>::const_iterator
getBestChi2(std::vector<FPGATrackSimTrack>
const & tracks);
18bool hasGoodFit(std::vector<FPGATrackSimTrack>
const & track_cands,
float minchi2);
26 const std::vector<const FPGATrackSimFitConstantBank*>& droppedLayerbanks,
bool guessingHits) :
34 for (
auto bank : droppedLayerbanks)
56int 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);
120 if (!
m_fitFromRoad) temp.setFirstSectorID(road->getSector());
124 if (!
m_fitFromRoad) temp.setSecondSectorID(road->getSector());
128 temp.setPatternID(road->getPID());
129 temp.setHitMap(missing_mask);
130 temp.setNMissing(nMissing);
137 temp.setSubRegion(road->getSubRegion());
138 temp.setHoughXBin(road->getXBin());
139 temp.setHoughYBin(road->getYBin());
141 temp.setBinIdx(road->getBinIdx());
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);
184 for (
unsigned int ic = 0; ic <
m_pmap->getNCoords(); ic++) {
185 if (!( (missing_mask >> ic) & 0x1))
break;
197 for (
unsigned icoord = 0; icoord <
m_pmap->getNCoords(); icoord++) {
201 unsigned int bitmask = ( 1 <<
m_pmap->getNCoords() ) - 1;
202 bitmask &= ~(1 << icoord);
203 if (
m_pmap->getDim(icoord) == 2) {
204 bitmask &= ~(1 << (icoord+1));
210 if (
m_pmap->getDim(icoord) == 2) {
217 tracks.push_back(track_cand);
226 ATH_MSG_DEBUG(
"Processed " << tracks.size() <<
" actual/valid tracks for this road");
271 nMissing =
m_pmap->getNCoords();
277 for (
unsigned layer = 0; layer <
m_pmap->getNLogiLayers(); layer++)
284 int ix =
m_pmap->getCoordOffset(layer);
288 missing_mask |= 1 << ix;
293 missing_mask |= (1<<ix) | (1<<iy);
299 if (
m_pmap->isSCT(layer)) missStrip =
true;
300 else missPixel =
true;
303 else if (!((wclayers >> layer) & 1)) {
304 int ix =
m_pmap->getCoordOffset(layer);
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);
347 track_cands[icomb].setNLayers(
m_pmap->getNLogiLayers());
350 track_cands[icomb].setIdealRadii(
m_rmap->getAvgRadii(0));
353 for (
unsigned layer = 0; layer <
m_pmap->getNLogiLayers(); layer++)
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]];
378 const FPGATrackSimHit inner_hit = track_cands[icomb].getFPGATrackSimHits().at(layer - 1);
379 if ((hit->getX() != inner_hit.
getX()) || (hit->getY() != inner_hit.
getY()) || (hit->getZ() != inner_hit.
getZ())) {
380 track_cands[icomb].setValidCand(
false);
383 track_cands[icomb].setFPGATrackSimHit(layer, *hit);
408 for (
unsigned layer = 0; layer <
m_pmap->getNLogiLayers(); layer++)
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]];
434 if ((hit->getX() != inner_hit.
getX()) || (hit->getY() != inner_hit.
getY()) || (hit->getZ() != inner_hit.
getZ())) {
457 std::vector<FPGATrackSimTrack> recovered_tracks(
m_pmap->getNLogiLayers(),t);
459 float best_chi2ndof = t.getChi2ndof();
463 for (
unsigned layer = (
m_require_first ? 1 : 0); layer < recovered_tracks.size(); ++layer)
466 if (norecovery_mask & (1<<layer))
continue;
474 recovered_tracks[layer].setFPGATrackSimHit(layer,newhit);
476 int ix =
m_pmap->getCoordOffset(layer);
478 unsigned int missing_mask = t.getHitMap();
479 missing_mask &= ~(1 << ix);
481 if (
m_pmap->isPixel(layer)) missing_mask &= ~(1 << (ix + 1));
483 recovered_tracks[layer].setHitMap(missing_mask);
484 recovered_tracks[layer].setNMissing(t.getNMissing() +
m_pmap->getDim(layer));
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;
519 for (
unsigned layer = 0; layer <
m_pmap->getNLogiLayers(); layer++)
521 if (t.getHitMap() & (1 <<
m_pmap->getCoordOffset(layer)))
continue;
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);
549bool hasGoodFit(std::vector<FPGATrackSimTrack>
const & track_cands,
float minchi2ndof)
553 if (t.getChi2ndof() > 0 && t.getChi2ndof() < minchi2ndof)
#define ATH_MSG_WARNING(x)
std::vector< std::vector< int > > getComboIndices(std::vector< size_t > const &sizes)
Given a vector of sizes (of arrays), generates a vector of all combinations of indices to index one e...
static const uint32_t nHits
std::vector< FPGATrackSimTrack >::const_iterator getBestChi2(std::vector< FPGATrackSimTrack > const &tracks)
bool hasGoodFit(std::vector< FPGATrackSimTrack > const &track_cands, float minchi2)
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
void setLayer(unsigned v)
void setHitType(HitType type)
void setSection(unsigned v)
void setDetType(SiliconTech detType)
bool best(FPGATrackSimMultiTruth::Barcode &code, FPGATrackSimMultiTruth::Weight &weight) const
std::pair< unsigned long, unsigned long > Barcode
const std::vector< std::shared_ptr< const FPGATrackSimHit > > & getHits(size_t layer) const
layer_bitmask_t getWCLayers() const
std::vector< size_t > getNHits_layer() const
void setOrigChi2(float v)
void setIdealRadii(const std::vector< double > &v)
void setPars(FPGATrackSimTrackPars const &pars)
void setNLayers(int)
set the number of layers in the track.
void setHitMap(unsigned int v)
const std::vector< FPGATrackSimHit > & getFPGATrackSimHits() const
void setFPGATrackSimHit(unsigned i, const FPGATrackSimHit &hit)
void setValidCand(bool v)
void compute_truth(FPGATrackSimTrack &newtrk) const
FPGATrackSimRegionMap const * m_rmap
std::vector< std::vector< int > > m_comboIndices
FPGATrackSimTrack makeTrackCandidate(const FPGATrackSimRoad &road, const FPGATrackSimTrack &temp, const std::vector< int > &hit_indices)
bool getDoMissingHitsCheck() const
float m_Chi2Dof_recovery_min
FPGATrackSimPlaneMap const * m_pmap
float m_Chi2Dof_recovery_max
TrackCorrType m_IdealCoordFitType
std::vector< const FPGATrackSimFitConstantBank * > m_droppedLayerBanks
int fitTracks(const std::vector< std::shared_ptr< const FPGATrackSimRoad > > &roads, std::vector< FPGATrackSimTrack > &tracks)
void makeTrackCandidates(const FPGATrackSimRoad &road, const FPGATrackSimTrack &temp, std::vector< FPGATrackSimTrack > &track_cands)
Creates a list of track candidates by taking all possible combination of hits in road.
FPGATrackSimTrack recoverTrack(FPGATrackSimTrack const &t, sector_t sector, layer_bitmask_t norecovery_mask, double qoverpt)
Given a N/N track that has a bad chi2, try to refit the track by taking away a single hit,...
void getMissingInfo(const FPGATrackSimRoad &road, int &nMissing, bool &missPixel, bool &missStrip, layer_bitmask_t &missing_mask, layer_bitmask_t &norecovery_mask)
const FPGATrackSimFitConstantBank * m_nominalBank
std::vector< FPGATrackSimTrack > m_tracks_missinghits_track
singleton-like access to IMessageSvc via open function and helper
Some weak symbol referencing magic... These are declared in AthenaKernel/getMessageSvc....