Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // run_OneIteration
0013   //
0014   // One-stop function for running track building from CMSSW.
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     // Seed cleaning not done on all iterations.
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     // Check nans in seeds -- this should not be needed when Slava fixes
0052     // the track parameter coordinate transformation.
0053     builder.seed_post_cleaning(seeds);
0054 
0055     if (itconf.m_requires_seed_hit_sorting) {
0056       for (auto &s : seeds)
0057         s.sortHitsByLayer();  // sort seed hits for the matched hits (I hope it works here)
0058     }
0059 
0060     builder.find_tracks_load_seeds(seeds, do_seed_clean);
0061 
0062     builder.findTracksCloneEngine();
0063 
0064     // Pre backward-fit filtering.
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     // pre_filter can be null if we are not doing backward fit as nan_n_silly will be run below.
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     // Post backward-fit filtering.
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     // post_filter is always at least doing nan_n_silly filter.
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 }  // end namespace mkfit