Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:20:59

0001 #include "L1Trigger/L1TMuonEndCap/interface/SectorProcessor.h"
0002 
0003 SectorProcessor::SectorProcessor() {}
0004 
0005 SectorProcessor::~SectorProcessor() {}
0006 
0007 void SectorProcessor::configure(const EMTFSetup* setup, int verbose, int endcap, int sector) {
0008   emtf_assert(setup != nullptr);
0009   emtf_assert(emtf::MIN_ENDCAP <= endcap && endcap <= emtf::MAX_ENDCAP);
0010   emtf_assert(emtf::MIN_TRIGSECTOR <= sector && sector <= emtf::MAX_TRIGSECTOR);
0011 
0012   setup_ = setup;
0013   verbose_ = verbose;
0014   endcap_ = endcap;
0015   sector_ = sector;
0016 }
0017 
0018 void SectorProcessor::process(const edm::EventID& event_id,
0019                               const TriggerPrimitiveCollection& muon_primitives,
0020                               EMTFHitCollection& out_hits,
0021                               EMTFTrackCollection& out_tracks) const {
0022   auto cfg = setup_->getVersionControl();
0023 
0024   // List of converted hits, extended from previous BXs
0025   // deque (double-ended queue) is similar to a vector, but allows insertion or deletion of elements at both beginning and end
0026   std::deque<EMTFHitCollection> extended_conv_hits;
0027 
0028   // List of best track candidates, extended from previous BXs
0029   std::deque<EMTFTrackCollection> extended_best_track_cands;
0030 
0031   // Map of pattern detector --> lifetime, tracked across BXs
0032   std::map<pattern_ref_t, int> patt_lifetime_map;
0033 
0034   // ___________________________________________________________________________
0035   // Run each sector processor for every BX, taking into account the BX window
0036 
0037   int delayBX = cfg.bxWindow_ - 1;
0038 
0039   for (int bx = cfg.minBX_; bx <= cfg.maxBX_ + delayBX; ++bx) {
0040     if (verbose_ > 0) {  // debug
0041       std::cout << "Event: " << event_id << " Endcap: " << endcap_ << " Sector: " << sector_ << " BX: " << bx
0042                 << std::endl;
0043     }
0044 
0045     process_single_bx(
0046         bx, muon_primitives, out_hits, out_tracks, extended_conv_hits, extended_best_track_cands, patt_lifetime_map);
0047 
0048     // Drop earliest BX outside of BX window
0049     if (bx >= cfg.minBX_ + delayBX) {
0050       extended_conv_hits.pop_front();
0051 
0052       int n = emtf::zone_array<int>().size();
0053       extended_best_track_cands.erase(extended_best_track_cands.end() - n,
0054                                       extended_best_track_cands.end());  // pop_back
0055     }
0056   }  // end loop over bx
0057 
0058   return;
0059 }
0060 
0061 void SectorProcessor::process_single_bx(int bx,
0062                                         const TriggerPrimitiveCollection& muon_primitives,
0063                                         EMTFHitCollection& out_hits,
0064                                         EMTFTrackCollection& out_tracks,
0065                                         std::deque<EMTFHitCollection>& extended_conv_hits,
0066                                         std::deque<EMTFTrackCollection>& extended_best_track_cands,
0067                                         std::map<pattern_ref_t, int>& patt_lifetime_map) const {
0068   auto cfg = setup_->getVersionControl();
0069 
0070   auto tp_geom_ = &(setup_->getGeometryTranslator());
0071   auto pc_lut_ = &(setup_->getSectorProcessorLUT());
0072   auto pt_assign_engine_ = setup_->getPtAssignmentEngine();
0073   auto pt_assign_engine_dxy_ = setup_->getPtAssignmentEngineDxy();
0074 
0075   // ___________________________________________________________________________
0076   // Configure
0077 
0078   PrimitiveSelection prim_sel;
0079   prim_sel.configure(verbose_,
0080                      endcap_,
0081                      sector_,
0082                      bx,
0083                      cfg.bxShiftCSC_,
0084                      cfg.bxShiftRPC_,
0085                      cfg.bxShiftGEM_,
0086                      cfg.bxShiftME0_,
0087                      cfg.includeNeighbor_,
0088                      cfg.duplicateTheta_,
0089                      cfg.bugME11Dupes_,
0090                      cfg.useRun3CCLUT_OTMB_,
0091                      cfg.useRun3CCLUT_TMB_);
0092 
0093   PrimitiveConversion prim_conv;
0094   prim_conv.configure(tp_geom_,
0095                       pc_lut_,
0096                       verbose_,
0097                       endcap_,
0098                       sector_,
0099                       bx,
0100                       cfg.bxShiftCSC_,
0101                       cfg.bxShiftRPC_,
0102                       cfg.bxShiftGEM_,
0103                       cfg.bxShiftME0_,
0104                       cfg.zoneBoundaries_,
0105                       cfg.zoneOverlap_,
0106                       cfg.duplicateTheta_,
0107                       cfg.fixZonePhi_,
0108                       cfg.useNewZones_,
0109                       cfg.fixME11Edges_,
0110                       cfg.bugME11Dupes_,
0111                       cfg.useRun3CCLUT_OTMB_,
0112                       cfg.useRun3CCLUT_TMB_);
0113 
0114   PatternRecognition patt_recog;
0115   patt_recog.configure(verbose_,
0116                        endcap_,
0117                        sector_,
0118                        bx,
0119                        cfg.bxWindow_,
0120                        cfg.pattDefinitions_,
0121                        cfg.symPattDefinitions_,
0122                        cfg.useSymPatterns_,
0123                        cfg.maxRoadsPerZone_,
0124                        cfg.useSecondEarliest_);
0125 
0126   PrimitiveMatching prim_match;
0127   prim_match.configure(
0128       verbose_, endcap_, sector_, bx, cfg.fixZonePhi_, cfg.useNewZones_, cfg.bugSt2PhDiff_, cfg.bugME11Dupes_);
0129 
0130   AngleCalculation angle_calc;
0131   angle_calc.configure(verbose_,
0132                        endcap_,
0133                        sector_,
0134                        bx,
0135                        cfg.bxWindow_,
0136                        cfg.thetaWindow_,
0137                        cfg.thetaWindowZone0_,
0138                        cfg.bugME11Dupes_,
0139                        cfg.bugAmbigThetaWin_,
0140                        cfg.twoStationSameBX_);
0141 
0142   BestTrackSelection btrack_sel;
0143   btrack_sel.configure(verbose_,
0144                        endcap_,
0145                        sector_,
0146                        bx,
0147                        cfg.bxWindow_,
0148                        cfg.maxRoadsPerZone_,
0149                        cfg.maxTracks_,
0150                        cfg.useSecondEarliest_,
0151                        cfg.bugSameSectorPt0_);
0152 
0153   SingleHitTrack single_hit;
0154   single_hit.configure(verbose_, endcap_, sector_, bx, cfg.maxTracks_, cfg.useSingleHits_);
0155 
0156   PtAssignment pt_assign;
0157   pt_assign.configure(pt_assign_engine_,
0158                       pt_assign_engine_dxy_,
0159                       verbose_,
0160                       endcap_,
0161                       sector_,
0162                       bx,
0163                       cfg.readPtLUTFile_,
0164                       cfg.fixMode15HighPt_,
0165                       cfg.bug9BitDPhi_,
0166                       cfg.bugMode7CLCT_,
0167                       cfg.bugNegPt_,
0168                       cfg.bugGMTPhi_,
0169                       cfg.promoteMode7_,
0170                       cfg.modeQualVer_,
0171                       cfg.pbFileName_);
0172 
0173   std::map<int, TriggerPrimitiveCollection> selected_dt_map;
0174   std::map<int, TriggerPrimitiveCollection> selected_csc_map;
0175   std::map<int, TriggerPrimitiveCollection> selected_rpc_map;
0176   std::map<int, TriggerPrimitiveCollection> selected_gem_map;
0177   std::map<int, TriggerPrimitiveCollection> selected_me0_map;
0178   std::map<int, TriggerPrimitiveCollection> selected_prim_map;
0179   std::map<int, TriggerPrimitiveCollection> inclusive_selected_prim_map;
0180 
0181   EMTFHitCollection conv_hits;  // "converted" hits converted by primitive converter
0182   EMTFHitCollection inclusive_conv_hits;
0183 
0184   emtf::zone_array<EMTFRoadCollection> zone_roads;  // each zone has its road collection
0185 
0186   emtf::zone_array<EMTFTrackCollection> zone_tracks;  // each zone has its track collection
0187 
0188   EMTFTrackCollection best_tracks;  // "best" tracks selected from all the zones
0189 
0190   // ___________________________________________________________________________
0191   // Process
0192 
0193   // Select muon primitives that belong to this sector and this BX.
0194   // Put them into maps with an index that roughly corresponds to
0195   // each input link.
0196   // From src/PrimitiveSelection.cc
0197   prim_sel.process(emtf::DTTag(), muon_primitives, selected_dt_map);
0198   prim_sel.process(emtf::CSCTag(), muon_primitives, selected_csc_map);
0199   prim_sel.process(emtf::RPCTag(), muon_primitives, selected_rpc_map);
0200   prim_sel.process(emtf::GEMTag(), muon_primitives, selected_gem_map);
0201   prim_sel.process(emtf::ME0Tag(), muon_primitives, selected_me0_map);
0202   prim_sel.merge(
0203       selected_dt_map, selected_csc_map, selected_rpc_map, selected_gem_map, selected_me0_map, selected_prim_map);
0204 
0205   // Convert trigger primitives into "converted" hits
0206   // A converted hit consists of integer representations of phi, theta, and zones
0207   // From src/PrimitiveConversion.cc
0208   prim_conv.process(selected_prim_map, conv_hits);
0209   extended_conv_hits.push_back(conv_hits);
0210 
0211   {
0212     // Keep all the converted hits for the use of data-emulator comparisons.
0213     // They include the extra ones that are not used in track building and the subsequent steps.
0214     prim_sel.merge_no_truncate(selected_dt_map,
0215                                selected_csc_map,
0216                                selected_rpc_map,
0217                                selected_gem_map,
0218                                selected_me0_map,
0219                                inclusive_selected_prim_map);
0220     prim_conv.process(inclusive_selected_prim_map, inclusive_conv_hits);
0221 
0222     // Clear the input maps to save memory
0223     selected_dt_map.clear();
0224     selected_csc_map.clear();
0225     selected_rpc_map.clear();
0226     selected_gem_map.clear();
0227     selected_me0_map.clear();
0228   }
0229 
0230   // Detect patterns in all zones, find 3 best roads in each zone
0231   // From src/PatternRecognition.cc
0232   patt_recog.process(extended_conv_hits, patt_lifetime_map, zone_roads);
0233 
0234   // Match the trigger primitives to the roads, create tracks
0235   // From src/PrimitiveMatching.cc
0236   prim_match.process(extended_conv_hits, zone_roads, zone_tracks);
0237 
0238   // Calculate deflection angles for each track and fill track variables
0239   // From src/AngleCalculation.cc
0240   angle_calc.process(zone_tracks);
0241   extended_best_track_cands.insert(
0242       extended_best_track_cands.begin(), zone_tracks.begin(), zone_tracks.end());  // push_front
0243 
0244   // Select 3 "best" tracks from all the zones
0245   // From src/BestTrackSelection.cc
0246   btrack_sel.process(extended_best_track_cands, best_tracks);
0247 
0248   // Insert single LCTs from station 1 as tracks
0249   // From src/SingleHitTracks.cc
0250   single_hit.process(conv_hits, best_tracks);
0251 
0252   // Construct pT address, assign pT, calculate other GMT quantities
0253   // From src/PtAssignment.cc
0254   pt_assign.process(best_tracks);
0255 
0256   // ___________________________________________________________________________
0257   // Output
0258 
0259   out_hits.insert(out_hits.end(), inclusive_conv_hits.begin(), inclusive_conv_hits.end());
0260   out_tracks.insert(out_tracks.end(), best_tracks.begin(), best_tracks.end());
0261 
0262   return;
0263 }