CMS 3D CMS Logo

MuonRawDigiTranslator.cc
Go to the documentation of this file.
1 #include "TMath.h"
3 
4 void
5 l1t::MuonRawDigiTranslator::fillMuon(Muon& mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63, int fed, unsigned int fw)
6 {
7  int hwPt = (raw_data_00_31 >> ptShift_) & ptMask_;
8  if (hwPt > 0) {
9  mu.setHwPt(hwPt);
10  mu.setHwQual((raw_data_00_31 >> qualShift_) & qualMask_);
11  mu.setHwIso((raw_data_32_63 >> isoShift_) & isoMask_);
12  // charge is coded as -1^chargeBit
13  mu.setHwCharge((raw_data_32_63 >> chargeShift_) & 0x1);
14  mu.setHwChargeValid((raw_data_32_63 >> chargeValidShift_) & 0x1);
15  mu.setTfMuonIndex((raw_data_32_63 >> tfMuonIndexShift_) & tfMuonIndexMask_);
16 
17  // The position of the eta and phi coordinates in the RAW data changed between the 2016 run and the 2017 run.
18  // Eta and phi at the muon system are replaced by eta and phi at the vertex
19  // Eta and phi at the muon system are moved to spare bits
20  // The uGMT (FED 1402) or uGT (FED 1404) FW versions are used to determine the era.
21  // FIXME: set correct FW versions for uGT and uGMT once they are known
22  if ((fed == 1402 && fw < 0x5000000) || (fed == 1404 && fw < 0x10A5)) {
23  // coordinates at the muon system are in 2016 where in 2017 eta and phi at the vertex are
25  mu.setHwPhi((raw_data_00_31 >> phiAtVtxShift_) & phiMask_);
26 
27  // set the coordiantes at vertex to be the same as the coordinates at the muon system
28  mu.setHwEtaAtVtx(mu.hwEta());
29  mu.setHwPhiAtVtx(mu.hwPhi());
30  // deltas are 0
31  mu.setHwDEtaExtra(0);
32  mu.setHwDPhiExtra(0);
33  } else {
34  // coordinates at the muon system
35  mu.setHwEta(calcHwEta(raw_data_32_63, absEtaShift_, etaSignShift_));
36  mu.setHwPhi((raw_data_32_63 >> phiShift_) & phiMask_);
37 
38  // coordinates at the vertex
40  mu.setHwPhiAtVtx((raw_data_00_31 >> phiAtVtxShift_) & phiMask_);
41  // deltas
42  mu.setHwDEtaExtra(mu.hwEtaAtVtx() - mu.hwEta());
43  int dPhi = mu.hwPhiAtVtx() - mu.hwPhi();
44  if (mu.hwCharge() == 1 && dPhi > 0) {
45  dPhi -= 576;
46  } else if (mu.hwCharge() == 0 && dPhi < 0) {
47  dPhi += 576;
48  }
49  mu.setHwDPhiExtra(dPhi);
50  }
51 
52  math::PtEtaPhiMLorentzVector vec{(mu.hwPt()-1)*0.5, mu.hwEta()*0.010875, mu.hwPhi()*0.010908, 0.0};
53  mu.setP4(vec);
54  // generate a muon at the vertex to extract the physical eta and phi coordinates
55  math::PtEtaPhiMLorentzVector vecAtVtx{(mu.hwPt()-1)*0.5, mu.hwEtaAtVtx()*0.010875, mu.hwPhiAtVtx()*0.010908, 0.0};
56  Muon muAtVtx;
57  muAtVtx.setP4(vecAtVtx);
58  mu.setEtaAtVtx(muAtVtx.eta());
59  mu.setPhiAtVtx(muAtVtx.phi());
60  if (mu.hwChargeValid()) {
61  mu.setCharge(1 - 2 * mu.hwCharge());
62  } else {
63  mu.setCharge(0);
64  }
65  }
66 }
67 
68 void
69 l1t::MuonRawDigiTranslator::fillMuon(Muon& mu, uint64_t dataword, int fed, unsigned int fw)
70 {
71  fillMuon(mu, (uint32_t)(dataword & 0xFFFFFFFF), (uint32_t)((dataword >> 32) & 0xFFFFFFFF), fed, fw);
72 }
73 
74 void
75 l1t::MuonRawDigiTranslator::generatePackedDataWords(const Muon& mu, uint32_t &raw_data_00_31, uint32_t &raw_data_32_63)
76 {
77  int abs_eta = mu.hwEta();
78  if (abs_eta < 0) {
79  abs_eta += (1 << (etaSignShift_ - absEtaShift_));
80  }
81  int abs_eta_at_vtx = mu.hwEtaAtVtx();
82  if (abs_eta_at_vtx < 0) {
83  abs_eta_at_vtx += (1 << (etaAtVtxSignShift_ - absEtaAtVtxShift_));
84  }
85  raw_data_00_31 = (mu.hwPt() & ptMask_) << ptShift_
86  | (mu.hwQual() & qualMask_) << qualShift_
87  | (abs_eta_at_vtx & absEtaMask_) << absEtaAtVtxShift_
88  | (mu.hwEtaAtVtx() < 0) << etaAtVtxSignShift_
89  | (mu.hwPhiAtVtx() & phiMask_) << phiAtVtxShift_;
90 
91  raw_data_32_63 = mu.hwCharge() << chargeShift_
94  | (mu.hwIso() & isoMask_) << isoShift_
95  | (abs_eta & absEtaMask_) << absEtaShift_
96  | (mu.hwEta() < 0) << etaSignShift_
97  | (mu.hwPhi() & phiMask_) << phiShift_;
98 }
99 
100 uint64_t
102 {
103  uint32_t lsw;
104  uint32_t msw;
105 
106  generatePackedDataWords(mu, lsw, msw);
107  return (((uint64_t)msw) << 32) + lsw;
108 }
109 
110 int
111 l1t::MuonRawDigiTranslator::calcHwEta(const uint32_t& raw, const unsigned absEtaShift, const unsigned etaSignShift)
112 {
113  // eta is coded as two's complement
114  int abs_eta = (raw >> absEtaShift) & absEtaMask_;
115  if ((raw >> etaSignShift) & 0x1) {
116  return abs_eta - (1 << (etaSignShift - absEtaShift));
117  } else {
118  return abs_eta;
119  }
120 }
121 
int hwPhiAtVtx() const
Definition: Muon.h:88
static const unsigned etaAtVtxSignShift_
static const unsigned tfMuonIndexShift_
static const unsigned phiMask_
virtual double eta() const final
momentum pseudorapidity
static const unsigned isoShift_
static const unsigned etaSignShift_
void setPhiAtVtx(double phiAtVtx)
Definition: Muon.h:72
void setHwDPhiExtra(int dPhi)
Definition: Muon.h:75
void setHwQual(int qual)
Definition: L1Candidate.h:44
int hwPhi() const
Definition: L1Candidate.h:50
static const unsigned absEtaAtVtxShift_
static int calcHwEta(const uint32_t &, const unsigned, const unsigned)
virtual double phi() const final
momentum azimuthal angle
PtEtaPhiMLorentzVectorD PtEtaPhiMLorentzVector
Lorentz vector with cartesian internal representation.
Definition: LorentzVector.h:25
int hwIso() const
Definition: L1Candidate.h:52
static const unsigned qualShift_
static const unsigned tfMuonIndexMask_
void setTfMuonIndex(int index)
Definition: Muon.h:66
static const unsigned absEtaShift_
Definition: Muon.py:1
double dPhi(double phi1, double phi2)
Definition: JetUtil.h:30
void setHwCharge(int charge)
Definition: Muon.h:64
static const unsigned phiShift_
void setHwChargeValid(int valid)
Definition: Muon.h:65
void setHwPhiAtVtx(int hwPhiAtVtx)
Definition: Muon.h:70
virtual void setCharge(Charge q) final
set electric charge
Definition: LeafCandidate.h:93
const int mu
Definition: Constants.h:22
int hwEta() const
Definition: L1Candidate.h:49
static const unsigned chargeValidShift_
int hwQual() const
Definition: L1Candidate.h:51
static const unsigned absEtaMask_
void setHwPhi(int phi)
Definition: L1Candidate.h:43
void setHwIso(int iso)
Definition: L1Candidate.h:45
int tfMuonIndex() const
Definition: Muon.h:84
int hwPt() const
Definition: L1Candidate.h:48
void setHwEtaAtVtx(int hwEtaAtVtx)
Definition: Muon.h:69
static uint64_t generate64bitDataWord(const Muon &)
unsigned long long uint64_t
Definition: Time.h:15
int hwEtaAtVtx() const
Definition: Muon.h:87
static const unsigned ptShift_
virtual void setP4(const LorentzVector &p4) final
set 4-momentum
static void generatePackedDataWords(const Muon &, uint32_t &, uint32_t &)
void setHwDEtaExtra(int dEta)
Definition: Muon.h:76
static const unsigned isoMask_
void setHwPt(int pt)
Definition: L1Candidate.h:41
static const unsigned chargeShift_
void setHwEta(int eta)
Definition: L1Candidate.h:42
static const unsigned qualMask_
int hwChargeValid() const
Definition: Muon.h:83
static const unsigned phiAtVtxShift_
int hwCharge() const
Definition: Muon.h:82
static const unsigned ptMask_
static void fillMuon(Muon &, uint32_t, uint32_t, int, unsigned int)
void setEtaAtVtx(double etaAtVtx)
Definition: Muon.h:71