CMS 3D CMS Logo

Shell.cc
Go to the documentation of this file.
2 
4 
5 // #include "RecoTracker/MkFitCore/src/Matriplex/MatriplexCommon.h"
6 
8 
14 
17 
19 
20 #ifndef NO_ROOT
21 #include "TROOT.h"
22 #include "TRint.h"
23 #endif
24 
25 #include "oneapi/tbb/task_arena.h"
26 
27 #include <vector>
28 
29 // clang-format off
30 
31 namespace {
32  constexpr int algos[] = {4, 22, 23, 5, 24, 7, 8, 9, 10, 6}; // 10 iterations
33  constexpr int n_algos = sizeof(algos) / sizeof(int);
34 
35  const char* b2a(bool b) { return b ? "true" : "false"; }
36 }
37 
38 namespace mkfit {
39 
40  Shell::Shell(std::vector<DeadVec> &dv, const std::string &in_file, int start_ev)
41  : m_deadvectors(dv)
42  {
45 
47 
48  m_data_file = new DataFile;
50 
51  m_event = new Event(0, Config::TrkInfo.n_layers());
52  GoToEvent(start_ev);
53  }
54 
55  void Shell::Run() {
56 #ifndef NO_ROOT
57  std::vector<const char *> argv = { "mkFit", "-l" };
58  int argc = argv.size();
59  TRint rint("mkFit-shell", &argc, const_cast<char**>(argv.data()));
60 
61  char buf[256];
62  sprintf(buf, "mkfit::Shell &s = * (mkfit::Shell*) %p;", this);
63  gROOT->ProcessLine(buf);
64  printf("Shell &s variable is set\n");
65 
66  rint.Run(true);
67  printf("Shell::Run finished\n");
68 #else
69  printf("Shell::Run() no root, we rot -- erroring out. Recompile with WITH_ROOT=1\n");
70  exit(1);
71 #endif
72  }
73 
74  void Shell::Status() {
75  printf("On event %d, selected iteration index %d, algo %d - %s\n"
76  " debug = %s, use_dead_modules = %s\n"
77  " clean_seeds = %s, backward_fit = %s, remove_duplicates = %s\n",
81  }
82 
83  //===========================================================================
84  // Event navigation / processing
85  //===========================================================================
86 
87  void Shell::GoToEvent(int eid) {
88  if (eid < 1) {
89  fprintf(stderr, "Requested event %d is less than 1 -- 1 is the first event, %d is total number of events in file\n",
91  throw std::runtime_error("event out of range");
92  }
93  if (eid > m_evs_in_file) {
94  fprintf(stderr, "Requested event %d is grater than total number of events in file %d\n",
96  throw std::runtime_error("event out of range");
97  }
98 
99  int pos = m_event->evtID();
100  if (eid > pos) {
101  m_data_file->skipNEvents(eid - pos - 1);
102  } else {
103  m_data_file->rewind();
105  }
106  m_event->resetCurrentSeedTracks(); // left after ProcessEvent() for debugging etc
107  m_event->reset(eid);
112  }
113 
114  printf("At event %d\n", eid);
115  }
116 
117  void Shell::NextEvent(int skip) {
118  GoToEvent(m_event->evtID() + skip);
119  }
120 
121  void Shell::ProcessEvent(SeedSelect_e seed_select, int selected_seed, int count) {
122  // count is only used for SS_IndexPreCleaning and SS_IndexPostCleaning.
123  // There are no checks for upper bounds, ie, if requested seeds beyond the first one exist.
124 
125  const IterationConfig &itconf = Config::ItrInfo[m_it_index];
126  IterationMaskIfc mask_ifc;
128 
129  m_seeds.clear();
130  m_tracks.clear();
131 
132  {
133  int n_algo = 0; // seeds are grouped by algo
134  for (auto &s : m_event->seedTracks_) {
135  if (s.algoint() == itconf.m_track_algorithm) {
136  if (seed_select == SS_UseAll || seed_select == SS_IndexPostCleaning) {
137  m_seeds.push_back(s);
138  } else if (seed_select == SS_Label && s.label() == selected_seed) {
139  m_seeds.push_back(s);
140  break;
141  } else if (seed_select == SS_IndexPreCleaning && n_algo >= selected_seed) {
142  m_seeds.push_back(s);
143  if (--count <= 0)
144  break;
145  }
146  ++n_algo;
147  } else if (n_algo > 0)
148  break;
149  }
150  }
151 
152  printf("Shell::ProcessEvent running over %d seeds\n", (int) m_seeds.size());
153 
154  // Equivalent to run_OneIteration(...) without MkBuilder::release_memory().
155  // If seed_select == SS_IndexPostCleaning the given seed is picked after cleaning.
156  {
157  const TrackerInfo &trackerInfo = Config::TrkInfo;
158  const EventOfHits &eoh = *m_eoh;
159  const IterationMaskIfcBase &it_mask_ifc = mask_ifc;
162  TrackVec &out_tracks = m_tracks;
163  bool do_seed_clean = m_clean_seeds;
164  bool do_backward_fit = m_backward_fit;
165  bool do_remove_duplicates = m_remove_duplicates;
166 
167  MkJob job({trackerInfo, itconf, eoh, eoh.refBeamSpot(), &it_mask_ifc});
168 
169  builder.begin_event(&job, m_event, __func__);
170 
171  // Seed cleaning not done on all iterations.
172  do_seed_clean = m_clean_seeds && itconf.m_seed_cleaner;
173 
174  if (do_seed_clean) {
175  itconf.m_seed_cleaner(seeds, itconf, eoh.refBeamSpot());
176  printf("Shell::ProcessEvent post seed-cleaning: %d seeds\n", (int) m_seeds.size());
177  } else {
178  printf("Shell::ProcessEvent no seed-cleaning\n");
179  }
180 
181  // Check nans in seeds -- this should not be needed when Slava fixes
182  // the track parameter coordinate transformation.
184 
185  if (seed_select == SS_IndexPostCleaning) {
186  int seed_size = (int) seeds.size();
187  if (selected_seed >= 0 && selected_seed < seed_size) {
188  if (selected_seed + count >= seed_size) {
189  count = seed_size - selected_seed;
190  printf(" -- selected seed_index + count > seed vector size after cleaning -- trimming count to %d\n",
191  count);
192  }
193  for (int i = 0; i < count; ++i)
194  seeds[i] = seeds[selected_seed + i];
195  seeds.resize(count);
196  } else {
197  seeds.clear();
198  }
199  }
200 
201  if (seeds.empty()) {
202  if (seed_select != SS_UseAll)
203  printf("Shell::ProcessEvent requested seed not found among seeds of the selected iteration.\n");
204  else
205  printf("Shell::ProcessEvent no seeds found.\n");
206  return;
207  }
208 
209  if (itconf.m_requires_seed_hit_sorting) {
210  for (auto &s : seeds)
211  s.sortHitsByLayer(); // sort seed hits for the matched hits (I hope it works here)
212  }
213 
215 
216  builder.find_tracks_load_seeds(seeds, do_seed_clean);
217 
219 
220  printf("Shell::ProcessEvent post fwd search: %d comb-cands\n", builder.ref_eocc().size());
221 
222  // Pre backward-fit filtering.
223  filter_candidates_func pre_filter;
224  if (do_backward_fit && itconf.m_pre_bkfit_filter)
225  pre_filter = [&](const TrackCand &tc, const MkJob &jb) -> bool {
226  return itconf.m_pre_bkfit_filter(tc, jb) && StdSeq::qfilter_nan_n_silly<TrackCand>(tc, jb);
227  };
228  else if (itconf.m_pre_bkfit_filter)
229  pre_filter = itconf.m_pre_bkfit_filter;
230  else if (do_backward_fit)
231  pre_filter = StdSeq::qfilter_nan_n_silly<TrackCand>;
232  // pre_filter can be null if we are not doing backward fit as nan_n_silly will be run below.
233  if (pre_filter)
234  builder.filter_comb_cands(pre_filter, true);
235 
236  printf("Shell::ProcessEvent post pre-bkf-filter (%s) and nan-filter (%s) filter: %d comb-cands\n",
237  b2a(bool(itconf.m_pre_bkfit_filter)), b2a(do_backward_fit), builder.ref_eocc().size());
238 
239  job.switch_to_backward();
240 
241  if (do_backward_fit) {
242  if (itconf.m_backward_search) {
244  }
245 
247 
248  if (itconf.m_backward_search) {
251  }
252 
253  printf("Shell::ProcessEvent post backward fit / search: %d comb-cands\n", builder.ref_eocc().size());
254  }
255 
256  // Post backward-fit filtering.
257  filter_candidates_func post_filter;
258  if (do_backward_fit && itconf.m_post_bkfit_filter)
259  post_filter = [&](const TrackCand &tc, const MkJob &jb) -> bool {
260  return itconf.m_post_bkfit_filter(tc, jb) && StdSeq::qfilter_nan_n_silly<TrackCand>(tc, jb);
261  };
262  else
263  post_filter = StdSeq::qfilter_nan_n_silly<TrackCand>;
264  // post_filter is always at least doing nan_n_silly filter.
265  builder.filter_comb_cands(post_filter, true);
266 
267  printf("Shell::ProcessEvent post post-bkf-filter (%s) and nan-filter (true): %d comb-cands\n",
268  b2a(do_backward_fit && itconf.m_post_bkfit_filter), builder.ref_eocc().size());
269 
270  if (do_backward_fit && itconf.m_backward_search)
272 
273  builder.export_best_comb_cands(out_tracks, true);
274 
275  if (do_remove_duplicates && itconf.m_duplicate_cleaner) {
276  itconf.m_duplicate_cleaner(out_tracks, itconf);
277  }
278 
279  printf("Shell::ProcessEvent post remove-duplicates: %d comb-cands\n", (int) out_tracks.size());
280 
281  // Do not clear ... useful for debugging / printouts!
282  // m_event->resetCurrentSeedTracks();
283 
284  builder.end_event();
285  }
286 
287  printf("Shell::ProcessEvent found %d tracks, number of seeds at end %d\n",
288  (int) m_tracks.size(), (int) m_seeds.size());
289  }
290 
291  //===========================================================================
292  // Iteration selection
293  //===========================================================================
294 
295  void Shell::SelectIterationIndex(int itidx) {
296  if (itidx < 0 || itidx >= n_algos) {
297  fprintf(stderr, "Requested iteration index out of range [%d, %d)", 0, n_algos);
298  throw std::runtime_error("iteration index out of range");
299  }
300  m_it_index = itidx;
301  }
302 
304  for (int i = 0; i < n_algos; ++i) {
305  if (algos[i] == algo) {
306  m_it_index = i;
307  return;
308  }
309  }
310  fprintf(stderr, "Requested algo %d not found", algo);
311  throw std::runtime_error("algo not found");
312  }
313 
315  printf("Shell::PrintIterations selected index = %d, %d iterations hardcoded as\n",
316  m_it_index, n_algos);
317  for (int i = 0; i < n_algos; ++i)
318  printf("%d %2d %s\n", i, algos[i], TrackBase::algoint_to_cstr(algos[i]));
319  }
320 
321  //===========================================================================
322  // Flags / status setters
323  //===========================================================================
324 
325  void Shell::SetDebug(bool b) { g_debug = b; }
330 
331  //===========================================================================
332  // Analysis helpers
333  //===========================================================================
334 
335  /*
336  sim tracks are written to .bin files with a label equal to its own index.
337  reco tracks labels are seed indices.
338  seed labels are sim track indices
339  --
340  mkfit labels are seed indices in given iteration after cleaning (at seed load-time).
341  This is no longer true -- was done like that in branch where this code originated from.
342  It seems the label is the same as seed label.
343  */
344 
345  int Shell::LabelFromHits(Track &t, bool replace, float good_frac) {
346  std::map<int, int> lab_cnt;
347  for (int hi = 0; hi < t.nTotalHits(); ++hi) {
348  auto hot = t.getHitOnTrack(hi);
349  if (hot.index < 0)
350  continue;
351  const Hit &h = m_event->layerHits_[hot.layer][hot.index];
352  int hl = m_event->simHitsInfo_[h.mcHitID()].mcTrackID_;
353  if (hl >= 0)
354  ++lab_cnt[hl];
355  }
356  int max_c = -1, max_l = -1;
357  for (auto& x : lab_cnt) {
358  if (x.second > max_c) {
359  max_l = x.first;
360  max_c = x.second;
361  }
362  }
363  bool success = max_c >= good_frac * t.nFoundHits();
364  int relabel = success ? max_l : -1;
365  // printf("found_hits=%d, best_lab %d (%d hits), existing label=%d (replace flag=%s)\n",
366  // t.nFoundHits(), max_l, max_c, t.label(), b2a(replace));
367  if (replace)
368  t.setLabel(relabel);
369  return relabel;
370  }
371 
373  Event &ev = *m_event;
374  const int track_algo = Config::ItrInfo[m_it_index].m_track_algorithm;
375 
376  m_ckf_map.clear();
377  m_sim_map.clear();
378  m_seed_map.clear();
379  m_mkf_map.clear();
380 
381  // Pick ckf tracks with right algo and a good label.
382  int rec_algo_match = 0;
383  for (auto &t : ev.cmsswTracks_) {
384  if (t.algoint() != track_algo)
385  continue;
386  ++rec_algo_match;
387  int label = LabelFromHits(t, false, 0.5);
388  if (label >= 0) {
389  m_ckf_map.insert(std::make_pair(label, &t));
390  }
391  }
392 
393  // Pick sim tracks with labels found by ckf.
394  for (auto &t : ev.simTracks_) {
395  if (t.label() >= 0 && m_ckf_map.find(t.label()) != m_ckf_map.end()) {
396  m_sim_map.insert(std::make_pair(t.label(), &t));
397  }
398  }
399 
400  // Pick seeds with right algo and a label found by ckf.
401  for (auto &t : ev.seedTracks_) {
402  if (t.algoint() == track_algo && t.label() >= 0 && m_ckf_map.find(t.label()) != m_ckf_map.end()) {
403  m_seed_map.insert(std::make_pair(t.label(), &t));
404  }
405  }
406  // Some seeds seem to be labeled -1, try fixing when not otherwise found.
407  for (auto &t : ev.seedTracks_) {
408  if (t.algoint() == track_algo && t.label() == -1) {
409  int lab = LabelFromHits(t, true, 0.5);
410  if (lab >= 0 && m_seed_map.find(lab) == m_seed_map.end()) {
411  if (m_ckf_map.find(lab) != m_ckf_map.end()) {
412  m_seed_map.insert(std::make_pair(t.label(), &t));
413  printf("Saved seed with label -1 -> %d\n", lab);
414  }
415  }
416  }
417  }
418 
419  // Pick mkfit tracks, label by
420  for (auto &t : m_tracks) {
421  int label = LabelFromHits(t, false, 0.5);
422  if (label >= 0) {
423  m_mkf_map.insert(std::make_pair(label, &t));
424  }
425  }
426 
427  printf("Shell::FillByLabelMaps reporting tracks with label >= 0, algo=%d (%s): "
428  "ckf: %d of %d (same algo=%d)), sim: %d of %d, seed: %d of %d, mkfit: %d w/label of %d\n",
429  track_algo, TrackBase::algoint_to_cstr(track_algo),
430  (int) m_ckf_map.size(), (int) ev.cmsswTracks_.size(), rec_algo_match,
431  (int) m_sim_map.size(), (int) ev.simTracks_.size(),
432  (int) m_seed_map.size(), (int) m_seeds.size(),
433  (int) m_mkf_map.size(), (int) m_tracks.size()
434  );
435  }
436 
437  bool Shell::CheckMkFitLayerPlanVsReferenceHits(const Track &mkft, const Track &reft, const std::string &name) {
438  // Check if all hit-layers of a reference track reft are in the mkfit layer plan.
439  // Returns true if all layers are in the plan.
440  // String name is printed in front of label, expected to be SIMK or CKF.
441  const IterationConfig &itconf = Config::ItrInfo[m_it_index];
442  auto lp = itconf.m_steering_params[ mkft.getEtaRegion() ].m_layer_plan;
443  bool ret = true;
444  for (int hi = 0; hi < reft.nTotalHits(); ++hi) {
445  auto hot = reft.getHitOnTrack(hi);
446  if (std::find_if(lp.begin(), lp.end(), [=](auto &x){ return x.m_layer == hot.layer; }) == lp.end())
447  {
448  printf("CheckMkfLayerPlanVsCkfHits: layer %d not in layer plan for region %d, %s label=%d\n",
449  hot.layer, mkft.getEtaRegion(), name.c_str(), reft.label());
450  ret = false;
451  }
452  }
453  return ret;
454  }
455 
456  //===========================================================================
457  // Analysis drivers / main functions / Comparators
458  //===========================================================================
459 
460  void Shell::Compare() {
461  Event &ev = *m_event;
462  const IterationConfig &itconf = Config::ItrInfo[m_it_index];
463 
465 
466  printf("------------------------------------------------------\n");
467 
468  const bool print_all_def = false;
469  int mkf_cnt=0, less_hits=0, more_hits=0;
470 
471  // TOBTEC: look for rec-seeds with hits in tob1 and 2 only.
472  int tot_cnt = 0, no_mkf_cnt = 0;
473 
474  for (auto& [l, simt_ptr]: m_sim_map)
475  {
476  auto &simt = * simt_ptr;
477  auto &ckft = * m_ckf_map[l];
478  auto mi = m_mkf_map.find(l);
479 
480  bool print_all = print_all_def;
481 
482  // TOBTEC: look for rec-seeds with hits in tob1 and 2 only.
483  bool select = true;
484  {
485  auto &ckf_seed = ev.seedTracks_[ckft.label()];
486  for (int hi = 0; hi < ckf_seed.nTotalHits(); ++hi) {
487  const HitOnTrack hot = ckf_seed.getHitOnTrack(hi);
488  if (hot.index >= 0 && (hot.layer < 10 || hot.layer > 13)) {
489  select = false;
490  break;
491  }
492  }
493  }
494  if ( ! select) continue;
495 
496  ++tot_cnt;
497  //print_all = true;
498 
499  if (mi != m_mkf_map.end())
500  {
501  auto &mkft = * mi->second;
502  mkf_cnt++;
503  if (mkft.nFoundHits() < ckft.nFoundHits()) ++less_hits;
504  if (mkft.nFoundHits() > ckft.nFoundHits()) ++more_hits;
505 
506  CheckMkFitLayerPlanVsReferenceHits(mkft, ckft, "CKF");
507  // CheckMkFitLayerPlanVsReferenceHits(mkft, simt, "SIM");
508 
509  (void) print_all;
510  if (/* itconf.m_track_algorithm == 10 ||*/ print_all) {
511  // ckf label is wrong when validation is on (even quality val) for mixedTriplet, pixelless and tobtec
512  // as seed tracks get removed for non-mkfit iterations and indices from rec-tracks are no longer valid.
513  auto &ckf_seed = ev.seedTracks_[ckft.label()];
514  auto &mkf_seed = m_seeds[mkft.label()];
515  print("ckf ", 0, ckft, ev);
516  print("mkfit", 0, mkft, ev);
517  print("sim ", 0, simt, ev);
518  print("ckf seed", 0, ckf_seed, ev);
519  print("mkf seed", 0, mkf_seed, ev);
520  printf("------------------------------------------------------\n");
521 
522  TrackVec ssss;
523  ssss.push_back(mkf_seed);
524 
525  IterationSeedPartition pppp(1);
526  IterationConfig::get_seed_partitioner("phase1:1:debug")(Config::TrkInfo, ssss, *m_eoh, pppp);
527 
528  printf("------------------------------------------------------\n");
529  printf("\n");
530  }
531  }
532  else
533  {
534  printf("\n!!!!! No mkfit track with this label.\n\n");
535  ++no_mkf_cnt;
536 
537  auto &ckf_seed = ev.seedTracks_[ckft.label()];
538  print("ckf ", 0, ckft, ev);
539  print("sim ", 0, simt, ev);
540  print("ckf seed", 0, ckf_seed, ev);
541  auto smi = m_seed_map.find(l);
542  if (smi != m_seed_map.end())
543  print("seed with matching label", 0, *smi->second, ev);
544  printf("------------------------------------------------------\n");
545  }
546  }
547 
548  printf("mkFit found %d, matching_label=%d, less_hits=%d, more_hits=%d [algo=%d (%s)]\n",
549  (int) ev.fitTracks_.size(), mkf_cnt, less_hits, more_hits,
551 
552  if (tot_cnt > 0) {
553  printf("\ntobtec tob1/2 tot=%d no_mkf=%d (%f%%)\n",
554  tot_cnt, no_mkf_cnt, 100.0 * no_mkf_cnt / tot_cnt);
555  } else {
556  printf("\nNo CKF tracks with seed hits in TOB1/2 found (need iteration idx 8, TobTec?)\n");
557  }
558 
559  printf("-------------------------------------------------------------------------------------------\n");
560  printf("-------------------------------------------------------------------------------------------\n");
561  printf("\n");
562  }
563 
564 }
std::map< int, Track * > m_sim_map
Definition: Shell.h:77
void ProcessEvent(SeedSelect_e seed_select=SS_UseAll, int selected_seed=-1, int count=1)
Definition: Shell.cc:121
const EventOfCombCandidates & ref_eocc() const
Definition: MkBuilder.h:74
Shell(std::vector< DeadVec > &dv, const std::string &in_file, int start_ev)
Definition: Shell.cc:40
TrackVec m_seeds
Definition: Shell.h:71
void rewind()
Definition: Event.cc:1014
int openRead(const std::string &fname, int expected_n_layers)
Definition: Event.cc:926
const BeamSpot & refBeamSpot() const
void reset(int evtID)
Definition: Event.cc:33
void PrintIterations()
Definition: Shell.cc:314
ret
prodAgent to be discontinued
bool m_remove_duplicates
Definition: Shell.h:69
DataFile * m_data_file
Definition: Shell.h:61
void compactifyHitStorageForBestCand(bool remove_seed_hits, int backward_fit_min_hits)
Definition: MkBuilder.h:63
def replace(string, replacements)
int label() const
Definition: Track.h:174
TrackVec seedTracks_
Definition: Event.h:74
void findTracksCloneEngine(SteeringParams::IterationType_e iteration_dir=SteeringParams::IT_FwdSearch)
Definition: MkBuilder.cc:948
int evtID() const
Definition: Event.h:23
std::map< int, Track * > m_mkf_map
Definition: Shell.h:77
bool CheckMkFitLayerPlanVsReferenceHits(const Track &mkft, const Track &reft, const std::string &name)
Definition: Shell.cc:437
bool m_clean_seeds
Definition: Shell.h:67
void SetDebug(bool b)
Definition: Shell.cc:325
void begin_event(MkJob *job, Event *ev, const char *build_type)
Definition: MkBuilder.cc:206
void resetCurrentSeedTracks()
Definition: Event.cc:917
void Status()
Definition: Shell.cc:74
clean_seeds_func m_seed_cleaner
void SelectIterationIndex(int itidx)
Definition: Shell.cc:295
TEMPL(T2) struct Divides void
Definition: Factorize.h:24
EventOfHits * eoh()
Definition: Shell.h:40
void Run()
Definition: Shell.cc:55
char const * label
MkBuilder * m_builder
Definition: Shell.h:64
std::vector< DeadVec > & m_deadvectors
Definition: Shell.h:60
void loadHitsAndBeamSpot(Event &ev, EventOfHits &eoh)
void FillByLabelMaps_CkfBase()
Definition: Shell.cc:372
void skipNEvents(int n_to_skip)
Definition: Event.cc:1041
std::function< filter_candidates_cf > filter_candidates_func
Definition: FunctionTypes.h:28
EventOfHits * m_eoh
Definition: Shell.h:63
bool g_debug
Definition: Debug.cc:2
void find_tracks_load_seeds(const TrackVec &in_seeds, const bool seeds_sorted)
Definition: MkBuilder.cc:621
Definition: EPCuts.h:4
void setCurrentSeedTracks(const TrackVec &seeds)
Definition: Event.cc:868
const TrackVec & seeds() const
Definition: Shell.h:43
static partition_seeds_func get_seed_partitioner(const std::string &name)
void SetCleanSeeds(bool b)
Definition: Shell.cc:326
void GoToEvent(int eid)
Definition: Shell.cc:87
bool m_backward_fit
Definition: Shell.h:68
TrackerInfo TrkInfo
void loadDeads(EventOfHits &eoh, const std::vector< DeadVec > &deadvectors)
Definition: MkStdSeqs.cc:21
void seed_post_cleaning(TrackVec &tv)
Definition: MkBuilder.cc:419
void SetRemoveDuplicates(bool b)
Definition: Shell.cc:328
void fill_hitmask_bool_vectors(int track_algo, std::vector< std::vector< bool >> &layer_masks)
Definition: Event.cc:822
MCHitInfoVec simHitsInfo_
Definition: Event.h:72
IterationsInfo ItrInfo
MkBuilder * builder()
Definition: Shell.h:41
int filter_comb_cands(filter_candidates_func filter, bool attempt_all_cands)
Definition: MkBuilder.cc:313
void NextEvent(int skip=1)
Definition: Shell.cc:117
std::vector< HitVec > layerHits_
Definition: Event.h:70
static const char * algoint_to_cstr(int algo)
Definition: Track.cc:331
TrackVec m_tracks
Definition: Shell.h:72
filter_candidates_func m_post_bkfit_filter
std::vector< Track > TrackVec
int getEtaRegion() const
Definition: Track.h:263
clean_duplicates_func m_duplicate_cleaner
void beginBkwSearch()
Definition: MkBuilder.h:67
void print(std::string_view label, const MeasurementState &s)
Definition: Hit.cc:8
double b
Definition: hdecay.h:120
int nTotalHits() const
Definition: Track.h:512
void export_best_comb_cands(TrackVec &out_vec, bool remove_missing_hits=false)
Definition: MkBuilder.cc:396
Event * m_event
Definition: Shell.h:62
void SetBackwardFit(bool b)
Definition: Shell.cc:327
int m_it_index
Definition: Shell.h:66
float x
int LabelFromHits(Track &t, bool replace, float good_frac)
Definition: Shell.cc:345
void endBkwSearch()
Definition: MkBuilder.h:68
void Compare()
Definition: Shell.cc:460
void SetUseDeadModules(bool b)
Definition: Shell.cc:329
std::vector< std::vector< bool > > m_mask_vector
void SelectIterationAlgo(int algo)
Definition: Shell.cc:303
filter_candidates_func m_pre_bkfit_filter
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
std::map< int, Track * > m_ckf_map
Definition: Shell.h:77
std::vector< SteeringParams > m_steering_params
int m_evs_in_file
Definition: Shell.h:65
SeedSelect_e
Definition: Shell.h:18
std::map< int, Track * > m_seed_map
Definition: Shell.h:77
void read_in(DataFile &data_file, FILE *in_fp=0)
Definition: Event.cc:207
def exit(msg="")
HitOnTrack getHitOnTrack(int posHitIdx) const
Definition: Track.h:448