CMS 3D CMS Logo

RegionalMuonRawDigiTranslator.cc
Go to the documentation of this file.
3 
5  const uint32_t raw_data_00_31,
6  const uint32_t raw_data_32_63,
7  const int proc,
8  const tftype tf,
9  const bool isKbmtf,
10  const bool useOmtfDisplacementInfo,
11  const bool useEmtfDisplacementInfo) {
12  // translations as defined in DN-15-017
13  mu.setHwPt((raw_data_00_31 >> ptShift_) & ptMask_);
14  mu.setHwQual((raw_data_00_31 >> qualShift_) & qualMask_);
15 
16  // eta is coded as two's complement
17  int abs_eta = (raw_data_00_31 >> absEtaShift_) & absEtaMask_;
18  if ((raw_data_00_31 >> etaSignShift_) & 0x1) {
19  mu.setHwEta(abs_eta - (1 << (etaSignShift_ - absEtaShift_)));
20  } else {
21  mu.setHwEta(abs_eta);
22  }
23 
24  // phi is coded as two's complement
25  int abs_phi = (raw_data_00_31 >> absPhiShift_) & absPhiMask_;
26  if ((raw_data_00_31 >> phiSignShift_) & 0x1) {
27  mu.setHwPhi(abs_phi - (1 << (phiSignShift_ - absPhiShift_)));
28  } else {
29  mu.setHwPhi(abs_phi);
30  }
31 
32  // sign is coded as -1^signBit
33  mu.setHwSign((raw_data_32_63 >> signShift_) & 0x1);
34  mu.setHwSignValid((raw_data_32_63 >> signValidShift_) & 0x1);
35  mu.setHwHF((raw_data_00_31 >> hfShift_) & hfMask_);
36 
37  // set track address with subaddresses
38  int rawTrackAddress = (raw_data_32_63 >> trackAddressShift_) & trackAddressMask_;
39  if (tf == bmtf) {
40  int detSide = (rawTrackAddress >> bmtfTrAddrDetSideShift_) & 0x1;
41  int wheelNum = (rawTrackAddress >> bmtfTrAddrWheelShift_) & bmtfTrAddrWheelMask_;
42  int statAddr1 = ((rawTrackAddress >> bmtfTrAddrStat1Shift_) & bmtfTrAddrStat1Mask_);
43  int statAddr2 = ((rawTrackAddress >> bmtfTrAddrStat2Shift_) & bmtfTrAddrStat2Mask_);
44  int statAddr3 = ((rawTrackAddress >> bmtfTrAddrStat3Shift_) & bmtfTrAddrStat3Mask_);
45  int statAddr4 = ((rawTrackAddress >> bmtfTrAddrStat4Shift_) & bmtfTrAddrStat4Mask_);
46 
47  mu.setTrackSubAddress(RegionalMuonCand::kWheelSide, detSide);
48  mu.setTrackSubAddress(RegionalMuonCand::kWheelNum, wheelNum);
49  if (!isKbmtf) { // The Run-2 standard configuration for BMTF
50  mu.setTrackSubAddress(RegionalMuonCand::kStat1, statAddr1);
51  mu.setTrackSubAddress(RegionalMuonCand::kStat2, statAddr2);
52  mu.setTrackSubAddress(RegionalMuonCand::kStat3, statAddr3);
53  mu.setTrackSubAddress(RegionalMuonCand::kStat4, statAddr4);
54  } else {
55  // For Run-3 track address encoding has changed as the Kalman Filter tracks from outside in.
56  // As a result station assignment is inverted
57  // (i.e. the field that contained the station 1 information for Run-2 now contains station 4 information and so on.)
58  mu.setTrackSubAddress(RegionalMuonCand::kStat1, statAddr4);
59  mu.setTrackSubAddress(RegionalMuonCand::kStat2, statAddr3);
60  mu.setTrackSubAddress(RegionalMuonCand::kStat3, statAddr2);
61  mu.setTrackSubAddress(RegionalMuonCand::kStat4, statAddr1);
62  // Additionally we now have displacement information from the BMTF
63  mu.setHwPtUnconstrained((raw_data_32_63 >> bmtfPtUnconstrainedShift_) & ptUnconstrainedMask_);
64  mu.setHwDXY((raw_data_32_63 >> bmtfDxyShift_) & dxyMask_);
65  }
66  mu.setTrackSubAddress(RegionalMuonCand::kSegSelStat1, 0);
67  mu.setTrackSubAddress(RegionalMuonCand::kSegSelStat2, 0);
68  mu.setTrackSubAddress(RegionalMuonCand::kSegSelStat3, 0);
69  mu.setTrackSubAddress(RegionalMuonCand::kSegSelStat4, 0);
70  //mu.setTrackSubAddress(RegionalMuonCand::kNumBmtfSubAddr, 0);
71  } else if (tf == emtf_neg || tf == emtf_pos) {
72  mu.setTrackSubAddress(RegionalMuonCand::kME1Seg, (rawTrackAddress >> emtfTrAddrMe1SegShift_) & 0x1);
73  mu.setTrackSubAddress(RegionalMuonCand::kME1Ch, (rawTrackAddress >> emtfTrAddrMe1ChShift_) & emtfTrAddrMe1ChMask_);
74  mu.setTrackSubAddress(RegionalMuonCand::kME2Seg, (rawTrackAddress >> emtfTrAddrMe2SegShift_) & 0x1);
75  mu.setTrackSubAddress(RegionalMuonCand::kME2Ch, (rawTrackAddress >> emtfTrAddrMe2ChShift_) & emtfTrAddrMe2ChMask_);
76  mu.setTrackSubAddress(RegionalMuonCand::kME3Seg, (rawTrackAddress >> emtfTrAddrMe3SegShift_) & 0x1);
77  mu.setTrackSubAddress(RegionalMuonCand::kME3Ch, (rawTrackAddress >> emtfTrAddrMe3ChShift_) & emtfTrAddrMe3ChMask_);
78  mu.setTrackSubAddress(RegionalMuonCand::kME4Seg, (rawTrackAddress >> emtfTrAddrMe4SegShift_) & 0x1);
79  mu.setTrackSubAddress(RegionalMuonCand::kME4Ch, (rawTrackAddress >> emtfTrAddrMe4ChShift_) & emtfTrAddrMe4ChMask_);
80  if (useEmtfDisplacementInfo) { // In Run-3 we receive displaced muon information from EMTF
81  mu.setHwPtUnconstrained((raw_data_32_63 >> emtfPtUnconstrainedShift_) & ptUnconstrainedMask_);
82  mu.setHwDXY((raw_data_32_63 >> emtfDxyShift_) & dxyMask_);
83  mu.setTrackSubAddress(RegionalMuonCand::kTrkNum, 0);
84  mu.setTrackSubAddress(RegionalMuonCand::kBX, 0);
85  } else {
86  mu.setTrackSubAddress(RegionalMuonCand::kTrkNum,
87  (rawTrackAddress >> emtfTrAddrTrkNumShift_) & emtfTrAddrTrkNumMask_);
88  mu.setTrackSubAddress(RegionalMuonCand::kBX, (rawTrackAddress >> emtfTrAddrBxShift_) & emtfTrAddrBxMask_);
89  }
90  } else if (tf == omtf_neg || tf == omtf_pos) {
91  if (useOmtfDisplacementInfo) { // In Run-3 2024 we receive displaced muon information from OMTF
92  mu.setHwPtUnconstrained((raw_data_32_63 >> kOmtfPtUnconstrainedShift_) & ptUnconstrainedMask_);
93  } else {
94  mu.setTrackSubAddress(RegionalMuonCand::kLayers,
95  (rawTrackAddress >> omtfTrAddrLayersShift_) & omtfTrAddrLayersMask_);
96  mu.setTrackSubAddress(RegionalMuonCand::kZero, 0);
97  mu.setTrackSubAddress(RegionalMuonCand::kWeight,
98  (rawTrackAddress >> omtfTrAddrWeightShift_) & omtfTrAddrWeightMask_);
99  }
100  } else {
101  std::map<int, int> trackAddr;
102  trackAddr[0] = rawTrackAddress;
103  mu.setTrackAddress(trackAddr);
104  }
105 
106  mu.setTFIdentifiers(proc, tf);
107  mu.setDataword(raw_data_32_63, raw_data_00_31);
108 }
109 
111  const uint64_t dataword,
112  const int proc,
113  const tftype tf,
114  const bool isKbmtf,
115  const bool useOmtfDisplacementInfo,
116  const bool useEmtfDisplacementInfo) {
117  fillRegionalMuonCand(mu,
118  (uint32_t)(dataword & 0xFFFFFFFF),
119  (uint32_t)((dataword >> 32) & 0xFFFFFFFF),
120  proc,
121  tf,
122  isKbmtf,
123  useOmtfDisplacementInfo,
124  useEmtfDisplacementInfo);
125 }
126 
128  const std::vector<uint32_t> bxPayload,
129  const int proc,
130  const tftype tf,
131  const bool useEmtfNominalTightShowers,
132  const bool useEmtfLooseShowers) {
133  muShower.setTFIdentifiers(proc, tf);
134  bool showerValid{false};
135  if (useEmtfNominalTightShowers && (tf == emtf_pos || tf == emtf_neg)) {
136  muShower.setOneNominalInTime(((bxPayload[kEmtfShowerStandardFrame] >> kEmtfShowerOneNominalShift) & 1) == 1);
137  muShower.setOneTightInTime(((bxPayload[kEmtfShowerStandardFrame] >> kEmtfShowerOneTightShift) & 1) == 1);
138 
139  showerValid = muShower.isValid();
140  }
141  if (useEmtfLooseShowers && (tf == emtf_pos || tf == emtf_neg)) {
142  muShower.setOneLooseInTime(((bxPayload[kEmtfShowerExtendedFrame] >> kEmtfShowerOneLooseShift) & 1) == 1);
143 
144  showerValid = muShower.isValid();
145  }
146  return showerValid;
147 }
148 
150  std::array<uint32_t, 6>& payload,
151  const bool useEmtfNominalTightShowers,
152  const bool useEmtfLooseShowers) {
153  if (!useEmtfNominalTightShowers || !useEmtfLooseShowers || !shower.isValid()) {
154  return;
155  }
156  // First we check whether we're going to overwrite something in the payload.
157  if ((((payload.at(kEmtfShowerStandardFrame) >> kEmtfShowerOneNominalShift) & kEmtfShowerMask) != 0) ||
158  (((payload.at(kEmtfShowerStandardFrame) >> kEmtfShowerOneTightShift) & kEmtfShowerMask) != 0) ||
159  (((payload.at(kEmtfShowerExtendedFrame) >> kEmtfShowerOneLooseShift) & kEmtfShowerMask) != 0)) {
160  edm::LogError("L1T") << "Check constants for RegionalMuonShower fields! It looks like we're in danger of "
161  "overwriting muon data in the packer! StandardFrame is "
162  << payload.at(kEmtfShowerStandardFrame) << ", ExtendedFrame is "
163  << payload.at(kEmtfShowerExtendedFrame);
164  return;
165  }
166  payload.at(kEmtfShowerStandardFrame) |= (shower.isOneNominalInTime() & 1) << kEmtfShowerOneNominalShift |
167  (shower.isOneTightInTime() & 1) << kEmtfShowerOneTightShift;
168  payload.at(kEmtfShowerExtendedFrame) |= (shower.isOneNominalOutOfTime() & 1) << kEmtfShowerOneNominalShift |
169  (shower.isOneTightOutOfTime() & 1) << kEmtfShowerOneTightShift;
170 }
171 
173  uint32_t& raw_data_00_31,
174  uint32_t& raw_data_32_63,
175  const bool isKbmtf,
176  const bool useOmtfDisplacementInfo,
177  const bool useEmtfDisplacementInfo) {
178  int abs_eta = mu.hwEta();
179  if (abs_eta < 0) {
180  abs_eta += (1 << (etaSignShift_ - absEtaShift_));
181  }
182  int abs_phi = mu.hwPhi();
183  if (abs_phi < 0) {
184  abs_phi += (1 << (phiSignShift_ - absPhiShift_));
185  }
186  raw_data_00_31 = (mu.hwPt() & ptMask_) << ptShift_ | (mu.hwQual() & qualMask_) << qualShift_ |
187  (abs_eta & absEtaMask_) << absEtaShift_ | (mu.hwEta() < 0) << etaSignShift_ |
188  (mu.hwHF() & hfMask_) << hfShift_ | (abs_phi & absPhiMask_) << absPhiShift_ |
189  (mu.hwPhi() < 0) << phiSignShift_;
190 
191  // generate the raw track address from the subaddresses
192  int rawTrkAddr = generateRawTrkAddress(mu, isKbmtf, useOmtfDisplacementInfo);
193 
194  raw_data_32_63 = mu.hwSign() << signShift_ | mu.hwSignValid() << signValidShift_ |
195  (rawTrkAddr & trackAddressMask_) << trackAddressShift_;
196  if (isKbmtf && mu.trackFinderType() == bmtf) {
197  raw_data_32_63 |= (mu.hwPtUnconstrained() & ptUnconstrainedMask_) << bmtfPtUnconstrainedShift_ |
198  (mu.hwDXY() & dxyMask_) << bmtfDxyShift_;
199  } else if (useOmtfDisplacementInfo && (mu.trackFinderType() == omtf_pos || mu.trackFinderType() == omtf_neg)) {
200  raw_data_32_63 |= (mu.hwPtUnconstrained() & ptUnconstrainedMask_) << kOmtfPtUnconstrainedShift_;
201  } else if (useEmtfDisplacementInfo && (mu.trackFinderType() == emtf_pos || mu.trackFinderType() == emtf_neg)) {
202  raw_data_32_63 |= (mu.hwPtUnconstrained() & ptUnconstrainedMask_) << emtfPtUnconstrainedShift_ |
203  (mu.hwDXY() & dxyMask_) << emtfDxyShift_;
204  }
205 }
206 
208  const bool isKbmtf,
209  const bool useOmtfDisplacementInfo,
210  const bool useEmtfDisplacementInfo) {
211  uint32_t lsw;
212  uint32_t msw;
213 
214  generatePackedDataWords(mu, lsw, msw, isKbmtf, useOmtfDisplacementInfo, useEmtfDisplacementInfo);
215  return (((uint64_t)msw) << 32) + lsw;
216 }
217 
219  const bool isKalman,
220  const bool useOmtfDisplacementInfo) {
221  int tf = mu.trackFinderType();
222  int rawTrkAddr = 0;
223  if (tf == bmtf) {
224  // protection against a track address map with the wrong size
225  if (mu.trackAddress().size() == RegionalMuonCand::kNumBmtfSubAddr) {
226  int detSide = mu.trackSubAddress(RegionalMuonCand::kWheelSide);
227  int wheelNum = mu.trackSubAddress(RegionalMuonCand::kWheelNum);
228  int stat1 = mu.trackSubAddress(RegionalMuonCand::kStat1);
229  int stat2 = mu.trackSubAddress(RegionalMuonCand::kStat2);
230  int stat3 = mu.trackSubAddress(RegionalMuonCand::kStat3);
231  int stat4 = mu.trackSubAddress(RegionalMuonCand::kStat4);
232  if (isKalman) {
233  stat1 = mu.trackSubAddress(RegionalMuonCand::kStat4);
234  stat2 = mu.trackSubAddress(RegionalMuonCand::kStat3);
235  stat3 = mu.trackSubAddress(RegionalMuonCand::kStat2);
236  stat4 = mu.trackSubAddress(RegionalMuonCand::kStat1);
237  }
238 
239  rawTrkAddr = (detSide & 0x1) << bmtfTrAddrDetSideShift_ |
240  (wheelNum & bmtfTrAddrWheelMask_) << bmtfTrAddrWheelShift_ |
241  (stat1 & bmtfTrAddrStat1Mask_) << bmtfTrAddrStat1Shift_ |
242  (stat2 & bmtfTrAddrStat2Mask_) << bmtfTrAddrStat2Shift_ |
243  (stat3 & bmtfTrAddrStat3Mask_) << bmtfTrAddrStat3Shift_ |
244  (stat4 & bmtfTrAddrStat4Mask_) << bmtfTrAddrStat4Shift_;
245  } else {
246  edm::LogWarning("L1T") << "BMTF muon track address map contains " << mu.trackAddress().size()
247  << " instead of the expected " << RegionalMuonCand::kNumBmtfSubAddr
248  << " subaddresses. Check the data format. Setting track address to 0.";
249  rawTrkAddr = 0;
250  }
251  } else if (tf == emtf_neg || tf == emtf_pos) {
252  // protection against a track address map with the wrong size
253  if (mu.trackAddress().size() == RegionalMuonCand::kNumEmtfSubAddr) {
254  rawTrkAddr = (mu.trackSubAddress(RegionalMuonCand::kME1Seg) & 0x1) << emtfTrAddrMe1SegShift_ |
255  (mu.trackSubAddress(RegionalMuonCand::kME1Ch) & emtfTrAddrMe1ChMask_) << emtfTrAddrMe1ChShift_ |
256  (mu.trackSubAddress(RegionalMuonCand::kME2Seg) & 0x1) << emtfTrAddrMe2SegShift_ |
257  (mu.trackSubAddress(RegionalMuonCand::kME2Ch) & emtfTrAddrMe2ChMask_) << emtfTrAddrMe2ChShift_ |
258  (mu.trackSubAddress(RegionalMuonCand::kME3Seg) & 0x1) << emtfTrAddrMe3SegShift_ |
259  (mu.trackSubAddress(RegionalMuonCand::kME3Ch) & emtfTrAddrMe3ChMask_) << emtfTrAddrMe3ChShift_ |
260  (mu.trackSubAddress(RegionalMuonCand::kME4Seg) & 0x1) << emtfTrAddrMe4SegShift_ |
261  (mu.trackSubAddress(RegionalMuonCand::kME4Ch) & emtfTrAddrMe4ChMask_) << emtfTrAddrMe4ChShift_;
262 
263  } else {
264  edm::LogWarning("L1T") << "EMTF muon track address map contains " << mu.trackAddress().size()
265  << " instead of the expected " << RegionalMuonCand::kNumEmtfSubAddr
266  << " subaddresses. Check the data format. Setting track address to 0.";
267  rawTrkAddr = 0;
268  }
269  } else if ((tf == omtf_neg || tf == omtf_pos) && !useOmtfDisplacementInfo) {
270  // protection against a track address map with the wrong size
271  if (mu.trackAddress().size() == RegionalMuonCand::kNumOmtfSubAddr) {
272  rawTrkAddr = (mu.trackSubAddress(RegionalMuonCand::kLayers) & omtfTrAddrLayersMask_) << omtfTrAddrLayersShift_ |
273  (mu.trackSubAddress(RegionalMuonCand::kWeight) & omtfTrAddrWeightMask_) << omtfTrAddrWeightShift_;
274 
275  } else {
276  edm::LogWarning("L1T") << "OMTF muon track address map contains " << mu.trackAddress().size()
277  << " instead of the expected " << RegionalMuonCand::kNumOmtfSubAddr
278  << " subaddresses. Check the data format. Setting track address to 0.";
279  rawTrkAddr = 0;
280  }
281  } else {
282  rawTrkAddr = mu.trackAddress().at(0);
283  }
284 
285  return rawTrkAddr;
286 }
void setOneTightInTime(const bool bit)
void setOneLooseInTime(const bool bit)
static void generatePackedDataWords(const RegionalMuonCand &mu, uint32_t &raw_data_00_31, uint32_t &raw_data_32_63, bool isKbmtf, bool useOmtfDisplacementInfo, bool useEmtfDisplacementInfo)
Log< level::Error, false > LogError
static void generatePackedShowerPayload(const RegionalMuonShower &shower, std::array< uint32_t, 6 > &payload, bool useEmtfNominalTightShowers, bool useEmtfLooseShowers)
static int generateRawTrkAddress(const RegionalMuonCand &, bool isKalman, bool useOmtfDisplacementInfo)
static bool fillRegionalMuonShower(RegionalMuonShower &muShower, std::vector< uint32_t > bxPayload, int proc, tftype tf, bool useEmtfNominalTightShowers, bool useEmtfLooseShowers)
void setOneNominalInTime(const bool bit)
static void fillRegionalMuonCand(RegionalMuonCand &mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63, int proc, tftype tf, bool isKbmtf, bool useOmtfDisplacementInfo, bool useEmtfDisplacementInfo)
static uint64_t generate64bitDataWord(const RegionalMuonCand &mu, bool isKbmtf, bool useOmtfDisplacementInfo, bool useEmtfDisplacementInfo)
unsigned long long uint64_t
Definition: Time.h:13
bool isOneNominalOutOfTime() const
void setTFIdentifiers(int processor, tftype trackFinder)
Set the processor ID, track-finder type. From these two, the link is set.
Log< level::Warning, false > LogWarning
static constexpr unsigned kOmtfPtUnconstrainedShift_