File indexing completed on 2024-04-06 12:21:41
0001
0002 #include "L1Trigger/RPCTrigger/interface/RPCTBMuon.h"
0003 #ifndef _STAND_ALONE
0004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0005 #endif
0006 #include "L1Trigger/RPCTrigger/interface/RPCException.h"
0007
0008 #include <sstream>
0009 #include <iomanip>
0010 #include <iostream>
0011
0012 using namespace std;
0013
0014 RPCTBMuon::RPCTBMuon() : RPCMuon() {
0015 m_Killed = false;
0016
0017 m_GBData = 0;
0018
0019 m_EtaAddress = 0;
0020 m_PhiAddress = 0;
0021
0022 m_muonBitsType = mbtUnset;
0023 }
0024
0025 RPCTBMuon::RPCTBMuon(int ptCode, int quality, int sign, int patternNum, unsigned short firedPlanes)
0026 : RPCMuon(ptCode, quality, sign, patternNum, firedPlanes) {
0027 m_Killed = false;
0028
0029 m_GBData = 0;
0030
0031 m_EtaAddress = 0;
0032 m_PhiAddress = 0;
0033
0034 m_muonBitsType = mbtUnset;
0035 }
0036
0037 RPCTBMuon::RPCTBMuon(int ptCode, int quality, int sign, MuonBitsType muonBitsType)
0038 : RPCMuon(ptCode, quality, sign, 0, 0) {
0039 m_Killed = false;
0040
0041 m_GBData = 0;
0042
0043 m_EtaAddress = 0;
0044 m_PhiAddress = 0;
0045
0046 m_muonBitsType = muonBitsType;
0047 }
0048
0049
0050
0051
0052
0053
0054
0055 std::string RPCTBMuon::printDebugInfo(int debugFormat) const {
0056 std::ostringstream sDebugInfo;
0057 if (debugFormat == 1) {
0058
0059 sDebugInfo << "TBMuon: code: " << getPtCode() << " etaAddr: " << getEtaAddr() << " phiAddr: " << getPhiAddr()
0060 << " sgAddr: " << getSegmentAddr() << " scAddr: " << getSectorAddr() << " gbData: " << getGBData();
0061
0062 } else {
0063 sDebugInfo << "TBMuon pt " << getPtCode() << " ql " << getQuality() << " sgn " << getSign() << " tw " << getTower()
0064 << " sc " << getLogSector() << " sg " << getLogSegment() << " phi " << getPhiAddr() << " eta "
0065 << getEtaAddr() << " gbD " << getGBData() << " bits " << toBits(mbtFSBOut);
0066 }
0067
0068 return sDebugInfo.str();
0069 }
0070
0071
0072
0073
0074 int RPCTBMuon::getCode() const {
0075
0076 unsigned int signLocal = 0;
0077 if (m_Sign == 0)
0078 signLocal = 1;
0079 return (m_Quality << 6 | m_PtCode << 1 | signLocal);
0080 }
0081
0082
0083 void RPCTBMuon::setCode(int code) {
0084 m_Quality = (code & (3 << 5)) >> 5;
0085 m_PtCode = code & 31;
0086 }
0087
0088 void RPCTBMuon::setPhiAddr(int phiAddr) { m_PhiAddress = phiAddr; }
0089
0090 void RPCTBMuon::setSectorAddr(int sectorAddr) { m_PhiAddress = m_PhiAddress | sectorAddr << 4; }
0091
0092 void RPCTBMuon::setEtaAddr(int etaAddr) { m_EtaAddress = etaAddr; }
0093
0094 void RPCTBMuon::setAddress(int etaAddr, int phiAddr) {
0095 m_EtaAddress = etaAddr;
0096 m_PhiAddress = phiAddr;
0097 }
0098
0099 void RPCTBMuon::setAddress(int tbNumber, int tbTower, int phiAddr) {
0100 m_EtaAddress = (tbNumber << 2) | tbTower;
0101 m_PhiAddress = phiAddr;
0102 }
0103
0104 void RPCTBMuon::setGBData(unsigned int gbData) { m_GBData = gbData; }
0105
0106 int RPCTBMuon::getEtaAddr() const { return m_EtaAddress; }
0107
0108 int RPCTBMuon::getPhiAddr() const { return m_PhiAddress; }
0109
0110 int RPCTBMuon::getSegmentAddr() const { return m_PhiAddress & 15; }
0111
0112 int RPCTBMuon::getSectorAddr() const { return (m_PhiAddress & 0xF0) >> 4; }
0113
0114 int RPCTBMuon::getContinSegmAddr() const { return getSectorAddr() * 12 + getSegmentAddr(); }
0115
0116 void RPCTBMuon::setCodeAndPhiAddr(int code, int phiAddr) {
0117 setCode(code);
0118 m_PhiAddress = phiAddr;
0119 }
0120
0121 void RPCTBMuon::setCodeAndEtaAddr(int code, int etaAddr) {
0122 setCode(code);
0123 m_EtaAddress = etaAddr;
0124 }
0125
0126 int RPCTBMuon::getGBData() const { return m_GBData; }
0127
0128 std::string RPCTBMuon::getGBDataBitStr() const {
0129 std::string str = "00";
0130 if (m_GBData == 1)
0131 str = "01";
0132 else if (m_GBData == 2)
0133 str = "10";
0134 else if (m_GBData == 3)
0135 str = "11";
0136 return str;
0137 }
0138
0139 void RPCTBMuon::setGBDataKilledFirst() { m_GBData = m_GBData | 1; }
0140
0141 void RPCTBMuon::setGBDataKilledLast() { m_GBData = m_GBData | 2; }
0142
0143 bool RPCTBMuon::gBDataKilledFirst() const { return (m_GBData & 1); }
0144
0145 bool RPCTBMuon::gBDataKilledLast() const { return (m_GBData & 2); }
0146
0147
0148 void RPCTBMuon::kill() { m_Killed = true; }
0149
0150
0151
0152 bool RPCTBMuon::wasKilled() const {
0153 if (m_PtCode > 0 && m_Killed)
0154 return true;
0155 else
0156 return false;
0157 }
0158
0159
0160
0161 bool RPCTBMuon::isLive() const {
0162 if (m_PtCode > 0 && !m_Killed)
0163 return true;
0164 else
0165 return false;
0166 }
0167
0168
0169 #ifndef _STAND_ALONE
0170 RPCTBMuon::RPCTBMuon(const RPCPacMuon& pacMuon) : RPCMuon(pacMuon) {
0171 m_Killed = false;
0172
0173 m_GBData = 0;
0174
0175 m_EtaAddress = 0;
0176 m_PhiAddress = 0;
0177 m_muonBitsType = mbtUnset;
0178 }
0179 #endif
0180
0181
0182 unsigned int RPCTBMuon::toBits(RPCTBMuon::MuonBitsType muonBitsType) const {
0183 if (muonBitsType == mbtPACOut) {
0184 return PACOut::toBits(*this);
0185 } else if (muonBitsType == mbtTBSortOut) {
0186 return TBOut::toBits(*this);
0187 } else if (muonBitsType == mbtTCSortOut) {
0188 return TCOut::toBits(*this);
0189 } else if (muonBitsType == mbtHSBOut) {
0190 return HSBOut::toBits(*this);
0191 } else if (muonBitsType == mbtFSBOut) {
0192 return FSBOut::toBits(*this);
0193 } else {
0194 throw RPCException("unknown value of muonBitsType");
0195
0196 }
0197 return 0;
0198 }
0199
0200 void RPCTBMuon::fromBits(RPCTBMuon::MuonBitsType muonBitsType, unsigned int value) {
0201 if (muonBitsType == mbtPACOut) {
0202 PACOut::fromBits(*this, value);
0203 } else if (muonBitsType == mbtTBSortOut) {
0204 TBOut::fromBits(*this, value);
0205 } else if (muonBitsType == mbtTCSortOut) {
0206 TCOut::fromBits(*this, value);
0207 } else if (muonBitsType == mbtHSBOut) {
0208 HSBOut::fromBits(*this, value);
0209 } else if (muonBitsType == mbtFSBOut) {
0210 FSBOut::fromBits(*this, value);
0211 } else {
0212 RPCException("unknown value of muonBitsType");
0213
0214 }
0215 }
0216
0217 void RPCTBMuon::PACOut::fromBits(RPCTBMuon& muon, unsigned int value) {
0218 unsigned int shift = 0;
0219 muon.m_Sign = (value & (m_signBitsMask << shift)) >> shift;
0220 shift += m_signBitsCnt;
0221 muon.m_PtCode = (value & (m_ptBitsMask << shift)) >> shift;
0222 shift += m_ptBitsCnt;
0223 muon.m_Quality = (value & (m_qualBitsMask << shift)) >> shift;
0224 shift += m_qualBitsCnt;
0225 }
0226
0227 unsigned int RPCTBMuon::PACOut::toBits(const RPCTBMuon& muon) {
0228 unsigned int value = 0;
0229 unsigned int shift = 0;
0230 value = (muon.m_Sign << shift);
0231 shift += m_signBitsCnt;
0232 value = value | (muon.m_PtCode << shift);
0233 shift += m_ptBitsCnt;
0234 value = value | (muon.m_Quality << shift);
0235 shift += m_qualBitsCnt;
0236
0237 return value;
0238 }
0239
0240
0241 void RPCTBMuon::TBOut::fromBits(RPCTBMuon& muon, unsigned int value) {
0242 unsigned int shift = 0;
0243 muon.m_Sign = (value & (m_signBitsMask << shift)) >> shift;
0244 shift += m_signBitsCnt;
0245 muon.m_PtCode = (value & (m_ptBitsMask << shift)) >> shift;
0246 shift += m_ptBitsCnt;
0247 muon.m_Quality = (value & (m_qualBitsMask << shift)) >> shift;
0248 shift += m_qualBitsCnt;
0249 muon.m_PhiAddress = (value & (m_phiBitsMask << shift)) >> shift;
0250 shift += m_phiBitsCnt;
0251 muon.m_EtaAddress = (value & (m_etaBitsMask << shift)) >> shift;
0252 shift += m_etaBitsCnt;
0253 muon.m_GBData = (value & (m_gbDataBitsMask << shift)) >> shift;
0254 shift += m_gbDataBitsCnt;
0255 }
0256
0257 unsigned int RPCTBMuon::TBOut::toBits(const RPCTBMuon& muon) {
0258 unsigned int value = 0;
0259 unsigned int shift = 0;
0260 value = (muon.m_Sign << shift);
0261 shift += m_signBitsCnt;
0262 value = value | (muon.m_PtCode << shift);
0263 shift += m_ptBitsCnt;
0264 value = value | (muon.m_Quality << shift);
0265 shift += m_qualBitsCnt;
0266 value = value | (muon.m_PhiAddress << shift);
0267 shift += m_phiBitsCnt;
0268 value = value | (muon.m_EtaAddress << shift);
0269 shift += m_etaBitsCnt;
0270 value = value | (muon.m_GBData << shift);
0271 shift += m_gbDataBitsCnt;
0272 return value;
0273 }
0274
0275
0276 void RPCTBMuon::TCOut::fromBits(RPCTBMuon& muon, unsigned int value) {
0277 unsigned int shift = 0;
0278 muon.m_Sign = (value & (m_signBitsMask << shift)) >> shift;
0279 shift += m_signBitsCnt;
0280 muon.m_PtCode = (value & (m_ptBitsMask << shift)) >> shift;
0281 shift += m_ptBitsCnt;
0282 muon.m_Quality = (value & (m_qualBitsMask << shift)) >> shift;
0283 shift += m_qualBitsCnt;
0284 muon.m_PhiAddress = (value & (m_phiBitsMask << shift)) >> shift;
0285 shift += m_phiBitsCnt;
0286 muon.m_EtaAddress = (value & (m_etaBitsMask << shift)) >> shift;
0287 shift += m_etaBitsCnt;
0288 muon.m_GBData = (value & (m_gbDataBitsMask << shift)) >> shift;
0289 shift += m_gbDataBitsCnt;
0290 }
0291
0292 unsigned int RPCTBMuon::TCOut::toBits(const RPCTBMuon& muon) {
0293 unsigned int value = 0;
0294 unsigned int shift = 0;
0295 value = (muon.m_Sign << shift);
0296 shift += m_signBitsCnt;
0297 value = value | (muon.m_PtCode << shift);
0298 shift += m_ptBitsCnt;
0299 value = value | (muon.m_Quality << shift);
0300 shift += m_qualBitsCnt;
0301 value = value | (muon.m_PhiAddress << shift);
0302 shift += m_phiBitsCnt;
0303 value = value | (muon.m_EtaAddress << shift);
0304 shift += m_etaBitsCnt;
0305 value = value | (muon.m_GBData << shift);
0306 shift += m_gbDataBitsCnt;
0307 return value;
0308 }
0309
0310
0311 unsigned int RPCTBMuon::HSBOut::toBits(const RPCTBMuon& muon) {
0312 unsigned int value = 0;
0313
0314 unsigned int shift = 0;
0315 value = value | (muon.m_Sign << shift);
0316 shift += m_signBitsCnt;
0317
0318 value = value | (muon.m_PtCode << shift);
0319 shift += m_ptBitsCnt;
0320 value = value | (muon.m_Quality << shift);
0321 shift += m_qualBitsCnt;
0322 value = value | (muon.m_PhiAddress << shift);
0323 shift += m_phiBitsCnt;
0324 value = value | (muon.m_EtaAddress << shift);
0325 shift += m_etaBitsCnt;
0326
0327 return value;
0328 }
0329
0330 void RPCTBMuon::HSBOut::fromBits(RPCTBMuon& muon, unsigned int value) {
0331 unsigned int shift = 0;
0332 muon.m_Sign = (value & (m_signBitsMask << shift)) >> shift;
0333 shift += m_signBitsCnt;
0334 muon.m_PtCode = (value & (m_ptBitsMask << shift)) >> shift;
0335 shift += m_ptBitsCnt;
0336 muon.m_Quality = (value & (m_qualBitsMask << shift)) >> shift;
0337 shift += m_qualBitsCnt;
0338 muon.m_PhiAddress = (value & (m_phiBitsMask << shift)) >> shift;
0339 shift += m_phiBitsCnt;
0340 muon.m_EtaAddress = (value & (m_etaBitsMask << shift)) >> shift;
0341 shift += m_etaBitsCnt;
0342 }
0343
0344 unsigned int RPCTBMuon::FSBOut::toBits(const RPCTBMuon& muon) {
0345 unsigned int value = 0;
0346
0347 unsigned int shift = 0;
0348
0349 unsigned int ptCode = (~(muon.m_PtCode)) & m_ptBitsMask;
0350 unsigned int quality = (~(muon.m_Quality)) & m_qualBitsMask;
0351
0352 value = value | muon.m_PhiAddress;
0353 shift += m_phiBitsCnt;
0354 value = value | (ptCode << shift);
0355 shift += m_ptBitsCnt;
0356 value = value | (quality << shift);
0357 shift += m_qualBitsCnt;
0358
0359
0360 value = value | (muon.m_EtaAddress << shift);
0361 shift += m_etaBitsCnt + 1;
0362 value = value | (muon.m_Sign << shift);
0363 shift += m_signBitsCnt;
0364
0365 return value;
0366 }
0367
0368 void RPCTBMuon::FSBOut::fromBits(RPCTBMuon& muon, unsigned int value) {
0369 unsigned int shift = 0;
0370 muon.m_PhiAddress = value & m_phiBitsMask;
0371 shift += m_phiBitsCnt;
0372 muon.m_PtCode = (value & (m_ptBitsMask << shift)) >> shift;
0373 shift += m_ptBitsCnt;
0374 muon.m_Quality = (value & (m_qualBitsMask << shift)) >> shift;
0375 shift += m_qualBitsCnt;
0376
0377
0378 muon.m_EtaAddress = (value & (m_etaBitsMask << shift)) >> shift;
0379 shift += m_etaBitsCnt + 1;
0380 muon.m_Sign = (value & (m_signBitsMask << shift)) >> shift;
0381 shift += m_signBitsCnt;
0382
0383 muon.m_PtCode = (~(muon.m_PtCode)) & m_ptBitsMask;
0384 muon.m_Quality = (~(muon.m_Quality)) & m_qualBitsMask;
0385 }
0386
0387 std::string RPCTBMuon::toString(int format) const {
0388 ostringstream ostr;
0389 if (format == 0) {
0390 ostr << "qu " << m_Quality << ", pt " << setw(2) << m_PtCode << ", sig " << m_Sign << ", phi " << setw(3)
0391 << m_PhiAddress << ", eta " << setw(2) << m_EtaAddress;
0392 } else if (format == 1) {
0393 ostr << " " << m_Quality << " " << setw(2) << m_PtCode << " " << m_Sign << " " << setw(3) << m_PhiAddress << " "
0394 << setw(2) << m_EtaAddress;
0395 } else if (format == 2) {
0396 ostr << " " << m_Quality << " " << setw(2) << m_PtCode << " " << m_Sign;
0397 }
0398
0399 return ostr.str();
0400 }