CMS 3D CMS Logo

MuonRawDigiTranslator.cc
Go to the documentation of this file.
2 #include "TMath.h"
4 
6  uint32_t raw_data_spare,
7  uint32_t raw_data_00_31,
8  uint32_t raw_data_32_63,
9  int fed,
10  unsigned int fw,
11  int muInBx) {
12  // Need the hw charge to properly compute dPhi
13  mu.setHwCharge((raw_data_32_63 >> chargeShift_) & 0x1);
14 
15  // The position of the eta and phi coordinates in the RAW data changed between the 2016 run and the 2017 run.
16  // Eta and phi at the muon system are replaced by eta and phi at the vertex
17  // Eta and phi at the muon system are moved to spare bits
18  // In Run-3 we have displacement information.
19  // To make room for these data the raw eta value was moved to the second "spare" word which we will have to treat separately
20  // The uGMT (FED 1402) or uGT (FED 1404) FW versions are used to determine the era.
21  if ((fed == 1402 && fw < 0x4010000) || (fed == 1404 && fw < 0x10A6)) {
22  fillMuonCoordinates2016(mu, raw_data_00_31, raw_data_32_63);
23  } else if ((fed == 1402 && fw < 0x6000000) || (fed == 1404 && fw < 0x1120)) {
24  fillMuonCoordinatesFrom2017(mu, raw_data_00_31, raw_data_32_63);
25  } else {
26  fillMuonQuantitiesRun3(mu, raw_data_spare, raw_data_00_31, raw_data_32_63, muInBx);
27  }
28 
29  // Fill pT, qual, iso, charge, index bits, coordinates at vtx
30  fillMuonStableQuantities(mu, raw_data_00_31, raw_data_32_63);
31 }
32 
34  uint32_t raw_data_00_31,
35  uint32_t raw_data_32_63,
36  unsigned int fw) {
37  // Need the hw charge to properly compute dPhi
38  mu.setHwCharge((raw_data_32_63 >> chargeShift_) & 0x1);
39 
40  if (fw < 0x4010000) {
41  fillMuonCoordinates2016(mu, raw_data_00_31, raw_data_32_63);
42  } else if (fw < 0x6000000) {
43  fillMuonCoordinatesFrom2017(mu, raw_data_00_31, raw_data_32_63);
44  } else {
45  fillIntermediateMuonQuantitiesRun3(mu, raw_data_00_31, raw_data_32_63);
46  }
47 
48  // Fill pT, qual, iso, charge, index bits, phys. coordinates at vtx & unconstrained pT
49  fillMuonStableQuantities(mu, raw_data_00_31, raw_data_32_63);
50 }
51 
52 void l1t::MuonRawDigiTranslator::fillMuonStableQuantities(Muon& mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63) {
53  mu.setHwPt((raw_data_00_31 >> ptShift_) & ptMask_);
54  mu.setHwQual((raw_data_00_31 >> qualShift_) & qualMask_);
55  mu.setHwIso((raw_data_32_63 >> isoShift_) & isoMask_);
56  // charge is coded as -1^chargeBit
57  mu.setHwChargeValid((raw_data_32_63 >> chargeValidShift_) & 0x1);
58  mu.setTfMuonIndex((raw_data_32_63 >> tfMuonIndexShift_) & tfMuonIndexMask_);
59  if (mu.hwChargeValid()) {
60  mu.setCharge(1 - 2 * mu.hwCharge());
61  } else {
62  mu.setCharge(0);
63  }
64 
65  math::PtEtaPhiMLorentzVector vec{(mu.hwPt() - 1) * 0.5, mu.hwEta() * 0.010875, mu.hwPhi() * 0.010908, 0.0};
66  mu.setP4(vec);
67  // generate a muon at the vertex to extract the physical eta and phi coordinates
69  (mu.hwPt() - 1) * 0.5, mu.hwEtaAtVtx() * 0.010875, mu.hwPhiAtVtx() * 0.010908, 0.0};
70  Muon muAtVtx;
71  muAtVtx.setP4(vecAtVtx);
72  mu.setEtaAtVtx(muAtVtx.eta());
73  mu.setPhiAtVtx(muAtVtx.phi());
74 
75  int hwPtUnconstrained{mu.hwPtUnconstrained()};
76  mu.setPtUnconstrained(hwPtUnconstrained == 0 ? 0 : (hwPtUnconstrained - 1) * 0.5); // Don't want negative pT.
77 }
78 
80  Muon& mu, uint32_t raw_data_spare, uint64_t dataword, int fed, unsigned int fw, int muInBx) {
81  fillMuon(
82  mu, raw_data_spare, (uint32_t)(dataword & 0xFFFFFFFF), (uint32_t)((dataword >> 32) & 0xFFFFFFFF), fed, fw, muInBx);
83 }
84 
85 void l1t::MuonRawDigiTranslator::fillMuonCoordinates2016(Muon& mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63) {
86  // coordinates at the muon system are in 2016 where in 2017 eta and phi at the vertex are
87  mu.setHwEta(calcHwEta(raw_data_00_31, absEtaAtVtxShift_, etaAtVtxSignShift_));
88  mu.setHwPhi((raw_data_00_31 >> phiAtVtxShift_) & phiMask_);
89 
90  // set the coordiantes at vertex to be the same as the coordinates at the muon system
91  mu.setHwEtaAtVtx(mu.hwEta());
92  mu.setHwPhiAtVtx(mu.hwPhi());
93  // deltas are 0
94  mu.setHwDEtaExtra(0);
95  mu.setHwDPhiExtra(0);
96 }
97 
99  uint32_t raw_data_00_31,
100  uint32_t raw_data_32_63) {
101  // coordinates at the muon system
102  mu.setHwEta(calcHwEta(raw_data_32_63, absEtaShift_, etaSignShift_));
103  mu.setHwPhi((raw_data_32_63 >> phiShift_) & phiMask_);
104 
105  // coordinates at the vertex
106  mu.setHwEtaAtVtx(calcHwEta(raw_data_00_31, absEtaAtVtxShift_, etaAtVtxSignShift_));
107  mu.setHwPhiAtVtx((raw_data_00_31 >> phiAtVtxShift_) & phiMask_);
108  // deltas
109  mu.setHwDEtaExtra(mu.hwEtaAtVtx() - mu.hwEta());
110  int dPhi = mu.hwPhiAtVtx() - mu.hwPhi();
111  if (mu.hwCharge() == 1 && dPhi > 0) {
112  dPhi -= 576;
113  } else if (mu.hwCharge() == 0 && dPhi < 0) {
114  dPhi += 576;
115  }
116  mu.setHwDPhiExtra(dPhi);
117 }
118 
120  Muon& mu, uint32_t raw_data_spare, uint32_t raw_data_00_31, uint32_t raw_data_32_63, int muInBx) {
121  // coordinates at the muon system
122  // Where to find the raw eta depends on which muon we're looking at
123  if (muInBx == 1) {
124  mu.setHwEta(calcHwEta(raw_data_spare, absEtaMu1Shift_, etaMu1SignShift_));
125  } else if (muInBx == 2) {
126  mu.setHwEta(calcHwEta(raw_data_spare, absEtaMu2Shift_, etaMu2SignShift_));
127  } else {
128  edm::LogWarning("L1T") << "Received invalid muon id " << muInBx << ". Cannot fill eta value in the muon system.";
129  }
130  mu.setHwPhi((raw_data_32_63 >> phiShift_) & phiMask_);
131 
132  // coordinates at the vertex
133  mu.setHwEtaAtVtx(calcHwEta(raw_data_00_31, absEtaAtVtxShift_, etaAtVtxSignShift_));
134  mu.setHwPhiAtVtx((raw_data_00_31 >> phiAtVtxShift_) & phiMask_);
135  // deltas
136  mu.setHwDEtaExtra(mu.hwEtaAtVtx() - mu.hwEta());
137  int dPhi = mu.hwPhiAtVtx() - mu.hwPhi();
138  if (mu.hwCharge() == 1 && dPhi > 0) {
139  dPhi -= 576;
140  } else if (mu.hwCharge() == 0 && dPhi < 0) {
141  dPhi += 576;
142  }
143  mu.setHwDPhiExtra(dPhi);
144 
145  // displacement information
146  mu.setHwDXY((raw_data_32_63 >> dxyShift_) & dxyMask_);
147  mu.setHwPtUnconstrained((raw_data_32_63 >> ptUnconstrainedShift_) & ptUnconstrainedMask_);
148 }
149 
151  uint32_t raw_data_00_31,
152  uint32_t raw_data_32_63) {
153  fillMuonCoordinatesFrom2017(mu, raw_data_00_31, raw_data_32_63);
154 
155  // displacement information
156  mu.setHwDXY((raw_data_32_63 >> dxyShift_) & dxyMask_);
157  mu.setHwPtUnconstrained((raw_data_00_31 >> ptUnconstrainedIntermedidateShift_) & ptUnconstrainedMask_);
158 }
159 
161  uint32_t& raw_data_spare,
162  uint32_t& raw_data_00_31,
163  uint32_t& raw_data_32_63,
164  int fedID,
165  int fwID,
166  int muInBx) {
167  int abs_eta = mu.hwEta();
168  if (abs_eta < 0) {
169  abs_eta += (1 << (etaSignShift_ - absEtaShift_));
170  }
171  int abs_eta_at_vtx = mu.hwEtaAtVtx();
172  if (abs_eta_at_vtx < 0) {
173  abs_eta_at_vtx += (1 << (etaAtVtxSignShift_ - absEtaAtVtxShift_));
174  }
175  if ((fedID == 1402 && fwID < 0x4010000) || (fedID == 1404 && fwID < 0x10A6)) {
176  // For 2016 the non-extrapolated coordiantes were in the place that are now occupied by the extrapolated quantities.
177  raw_data_spare = 0;
178  raw_data_00_31 = (mu.hwPt() & ptMask_) << ptShift_ | (mu.hwQual() & qualMask_) << qualShift_ |
179  (abs_eta & absEtaMask_) << absEtaAtVtxShift_ | (mu.hwEta() < 0) << etaAtVtxSignShift_ |
180  (mu.hwPhi() & phiMask_) << phiAtVtxShift_;
181  raw_data_32_63 = mu.hwCharge() << chargeShift_ | mu.hwChargeValid() << chargeValidShift_ |
182  (mu.tfMuonIndex() & tfMuonIndexMask_) << tfMuonIndexShift_ | (mu.hwIso() & isoMask_) << isoShift_;
183  } else if ((fedID == 1402 && fwID < 0x6000000) || (fedID == 1404 && fwID < 0x1120)) {
184  raw_data_spare = 0;
185  raw_data_00_31 = (mu.hwPt() & ptMask_) << ptShift_ | (mu.hwQual() & qualMask_) << qualShift_ |
186  (abs_eta_at_vtx & absEtaMask_) << absEtaAtVtxShift_ | (mu.hwEtaAtVtx() < 0) << etaAtVtxSignShift_ |
187  (mu.hwPhiAtVtx() & phiMask_) << phiAtVtxShift_;
188 
189  raw_data_32_63 = mu.hwCharge() << chargeShift_ | mu.hwChargeValid() << chargeValidShift_ |
190  (mu.tfMuonIndex() & tfMuonIndexMask_) << tfMuonIndexShift_ | (mu.hwIso() & isoMask_) << isoShift_ |
191  (abs_eta & absEtaMask_) << absEtaShift_ | (mu.hwEta() < 0) << etaSignShift_ |
192  (mu.hwPhi() & phiMask_) << phiShift_;
193  } else {
194  int absEtaShiftRun3{0}, etaSignShiftRun3{0};
195  if (muInBx == 1) {
196  absEtaShiftRun3 = absEtaMu1Shift_;
197  etaSignShiftRun3 = etaMu1SignShift_;
198  } else if (muInBx == 2) {
199  absEtaShiftRun3 = absEtaMu2Shift_;
200  etaSignShiftRun3 = etaMu2SignShift_;
201  }
202  raw_data_spare = (abs_eta & absEtaMask_) << absEtaShiftRun3 | (mu.hwEta() < 0) << etaSignShiftRun3;
203  raw_data_00_31 = (mu.hwPt() & ptMask_) << ptShift_ | (mu.hwQual() & qualMask_) << qualShift_ |
204  (abs_eta_at_vtx & absEtaMask_) << absEtaAtVtxShift_ | (mu.hwEtaAtVtx() < 0) << etaAtVtxSignShift_ |
205  (mu.hwPhiAtVtx() & phiMask_) << phiAtVtxShift_;
206  raw_data_32_63 = mu.hwCharge() << chargeShift_ | mu.hwChargeValid() << chargeValidShift_ |
207  (mu.tfMuonIndex() & tfMuonIndexMask_) << tfMuonIndexShift_ | (mu.hwIso() & isoMask_) << isoShift_ |
208  (mu.hwPhi() & phiMask_) << phiShift_ |
209  (mu.hwPtUnconstrained() & ptUnconstrainedMask_) << ptUnconstrainedShift_ |
210  (mu.hwDXY() & dxyMask_) << dxyShift_;
211  }
212 }
213 
215  const Muon& mu, uint32_t& raw_data_spare, uint64_t& dataword, int fedId, int fwId, int muInBx) {
216  uint32_t lsw;
217  uint32_t msw;
218 
219  generatePackedDataWords(mu, raw_data_spare, lsw, msw, fedId, fwId, muInBx);
220  dataword = (((uint64_t)msw) << 32) + lsw;
221 }
222 
224  const unsigned absEtaShift,
225  const unsigned etaSignShift) {
226  // eta is coded as two's complement
227  int abs_eta = (raw >> absEtaShift) & absEtaMask_;
228  if ((raw >> etaSignShift) & 0x1) {
229  return abs_eta - (1 << (etaSignShift - absEtaShift));
230  } else {
231  return abs_eta;
232  }
233 }
MessageLogger.h
MuonRawDigiTranslator.h
l1t::MuonRawDigiTranslator::chargeShift_
static constexpr unsigned chargeShift_
Definition: MuonRawDigiTranslator.h:41
l1t::MuonRawDigiTranslator::fillMuonQuantitiesRun3
static void fillMuonQuantitiesRun3(Muon &mu, uint32_t raw_data_spare, uint32_t raw_data_00_31, uint32_t raw_data_32_63, int muInBx)
Definition: MuonRawDigiTranslator.cc:119
amptDefaultParameters_cff.mu
mu
Definition: amptDefaultParameters_cff.py:16
l1t::MuonRawDigiTranslator::generate64bitDataWord
static void generate64bitDataWord(const Muon &mu, uint32_t &raw_data_spare, uint64_t &dataword, int fedId, int fwId, int muInBx)
Definition: MuonRawDigiTranslator.cc:214
l1t::MuonRawDigiTranslator::fillMuonCoordinatesFrom2017
static void fillMuonCoordinatesFrom2017(Muon &mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63)
Definition: MuonRawDigiTranslator.cc:98
l1t::MuonRawDigiTranslator::fillMuonCoordinates2016
static void fillMuonCoordinates2016(Muon &mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63)
Definition: MuonRawDigiTranslator.cc:85
Muon
Definition: Muon.py:1
l1t::MuonRawDigiTranslator::fillMuonStableQuantities
static void fillMuonStableQuantities(Muon &mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63)
Definition: MuonRawDigiTranslator.cc:52
testProducerWithPsetDescEmpty_cfi.x1
x1
Definition: testProducerWithPsetDescEmpty_cfi.py:33
l1t::MuonRawDigiTranslator::fillMuon
static void fillMuon(Muon &mu, uint32_t raw_data_spare, uint32_t raw_data_00_31, uint32_t raw_data_32_63, int fed, unsigned int fw, int muInBx)
Definition: MuonRawDigiTranslator.cc:5
HLT_2018_cff.dPhi
dPhi
Definition: HLT_2018_cff.py:12290
edm::LogWarning
Definition: MessageLogger.h:141
reco::LeafCandidate::eta
double eta() const final
momentum pseudorapidity
Definition: LeafCandidate.h:152
fw
Definition: estimate_field.h:12
l1tstage2_dqm_sourceclient-live_cfg.fedId
fedId
Definition: l1tstage2_dqm_sourceclient-live_cfg.py:88
l1t::MuonRawDigiTranslator::calcHwEta
static int calcHwEta(const uint32_t &raw, const unsigned absEtaShift, const unsigned etaSignShift)
Definition: MuonRawDigiTranslator.cc:223
reco::LeafCandidate::setP4
void setP4(const LorentzVector &p4) final
set 4-momentum
Definition: LeafCandidate.h:158
reco::LeafCandidate::phi
double phi() const final
momentum azimuthal angle
Definition: LeafCandidate.h:148
l1t::MuonRawDigiTranslator::fillIntermediateMuon
static void fillIntermediateMuon(Muon &mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63, unsigned int fw)
Definition: MuonRawDigiTranslator.cc:33
cond::uint64_t
unsigned long long uint64_t
Definition: Time.h:13
math::PtEtaPhiMLorentzVector
PtEtaPhiMLorentzVectorD PtEtaPhiMLorentzVector
Lorentz vector with cartesian internal representation.
Definition: LorentzVector.h:25
l1t::MuonRawDigiTranslator::generatePackedDataWords
static void generatePackedDataWords(const Muon &mu, uint32_t &raw_data_spare, uint32_t &raw_data_00_31, uint32_t &raw_data_32_63, int fedId, int fwId, int muInBx)
Definition: MuonRawDigiTranslator.cc:160
l1t::MuonRawDigiTranslator::fillIntermediateMuonQuantitiesRun3
static void fillIntermediateMuonQuantitiesRun3(Muon &mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63)
Definition: MuonRawDigiTranslator.cc:150