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