File indexing completed on 2023-10-25 10:02:29
0001 #include "RecoTracker/MkFitCMS/interface/runFunctions.h"
0002 #include "RecoTracker/MkFitCore/interface/MkBuilder.h"
0003 #include "RecoTracker/MkFitCMS/interface/MkStdSeqs.h"
0004
0005 #include "oneapi/tbb/parallel_for.h"
0006
0007 #include <memory>
0008
0009 namespace mkfit {
0010
0011
0012
0013
0014
0015
0016
0017 struct IterationMaskIfcCmssw : public IterationMaskIfcBase {
0018 const TrackerInfo &m_trk_info;
0019 const std::vector<const std::vector<bool> *> &m_mask_vector;
0020
0021 IterationMaskIfcCmssw(const TrackerInfo &ti, const std::vector<const std::vector<bool> *> &maskvec)
0022 : m_trk_info(ti), m_mask_vector(maskvec) {}
0023
0024 const std::vector<bool> *get_mask_for_layer(int layer) const override {
0025 return m_trk_info.layer(layer).is_pixel() ? m_mask_vector[0] : m_mask_vector[1];
0026 }
0027 };
0028
0029 void run_OneIteration(const TrackerInfo &trackerInfo,
0030 const IterationConfig &itconf,
0031 const EventOfHits &eoh,
0032 const std::vector<const std::vector<bool> *> &hit_masks,
0033 MkBuilder &builder,
0034 TrackVec &seeds,
0035 TrackVec &out_tracks,
0036 bool do_seed_clean,
0037 bool do_backward_fit,
0038 bool do_remove_duplicates) {
0039 IterationMaskIfcCmssw it_mask_ifc(trackerInfo, hit_masks);
0040
0041 MkJob job({trackerInfo, itconf, eoh, eoh.refBeamSpot(), &it_mask_ifc});
0042
0043 builder.begin_event(&job, nullptr, __func__);
0044
0045
0046 do_seed_clean = do_seed_clean && itconf.m_seed_cleaner;
0047
0048 if (do_seed_clean)
0049 itconf.m_seed_cleaner(seeds, itconf, eoh.refBeamSpot());
0050
0051
0052
0053 builder.seed_post_cleaning(seeds);
0054
0055 if (itconf.m_requires_seed_hit_sorting) {
0056 for (auto &s : seeds)
0057 s.sortHitsByLayer();
0058 }
0059
0060 builder.find_tracks_load_seeds(seeds, do_seed_clean);
0061
0062 builder.findTracksCloneEngine();
0063
0064
0065 filter_candidates_func pre_filter;
0066 if (do_backward_fit && itconf.m_pre_bkfit_filter)
0067 pre_filter = [&](const TrackCand &tc, const MkJob &jb) -> bool {
0068 return itconf.m_pre_bkfit_filter(tc, jb) && StdSeq::qfilter_nan_n_silly<TrackCand>(tc, jb);
0069 };
0070 else if (itconf.m_pre_bkfit_filter)
0071 pre_filter = itconf.m_pre_bkfit_filter;
0072 else if (do_backward_fit)
0073 pre_filter = StdSeq::qfilter_nan_n_silly<TrackCand>;
0074
0075 if (pre_filter)
0076 builder.filter_comb_cands(pre_filter, true);
0077
0078 job.switch_to_backward();
0079
0080 if (do_backward_fit) {
0081 if (itconf.m_backward_search) {
0082 builder.compactifyHitStorageForBestCand(itconf.m_backward_drop_seed_hits, itconf.m_backward_fit_min_hits);
0083 }
0084
0085 builder.backwardFit();
0086
0087 if (itconf.m_backward_search) {
0088 builder.beginBkwSearch();
0089 builder.findTracksCloneEngine(SteeringParams::IT_BkwSearch);
0090 }
0091 }
0092
0093
0094 filter_candidates_func post_filter;
0095 if (do_backward_fit && itconf.m_post_bkfit_filter)
0096 post_filter = [&](const TrackCand &tc, const MkJob &jb) -> bool {
0097 return itconf.m_post_bkfit_filter(tc, jb) && StdSeq::qfilter_nan_n_silly<TrackCand>(tc, jb);
0098 };
0099 else
0100 post_filter = StdSeq::qfilter_nan_n_silly<TrackCand>;
0101
0102 builder.filter_comb_cands(post_filter, true);
0103
0104 if (do_backward_fit && itconf.m_backward_search)
0105 builder.endBkwSearch();
0106
0107 builder.export_best_comb_cands(out_tracks, true);
0108
0109 if (do_remove_duplicates && itconf.m_duplicate_cleaner) {
0110 itconf.m_duplicate_cleaner(out_tracks, itconf);
0111 }
0112
0113 builder.end_event();
0114 builder.release_memory();
0115 }
0116
0117 }