File indexing completed on 2024-09-07 04:36:59
0001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0002
0003 #include "L1Trigger/L1TMuonEndCapPhase2/interface/EMTFContext.h"
0004 #include "L1Trigger/L1TMuonEndCapPhase2/interface/Utils/DataUtils.h"
0005 #include "L1Trigger/L1TMuonEndCapPhase2/interface/Utils/DebugUtils.h"
0006
0007 #include "L1Trigger/L1TMuonEndCapPhase2/interface/Algo/DuplicateRemovalLayer.h"
0008
0009 using namespace emtf::phase2;
0010 using namespace emtf::phase2::algo;
0011
0012 DuplicateRemovalLayer::DuplicateRemovalLayer(const EMTFContext& context) : context_(context) {}
0013
0014 void DuplicateRemovalLayer::apply(std::vector<track_t>& tracks) const {
0015
0016
0017
0018 const auto& model = context_.model_;
0019 const auto& model_reduced_sites = model.reduced_sites_;
0020
0021
0022
0023
0024 std::vector<reduced_track_t> reduced_tracks;
0025
0026 for (const auto& track : tracks) {
0027
0028 auto& rtrk = reduced_tracks.emplace_back();
0029 auto& rtrk_valid = rtrk.valid;
0030
0031
0032 rtrk_valid = track.valid;
0033
0034
0035 for (const auto& model_rsite : model_reduced_sites) {
0036
0037
0038 int model_rsite_id = static_cast<int>(model_rsite.id);
0039
0040 auto& rsite_seg = rtrk.site_segs[model_rsite_id];
0041 auto& rsite_bit = rtrk.site_mask[model_rsite_id];
0042
0043
0044 rsite_seg = 0;
0045 rsite_bit = 0;
0046
0047
0048 for (const auto& model_rs_ts : model_rsite.trk_sites) {
0049 int trk_site_id = static_cast<int>(model_rs_ts);
0050
0051 const auto& trk_site_seg = track.site_segs[trk_site_id];
0052 const auto& trk_site_bit = track.site_mask[trk_site_id];
0053
0054 if (trk_site_bit == 0) {
0055 continue;
0056 }
0057
0058
0059
0060
0061 rtrk_valid = 1;
0062 rsite_seg = trk_site_seg;
0063 rsite_bit = 1;
0064
0065 break;
0066 }
0067 }
0068 }
0069
0070
0071
0072
0073 for (unsigned int i_rtrk = 0; i_rtrk < reduced_tracks.size(); ++i_rtrk) {
0074
0075 auto& trk_i = tracks[i_rtrk];
0076 const auto& rtrk_i = reduced_tracks[i_rtrk];
0077
0078 if (rtrk_i.valid == 1) {
0079 for (unsigned int j_rtrk = (i_rtrk + 1); j_rtrk < reduced_tracks.size();
0080 ++j_rtrk) {
0081
0082 auto& rtrk_j = reduced_tracks[j_rtrk];
0083
0084
0085 if (rtrk_j.valid == 0)
0086 continue;
0087
0088
0089 for (unsigned int k_rsite = 0; k_rsite < v3::kNumTrackSitesRM; ++k_rsite) {
0090 const auto& rtrk_site_mask_ik = rtrk_i.site_mask[k_rsite];
0091 const auto& rtrk_site_mask_jk = rtrk_j.site_mask[k_rsite];
0092
0093
0094 if (!(rtrk_site_mask_ik & rtrk_site_mask_jk))
0095 continue;
0096
0097
0098 const auto& rtrk_seg_id_ik = rtrk_i.site_segs[k_rsite];
0099 const auto& rtrk_seg_id_jk = rtrk_j.site_segs[k_rsite];
0100
0101
0102 if (rtrk_seg_id_ik != rtrk_seg_id_jk)
0103 continue;
0104
0105
0106 rtrk_j.valid = 0;
0107 }
0108 }
0109 }
0110
0111
0112 trk_i.valid = rtrk_i.valid;
0113
0114
0115 if (this->context_.config_.verbosity_ > 1) {
0116 if (trk_i.valid) {
0117 edm::LogInfo("L1TEMTFpp") << "Unique Track"
0118 << " zone " << trk_i.zone << " col " << trk_i.col << " pat " << trk_i.pattern
0119 << " qual " << trk_i.quality << " phi " << trk_i.phi << " theta " << trk_i.theta
0120 << " valid " << trk_i.valid << std::endl;
0121 }
0122 }
0123 }
0124 }