CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
MicroGMTConverter.cc
Go to the documentation of this file.
2 
4 
6 
7 void MicroGMTConverter::convert(const int global_event_BX,
8  const EMTFTrack& in_track,
9  l1t::RegionalMuonCand& out_cand) const {
11  int sector = in_track.Sector() - 1;
12 
13  out_cand.setHwPt(in_track.GMT_pt());
14  out_cand.setHwPtUnconstrained(in_track.GMT_pt_dxy());
15  out_cand.setHwDXY(in_track.GMT_dxy());
16  out_cand.setHwPhi(in_track.GMT_phi());
17  out_cand.setHwEta(in_track.GMT_eta());
18  out_cand.setHwSign(in_track.GMT_charge());
19  out_cand.setHwSignValid(in_track.GMT_charge_valid());
20  out_cand.setHwQual(in_track.GMT_quality());
21  out_cand.setHwHF(false); // EMTF: halo -> 1
22  out_cand.setTFIdentifiers(sector, tftype);
23 
24  const EMTFPtLUT& ptlut_data = in_track.PtLUT();
25 
26  // Form track sub addresses
27  int me1_ch_id =
28  (ptlut_data.bt_vi[0] == 0 && ptlut_data.bt_vi[1] != 0) ? ptlut_data.bt_ci[1] + 16 : ptlut_data.bt_ci[0];
29  int me2_ch_id = ptlut_data.bt_ci[2];
30  int me3_ch_id = ptlut_data.bt_ci[3];
31  int me4_ch_id = ptlut_data.bt_ci[4];
32 
33  int me1_seg_id = (ptlut_data.bt_vi[0] == 0 && ptlut_data.bt_vi[1] != 0) ? ptlut_data.bt_si[1] : ptlut_data.bt_si[0];
34  int me2_seg_id = ptlut_data.bt_si[2];
35  int me3_seg_id = ptlut_data.bt_si[3];
36  int me4_seg_id = ptlut_data.bt_si[4];
37 
38  auto get_gmt_chamber_me1 = [](int ch) {
39  int gmt_ch = 0;
40  if (ch == 10)
41  gmt_ch = 1;
42  else if (ch == 11)
43  gmt_ch = 2;
44  else if (ch == 12)
45  gmt_ch = 3;
46  else if (ch == 3 + 16)
47  gmt_ch = 4;
48  else if (ch == 6 + 16)
49  gmt_ch = 5;
50  else if (ch == 9 + 16)
51  gmt_ch = 6;
52  return gmt_ch;
53  };
54 
55  auto get_gmt_chamber = [](int ch) {
56  int gmt_ch = 0;
57  if (ch == 10)
58  gmt_ch = 1;
59  else if (ch == 11)
60  gmt_ch = 2;
61  else if (ch == 3)
62  gmt_ch = 3;
63  else if (ch == 9)
64  gmt_ch = 4;
65  return gmt_ch;
66  };
67 
68  // Truncate kBX to 11 bits and offset by 25 from global event BX in EMTF firmware
69  int EMTF_kBX = (abs(global_event_BX) % 2048) - 25 + in_track.BX();
70  if (EMTF_kBX < 0)
71  EMTF_kBX += 2048;
72 
74  out_cand.setTrackSubAddress(l1t::RegionalMuonCand::kME1Ch, get_gmt_chamber_me1(me1_ch_id));
76  out_cand.setTrackSubAddress(l1t::RegionalMuonCand::kME2Ch, get_gmt_chamber(me2_ch_id));
78  out_cand.setTrackSubAddress(l1t::RegionalMuonCand::kME3Ch, get_gmt_chamber(me3_ch_id));
80  out_cand.setTrackSubAddress(l1t::RegionalMuonCand::kME4Ch, get_gmt_chamber(me4_ch_id));
83 }
84 
86  const EMTFTrackCollection& in_tracks,
87  l1t::RegionalMuonCandBxCollection& out_cands) const {
88  int gmtMinBX = -2;
89  int gmtMaxBX = +2;
90 
91  out_cands.clear();
92  out_cands.setBXRange(gmtMinBX, gmtMaxBX);
93 
94  for (const auto& in_track : in_tracks) {
95  int bx = in_track.BX();
96 
97  if (gmtMinBX <= bx && bx <= gmtMaxBX) {
98  l1t::RegionalMuonCand out_cand;
99 
100  convert(iEvent.bunchCrossing(), in_track, out_cand);
101  out_cands.push_back(bx, out_cand);
102  }
103  }
104 
105  // Sort by processor to match uGMT unpacked order
106  emtf::sort_uGMT_muons(out_cands);
107 }
108 
109 namespace emtf {
110 
112  int minBX = cands.getFirstBX();
113  int maxBX = cands.getLastBX();
114  int emtfMinProc = 0; // ME+ sector 1
115  int emtfMaxProc = 11; // ME- sector 6
116 
117  // New collection, sorted by processor to match uGMT unpacked order
118  auto sortedCands = std::make_unique<l1t::RegionalMuonCandBxCollection>();
119  sortedCands->clear();
120  sortedCands->setBXRange(minBX, maxBX);
121  for (int iBX = minBX; iBX <= maxBX; ++iBX) {
122  for (int proc = emtfMinProc; proc <= emtfMaxProc; proc++) {
123  for (l1t::RegionalMuonCandBxCollection::const_iterator cand = cands.begin(iBX); cand != cands.end(iBX);
124  ++cand) {
125  int cand_proc = cand->processor();
126  if (cand->trackFinderType() == l1t::tftype::emtf_neg)
127  cand_proc += 6;
128  if (cand_proc != proc)
129  continue;
130  sortedCands->push_back(iBX, *cand);
131  }
132  }
133  }
134 
135  // Return sorted collection
136  std::swap(cands, *sortedCands);
137  sortedCands.reset();
138  }
139 
140 } // End namespace emtf
const_iterator end(int bx) const
l1t::EMTFTrackCollection EMTFTrackCollection
Definition: Common.h:27
int GMT_eta() const
Definition: EMTFTrack.h:197
void setHwPhi(int bits)
Set compressed relative phi as transmitted by hardware LSB = 2*pi/576 (8 bits)
uint16_t bt_si[5]
Definition: EMTFTrack.h:41
uint16_t bt_ci[5]
Definition: EMTFTrack.h:40
int Endcap() const
Definition: EMTFTrack.h:165
int GMT_dxy() const
Definition: EMTFTrack.h:195
void sort_uGMT_muons(l1t::RegionalMuonCandBxCollection &cands)
int Sector() const
Definition: EMTFTrack.h:166
uint16_t bt_vi[5]
Definition: EMTFTrack.h:38
int bunchCrossing() const
Definition: EventBase.h:64
int GMT_charge() const
Definition: EMTFTrack.h:199
int GMT_quality() const
Definition: EMTFTrack.h:198
void convert(const int global_event_BX, const EMTFTrack &in_track, l1t::RegionalMuonCand &out_cand) const
std::vector< RegionalMuonCand >::const_iterator const_iterator
Definition: BXVector.h:18
int iEvent
Definition: GenABIO.cc:224
void setTFIdentifiers(int processor, tftype trackFinder)
Set the processor ID, track-finder type. From these two, the link is set.
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
void setTrackSubAddress(bmtfAddress subAddress, int value)
Set a part of the muon candidates track address; specialised for BMTF.
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void setHwHF(bool bit)
Set HF (halo / fine eta) bit (EMTF: halo -&gt; 1; BMTF: fine eta -&gt; 1)
int Track_num() const
Definition: EMTFTrack.h:201
int GMT_phi() const
Definition: EMTFTrack.h:196
void setHwQual(int bits)
Set compressed quality code as transmitted by hardware (4 bits)
void setHwPt(int bits)
Set compressed pT as transmitted by hardware LSB = 0.5 (9 bits)
void setHwEta(int bits)
Set compressed eta as transmitted by hardware LSB = 0.010875 (9 bits)
void setHwDXY(int bits)
Set compressed impact parameter with respect to beamspot (4 bits)
int getFirstBX() const
void clear()
void setBXRange(int bxFirst, int bxLast)
void convert_all(const edm::Event &iEvent, const EMTFTrackCollection &in_tracks, l1t::RegionalMuonCandBxCollection &out_cands) const
int BX() const
Definition: EMTFTrack.h:177
int GMT_pt() const
Definition: EMTFTrack.h:193
int getLastBX() const
int GMT_pt_dxy() const
Definition: EMTFTrack.h:194
void setHwSignValid(int bits)
Set whether charge measurement is valid (0 for high pT muons)
int GMT_charge_valid() const
Definition: EMTFTrack.h:200
const_iterator begin(int bx) const
EMTFPtLUT PtLUT() const
Definition: EMTFTrack.h:129
void setHwPtUnconstrained(int bits)
Set compressed second displaced pT as transmitted by hardware LSB = 1.0 (8 bits)
void push_back(int bx, T object)
void setHwSign(int bits)
Set charge sign bit (charge = (-1)^(sign))