Skip to content

Commit

Permalink
Merge branch 'l1t-muon-CMSSW_7_6_0_pre5' of github.com:cms-l1t-offlin…
Browse files Browse the repository at this point in the history
…e/cmssw into DT_theta
  • Loading branch information
akalinow committed Nov 10, 2015
2 parents ca3b64b + 703bb3a commit 2a14167
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 23 deletions.
6 changes: 3 additions & 3 deletions DataFormats/L1TMuon/interface/RegionalMuonCand.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class RegionalMuonCand {
// this is left to still be compatible with OMTF
void setLink(int link);
// Set the 64 bit word from two 32 words. bits 0-31->lsbs, bits 32-63->msbs
void setDataword(int msbs, int lsbs) { m_dataword = (((uint64_t)msbs) << 32) + lsbs; };
void setDataword(uint32_t msbs, uint32_t lsbs) { m_dataword = (((uint64_t)msbs) << 32) + lsbs; };
// Set the 64 bit word coming from HW directly
void setDataword(uint64_t bits) { m_dataword = bits; };
/// Set a part of the muon candidates track address; specialised for BMTF
Expand Down Expand Up @@ -93,9 +93,9 @@ class RegionalMuonCand {
/// Get 64 bit data word
const uint64_t dataword() const { return m_dataword; };
/// Get 32 MSBs of data word
const int dataword32Msb() const { return (int)((m_dataword >> 32) & 0xFFFFFFFF); };
const uint32_t dataword32Msb() const { return (uint32_t)((m_dataword >> 32) & 0xFFFFFFFF); };
/// Get 32 LSBs of data word
const int dataword32Lsb() const { return (int)(m_dataword & 0xFFFFFFFF); };
const uint32_t dataword32Lsb() const { return (uint32_t)(m_dataword & 0xFFFFFFFF); };
/// Get the track address (identifies track primitives used for reconstruction)
const std::map<int, int>& trackAddress() const {
return m_trackAddress;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ namespace l1t {

auto payload = block.payload();

int nwords = 2; // every link transmits 2 words per event
unsigned int nWords = 6; // every link transmits 6 words (3 muons) per bx
int nBX, firstBX, lastBX;
nBX = int(ceil(block.header().getSize() / nwords));
nBX = int(ceil(block.header().getSize() / nWords));
getBXRange(nBX, firstBX, lastBX);
// only use central BX for now
//firstBX = 0;
Expand All @@ -44,12 +44,13 @@ namespace l1t {

// Loop over multiple BX and then number of muons filling muon collection
for (int bx = firstBX; bx <= lastBX; ++bx) {
for (unsigned nWord = 0; nWord < block.header().getSize(); nWord += 2) {
for (unsigned nWord = 0; nWord < nWords && i < block.header().getSize(); nWord += 2) {
uint32_t raw_data_00_31 = payload[i++];
uint32_t raw_data_32_63 = payload[i++];
LogDebug("L1T|Muon") << "raw_data_00_31 = 0x" << hex << raw_data_00_31 << " raw_data_32_63 = 0x" << raw_data_32_63;
// skip empty muons (all 64 bits 0)
if (raw_data_00_31 == 0 && raw_data_32_63 == 0) {
// skip empty muons
// the msb are reserved for global information
if ((raw_data_00_31 & 0x7FFFFFFF) == 0 && (raw_data_32_63 & 0x7FFFFFFF) == 0) {
LogDebug("L1T|Muon") << "Raw data is zero. Skip.";
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ namespace l1t {

auto payload = block.payload();

int nwords = 2; // every link transmits 2 words per event
unsigned int nWords = 6; // every link transmits 6 words (3 muons) per bx
int nBX, firstBX, lastBX;
nBX = int(ceil(block.header().getSize() / nwords));
nBX = int(ceil(block.header().getSize() / nWords));
getBXRange(nBX, firstBX, lastBX);
// only use central BX for now
//firstBX = 0;
Expand Down Expand Up @@ -74,12 +74,13 @@ namespace l1t {

// Loop over multiple BX and then number of muons filling muon collection
for (int bx = firstBX; bx <= lastBX; ++bx) {
for (unsigned nWord = 0; nWord < block.header().getSize(); nWord += 2) {
for (unsigned nWord = 0; nWord < nWords && i < block.header().getSize(); nWord += 2) {
uint32_t raw_data_00_31 = payload[i++];
uint32_t raw_data_32_63 = payload[i++];
LogDebug("L1T|Muon") << "raw_data_00_31 = 0x" << hex << raw_data_00_31 << " raw_data_32_63 = 0x" << raw_data_32_63;
// skip empty muons (all 64 bits 0)
if (raw_data_00_31 == 0 && raw_data_32_63 == 0) {
// skip empty muons
// the msb are reserved for global information
if ((raw_data_00_31 & 0x7FFFFFFF) == 0 && (raw_data_32_63 & 0x7FFFFFFF) == 0) {
LogDebug("L1T|Muon") << "Raw data is zero. Skip.";
continue;
}
Expand Down
2 changes: 2 additions & 0 deletions L1Trigger/L1TMuon/interface/RegionalMuonRawDigiTranslator.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ namespace l1t {
static const unsigned trackAddressMask_ = 0x1FFFFFFF;
static const unsigned trackAddressShift_ = 2;
// relative shifts within track address
static const unsigned bmtfTrAddrSegSelMask_ = 0xF;
static const unsigned bmtfTrAddrSegSelShift_ = 21;
static const unsigned bmtfTrAddrDetSideShift_ = 20;
static const unsigned bmtfTrAddrWheelMask_ = 0x3;
static const unsigned bmtfTrAddrWheelShift_ = 18;
Expand Down
37 changes: 27 additions & 10 deletions L1Trigger/L1TMuon/src/RegionalMuonRawDigiTranslator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,17 @@ l1t::RegionalMuonRawDigiTranslator::fillRegionalMuonCand(RegionalMuonCand& mu, u
// set track address with subaddresses
int rawTrackAddress = (raw_data_32_63 >> trackAddressShift_) & trackAddressMask_;
if (tf == bmtf) {
int segSel = (rawTrackAddress >> bmtfTrAddrSegSelShift_) & bmtfTrAddrSegSelMask_;
int detSide = (rawTrackAddress >> bmtfTrAddrDetSideShift_) & 0x1;
int wheel = (1 - 2*detSide) * ((rawTrackAddress >> bmtfTrAddrWheelShift_) & bmtfTrAddrWheelMask_);
int statAddr1 = (rawTrackAddress >> bmtfTrAddrStat1Shift_) & bmtfTrAddrStat1Mask_;
int statAddr2 = (rawTrackAddress >> bmtfTrAddrStat2Shift_) & bmtfTrAddrStat2Mask_;
int statAddr3 = (rawTrackAddress >> bmtfTrAddrStat3Shift_) & bmtfTrAddrStat3Mask_;
int statAddr4 = (rawTrackAddress >> bmtfTrAddrStat4Shift_) & bmtfTrAddrStat4Mask_;
int statAddr1 = ((rawTrackAddress >> bmtfTrAddrStat1Shift_) & bmtfTrAddrStat1Mask_)
| ((segSel & 0x1) << 2);
int statAddr2 = ((rawTrackAddress >> bmtfTrAddrStat2Shift_) & bmtfTrAddrStat2Mask_)
| ((segSel & 0x2) << 3);
int statAddr3 = ((rawTrackAddress >> bmtfTrAddrStat3Shift_) & bmtfTrAddrStat3Mask_)
| ((segSel & 0x4) << 2);
int statAddr4 = ((rawTrackAddress >> bmtfTrAddrStat4Shift_) & bmtfTrAddrStat4Mask_)
| ((segSel & 0x8) << 1);
mu.setTrackSubAddress(RegionalMuonCand::kWheel, wheel);
mu.setTrackSubAddress(RegionalMuonCand::kStat1, statAddr1);
mu.setTrackSubAddress(RegionalMuonCand::kStat2, statAddr2);
Expand Down Expand Up @@ -74,12 +79,24 @@ l1t::RegionalMuonRawDigiTranslator::generatePackedDataWords(const RegionalMuonCa
int tf = mu.trackFinderType();
int rawTrkAddr = 0;
if (tf == bmtf) {
rawTrkAddr = (mu.trackSubAddress(RegionalMuonCand::kWheel) < 0) << bmtfTrAddrDetSideShift_
| (abs(mu.trackSubAddress(RegionalMuonCand::kWheel)) & bmtfTrAddrWheelMask_) << bmtfTrAddrWheelShift_
| (mu.trackSubAddress(RegionalMuonCand::kStat1) & bmtfTrAddrStat1Mask_) << bmtfTrAddrStat1Shift_
| (mu.trackSubAddress(RegionalMuonCand::kStat2) & bmtfTrAddrStat2Mask_) << bmtfTrAddrStat2Shift_
| (mu.trackSubAddress(RegionalMuonCand::kStat3) & bmtfTrAddrStat3Mask_) << bmtfTrAddrStat3Shift_
| (mu.trackSubAddress(RegionalMuonCand::kStat4) & bmtfTrAddrStat4Mask_) << bmtfTrAddrStat4Shift_;
int wheel = mu.trackSubAddress(RegionalMuonCand::kWheel);
int stat1 = mu.trackSubAddress(RegionalMuonCand::kStat1);
int stat2 = mu.trackSubAddress(RegionalMuonCand::kStat2);
int stat3 = mu.trackSubAddress(RegionalMuonCand::kStat3);
int stat4 = mu.trackSubAddress(RegionalMuonCand::kStat4);

int segSel = (stat1 & 0x4) >> 2
| (stat2 & 0x10) >> 3
| (stat3 & 0x10) >> 2
| (stat4 & 0x10) >> 1;

rawTrkAddr = (segSel & bmtfTrAddrSegSelMask_) << bmtfTrAddrSegSelShift_
| (wheel < 0) << bmtfTrAddrDetSideShift_
| (abs(wheel) & bmtfTrAddrWheelMask_) << bmtfTrAddrWheelShift_
| (stat1 & bmtfTrAddrStat1Mask_) << bmtfTrAddrStat1Shift_
| (stat2 & bmtfTrAddrStat2Mask_) << bmtfTrAddrStat2Shift_
| (stat3 & bmtfTrAddrStat3Mask_) << bmtfTrAddrStat3Shift_
| (stat4 & bmtfTrAddrStat4Mask_) << bmtfTrAddrStat4Shift_;
} else if (tf == emtf_neg || tf == emtf_pos) {
rawTrkAddr = (mu.trackSubAddress(RegionalMuonCand::kME12) & emtfTrAddrMe12Mask_) << emtfTrAddrMe12Shift_
| (mu.trackSubAddress(RegionalMuonCand::kME22) & emtfTrAddrMe22Mask_) << emtfTrAddrMe22Shift_;
Expand Down

0 comments on commit 2a14167

Please sign in to comment.