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)
59 std::vector<FPGATrackSimTrack> t;
62 else tracks.insert(tracks.end(), t.begin(), t.end());
110 getMissingInfo(road, nMissing, missPixel, missStrip, missing_mask, norecovery_mask);
123 temp.setPatternID(road.
getPID());
124 temp.setHitMap(missing_mask);
125 temp.setNMissing(nMissing);
133 temp.setHoughXBin(road.
getXBin());
134 temp.setHoughYBin(road.
getYBin());
139 std::vector<FPGATrackSimTrack> track_cands;
143 ATH_MSG_DEBUG(
"There are theoretically " << comboIndices.size() <<
" combinations to process for this road");
145 for (
size_t icomb = 0; icomb < comboIndices.size(); icomb++) {
162 ATH_MSG_DEBUG(
"Assigned chi2 = " << track_cand.
getChi2() <<
" and parameters from genscan tool");
168 tracks.push_back(track_cand);
179 for (
unsigned int ic = 0; ic <
m_pmap->getNCoords(); ic++) {
180 if (!( (missing_mask >> ic) & 0x1))
break;
192 for (
unsigned icoord = 0; icoord <
m_pmap->getNCoords(); icoord++) {
196 unsigned int bitmask = ( 1 <<
m_pmap->getNCoords() ) - 1;
197 bitmask &= ~(1 << icoord);
198 if (
m_pmap->getDim(icoord) == 2) {
199 bitmask &= ~(1 << (icoord+1));
205 if (
m_pmap->getDim(icoord) == 2) {
212 tracks.push_back(track_cand);
221 ATH_MSG_DEBUG(
"Processed " << tracks.size() <<
" actual/valid tracks for this road");
266 nMissing =
m_pmap->getNCoords();
272 for (
unsigned layer = 0; layer <
m_pmap->getNLogiLayers(); layer++)
279 int ix =
m_pmap->getCoordOffset(layer);
283 missing_mask |= 1 << ix;
288 missing_mask |= (1<<ix) | (1<<iy);
294 if (
m_pmap->isSCT(layer)) missStrip =
true;
295 else missPixel =
true;
298 else if (!((wclayers >> layer) & 1)) {
299 int ix =
m_pmap->getCoordOffset(layer);
303 missing_mask |= 1 << ix;
308 missing_mask |= (1<<ix) | (1<<iy);
314 norecovery_mask |= (1<<layer);
334 track_cands.resize(combs.size(), temp);
338 for (
size_t icomb = 0; icomb < combs.size(); icomb++)
341 track_cands[icomb].setTrackID(
m_idbase + icomb);
342 track_cands[icomb].setNLayers(
m_pmap->getNLogiLayers());
345 track_cands[icomb].setIdealRadii(
m_rmap->getAvgRadii(0));
348 for (
unsigned layer = 0; layer <
m_pmap->getNLogiLayers(); layer++)
350 if (hit_indices[layer] < 0)
358 if (wcbits & (1 << layer ) ) {
363 track_cands[icomb].setFPGATrackSimHit(layer, newhit);
367 const std::shared_ptr<const FPGATrackSimHit> hit = road.
getHits(layer)[hit_indices[layer]];
373 const FPGATrackSimHit inner_hit = track_cands[icomb].getFPGATrackSimHits().at(layer - 1);
374 if ((hit->getX() != inner_hit.
getX()) || (hit->getY() != inner_hit.
getY()) || (hit->getZ() != inner_hit.
getZ())) {
375 track_cands[icomb].setValidCand(
false);
378 track_cands[icomb].setFPGATrackSimHit(layer, *hit);
403 for (
unsigned layer = 0; layer <
m_pmap->getNLogiLayers(); layer++)
405 if (hit_indices[layer] < 0)
413 if (wcbits & (1 << layer ) ) {
422 const std::shared_ptr<const FPGATrackSimHit> hit = road.
getHits(layer)[hit_indices[layer]];
429 if ((hit->getX() != inner_hit.
getX()) || (hit->getY() != inner_hit.
getY()) || (hit->getZ() != inner_hit.
getZ())) {
452 std::vector<FPGATrackSimTrack> recovered_tracks(
m_pmap->getNLogiLayers(),t);
454 float best_chi2ndof = t.getChi2ndof();
458 for (
unsigned layer = (
m_require_first ? 1 : 0); layer < recovered_tracks.size(); ++layer)
461 if (norecovery_mask & (1<<layer))
continue;
469 recovered_tracks[layer].setFPGATrackSimHit(layer,newhit);
471 int ix =
m_pmap->getCoordOffset(layer);
473 unsigned int missing_mask = t.getHitMap();
474 missing_mask &= ~(1 << ix);
476 if (
m_pmap->isPixel(layer)) missing_mask &= ~(1 << (ix + 1));
478 recovered_tracks[layer].setHitMap(missing_mask);
479 recovered_tracks[layer].setNMissing(t.getNMissing() +
m_pmap->getDim(layer));
482 recovered_tracks[layer].setQOverPt(qoverpt);
492 if (recovered_tracks[layer].getChi2ndof() < best_chi2ndof)
494 best_chi2ndof = recovered_tracks[layer].getChi2ndof();
500 return recovered_tracks[best_i];
512 std::vector<FPGATrackSimMultiTruth> mtv;
514 for (
unsigned layer = 0; layer <
m_pmap->getNLogiLayers(); layer++)
516 if (t.getHitMap() & (1 <<
m_pmap->getCoordOffset(layer)))
continue;
518 if (layer < t.getFPGATrackSimHits().size()) mtv.push_back(t.getFPGATrackSimHits().at(layer).getTruth());
521 mtv.back().assign_equal_normalization();
529 const bool ok = mt.
best(tbarcode, tfrac);
532 t.setEventIndex(tbarcode.first);
533 t.setBarcode(tbarcode.second);
534 t.setBarcodeFrac(tfrac);
544bool hasGoodFit(std::vector<FPGATrackSimTrack>
const & track_cands,
float minchi2ndof)
548 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
double getFitChi2() const
double getFitChi2Phi() const
sector_t getSector() const
const std::vector< unsigned > & getBinIdx() const
layer_bitmask_t getWCLayers() const
double getFitChi2Eta() const
std::vector< size_t > getNHits_layer() const
const FPGATrackSimTrackPars & getFitParams() 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
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
int fitTracks(const std::vector< FPGATrackSimRoad > &roads, std::vector< FPGATrackSimTrack > &tracks)
singleton-like access to IMessageSvc via open function and helper
Some weak symbol referencing magic... These are declared in AthenaKernel/getMessageSvc....