Back to home page

Project CMSSW displayed by LXR

 
 

    


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