CMS 3D CMS Logo

MkStdSeqs.cc
Go to the documentation of this file.
2 
5 
7 
8 #include "oneapi/tbb/parallel_for.h"
9 
10 namespace mkfit {
11 
12  namespace StdSeq {
13 
14  //=========================================================================
15  // Hit processing
16  //=========================================================================
17 
18  void loadDeads(EventOfHits &eoh, const std::vector<DeadVec> &deadvectors) {
19  for (size_t il = 0; il < deadvectors.size(); il++) {
20  eoh.suckInDeads(int(il), deadvectors[il]);
21  }
22  }
23 
24  // Loading hits in CMSSW from two "large multi-layer vectors".
25  // orig_hitvectors[0] - pixels,
26  // orig_hitvectors[1] - strips.
27 
28  void cmssw_LoadHits_Begin(EventOfHits &eoh, const std::vector<const HitVec *> &orig_hitvectors) {
29  eoh.reset();
30  for (int i = 0; i < eoh.nLayers(); ++i) {
31  auto &&l = eoh[i];
32  l.beginRegistrationOfHits(*orig_hitvectors[l.is_pixel() ? 0 : 1]);
33  }
34  }
35 
36  // Loop with LayerOfHits::registerHit(int idx) - it takes Hit out of original HitVec to
37  // extract phi, r/z, and calculate qphifines
38  //
39  // Something like what is done in MkFitInputConverter::convertHits
40  //
41  // Problem is I don't know layers for each large-vector;
42  // Also, layer is calculated for each detset when looping over the HitCollection
43 
45  for (int i = 0; i < eoh.nLayers(); ++i) {
46  auto &&l = eoh[i];
47  l.endRegistrationOfHits(false);
48  }
49  }
50 
51  //=========================================================================
52  // Hit-index mapping / remapping
53  //=========================================================================
54 
56  for (auto &&track : seeds) {
57  for (int i = 0; i < track.nTotalHits(); ++i) {
58  const int hitidx = track.getHitIdx(i);
59  const int hitlyr = track.getHitLyr(i);
60  if (hitidx >= 0) {
61  const auto &loh = eoh[hitlyr];
62  track.setHitIdx(i, loh.getHitIndexFromOriginal(hitidx));
63  }
64  }
65  }
66  }
67 
68  void cmssw_ReMap_TrackHitIndices(const EventOfHits &eoh, TrackVec &out_tracks) {
69  for (auto &&track : out_tracks) {
70  for (int i = 0; i < track.nTotalHits(); ++i) {
71  const int hitidx = track.getHitIdx(i);
72  const int hitlyr = track.getHitLyr(i);
73  if (hitidx >= 0) {
74  const auto &loh = eoh[hitlyr];
75  track.setHitIdx(i, loh.getOriginalHitIndex(hitidx));
76  }
77  }
78  }
79  }
80 
81  //=========================================================================
82  // Seed cleaning (multi-iter)
83  //=========================================================================
84  int clean_cms_seedtracks_iter(TrackVec *seed_ptr, const IterationConfig &itrcfg, const BeamSpot &bspot) {
85  const float etamax_brl = Config::c_etamax_brl;
86  const float dpt_common = Config::c_dpt_common;
87 
88  const float dzmax_bh = itrcfg.m_params.c_dzmax_bh;
89  const float drmax_bh = itrcfg.m_params.c_drmax_bh;
90  const float dzmax_eh = itrcfg.m_params.c_dzmax_eh;
91  const float drmax_eh = itrcfg.m_params.c_drmax_eh;
92  const float dzmax_bl = itrcfg.m_params.c_dzmax_bl;
93  const float drmax_bl = itrcfg.m_params.c_drmax_bl;
94  const float dzmax_el = itrcfg.m_params.c_dzmax_el;
95  const float drmax_el = itrcfg.m_params.c_drmax_el;
96 
97  const float ptmin_hpt = itrcfg.m_params.c_ptthr_hpt;
98 
99  const float dzmax2_inv_bh = 1.f / (dzmax_bh * dzmax_bh);
100  const float drmax2_inv_bh = 1.f / (drmax_bh * drmax_bh);
101  const float dzmax2_inv_eh = 1.f / (dzmax_eh * dzmax_eh);
102  const float drmax2_inv_eh = 1.f / (drmax_eh * drmax_eh);
103  const float dzmax2_inv_bl = 1.f / (dzmax_bl * dzmax_bl);
104  const float drmax2_inv_bl = 1.f / (drmax_bl * drmax_bl);
105  const float dzmax2_inv_el = 1.f / (dzmax_el * dzmax_el);
106  const float drmax2_inv_el = 1.f / (drmax_el * drmax_el);
107 
108  // Merge hits from overlapping seeds?
109  // For now always true, we require extra hits after seed.
110  const bool merge_hits = true; // itrcfg.merge_seed_hits_during_cleaning();
111 
112  if (seed_ptr == nullptr)
113  return 0;
114  TrackVec &seeds = *seed_ptr;
115 
116  const int ns = seeds.size();
117 #ifdef DEBUG
118  std::cout << "before seed cleaning " << seeds.size() << std::endl;
119 #endif
120  TrackVec cleanSeedTracks;
121  cleanSeedTracks.reserve(ns);
122  std::vector<bool> writetrack(ns, true);
123 
124  const float invR1GeV = 1.f / Config::track1GeVradius;
125 
126  std::vector<int> nHits(ns);
127  std::vector<int> charge(ns);
128  std::vector<float> oldPhi(ns);
129  std::vector<float> pos2(ns);
130  std::vector<float> eta(ns);
131  std::vector<float> ctheta(ns);
132  std::vector<float> invptq(ns);
133  std::vector<float> pt(ns);
134  std::vector<float> x(ns);
135  std::vector<float> y(ns);
136  std::vector<float> z(ns);
137  std::vector<float> d0(ns);
138  int i1, i2; //for the sorting
139 
141  axis<float, unsigned short, 8, 8> ax_eta(-3.0, 3.0, 30u);
143 
144  phi_eta_binnor.begin_registration(ns);
145 
146  for (int ts = 0; ts < ns; ts++) {
147  const Track &tk = seeds[ts];
148  nHits[ts] = tk.nFoundHits();
149  charge[ts] = tk.charge();
150  oldPhi[ts] = tk.momPhi();
151  pos2[ts] = std::pow(tk.x(), 2) + std::pow(tk.y(), 2);
152  eta[ts] = tk.momEta();
153  ctheta[ts] = 1.f / std::tan(tk.theta());
154  invptq[ts] = tk.charge() * tk.invpT();
155  pt[ts] = tk.pT();
156  x[ts] = tk.x();
157  y[ts] = tk.y();
158  z[ts] = tk.z();
159  d0[ts] = tk.d0BeamSpot(bspot.x, bspot.y);
160 
161  phi_eta_binnor.register_entry_safe(oldPhi[ts], eta[ts]);
162  // If one is sure values are *within* axis ranges: b.register_entry(oldPhi[ts], eta[ts]);
163  }
164 
165  phi_eta_binnor.finalize_registration();
166 
167  for (int sorted_ts = 0; sorted_ts < ns; sorted_ts++) {
168  int ts = phi_eta_binnor.m_ranks[sorted_ts];
169 
170  if (not writetrack[ts])
171  continue; // Note: this speed up prevents transitive masking (possibly marginal gain).
172 
173  const float oldPhi1 = oldPhi[ts];
174  const float pos2_first = pos2[ts];
175  const float eta1 = eta[ts];
176  const float pt1 = pt[ts];
177  const float invptq_first = invptq[ts];
178 
179  // To study some more details -- need EventOfHits for this
180  int n_ovlp_hits_added = 0;
181 
182  auto phi_rng = ax_phi.from_R_rdr_to_N_bins(oldPhi[ts], 0.08f);
183  auto eta_rng = ax_eta.from_R_rdr_to_N_bins(eta[ts], .1f);
184 
185  for (auto i_phi = phi_rng.begin; i_phi != phi_rng.end; i_phi = ax_phi.next_N_bin(i_phi)) {
186  for (auto i_eta = eta_rng.begin; i_eta != eta_rng.end; i_eta = ax_eta.next_N_bin(i_eta)) {
187  const auto cbin = phi_eta_binnor.get_content(i_phi, i_eta);
188  for (auto i = cbin.first; i < cbin.end(); ++i) {
189  int tss = phi_eta_binnor.m_ranks[i];
190 
191  if (not writetrack[ts])
192  continue;
193  if (not writetrack[tss])
194  continue;
195  if (tss == ts)
196  continue;
197 
198  const float pt2 = pt[tss];
199 
200  // Always require charge consistency. If different charge is assigned, do not remove seed-track
201  if (charge[tss] != charge[ts])
202  continue;
203 
204  const float thisDPt = std::abs(pt2 - pt1);
205  // Require pT consistency between seeds. If dpT is large, do not remove seed-track.
206  if (thisDPt > dpt_common * pt1)
207  continue;
208 
209  const float eta2 = eta[tss];
210  const float deta2 = std::pow(eta1 - eta2, 2);
211 
212  const float oldPhi2 = oldPhi[tss];
213 
214  const float pos2_second = pos2[tss];
215  const float thisDXYSign05 = pos2_second > pos2_first ? -0.5f : 0.5f;
216 
217  const float thisDXY = thisDXYSign05 * sqrt(std::pow(x[ts] - x[tss], 2) + std::pow(y[ts] - y[tss], 2));
218 
219  const float invptq_second = invptq[tss];
220 
221  const float newPhi1 = oldPhi1 - thisDXY * invR1GeV * invptq_first;
222  const float newPhi2 = oldPhi2 + thisDXY * invR1GeV * invptq_second;
223 
224  const float dphi = cdist(std::abs(newPhi1 - newPhi2));
225 
226  const float dr2 = deta2 + dphi * dphi;
227 
228  const float thisDZ = z[ts] - z[tss] - thisDXY * (ctheta[ts] + ctheta[tss]);
229  const float dz2 = thisDZ * thisDZ;
230 
231  // Reject tracks within dR-dz elliptical window.
232  // Adaptive thresholds, based on observation that duplicates are more abundant at large pseudo-rapidity and low track pT
233  bool overlapping = false;
234  if (std::abs(eta1) < etamax_brl) {
235  if (pt1 > ptmin_hpt) {
236  if (dz2 * dzmax2_inv_bh + dr2 * drmax2_inv_bh < 1.0f)
237  overlapping = true;
238  } else {
239  if (dz2 * dzmax2_inv_bl + dr2 * drmax2_inv_bl < 1.0f)
240  overlapping = true;
241  }
242  } else {
243  if (pt1 > ptmin_hpt) {
244  if (dz2 * dzmax2_inv_eh + dr2 * drmax2_inv_eh < 1.0f)
245  overlapping = true;
246  } else {
247  if (dz2 * dzmax2_inv_el + dr2 * drmax2_inv_el < 1.0f)
248  overlapping = true;
249  }
250  }
251 
252  if (overlapping) {
253  //Mark tss as a duplicate
254  i1 = ts;
255  i2 = tss;
256  if (d0[tss] > d0[ts])
257  writetrack[tss] = false;
258  else {
259  writetrack[ts] = false;
260  i2 = ts;
261  i1 = tss;
262  }
263  // Add hits from tk2 to the seed we are keeping.
264  // NOTE: We have a limit in Track::Status for the number of seed hits.
265  // There is a check at entry and after adding of a new hit.
266  Track &tk = seeds[i1];
267  if (merge_hits && tk.nTotalHits() < Track::Status::kMaxSeedHits) {
268  const Track &tk2 = seeds[i2];
269  //We are not actually fitting to the extra hits; use chi2 of 0
270  float fakeChi2 = 0.0;
271 
272  for (int j = 0; j < tk2.nTotalHits(); ++j) {
273  int hitidx = tk2.getHitIdx(j);
274  int hitlyr = tk2.getHitLyr(j);
275  if (hitidx >= 0) {
276  bool unique = true;
277  for (int i = 0; i < tk.nTotalHits(); ++i) {
278  if ((hitidx == tk.getHitIdx(i)) && (hitlyr == tk.getHitLyr(i))) {
279  unique = false;
280  break;
281  }
282  }
283  if (unique) {
284  tk.addHitIdx(tk2.getHitIdx(j), tk2.getHitLyr(j), fakeChi2);
285  ++n_ovlp_hits_added;
287  break;
288  }
289  }
290  }
291  }
292  if (n_ovlp_hits_added > 0)
293  tk.sortHitsByLayer();
294  }
295  } //end of inner loop over tss
296  } //eta bin
297  } //phi bin
298 
299  if (writetrack[ts]) {
300  cleanSeedTracks.emplace_back(seeds[ts]);
301  }
302  }
303 
304  seeds.swap(cleanSeedTracks);
305 
306 #ifdef DEBUG
307  {
308  const int ns2 = seeds.size();
309  printf("Number of CMS seeds before %d --> after %d cleaning\n", ns, ns2);
310 
311  for (int it = 0; it < ns2; it++) {
312  const Track &ss = seeds[it];
313  printf(" %3i q=%+i pT=%7.3f eta=% 7.3f nHits=%i label=% i\n",
314  it,
315  ss.charge(),
316  ss.pT(),
317  ss.momEta(),
318  ss.nFoundHits(),
319  ss.label());
320  }
321  }
322 #endif
323 
324 #ifdef DEBUG
325  std::cout << "AFTER seed cleaning " << seeds.size() << std::endl;
326 #endif
327 
328  return seeds.size();
329  }
330 
331  //=========================================================================
332  // Duplicate cleaning
333  //=========================================================================
334 
336  const auto ntracks = tracks.size();
337  float eta1, phi1, pt1, deta, dphi, dr2;
338 
339  if (ntracks == 0) {
340  return;
341  }
342  for (auto itrack = 0U; itrack < ntracks - 1; itrack++) {
343  auto &track = tracks[itrack];
345  auto const algo = track.algorithm();
347  continue;
348  eta1 = track.momEta();
349  phi1 = track.momPhi();
350  pt1 = track.pT();
351  for (auto jtrack = itrack + 1; jtrack < ntracks; jtrack++) {
352  auto &track2 = tracks[jtrack];
353  if (track.label() == track2.label())
354  continue;
355  if (track.algoint() != track2.algoint())
356  continue;
357 
358  deta = std::abs(track2.momEta() - eta1);
359  if (deta > Config::maxdEta)
360  continue;
361 
362  dphi = std::abs(squashPhiMinimal(phi1 - track2.momPhi()));
363  if (dphi > Config::maxdPhi)
364  continue;
365 
366  float maxdR = Config::maxdR;
367  float maxdRSquared = maxdR * maxdR;
368  if (std::abs(eta1) > 2.5f)
369  maxdRSquared *= 16.0f;
370  else if (std::abs(eta1) > 1.44f)
371  maxdRSquared *= 9.0f;
372  dr2 = dphi * dphi + deta * deta;
373  if (dr2 < maxdRSquared) {
374  //Keep track with best score
375  if (track.score() > track2.score())
376  track2.setDuplicateValue(true);
377  else
378  track.setDuplicateValue(true);
379  continue;
380  } else {
381  if (pt1 == 0)
382  continue;
383  if (track2.pT() == 0)
384  continue;
385 
386  if (std::abs((1 / track2.pT()) - (1 / pt1)) < Config::maxdPt) {
388  float numHitsShared = 0;
389  for (int ihit2 = 0; ihit2 < track2.nTotalHits(); ihit2++) {
390  const int hitidx2 = track2.getHitIdx(ihit2);
391  const int hitlyr2 = track2.getHitLyr(ihit2);
392  if (hitidx2 >= 0) {
393  auto const it = std::find_if(track.beginHitsOnTrack(),
394  track.endHitsOnTrack(),
395  [&hitidx2, &hitlyr2](const HitOnTrack &element) {
396  return (element.index == hitidx2 && element.layer == hitlyr2);
397  });
398  if (it != track.endHitsOnTrack())
399  numHitsShared++;
400  }
401  }
402 
403  float fracHitsShared = numHitsShared / std::min(track.nFoundHits(), track2.nFoundHits());
404  //Only remove one of the tracks if they share at least X% of the hits (denominator is the shorter track)
405  if (fracHitsShared < Config::minFracHitsShared)
406  continue;
407  }
408  //Keep track with best score
409  if (track.score() > track2.score())
410  track2.setDuplicateValue(true);
411  else
412  track.setDuplicateValue(true);
413  } //end of if dPt
414  } //end of else
415  } //end of loop over track2
416  } //end of loop over track1
417  }
418 
420  tracks.erase(std::remove_if(tracks.begin(), tracks.end(), [](auto track) { return track.getDuplicateValue(); }),
421  tracks.end());
422  }
423 
424  //=========================================================================
425  // SHARED HITS DUPLICATE CLEANING
426  //=========================================================================
427 
429  const auto ntracks = tracks.size();
430 
431  std::vector<float> ctheta(ntracks);
432  std::multimap<int, int> hitMap;
433 
434  for (auto itrack = 0U; itrack < ntracks; itrack++) {
435  auto &trk = tracks[itrack];
436  ctheta[itrack] = 1.f / std::tan(trk.theta());
437  for (int i = 0; i < trk.nTotalHits(); ++i) {
438  if (trk.getHitIdx(i) < 0)
439  continue;
440  int a = trk.getHitLyr(i);
441  int b = trk.getHitIdx(i);
442  hitMap.insert(std::make_pair(b * 1000 + a, i > 0 ? itrack : -itrack)); //negative for first hit in trk
443  }
444  }
445 
446  for (auto itrack = 0U; itrack < ntracks; itrack++) {
447  auto &trk = tracks[itrack];
448  auto phi1 = trk.momPhi();
449  auto ctheta1 = ctheta[itrack];
450 
451  std::map<int, int> sharingMap;
452  for (int i = 0; i < trk.nTotalHits(); ++i) {
453  if (trk.getHitIdx(i) < 0)
454  continue;
455  int a = trk.getHitLyr(i);
456  int b = trk.getHitIdx(i);
457  auto range = hitMap.equal_range(b * 1000 + a);
458  for (auto it = range.first; it != range.second; ++it) {
459  if (std::abs(it->second) >= (int)itrack)
460  continue; // don't check your own hits (==) nor sym. checks (>)
461  if (i == 0 && it->second < 0)
462  continue; // shared first - first is not counted
463  sharingMap[std::abs(it->second)]++;
464  }
465  }
466 
467  for (const auto &elem : sharingMap) {
468  auto &track2 = tracks[elem.first];
469 
470  // broad dctheta-dphi compatibility checks; keep mostly to preserve consistency with old results
471  auto dctheta = std::abs(ctheta[elem.first] - ctheta1);
472  if (dctheta > 1.)
473  continue;
474 
475  auto dphi = std::abs(squashPhiMinimal(phi1 - track2.momPhi()));
476  if (dphi > 1.)
477  continue;
478 
479  if (elem.second >= std::min(trk.nFoundHits(), track2.nFoundHits()) * fraction) {
480  if (trk.score() > track2.score())
481  track2.setDuplicateValue(true);
482  else
483  trk.setDuplicateValue(true);
484  }
485  } // end sharing hits loop
486  } // end trk loop
487 
488  tracks.erase(std::remove_if(tracks.begin(), tracks.end(), [](auto track) { return track.getDuplicateValue(); }),
489  tracks.end());
490  }
491 
493  const float fraction,
494  const float drth_central,
495  const float drth_obarrel,
496  const float drth_forward) {
497  const auto ntracks = tracks.size();
498 
499  std::vector<float> ctheta(ntracks);
500  for (auto itrack = 0U; itrack < ntracks; itrack++) {
501  auto &trk = tracks[itrack];
502  ctheta[itrack] = 1.f / std::tan(trk.theta());
503  }
504 
505  float phi1, invpt1, dctheta, ctheta1, dphi, dr2;
506  for (auto itrack = 0U; itrack < ntracks; itrack++) {
507  auto &trk = tracks[itrack];
508  phi1 = trk.momPhi();
509  invpt1 = trk.invpT();
510  ctheta1 = ctheta[itrack];
511  for (auto jtrack = itrack + 1; jtrack < ntracks; jtrack++) {
512  auto &track2 = tracks[jtrack];
513  if (trk.label() == track2.label())
514  continue;
515 
516  dctheta = std::abs(ctheta[jtrack] - ctheta1);
517 
518  if (dctheta > Config::maxdcth)
519  continue;
520 
521  dphi = std::abs(squashPhiMinimal(phi1 - track2.momPhi()));
522 
523  if (dphi > Config::maxdphi)
524  continue;
525 
526  float maxdRSquared = drth_central * drth_central;
527  if (std::abs(ctheta1) > Config::maxcth_fw)
528  maxdRSquared = drth_forward * drth_forward;
529  else if (std::abs(ctheta1) > Config::maxcth_ob)
530  maxdRSquared = drth_obarrel * drth_obarrel;
531  dr2 = dphi * dphi + dctheta * dctheta;
532  if (dr2 < maxdRSquared) {
533  //Keep track with best score
534  if (trk.score() > track2.score())
535  track2.setDuplicateValue(true);
536  else
537  trk.setDuplicateValue(true);
538  continue;
539  }
540 
541  if (std::abs(track2.invpT() - invpt1) > Config::maxd1pt)
542  continue;
543 
544  auto sharedCount = 0;
545  auto sharedFirst = 0;
546  const auto minFoundHits = std::min(trk.nFoundHits(), track2.nFoundHits());
547 
548  for (int i = 0; i < trk.nTotalHits(); ++i) {
549  if (trk.getHitIdx(i) < 0)
550  continue;
551  const int a = trk.getHitLyr(i);
552  const int b = trk.getHitIdx(i);
553  for (int j = 0; j < track2.nTotalHits(); ++j) {
554  if (track2.getHitIdx(j) < 0)
555  continue;
556  const int c = track2.getHitLyr(j);
557  const int d = track2.getHitIdx(j);
558 
559  //this is to count once shared matched hits (may be done more properly...)
560  if (a == c && b == d)
561  sharedCount += 1;
562  if (j == 0 && i == 0 && a == c && b == d)
563  sharedFirst += 1;
564 
565  if ((sharedCount - sharedFirst) >= ((minFoundHits - sharedFirst) * fraction))
566  continue;
567  }
568  if ((sharedCount - sharedFirst) >= ((minFoundHits - sharedFirst) * fraction))
569  continue;
570  }
571 
572  //selection here - 11percent fraction of shared hits to label a duplicate
573  if ((sharedCount - sharedFirst) >= ((minFoundHits - sharedFirst) * fraction)) {
574  if (trk.score() > track2.score())
575  track2.setDuplicateValue(true);
576  else
577  trk.setDuplicateValue(true);
578  }
579  }
580  } //end loop one over tracks
581 
582  //removal here
583  tracks.erase(std::remove_if(tracks.begin(), tracks.end(), [](auto track) { return track.getDuplicateValue(); }),
584  tracks.end());
585  }
586 
587  //=========================================================================
588  //
589  //=========================================================================
590 
592 #ifdef DEBUG
593  std::cout << " find_and_remove_duplicates: input track size " << tracks.size() << std::endl;
594 #endif
595  if (itconf.m_requires_quality_filter && !(itconf.m_requires_dupclean_tight)) {
597  } else if (itconf.m_requires_dupclean_tight) {
599  itconf.m_params.fracSharedHits,
600  itconf.m_params.drth_central,
601  itconf.m_params.drth_obarrel,
602  itconf.m_params.drth_forward);
603  } else {
606  }
607 
608 #ifdef DEBUG
609  std::cout << " find_and_remove_duplicates: output track size " << tracks.size() << std::endl;
610  for (auto const &tk : tracks) {
611  std::cout << tk.parameters() << std::endl;
612  }
613 #endif
614  }
615 
616  } // namespace StdSeq
617 } // namespace mkfit
void find_and_remove_duplicates(TrackVec &tracks, const IterationConfig &itconf)
Definition: MkStdSeqs.cc:591
int getHitIdx(int posHitIdx) const
Definition: Track.h:455
float d0BeamSpot(const float x_bs, const float y_bs, bool linearize=false) const
Definition: Track.cc:190
IterationParams m_params
float squashPhiMinimal(float phi)
Definition: Hit.h:26
int getHitLyr(int posHitIdx) const
Definition: Track.h:456
const float maxdPt
Definition: Config.cc:31
const float maxdphi
Definition: Config.cc:38
const float maxd1pt
Definition: Config.cc:37
int charge() const
Definition: Track.h:183
void cmssw_Map_TrackHitIndices(const EventOfHits &eoh, TrackVec &seeds)
Definition: MkStdSeqs.cc:55
void find_duplicates(TrackVec &tracks)
Definition: MkStdSeqs.cc:335
const float maxdcth
Definition: Config.cc:39
I_pair from_R_rdr_to_N_bins(R r, R dr) const
Definition: binnor.h:73
float pT() const
Definition: Track.h:169
constexpr float c_dpt_common
Definition: Config.h:128
void cmssw_LoadHits_End(EventOfHits &eoh)
Definition: MkStdSeqs.cc:44
void find_duplicates_sharedhits_pixelseed(TrackVec &tracks, const float fraction, const float drth_central, const float drth_obarrel, const float drth_forward)
Definition: MkStdSeqs.cc:492
C_pair get_content(B_pair n_bin) const
Definition: binnor.h:240
const float maxdR
Definition: Config.cc:34
static constexpr int kMaxSeedHits
Definition: Track.h:203
int nLayers() const
I next_N_bin(I bin) const
Definition: binnor.h:113
float invpT() const
Definition: Track.h:170
void cmssw_LoadHits_Begin(EventOfHits &eoh, const std::vector< const HitVec *> &orig_hitvectors)
Definition: MkStdSeqs.cc:28
void finalize_registration()
Definition: binnor.h:289
axis_base< R, I, M, N >::I_pair from_R_rdr_to_N_bins(R r, R dr) const
Definition: binnor.h:110
const float maxcth_fw
Definition: Config.cc:41
float theta() const
Definition: Track.h:174
int nFoundHits() const
Definition: Track.h:516
void find_duplicates_sharedhits(TrackVec &tracks, const float fraction)
Definition: MkStdSeqs.cc:428
float momEta() const
Definition: Track.h:173
void remove_duplicates(TrackVec &tracks)
Definition: MkStdSeqs.cc:419
float y() const
Definition: Track.h:159
const float maxcth_ob
Definition: Config.cc:40
std::vector< C > m_ranks
Definition: binnor.h:211
void sortHitsByLayer()
Definition: Track.cc:266
float x
Definition: Hit.h:283
constexpr float c_etamax_brl
Definition: Config.h:127
void cmssw_ReMap_TrackHitIndices(const EventOfHits &eoh, TrackVec &out_tracks)
Definition: MkStdSeqs.cc:68
const float maxdEta
Definition: Config.cc:33
constexpr float PI
Definition: Config.h:42
float y
Definition: Hit.h:283
const float maxdPhi
Definition: Config.cc:32
T sqrt(T t)
Definition: SSEVec.h:19
def unique(seq, keepstr=True)
Definition: tier0.py:24
void register_entry_safe(typename A1::real_t r1, typename A2::real_t r2)
Definition: binnor.h:282
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
void loadDeads(EventOfHits &eoh, const std::vector< DeadVec > &deadvectors)
Definition: MkStdSeqs.cc:18
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
void addHitIdx(int hitIdx, int hitLyr, float chi2)
Definition: Track.h:442
float cdist(float a)
Definition: Config.h:67
d
Definition: ztail.py:151
void begin_registration(C n_items)
Definition: binnor.h:264
std::vector< Track > TrackVec
static constexpr float d0
auto const & tracks
cannot be loose
float z() const
Definition: Track.h:160
constexpr float track1GeVradius
Definition: Config.h:126
double b
Definition: hdecay.h:118
caConstants::TupleMultiplicity const CAHitNtupletGeneratorKernelsGPU::HitToTuple const cms::cuda::AtomicPairCounter GPUCACell const *__restrict__ uint32_t const *__restrict__ gpuPixelDoublets::CellNeighborsVector const gpuPixelDoublets::CellTracksVector const GPUCACell::OuterHitOfCell const int32_t nHits
int nTotalHits() const
Definition: Track.h:517
double a
Definition: hdecay.h:119
float x
TrackAlgorithm
track algorithm; copy from TrackBase.h to keep in standalone builds
Definition: Track.h:275
float x() const
Definition: Track.h:158
const bool useHitsForDuplicates
Definition: Config.h:142
float momPhi() const
Definition: Track.h:172
I next_N_bin(I bin) const
Definition: binnor.h:74
void suckInDeads(int layer, const DeadVec &deadv)
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
Definition: fakeMenu.h:6
int clean_cms_seedtracks_iter(TrackVec *seed_ptr, const IterationConfig &itrcfg, const BeamSpot &bspot)
Definition: MkStdSeqs.cc:84
const float minFracHitsShared
Definition: Config.cc:35