Skip to content

Commit

Permalink
Merge pull request #40841 from dinyar/fix/ugt_version_w_showers
Browse files Browse the repository at this point in the history
Use named constants for uG(M)T firmware versions etc.
  • Loading branch information
cmsbuild authored Feb 23, 2023
2 parents 378b0c7 + dd8a1f3 commit 44432aa
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 27 deletions.
20 changes: 15 additions & 5 deletions L1Trigger/L1TMuon/interface/MuonRawDigiTranslator.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ namespace l1t {
uint32_t raw_data_00_31,
uint32_t raw_data_32_63,
int fed,
unsigned int fw,
int fw,
int muInBx);
static void fillMuon(Muon& mu, uint32_t raw_data_spare, uint64_t dataword, int fed, unsigned int fw, int muInBx);
static void fillIntermediateMuon(Muon& mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63, unsigned int fw);
static bool showerFired(uint32_t shower_word, int fedId, unsigned int fwId);
static void fillMuon(Muon& mu, uint32_t raw_data_spare, uint64_t dataword, int fed, int fw, int muInBx);
static void fillIntermediateMuon(Muon& mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63, int fw);
static bool showerFired(uint32_t shower_word, int fedId, int fwId);
static void generatePackedMuonDataWords(const Muon& mu,
uint32_t& raw_data_spare,
uint32_t& raw_data_00_31,
Expand All @@ -28,7 +28,7 @@ namespace l1t {
int muInBx);
static void generate64bitDataWord(
const Muon& mu, uint32_t& raw_data_spare, uint64_t& dataword, int fedId, int fwId, int muInBx);
static std::array<uint32_t, 4> getPackedShowerDataWords(const MuonShower& shower, int fedId, unsigned int fwId);
static std::array<uint32_t, 4> getPackedShowerDataWords(const MuonShower& shower, int fedId, int fwId);
static int calcHwEta(const uint32_t& raw, unsigned absEtaShift, unsigned etaSignShift);

static constexpr unsigned ptMask_ = 0x1FF;
Expand Down Expand Up @@ -59,6 +59,16 @@ namespace l1t {
static constexpr unsigned etaMu1SignShift_ = 21; // For Run-3
static constexpr unsigned absEtaMu2Shift_ = 22; // For Run-3
static constexpr unsigned etaMu2SignShift_ = 30; // For Run-3
static constexpr int kUgmtFedId = 1402;
static constexpr int kUgtFedId = 1404;
static constexpr int kUgmtFwVersionUntil2016 = 0x4010000;
static constexpr int kUgtFwVersionUntil2016 = 0x10A6;
static constexpr int kUgmtFwVersionUntil2017 = 0x6000000;
static constexpr int kUgtFwVersionUntil2017 = 0x1120;
static constexpr int kUgmtFwVersionRun3Start = 0x6000001;
static constexpr int kUgtFwVersionUntilRun3Start = 0x1130;
static constexpr int kUgmtFwVersionFirstWithShowers = 0x7000000;
static constexpr int kUgtFwVersionFirstWithShowers = 0x113B;

private:
static void fillMuonStableQuantities(Muon& mu, uint32_t raw_data_00_31, uint32_t raw_data_32_63);
Expand Down
45 changes: 23 additions & 22 deletions L1Trigger/L1TMuon/src/MuonRawDigiTranslator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,8 @@
#include "TMath.h"
#include "L1Trigger/L1TMuon/interface/MuonRawDigiTranslator.h"

void l1t::MuonRawDigiTranslator::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) {
void l1t::MuonRawDigiTranslator::fillMuon(
Muon& mu, uint32_t raw_data_spare, uint32_t raw_data_00_31, uint32_t raw_data_32_63, int fed, int fw, int muInBx) {
// Need the hw charge to properly compute dPhi
mu.setHwCharge((raw_data_32_63 >> chargeShift_) & 0x1);

Expand All @@ -18,11 +13,12 @@ void l1t::MuonRawDigiTranslator::fillMuon(Muon& mu,
// In Run-3 we have displacement information.
// To make room for these data the raw eta value was moved to the second "spare" word which we will have to treat separately
// The uGMT (FED 1402) or uGT (FED 1404) FW versions are used to determine the era.
if ((fed == 1402 && fw < 0x4010000) || (fed == 1404 && fw < 0x10A6)) {
if ((fed == kUgmtFedId && fw < kUgmtFwVersionUntil2016) || (fed == kUgtFedId && fw < kUgtFwVersionUntil2016)) {
fillMuonCoordinates2016(mu, raw_data_00_31, raw_data_32_63);
} else if ((fed == 1402 && fw < 0x6000000) || (fed == 1404 && fw < 0x1120)) {
} else if ((fed == kUgmtFedId && fw < kUgmtFwVersionUntil2017) || (fed == kUgtFedId && fw < kUgtFwVersionUntil2017)) {
fillMuonCoordinatesFrom2017(mu, raw_data_00_31, raw_data_32_63);
} else if ((fed == 1402 && fw == 0x6000001) || (fed == 1404 && fw < 0x1130)) {
} else if ((fed == kUgmtFedId && fw == kUgmtFwVersionRun3Start) ||
(fed == kUgtFedId && fw < kUgtFwVersionUntilRun3Start)) {
// We're unpacking data from the November MWGR where the raw eta values were shifted by one bit.
fillMuonQuantitiesRun3(mu, raw_data_spare, raw_data_00_31, raw_data_32_63, muInBx, true);
} else {
Expand All @@ -36,13 +32,13 @@ void l1t::MuonRawDigiTranslator::fillMuon(Muon& mu,
void l1t::MuonRawDigiTranslator::fillIntermediateMuon(Muon& mu,
uint32_t raw_data_00_31,
uint32_t raw_data_32_63,
unsigned int fw) {
int fw) {
// Need the hw charge to properly compute dPhi
mu.setHwCharge((raw_data_32_63 >> chargeShift_) & 0x1);

if (fw < 0x4010000) {
if (fw < kUgmtFwVersionUntil2016) {
fillMuonCoordinates2016(mu, raw_data_00_31, raw_data_32_63);
} else if (fw < 0x6000000) {
} else if (fw < kUgmtFwVersionUntil2017) {
fillMuonCoordinatesFrom2017(mu, raw_data_00_31, raw_data_32_63);
} else {
fillIntermediateMuonQuantitiesRun3(mu, raw_data_00_31, raw_data_32_63);
Expand Down Expand Up @@ -81,7 +77,7 @@ void l1t::MuonRawDigiTranslator::fillMuonStableQuantities(Muon& mu, uint32_t raw
}

void l1t::MuonRawDigiTranslator::fillMuon(
Muon& mu, uint32_t raw_data_spare, uint64_t dataword, int fed, unsigned int fw, int muInBx) {
Muon& mu, uint32_t raw_data_spare, uint64_t dataword, int fed, int fw, int muInBx) {
fillMuon(
mu, raw_data_spare, (uint32_t)(dataword & 0xFFFFFFFF), (uint32_t)((dataword >> 32) & 0xFFFFFFFF), fed, fw, muInBx);
}
Expand Down Expand Up @@ -192,15 +188,17 @@ void l1t::MuonRawDigiTranslator::generatePackedMuonDataWords(const Muon& mu,
if (abs_eta_at_vtx < 0) {
abs_eta_at_vtx += (1 << (etaAtVtxSignShift_ - absEtaAtVtxShift_));
}
if ((fedID == 1402 && fwID < 0x4010000) || (fedID == 1404 && fwID < 0x10A6)) {
if ((fedID == kUgmtFedId && fwID < kUgmtFwVersionUntil2016) ||
(fedID == kUgtFedId && fwID < kUgtFwVersionUntil2016)) {
// For 2016 the non-extrapolated coordiantes were in the place that are now occupied by the extrapolated quantities.
raw_data_spare = 0;
raw_data_00_31 = (mu.hwPt() & ptMask_) << ptShift_ | (mu.hwQual() & qualMask_) << qualShift_ |
(abs_eta & absEtaMask_) << absEtaAtVtxShift_ | (mu.hwEta() < 0) << etaAtVtxSignShift_ |
(mu.hwPhi() & phiMask_) << phiAtVtxShift_;
raw_data_32_63 = mu.hwCharge() << chargeShift_ | mu.hwChargeValid() << chargeValidShift_ |
(mu.tfMuonIndex() & tfMuonIndexMask_) << tfMuonIndexShift_ | (mu.hwIso() & isoMask_) << isoShift_;
} else if ((fedID == 1402 && fwID < 0x6000000) || (fedID == 1404 && fwID < 0x1120)) {
} else if ((fedID == kUgmtFedId && fwID < kUgmtFwVersionUntil2017) ||
(fedID == kUgtFedId && fwID < kUgtFwVersionUntil2017)) {
raw_data_spare = 0;
raw_data_00_31 = (mu.hwPt() & ptMask_) << ptShift_ | (mu.hwQual() & qualMask_) << qualShift_ |
(abs_eta_at_vtx & absEtaMask_) << absEtaAtVtxShift_ | (mu.hwEtaAtVtx() < 0) << etaAtVtxSignShift_ |
Expand All @@ -210,8 +208,9 @@ void l1t::MuonRawDigiTranslator::generatePackedMuonDataWords(const Muon& mu,
(mu.tfMuonIndex() & tfMuonIndexMask_) << tfMuonIndexShift_ | (mu.hwIso() & isoMask_) << isoShift_ |
(abs_eta & absEtaMask_) << absEtaShift_ | (mu.hwEta() < 0) << etaSignShift_ |
(mu.hwPhi() & phiMask_) << phiShift_;
} else if ((fedID == 1402 && fwID == 0x6000001) ||
(fedID == 1404 && fwID < 0x1130)) { // This allows us to unpack data taken in the November 2020 MWGR.
} else if ((fedID == kUgmtFedId && fwID == kUgmtFwVersionRun3Start) ||
(fedID == kUgtFedId &&
fwID < kUgtFwVersionUntilRun3Start)) { // This allows us to unpack data taken in the November 2020 MWGR.
generatePackedMuonDataWordsRun3(
mu, abs_eta, abs_eta_at_vtx, raw_data_spare, raw_data_00_31, raw_data_32_63, muInBx, true);
} else {
Expand Down Expand Up @@ -263,18 +262,20 @@ void l1t::MuonRawDigiTranslator::generate64bitDataWord(
dataword = (((uint64_t)msw) << 32) + lsw;
}

bool l1t::MuonRawDigiTranslator::showerFired(uint32_t shower_word, int fedId, unsigned int fwId) {
if ((fedId == 1402 && fwId >= 0x7000000) || (fedId == 1404 && fwId >= 0x113b)) {
bool l1t::MuonRawDigiTranslator::showerFired(uint32_t shower_word, int fedId, int fwId) {
if ((fedId == kUgmtFedId && fwId >= kUgmtFwVersionFirstWithShowers) ||
(fedId == kUgtFedId && fwId >= kUgtFwVersionFirstWithShowers)) {
return ((shower_word >> showerShift_) & 1) == 1;
}
return false;
}

std::array<uint32_t, 4> l1t::MuonRawDigiTranslator::getPackedShowerDataWords(const MuonShower& shower,
const int fedId,
const unsigned int fwId) {
const int fwId) {
std::array<uint32_t, 4> res{};
if ((fedId == 1402 && fwId >= 0x7000000) || (fedId == 1404 && fwId >= 0x00010f01)) {
if ((fedId == kUgmtFedId && fwId >= kUgmtFwVersionFirstWithShowers) ||
(fedId == kUgtFedId && fwId >= kUgtFwVersionFirstWithShowers)) {
res.at(0) = shower.isOneNominalInTime() ? (1 << showerShift_) : 0;
res.at(1) = shower.isOneTightInTime() ? (1 << showerShift_) : 0;
}
Expand Down

0 comments on commit 44432aa

Please sign in to comment.