CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Static Public Attributes | Private Member Functions | Private Attributes | Friends
mkfit::MkFinder Class Reference

#include <MkFinder.h>

Inheritance diagram for mkfit::MkFinder:
mkfit::MkBase

Public Types

using MPlexHitIdx = Matriplex::Matriplex< int, MPlexHitIdxMax, 1, NN >
 
using MPlexQHoT = Matriplex::Matriplex< HitOnTrack, 1, 1, NN >
 

Public Member Functions

void addBestHit (const LayerOfHits &layer_of_hits, const int N_proc, const FindingFoos &fnd_foos)
 
void begin_layer (const LayerOfHits &layer_of_hits)
 
HitOnTrack bestHitLastHoT (int itrack) const
 
void bkFitFitTracks (const EventOfHits &eventofhits, const SteeringParams &st_par, const int N_proc, bool chiDebug=false)
 
void bkFitFitTracksBH (const EventOfHits &eventofhits, const SteeringParams &st_par, const int N_proc, bool chiDebug=false)
 
void bkFitInputTracks (TrackVec &cands, int beg, int end)
 
void bkFitInputTracks (EventOfCombCandidates &eocss, int beg, int end)
 
void bkFitOutputTracks (TrackVec &cands, int beg, int end, bool outputProp)
 
void bkFitOutputTracks (EventOfCombCandidates &eocss, int beg, int end, bool outputProp)
 
void bkFitPropTracksToPCA (const int N_proc)
 
void chi2OfLoadedHit (int N_proc, const FindingFoos &fnd_foos)
 
void copyOutParErr (std::vector< CombCandidate > &seed_cand_vec, int N_proc, bool outputProp) const
 
void end_layer ()
 
void findCandidates (const LayerOfHits &layer_of_hits, std::vector< std::vector< TrackCand >> &tmp_candidates, const int offset, const int N_proc, const FindingFoos &fnd_foos)
 
void findCandidatesCloneEngine (const LayerOfHits &layer_of_hits, CandCloner &cloner, const int offset, const int N_proc, const FindingFoos &fnd_foos)
 
float getHitSelDynamicChi2Cut (const int itrk, const int ipar)
 
void getHitSelDynamicWindows (const float invpt, const float theta, float &min_dq, float &max_dq, float &min_dphi, float &max_dphi)
 
void inputOverlapHits (const LayerOfHits &layer_of_hits, const std::vector< UpdateIndices > &idxs, int beg, int end)
 
void inputTracksAndHitIdx (const std::vector< Track > &tracks, int beg, int end, bool inputProp)
 
void inputTracksAndHitIdx (const std::vector< Track > &tracks, const std::vector< int > &idxs, int beg, int end, bool inputProp, int mp_offset)
 
void inputTracksAndHitIdx (const std::vector< CombCandidate > &tracks, const std::vector< std::pair< int, int >> &idxs, int beg, int end, bool inputProp)
 
void inputTracksAndHitIdx (const std::vector< CombCandidate > &tracks, const std::vector< std::pair< int, IdxChi2List >> &idxs, int beg, int end, bool inputProp)
 
void inputTracksAndHits (const std::vector< CombCandidate > &tracks, const LayerOfHits &layer_of_hits, const std::vector< UpdateIndices > &idxs, int beg, int end, bool inputProp)
 
 MkFinder ()
 
void outputNonStoppedTracksAndHitIdx (std::vector< Track > &tracks, const std::vector< int > &idxs, int beg, int end, bool outputProp) const
 
void outputTrackAndHitIdx (Track &track, int itrack, bool outputProp) const
 
void outputTracksAndHitIdx (std::vector< Track > &tracks, int beg, int end, bool outputProp) const
 
void outputTracksAndHitIdx (std::vector< Track > &tracks, const std::vector< int > &idxs, int beg, int end, bool outputProp) const
 
void packModuleNormDir (const LayerOfHits &layer_of_hits, int hit_cnt, MPlexHV &norm, MPlexHV &dir, int N_proc) const
 
void release ()
 
void selectHitIndices (const LayerOfHits &layer_of_hits, const int N_proc, bool fill_binsearch_only=false)
 
void selectHitIndicesV2 (const LayerOfHits &layer_of_hits, const int N_proc)
 
void setup (const PropagationConfig &pc, const IterationConfig &ic, const IterationParams &ip, const IterationLayerConfig &ilc, const SteeringParams &sp, const std::vector< bool > *ihm, const Event *ev, int region, bool infwd)
 
void setup_bkfit (const PropagationConfig &pc, const SteeringParams &sp, const Event *ev)
 
void updateWithLoadedHit (int N_proc, const LayerOfHits &layer_of_hits, const FindingFoos &fnd_foos)
 
- Public Member Functions inherited from mkfit::MkBase
void clearFailFlag ()
 
float getPar (int itrack, int i, int par) const
 
 MkBase ()
 
void propagateTracksToHitR (const MPlexHV &par, const int N_proc, const PropagationFlags &pf, const MPlexQI *noMatEffPtr=nullptr)
 
void propagateTracksToHitZ (const MPlexHV &par, const int N_proc, const PropagationFlags &pf, const MPlexQI *noMatEffPtr=nullptr)
 
void propagateTracksToPCAZ (const int N_proc, const PropagationFlags &pf)
 
void propagateTracksToR (float r, const int N_proc, const PropagationFlags &pf)
 
void propagateTracksToZ (float z, const int N_proc, const PropagationFlags &pf)
 
float radius (int itrack, int i) const
 
float radiusSqr (int itrack, int i) const
 

Static Public Attributes

static constexpr int MPlexHitIdxMax = 16
 
- Static Public Attributes inherited from mkfit::MkBase
static constexpr int iC = 0
 
static constexpr int iP = 1
 

Private Member Functions

void add_hit (const int mslot, int index, int layer)
 
void copy_in (const Track &trk, const int mslot, const int tslot)
 
void copy_in (const TrackCand &trk, const int mslot, const int tslot)
 
void copy_out (Track &trk, const int mslot, const int tslot) const
 
void copy_out (TrackCand &trk, const int mslot, const int tslot) const
 
int num_all_minus_one_hits (const int mslot) const
 
int num_inside_minus_one_hits (const int mslot) const
 
void print_par_err (int corp, int mslot) const
 

Private Attributes

MPlexQI m_CandIdx
 
MPlexQF m_Chi2
 
CombCandidatem_CombCand [NN]
 
int m_CurHit [NN]
 
int m_CurNode [NN]
 
int m_current_region = -1
 
const Eventm_event = nullptr
 
const HitOnTrackm_HoTArr [NN]
 
HitOnTrack m_HoTArrs [NN][Config::nMaxTrkHits]
 
const HoTNodem_HoTNodeArr [NN]
 
bool m_in_fwd = true
 
const IterationConfigm_iteration_config = nullptr
 
const std::vector< bool > * m_iteration_hit_mask = nullptr
 
const IterationLayerConfigm_iteration_layer_config = nullptr
 
const IterationParamsm_iteration_params = nullptr
 
MPlexQI m_Label
 
MPlexQI m_LastHitCcIndex
 
MPlexHS m_msErr {0.0f}
 
MPlexHV m_msPar {0.0f}
 
MPlexQI m_NFoundHits
 
MPlexQI m_NHits
 
MPlexQI m_NInsideMinusOneHits
 
MPlexQI m_NMissingHits
 
MPlexQI m_NOverlapHits
 
MPlexQI m_NTailMinusOneHits
 
const PropagationConfigm_prop_config = nullptr
 
MPlexQI m_SeedIdx
 
MPlexQI m_SeedOriginIdx
 
const SteeringParamsm_steering_params = nullptr
 
MPlexQI m_Stopped
 
TrackCandm_TrkCand [NN]
 
TrackBase::Status m_TrkStatus [NN]
 
MPlexHitIdx m_XHitArr
 
MPlexQI m_XHitSize
 
WSR_Result m_XWsrResult [NN]
 

Friends

class MkBuilder
 

Additional Inherited Members

- Protected Attributes inherited from mkfit::MkBase
MPlexQI m_Chg
 
MPlexLS m_Err [2]
 
MPlexQI m_FailFlag
 
MPlexLV m_Par [2]
 

Detailed Description

Definition at line 38 of file MkFinder.h.

Member Typedef Documentation

◆ MPlexHitIdx

using mkfit::MkFinder::MPlexHitIdx = Matriplex::Matriplex<int, MPlexHitIdxMax, 1, NN>

Definition at line 44 of file MkFinder.h.

◆ MPlexQHoT

using mkfit::MkFinder::MPlexQHoT = Matriplex::Matriplex<HitOnTrack, 1, 1, NN>

Definition at line 45 of file MkFinder.h.

Constructor & Destructor Documentation

◆ MkFinder()

mkfit::MkFinder::MkFinder ( )
inline

Definition at line 49 of file MkFinder.h.

49 {}

Member Function Documentation

◆ add_hit()

void mkfit::MkFinder::add_hit ( const int  mslot,
int  index,
int  layer 
)
inlineprivate

Definition at line 247 of file MkFinder.h.

References nano_mu_digi_cff::layer, L1DTConfigBti_cff::LH, m_HoTArrs, m_NFoundHits, m_NHits, m_NInsideMinusOneHits, m_NTailMinusOneHits, and mkfit::Config::nMaxTrkHits.

Referenced by addBestHit().

247  {
248  // Only used by BestHit.
249  // m_NInsideMinusOneHits and m_NTailMinusOneHits are maintained here but are
250  // not used and are not copied out (as Track does not have these members).
251 
252  int &n_tot_hits = m_NHits(mslot, 0, 0);
253  int &n_fnd_hits = m_NFoundHits(mslot, 0, 0);
254 
255  if (n_tot_hits < Config::nMaxTrkHits) {
256  m_HoTArrs[mslot][n_tot_hits++] = {index, layer};
257  if (index >= 0) {
258  ++n_fnd_hits;
259  m_NInsideMinusOneHits(mslot, 0, 0) += m_NTailMinusOneHits(mslot, 0, 0);
260  m_NTailMinusOneHits(mslot, 0, 0) = 0;
261  } else if (index == -1) {
262  ++m_NTailMinusOneHits(mslot, 0, 0);
263  }
264  } else {
265  // printf("WARNING MkFinder::add_hit hit-on-track limit reached for label=%d\n", label_);
266 
267  const int LH = Config::nMaxTrkHits - 1;
268 
269  if (index >= 0) {
270  if (m_HoTArrs[mslot][LH].index < 0)
271  ++n_fnd_hits;
272  m_HoTArrs[mslot][LH] = {index, layer};
273  } else if (index == -2) {
274  if (m_HoTArrs[mslot][LH].index >= 0)
275  --n_fnd_hits;
276  m_HoTArrs[mslot][LH] = {index, layer};
277  }
278  }
279  }
MPlexQI m_NFoundHits
Definition: MkFinder.h:295
HitOnTrack m_HoTArrs[NN][Config::nMaxTrkHits]
Definition: MkFinder.h:297
LH
angular window limits for traco
MPlexQI m_NTailMinusOneHits
Definition: MkFinder.h:312
MPlexQI m_NHits
Definition: MkFinder.h:294
MPlexQI m_NInsideMinusOneHits
Definition: MkFinder.h:311
constexpr int nMaxTrkHits
Definition: Config.h:42

◆ addBestHit()

void mkfit::MkFinder::addBestHit ( const LayerOfHits layer_of_hits,
const int  N_proc,
const FindingFoos fnd_foos 
)

Definition at line 1125 of file MkFinder.cc.

References funct::abs(), add_hit(), nano_mu_local_reco_cff::chi2, mkfit::MkBase::clearFailFlag(), dprint, mkfit::PropagationConfig::finding_intra_layer_pflags, mkfit::PropagationConfig::finding_requires_propagation_to_hit_pos, getHitSelDynamicChi2Cut(), mkfit::LayerOfHits::hitArray(), Matriplex::hypot(), mkfit::MkBase::iC, mkfit::MkBase::iP, ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder::it, mkfit::Hit::kHitEdgeIdx, mkfit::Hit::kHitMissIdx, mkfit::Hit::kHitStopIdx, mkfit::LayerOfHits::layer_id(), mkfit::MkBase::m_Chg, m_Chi2, mkfit::FindingFoos::m_compute_chi2_foo, mkfit::MkBase::m_Err, mkfit::MkBase::m_FailFlag, m_msErr, m_msPar, mkfit::MkBase::m_Par, m_prop_config, mkfit::FindingFoos::m_update_param_foo, m_XHitArr, m_XHitSize, m_XWsrResult, SiStripPI::max, reco_skim_cfg_mod::maxSize, MTVHistoProducerAlgoForTrackerBlock_cfi::minChi2, mkfit::NN, num_all_minus_one_hits(), mkfit::LayerOfHits::refHit(), mkfit::WSR_Edge, and mkfit::WSR_Outside.

1125  {
1126  // debug = true;
1127 
1128  MatriplexHitPacker mhp(layer_of_hits.hitArray());
1129 
1130  float minChi2[NN];
1131  int bestHit[NN];
1132  int maxSize = 0;
1133 
1134  // Determine maximum number of hits for tracks in the collection.
1135  for (int it = 0; it < NN; ++it) {
1136  if (it < N_proc) {
1137  if (m_XHitSize[it] > 0) {
1139  }
1140  }
1141 
1142  bestHit[it] = -1;
1144  }
1145 
1146  for (int hit_cnt = 0; hit_cnt < maxSize; ++hit_cnt) {
1147  //fixme what if size is zero???
1148 
1149  mhp.reset();
1150 
1151  //#pragma omp simd doesn't vectorize with current compilers
1152  for (int itrack = 0; itrack < NN; ++itrack) {
1153  if (itrack < N_proc && hit_cnt < m_XHitSize[itrack]) {
1154  mhp.addInputAt(itrack, layer_of_hits.refHit(m_XHitArr.At(itrack, hit_cnt, 0)));
1155  }
1156  }
1157 
1158  mhp.pack(m_msErr, m_msPar);
1159 
1160  //now compute the chi2 of track state vs hit
1161  MPlexQF outChi2;
1162  MPlexLV tmpPropPar;
1163  clearFailFlag();
1164  (*fnd_foos.m_compute_chi2_foo)(m_Err[iP],
1165  m_Par[iP],
1166  m_Chg,
1167  m_msErr,
1168  m_msPar,
1169  outChi2,
1170  tmpPropPar,
1171  m_FailFlag,
1172  N_proc,
1175 
1176  //update best hit in case chi2<minChi2
1177 #pragma omp simd
1178  for (int itrack = 0; itrack < NN; ++itrack) {
1179  if (itrack < N_proc && hit_cnt < m_XHitSize[itrack]) {
1180  const float chi2 = std::abs(outChi2[itrack]); //fixme negative chi2 sometimes...
1181  dprint("chi2=" << chi2 << " minChi2[itrack]=" << minChi2[itrack]);
1182  if (chi2 < minChi2[itrack]) {
1183  minChi2[itrack] = chi2;
1184  bestHit[itrack] = m_XHitArr.At(itrack, hit_cnt, 0);
1185  }
1186  }
1187  }
1188  } // end loop over hits
1189 
1190  //#pragma omp simd
1191  for (int itrack = 0; itrack < NN; ++itrack) {
1192  if (itrack >= N_proc) {
1193  continue;
1194  }
1195 
1196  if (m_XWsrResult[itrack].m_wsr == WSR_Outside) {
1197  // Why am I doing this?
1198  m_msErr.setDiagonal3x3(itrack, 666);
1199  m_msPar(itrack, 0, 0) = m_Par[iP](itrack, 0, 0);
1200  m_msPar(itrack, 1, 0) = m_Par[iP](itrack, 1, 0);
1201  m_msPar(itrack, 2, 0) = m_Par[iP](itrack, 2, 0);
1202 
1203  // XXXX If not in gap, should get back the old track params. But they are gone ...
1204  // Would actually have to do it right after SelectHitIndices where updated params are still ok.
1205  // Here they got screwed during hit matching.
1206  // So, I'd store them there (into propagated params) and retrieve them here.
1207  // Or we decide not to care ...
1208 
1209  continue;
1210  }
1211 
1212  //fixme decide what to do in case no hit found
1213  if (bestHit[itrack] >= 0) {
1214  const Hit &hit = layer_of_hits.refHit(bestHit[itrack]);
1215  const float chi2 = minChi2[itrack];
1216 
1217  dprint("ADD BEST HIT FOR TRACK #"
1218  << itrack << std::endl
1219  << "prop x=" << m_Par[iP].constAt(itrack, 0, 0) << " y=" << m_Par[iP].constAt(itrack, 1, 0) << std::endl
1220  << "copy in hit #" << bestHit[itrack] << " x=" << hit.position()[0] << " y=" << hit.position()[1]);
1221 
1222  m_msErr.copyIn(itrack, hit.errArray());
1223  m_msPar.copyIn(itrack, hit.posArray());
1224  m_Chi2(itrack, 0, 0) += chi2;
1225 
1226  add_hit(itrack, bestHit[itrack], layer_of_hits.layer_id());
1227  } else {
1228  int fake_hit_idx = Hit::kHitMissIdx;
1229 
1230  if (m_XWsrResult[itrack].m_wsr == WSR_Edge) {
1231  // YYYYYY Config::store_missed_layers
1232  fake_hit_idx = Hit::kHitEdgeIdx;
1233  } else if (num_all_minus_one_hits(itrack)) {
1234  fake_hit_idx = Hit::kHitStopIdx;
1235  }
1236 
1237  dprint("ADD FAKE HIT FOR TRACK #" << itrack << " withinBounds=" << (fake_hit_idx != Hit::kHitEdgeIdx)
1238  << " r=" << std::hypot(m_Par[iP](itrack, 0, 0), m_Par[iP](itrack, 1, 0)));
1239 
1240  m_msErr.setDiagonal3x3(itrack, 666);
1241  m_msPar(itrack, 0, 0) = m_Par[iP](itrack, 0, 0);
1242  m_msPar(itrack, 1, 0) = m_Par[iP](itrack, 1, 0);
1243  m_msPar(itrack, 2, 0) = m_Par[iP](itrack, 2, 0);
1244  // Don't update chi2
1245 
1246  add_hit(itrack, fake_hit_idx, layer_of_hits.layer_id());
1247  }
1248  }
1249 
1250  // Update the track parameters with this hit. (Note that some calculations
1251  // are already done when computing chi2. Not sure it's worth caching them?)
1252 
1253  dprint("update parameters");
1254  clearFailFlag();
1255  (*fnd_foos.m_update_param_foo)(m_Err[iP],
1256  m_Par[iP],
1257  m_Chg,
1258  m_msErr,
1259  m_msPar,
1260  m_Err[iC],
1261  m_Par[iC],
1262  m_FailFlag,
1263  N_proc,
1266 
1267  dprint("m_Par[iP](0,0,0)=" << m_Par[iP](0, 0, 0) << " m_Par[iC](0,0,0)=" << m_Par[iC](0, 0, 0));
1268  }
MPlexQI m_Chg
Definition: MkBase.h:103
static constexpr int iC
Definition: MkBase.h:18
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
Definition: Matriplex.h:436
static constexpr int iP
Definition: MkBase.h:19
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexQI m_FailFlag
Definition: MkBase.h:104
void add_hit(const int mslot, int index, int layer)
Definition: MkFinder.h:247
Matriplex::Matriplex< float, LL, 1, NN > MPlexLV
Definition: Matrix.h:49
static constexpr int kHitStopIdx
Definition: Hit.h:194
MPlexLS m_Err[2]
Definition: MkBase.h:101
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
MatriplexErrParPackerSlurpIn< Hit, float > MatriplexHitPacker
int num_all_minus_one_hits(const int mslot) const
Definition: MkFinder.h:281
constexpr Matriplex::idx_t NN
Definition: Matrix.h:43
MPlexQI m_XHitSize
Definition: MkFinder.h:322
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MPlexHV m_msPar
Definition: MkFinder.h:327
void clearFailFlag()
Definition: MkBase.h:96
MPlexHS m_msErr
Definition: MkFinder.h:326
Matriplex::Matriplex< float, 1, 1, NN > MPlexQF
Definition: Matrix.h:71
MPlexHitIdx m_XHitArr
Definition: MkFinder.h:323
#define dprint(x)
Definition: Debug.h:95
MPlexQF m_Chi2
Definition: MkFinder.h:291
PropagationFlags finding_intra_layer_pflags
float getHitSelDynamicChi2Cut(const int itrk, const int ipar)
Definition: MkFinder.cc:293
static constexpr int kHitMissIdx
Definition: Hit.h:193
WSR_Result m_XWsrResult[NN]
Definition: MkFinder.h:321
static constexpr int kHitEdgeIdx
Definition: Hit.h:195

◆ begin_layer()

void mkfit::MkFinder::begin_layer ( const LayerOfHits layer_of_hits)

Definition at line 68 of file MkFinder.cc.

References mkfit::Event::evtID(), mkfit::LayerInfo::is_barrel(), dttmaxenums::L, m_current_region, m_event, m_iteration_config, mkfit::IterationConfig::m_iteration_index, mkfit::IterationConfig::m_track_algorithm, mkfit::LayerInfo::rin(), mkfit::LayerInfo::rout(), mkfit::LayerInfo::zmax(), and mkfit::LayerInfo::zmin().

Referenced by mkfit::MkBuilder::find_tracks_in_layers().

68  {
69 #ifdef RNT_DUMP_MkF_SelHitIdcs
70  const LayerOfHits &L = layer_of_hits;
71  const LayerInfo &LI = L.layer_info();
72  rnt_shi.ResetH();
73  rnt_shi.ResetF();
74  *rnt_shi.h = {m_event->evtID(),
78  L.layer_id(),
79  L.is_barrel() ? LI.rin() : LI.zmin(),
80  LI.is_barrel() ? LI.rout() : LI.zmax(),
81  L.is_barrel(),
82  L.is_pixel(),
83  L.is_stereo()};
84  *rnt_shi.f = *rnt_shi.h;
85 #endif
86  }
const Event * m_event
Definition: MkFinder.h:342
int evtID() const
Definition: Event.h:23
const IterationConfig * m_iteration_config
Definition: MkFinder.h:337
int m_current_region
Definition: MkFinder.h:343

◆ bestHitLastHoT()

HitOnTrack mkfit::MkFinder::bestHitLastHoT ( int  itrack) const
inline

Definition at line 116 of file MkFinder.h.

References m_HoTArrs, and m_NHits.

116 { return m_HoTArrs[itrack][m_NHits(itrack, 0, 0) - 1]; }
HitOnTrack m_HoTArrs[NN][Config::nMaxTrkHits]
Definition: MkFinder.h:297
MPlexQI m_NHits
Definition: MkFinder.h:294

◆ bkFitFitTracks()

void mkfit::MkFinder::bkFitFitTracks ( const EventOfHits eventofhits,
const SteeringParams st_par,
const int  N_proc,
bool  chiDebug = false 
)

Definition at line 2187 of file MkFinder.cc.

References funct::abs(), mkfit::PropagationConfig::backward_fit_pflags, mkfit::MkBase::clearFailFlag(), debug, dprintf, mkfit::Event::evtID(), Matriplex::hypot(), mps_fire::i, mkfit::MkBase::iC, createfilelist::int, mkfit::MkBase::iP, mkfit::LayerInfo::is_barrel(), mkfit::SteeringParams::iterator::is_valid(), mkfit::TrackBase::isFindable(), CommonMethods::isnan(), mkfit::SteeringParams::IT_BkwFit, mkfit::kalmanOperation(), mkfit::kalmanOperationEndcap(), mkfit::KFO_Calculate_Chi2, mkfit::KFO_Local_Cov, mkfit::KFO_Update_Params, dttmaxenums::L, mkfit::TrackBase::label(), mkfit::LayerInfo::layer_id(), mkfit::MkBase::m_Chg, m_Chi2, m_CurNode, mkfit::MkBase::m_Err, m_event, mkfit::MkBase::m_FailFlag, m_HoTNodeArr, m_msErr, m_msPar, mkfit::MkBase::m_Par, mkfit::HoTNode::m_prev_idx, m_prop_config, m_TrkCand, mkfit::SteeringParams::make_iterator(), mkfit::Hit::mcHitID(), mkfit::MCHitInfo::mcTrackID(), mkfit::NN, mkfit::TrackBase::posEta(), mkfit::TrackBase::posPhi(), print_par_err(), mkfit::TrackBase::prodType(), mkfit::MkBase::propagateTracksToHitR(), mkfit::MkBase::propagateTracksToHitZ(), mkfit::TrackBase::pT(), and mkfit::Event::simHitsInfo_.

Referenced by mkfit::MkBuilder::fit_cands().

2190  {
2191  // Prototyping final backward fit.
2192  // This works with track-finding indices, before remapping.
2193  //
2194  // Layers should be collected during track finding and list all layers that have actual hits.
2195  // Then we could avoid checking which layers actually do have hits.
2196 
2197  // bool debug = true;
2198 
2199  MPlexQF tmp_chi2;
2200  MPlexQI no_mat_effs;
2201  float tmp_err[6] = {666, 0, 666, 0, 0, 666};
2202  float tmp_pos[3];
2203 
2204 #if defined(DEBUG_PROP_UPDATE)
2205  const int DSLOT = 0;
2206  printf("bkfit entry, track in slot %d\n", DSLOT);
2207  print_par_err(iC, DSLOT);
2208 #endif
2209 
2210  for (auto lp_iter = st_par.make_iterator(SteeringParams::IT_BkwFit); lp_iter.is_valid(); ++lp_iter) {
2211  const int layer = lp_iter.layer();
2212 
2213  const LayerOfHits &L = eventofhits[layer];
2214  const LayerInfo &LI = L.layer_info();
2215 
2216 #if defined(DEBUG_BACKWARD_FIT)
2217  const Hit *last_hit_ptr[NN];
2218 #endif
2219 
2220  no_mat_effs.setVal(0);
2221  int done_count = 0;
2222  int here_count = 0;
2223  for (int i = 0; i < N_proc; ++i) {
2224  while (m_CurNode[i] >= 0 && m_HoTNodeArr[i][m_CurNode[i]].m_hot.index < 0) {
2226  }
2227 
2228  if (m_CurNode[i] < 0)
2229  ++done_count;
2230 
2231  if (m_CurNode[i] >= 0 && m_HoTNodeArr[i][m_CurNode[i]].m_hot.layer == layer) {
2232  // Skip the overlap hits -- if they exist.
2233  // 1. Overlap hit gets placed *after* the original hit in TrackCand::exportTrack()
2234  // which is *before* in the reverse iteration that we are doing here.
2235  // 2. Seed-hit merging can result in more than two hits per layer.
2236  // while (m_CurHit[i] > 0 && m_HoTArr[ i ][ m_CurHit[i] - 1 ].layer == layer) --m_CurHit[i];
2237  while (m_HoTNodeArr[i][m_CurNode[i]].m_prev_idx >= 0 &&
2238  m_HoTNodeArr[i][m_HoTNodeArr[i][m_CurNode[i]].m_prev_idx].m_hot.layer == layer)
2240 
2241  const Hit &hit = L.refHit(m_HoTNodeArr[i][m_CurNode[i]].m_hot.index);
2242 
2243 #ifdef DEBUG_BACKWARD_FIT
2244  last_hit_ptr[i] = &hit;
2245 #endif
2246  m_msErr.copyIn(i, hit.errArray());
2247  m_msPar.copyIn(i, hit.posArray());
2248  ++here_count;
2249 
2251  } else {
2252 #ifdef DEBUG_BACKWARD_FIT
2253  last_hit_ptr[i] = nullptr;
2254 #endif
2255  no_mat_effs[i] = 1;
2256  tmp_pos[0] = m_Par[iC](i, 0, 0);
2257  tmp_pos[1] = m_Par[iC](i, 1, 0);
2258  tmp_pos[2] = m_Par[iC](i, 2, 0);
2259  m_msErr.copyIn(i, tmp_err);
2260  m_msPar.copyIn(i, tmp_pos);
2261  }
2262  }
2263 
2264  if (done_count == N_proc)
2265  break;
2266  if (here_count == 0)
2267  continue;
2268 
2269  // ZZZ Could add missing hits here, only if there are any actual matches.
2270 
2271  clearFailFlag();
2272 
2273  // PROP-FAIL-ENABLE Once always "copy input to output on fail" is removed from
2274  // propagateToR one might want to enable this for barrel or endcap or both.
2275  if (LI.is_barrel()) {
2277 
2279  m_Err[iP],
2280  m_Par[iP],
2281  m_msErr,
2282  m_msPar,
2283  m_Err[iC],
2284  m_Par[iC],
2285  tmp_chi2,
2286  N_proc);
2287  } else {
2289 
2291  m_Err[iP],
2292  m_Par[iP],
2293  m_msErr,
2294  m_msPar,
2295  m_Err[iC],
2296  m_Par[iC],
2297  tmp_chi2,
2298  N_proc);
2299  }
2300 
2301 #if defined(DEBUG_PROP_UPDATE)
2302  printf("\nbkfit at layer %d, track in slot %d -- fail=%d, had hit=%d (%g, %g, %g)\n",
2303  LI.layer_id(),
2304  DSLOT,
2305  m_FailFlag[DSLOT],
2306  1 - no_mat_effs[DSLOT],
2307  m_msPar(DSLOT, 0, 0),
2308  m_msPar(DSLOT, 1, 0),
2309  m_msPar(DSLOT, 2, 0));
2310  printf("Propagated:\n");
2311  print_par_err(iP, DSLOT);
2312  printf("Updated:\n");
2313  print_par_err(iC, DSLOT);
2314 #endif
2315 
2316  // Fixup for failed propagation or invpt sign and charge.
2317  for (int i = 0; i < NN; ++i) {
2318  // PROP-FAIL-ENABLE The following to be enabled when propagation failure
2319  // detection is properly implemented in propagate-to-R/Z.
2320  // 1. The following code was only expecting barrel state to be restored.
2321  // auto barrel_pf(m_prop_config->backward_fit_pflags);
2322  // barrel_pf.copy_input_state_on_fail = true;
2323  // 2. There is also check on chi2, commented out to keep physics changes minimal.
2324  /*
2325  if (m_FailFlag[i] && LI.is_barrel()) {
2326  // Barrel pflags are set to include PF_copy_input_state_on_fail.
2327  // Endcap errors are immaterial here (relevant for fwd search), with prop error codes
2328  // one could do other things.
2329  // Are there also fail conditions in KalmanUpdate?
2330 #ifdef DEBUG
2331  if (debug && g_debug) {
2332  dprintf("MkFinder::bkFitFitTracks prop fail: chi2=%f, layer=%d, label=%d. Recovering.\n",
2333  tmp_chi2[i], LI.layer_id(), m_Label[i]);
2334  print_par_err(iC, i);
2335  }
2336 #endif
2337  m_Err[iC].copySlot(i, m_Err[iP]);
2338  m_Par[iC].copySlot(i, m_Par[iP]);
2339  } else if (tmp_chi2[i] > 200 || tmp_chi2[i] < 0) {
2340 #ifdef DEBUG
2341  if (debug && g_debug) {
2342  dprintf("MkFinder::bkFitFitTracks chi2 fail: chi2=%f, layer=%d, label=%d. Recovering.\n",
2343  tmp_chi2[i], LI.layer_id(), m_Label[i]);
2344  print_par_err(iC, i);
2345  }
2346 #endif
2347  // Go back to propagated state (at the current hit, the previous one is lost).
2348  m_Err[iC].copySlot(i, m_Err[iP]);
2349  m_Par[iC].copySlot(i, m_Par[iP]);
2350  }
2351  */
2352  // Fixup invpt sign and charge.
2353  if (i < N_proc && m_Par[iC].At(i, 3, 0) < 0) {
2354  m_Chg.At(i, 0, 0) = -m_Chg.At(i, 0, 0);
2355  m_Par[iC].At(i, 3, 0) = -m_Par[iC].At(i, 3, 0);
2356  }
2357  }
2358 
2359 #if defined(DEBUG_BACKWARD_FIT)
2360  // clang-format off
2361  bool debug = true;
2362  const char beg_cur_sep = '/'; // set to ' ' root parsable printouts
2363  for (int i = 0; i < N_proc; ++i) {
2364  if (chiDebug && last_hit_ptr[i]) {
2365  TrackCand &bb = *m_TrkCand[i];
2366  int ti = iP;
2367  float chi = tmp_chi2.At(i, 0, 0);
2368  float chi_prnt = std::isfinite(chi) ? chi : -9;
2369 
2370 #if defined(MKFIT_STANDALONE)
2371  const MCHitInfo &mchi = m_event->simHitsInfo_[last_hit_ptr[i]->mcHitID()];
2372 
2373  dprintf("BKF_OVERLAP %d %d %d %d %d %d %d "
2374  "%f%c%f %f %f%c%f %f %f %f %d %d %d %d "
2375  "%f %f %f %f %f\n",
2376  m_event->evtID(),
2377 #else
2378  dprintf("BKF_OVERLAP %d %d %d %d %d %d "
2379  "%f%c%f %f %f%c%f %f %f %f %d %d %d "
2380  "%f %f %f %f %f\n",
2381 #endif
2382  bb.label(), (int)bb.prodType(), bb.isFindable(),
2383  layer, L.is_stereo(), L.is_barrel(),
2384  bb.pT(), beg_cur_sep, 1.0f / m_Par[ti].At(i, 3, 0),
2385  bb.posEta(),
2386  bb.posPhi(), beg_cur_sep, std::atan2(m_Par[ti].At(i, 1, 0), m_Par[ti].At(i, 0, 0)),
2387  std::hypot(m_Par[ti].At(i, 0, 0), m_Par[ti].At(i, 1, 0)),
2388  m_Par[ti].At(i, 2, 0),
2389  chi_prnt,
2390  std::isnan(chi), std::isfinite(chi), chi > 0,
2391 #if defined(MKFIT_STANDALONE)
2392  mchi.mcTrackID(),
2393 #endif
2394  // The following three can get negative / prouce nans in e2s.
2395  // std::abs the args for FPE hunt.
2396  e2s(std::abs(m_Err[ti].At(i, 0, 0))),
2397  e2s(std::abs(m_Err[ti].At(i, 1, 1))),
2398  e2s(std::abs(m_Err[ti].At(i, 2, 2))), // sx_t sy_t sz_t -- track errors
2399  1e4f * std::hypot(m_msPar.At(i, 0, 0) - m_Par[ti].At(i, 0, 0),
2400  m_msPar.At(i, 1, 0) - m_Par[ti].At(i, 1, 0)), // d_xy
2401  1e4f * (m_msPar.At(i, 2, 0) - m_Par[ti].At(i, 2, 0)) // d_z
2402  );
2403  }
2404  }
2405  // clang-format on
2406 #endif
2407 
2408  // update chi2
2409  m_Chi2.add(tmp_chi2);
2410  }
2411  }
def isnan(num)
MPlexQI m_Chg
Definition: MkBase.h:103
static constexpr int iC
Definition: MkBase.h:18
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
Definition: Matriplex.h:436
static constexpr int iP
Definition: MkBase.h:19
void kalmanOperationEndcap(const int kfOp, const MPlexLS &psErr, const MPlexLV &psPar, const MPlexHS &msErr, const MPlexHV &msPar, MPlexLS &outErr, MPlexLV &outPar, MPlexQF &outChi2, const int N_proc)
void propagateTracksToHitZ(const MPlexHV &par, const int N_proc, const PropagationFlags &pf, const MPlexQI *noMatEffPtr=nullptr)
Definition: MkBase.h:68
const Event * m_event
Definition: MkFinder.h:342
MPlexLV m_Par[2]
Definition: MkBase.h:102
PropagationFlags backward_fit_pflags
MPlexQI m_FailFlag
Definition: MkBase.h:104
int evtID() const
Definition: Event.h:23
MPlexLS m_Err[2]
Definition: MkBase.h:101
void kalmanOperation(const int kfOp, const MPlexLS &psErr, const MPlexLV &psPar, const MPlexHS &msErr, const MPlexHV &msPar, MPlexLS &outErr, MPlexLV &outPar, MPlexQF &outChi2, const int N_proc)
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
constexpr Matriplex::idx_t NN
Definition: Matrix.h:43
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MPlexHV m_msPar
Definition: MkFinder.h:327
void propagateTracksToHitR(const MPlexHV &par, const int N_proc, const PropagationFlags &pf, const MPlexQI *noMatEffPtr=nullptr)
Definition: MkBase.h:42
void clearFailFlag()
Definition: MkBase.h:96
int m_CurNode[NN]
Definition: MkFinder.h:349
MCHitInfoVec simHitsInfo_
Definition: Event.h:72
MPlexHS m_msErr
Definition: MkFinder.h:326
Matriplex::Matriplex< int, 1, 1, NN > MPlexQI
Definition: Matrix.h:72
TrackCand * m_TrkCand[NN]
Definition: MkFinder.h:318
#define debug
Definition: HDRShower.cc:19
Matriplex::Matriplex< float, 1, 1, NN > MPlexQF
Definition: Matrix.h:71
MPlexQF m_Chi2
Definition: MkFinder.h:291
const HoTNode * m_HoTNodeArr[NN]
Definition: MkFinder.h:350
#define dprintf(...)
Definition: Debug.h:98
void print_par_err(int corp, int mslot) const
Definition: MkFinder.cc:2171

◆ bkFitFitTracksBH()

void mkfit::MkFinder::bkFitFitTracksBH ( const EventOfHits eventofhits,
const SteeringParams st_par,
const int  N_proc,
bool  chiDebug = false 
)

Definition at line 2034 of file MkFinder.cc.

References mkfit::PropagationConfig::backward_fit_pflags, submitPVResolutionJobs::count, Matriplex::hypot(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, mkfit::LayerInfo::is_barrel(), mkfit::kalmanOperation(), mkfit::kalmanOperationEndcap(), mkfit::KFO_Calculate_Chi2, mkfit::KFO_Local_Cov, mkfit::KFO_Update_Params, dttmaxenums::L, mkfit::MkBase::m_Chg, m_Chi2, m_CurHit, mkfit::MkBase::m_Err, m_HoTArr, mkfit::SteeringParams::m_layer_plan, m_msErr, m_msPar, mkfit::MkBase::m_Par, m_prop_config, dqmiodumpmetadata::n, mkfit::NN, mkfit::MkBase::propagateTracksToHitR(), and mkfit::MkBase::propagateTracksToHitZ().

Referenced by mkfit::MkBuilder::fit_cands_BH().

2037  {
2038  // Prototyping final backward fit.
2039  // This works with track-finding indices, before remapping.
2040  //
2041  // Layers should be collected during track finding and list all layers that have actual hits.
2042  // Then we could avoid checking which layers actually do have hits.
2043 
2044  MPlexQF tmp_chi2;
2045  float tmp_err[6] = {666, 0, 666, 0, 0, 666};
2046  float tmp_pos[3];
2047 
2048  for (auto lp_iter = st_par.m_layer_plan.rbegin(); lp_iter != st_par.m_layer_plan.rend(); ++lp_iter) {
2049  const int layer = lp_iter->m_layer;
2050 
2051  const LayerOfHits &L = eventofhits[layer];
2052  const LayerInfo &LI = L.layer_info();
2053 
2054  int count = 0;
2055  for (int i = 0; i < N_proc; ++i) {
2056  while (m_CurHit[i] >= 0 && m_HoTArr[i][m_CurHit[i]].index < 0)
2057  --m_CurHit[i];
2058 
2059  if (m_CurHit[i] >= 0 && m_HoTArr[i][m_CurHit[i]].layer == layer) {
2060  // Skip the overlap hits -- if they exist.
2061  // 1. Overlap hit gets placed *after* the original hit in TrackCand::exportTrack()
2062  // which is *before* in the reverse iteration that we are doing here.
2063  // 2. Seed-hit merging can result in more than two hits per layer.
2064  while (m_CurHit[i] > 0 && m_HoTArr[i][m_CurHit[i] - 1].layer == layer)
2065  --m_CurHit[i];
2066 
2067  const Hit &hit = L.refHit(m_HoTArr[i][m_CurHit[i]].index);
2068  m_msErr.copyIn(i, hit.errArray());
2069  m_msPar.copyIn(i, hit.posArray());
2070  ++count;
2071  --m_CurHit[i];
2072  } else {
2073  tmp_pos[0] = m_Par[iC](i, 0, 0);
2074  tmp_pos[1] = m_Par[iC](i, 1, 0);
2075  tmp_pos[2] = m_Par[iC](i, 2, 0);
2076  m_msErr.copyIn(i, tmp_err);
2077  m_msPar.copyIn(i, tmp_pos);
2078  }
2079  }
2080 
2081  if (count == 0)
2082  continue;
2083 
2084  // ZZZ Could add missing hits here, only if there are any actual matches.
2085 
2086  if (LI.is_barrel()) {
2088 
2090  m_Err[iP],
2091  m_Par[iP],
2092  m_msErr,
2093  m_msPar,
2094  m_Err[iC],
2095  m_Par[iC],
2096  tmp_chi2,
2097  N_proc);
2098  } else {
2100 
2102  m_Err[iP],
2103  m_Par[iP],
2104  m_msErr,
2105  m_msPar,
2106  m_Err[iC],
2107  m_Par[iC],
2108  tmp_chi2,
2109  N_proc);
2110  }
2111 
2112  //fixup invpt sign and charge
2113  for (int n = 0; n < NN; ++n) {
2114  if (n < N_proc && m_Par[iC].At(n, 3, 0) < 0) {
2115  m_Chg.At(n, 0, 0) = -m_Chg.At(n, 0, 0);
2116  m_Par[iC].At(n, 3, 0) = -m_Par[iC].At(n, 3, 0);
2117  }
2118  }
2119 
2120 #ifdef DEBUG_BACKWARD_FIT_BH
2121  // Dump per hit chi2
2122  for (int i = 0; i < N_proc; ++i) {
2123  float r_h = std::hypot(m_msPar.At(i, 0, 0), m_msPar.At(i, 1, 0));
2124  float r_t = std::hypot(m_Par[iC].At(i, 0, 0), m_Par[iC].At(i, 1, 0));
2125 
2126  // if ((std::isnan(tmp_chi2[i]) || std::isnan(r_t)))
2127  // if ( ! std::isnan(tmp_chi2[i]) && tmp_chi2[i] > 0) // && tmp_chi2[i] > 30)
2128  if (chiDebug) {
2129  int ti = iP;
2130  printf(
2131  "CHIHIT %3d %10g %10g %10g %10g %10g %11.5g %11.5g %11.5g %10g %10g %10g %10g %11.5g %11.5g %11.5g %10g "
2132  "%10g %10g %10g %10g %11.5g %11.5g\n",
2133  layer,
2134  tmp_chi2[i],
2135  m_msPar.At(i, 0, 0),
2136  m_msPar.At(i, 1, 0),
2137  m_msPar.At(i, 2, 0),
2138  r_h, // x_h y_h z_h r_h -- hit pos
2139  e2s(m_msErr.At(i, 0, 0)),
2140  e2s(m_msErr.At(i, 1, 1)),
2141  e2s(m_msErr.At(i, 2, 2)), // ex_h ey_h ez_h -- hit errors
2142  m_Par[ti].At(i, 0, 0),
2143  m_Par[ti].At(i, 1, 0),
2144  m_Par[ti].At(i, 2, 0),
2145  r_t, // x_t y_t z_t r_t -- track pos
2146  e2s(m_Err[ti].At(i, 0, 0)),
2147  e2s(m_Err[ti].At(i, 1, 1)),
2148  e2s(m_Err[ti].At(i, 2, 2)), // ex_t ey_t ez_t -- track errors
2149  1.0f / m_Par[ti].At(i, 3, 0),
2150  m_Par[ti].At(i, 4, 0),
2151  m_Par[ti].At(i, 5, 0), // pt, phi, theta
2152  std::atan2(m_msPar.At(i, 1, 0), m_msPar.At(i, 0, 0)), // phi_h
2153  std::atan2(m_Par[ti].At(i, 1, 0), m_Par[ti].At(i, 0, 0)), // phi_t
2154  1e4f * std::hypot(m_msPar.At(i, 0, 0) - m_Par[ti].At(i, 0, 0),
2155  m_msPar.At(i, 1, 0) - m_Par[ti].At(i, 1, 0)), // d_xy
2156  1e4f * (m_msPar.At(i, 2, 0) - m_Par[ti].At(i, 2, 0)) // d_z
2157  // e2s((m_msErr.At(i,0,0) + m_msErr.At(i,1,1)) / (r_h * r_h)), // ephi_h
2158  // e2s((m_Err[ti].At(i,0,0) + m_Err[ti].At(i,1,1)) / (r_t * r_t)) // ephi_t
2159  );
2160  }
2161  }
2162 #endif
2163 
2164  // update chi2
2165  m_Chi2.add(tmp_chi2);
2166  }
2167  }
MPlexQI m_Chg
Definition: MkBase.h:103
static constexpr int iC
Definition: MkBase.h:18
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
Definition: Matriplex.h:436
const HitOnTrack * m_HoTArr[NN]
Definition: MkFinder.h:348
static constexpr int iP
Definition: MkBase.h:19
void kalmanOperationEndcap(const int kfOp, const MPlexLS &psErr, const MPlexLV &psPar, const MPlexHS &msErr, const MPlexHV &msPar, MPlexLS &outErr, MPlexLV &outPar, MPlexQF &outChi2, const int N_proc)
void propagateTracksToHitZ(const MPlexHV &par, const int N_proc, const PropagationFlags &pf, const MPlexQI *noMatEffPtr=nullptr)
Definition: MkBase.h:68
MPlexLV m_Par[2]
Definition: MkBase.h:102
PropagationFlags backward_fit_pflags
MPlexLS m_Err[2]
Definition: MkBase.h:101
void kalmanOperation(const int kfOp, const MPlexLS &psErr, const MPlexLV &psPar, const MPlexHS &msErr, const MPlexHV &msPar, MPlexLS &outErr, MPlexLV &outPar, MPlexQF &outChi2, const int N_proc)
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
constexpr Matriplex::idx_t NN
Definition: Matrix.h:43
MPlexHV m_msPar
Definition: MkFinder.h:327
void propagateTracksToHitR(const MPlexHV &par, const int N_proc, const PropagationFlags &pf, const MPlexQI *noMatEffPtr=nullptr)
Definition: MkBase.h:42
MPlexHS m_msErr
Definition: MkFinder.h:326
Matriplex::Matriplex< float, 1, 1, NN > MPlexQF
Definition: Matrix.h:71
int m_CurHit[NN]
Definition: MkFinder.h:347
MPlexQF m_Chi2
Definition: MkFinder.h:291

◆ bkFitInputTracks() [1/2]

void mkfit::MkFinder::bkFitInputTracks ( TrackVec cands,
int  beg,
int  end 
)

Definition at line 1929 of file MkFinder.cc.

References mkfit::MatriplexErrParPackerSlurpIn< T, D >::addInput(), HLT_2024v11_cff::cands, mkfit::TrackBase::charge(), f, mkfit::Track::getHitsOnTrackArray(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::m_Chg, m_Chi2, m_CurHit, mkfit::MkBase::m_Err, m_HoTArr, mkfit::MkBase::m_Par, mkfit::Track::nTotalHits(), and mkfit::MatriplexErrParPackerSlurpIn< T, D >::pack().

Referenced by mkfit::MkBuilder::fit_cands(), and mkfit::MkBuilder::fit_cands_BH().

1929  {
1930  // Uses HitOnTrack vector from Track directly + a local cursor array to current hit.
1931 
1932  MatriplexTrackPacker mtp(&cands[beg]);
1933 
1934  int itrack = 0;
1935 
1936  for (int i = beg; i < end; ++i, ++itrack) {
1937  const Track &trk = cands[i];
1938 
1939  m_Chg(itrack, 0, 0) = trk.charge();
1940  m_CurHit[itrack] = trk.nTotalHits() - 1;
1941  m_HoTArr[itrack] = trk.getHitsOnTrackArray();
1942 
1943  mtp.addInput(trk);
1944  }
1945 
1946  m_Chi2.setVal(0);
1947 
1948  mtp.pack(m_Err[iC], m_Par[iC]);
1949 
1950  m_Err[iC].scale(100.0f);
1951  }
MPlexQI m_Chg
Definition: MkBase.h:103
static constexpr int iC
Definition: MkBase.h:18
const HitOnTrack * m_HoTArr[NN]
Definition: MkFinder.h:348
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexLS m_Err[2]
Definition: MkBase.h:101
MatriplexErrParPackerSlurpIn< TrackBase, float > MatriplexTrackPacker
double f[11][100]
int m_CurHit[NN]
Definition: MkFinder.h:347
MPlexQF m_Chi2
Definition: MkFinder.h:291

◆ bkFitInputTracks() [2/2]

void mkfit::MkFinder::bkFitInputTracks ( EventOfCombCandidates eocss,
int  beg,
int  end 
)

Definition at line 1953 of file MkFinder.cc.

References mkfit::MatriplexErrParPackerSlurpIn< T, D >::addInput(), mkfit::TrackBase::charge(), mkfit::TrackCand::combCandidate(), f, mkfit::CombCandidate::hotsData(), mps_fire::i, mkfit::MkBase::iC, mkfit::TrackCand::lastCcIndex(), mkfit::MkBase::m_Chg, m_Chi2, m_CurNode, mkfit::MkBase::m_Err, m_HoTNodeArr, mkfit::MkBase::m_Par, m_TrkCand, and mkfit::MatriplexErrParPackerSlurpIn< T, D >::pack().

1953  {
1954  // Could as well use HotArrays from tracks directly + a local cursor array to last hit.
1955 
1956  // XXXX - shall we assume only TrackCand-zero is needed and that we can freely
1957  // bork the HoTNode array?
1958 
1959  MatriplexTrackPacker mtp(&eocss[beg][0]);
1960 
1961  int itrack = 0;
1962 
1963  for (int i = beg; i < end; ++i, ++itrack) {
1964  const TrackCand &trk = eocss[i][0];
1965 
1966  m_Chg(itrack, 0, 0) = trk.charge();
1967  m_CurNode[itrack] = trk.lastCcIndex();
1968  m_HoTNodeArr[itrack] = trk.combCandidate()->hotsData();
1969 
1970  // XXXX Need TrackCand* to update num-hits. Unless I collect info elsewhere
1971  // and fix it in BkFitOutputTracks.
1972  m_TrkCand[itrack] = &eocss[i][0];
1973 
1974  mtp.addInput(trk);
1975  }
1976 
1977  m_Chi2.setVal(0);
1978 
1979  mtp.pack(m_Err[iC], m_Par[iC]);
1980 
1981  m_Err[iC].scale(100.0f);
1982  }
MPlexQI m_Chg
Definition: MkBase.h:103
static constexpr int iC
Definition: MkBase.h:18
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexLS m_Err[2]
Definition: MkBase.h:101
MatriplexErrParPackerSlurpIn< TrackBase, float > MatriplexTrackPacker
double f[11][100]
int m_CurNode[NN]
Definition: MkFinder.h:349
TrackCand * m_TrkCand[NN]
Definition: MkFinder.h:318
MPlexQF m_Chi2
Definition: MkFinder.h:291
const HoTNode * m_HoTNodeArr[NN]
Definition: MkFinder.h:350

◆ bkFitOutputTracks() [1/2]

void mkfit::MkFinder::bkFitOutputTracks ( TrackVec cands,
int  beg,
int  end,
bool  outputProp 
)

Definition at line 1986 of file MkFinder.cc.

References HLT_2024v11_cff::cands, mkfit::TrackBase::chi2(), mkfit::TrackBase::errors_nc(), mkfit::getScoreCand(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, mkfit::isFinite(), m_Chi2, mkfit::MkBase::m_Err, mkfit::MkBase::m_Par, m_steering_params, mkfit::SteeringParams::m_track_scorer, mkfit::TrackBase::parameters_nc(), mkfit::TrackBase::setChi2(), and mkfit::TrackBase::setScore().

Referenced by mkfit::MkBuilder::fit_cands(), and mkfit::MkBuilder::fit_cands_BH().

1986  {
1987  // Only copy out track params / errors / chi2, all the rest is ok.
1988 
1989  const int iO = outputProp ? iP : iC;
1990 
1991  int itrack = 0;
1992  for (int i = beg; i < end; ++i, ++itrack) {
1993  Track &trk = cands[i];
1994 
1995  m_Err[iO].copyOut(itrack, trk.errors_nc().Array());
1996  m_Par[iO].copyOut(itrack, trk.parameters_nc().Array());
1997 
1998  trk.setChi2(m_Chi2(itrack, 0, 0));
1999  if (isFinite(trk.chi2())) {
2000  trk.setScore(getScoreCand(m_steering_params->m_track_scorer, trk));
2001  }
2002  }
2003  }
float getScoreCand(const track_score_func &score_func, const Track &cand1, bool penalizeTailMissHits=false, bool inFindCandidates=false)
Definition: Track.h:601
static constexpr int iC
Definition: MkBase.h:18
static constexpr int iP
Definition: MkBase.h:19
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexLS m_Err[2]
Definition: MkBase.h:101
track_score_func m_track_scorer
const SteeringParams * m_steering_params
Definition: MkFinder.h:340
MPlexQF m_Chi2
Definition: MkFinder.h:291
constexpr bool isFinite(float x)

◆ bkFitOutputTracks() [2/2]

void mkfit::MkFinder::bkFitOutputTracks ( EventOfCombCandidates eocss,
int  beg,
int  end,
bool  outputProp 
)

Definition at line 2005 of file MkFinder.cc.

References mkfit::TrackBase::chi2(), mkfit::TrackBase::errors_nc(), mkfit::getScoreCand(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, mkfit::isFinite(), m_Chi2, mkfit::MkBase::m_Err, mkfit::MkBase::m_Par, m_steering_params, mkfit::SteeringParams::m_track_scorer, mkfit::TrackBase::parameters_nc(), mkfit::TrackBase::setChi2(), and mkfit::TrackBase::setScore().

2005  {
2006  // Only copy out track params / errors / chi2, all the rest is ok.
2007 
2008  // XXXX - where will rejected hits get removed?
2009 
2010  const int iO = outputProp ? iP : iC;
2011 
2012  int itrack = 0;
2013  for (int i = beg; i < end; ++i, ++itrack) {
2014  TrackCand &trk = eocss[i][0];
2015 
2016  m_Err[iO].copyOut(itrack, trk.errors_nc().Array());
2017  m_Par[iO].copyOut(itrack, trk.parameters_nc().Array());
2018 
2019  trk.setChi2(m_Chi2(itrack, 0, 0));
2020  if (isFinite(trk.chi2())) {
2021  trk.setScore(getScoreCand(m_steering_params->m_track_scorer, trk));
2022  }
2023  }
2024  }
float getScoreCand(const track_score_func &score_func, const Track &cand1, bool penalizeTailMissHits=false, bool inFindCandidates=false)
Definition: Track.h:601
static constexpr int iC
Definition: MkBase.h:18
static constexpr int iP
Definition: MkBase.h:19
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexLS m_Err[2]
Definition: MkBase.h:101
track_score_func m_track_scorer
const SteeringParams * m_steering_params
Definition: MkFinder.h:340
MPlexQF m_Chi2
Definition: MkFinder.h:291
constexpr bool isFinite(float x)

◆ bkFitPropTracksToPCA()

void mkfit::MkFinder::bkFitPropTracksToPCA ( const int  N_proc)

Definition at line 2415 of file MkFinder.cc.

References m_prop_config, mkfit::PropagationConfig::pca_prop_pflags, and mkfit::MkBase::propagateTracksToPCAZ().

Referenced by mkfit::MkBuilder::fit_cands(), and mkfit::MkBuilder::fit_cands_BH().

2415  {
2417  }
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
PropagationFlags pca_prop_pflags
void propagateTracksToPCAZ(const int N_proc, const PropagationFlags &pf)
Definition: MkBase.h:82

◆ chi2OfLoadedHit()

void mkfit::MkFinder::chi2OfLoadedHit ( int  N_proc,
const FindingFoos fnd_foos 
)

Definition at line 1882 of file MkFinder.cc.

References mkfit::MkBase::clearFailFlag(), mkfit::PropagationConfig::finding_inter_layer_pflags, mkfit::PropagationConfig::finding_requires_propagation_to_hit_pos, mkfit::MkBase::iC, mkfit::MkBase::iP, mkfit::MkBase::m_Chg, m_Chi2, mkfit::FindingFoos::m_compute_chi2_foo, mkfit::MkBase::m_Err, mkfit::MkBase::m_FailFlag, m_msErr, m_msPar, mkfit::MkBase::m_Par, and m_prop_config.

Referenced by mkfit::MkBuilder::find_tracks_in_layers().

1882  {
1883  // We expect input in iC slots from above function.
1884  // See comment in MkBuilder::find_tracks_in_layer() about intra / inter flags used here
1885  // for propagation to the hit.
1886  clearFailFlag();
1887  (*fnd_foos.m_compute_chi2_foo)(m_Err[iC],
1888  m_Par[iC],
1889  m_Chg,
1890  m_msErr,
1891  m_msPar,
1892  m_Chi2,
1893  m_Par[iP],
1894  m_FailFlag,
1895  N_proc,
1898 
1899  // PROP-FAIL-ENABLE .... removed here
1900  }
MPlexQI m_Chg
Definition: MkBase.h:103
static constexpr int iC
Definition: MkBase.h:18
static constexpr int iP
Definition: MkBase.h:19
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexQI m_FailFlag
Definition: MkBase.h:104
MPlexLS m_Err[2]
Definition: MkBase.h:101
PropagationFlags finding_inter_layer_pflags
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
MPlexHV m_msPar
Definition: MkFinder.h:327
void clearFailFlag()
Definition: MkBase.h:96
MPlexHS m_msErr
Definition: MkFinder.h:326
MPlexQF m_Chi2
Definition: MkFinder.h:291

◆ copy_in() [1/2]

void mkfit::MkFinder::copy_in ( const Track trk,
const int  mslot,
const int  tslot 
)
inlineprivate

Definition at line 178 of file MkFinder.h.

References mkfit::Track::beginHitsOnTrack(), mkfit::TrackBase::charge(), mkfit::TrackBase::chi2(), filterCSVwithJSON::copy, mkfit::Track::endHitsOnTrack(), mkfit::TrackBase::errors(), mkfit::TrackBase::label(), mkfit::MkBase::m_Chg, m_Chi2, mkfit::MkBase::m_Err, m_HoTArrs, m_Label, m_NFoundHits, m_NHits, m_NInsideMinusOneHits, m_NTailMinusOneHits, mkfit::MkBase::m_Par, mkfit::Track::nFoundHits(), mkfit::Track::nInsideMinusOneHits(), mkfit::Track::nTailMinusOneHits(), mkfit::Track::nTotalHits(), and mkfit::TrackBase::parameters().

Referenced by inputTracksAndHitIdx(), and inputTracksAndHits().

178  {
179  m_Err[tslot].copyIn(mslot, trk.errors().Array());
180  m_Par[tslot].copyIn(mslot, trk.parameters().Array());
181 
182  m_Chg(mslot, 0, 0) = trk.charge();
183  m_Chi2(mslot, 0, 0) = trk.chi2();
184  m_Label(mslot, 0, 0) = trk.label();
185 
186  m_NHits(mslot, 0, 0) = trk.nTotalHits();
187  m_NFoundHits(mslot, 0, 0) = trk.nFoundHits();
188 
189  m_NInsideMinusOneHits(mslot, 0, 0) = trk.nInsideMinusOneHits();
190  m_NTailMinusOneHits(mslot, 0, 0) = trk.nTailMinusOneHits();
191 
192  std::copy(trk.beginHitsOnTrack(), trk.endHitsOnTrack(), m_HoTArrs[mslot]);
193  }
MPlexQI m_Chg
Definition: MkBase.h:103
MPlexQI m_NFoundHits
Definition: MkFinder.h:295
HitOnTrack m_HoTArrs[NN][Config::nMaxTrkHits]
Definition: MkFinder.h:297
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexLS m_Err[2]
Definition: MkBase.h:101
MPlexQI m_NTailMinusOneHits
Definition: MkFinder.h:312
MPlexQI m_NHits
Definition: MkFinder.h:294
MPlexQF m_Chi2
Definition: MkFinder.h:291
MPlexQI m_NInsideMinusOneHits
Definition: MkFinder.h:311
MPlexQI m_Label
Definition: MkFinder.h:292

◆ copy_in() [2/2]

void mkfit::MkFinder::copy_in ( const TrackCand trk,
const int  mslot,
const int  tslot 
)
inlineprivate

Definition at line 207 of file MkFinder.h.

References mkfit::TrackBase::charge(), mkfit::TrackBase::chi2(), mkfit::TrackCand::combCandidate(), mkfit::TrackBase::errors(), mkfit::TrackBase::getStatus(), mkfit::TrackBase::label(), mkfit::TrackCand::lastCcIndex(), mkfit::MkBase::m_Chg, m_Chi2, m_CombCand, mkfit::MkBase::m_Err, m_Label, m_LastHitCcIndex, m_NFoundHits, m_NInsideMinusOneHits, m_NMissingHits, m_NOverlapHits, m_NTailMinusOneHits, mkfit::MkBase::m_Par, m_TrkStatus, mkfit::TrackCand::nFoundHits(), mkfit::TrackCand::nInsideMinusOneHits(), mkfit::TrackCand::nMissingHits(), mkfit::TrackCand::nOverlapHits(), mkfit::TrackCand::nTailMinusOneHits(), and mkfit::TrackBase::parameters().

207  {
208  m_Err[tslot].copyIn(mslot, trk.errors().Array());
209  m_Par[tslot].copyIn(mslot, trk.parameters().Array());
210 
211  m_Chg(mslot, 0, 0) = trk.charge();
212  m_Chi2(mslot, 0, 0) = trk.chi2();
213  m_Label(mslot, 0, 0) = trk.label();
214 
215  m_LastHitCcIndex(mslot, 0, 0) = trk.lastCcIndex();
216  m_NFoundHits(mslot, 0, 0) = trk.nFoundHits();
217  m_NMissingHits(mslot, 0, 0) = trk.nMissingHits();
218  m_NOverlapHits(mslot, 0, 0) = trk.nOverlapHits();
219 
220  m_NInsideMinusOneHits(mslot, 0, 0) = trk.nInsideMinusOneHits();
221  m_NTailMinusOneHits(mslot, 0, 0) = trk.nTailMinusOneHits();
222 
223  m_CombCand[mslot] = trk.combCandidate();
224  m_TrkStatus[mslot] = trk.getStatus();
225  }
MPlexQI m_Chg
Definition: MkBase.h:103
MPlexQI m_NFoundHits
Definition: MkFinder.h:295
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexQI m_NMissingHits
Definition: MkFinder.h:309
MPlexLS m_Err[2]
Definition: MkBase.h:101
TrackBase::Status m_TrkStatus[NN]
Definition: MkFinder.h:314
MPlexQI m_NTailMinusOneHits
Definition: MkFinder.h:312
MPlexQI m_LastHitCcIndex
Definition: MkFinder.h:313
CombCandidate * m_CombCand[NN]
Definition: MkFinder.h:315
MPlexQI m_NOverlapHits
Definition: MkFinder.h:310
MPlexQF m_Chi2
Definition: MkFinder.h:291
MPlexQI m_NInsideMinusOneHits
Definition: MkFinder.h:311
MPlexQI m_Label
Definition: MkFinder.h:292

◆ copy_out() [1/2]

void mkfit::MkFinder::copy_out ( Track trk,
const int  mslot,
const int  tslot 
) const
inlineprivate

Definition at line 195 of file MkFinder.h.

References mkfit::Track::beginHitsOnTrack_nc(), filterCSVwithJSON::copy, mkfit::TrackBase::errors_nc(), mkfit::MkBase::m_Chg, m_Chi2, mkfit::MkBase::m_Err, m_HoTArrs, m_Label, m_NFoundHits, m_NHits, mkfit::MkBase::m_Par, mkfit::TrackBase::parameters_nc(), mkfit::Track::resizeHits(), mkfit::TrackBase::setCharge(), mkfit::TrackBase::setChi2(), and mkfit::TrackBase::setLabel().

Referenced by findCandidates(), outputNonStoppedTracksAndHitIdx(), outputTrackAndHitIdx(), and outputTracksAndHitIdx().

195  {
196  m_Err[tslot].copyOut(mslot, trk.errors_nc().Array());
197  m_Par[tslot].copyOut(mslot, trk.parameters_nc().Array());
198 
199  trk.setCharge(m_Chg(mslot, 0, 0));
200  trk.setChi2(m_Chi2(mslot, 0, 0));
201  trk.setLabel(m_Label(mslot, 0, 0));
202 
203  trk.resizeHits(m_NHits(mslot, 0, 0), m_NFoundHits(mslot, 0, 0));
204  std::copy(m_HoTArrs[mslot], &m_HoTArrs[mslot][m_NHits(mslot, 0, 0)], trk.beginHitsOnTrack_nc());
205  }
MPlexQI m_Chg
Definition: MkBase.h:103
MPlexQI m_NFoundHits
Definition: MkFinder.h:295
HitOnTrack m_HoTArrs[NN][Config::nMaxTrkHits]
Definition: MkFinder.h:297
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexLS m_Err[2]
Definition: MkBase.h:101
MPlexQI m_NHits
Definition: MkFinder.h:294
MPlexQF m_Chi2
Definition: MkFinder.h:291
MPlexQI m_Label
Definition: MkFinder.h:292

◆ copy_out() [2/2]

void mkfit::MkFinder::copy_out ( TrackCand trk,
const int  mslot,
const int  tslot 
) const
inlineprivate

Definition at line 227 of file MkFinder.h.

References mkfit::TrackBase::errors_nc(), mkfit::MkBase::m_Chg, m_Chi2, m_CombCand, mkfit::MkBase::m_Err, m_Label, m_LastHitCcIndex, m_NFoundHits, m_NInsideMinusOneHits, m_NMissingHits, m_NOverlapHits, m_NTailMinusOneHits, mkfit::MkBase::m_Par, m_TrkStatus, mkfit::TrackBase::parameters_nc(), mkfit::TrackBase::setCharge(), mkfit::TrackBase::setChi2(), mkfit::TrackCand::setCombCandidate(), mkfit::TrackBase::setLabel(), mkfit::TrackCand::setLastCcIndex(), mkfit::TrackCand::setNFoundHits(), mkfit::TrackCand::setNInsideMinusOneHits(), mkfit::TrackCand::setNMissingHits(), mkfit::TrackCand::setNOverlapHits(), mkfit::TrackCand::setNTailMinusOneHits(), and mkfit::TrackBase::setStatus().

227  {
228  m_Err[tslot].copyOut(mslot, trk.errors_nc().Array());
229  m_Par[tslot].copyOut(mslot, trk.parameters_nc().Array());
230 
231  trk.setCharge(m_Chg(mslot, 0, 0));
232  trk.setChi2(m_Chi2(mslot, 0, 0));
233  trk.setLabel(m_Label(mslot, 0, 0));
234 
235  trk.setLastCcIndex(m_LastHitCcIndex(mslot, 0, 0));
236  trk.setNFoundHits(m_NFoundHits(mslot, 0, 0));
237  trk.setNMissingHits(m_NMissingHits(mslot, 0, 0));
238  trk.setNOverlapHits(m_NOverlapHits(mslot, 0, 0));
239 
240  trk.setNInsideMinusOneHits(m_NInsideMinusOneHits(mslot, 0, 0));
241  trk.setNTailMinusOneHits(m_NTailMinusOneHits(mslot, 0, 0));
242 
243  trk.setCombCandidate(m_CombCand[mslot]);
244  trk.setStatus(m_TrkStatus[mslot]);
245  }
MPlexQI m_Chg
Definition: MkBase.h:103
MPlexQI m_NFoundHits
Definition: MkFinder.h:295
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexQI m_NMissingHits
Definition: MkFinder.h:309
MPlexLS m_Err[2]
Definition: MkBase.h:101
TrackBase::Status m_TrkStatus[NN]
Definition: MkFinder.h:314
MPlexQI m_NTailMinusOneHits
Definition: MkFinder.h:312
MPlexQI m_LastHitCcIndex
Definition: MkFinder.h:313
CombCandidate * m_CombCand[NN]
Definition: MkFinder.h:315
MPlexQI m_NOverlapHits
Definition: MkFinder.h:310
MPlexQF m_Chi2
Definition: MkFinder.h:291
MPlexQI m_NInsideMinusOneHits
Definition: MkFinder.h:311
MPlexQI m_Label
Definition: MkFinder.h:292

◆ copyOutParErr()

void mkfit::MkFinder::copyOutParErr ( std::vector< CombCandidate > &  seed_cand_vec,
int  N_proc,
bool  outputProp 
) const

Definition at line 1906 of file MkFinder.cc.

References dprint, mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, m_CandIdx, mkfit::MkBase::m_Chg, mkfit::MkBase::m_Err, mkfit::MkBase::m_Par, m_SeedIdx, and mkfit::NN.

Referenced by mkfit::MkBuilder::find_tracks_in_layers().

1906  {
1907  const int iO = outputProp ? iP : iC;
1908 
1909  for (int i = 0; i < NN; ++i) {
1910  if (i < N_proc) {
1911  TrackCand &cand = seed_cand_vec[m_SeedIdx(i, 0, 0)][m_CandIdx(i, 0, 0)];
1912 
1913  // Set the track state to the updated parameters
1914  m_Err[iO].copyOut(i, cand.errors_nc().Array());
1915  m_Par[iO].copyOut(i, cand.parameters_nc().Array());
1916  cand.setCharge(m_Chg(i, 0, 0));
1917 
1918  dprint((outputProp ? "propagated" : "updated")
1919  << " track parameters x=" << cand.parameters()[0] << " y=" << cand.parameters()[1]
1920  << " z=" << cand.parameters()[2] << " pt=" << 1. / cand.parameters()[3] << " posEta=" << cand.posEta());
1921  }
1922  }
1923  }
MPlexQI m_Chg
Definition: MkBase.h:103
static constexpr int iC
Definition: MkBase.h:18
static constexpr int iP
Definition: MkBase.h:19
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexLS m_Err[2]
Definition: MkBase.h:101
constexpr Matriplex::idx_t NN
Definition: Matrix.h:43
#define dprint(x)
Definition: Debug.h:95
MPlexQI m_CandIdx
Definition: MkFinder.h:300
MPlexQI m_SeedIdx
Definition: MkFinder.h:299

◆ end_layer()

void mkfit::MkFinder::end_layer ( )

Definition at line 88 of file MkFinder.cc.

Referenced by mkfit::MkBuilder::find_tracks_in_layers().

88  {
89 #ifdef RNT_DUMP_MkF_SelHitIdcs
90  rnt_shi.FillH();
91  rnt_shi.FillF();
92 #endif
93  }

◆ findCandidates()

void mkfit::MkFinder::findCandidates ( const LayerOfHits layer_of_hits,
std::vector< std::vector< TrackCand >> &  tmp_candidates,
const int  offset,
const int  N_proc,
const FindingFoos fnd_foos 
)

Definition at line 1341 of file MkFinder.cc.

References funct::abs(), mkfit::TrackCand::addHitIdx(), nano_mu_local_reco_cff::chi2, mkfit::MkBase::clearFailFlag(), mkfit::TrackCand::combCandidate(), ALPAKA_ACCELERATOR_NAMESPACE::brokenline::constexpr(), copy_out(), mkfit::Hit::detIDinLayer(), DeadROC_duringRun::dir, dprint, dprintf, mkfit::PropagationConfig::finding_intra_layer_pflags, mkfit::PropagationConfig::finding_requires_propagation_to_hit_pos, getHitSelDynamicChi2Cut(), mkfit::getScoreCand(), mkfit::LayerInfo::has_charge(), mkfit::LayerOfHits::hitArray(), Matriplex::hypot(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, mkfit::LayerOfHits::is_barrel(), mkfit::LayerOfHits::is_pixel(), mkfit::isStripQCompatible(), ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder::it, mkfit::kalmanPropagateAndComputeChi2Plane(), mkfit::Hit::kHitEdgeIdx, mkfit::Hit::kHitInGapIdx, mkfit::Hit::kHitMaxClusterIdx, mkfit::Hit::kHitMissIdx, mkfit::Hit::kHitStopIdx, mkfit::LayerOfHits::layer_id(), mkfit::LayerOfHits::layer_info(), m_CandIdx, mkfit::MkBase::m_Chg, mkfit::FindingFoos::m_compute_chi2_foo, mkfit::MkBase::m_Err, mkfit::MkBase::m_FailFlag, m_HoTArrs, m_iteration_params, m_msErr, m_msPar, m_NFoundHits, m_NTailMinusOneHits, mkfit::MkBase::m_Par, m_prop_config, m_SeedIdx, m_steering_params, mkfit::SteeringParams::m_track_scorer, mkfit::FindingFoos::m_update_param_foo, m_XHitArr, m_XHitSize, m_XWsrResult, SiStripPI::max, mkfit::IterationParams::maxClusterSize, mkfit::IterationParams::maxConsecHoles, NuclearSeed_cfi::maxHits, mkfit::IterationParams::maxHolesPerCand, reco_skim_cfg_mod::maxSize, mkfit::Hit::minChargePerCM(), mkfit::NN, num_all_minus_one_hits(), hltrates_dqm_sourceclient-live_cfg::offset, packModuleNormDir(), mkfit::TrackBase::parameters(), mkfit::passStripChargePCMfromTrack(), mkfit::LayerOfHits::refHit(), mkfit::TrackBase::setCharge(), mkfit::TrackCand::setOriginIndex(), mkfit::TrackBase::setScore(), mkfit::Config::usePropToPlane, mkfit::WSR_Edge, and mkfit::WSR_Outside.

1345  {
1346  // bool debug = true;
1347 
1348  MatriplexHitPacker mhp(layer_of_hits.hitArray());
1349 
1350  int maxSize = 0;
1351 
1352  // Determine maximum number of hits for tracks in the collection.
1353  for (int it = 0; it < NN; ++it) {
1354  if (it < N_proc) {
1355  if (m_XHitSize[it] > 0) {
1357  }
1358  }
1359  }
1360 
1361  dprintf("FindCandidates max hits to process=%d\n", maxSize);
1362 
1363  int nHitsAdded[NN]{};
1364  bool isTooLargeCluster[NN]{false};
1365 
1366  for (int hit_cnt = 0; hit_cnt < maxSize; ++hit_cnt) {
1367  mhp.reset();
1368 
1369  int charge_pcm[NN];
1370 
1371  //#pragma omp simd doesn't vectorize with current compilers
1372  for (int itrack = 0; itrack < NN; ++itrack) {
1373  if (itrack < N_proc && hit_cnt < m_XHitSize[itrack]) {
1374  const auto &hit = layer_of_hits.refHit(m_XHitArr.At(itrack, hit_cnt, 0));
1375  mhp.addInputAt(itrack, hit);
1376  charge_pcm[itrack] = hit.chargePerCM();
1377  }
1378  }
1379 
1380  mhp.pack(m_msErr, m_msPar);
1381 
1382  //now compute the chi2 of track state vs hit
1383  MPlexQF outChi2;
1384  MPlexLV propPar;
1385  clearFailFlag();
1386 
1388  // Maybe could use 2 matriplex packers ... ModuleInfo has 3 * SVector3 and uint
1389  MPlexHV norm, dir;
1390  packModuleNormDir(layer_of_hits, hit_cnt, norm, dir, N_proc);
1392  m_Par[iP],
1393  m_Chg,
1394  m_msErr,
1395  m_msPar,
1396  norm,
1397  dir,
1398  outChi2,
1399  propPar,
1400  m_FailFlag,
1401  N_proc,
1404  } else {
1405  (*fnd_foos.m_compute_chi2_foo)(m_Err[iP],
1406  m_Par[iP],
1407  m_Chg,
1408  m_msErr,
1409  m_msPar,
1410  outChi2,
1411  propPar,
1412  m_FailFlag,
1413  N_proc,
1416  }
1417 
1418  // Now update the track parameters with this hit (note that some
1419  // calculations are already done when computing chi2, to be optimized).
1420  // 1. This is not needed for candidates the hit is not added to, but it's
1421  // vectorized so doing it serially below should take the same time.
1422  // 2. Still it's a waste of time in case the hit is not added to any of the
1423  // candidates, so check beforehand that at least one cand needs update.
1424  bool oneCandPassCut = false;
1425  for (int itrack = 0; itrack < NN; ++itrack) {
1426  if (itrack >= N_proc) {
1427  continue;
1428  }
1429  float max_c2 = getHitSelDynamicChi2Cut(itrack, iP);
1430 
1431  if (hit_cnt < m_XHitSize[itrack]) {
1432  const float chi2 = std::abs(outChi2[itrack]); //fixme negative chi2 sometimes...
1433  dprint("chi2=" << chi2);
1434  if (chi2 < max_c2) {
1435  bool isCompatible = true;
1436  if (!layer_of_hits.is_pixel()) {
1437  //check module compatibility via long strip side = L/sqrt(12)
1438  isCompatible =
1439  isStripQCompatible(itrack, layer_of_hits.is_barrel(), m_Err[iP], propPar, m_msErr, m_msPar);
1440 
1441  //rescale strip charge to track parameters and reapply the cut
1442  isCompatible &= passStripChargePCMfromTrack(
1443  itrack, layer_of_hits.is_barrel(), charge_pcm[itrack], Hit::minChargePerCM(), propPar, m_msErr);
1444  }
1445  // Select only SiStrip hits with cluster size < maxClusterSize
1446  if (!layer_of_hits.is_pixel()) {
1447  if (layer_of_hits.refHit(m_XHitArr.At(itrack, hit_cnt, 0)).spanRows() >=
1449  isTooLargeCluster[itrack] = true;
1450  isCompatible = false;
1451  }
1452  }
1453 
1454  if (isCompatible) {
1455  oneCandPassCut = true;
1456  break;
1457  }
1458  }
1459  }
1460  }
1461 
1462  if (oneCandPassCut) {
1463  MPlexQI tmpChg = m_Chg;
1464  clearFailFlag();
1465  (*fnd_foos.m_update_param_foo)(m_Err[iP],
1466  m_Par[iP],
1467  tmpChg,
1468  m_msErr,
1469  m_msPar,
1470  m_Err[iC],
1471  m_Par[iC],
1472  m_FailFlag,
1473  N_proc,
1476 
1477  dprint("update parameters" << std::endl
1478  << "propagated track parameters x=" << m_Par[iP].constAt(0, 0, 0)
1479  << " y=" << m_Par[iP].constAt(0, 1, 0) << std::endl
1480  << " hit position x=" << m_msPar.constAt(0, 0, 0)
1481  << " y=" << m_msPar.constAt(0, 1, 0) << std::endl
1482  << " updated track parameters x=" << m_Par[iC].constAt(0, 0, 0)
1483  << " y=" << m_Par[iC].constAt(0, 1, 0));
1484 
1485  //create candidate with hit in case chi2 < max_c2
1486  //fixme: please vectorize me... (not sure it's possible in this case)
1487  for (int itrack = 0; itrack < NN; ++itrack) {
1488  if (itrack < N_proc && hit_cnt < m_XHitSize[itrack]) {
1489  const float max_c2 = getHitSelDynamicChi2Cut(itrack, iP);
1490  const float chi2 = std::abs(outChi2[itrack]); //fixme negative chi2 sometimes...
1491  dprint("chi2=" << chi2);
1492  if (chi2 < max_c2) {
1493  bool isCompatible = true;
1494  if (!layer_of_hits.is_pixel()) {
1495  // select only SiStrip hits with cluster size < maxClusterSize
1496  if (layer_of_hits.refHit(m_XHitArr.At(itrack, hit_cnt, 0)).spanRows() >=
1498  // isTooLargeCluster[itrack] = true; -- only in CloneEngine
1499  isCompatible = false;
1500  }
1501  // check module compatibility via long strip side = L/sqrt(12)
1502  if (isCompatible)
1503  isCompatible =
1504  isStripQCompatible(itrack, layer_of_hits.is_barrel(), m_Err[iP], propPar, m_msErr, m_msPar);
1505  // rescale strip charge to track parameters and reapply the cut
1506  if (isCompatible && layer_of_hits.layer_info().has_charge()) {
1507  isCompatible = passStripChargePCMfromTrack(
1508  itrack, layer_of_hits.is_barrel(), charge_pcm[itrack], Hit::minChargePerCM(), propPar, m_msErr);
1509  }
1510  }
1511 
1512  if (isCompatible) {
1513  bool hitExists = false;
1514  int maxHits = m_NFoundHits(itrack, 0, 0);
1515  if (layer_of_hits.is_pixel()) {
1516  for (int i = 0; i <= maxHits; ++i) {
1517  if (i > 2)
1518  break;
1519  if (m_HoTArrs[itrack][i].layer == layer_of_hits.layer_id()) {
1520  hitExists = true;
1521  break;
1522  }
1523  }
1524  }
1525  if (hitExists)
1526  continue;
1527 
1528  nHitsAdded[itrack]++;
1529  dprint("chi2 cut passed, creating new candidate");
1530  // Create a new candidate and fill the tmp_candidates output vector.
1531  // QQQ only instantiate if it will pass, be better than N_best
1532 
1533  const int hit_idx = m_XHitArr.At(itrack, hit_cnt, 0);
1534 
1535  TrackCand newcand;
1536  copy_out(newcand, itrack, iC);
1537  newcand.setCharge(tmpChg(itrack, 0, 0));
1538  newcand.addHitIdx(hit_idx, layer_of_hits.layer_id(), chi2);
1539  newcand.setScore(getScoreCand(m_steering_params->m_track_scorer,
1540  newcand,
1541  true /*penalizeTailMissHits*/,
1542  true /*inFindCandidates*/));
1543  newcand.setOriginIndex(m_CandIdx(itrack, 0, 0));
1544 
1545  // To apply a fixed cut instead of dynamic cut for overlap: m_iteration_params->chi2CutOverlap
1546  if (chi2 < max_c2) {
1547  CombCandidate &ccand = *newcand.combCandidate();
1548  ccand[m_CandIdx(itrack, 0, 0)].considerHitForOverlap(
1549  hit_idx, layer_of_hits.refHit(hit_idx).detIDinLayer(), chi2);
1550  }
1551 
1552  dprint("updated track parameters x=" << newcand.parameters()[0] << " y=" << newcand.parameters()[1]
1553  << " z=" << newcand.parameters()[2]
1554  << " pt=" << 1. / newcand.parameters()[3]);
1555 
1556  tmp_candidates[m_SeedIdx(itrack, 0, 0) - offset].emplace_back(newcand);
1557  }
1558  }
1559  }
1560  }
1561  } //end if (oneCandPassCut)
1562 
1563  } //end loop over hits
1564 
1565  //now add invalid hit
1566  //fixme: please vectorize me...
1567  for (int itrack = 0; itrack < NN; ++itrack) {
1568  // Cands that miss the layer are stashed away in MkBuilder(), before propagation,
1569  // and then merged back afterwards.
1570  if (itrack >= N_proc || m_XWsrResult[itrack].m_wsr == WSR_Outside) {
1571  continue;
1572  }
1573 
1574  int fake_hit_idx = ((num_all_minus_one_hits(itrack) < m_iteration_params->maxHolesPerCand) &&
1577  : Hit::kHitStopIdx;
1578 
1579  if (m_XWsrResult[itrack].m_wsr == WSR_Edge) {
1580  // YYYYYY m_iteration_params->store_missed_layers
1581  fake_hit_idx = Hit::kHitEdgeIdx;
1582  }
1583  //now add fake hit for tracks that passsed through inactive modules
1584  else if (m_XWsrResult[itrack].m_in_gap == true && nHitsAdded[itrack] == 0) {
1585  fake_hit_idx = Hit::kHitInGapIdx;
1586  }
1587  //now add fake hit for cases where hit cluster size is larger than maxClusterSize
1588  else if (isTooLargeCluster[itrack] == true && nHitsAdded[itrack] == 0) {
1589  fake_hit_idx = Hit::kHitMaxClusterIdx;
1590  }
1591 
1592  dprint("ADD FAKE HIT FOR TRACK #" << itrack << " withinBounds=" << (fake_hit_idx != Hit::kHitEdgeIdx)
1593  << " r=" << std::hypot(m_Par[iP](itrack, 0, 0), m_Par[iP](itrack, 1, 0)));
1594 
1595  // QQQ as above, only create and add if score better
1596  TrackCand newcand;
1597  copy_out(newcand, itrack, iP);
1598  newcand.addHitIdx(fake_hit_idx, layer_of_hits.layer_id(), 0.);
1599  newcand.setScore(getScoreCand(
1600  m_steering_params->m_track_scorer, newcand, true /*penalizeTailMissHits*/, true /*inFindCandidates*/));
1601  // Only relevant when we actually add a hit
1602  // newcand.setOriginIndex(m_CandIdx(itrack, 0, 0));
1603  tmp_candidates[m_SeedIdx(itrack, 0, 0) - offset].emplace_back(newcand);
1604  }
1605  }
float getScoreCand(const track_score_func &score_func, const Track &cand1, bool penalizeTailMissHits=false, bool inFindCandidates=false)
Definition: Track.h:601
MPlexQI m_Chg
Definition: MkBase.h:103
static constexpr int iC
Definition: MkBase.h:18
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
Definition: Matriplex.h:436
MPlexQI m_NFoundHits
Definition: MkFinder.h:295
static constexpr int iP
Definition: MkBase.h:19
void copy_out(Track &trk, const int mslot, const int tslot) const
Definition: MkFinder.h:195
void packModuleNormDir(const LayerOfHits &layer_of_hits, int hit_cnt, MPlexHV &norm, MPlexHV &dir, int N_proc) const
Definition: MkFinder.cc:240
HitOnTrack m_HoTArrs[NN][Config::nMaxTrkHits]
Definition: MkFinder.h:297
Matriplex::Matriplex< float, HH, 1, NN > MPlexHV
Definition: Matrix.h:53
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexQI m_FailFlag
Definition: MkBase.h:104
Matriplex::Matriplex< float, LL, 1, NN > MPlexLV
Definition: Matrix.h:49
static constexpr int kHitStopIdx
Definition: Hit.h:194
const IterationParams * m_iteration_params
Definition: MkFinder.h:338
MPlexLS m_Err[2]
Definition: MkBase.h:101
static constexpr int kHitInGapIdx
Definition: Hit.h:197
track_score_func m_track_scorer
bool isStripQCompatible(int itrack, bool isBarrel, const MPlexLS &pErr, const MPlexLV &pPar, const MPlexHS &msErr, const MPlexHV &msPar)
Definition: MkFinder.cc:1273
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
MatriplexErrParPackerSlurpIn< Hit, float > MatriplexHitPacker
int num_all_minus_one_hits(const int mslot) const
Definition: MkFinder.h:281
constexpr Matriplex::idx_t NN
Definition: Matrix.h:43
MPlexQI m_XHitSize
Definition: MkFinder.h:322
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MPlexHV m_msPar
Definition: MkFinder.h:327
MPlexQI m_NTailMinusOneHits
Definition: MkFinder.h:312
void clearFailFlag()
Definition: MkBase.h:96
void kalmanPropagateAndComputeChi2Plane(const MPlexLS &psErr, const MPlexLV &psPar, const MPlexQI &inChg, const MPlexHS &msErr, const MPlexHV &msPar, const MPlexHV &plNrm, const MPlexHV &plDir, MPlexQF &outChi2, MPlexLV &propPar, MPlexQI &outFailFlag, const int N_proc, const PropagationFlags &propFlags, const bool propToHit)
MPlexHS m_msErr
Definition: MkFinder.h:326
Matriplex::Matriplex< int, 1, 1, NN > MPlexQI
Definition: Matrix.h:72
Matriplex::Matriplex< float, 1, 1, NN > MPlexQF
Definition: Matrix.h:71
const SteeringParams * m_steering_params
Definition: MkFinder.h:340
bool passStripChargePCMfromTrack(int itrack, bool isBarrel, unsigned int pcm, unsigned int pcmMin, const MPlexLV &pPar, const MPlexHS &msErr)
Definition: MkFinder.cc:1305
MPlexHitIdx m_XHitArr
Definition: MkFinder.h:323
#define dprint(x)
Definition: Debug.h:95
static constexpr int kHitMaxClusterIdx
Definition: Hit.h:196
MPlexQI m_CandIdx
Definition: MkFinder.h:300
MPlexQI m_SeedIdx
Definition: MkFinder.h:299
PropagationFlags finding_intra_layer_pflags
constexpr bool usePropToPlane
Definition: Config.h:51
float getHitSelDynamicChi2Cut(const int itrk, const int ipar)
Definition: MkFinder.cc:293
static constexpr int kHitMissIdx
Definition: Hit.h:193
WSR_Result m_XWsrResult[NN]
Definition: MkFinder.h:321
static constexpr int kHitEdgeIdx
Definition: Hit.h:195
static unsigned int minChargePerCM()
Definition: Hit.h:233
#define dprintf(...)
Definition: Debug.h:98

◆ findCandidatesCloneEngine()

void mkfit::MkFinder::findCandidatesCloneEngine ( const LayerOfHits layer_of_hits,
CandCloner cloner,
const int  offset,
const int  N_proc,
const FindingFoos fnd_foos 
)

m_FailFlag[itrack] &&

Definition at line 1611 of file MkFinder.cc.

References funct::abs(), mkfit::CandCloner::add_cand(), CandInfo::assignIdxChi2List(), mkfit::IdxChi2List::chi2, nano_mu_local_reco_cff::chi2, mkfit::IdxChi2List::chi2_hit, mkfit::MkBase::clearFailFlag(), mkfit::CandCloner::combCandWithOriginalIndex(), ALPAKA_ACCELERATOR_NAMESPACE::brokenline::constexpr(), mkfit::Hit::detIDinLayer(), DeadROC_duringRun::dir, dprint, dprintf, f, mkfit::PropagationConfig::finding_intra_layer_pflags, mkfit::PropagationConfig::finding_requires_propagation_to_hit_pos, getHitSelDynamicChi2Cut(), mkfit::getScoreStruct(), mkfit::LayerInfo::has_charge(), mkfit::LayerOfHits::hitArray(), mkfit::IdxChi2List::hitIdx, mkfit::CombCandidate::hot(), mps_fire::i, mkfit::MkBase::iP, mkfit::LayerOfHits::is_barrel(), mkfit::LayerOfHits::is_pixel(), mkfit::isStripQCompatible(), ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder::it, mkfit::kalmanPropagateAndComputeChi2Plane(), mkfit::Hit::kHitEdgeIdx, mkfit::Hit::kHitInGapIdx, mkfit::Hit::kHitMaxClusterIdx, mkfit::Hit::kHitMissIdx, mkfit::Hit::kHitStopIdx, mkfit::HitOnTrack::layer, mkfit::LayerOfHits::layer_id(), mkfit::LayerOfHits::layer_info(), m_CandIdx, mkfit::MkBase::m_Chg, m_Chi2, mkfit::FindingFoos::m_compute_chi2_foo, mkfit::MkBase::m_Err, mkfit::MkBase::m_FailFlag, m_iteration_params, m_Label, m_msErr, m_msPar, m_NFoundHits, m_NOverlapHits, m_NTailMinusOneHits, mkfit::MkBase::m_Par, m_prop_config, m_SeedIdx, m_steering_params, mkfit::SteeringParams::m_track_scorer, m_XHitArr, m_XHitSize, m_XWsrResult, SiStripPI::max, mkfit::IterationParams::maxClusterSize, mkfit::IterationParams::maxConsecHoles, NuclearSeed_cfi::maxHits, mkfit::IterationParams::maxHolesPerCand, reco_skim_cfg_mod::maxSize, mkfit::Hit::minChargePerCM(), mkfit::IdxChi2List::module, mkfit::IdxChi2List::nhits, mkfit::IdxChi2List::nholes, mkfit::NN, mkfit::IdxChi2List::noverlaps, mkfit::IdxChi2List::ntailholes, num_all_minus_one_hits(), num_inside_minus_one_hits(), hltrates_dqm_sourceclient-live_cfg::offset, packModuleNormDir(), mkfit::passStripChargePCMfromTrack(), mkfit::IdxChi2List::pt, mkfit::LayerOfHits::refHit(), mkfit::IdxChi2List::score, mkfit::IdxChi2List::trkIdx, mkfit::Config::usePropToPlane, mkfit::WSR_Edge, and mkfit::WSR_Outside.

Referenced by mkfit::MkBuilder::find_tracks_in_layers().

1615  {
1616  // bool debug = true;
1617 
1618  MatriplexHitPacker mhp(layer_of_hits.hitArray());
1619 
1620  int maxSize = 0;
1621 
1622  // Determine maximum number of hits for tracks in the collection.
1623 #pragma omp simd
1624  for (int it = 0; it < NN; ++it) {
1625  if (it < N_proc) {
1626  if (m_XHitSize[it] > 0) {
1628  }
1629  }
1630  }
1631 
1632  dprintf("FindCandidatesCloneEngine max hits to process=%d\n", maxSize);
1633 
1634  int nHitsAdded[NN]{};
1635  bool isTooLargeCluster[NN]{false};
1636 
1637  for (int hit_cnt = 0; hit_cnt < maxSize; ++hit_cnt) {
1638  mhp.reset();
1639 
1640  int charge_pcm[NN];
1641 
1642  //#pragma omp simd doesn't vectorize with current compilers
1643  for (int itrack = 0; itrack < NN; ++itrack) {
1644  if (itrack < N_proc && hit_cnt < m_XHitSize[itrack]) {
1645  const auto &hit = layer_of_hits.refHit(m_XHitArr.At(itrack, hit_cnt, 0));
1646  mhp.addInputAt(itrack, hit);
1647  charge_pcm[itrack] = hit.chargePerCM();
1648  }
1649  }
1650 
1651  mhp.pack(m_msErr, m_msPar);
1652 
1653  //now compute the chi2 of track state vs hit
1654  MPlexQF outChi2;
1655  MPlexLV propPar;
1656  clearFailFlag();
1657 
1659  // Maybe could use 2 matriplex packers ... ModuleInfo has 3 * SVector3 and uint
1660  MPlexHV norm, dir;
1661  packModuleNormDir(layer_of_hits, hit_cnt, norm, dir, N_proc);
1663  m_Par[iP],
1664  m_Chg,
1665  m_msErr,
1666  m_msPar,
1667  norm,
1668  dir,
1669  outChi2,
1670  propPar,
1671  m_FailFlag,
1672  N_proc,
1675  } else {
1676  (*fnd_foos.m_compute_chi2_foo)(m_Err[iP],
1677  m_Par[iP],
1678  m_Chg,
1679  m_msErr,
1680  m_msPar,
1681  outChi2,
1682  propPar,
1683  m_FailFlag,
1684  N_proc,
1687  }
1688 
1689  //#pragma omp simd // DOES NOT VECTORIZE AS IT IS NOW
1690  for (int itrack = 0; itrack < NN; ++itrack) {
1691  // We can be in failed state from the initial propagation before selectHitIndices
1692  // and there hit_count for track is set to -1 and WSR state to Failed, handled below.
1693  // Or we might have hit it here in propagate-to-hit.
1694  // PROP-FAIL-ENABLE FailFlag check to be enabled when propagation failure
1695  // detection is properly implemented in propagate-to-R/Z.
1696  if ( itrack < N_proc && hit_cnt < m_XHitSize[itrack]) {
1697  // make sure the hit was in the compatiblity window for the candidate
1698  const float max_c2 = getHitSelDynamicChi2Cut(itrack, iP);
1699  const float chi2 = std::abs(outChi2[itrack]); //fixme negative chi2 sometimes...
1700  // XXX-NUM-ERR assert(chi2 >= 0);
1701 
1702  dprintf(" chi2=%.3f (%.3f) trkIdx=%d hitIdx=%d\n", chi2, max_c2, itrack, m_XHitArr.At(itrack, hit_cnt, 0));
1703  if (chi2 < max_c2) {
1704  bool isCompatible = true;
1705  if (!layer_of_hits.is_pixel()) {
1706  // select only SiStrip hits with cluster size < maxClusterSize
1707  if (layer_of_hits.refHit(m_XHitArr.At(itrack, hit_cnt, 0)).spanRows() >=
1709  isTooLargeCluster[itrack] = true;
1710  isCompatible = false;
1711  }
1712  // check module compatibility via long strip side = L/sqrt(12)
1713  if (isCompatible)
1714  isCompatible =
1715  isStripQCompatible(itrack, layer_of_hits.is_barrel(), m_Err[iP], propPar, m_msErr, m_msPar);
1716  // rescale strip charge to track parameters and reapply the cut
1717  if (isCompatible && layer_of_hits.layer_info().has_charge()) {
1718  isCompatible = passStripChargePCMfromTrack(
1719  itrack, layer_of_hits.is_barrel(), charge_pcm[itrack], Hit::minChargePerCM(), propPar, m_msErr);
1720  }
1721  }
1722 
1723  if (isCompatible) {
1724  CombCandidate &ccand = cloner.combCandWithOriginalIndex(m_SeedIdx(itrack, 0, 0));
1725  bool hitExists = false;
1726  int maxHits = m_NFoundHits(itrack, 0, 0);
1727  if (layer_of_hits.is_pixel()) {
1728  for (int i = 0; i <= maxHits; ++i) {
1729  if (i > 2)
1730  break;
1731  if (ccand.hot(i).layer == layer_of_hits.layer_id()) {
1732  hitExists = true;
1733  break;
1734  }
1735  }
1736  }
1737  if (hitExists)
1738  continue;
1739 
1740  nHitsAdded[itrack]++;
1741  const int hit_idx = m_XHitArr.At(itrack, hit_cnt, 0);
1742 
1743  // Register hit for overlap consideration, if chi2 cut is passed
1744  // To apply a fixed cut instead of dynamic cut for overlap: m_iteration_params->chi2CutOverlap
1745  if (chi2 < max_c2) {
1746  ccand[m_CandIdx(itrack, 0, 0)].considerHitForOverlap(
1747  hit_idx, layer_of_hits.refHit(hit_idx).detIDinLayer(), chi2);
1748  }
1749 
1750  IdxChi2List tmpList;
1751  tmpList.trkIdx = m_CandIdx(itrack, 0, 0);
1752  tmpList.hitIdx = hit_idx;
1753  tmpList.module = layer_of_hits.refHit(hit_idx).detIDinLayer();
1754  tmpList.nhits = m_NFoundHits(itrack, 0, 0) + 1;
1755  tmpList.ntailholes = 0;
1756  tmpList.noverlaps = m_NOverlapHits(itrack, 0, 0);
1757  tmpList.nholes = num_all_minus_one_hits(itrack);
1758  tmpList.pt = std::abs(1.0f / m_Par[iP].At(itrack, 3, 0));
1759  tmpList.chi2 = m_Chi2(itrack, 0, 0) + chi2;
1760  tmpList.chi2_hit = chi2;
1761  tmpList.score = getScoreStruct(m_steering_params->m_track_scorer, tmpList);
1762  cloner.add_cand(m_SeedIdx(itrack, 0, 0) - offset, tmpList);
1763 
1764  dprint(" adding hit with hit_cnt=" << hit_cnt << " for trkIdx=" << tmpList.trkIdx
1765  << " orig Seed=" << m_Label(itrack, 0, 0));
1766 
1767 #ifdef RNT_DUMP_MkF_SelHitIdcs
1768  if (rnt_shi.f_h_remap[itrack] >= 0) {
1769  CandInfo &ci = (*rnt_shi.ci)[rnt_shi.f_h_remap[itrack]];
1770  ci.assignIdxChi2List(tmpList);
1771  }
1772 #endif
1773  }
1774  }
1775  }
1776  }
1777 
1778  } //end loop over hits
1779 
1780  //now add invalid hit
1781  for (int itrack = 0; itrack < NN; ++itrack) {
1782  dprint("num_all_minus_one_hits(" << itrack << ")=" << num_all_minus_one_hits(itrack));
1783 
1784  // Cands that miss the layer are stashed away in MkBuilder(), before propagation,
1785  // and then merged back afterwards.
1786  if (itrack >= N_proc || m_XWsrResult[itrack].m_wsr == WSR_Outside) {
1787  continue;
1788  }
1789 
1790  // int fake_hit_idx = num_all_minus_one_hits(itrack) < m_iteration_params->maxHolesPerCand ? -1 : -2;
1791  int fake_hit_idx = ((num_all_minus_one_hits(itrack) < m_iteration_params->maxHolesPerCand) &&
1794  : Hit::kHitStopIdx;
1795 
1796  if (m_XWsrResult[itrack].m_wsr == WSR_Edge) {
1797  fake_hit_idx = Hit::kHitEdgeIdx;
1798  }
1799  //now add fake hit for tracks that passsed through inactive modules
1800  else if (m_XWsrResult[itrack].m_in_gap == true && nHitsAdded[itrack] == 0) {
1801  fake_hit_idx = Hit::kHitInGapIdx;
1802  }
1803  //now add fake hit for cases where hit cluster size is larger than maxClusterSize
1804  else if (isTooLargeCluster[itrack] == true && nHitsAdded[itrack] == 0) {
1805  fake_hit_idx = Hit::kHitMaxClusterIdx;
1806  }
1807 
1808  // PROP-FAIL-ENABLE The following to be enabled when propagation failure
1809  // detection is properly implemented in propagate-to-R/Z.
1810  // // Override for failed propagation, this trumps all other cases.
1811  // if (m_XWsrResult[itrack].m_wsr == WSR_Failed) {
1812  // fake_hit_idx = Hit::kHitStopIdx;
1813  // }
1814 
1815  IdxChi2List tmpList;
1816  tmpList.trkIdx = m_CandIdx(itrack, 0, 0);
1817  tmpList.hitIdx = fake_hit_idx;
1818  tmpList.module = -1;
1819  tmpList.nhits = m_NFoundHits(itrack, 0, 0);
1820  tmpList.ntailholes = (fake_hit_idx == Hit::kHitMissIdx ? m_NTailMinusOneHits(itrack, 0, 0) + 1
1821  : m_NTailMinusOneHits(itrack, 0, 0));
1822  tmpList.noverlaps = m_NOverlapHits(itrack, 0, 0);
1823  tmpList.nholes = num_inside_minus_one_hits(itrack);
1824  tmpList.pt = std::abs(1.0f / m_Par[iP].At(itrack, 3, 0));
1825  tmpList.chi2 = m_Chi2(itrack, 0, 0);
1826  tmpList.chi2_hit = 0;
1827  tmpList.score = getScoreStruct(m_steering_params->m_track_scorer, tmpList);
1828  cloner.add_cand(m_SeedIdx(itrack, 0, 0) - offset, tmpList);
1829  dprint("adding invalid hit " << fake_hit_idx);
1830  }
1831  }
MPlexQI m_Chg
Definition: MkBase.h:103
MPlexQI m_NFoundHits
Definition: MkFinder.h:295
static constexpr int iP
Definition: MkBase.h:19
void packModuleNormDir(const LayerOfHits &layer_of_hits, int hit_cnt, MPlexHV &norm, MPlexHV &dir, int N_proc) const
Definition: MkFinder.cc:240
Matriplex::Matriplex< float, HH, 1, NN > MPlexHV
Definition: Matrix.h:53
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexQI m_FailFlag
Definition: MkBase.h:104
Matriplex::Matriplex< float, LL, 1, NN > MPlexLV
Definition: Matrix.h:49
static constexpr int kHitStopIdx
Definition: Hit.h:194
const IterationParams * m_iteration_params
Definition: MkFinder.h:338
MPlexLS m_Err[2]
Definition: MkBase.h:101
static constexpr int kHitInGapIdx
Definition: Hit.h:197
track_score_func m_track_scorer
bool isStripQCompatible(int itrack, bool isBarrel, const MPlexLS &pErr, const MPlexLV &pPar, const MPlexHS &msErr, const MPlexHV &msPar)
Definition: MkFinder.cc:1273
float getScoreStruct(const track_score_func &score_func, const IdxChi2List &cand1)
Definition: Track.h:617
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
MatriplexErrParPackerSlurpIn< Hit, float > MatriplexHitPacker
int num_all_minus_one_hits(const int mslot) const
Definition: MkFinder.h:281
constexpr Matriplex::idx_t NN
Definition: Matrix.h:43
MPlexQI m_XHitSize
Definition: MkFinder.h:322
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MPlexHV m_msPar
Definition: MkFinder.h:327
MPlexQI m_NTailMinusOneHits
Definition: MkFinder.h:312
double f[11][100]
void clearFailFlag()
Definition: MkBase.h:96
void kalmanPropagateAndComputeChi2Plane(const MPlexLS &psErr, const MPlexLV &psPar, const MPlexQI &inChg, const MPlexHS &msErr, const MPlexHV &msPar, const MPlexHV &plNrm, const MPlexHV &plDir, MPlexQF &outChi2, MPlexLV &propPar, MPlexQI &outFailFlag, const int N_proc, const PropagationFlags &propFlags, const bool propToHit)
MPlexHS m_msErr
Definition: MkFinder.h:326
Matriplex::Matriplex< float, 1, 1, NN > MPlexQF
Definition: Matrix.h:71
const SteeringParams * m_steering_params
Definition: MkFinder.h:340
MPlexQI m_NOverlapHits
Definition: MkFinder.h:310
bool passStripChargePCMfromTrack(int itrack, bool isBarrel, unsigned int pcm, unsigned int pcmMin, const MPlexLV &pPar, const MPlexHS &msErr)
Definition: MkFinder.cc:1305
MPlexHitIdx m_XHitArr
Definition: MkFinder.h:323
#define dprint(x)
Definition: Debug.h:95
MPlexQF m_Chi2
Definition: MkFinder.h:291
static constexpr int kHitMaxClusterIdx
Definition: Hit.h:196
MPlexQI m_CandIdx
Definition: MkFinder.h:300
MPlexQI m_SeedIdx
Definition: MkFinder.h:299
int num_inside_minus_one_hits(const int mslot) const
Definition: MkFinder.h:285
PropagationFlags finding_intra_layer_pflags
constexpr bool usePropToPlane
Definition: Config.h:51
float getHitSelDynamicChi2Cut(const int itrk, const int ipar)
Definition: MkFinder.cc:293
static constexpr int kHitMissIdx
Definition: Hit.h:193
WSR_Result m_XWsrResult[NN]
Definition: MkFinder.h:321
static constexpr int kHitEdgeIdx
Definition: Hit.h:195
bool assignIdxChi2List(const mkfit::IdxChi2List &ic2l)
Definition: RntStructs.h:120
static unsigned int minChargePerCM()
Definition: Hit.h:233
#define dprintf(...)
Definition: Debug.h:98
MPlexQI m_Label
Definition: MkFinder.h:292

◆ getHitSelDynamicChi2Cut()

float mkfit::MkFinder::getHitSelDynamicChi2Cut ( const int  itrk,
const int  ipar 
)
inline

Definition at line 293 of file MkFinder.cc.

References funct::abs(), mkfit::IterationParams::chi2Cut_min, f, mkfit::IterationLayerConfig::get_window_params(), m_in_fwd, m_iteration_layer_config, m_iteration_params, mkfit::MkBase::m_Par, SiStripPI::min, mkfit::Const::PIOver2, theta(), and findQualityFiles::v.

Referenced by addBestHit(), findCandidates(), and findCandidatesCloneEngine().

293  {
294  const float minChi2Cut = m_iteration_params->chi2Cut_min;
295  const float invpt = m_Par[ipar].At(itrk, 3, 0);
296  const float theta = std::abs(m_Par[ipar].At(itrk, 5, 0) - Const::PIOver2);
297 
298  float max_invpt = std::min(invpt, 10.0f); // => pT>0.1 GeV
299 
300  enum SelWinParameters_e { c2_sf = 8, c2_0, c2_1, c2_2 };
302 
303  if (!v.empty()) {
304  float this_c2 = v[c2_sf] * (v[c2_0] * max_invpt + v[c2_1] * theta + v[c2_2]);
305  // In case value is too low (bad window derivation or other reasons), leave original limits
306  if (this_c2 > minChi2Cut)
307  return this_c2;
308  }
309  return minChi2Cut;
310  }
const IterationLayerConfig * m_iteration_layer_config
Definition: MkFinder.h:339
MPlexLV m_Par[2]
Definition: MkBase.h:102
constexpr float PIOver2
Definition: Config.h:9
const IterationParams * m_iteration_params
Definition: MkFinder.h:338
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
const std::vector< float > & get_window_params(bool forward, bool fallback_to_other) const
Geom::Theta< T > theta() const

◆ getHitSelDynamicWindows()

void mkfit::MkFinder::getHitSelDynamicWindows ( const float  invpt,
const float  theta,
float &  min_dq,
float &  max_dq,
float &  min_dphi,
float &  max_dphi 
)

Definition at line 262 of file MkFinder.cc.

References f, mkfit::IterationLayerConfig::get_window_params(), m_in_fwd, m_iteration_layer_config, SiStripPI::min, theta(), and findQualityFiles::v.

Referenced by selectHitIndices().

263  {
264  float max_invpt = std::min(invpt, 10.0f); // => pT>0.1 GeV
265 
266  enum SelWinParameters_e { dp_sf = 0, dp_0, dp_1, dp_2, dq_sf, dq_0, dq_1, dq_2 };
268 
269  if (!v.empty()) {
270  // dq hit selection window
271  const float this_dq = v[dq_sf] * (v[dq_0] * max_invpt + v[dq_1] * theta + v[dq_2]);
272  // In case value is below 0 (bad window derivation or other reasons), leave original limits
273  if (this_dq > 0.f) {
274  min_dq = this_dq;
275  max_dq = 2.0f * min_dq;
276  }
277 
278  // dphi hit selection window
279  const float this_dphi = v[dp_sf] * (v[dp_0] * max_invpt + v[dp_1] * theta + v[dp_2]);
280  // In case value is too low (bad window derivation or other reasons), leave original limits
281  if (this_dphi > min_dphi) {
282  min_dphi = this_dphi;
283  max_dphi = 2.0f * min_dphi;
284  }
285  }
286  }
const IterationLayerConfig * m_iteration_layer_config
Definition: MkFinder.h:339
double f[11][100]
const std::vector< float > & get_window_params(bool forward, bool fallback_to_other) const
Geom::Theta< T > theta() const

◆ inputOverlapHits()

void mkfit::MkFinder::inputOverlapHits ( const LayerOfHits layer_of_hits,
const std::vector< UpdateIndices > &  idxs,
int  beg,
int  end 
)

Definition at line 181 of file MkFinder.cc.

References mps_fire::i, m_msErr, m_msPar, and mkfit::LayerOfHits::refHit().

Referenced by mkfit::MkBuilder::find_tracks_in_layers().

184  {
185  // Copy overlap hit values in.
186 
187  for (int i = beg, imp = 0; i < end; ++i, ++imp) {
188  const Hit &hit = layer_of_hits.refHit(idxs[i].ovlp_idx);
189  m_msErr.copyIn(imp, hit.errArray());
190  m_msPar.copyIn(imp, hit.posArray());
191  }
192  }
MPlexHV m_msPar
Definition: MkFinder.h:327
MPlexHS m_msErr
Definition: MkFinder.h:326

◆ inputTracksAndHitIdx() [1/4]

void mkfit::MkFinder::inputTracksAndHitIdx ( const std::vector< Track > &  tracks,
int  beg,
int  end,
bool  inputProp 
)

Definition at line 99 of file MkFinder.cc.

References copy_in(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, and DiMuonV_cfg::tracks.

Referenced by mkfit::MkBuilder::find_tracks_in_layers().

99  {
100  // Assign track parameters to initial state and copy hit values in.
101 
102  // This might not be true for the last chunk!
103  // assert(end - beg == NN);
104 
105  const int iI = inputProp ? iP : iC;
106 
107  for (int i = beg, imp = 0; i < end; ++i, ++imp) {
108  copy_in(tracks[i], imp, iI);
109  }
110  }
static constexpr int iC
Definition: MkBase.h:18
void copy_in(const Track &trk, const int mslot, const int tslot)
Definition: MkFinder.h:178
static constexpr int iP
Definition: MkBase.h:19

◆ inputTracksAndHitIdx() [2/4]

void mkfit::MkFinder::inputTracksAndHitIdx ( const std::vector< Track > &  tracks,
const std::vector< int > &  idxs,
int  beg,
int  end,
bool  inputProp,
int  mp_offset 
)

Definition at line 112 of file MkFinder.cc.

References copy_in(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, and DiMuonV_cfg::tracks.

113  {
114  // Assign track parameters to initial state and copy hit values in.
115 
116  // This might not be true for the last chunk!
117  // assert(end - beg == NN);
118 
119  const int iI = inputProp ? iP : iC;
120 
121  for (int i = beg, imp = mp_offset; i < end; ++i, ++imp) {
122  copy_in(tracks[idxs[i]], imp, iI);
123  }
124  }
static constexpr int iC
Definition: MkBase.h:18
void copy_in(const Track &trk, const int mslot, const int tslot)
Definition: MkFinder.h:178
static constexpr int iP
Definition: MkBase.h:19

◆ inputTracksAndHitIdx() [3/4]

void mkfit::MkFinder::inputTracksAndHitIdx ( const std::vector< CombCandidate > &  tracks,
const std::vector< std::pair< int, int >> &  idxs,
int  beg,
int  end,
bool  inputProp 
)

Definition at line 126 of file MkFinder.cc.

References copy_in(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, m_CandIdx, m_SeedIdx, m_SeedOriginIdx, and DiMuonV_cfg::tracks.

130  {
131  // Assign track parameters to initial state and copy hit values in.
132 
133  // This might not be true for the last chunk!
134  // assert(end - beg == NN);
135 
136  const int iI = inputProp ? iP : iC;
137 
138  for (int i = beg, imp = 0; i < end; ++i, ++imp) {
139  const TrackCand &trk = tracks[idxs[i].first][idxs[i].second];
140 
141  copy_in(trk, imp, iI);
142 
143  m_SeedIdx(imp, 0, 0) = idxs[i].first;
144  m_CandIdx(imp, 0, 0) = idxs[i].second;
145  m_SeedOriginIdx[imp] = tracks[idxs[i].first].seed_origin_index();
146  }
147  }
static constexpr int iC
Definition: MkBase.h:18
void copy_in(const Track &trk, const int mslot, const int tslot)
Definition: MkFinder.h:178
static constexpr int iP
Definition: MkBase.h:19
MPlexQI m_SeedOriginIdx
Definition: MkFinder.h:301
MPlexQI m_CandIdx
Definition: MkFinder.h:300
MPlexQI m_SeedIdx
Definition: MkFinder.h:299

◆ inputTracksAndHitIdx() [4/4]

void mkfit::MkFinder::inputTracksAndHitIdx ( const std::vector< CombCandidate > &  tracks,
const std::vector< std::pair< int, IdxChi2List >> &  idxs,
int  beg,
int  end,
bool  inputProp 
)

Definition at line 194 of file MkFinder.cc.

References copy_in(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, m_CandIdx, m_SeedIdx, m_SeedOriginIdx, and DiMuonV_cfg::tracks.

198  {
199  // Assign track parameters to initial state and copy hit values in.
200 
201  // This might not be true for the last chunk!
202  // assert(end - beg == NN);
203 
204  const int iI = inputProp ? iP : iC;
205 
206  for (int i = beg, imp = 0; i < end; ++i, ++imp) {
207  const TrackCand &trk = tracks[idxs[i].first][idxs[i].second.trkIdx];
208 
209  copy_in(trk, imp, iI);
210 
211  m_SeedIdx(imp, 0, 0) = idxs[i].first;
212  m_CandIdx(imp, 0, 0) = idxs[i].second.trkIdx;
213  m_SeedOriginIdx[imp] = tracks[idxs[i].first].seed_origin_index();
214  }
215  }
static constexpr int iC
Definition: MkBase.h:18
void copy_in(const Track &trk, const int mslot, const int tslot)
Definition: MkFinder.h:178
static constexpr int iP
Definition: MkBase.h:19
MPlexQI m_SeedOriginIdx
Definition: MkFinder.h:301
MPlexQI m_CandIdx
Definition: MkFinder.h:300
MPlexQI m_SeedIdx
Definition: MkFinder.h:299

◆ inputTracksAndHits()

void mkfit::MkFinder::inputTracksAndHits ( const std::vector< CombCandidate > &  tracks,
const LayerOfHits layer_of_hits,
const std::vector< UpdateIndices > &  idxs,
int  beg,
int  end,
bool  inputProp 
)

Definition at line 149 of file MkFinder.cc.

References copy_in(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, m_CandIdx, m_msErr, m_msPar, m_SeedIdx, m_SeedOriginIdx, m_XHitArr, m_XHitSize, mkfit::LayerOfHits::refHit(), and DiMuonV_cfg::tracks.

Referenced by mkfit::MkBuilder::find_tracks_in_layers().

154  {
155  // Assign track parameters to initial state and copy hit values in.
156 
157  // This might not be true for the last chunk!
158  // assert(end - beg == NN);
159 
160  const int iI = inputProp ? iP : iC;
161 
162  for (int i = beg, imp = 0; i < end; ++i, ++imp) {
163  const TrackCand &trk = tracks[idxs[i].seed_idx][idxs[i].cand_idx];
164 
165  copy_in(trk, imp, iI);
166 
167  m_SeedIdx(imp, 0, 0) = idxs[i].seed_idx;
168  m_CandIdx(imp, 0, 0) = idxs[i].cand_idx;
169  m_SeedOriginIdx[imp] = tracks[idxs[i].seed_idx].seed_origin_index();
170 
171  // Reuse selectHitIndices() arrays -- used also in packModuleNormDir()
172  m_XHitArr(imp, 0, 0) = idxs[i].hit_idx;
173  m_XHitSize(imp, 0, 0) = 1;
174 
175  const Hit &hit = layer_of_hits.refHit(idxs[i].hit_idx);
176  m_msErr.copyIn(imp, hit.errArray());
177  m_msPar.copyIn(imp, hit.posArray());
178  }
179  }
static constexpr int iC
Definition: MkBase.h:18
void copy_in(const Track &trk, const int mslot, const int tslot)
Definition: MkFinder.h:178
static constexpr int iP
Definition: MkBase.h:19
MPlexQI m_XHitSize
Definition: MkFinder.h:322
MPlexHV m_msPar
Definition: MkFinder.h:327
MPlexQI m_SeedOriginIdx
Definition: MkFinder.h:301
MPlexHS m_msErr
Definition: MkFinder.h:326
MPlexHitIdx m_XHitArr
Definition: MkFinder.h:323
MPlexQI m_CandIdx
Definition: MkFinder.h:300
MPlexQI m_SeedIdx
Definition: MkFinder.h:299

◆ num_all_minus_one_hits()

int mkfit::MkFinder::num_all_minus_one_hits ( const int  mslot) const
inlineprivate

Definition at line 281 of file MkFinder.h.

References m_NInsideMinusOneHits, and m_NTailMinusOneHits.

Referenced by addBestHit(), findCandidates(), and findCandidatesCloneEngine().

281  {
282  return m_NInsideMinusOneHits(mslot, 0, 0) + m_NTailMinusOneHits(mslot, 0, 0);
283  }
MPlexQI m_NTailMinusOneHits
Definition: MkFinder.h:312
MPlexQI m_NInsideMinusOneHits
Definition: MkFinder.h:311

◆ num_inside_minus_one_hits()

int mkfit::MkFinder::num_inside_minus_one_hits ( const int  mslot) const
inlineprivate

Definition at line 285 of file MkFinder.h.

References m_NInsideMinusOneHits.

Referenced by findCandidatesCloneEngine().

285 { return m_NInsideMinusOneHits(mslot, 0, 0); }
MPlexQI m_NInsideMinusOneHits
Definition: MkFinder.h:311

◆ outputNonStoppedTracksAndHitIdx()

void mkfit::MkFinder::outputNonStoppedTracksAndHitIdx ( std::vector< Track > &  tracks,
const std::vector< int > &  idxs,
int  beg,
int  end,
bool  outputProp 
) const
inline

Definition at line 107 of file MkFinder.h.

References copy_out(), mps_fire::end, mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, m_Stopped, and DiMuonV_cfg::tracks.

108  {
109  const int iO = outputProp ? iP : iC;
110  for (int i = beg, imp = 0; i < end; ++i, ++imp) {
111  if (!m_Stopped[imp])
112  copy_out(tracks[idxs[i]], imp, iO);
113  }
114  }
static constexpr int iC
Definition: MkBase.h:18
static constexpr int iP
Definition: MkBase.h:19
void copy_out(Track &trk, const int mslot, const int tslot) const
Definition: MkFinder.h:195
MPlexQI m_Stopped
Definition: MkFinder.h:303

◆ outputTrackAndHitIdx()

void mkfit::MkFinder::outputTrackAndHitIdx ( Track track,
int  itrack,
bool  outputProp 
) const
inline

Definition at line 102 of file MkFinder.h.

References copy_out(), mkfit::MkBase::iC, mkfit::MkBase::iP, and HLT_2024v11_cff::track.

102  {
103  const int iO = outputProp ? iP : iC;
104  copy_out(track, itrack, iO);
105  }
static constexpr int iC
Definition: MkBase.h:18
static constexpr int iP
Definition: MkBase.h:19
void copy_out(Track &trk, const int mslot, const int tslot) const
Definition: MkFinder.h:195

◆ outputTracksAndHitIdx() [1/2]

void mkfit::MkFinder::outputTracksAndHitIdx ( std::vector< Track > &  tracks,
int  beg,
int  end,
bool  outputProp 
) const

Definition at line 217 of file MkFinder.cc.

References copy_out(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, and DiMuonV_cfg::tracks.

217  {
218  // Copies requested track parameters into Track objects.
219  // The tracks vector should be resized to allow direct copying.
220 
221  const int iO = outputProp ? iP : iC;
222 
223  for (int i = beg, imp = 0; i < end; ++i, ++imp) {
224  copy_out(tracks[i], imp, iO);
225  }
226  }
static constexpr int iC
Definition: MkBase.h:18
static constexpr int iP
Definition: MkBase.h:19
void copy_out(Track &trk, const int mslot, const int tslot) const
Definition: MkFinder.h:195

◆ outputTracksAndHitIdx() [2/2]

void mkfit::MkFinder::outputTracksAndHitIdx ( std::vector< Track > &  tracks,
const std::vector< int > &  idxs,
int  beg,
int  end,
bool  outputProp 
) const

Definition at line 228 of file MkFinder.cc.

References copy_out(), mps_fire::i, mkfit::MkBase::iC, mkfit::MkBase::iP, and DiMuonV_cfg::tracks.

229  {
230  // Copies requested track parameters into Track objects.
231  // The tracks vector should be resized to allow direct copying.
232 
233  const int iO = outputProp ? iP : iC;
234 
235  for (int i = beg, imp = 0; i < end; ++i, ++imp) {
236  copy_out(tracks[idxs[i]], imp, iO);
237  }
238  }
static constexpr int iC
Definition: MkBase.h:18
static constexpr int iP
Definition: MkBase.h:19
void copy_out(Track &trk, const int mslot, const int tslot) const
Definition: MkFinder.h:195

◆ packModuleNormDir()

void mkfit::MkFinder::packModuleNormDir ( const LayerOfHits layer_of_hits,
int  hit_cnt,
MPlexHV norm,
MPlexHV dir,
int  N_proc 
) const

Definition at line 240 of file MkFinder.cc.

References DeadROC_duringRun::dir, mkfit::LayerOfHits::layer_info(), m_XHitArr, m_XHitSize, mkfit::LayerInfo::module_info(), mkfit::NN, mkfit::LayerOfHits::refHit(), mkfit::ModuleInfo::xdir, and mkfit::ModuleInfo::zdir.

Referenced by findCandidates(), findCandidatesCloneEngine(), and updateWithLoadedHit().

241  {
242  for (int itrack = 0; itrack < NN; ++itrack) {
243  if (itrack < N_proc && hit_cnt < m_XHitSize[itrack]) {
244  const auto &hit = layer_of_hits.refHit(m_XHitArr.constAt(itrack, hit_cnt, 0));
245  unsigned int mid = hit.detIDinLayer();
246  const ModuleInfo &mi = layer_of_hits.layer_info().module_info(mid);
247  norm.At(itrack, 0, 0) = mi.zdir[0];
248  norm.At(itrack, 1, 0) = mi.zdir[1];
249  norm.At(itrack, 2, 0) = mi.zdir[2];
250  dir.At(itrack, 0, 0) = mi.xdir[0];
251  dir.At(itrack, 1, 0) = mi.xdir[1];
252  dir.At(itrack, 2, 0) = mi.xdir[2];
253  }
254  }
255  }
constexpr Matriplex::idx_t NN
Definition: Matrix.h:43
MPlexQI m_XHitSize
Definition: MkFinder.h:322
MPlexHitIdx m_XHitArr
Definition: MkFinder.h:323

◆ print_par_err()

void mkfit::MkFinder::print_par_err ( int  corp,
int  mslot 
) const
private

Definition at line 2171 of file MkFinder.cc.

References mps_fire::i, dqmiolumiharvest::j, mkfit::MkBase::m_Err, and mkfit::MkBase::m_Par.

Referenced by bkFitFitTracks().

2171  {
2172 #ifdef DEBUG
2173  printf("Parameters:\n");
2174  for (int i = 0; i < 6; ++i) {
2175  printf(" %12.4g", m_Par[corp].constAt(mslot, i, 0));
2176  }
2177  printf("\nError matrix\n");
2178  for (int i = 0; i < 6; ++i) {
2179  for (int j = 0; j < 6; ++j) {
2180  printf(" %12.4g", m_Err[corp].constAt(mslot, i, j));
2181  }
2182  printf("\n");
2183  }
2184 #endif
2185  }
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexLS m_Err[2]
Definition: MkBase.h:101

◆ release()

void mkfit::MkFinder::release ( )

Definition at line 56 of file MkFinder.cc.

References m_current_region, m_event, m_in_fwd, m_iteration_config, m_iteration_hit_mask, m_iteration_layer_config, m_iteration_params, m_prop_config, and m_steering_params.

Referenced by mkfit::MkBuilder::fit_cands().

56  {
57  m_prop_config = nullptr;
58  m_iteration_config = nullptr;
59  m_iteration_params = nullptr;
60  m_iteration_layer_config = nullptr;
61  m_steering_params = nullptr;
62  m_iteration_hit_mask = nullptr;
63  m_event = nullptr;
64  m_current_region = -1;
65  m_in_fwd = true;
66  }
const IterationLayerConfig * m_iteration_layer_config
Definition: MkFinder.h:339
const Event * m_event
Definition: MkFinder.h:342
const IterationConfig * m_iteration_config
Definition: MkFinder.h:337
const IterationParams * m_iteration_params
Definition: MkFinder.h:338
int m_current_region
Definition: MkFinder.h:343
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
const SteeringParams * m_steering_params
Definition: MkFinder.h:340
const std::vector< bool > * m_iteration_hit_mask
Definition: MkFinder.h:341

◆ selectHitIndices()

void mkfit::MkFinder::selectHitIndices ( const LayerOfHits layer_of_hits,
const int  N_proc,
bool  fill_binsearch_only = false 
)

Definition at line 316 of file MkFinder.cc.

References funct::abs(), cms::cuda::assert(), CandInfo::bso, mkfit::cdist(), mkfit::TrackBase::charge(), mkfit::Event::currentSeed(), dprint, dprintf, PVValHelper::dz, mkfit::Hit::ephi(), mkfit::Hit::errArray(), mkfit::Event::evtID(), mkfit::Hit::exx(), mkfit::Hit::eyy(), mkfit::Hit::ezz(), f, mkfit::PropagationConfig::finding_intra_layer_pflags, mkfit::PropagationConfig::finding_requires_propagation_to_hit_pos, dqmdumpme::first, cms::cuda::for(), mkfit::FindingFoos::get_finding_foos(), mkfit::getEta(), getHitSelDynamicWindows(), mkfit::getPhi(), mkfit::Event::SimLabelFromHits::good_frac(), Matriplex::hypot(), mps_fire::i, createfilelist::int, mkfit::MkBase::iP, mkfit::Event::SimLabelFromHits::is_set(), mkfit::TrackBase::isFindable(), mkfit::isFinite(), CommonMethods::isnan(), dttmaxenums::L, mkfit::Event::SimLabelFromHits::label, mkfit::TrackBase::label(), m_CandIdx, mkfit::MkBase::m_Chg, m_Chi2, mkfit::FindingFoos::m_compute_chi2_foo, mkfit::MkBase::m_Err, m_event, mkfit::MkBase::m_FailFlag, mkfit::WSR_Result::m_in_gap, m_iteration_config, m_iteration_hit_mask, m_iteration_layer_config, m_iteration_params, m_Label, m_msErr, m_msPar, m_NFoundHits, mkfit::MkBase::m_Par, m_prop_config, m_SeedOriginIdx, mkfit::IterationConfig::m_track_algorithm, mkfit::WSR_Result::m_wsr, m_XHitArr, m_XHitSize, m_XWsrResult, SiStripPI::max, mkfit::IterationLayerConfig::max_dphi(), mkfit::IterationLayerConfig::max_dq(), mkfit::IterationParams::maxConsecHoles, mkfit::IterationParams::maxHolesPerCand, mkfit::MCHitInfo::mcTrackID(), mkfit::IterationLayerConfig::min_dphi(), mkfit::IterationLayerConfig::min_dq(), mkfit::TrackBase::momEta(), mkfit::TrackBase::momPhi(), MPlexHitIdxMax, mkfit::NN, nSigmaPhi, HLT_2024v11_cff::nSigmaZ, mkfit::Track::nTotalHits(), pi, mkfit::Const::PIOver2, mkfit::Hit::posArray(), mkfit::TrackBase::posR(), funct::pow(), mkfit::TrackBase::prodType(), mkfit::TrackBase::pT(), submitPVResolutionJobs::q, diffTwoXMLs::r2, mkfit::Event::simHitsInfo_, mkfit::Event::simLabelForCurrentSeed(), mkfit::Event::simTracks_, funct::sin(), mathSSE::sqrt(), funct::tan(), cuy::tex, theta(), mkfit::Config::usePhiQArrays, mkfit::WSR_Failed, mkfit::WSR_Outside, x, mkfit::Hit::x(), mkfit::Hit::y(), mkfit::TrackBase::z(), and mkfit::Hit::z().

Referenced by mkfit::MkBuilder::find_tracks_in_layers(), and selectHitIndicesV2().

316  {
317  // bool debug = true;
318  using bidx_t = LayerOfHits::bin_index_t;
319  using bcnt_t = LayerOfHits::bin_content_t;
320  const LayerOfHits &L = layer_of_hits;
321  const IterationLayerConfig &ILC = *m_iteration_layer_config;
322 
323  const int iI = iP;
324  const float nSigmaPhi = 3;
325  const float nSigmaZ = 3;
326  const float nSigmaR = 3;
327 
328  dprintf("LayerOfHits::SelectHitIndices %s layer=%d N_proc=%d\n",
329  L.is_barrel() ? "barrel" : "endcap",
330  L.layer_id(),
331  N_proc);
332 
333  float dqv[NN], dphiv[NN], qv[NN], phiv[NN];
334  bidx_t qb1v[NN], qb2v[NN], qbv[NN], pb1v[NN], pb2v[NN];
335 
336  const auto assignbins = [&](int itrack,
337  float q,
338  float dq,
339  float phi,
340  float dphi,
341  float min_dq,
342  float max_dq,
343  float min_dphi,
344  float max_dphi) {
345  dphi = std::clamp(std::abs(dphi), min_dphi, max_dphi);
346  dq = std::clamp(dq, min_dq, max_dq);
347  //
348  qv[itrack] = q;
349  phiv[itrack] = phi;
350  dphiv[itrack] = dphi;
351  dqv[itrack] = dq;
352  //
353  qbv[itrack] = L.qBinChecked(q);
354  qb1v[itrack] = L.qBinChecked(q - dq);
355  qb2v[itrack] = L.qBinChecked(q + dq) + 1;
356  pb1v[itrack] = L.phiBinChecked(phi - dphi);
357  pb2v[itrack] = L.phiMaskApply(L.phiBin(phi + dphi) + 1);
358  };
359 
360  const auto calcdphi2 = [&](int itrack, float dphidx, float dphidy) {
361  return dphidx * dphidx * m_Err[iI].constAt(itrack, 0, 0) + dphidy * dphidy * m_Err[iI].constAt(itrack, 1, 1) +
362  2 * dphidx * dphidy * m_Err[iI].constAt(itrack, 0, 1);
363  };
364 
365  const auto calcdphi = [&](float dphi2, float min_dphi) {
366  return std::max(nSigmaPhi * std::sqrt(std::abs(dphi2)), min_dphi);
367  };
368 
369  if (L.is_barrel()) {
370  // Pull out the part of the loop that vectorizes with icc and gcc
371  // In llvm16 clang issues a warning that it can't vectorize
372  // the loop. Unfortunately, there doesn't seem to be a
373  // pragma to suppress the warning, so we ifdef it out. This
374  // should be rechecked if llvm vectorization improves.
375 #if !defined(__clang__)
376 #pragma omp simd
377 #endif
378  for (int itrack = 0; itrack < NN; ++itrack) {
379  if (itrack >= N_proc)
380  continue;
381  m_XHitSize[itrack] = 0;
382 
383  float min_dq = ILC.min_dq();
384  float max_dq = ILC.max_dq();
385  float min_dphi = ILC.min_dphi();
386  float max_dphi = ILC.max_dphi();
387 
388  const float invpt = m_Par[iI].At(itrack, 3, 0);
389  const float theta = std::fabs(m_Par[iI].At(itrack, 5, 0) - Const::PIOver2);
390  getHitSelDynamicWindows(invpt, theta, min_dq, max_dq, min_dphi, max_dphi);
391 
392  const float x = m_Par[iI].constAt(itrack, 0, 0);
393  const float y = m_Par[iI].constAt(itrack, 1, 0);
394  const float r2 = x * x + y * y;
395  const float dphidx = -y / r2, dphidy = x / r2;
396  const float dphi2 = calcdphi2(itrack, dphidx, dphidy);
397 #ifdef HARD_CHECK
398  assert(dphi2 >= 0);
399 #endif
400 
401  const float phi = getPhi(x, y);
402  float dphi = calcdphi(dphi2, min_dphi);
403 
404  const float z = m_Par[iI].constAt(itrack, 2, 0);
405  const float dz = std::abs(nSigmaZ * std::sqrt(m_Err[iI].constAt(itrack, 2, 2)));
406  const float edgeCorr =
407  std::abs(0.5f * (L.layer_info().rout() - L.layer_info().rin()) / std::tan(m_Par[iI].constAt(itrack, 5, 0)));
408  // XXX-NUM-ERR above, m_Err(2,2) gets negative!
409 
410  m_XWsrResult[itrack] = L.is_within_z_sensitive_region(z, std::sqrt(dz * dz + edgeCorr * edgeCorr));
411  assignbins(itrack, z, dz, phi, dphi, min_dq, max_dq, min_dphi, max_dphi);
412 
413  // Relax propagation-fail detection to be in line with pre-43145.
414  if (m_FailFlag[itrack] && std::sqrt(r2) >= L.layer_info().rin()) {
415  m_FailFlag[itrack] = 0;
416  }
417  }
418  } else // endcap
419  {
420  //layer half-thikness for dphi spread calculation; only for very restrictive iters
421  const float layerD = std::abs(L.layer_info().zmax() - L.layer_info().zmin()) * 0.5f *
423  // Pull out the part of the loop that vectorizes with icc and gcc
424 #if !defined(__clang__)
425 #pragma omp simd
426 #endif
427  for (int itrack = 0; itrack < NN; ++itrack) {
428  m_XHitSize[itrack] = 0;
429 
430  float min_dq = ILC.min_dq();
431  float max_dq = ILC.max_dq();
432  float min_dphi = ILC.min_dphi();
433  float max_dphi = ILC.max_dphi();
434 
435  const float invpt = m_Par[iI].At(itrack, 3, 0);
436  const float theta = std::fabs(m_Par[iI].At(itrack, 5, 0) - Const::PIOver2);
437  getHitSelDynamicWindows(invpt, theta, min_dq, max_dq, min_dphi, max_dphi);
438 
439  const float x = m_Par[iI].constAt(itrack, 0, 0);
440  const float y = m_Par[iI].constAt(itrack, 1, 0);
441  const float r2 = x * x + y * y;
442  const float r2Inv = 1.f / r2;
443  const float dphidx = -y * r2Inv, dphidy = x * r2Inv;
444  const float phi = getPhi(x, y);
445  const float dphi2 =
446  calcdphi2(itrack, dphidx, dphidy)
447  //range from finite layer thickness
448  + std::pow(layerD * std::tan(m_Par[iI].At(itrack, 5, 0)) * std::sin(m_Par[iI].At(itrack, 4, 0) - phi), 2) *
449  r2Inv;
450 #ifdef HARD_CHECK
451  assert(dphi2 >= 0);
452 #endif
453 
454  float dphi = calcdphi(dphi2, min_dphi);
455 
456  const float r = std::sqrt(r2);
457  const float dr = nSigmaR * std::sqrt(std::abs(x * x * m_Err[iI].constAt(itrack, 0, 0) +
458  y * y * m_Err[iI].constAt(itrack, 1, 1) +
459  2 * x * y * m_Err[iI].constAt(itrack, 0, 1)) /
460  r2);
461  const float edgeCorr = std::abs(0.5f * (L.layer_info().zmax() - L.layer_info().zmin()) *
462  std::tan(m_Par[iI].constAt(itrack, 5, 0)));
463 
464  m_XWsrResult[itrack] = L.is_within_r_sensitive_region(r, std::sqrt(dr * dr + edgeCorr * edgeCorr));
465  assignbins(itrack, r, dr, phi, dphi, min_dq, max_dq, min_dphi, max_dphi);
466  }
467  }
468 
469 #ifdef RNT_DUMP_MkF_SelHitIdcs
470  if (fill_binsearch_only) {
471  // XXX loop over good indices (prepared in V2) and put in V1 BinSearch results
472  for (auto i : rnt_shi.f_h_idcs) {
473  CandInfo &ci = (*rnt_shi.ci)[rnt_shi.f_h_remap[i]];
474  ci.bso = BinSearch({phiv[i],
475  dphiv[i],
476  qv[i],
477  dqv[i],
478  pb1v[i],
479  pb2v[i],
480  qb1v[i],
481  qb2v[i],
484  false});
485  }
486  return;
487  }
488 #endif
489 
490  // Vectorizing this makes it run slower!
491  //#pragma omp simd
492  for (int itrack = 0; itrack < NN; ++itrack) {
493  if (itrack >= N_proc) {
494  continue;
495  }
496  // PROP-FAIL-ENABLE The following to be enabled when propagation failure
497  // detection is properly implemented in propagate-to-R/Z.
498  if (m_FailFlag[itrack]) {
499  m_XWsrResult[itrack].m_wsr = WSR_Failed;
500  continue;
501  }
502 
503  if (m_XWsrResult[itrack].m_wsr == WSR_Outside) {
504  continue;
505  }
506 
507  const bidx_t qb = qbv[itrack];
508  const bidx_t qb1 = qb1v[itrack];
509  const bidx_t qb2 = qb2v[itrack];
510  const bidx_t pb1 = pb1v[itrack];
511  const bidx_t pb2 = pb2v[itrack];
512 
513  const float q = qv[itrack];
514  const float phi = phiv[itrack];
515  const float dphi = dphiv[itrack];
516  const float dq = dqv[itrack];
517 
518  // clang-format off
519  dprintf(" %2d/%2d: %6.3f %6.3f %6.6f %7.5f %3u %3u %4u %4u\n",
520  L.layer_id(), itrack, q, phi, dq, dphi,
521  qb1, qb2, pb1, pb2);
522  // clang-format on
523 
524 #if defined(DUMPHITWINDOW) && defined(MKFIT_STANDALONE)
525  const auto ngr = [](float f) { return isFinite(f) ? f : -999.0f; };
526 
527  const int seed_lbl = m_event->currentSeed(m_SeedOriginIdx[itrack]).label();
528  Event::SimLabelFromHits slfh = m_event->simLabelForCurrentSeed(m_SeedOriginIdx[itrack]);
529  const int seed_mcid = (slfh.is_set() && slfh.good_frac() > 0.7f) ? slfh.label : -999999;
530 #endif
531 
532  for (bidx_t qi = qb1; qi != qb2; ++qi) {
533  for (bidx_t pi = pb1; pi != pb2; pi = L.phiMaskApply(pi + 1)) {
534  // Limit to central Q-bin
535  if (qi == qb && L.isBinDead(pi, qi) == true) {
536  dprint("dead module for track in layer=" << L.layer_id() << " qb=" << qi << " pi=" << pi << " q=" << q
537  << " phi=" << phi);
538  m_XWsrResult[itrack].m_in_gap = true;
539  }
540 
541  // MT: The following line is the biggest hog (4% total run time).
542  // This comes from cache misses, I presume.
543  // It might make sense to make first loop to extract bin indices
544  // and issue prefetches at the same time.
545  // Then enter vectorized loop to actually collect the hits in proper order.
546 
547  //SK: ~20x1024 bin sizes give mostly 1 hit per bin. Commented out for 128 bins or less
548  // #pragma nounroll
549  auto pbi = L.phiQBinContent(pi, qi);
550  for (bcnt_t hi = pbi.begin(); hi < pbi.end(); ++hi) {
551  // MT: Access into m_hit_zs and m_hit_phis is 1% run-time each.
552 
553  const unsigned int hi_orig = L.getOriginalHitIndex(hi);
554 
555  if (m_iteration_hit_mask && (*m_iteration_hit_mask)[hi_orig]) {
556  dprintf(
557  "Yay, denying masked hit on layer %u, hi %u, orig idx %u\n", L.layer_info().layer_id(), hi, hi_orig);
558  continue;
559  }
560 
561  if (Config::usePhiQArrays) {
562  if (m_XHitSize[itrack] >= MPlexHitIdxMax)
563  break;
564 
565  const float ddq = std::abs(q - L.hit_q(hi));
566  const float ddphi = cdist(std::abs(phi - L.hit_phi(hi)));
567 
568  // clang-format off
569  dprintf(" SHI %3u %4u %5u %6.3f %6.3f %6.4f %7.5f %s\n",
570  qi, pi, hi, L.hit_q(hi), L.hit_phi(hi),
571  ddq, ddphi, (ddq < dq && ddphi < dphi) ? "PASS" : "FAIL");
572  // clang-format on
573 
574 #if defined(DUMPHITWINDOW) && defined(MKFIT_STANDALONE)
575  // clang-format off
576  MPlexQF thisOutChi2;
577  {
578  const MCHitInfo &mchinfo = m_event->simHitsInfo_[L.refHit(hi).mcHitID()];
579  int mchid = mchinfo.mcTrackID();
580  int st_isfindable = 0;
581  int st_label = -999999;
582  int st_prodtype = 0;
583  int st_nhits = -1;
584  int st_charge = 0;
585  float st_r = -999.;
586  float st_z = -999.;
587  float st_pt = -999.;
588  float st_eta = -999.;
589  float st_phi = -999.;
590  if (mchid >= 0) {
591  Track simtrack = m_event->simTracks_[mchid];
592  st_isfindable = (int)simtrack.isFindable();
593  st_label = simtrack.label();
594  st_prodtype = (int)simtrack.prodType();
595  st_pt = simtrack.pT();
596  st_eta = simtrack.momEta();
597  st_phi = simtrack.momPhi();
598  st_nhits = simtrack.nTotalHits();
599  st_charge = simtrack.charge();
600  st_r = simtrack.posR();
601  st_z = simtrack.z();
602  }
603 
604  const Hit &thishit = L.refHit(hi_orig);
605  m_msErr.copyIn(itrack, thishit.errArray());
606  m_msPar.copyIn(itrack, thishit.posArray());
607 
608  MPlexQI propFail;
609  MPlexLV tmpPropPar;
610  const FindingFoos &fnd_foos = FindingFoos::get_finding_foos(L.is_barrel());
611  (*fnd_foos.m_compute_chi2_foo)(m_Err[iI],
612  m_Par[iI],
613  m_Chg,
614  m_msErr,
615  m_msPar,
616  thisOutChi2,
617  tmpPropPar,
618  propFail,
619  N_proc,
622 
623  float hx = thishit.x();
624  float hy = thishit.y();
625  float hz = thishit.z();
626  float hr = std::hypot(hx, hy);
627  float hphi = std::atan2(hy, hx);
628  float hex = ngr( std::sqrt(thishit.exx()) );
629  float hey = ngr( std::sqrt(thishit.eyy()) );
630  float hez = ngr( std::sqrt(thishit.ezz()) );
631  float her = ngr( std::sqrt(
632  (hx * hx * thishit.exx() + hy * hy * thishit.eyy() + 2.0f * hx * hy * m_msErr.At(itrack, 0, 1)) /
633  (hr * hr)) );
634  float hephi = ngr( std::sqrt(thishit.ephi()) );
635  float hchi2 = ngr( thisOutChi2[itrack] );
636  float tx = m_Par[iI].At(itrack, 0, 0);
637  float ty = m_Par[iI].At(itrack, 1, 0);
638  float tz = m_Par[iI].At(itrack, 2, 0);
639  float tr = std::hypot(tx, ty);
640  float tphi = std::atan2(ty, tx);
641  // float tchi2 = ngr( m_Chi2(itrack, 0, 0) ); // unused
642  float tex = ngr( std::sqrt(m_Err[iI].At(itrack, 0, 0)) );
643  float tey = ngr( std::sqrt(m_Err[iI].At(itrack, 1, 1)) );
644  float tez = ngr( std::sqrt(m_Err[iI].At(itrack, 2, 2)) );
645  float ter = ngr( std::sqrt(
646  (tx * tx * tex * tex + ty * ty * tey * tey + 2.0f * tx * ty * m_Err[iI].At(itrack, 0, 1)) /
647  (tr * tr)) );
648  float tephi = ngr( std::sqrt(
649  (ty * ty * tex * tex + tx * tx * tey * tey - 2.0f * tx * ty * m_Err[iI].At(itrack, 0, 1)) /
650  (tr * tr * tr * tr)) );
651  float ht_dxy = std::hypot(hx - tx, hy - ty);
652  float ht_dz = hz - tz;
653  float ht_dphi = cdist(std::abs(hphi - tphi));
654 
655  static bool first = true;
656  if (first) {
657  printf(
658  "HITWINDOWSEL "
659  "evt_id/I:track_algo/I:"
660  "lyr_id/I:lyr_isbrl/I:hit_idx/I:"
661  "trk_cnt/I:trk_idx/I:trk_label/I:"
662  "trk_pt/F:trk_eta/F:trk_mphi/F:trk_chi2/F:"
663  "nhits/I:"
664  "seed_idx/I:seed_label/I:seed_mcid/I:"
665  "hit_mcid/I:"
666  "st_isfindable/I:st_prodtype/I:st_label/I:"
667  "st_pt/F:st_eta/F:st_phi/F:"
668  "st_nhits/I:st_charge/I:st_r/F:st_z/F:"
669  "trk_q/F:hit_q/F:dq_trkhit/F:dq_cut/F:trk_phi/F:hit_phi/F:dphi_trkhit/F:dphi_cut/F:"
670  "t_x/F:t_y/F:t_r/F:t_phi/F:t_z/F:"
671  "t_ex/F:t_ey/F:t_er/F:t_ephi/F:t_ez/F:"
672  "h_x/F:h_y/F:h_r/F:h_phi/F:h_z/F:"
673  "h_ex/F:h_ey/F:h_er/F:h_ephi/F:h_ez/F:"
674  "ht_dxy/F:ht_dz/F:ht_dphi/F:"
675  "h_chi2/F"
676  "\n");
677  first = false;
678  }
679 
680  if (!(std::isnan(phi)) && !(std::isnan(getEta(m_Par[iI].At(itrack, 5, 0))))) {
681  //|| std::isnan(ter) || std::isnan(her) || std::isnan(m_Chi2(itrack, 0, 0)) || std::isnan(hchi2)))
682  printf("HITWINDOWSEL "
683  "%d %d"
684  "%d %d %d "
685  "%d %d %d "
686  "%6.3f %6.3f %6.3f %6.3f "
687  "%d "
688  "%d %d %d "
689  "%d "
690  "%d %d %d "
691  "%6.3f %6.3f %6.3f "
692  "%d %d %6.3f %6.3f "
693  "%6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f "
694  "%6.3f %6.3f %6.3f %6.3f %6.3f "
695  "%6.6f %6.6f %6.6f %6.6f %6.6f "
696  "%6.3f %6.3f %6.3f %6.3f %6.3f "
697  "%6.6f %6.6f %6.6f %6.6f %6.6f "
698  "%6.3f %6.3f %6.3f "
699  "%6.3f"
700  "\n",
702  L.layer_id(), L.is_barrel(), hi_orig,
703  itrack, m_CandIdx(itrack, 0, 0), m_Label(itrack, 0, 0),
704  1.0f / m_Par[iI].At(itrack, 3, 0), getEta(m_Par[iI].At(itrack, 5, 0)), m_Par[iI].At(itrack, 4, 0), m_Chi2(itrack, 0, 0),
705  m_NFoundHits(itrack, 0, 0),
706  m_SeedOriginIdx(itrack, 0, 0), seed_lbl, seed_mcid,
707  mchid,
708  st_isfindable, st_prodtype, st_label,
709  st_pt, st_eta, st_phi,
710  st_nhits, st_charge, st_r, st_z,
711  q, L.hit_q(hi), ddq, dq, phi, L.hit_phi(hi), ddphi, dphi,
712  tx, ty, tr, tphi, tz,
713  tex, tey, ter, tephi, tez,
714  hx, hy, hr, hphi, hz,
715  hex, hey, her, hephi, hez,
716  ht_dxy, ht_dz, ht_dphi,
717  hchi2);
718  }
719  }
720  // clang-format on
721 #endif
722 
723  if (ddq >= dq)
724  continue;
725  if (ddphi >= dphi)
726  continue;
727 
728  // MT: Removing extra check gives full efficiency ...
729  // and means our error estimations are wrong!
730  // Avi says we should have *minimal* search windows per layer.
731  // Also ... if bins are sufficiently small, we do not need the extra
732  // checks, see above.
733  m_XHitArr.At(itrack, m_XHitSize[itrack]++, 0) = hi_orig;
734  } else {
735  // MT: The following check alone makes more sense with spiral traversal,
736  // we'd be taking in closest hits first.
737 
738  // Hmmh -- there used to be some more checks here.
739  // Or, at least, the phi binning was much smaller and no further checks were done.
740  assert(false && "this code has not been used in a while -- see comments in code");
741 
742  if (m_XHitSize[itrack] < MPlexHitIdxMax) {
743  m_XHitArr.At(itrack, m_XHitSize[itrack]++, 0) = hi_orig;
744  }
745  }
746  } //hi
747  } //pi
748  } //qi
749  } //itrack
750  }
def isnan(num)
MPlexQI m_Chg
Definition: MkBase.h:103
static constexpr int MPlexHitIdxMax
Definition: MkFinder.h:42
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
Definition: Matriplex.h:436
double z
global z - AlignmentGeometry::z0, mm
Definition: HitCollection.h:27
MPlexQI m_NFoundHits
Definition: MkFinder.h:295
const IterationLayerConfig * m_iteration_layer_config
Definition: MkFinder.h:339
static constexpr int iP
Definition: MkBase.h:19
const Event * m_event
Definition: MkFinder.h:342
for(int i=first, nt=offsets[nh];i< nt;i+=gridDim.x *blockDim.x)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexQI m_FailFlag
Definition: MkBase.h:104
int label() const
Definition: Track.h:174
int evtID() const
Definition: Event.h:23
const IterationConfig * m_iteration_config
Definition: MkFinder.h:337
constexpr float PIOver2
Definition: Config.h:9
Matriplex::Matriplex< float, LL, 1, NN > MPlexLV
Definition: Matrix.h:49
float getEta(float r, float z)
Definition: Hit.h:38
assert(be >=bs)
float float float z
const IterationParams * m_iteration_params
Definition: MkFinder.h:338
MPlexLS m_Err[2]
Definition: MkBase.h:101
const Double_t pi
constexpr bool usePhiQArrays
Definition: Config.h:71
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
Definition: EPCuts.h:4
tex
Definition: cuy.py:773
T sqrt(T t)
Definition: SSEVec.h:19
constexpr Matriplex::idx_t NN
Definition: Matrix.h:43
unsigned int bin_content_t
Definition: HitStructures.h:27
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
MPlexQI m_XHitSize
Definition: MkFinder.h:322
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MPlexHV m_msPar
Definition: MkFinder.h:327
double f[11][100]
MPlexQI m_SeedOriginIdx
Definition: MkFinder.h:301
MCHitInfoVec simHitsInfo_
Definition: Event.h:72
constexpr float nSigmaPhi
BinSearch bso
Definition: RntStructs.h:103
float cdist(float a)
Definition: Config.h:32
MPlexHS m_msErr
Definition: MkFinder.h:326
Matriplex::Matriplex< int, 1, 1, NN > MPlexQI
Definition: Matrix.h:72
TrackVec simTracks_
Definition: Event.h:74
SimLabelFromHits simLabelForCurrentSeed(int i) const
Definition: Event.cc:875
Matriplex::Matriplex< float, 1, 1, NN > MPlexQF
Definition: Matrix.h:71
WithinSensitiveRegion_e m_wsr
Definition: TrackerInfo.h:21
static const FindingFoos & get_finding_foos(bool is_barrel)
Definition: FindingFoos.cc:18
float getPhi(float x, float y)
Definition: Hit.h:34
const Track & currentSeed(int i) const
Definition: Event.cc:873
MPlexHitIdx m_XHitArr
Definition: MkFinder.h:323
#define dprint(x)
Definition: Debug.h:95
MPlexQF m_Chi2
Definition: MkFinder.h:291
MPlexQI m_CandIdx
Definition: MkFinder.h:300
float x
const std::vector< bool > * m_iteration_hit_mask
Definition: MkFinder.h:341
PropagationFlags finding_intra_layer_pflags
unsigned short bin_index_t
Definition: HitStructures.h:26
WSR_Result m_XWsrResult[NN]
Definition: MkFinder.h:321
void getHitSelDynamicWindows(const float invpt, const float theta, float &min_dq, float &max_dq, float &min_dphi, float &max_dphi)
Definition: MkFinder.cc:262
Geom::Theta< T > theta() const
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
#define dprintf(...)
Definition: Debug.h:98
MPlexQI m_Label
Definition: MkFinder.h:292
constexpr bool isFinite(float x)

◆ selectHitIndicesV2()

void mkfit::MkFinder::selectHitIndicesV2 ( const LayerOfHits layer_of_hits,
const int  N_proc 
)

Definition at line 756 of file MkFinder.cc.

References a, funct::abs(), B, b, CandInfo::bsn, mkfit::cdist(), chg, ALPAKA_ACCELERATOR_NAMESPACE::brokenline::constexpr(), Calorimetry_cff::dp, CandInfo::dphi_first_match, dprint, dprintf, CandInfo::dq_first_match, submitPVResolutionJobs::err, mkfit::Hit::errArray(), f, mkfit::mini_propagators::fast_atan2(), mkfit::PropagationConfig::finding_intra_layer_pflags, mkfit::PropagationConfig::finding_requires_propagation_to_hit_pos, cms::cuda::for(), mkfit::FindingFoos::get_finding_foos(), mkfit::hit2pos(), CandInfo::hmi, Matriplex::hypot(), mps_fire::i, heavyIonCSV_trainingSettings::idx, cuy::ii, createfilelist::int, mkfit::MkBase::iP, mkfit::LayerInfo::is_barrel(), dttmaxenums::L, mkfit::Event::SimLabelFromHits::label, mkfit::MkBase::m_Chg, mkfit::FindingFoos::m_compute_chi2_foo, mkfit::MkBase::m_Err, m_event, mkfit::MkBase::m_FailFlag, mkfit::WSR_Result::m_in_gap, m_iteration_hit_mask, m_msErr, m_msPar, mkfit::MkBase::m_Par, m_prop_config, m_SeedOriginIdx, mkfit::WSR_Result::m_wsr, m_XHitArr, m_XHitSize, m_XWsrResult, muonTagProbeFilters_cff::matched, Matriplex::min_max(), CandInfo::n_all_hits, CandInfo::n_hits_match, CandInfo::n_hits_pass, CandInfo::n_hits_pass_match, mkfit::NN, np, CandInfo::ord_first_match, LaserDQM_cfg::p1, SiStripOfflineCRack_cfg::p2, mkfit::mini_propagators::PA_Exact, mkfit::LayerOfHits::phiBinChecked(), mkfit::Const::PI, pi, TrackingDataMCValidation_Standalone_cff::pmin, mkfit::Hit::posArray(), CandInfo::ps_max, CandInfo::ps_min, SiStripMonitorCluster_cfi::q0, mkfit::LayerInfo::q_bin(), mkfit::LayerOfHits::qBinChecked(), mkfit::LayerInfo::rin(), mkfit::LayerInfo::rout(), offlineSlimmedPrimaryVertices_cfi::score, selectHitIndices(), mkfit::Event::simHitsInfo_, mkfit::Event::simLabelForCurrentSeed(), jetUpdater_cfi::sort, mathSSE::sqrt(), Matriplex::sqrt(), mkfit::state2mom(), mkfit::state2pos(), mkfit::statep2propstate(), edm::swap(), mkfit::Const::TwoPI, mkfit::WSR_Failed, mkfit::WSR_Outside, x, mkfit::LayerInfo::zmax(), and mkfit::LayerInfo::zmin().

Referenced by mkfit::MkBuilder::find_tracks_in_layers().

756  {
757  // bool debug = true;
758  using bidx_t = LayerOfHits::bin_index_t;
759  using bcnt_t = LayerOfHits::bin_content_t;
760  const LayerOfHits &L = layer_of_hits;
761  const LayerInfo &LI = L.layer_info();
762 
763  const int iI = iP;
764 
765  dprintf("LayerOfHits::SelectHitIndicesV2 %s layer=%d N_proc=%d\n",
766  L.is_barrel() ? "barrel" : "endcap",
767  L.layer_id(),
768  N_proc);
769 
770 #ifdef RNT_DUMP_MkF_SelHitIdcs
771  rnt_shi.InnerIdcsReset(N_proc);
772  Event::SimLabelFromHits sim_lbls[NN];
773  for (int i = 0; i < N_proc; ++i) {
775  if (m_FailFlag[i]) {
776  rnt_shi.RegisterFailedProp(i, m_Par[1 - iI], m_Par[iI], m_event, m_SeedOriginIdx[i]);
777  } else if (sim_lbls[i].is_set()) {
778  CandInfo &ci = rnt_shi.RegisterGoodProp(i, m_Par[iI], m_event, m_SeedOriginIdx[i]);
779  ci.ic2list.reset(); // zero initialize
780  } // else ... could do something about the bad seeds ... probably better to collect elsewhere.
781  }
782  // Get BinSearch result from V1. Note -- it can clear m_FailFlag for some cands!
783  auto ff_stash = m_FailFlag;
784  selectHitIndices(layer_of_hits, N_proc, true);
785  m_FailFlag = ff_stash;
786 #endif
787 
788  constexpr int NEW_MAX_HIT = 6; // 4 - 6 give about the same # of tracks in quality-val
789  constexpr float DDPHI_PRESEL_FAC = 2.0f;
790  constexpr float DDQ_PRESEL_FAC = 1.2f;
791  constexpr float PHI_BIN_EXTRA_FAC = 2.75f;
792  constexpr float Q_BIN_EXTRA_FAC = 1.6f;
793 
794  namespace mp = mini_propagators;
795  struct Bins {
796  MPlexQUH q0, q1, q2, p1, p2;
797  mp::InitialStatePlex isp;
798  mp::StatePlex sp1, sp2;
799  int n_proc;
800 
801  MPlexQF dphi_track, dq_track; // 3 sigma track errors at initial state
802 
803  // debug & ntuple dump -- to be local in functions
804  MPlexQF phi_c, dphi;
805  MPlexQF q_c, qmin, qmax;
806 
807  Bins(const MPlexLV &par, const MPlexQI &chg, int np = NN) : isp(par, chg), n_proc(np) {}
808 
809  void prop_to_limits(const LayerInfo &li) {
810  // Positions 1 and 2 should really be by "propagation order", 1 is the closest/
811  // This should also work for backward propagation so not exactly trivial.
812  // Also, do not really need propagation to center.
813  if (li.is_barrel()) {
814  isp.propagate_to_r(mp::PA_Exact, li.rin(), sp1, true, n_proc);
815  isp.propagate_to_r(mp::PA_Exact, li.rout(), sp2, true, n_proc);
816  } else {
817  isp.propagate_to_z(mp::PA_Exact, li.zmin(), sp1, true, n_proc);
818  isp.propagate_to_z(mp::PA_Exact, li.zmax(), sp2, true, n_proc);
819  }
820  }
821 
822  void find_bin_ranges(const LayerInfo &li, const LayerOfHits &loh, const MPlexLS &err) {
823  // Below made members for debugging
824  // MPlexQF phi_c, dphi_min, dphi_max;
825  // phi_c = mp::fast_atan2(isp.y, isp.x); // calculated below as difference
826 
827  // Matriplex::min_max(sp1.dphi, sp2.dphi, dphi_min, dphi_max);
828  // the above is wrong: dalpha is not dphi --> renamed variable in State
829  MPlexQF xp1, xp2, pmin, pmax;
830  xp1 = mp::fast_atan2(sp1.y, sp1.x);
831  xp2 = mp::fast_atan2(sp2.y, sp2.x);
832  Matriplex::min_max(xp1, xp2, pmin, pmax);
833  // Matriplex::min_max(mp::fast_atan2(sp1.y, sp1.x), smp::fast_atan2(sp2.y, sp2.x), pmin, pmax);
834  MPlexQF dp = pmax - pmin;
835  phi_c = 0.5f * (pmax + pmin);
836  for (int ii = 0; ii < NN; ++ii) {
837  if (ii < n_proc) {
838  if (dp[ii] > Const::PI) {
839  std::swap(pmax[ii], pmin[ii]);
840  dp[ii] = Const::TwoPI - dp[ii];
841  phi_c[ii] = Const::PI - phi_c[ii];
842  }
843  dphi[ii] = 0.5f * dp[ii];
844  // printf("phic: %f p1: %f p2: %f pmin: %f pmax: %f dphi: %f\n",
845  // phi_c[ii], xp1[ii], xp2[ii], pmin[ii], pmax[ii], dphi[ii]);
846  }
847  }
848 
849  const auto calc_err_xy = [&](const MPlexQF &x, const MPlexQF &y) {
850  return x * x * err.ReduceFixedIJ(0, 0) + y * y * err.ReduceFixedIJ(1, 1) +
851  2.0f * x * y * err.ReduceFixedIJ(0, 1);
852  };
853 
854  // Calculate dphi_track, dq_track differs for barrel/endcap
855  MPlexQF r2_c = isp.x * isp.x + isp.y * isp.y;
856  MPlexQF r2inv_c = 1.0f / r2_c;
857  MPlexQF dphidx_c = -isp.y * r2inv_c;
858  MPlexQF dphidy_c = isp.x * r2inv_c;
859  dphi_track = 3.0f * calc_err_xy(dphidx_c, dphidy_c).abs().sqrt();
860 
861  // MPlexQF qmin, qmax;
862  if (li.is_barrel()) {
863  Matriplex::min_max(sp1.z, sp2.z, qmin, qmax);
864  q_c = isp.z;
865  dq_track = 3.0f * err.ReduceFixedIJ(2, 2).abs().sqrt();
866  } else {
867  Matriplex::min_max(Matriplex::hypot(sp1.x, sp1.y), Matriplex::hypot(sp2.x, sp2.y), qmin, qmax);
868  q_c = Matriplex::sqrt(r2_c);
869  dq_track = 3.0f * (r2inv_c * calc_err_xy(isp.x, isp.y).abs()).sqrt();
870  }
871 
872  for (int i = 0; i < p1.kTotSize; ++i) {
873  // Clamp crazy sizes. This actually only happens when prop-fail flag is set.
874  // const float dphi_clamp = 0.1;
875  // if (dphi_min[i] > 0.0f || dphi_min[i] < -dphi_clamp) dphi_min[i] = -dphi_clamp;
876  // if (dphi_max[i] < 0.0f || dphi_max[i] > dphi_clampf) dphi_max[i] = dphi_clamp;
877  p1[i] = loh.phiBinChecked(pmin[i] - dphi_track[i] - PHI_BIN_EXTRA_FAC * 0.0123f);
878  p2[i] = loh.phiBinChecked(pmax[i] + dphi_track[i] + PHI_BIN_EXTRA_FAC * 0.0123f);
879 
880  q0[i] = loh.qBinChecked(q_c[i]);
881  q1[i] = loh.qBinChecked(qmin[i] - dq_track[i] - Q_BIN_EXTRA_FAC * 0.5f * li.q_bin());
882  q2[i] = loh.qBinChecked(qmax[i] + dq_track[i] + Q_BIN_EXTRA_FAC * 0.5f * li.q_bin()) + 1;
883  }
884  }
885  };
886 
887  Bins B(m_Par[iI], m_Chg, N_proc);
888  B.prop_to_limits(LI);
889  B.find_bin_ranges(LI, L, m_Err[iI]);
890 
891  for (int i = 0; i < NN; ++i) {
892  if (i < N_proc) {
893  m_XHitSize[i] = 0;
894  // Notify failure. Ideally should be detected before selectHitIndices().
895  if (m_FailFlag[i]) {
897  } else {
898  if (LI.is_barrel()) {
899  m_XWsrResult[i] = L.is_within_z_sensitive_region(B.q_c[i], 0.5f * (B.q2[i] - B.q1[i]));
900  } else {
901  m_XWsrResult[i] = L.is_within_r_sensitive_region(B.q_c[i], 0.5f * (B.q2[i] - B.q1[i]));
902  }
903  }
904  }
905  }
906 
907  // for (int i = 0; i < N_proc; ++i) {
908  // printf("BinCheck %c %+8.6f %+8.6f | %3d %3d - %3d %3d || | %2d %2d - %2d %2d\n", LI.is_barrel() ? 'B' : 'E',
909  // B.phi[i], B.dphi[i], B.p1[i], B.p2[i], pb1v[i], pb2v[i],
910  // B.q[i], B.dq[i], B.q1[i], B.q2[i], qb1v[i], qb2v[i]);
911  // }
912 
913 #ifdef RNT_DUMP_MkF_SelHitIdcs
914  for (auto i : rnt_shi.f_h_idcs) {
915  CandInfo &ci = (*rnt_shi.ci)[rnt_shi.f_h_remap[i]];
916  ci.bsn = BinSearch({B.phi_c[i],
917  B.dphi[i],
918  B.q_c[i],
919  0.5f * (B.q2[i] - B.q1[i]),
920  B.p1[i],
921  B.p2[i],
922  B.q1[i],
923  B.q2[i],
926  false});
927  ci.ps_min = statep2propstate(B.sp1, i);
928  ci.ps_max = statep2propstate(B.sp2, i);
929  }
930 #endif
931 
932  struct PQE {
933  float score;
934  unsigned int hit_index;
935  };
936  auto pqe_cmp = [](const PQE &a, const PQE &b) { return a.score < b.score; };
937  std::priority_queue<PQE, std::vector<PQE>, decltype(pqe_cmp)> pqueue(pqe_cmp);
938  int pqueue_size = 0;
939 
940  // Vectorizing this makes it run slower!
941  //#pragma omp simd
942  for (int itrack = 0; itrack < NN; ++itrack) {
943  if (itrack >= N_proc) {
944  continue;
945  }
946 
947  if (m_FailFlag[itrack]) {
948  m_XWsrResult[itrack].m_wsr = WSR_Failed;
949  continue;
950  }
951 
952  if (m_XWsrResult[itrack].m_wsr == WSR_Outside) {
953  continue;
954  }
955 
956  // New binning -- known to be too restrictive, so scaled up. Probably esp. in stereo layers.
957  // Also, could take track covariance dphi / dq extras + known tilt stuff.
958  const bidx_t qb = B.q0[itrack];
959  const bidx_t qb1 = B.q1[itrack];
960  const bidx_t qb2 = B.q2[itrack];
961  const bidx_t pb1 = B.p1[itrack];
962  const bidx_t pb2 = B.p2[itrack];
963 
964  // clang-format off
965  dprintf(" %2d/%2d: %6.3f %6.3f %6.6f %7.5f %3u %3u %4u %4u\n",
966  L.layer_id(), itrack, B.q_c[itrack], B.phi_c[itrack],
967  B.qmax[itrack] - B.qmin[itrack], B.dphi[itrack],
968  qb1, qb2, pb1, pb2);
969 #ifdef RNT_DUMP_MkF_SelHitIdcs
970  int hit_out_idx = 0;
971  // phi-sorted position of matched hits
972  struct pos_match { float dphi, dq; int idx; bool matched; };
973  std::vector<pos_match> pos_match_vec;
974 #endif
975  // clang-format on
976 
977  mp::InitialState mp_is(m_Par[iI], m_Chg, itrack);
978  mp::State mp_s;
979 
980  for (bidx_t qi = qb1; qi != qb2; ++qi) {
981  for (bidx_t pi = pb1; pi != pb2; pi = L.phiMaskApply(pi + 1)) {
982  // Limit to central Q-bin
983  if (qi == qb && L.isBinDead(pi, qi) == true) {
984  dprint("dead module for track in layer=" << L.layer_id() << " qb=" << qi << " pi=" << pi
985  << " q=" << B.q_c[itrack] << " phi=" << B.phi_c[itrack]);
986  m_XWsrResult[itrack].m_in_gap = true;
987  }
988 
989  // It might make sense to make first loop to extract bin indices
990  // and issue prefetches at the same time.
991  // Then enter vectorized loop to actually collect the hits in proper order.
992 
993  //SK: ~20x1024 bin sizes give mostly 1 hit per bin. Commented out for 128 bins or less
994  // #pragma nounroll
995  auto pbi = L.phiQBinContent(pi, qi);
996  for (bcnt_t hi = pbi.begin(); hi < pbi.end(); ++hi) {
997  // MT: Access into m_hit_zs and m_hit_phis is 1% run-time each.
998 
999  const unsigned int hi_orig = L.getOriginalHitIndex(hi);
1000 
1001  if (m_iteration_hit_mask && (*m_iteration_hit_mask)[hi_orig]) {
1002  dprintf(
1003  "Yay, denying masked hit on layer %u, hi %u, orig idx %u\n", L.layer_info().layer_id(), hi, hi_orig);
1004  continue;
1005  }
1006 
1007  float new_q, new_phi, new_ddphi, new_ddq;
1008  bool prop_fail;
1009 
1010  if (L.is_barrel()) {
1011  prop_fail = mp_is.propagate_to_r(mp::PA_Exact, L.hit_qbar(hi), mp_s, true);
1012  new_q = mp_s.z;
1013  } else {
1014  prop_fail = mp_is.propagate_to_z(mp::PA_Exact, L.hit_qbar(hi), mp_s, true);
1015  new_q = std::hypot(mp_s.x, mp_s.y);
1016  }
1017 
1018  new_phi = vdt::fast_atan2f(mp_s.y, mp_s.x);
1019  new_ddphi = cdist(std::abs(new_phi - L.hit_phi(hi)));
1020  new_ddq = std::abs(new_q - L.hit_q(hi));
1021 
1022  bool dqdphi_presel = new_ddq < B.dq_track[itrack] + DDQ_PRESEL_FAC * L.hit_q_half_length(hi) &&
1023  new_ddphi < B.dphi_track[itrack] + DDPHI_PRESEL_FAC * 0.0123f;
1024 
1025  // clang-format off
1026  dprintf(" SHI %3u %4u %5u %6.3f %6.3f %6.4f %7.5f PROP-%s %s\n",
1027  qi, pi, hi, L.hit_q(hi), L.hit_phi(hi),
1028  new_ddq, new_ddphi, prop_fail ? "FAIL" : "OK", dqdphi_presel ? "PASS" : "REJECT");
1029 #ifdef RNT_DUMP_MkF_SelHitIdcs
1030  if (rnt_shi.f_h_remap[itrack] >= 0) {
1031  int sim_lbl = sim_lbls[itrack].label;
1032  const Hit &thishit = L.refHit(hi_orig);
1033  m_msErr.copyIn(itrack, thishit.errArray());
1034  m_msPar.copyIn(itrack, thishit.posArray());
1035 
1036  MPlexQF thisOutChi2;
1037  MPlexQI propFail(0);
1038  MPlexLV tmpPropPar;
1039  const FindingFoos &fnd_foos = FindingFoos::get_finding_foos(L.is_barrel());
1040  (*fnd_foos.m_compute_chi2_foo)(
1041  m_Err[iI], m_Par[iI], m_Chg, m_msErr, m_msPar,
1042  thisOutChi2, tmpPropPar, propFail, N_proc,
1045  float hchi2 = thisOutChi2[itrack];
1046 
1047  CandInfo &ci = (*rnt_shi.ci)[rnt_shi.f_h_remap[itrack]];
1048 
1049  const MCHitInfo &mchinfo = m_event->simHitsInfo_[L.refHit(hi_orig).mcHitID()];
1050  int hit_lbl = mchinfo.mcTrackID();
1051  ci.hmi.emplace_back(HitMatchInfo{ HitInfo
1052  { hit2pos(thishit),
1053  new_q, L.hit_q_half_length(hi), L.hit_qbar(hi), new_phi,
1054  hit_lbl },
1055  state2pos(mp_s), state2mom(mp_s),
1056  new_ddq, new_ddphi, hchi2, (int) hi_orig,
1057  (sim_lbl == hit_lbl), dqdphi_presel, !prop_fail
1058  });
1059 
1060  bool new_dec = dqdphi_presel && !prop_fail;
1061  ++ci.n_all_hits;
1062  if (sim_lbl == hit_lbl) {
1063  ++ci.n_hits_match;
1064  if (new_dec) ++ci.n_hits_pass_match;
1065  }
1066  if (new_dec) ++ci.n_hits_pass;
1067  if (new_dec)
1068  pos_match_vec.emplace_back(pos_match{ new_ddphi, new_ddq, hit_out_idx++,
1069  sim_lbl == hit_lbl });
1070  } // if cand is saved
1071 #endif
1072  // clang-format on
1073 
1074  if (prop_fail || !dqdphi_presel)
1075  continue;
1076  if (pqueue_size < NEW_MAX_HIT) {
1077  pqueue.push({new_ddphi, hi_orig});
1078  ++pqueue_size;
1079  } else if (new_ddphi < pqueue.top().score) {
1080  pqueue.pop();
1081  pqueue.push({new_ddphi, hi_orig});
1082  }
1083  } //hi
1084  } //pi
1085  } //qi
1086 
1087  dprintf(" PQUEUE (%d)", pqueue_size);
1088 #ifdef RNT_DUMP_MkF_SelHitIdcs
1089  // clang-format off
1090  if (sim_lbls[itrack].is_set()) {
1091  // Find ord number of matched hits.
1092  std::sort(pos_match_vec.begin(), pos_match_vec.end(),
1093  [](auto &a, auto &b){return a.dphi < b.dphi;});
1094  int pmvs = pos_match_vec.size();
1095 
1096  CandInfo &ci = (*rnt_shi.ci)[rnt_shi.f_h_remap[itrack]];
1097  for (int i = 0; i < pmvs; ++i) {
1098  if (pos_match_vec[i].matched) {
1099  ci.ord_first_match = i;
1100  ci.dphi_first_match = pos_match_vec[i].dphi;
1101  ci.dq_first_match = pos_match_vec[i].dq;
1102  break;
1103  }
1104  }
1105  }
1106  // clang-format off
1107 #endif
1108  // Reverse hits so best dphis/scores come first in the hit-index list.
1109  m_XHitSize[itrack] = pqueue_size;
1110  while (pqueue_size) {
1111  --pqueue_size;
1112  m_XHitArr.At(itrack, pqueue_size, 0) = pqueue.top().hit_index;
1113  dprintf(" %d: %f %d", pqueue_size, pqueue.top().score, pqueue.top().hit_index);
1114  pqueue.pop();
1115  }
1116  dprintf("\n");
1117 
1118  } //itrack
1119  }
int n_hits_match
Definition: RntStructs.h:106
MPlexQI m_Chg
Definition: MkBase.h:103
MPlex< T, D1, D2, N > hypot(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b)
Definition: Matriplex.h:436
Definition: APVGainStruct.h:7
float dq_first_match
Definition: RntStructs.h:108
static constexpr int iP
Definition: MkBase.h:19
PropState ps_min
Definition: RntStructs.h:102
const float chg[109]
Definition: CoreSimTrack.cc:5
const Event * m_event
Definition: MkFinder.h:342
for(int i=first, nt=offsets[nh];i< nt;i+=gridDim.x *blockDim.x)
RVec state2mom(const miprops::State &s)
Matriplex::Matriplex< unsigned short, 1, 1, NN > MPlexQUH
Definition: Matrix.h:75
int n_hits_pass_match
Definition: RntStructs.h:106
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexQI m_FailFlag
Definition: MkBase.h:104
void selectHitIndices(const LayerOfHits &layer_of_hits, const int N_proc, bool fill_binsearch_only=false)
Definition: MkFinder.cc:316
PropState statep2propstate(const miprops::StatePlex &s, int i)
int n_hits_pass
Definition: RntStructs.h:106
Matriplex::Matriplex< float, LL, 1, NN > MPlexLV
Definition: Matrix.h:49
constexpr float TwoPI
Definition: Config.h:8
int ord_first_match
Definition: RntStructs.h:107
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:112
MPlexLS m_Err[2]
Definition: MkBase.h:101
const Double_t pi
RVec state2pos(const miprops::State &s)
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
int np
Definition: AMPTWrapper.h:43
constexpr float PI
Definition: Config.h:7
Definition: EPCuts.h:4
RVec hit2pos(const Hit &h)
T sqrt(T t)
Definition: SSEVec.h:19
constexpr Matriplex::idx_t NN
Definition: Matrix.h:43
unsigned int bin_content_t
Definition: HitStructures.h:27
PropState ps_max
Definition: RntStructs.h:102
MPlexQI m_XHitSize
Definition: MkFinder.h:322
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MPlexHV m_msPar
Definition: MkFinder.h:327
double f[11][100]
void min_max(const MPlex< T, D1, D2, N > &a, const MPlex< T, D1, D2, N > &b, MPlex< T, D1, D2, N > &min, MPlex< T, D1, D2, N > &max)
Definition: Matriplex.h:468
MPlexQI m_SeedOriginIdx
Definition: MkFinder.h:301
int n_all_hits
Definition: RntStructs.h:106
MCHitInfoVec simHitsInfo_
Definition: Event.h:72
float cdist(float a)
Definition: Config.h:32
MPlexHS m_msErr
Definition: MkFinder.h:326
Matriplex::Matriplex< int, 1, 1, NN > MPlexQI
Definition: Matrix.h:72
ii
Definition: cuy.py:589
SimLabelFromHits simLabelForCurrentSeed(int i) const
Definition: Event.cc:875
Matriplex::Matriplex< float, 1, 1, NN > MPlexQF
Definition: Matrix.h:71
WithinSensitiveRegion_e m_wsr
Definition: TrackerInfo.h:21
static const FindingFoos & get_finding_foos(bool is_barrel)
Definition: FindingFoos.cc:18
double b
Definition: hdecay.h:120
MPlexHitIdx m_XHitArr
Definition: MkFinder.h:323
#define dprint(x)
Definition: Debug.h:95
std::vector< HitMatchInfo > hmi
Definition: RntStructs.h:105
double a
Definition: hdecay.h:121
Matriplex::MatriplexSym< float, LL, NN > MPlexLS
Definition: Matrix.h:50
float x
const std::vector< bool > * m_iteration_hit_mask
Definition: MkFinder.h:341
PropagationFlags finding_intra_layer_pflags
BinSearch bsn
Definition: RntStructs.h:104
MPF fast_atan2(const MPF &y, const MPF &x)
unsigned short bin_index_t
Definition: HitStructures.h:26
float dphi_first_match
Definition: RntStructs.h:108
WSR_Result m_XWsrResult[NN]
Definition: MkFinder.h:321
#define dprintf(...)
Definition: Debug.h:98
MPlex< T, D1, D2, N > sqrt(const MPlex< T, D1, D2, N > &a)
Definition: Matriplex.h:424

◆ setup()

void mkfit::MkFinder::setup ( const PropagationConfig pc,
const IterationConfig ic,
const IterationParams ip,
const IterationLayerConfig ilc,
const SteeringParams sp,
const std::vector< bool > *  ihm,
const Event ev,
int  region,
bool  infwd 
)

Definition at line 30 of file MkFinder.cc.

References makeMEIFBenchmarkPlots::ev, m_current_region, m_event, m_in_fwd, m_iteration_config, m_iteration_hit_mask, m_iteration_layer_config, m_iteration_params, m_prop_config, m_steering_params, and nano_mu_digi_cff::region.

Referenced by mkfit::MkBuilder::find_tracks_in_layers().

38  {
39  m_prop_config = &pc;
40  m_iteration_config = &ic;
41  m_iteration_params = &ip;
43  m_steering_params = &sp;
45  m_event = ev;
47  m_in_fwd = infwd;
48  }
const IterationLayerConfig * m_iteration_layer_config
Definition: MkFinder.h:339
const Event * m_event
Definition: MkFinder.h:342
const IterationConfig * m_iteration_config
Definition: MkFinder.h:337
const IterationParams * m_iteration_params
Definition: MkFinder.h:338
int m_current_region
Definition: MkFinder.h:343
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
const SteeringParams * m_steering_params
Definition: MkFinder.h:340
const std::vector< bool > * m_iteration_hit_mask
Definition: MkFinder.h:341

◆ setup_bkfit()

void mkfit::MkFinder::setup_bkfit ( const PropagationConfig pc,
const SteeringParams sp,
const Event ev 
)

Definition at line 50 of file MkFinder.cc.

References makeMEIFBenchmarkPlots::ev, m_event, m_prop_config, and m_steering_params.

Referenced by mkfit::MkBuilder::fit_cands(), and mkfit::MkBuilder::fit_cands_BH().

50  {
51  m_prop_config = &pc;
52  m_steering_params = &sp;
53  m_event = ev;
54  }
const Event * m_event
Definition: MkFinder.h:342
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
const SteeringParams * m_steering_params
Definition: MkFinder.h:340

◆ updateWithLoadedHit()

void mkfit::MkFinder::updateWithLoadedHit ( int  N_proc,
const LayerOfHits layer_of_hits,
const FindingFoos fnd_foos 
)

Definition at line 1837 of file MkFinder.cc.

References mkfit::MkBase::clearFailFlag(), ALPAKA_ACCELERATOR_NAMESPACE::brokenline::constexpr(), DeadROC_duringRun::dir, mkfit::PropagationConfig::finding_inter_layer_pflags, mkfit::PropagationConfig::finding_requires_propagation_to_hit_pos, mkfit::MkBase::iC, mkfit::MkBase::iP, mkfit::kalmanPropagateAndUpdatePlane(), mkfit::MkBase::m_Chg, mkfit::MkBase::m_Err, mkfit::MkBase::m_FailFlag, m_msErr, m_msPar, mkfit::MkBase::m_Par, m_prop_config, mkfit::FindingFoos::m_update_param_foo, packModuleNormDir(), and mkfit::Config::usePropToPlane.

Referenced by mkfit::MkBuilder::find_tracks_in_layers().

1837  {
1838  // See comment in MkBuilder::find_tracks_in_layer() about intra / inter flags used here
1839  // for propagation to the hit.
1840  clearFailFlag();
1842  MPlexHV norm, dir;
1843  packModuleNormDir(layer_of_hits, 0, norm, dir, N_proc);
1845  m_Par[iP],
1846  m_Chg,
1847  m_msErr,
1848  m_msPar,
1849  norm,
1850  dir,
1851  m_Err[iC],
1852  m_Par[iC],
1853  m_FailFlag,
1854  N_proc,
1857  } else {
1858  (*fnd_foos.m_update_param_foo)(m_Err[iP],
1859  m_Par[iP],
1860  m_Chg,
1861  m_msErr,
1862  m_msPar,
1863  m_Err[iC],
1864  m_Par[iC],
1865  m_FailFlag,
1866  N_proc,
1869  }
1870 
1871  // PROP-FAIL-ENABLE The following to be enabled when propagation failure
1872  // detection is properly implemented in propagate-to-R/Z.
1873  // for (int i = 0; i < N_proc; ++i) {
1874  // if (m_FailFlag[i]) {
1875  // dprintf("MkFinder::updateWithLoadedHit fail in update, recovering.\n");
1876  // m_Err[iC].copySlot(i, m_Err[iP]);
1877  // m_Par[iC].copySlot(i, m_Par[iP]);
1878  // }
1879  // }
1880  }
MPlexQI m_Chg
Definition: MkBase.h:103
static constexpr int iC
Definition: MkBase.h:18
static constexpr int iP
Definition: MkBase.h:19
void packModuleNormDir(const LayerOfHits &layer_of_hits, int hit_cnt, MPlexHV &norm, MPlexHV &dir, int N_proc) const
Definition: MkFinder.cc:240
Matriplex::Matriplex< float, HH, 1, NN > MPlexHV
Definition: Matrix.h:53
MPlexLV m_Par[2]
Definition: MkBase.h:102
MPlexQI m_FailFlag
Definition: MkBase.h:104
MPlexLS m_Err[2]
Definition: MkBase.h:101
PropagationFlags finding_inter_layer_pflags
const PropagationConfig * m_prop_config
Definition: MkFinder.h:336
void kalmanPropagateAndUpdatePlane(const MPlexLS &psErr, const MPlexLV &psPar, MPlexQI &Chg, const MPlexHS &msErr, const MPlexHV &msPar, const MPlexHV &plNrm, const MPlexHV &plDir, MPlexLS &outErr, MPlexLV &outPar, MPlexQI &outFailFlag, const int N_proc, const PropagationFlags &propFlags, const bool propToHit)
MPlexHV m_msPar
Definition: MkFinder.h:327
void clearFailFlag()
Definition: MkBase.h:96
MPlexHS m_msErr
Definition: MkFinder.h:326
constexpr bool usePropToPlane
Definition: Config.h:51

Friends And Related Function Documentation

◆ MkBuilder

friend class MkBuilder
friend

Definition at line 39 of file MkFinder.h.

Member Data Documentation

◆ m_CandIdx

MPlexQI mkfit::MkFinder::m_CandIdx
private

◆ m_Chi2

MPlexQF mkfit::MkFinder::m_Chi2
private

◆ m_CombCand

CombCandidate* mkfit::MkFinder::m_CombCand[NN]
private

Definition at line 315 of file MkFinder.h.

Referenced by copy_in(), and copy_out().

◆ m_CurHit

int mkfit::MkFinder::m_CurHit[NN]
private

Definition at line 347 of file MkFinder.h.

Referenced by bkFitFitTracksBH(), and bkFitInputTracks().

◆ m_CurNode

int mkfit::MkFinder::m_CurNode[NN]
private

Definition at line 349 of file MkFinder.h.

Referenced by bkFitFitTracks(), and bkFitInputTracks().

◆ m_current_region

int mkfit::MkFinder::m_current_region = -1
private

Definition at line 343 of file MkFinder.h.

Referenced by begin_layer(), release(), and setup().

◆ m_event

const Event* mkfit::MkFinder::m_event = nullptr
private

◆ m_HoTArr

const HitOnTrack* mkfit::MkFinder::m_HoTArr[NN]
private

Definition at line 348 of file MkFinder.h.

Referenced by bkFitFitTracksBH(), and bkFitInputTracks().

◆ m_HoTArrs

HitOnTrack mkfit::MkFinder::m_HoTArrs[NN][Config::nMaxTrkHits]
private

Definition at line 297 of file MkFinder.h.

Referenced by add_hit(), bestHitLastHoT(), copy_in(), copy_out(), and findCandidates().

◆ m_HoTNodeArr

const HoTNode* mkfit::MkFinder::m_HoTNodeArr[NN]
private

Definition at line 350 of file MkFinder.h.

Referenced by bkFitFitTracks(), and bkFitInputTracks().

◆ m_in_fwd

bool mkfit::MkFinder::m_in_fwd = true
private

Definition at line 344 of file MkFinder.h.

Referenced by getHitSelDynamicChi2Cut(), getHitSelDynamicWindows(), release(), and setup().

◆ m_iteration_config

const IterationConfig* mkfit::MkFinder::m_iteration_config = nullptr
private

Definition at line 337 of file MkFinder.h.

Referenced by begin_layer(), release(), selectHitIndices(), and setup().

◆ m_iteration_hit_mask

const std::vector<bool>* mkfit::MkFinder::m_iteration_hit_mask = nullptr
private

Definition at line 341 of file MkFinder.h.

Referenced by release(), selectHitIndices(), selectHitIndicesV2(), and setup().

◆ m_iteration_layer_config

const IterationLayerConfig* mkfit::MkFinder::m_iteration_layer_config = nullptr
private

◆ m_iteration_params

const IterationParams* mkfit::MkFinder::m_iteration_params = nullptr
private

◆ m_Label

MPlexQI mkfit::MkFinder::m_Label
private

◆ m_LastHitCcIndex

MPlexQI mkfit::MkFinder::m_LastHitCcIndex
private

Definition at line 313 of file MkFinder.h.

Referenced by copy_in(), and copy_out().

◆ m_msErr

MPlexHS mkfit::MkFinder::m_msErr {0.0f}
private

◆ m_msPar

MPlexHV mkfit::MkFinder::m_msPar {0.0f}
private

◆ m_NFoundHits

MPlexQI mkfit::MkFinder::m_NFoundHits
private

◆ m_NHits

MPlexQI mkfit::MkFinder::m_NHits
private

Definition at line 294 of file MkFinder.h.

Referenced by add_hit(), bestHitLastHoT(), copy_in(), and copy_out().

◆ m_NInsideMinusOneHits

MPlexQI mkfit::MkFinder::m_NInsideMinusOneHits
private

◆ m_NMissingHits

MPlexQI mkfit::MkFinder::m_NMissingHits
private

Definition at line 309 of file MkFinder.h.

Referenced by copy_in(), and copy_out().

◆ m_NOverlapHits

MPlexQI mkfit::MkFinder::m_NOverlapHits
private

Definition at line 310 of file MkFinder.h.

Referenced by copy_in(), copy_out(), and findCandidatesCloneEngine().

◆ m_NTailMinusOneHits

MPlexQI mkfit::MkFinder::m_NTailMinusOneHits
private

◆ m_prop_config

const PropagationConfig* mkfit::MkFinder::m_prop_config = nullptr
private

◆ m_SeedIdx

MPlexQI mkfit::MkFinder::m_SeedIdx
private

◆ m_SeedOriginIdx

MPlexQI mkfit::MkFinder::m_SeedOriginIdx
private

◆ m_steering_params

const SteeringParams* mkfit::MkFinder::m_steering_params = nullptr
private

◆ m_Stopped

MPlexQI mkfit::MkFinder::m_Stopped
private

Definition at line 303 of file MkFinder.h.

Referenced by outputNonStoppedTracksAndHitIdx().

◆ m_TrkCand

TrackCand* mkfit::MkFinder::m_TrkCand[NN]
private

Definition at line 318 of file MkFinder.h.

Referenced by bkFitFitTracks(), and bkFitInputTracks().

◆ m_TrkStatus

TrackBase::Status mkfit::MkFinder::m_TrkStatus[NN]
private

Definition at line 314 of file MkFinder.h.

Referenced by copy_in(), and copy_out().

◆ m_XHitArr

MPlexHitIdx mkfit::MkFinder::m_XHitArr
private

◆ m_XHitSize

MPlexQI mkfit::MkFinder::m_XHitSize
private

◆ m_XWsrResult

WSR_Result mkfit::MkFinder::m_XWsrResult[NN]
private

◆ MPlexHitIdxMax

constexpr int mkfit::MkFinder::MPlexHitIdxMax = 16
static

Definition at line 42 of file MkFinder.h.

Referenced by selectHitIndices().