CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RegionalMuonRawDigiTranslator.cc
Go to the documentation of this file.
3 
4 void
5 l1t::RegionalMuonRawDigiTranslator::fillRegionalMuonCand(RegionalMuonCand& mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63, int proc, tftype tf)
6 {
7  // translations as defined in DN-15-017
8  mu.setHwPt((raw_data_00_31 >> ptShift_) & ptMask_);
9  mu.setHwQual((raw_data_00_31 >> qualShift_) & qualMask_);
10 
11  // eta is coded as two's complement
12  int abs_eta = (raw_data_00_31 >> absEtaShift_) & absEtaMask_;
13  if ((raw_data_00_31 >> etaSignShift_) & 0x1) {
14  mu.setHwEta(abs_eta - (1 << (etaSignShift_ - absEtaShift_)));
15  } else {
16  mu.setHwEta(abs_eta);
17  }
18 
19  // phi is coded as two's complement
20  int abs_phi = (raw_data_00_31 >> absPhiShift_) & absPhiMask_;
21  if ((raw_data_00_31 >> phiSignShift_) & 0x1) {
22  mu.setHwPhi(abs_phi - (1 << (phiSignShift_ - absPhiShift_)));
23  } else {
24  mu.setHwPhi(abs_phi);
25  }
26 
27  // sign is coded as -1^signBit
28  mu.setHwSign((raw_data_32_63 >> signShift_) & 0x1);
29  mu.setHwSignValid((raw_data_32_63 >> signValidShift_) & 0x1);
30  mu.setHwHF((raw_data_00_31 >> hfShift_) & hfMask_);
31 
32  // set track address with subaddresses
33  int rawTrackAddress = (raw_data_32_63 >> trackAddressShift_) & trackAddressMask_;
34  if (tf == bmtf) {
35  int segSel = (rawTrackAddress >> bmtfTrAddrSegSelShift_) & bmtfTrAddrSegSelMask_;
36  int detSide = (rawTrackAddress >> bmtfTrAddrDetSideShift_) & 0x1;
37  int wheelNum = (rawTrackAddress >> bmtfTrAddrWheelShift_) & bmtfTrAddrWheelMask_;
38  int statAddr1 = ((rawTrackAddress >> bmtfTrAddrStat1Shift_) & bmtfTrAddrStat1Mask_)
39  | ((segSel & 0x1) << 2);
40  int statAddr2 = ((rawTrackAddress >> bmtfTrAddrStat2Shift_) & bmtfTrAddrStat2Mask_)
41  | ((segSel & 0x2) << 3);
42  int statAddr3 = ((rawTrackAddress >> bmtfTrAddrStat3Shift_) & bmtfTrAddrStat3Mask_)
43  | ((segSel & 0x4) << 2);
44  int statAddr4 = ((rawTrackAddress >> bmtfTrAddrStat4Shift_) & bmtfTrAddrStat4Mask_)
45  | ((segSel & 0x8) << 1);
56  } else if (tf == emtf_neg || tf == emtf_pos) {
70  } else {
71  std::map<int, int> trackAddr;
72  trackAddr[0] = rawTrackAddress;
73  mu.setTrackAddress(trackAddr);
74  }
75 
76  mu.setTFIdentifiers(proc, tf);
77  mu.setDataword(raw_data_32_63, raw_data_00_31);
78 }
79 
80 void
82 {
83  fillRegionalMuonCand(mu, (uint32_t)(dataword & 0xFFFFFFFF), (uint32_t)((dataword >> 32) & 0xFFFFFFFF), proc, tf);
84 }
85 
86 void
87 l1t::RegionalMuonRawDigiTranslator::generatePackedDataWords(const RegionalMuonCand& mu, uint32_t &raw_data_00_31, uint32_t &raw_data_32_63)
88 {
89  int abs_eta = mu.hwEta();
90  if (abs_eta < 0) {
91  abs_eta += (1 << (etaSignShift_ - absEtaShift_));
92  }
93  int abs_phi = mu.hwPhi();
94  if (abs_phi < 0) {
95  abs_phi += (1 << (phiSignShift_ - absPhiShift_));
96  }
97  raw_data_00_31 = (mu.hwPt() & ptMask_) << ptShift_
98  | (mu.hwQual() & qualMask_) << qualShift_
99  | (abs_eta & absEtaMask_) << absEtaShift_
100  | (mu.hwEta() < 0) << etaSignShift_
101  | (mu.hwHF() & hfMask_) << hfShift_
102  | (abs_phi & absPhiMask_) << absPhiShift_
103  | (mu.hwPhi() < 0) << phiSignShift_;
104 
105  // generate the raw track address from the subaddresses
106  int tf = mu.trackFinderType();
107  int rawTrkAddr = 0;
108  if (tf == bmtf) {
109  // protection against a track address map with the wrong size
110  if (mu.trackAddress().size() == RegionalMuonCand::kNumBmtfSubAddr) {
112  int wheelNum = mu.trackSubAddress(RegionalMuonCand::kWheelNum);
117 
122 
123  rawTrkAddr = (segSel & bmtfTrAddrSegSelMask_) << bmtfTrAddrSegSelShift_
124  | (detSide & 0x1) << bmtfTrAddrDetSideShift_
125  | (wheelNum & bmtfTrAddrWheelMask_) << bmtfTrAddrWheelShift_
126  | (stat1 & bmtfTrAddrStat1Mask_) << bmtfTrAddrStat1Shift_
127  | (stat2 & bmtfTrAddrStat2Mask_) << bmtfTrAddrStat2Shift_
128  | (stat3 & bmtfTrAddrStat3Mask_) << bmtfTrAddrStat3Shift_
129  | (stat4 & bmtfTrAddrStat4Mask_) << bmtfTrAddrStat4Shift_;
130  } else {
131  edm::LogWarning("L1T") << "BMTF muon track address map contains " << mu.trackAddress().size() << " instead of the expected " << RegionalMuonCand::kNumBmtfSubAddr << " subaddresses. Check the data format. Setting track address to 0.";
132  rawTrkAddr = 0;
133  }
134  } else if (tf == emtf_neg || tf == emtf_pos) {
135  // protection against a track address map with the wrong size
136  if (mu.trackAddress().size() == RegionalMuonCand::kNumEmtfSubAddr) {
137  rawTrkAddr = (mu.trackSubAddress(RegionalMuonCand::kSectorId) & emtfTrAddrSectIdMask_) << emtfTrAddrSectIdShift_
138  | (mu.trackSubAddress(RegionalMuonCand::kME1) & emtfTrAddrMe1Mask_) << emtfTrAddrMe1Shift_
139  | (mu.trackSubAddress(RegionalMuonCand::kME1SubSecId) & 0x1) << emtfTrAddrMe1SubSecIdShift_
140  | (mu.trackSubAddress(RegionalMuonCand::kME1Order) & 0x1) << emtfTrAddrMe1OrderShift_
141  | (mu.trackSubAddress(RegionalMuonCand::kME2) & emtfTrAddrMe2Mask_) << emtfTrAddrMe2Shift_
142  | (mu.trackSubAddress(RegionalMuonCand::kME2SubSecId) & 0x1) << emtfTrAddrMe2SubSecIdShift_
143  | (mu.trackSubAddress(RegionalMuonCand::kME2Order) & 0x1) << emtfTrAddrMe2OrderShift_
144  | (mu.trackSubAddress(RegionalMuonCand::kME3) & emtfTrAddrMe3Mask_) << emtfTrAddrMe3Shift_
145  | (mu.trackSubAddress(RegionalMuonCand::kME3SubSecId) & 0x1) << emtfTrAddrMe3SubSecIdShift_
146  | (mu.trackSubAddress(RegionalMuonCand::kME3Order) & 0x1) << emtfTrAddrMe3OrderShift_
147  | (mu.trackSubAddress(RegionalMuonCand::kME4) & emtfTrAddrMe4Mask_) << emtfTrAddrMe4Shift_
148  | (mu.trackSubAddress(RegionalMuonCand::kME4SubSecId) & 0x1) << emtfTrAddrMe4SubSecIdShift_
149  | (mu.trackSubAddress(RegionalMuonCand::kME4Order) & 0x1) << emtfTrAddrMe4OrderShift_;
150  } else {
151  edm::LogWarning("L1T") << "EMTF muon track address map contains " << mu.trackAddress().size() << " instead of the expected " << RegionalMuonCand::kNumEmtfSubAddr << " subaddresses. Check the data format. Setting track address to 0.";
152  rawTrkAddr = 0;
153  }
154  } else {
155  rawTrkAddr = mu.trackAddress().at(0);
156  }
157 
158  raw_data_32_63 = mu.hwSign() << signShift_
159  | mu.hwSignValid() << signValidShift_
160  | (rawTrkAddr & trackAddressMask_) << trackAddressShift_;
161 }
162 
163 uint64_t
165 {
166  uint32_t lsw;
167  uint32_t msw;
168 
169  generatePackedDataWords(mu, lsw, msw);
170  return (((uint64_t)msw) << 32) + lsw;
171 }
172 
void setHwPhi(int bits)
Set compressed relative phi as transmitted by hardware LSB = 2*pi/576 (8 bits)
const int hwSignValid() const
Get charge sign valid bit (0 - not valid (high pT muon); 1 - valid)
static void generatePackedDataWords(const RegionalMuonCand &, uint32_t &, uint32_t &)
TrainProcessor *const proc
Definition: MVATrainer.cc:101
void setTrackAddress(const std::map< int, int > &address)
Set the whole track address.
const int hwQual() const
Get quality code.
void setTFIdentifiers(int processor, tftype trackFinder)
Set the processor ID, track-finder type. From these two, the link is set.
void setTrackSubAddress(bmtfAddress subAddress, int value)
Set a part of the muon candidates track address; specialised for BMTF.
const int hwHF() const
Get HF (halo / fine eta) bit (EMTF: halo -&gt; 1; BMTF: fine eta -&gt; 1)
void setDataword(uint32_t msbs, uint32_t lsbs)
void setHwHF(bool bit)
Set HF (halo / fine eta) bit (EMTF: halo -&gt; 1; BMTF: fine eta -&gt; 1)
const int hwEta() const
Get compressed eta (returned int * 0.010875 = eta)
const int mu
Definition: Constants.h:22
const std::map< int, int > & trackAddress() const
Get the track address (identifies track primitives used for reconstruction)
const int hwPhi() const
Get compressed local phi (returned int * 2*pi/576 = local phi in rad)
const tftype trackFinderType() const
Get track-finder which found the muon (bmtf, emtf_pos/emtf_neg or omtf_pos/omtf_neg) ...
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)
unsigned long long uint64_t
Definition: Time.h:15
static void fillRegionalMuonCand(RegionalMuonCand &, uint32_t, uint32_t, int, tftype)
static uint64_t generate64bitDataWord(const RegionalMuonCand &)
int trackSubAddress(bmtfAddress subAddress) const
Get part of track address (identifies track primitives used for reconstruction)
const int hwPt() const
Get compressed pT (returned int * 0.5 = pT (GeV))
const int hwSign() const
Get charge sign bit (charge = (-1)^(sign))
void setHwSignValid(int bits)
Set whether charge measurement is valid (0 for high pT muons)
void setHwSign(int bits)
Set charge sign bit (charge = (-1)^(sign))