00001
00002 #include "L1Trigger/RPCTrigger/interface/RPCTBMuon.h"
00003 #ifndef _STAND_ALONE
00004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00005 #endif // _STAND_ALONE
00006 #include "L1Trigger/RPCTrigger/interface/RPCException.h"
00007
00008 #include <sstream>
00009 #include <iomanip>
00010 #include <iostream>
00011
00012 using namespace std;
00013
00014 RPCTBMuon::RPCTBMuon(): RPCMuon() {
00015 m_Killed = false;
00016
00017 m_GBData = 0;
00018
00019 m_EtaAddress = 0;
00020 m_PhiAddress = 0;
00021 }
00022
00023 RPCTBMuon::RPCTBMuon(int ptCode, int quality, int sign,
00024 int patternNum, unsigned short firedPlanes):
00025 RPCMuon(ptCode, quality, sign, patternNum, firedPlanes)
00026 {
00027 m_Killed = false;
00028
00029 m_GBData = 0;
00030
00031 m_EtaAddress = 0;
00032 m_PhiAddress = 0;
00033
00034 m_muonBitsType = mbtUnset;
00035 }
00036
00037 RPCTBMuon::RPCTBMuon(int ptCode, int quality, int sign, MuonBitsType muonBitsType):
00038 RPCMuon(ptCode, quality, sign, 0, 0) {
00039 m_Killed = false;
00040
00041 m_GBData = 0;
00042
00043 m_EtaAddress = 0;
00044 m_PhiAddress = 0;
00045
00046 m_muonBitsType = muonBitsType;
00047 }
00048
00055 std::string RPCTBMuon::printDebugInfo(int debugFormat) const {
00056
00057 std::ostringstream sDebugInfo;
00058 if (debugFormat==1){
00059
00060 sDebugInfo << "TBMuon: code: " << getPtCode()
00061 << " etaAddr: " << getEtaAddr()
00062 << " phiAddr: " << getPhiAddr()
00063 << " sgAddr: " << getSegmentAddr()
00064 << " scAddr: " << getSectorAddr()
00065 << " gbData: " << getGBData();
00066
00067 }
00068 else {
00069 sDebugInfo << "TBMuon pt "<< getPtCode()
00070 << " ql " <<getQuality()
00071 << " sgn " << getSign()
00072 << " tw " << getTower()
00073 << " sc " << getLogSector()
00074 << " sg " << getLogSegment()
00075 << " phi " << getPhiAddr()
00076 << " eta " << getEtaAddr()
00077 << " gbD " << getGBData()
00078 << " bits " << toBits(mbtFSBOut);
00079 }
00080
00081 return sDebugInfo.str();
00082
00083 }
00084
00085
00086
00088 int RPCTBMuon::getCode() const { return (m_Quality<<6 | m_PtCode << 1 | m_Sign ); }
00089
00091 void RPCTBMuon::setCode(int code) {
00092 m_Quality = (code & (3<<5))>>5;
00093 m_PtCode = code & 31;
00094 }
00095
00096
00097 void RPCTBMuon::setPhiAddr(int phiAddr) { m_PhiAddress = phiAddr;}
00098
00099 void RPCTBMuon::setSectorAddr(int sectorAddr){ m_PhiAddress = m_PhiAddress | sectorAddr<<4;}
00100
00101 void RPCTBMuon::setEtaAddr(int etaAddr) { m_EtaAddress = etaAddr;}
00102
00103 void RPCTBMuon::setAddress(int etaAddr, int phiAddr) {
00104 m_EtaAddress = etaAddr;
00105 m_PhiAddress = phiAddr;
00106 }
00107
00108 void RPCTBMuon::setAddress(int tbNumber, int tbTower, int phiAddr) {
00109 m_EtaAddress = (tbNumber<<2) | tbTower;
00110 m_PhiAddress = phiAddr;
00111 }
00112
00113 void RPCTBMuon::setGBData(unsigned int gbData) {
00114 m_GBData = gbData;
00115 }
00116
00117 int RPCTBMuon::getEtaAddr() const { return m_EtaAddress; }
00118
00119 int RPCTBMuon::getPhiAddr() const { return m_PhiAddress; }
00120
00121 int RPCTBMuon::getSegmentAddr() const { return m_PhiAddress & 15; }
00122
00123 int RPCTBMuon::getSectorAddr() const { return (m_PhiAddress & 0xF0)>>4; }
00124
00125 int RPCTBMuon::getContinSegmAddr() const { return getSectorAddr()*12 + getSegmentAddr();}
00126
00127 void RPCTBMuon::setCodeAndPhiAddr(int code, int phiAddr) {
00128 setCode(code);
00129 m_PhiAddress = phiAddr;
00130 }
00131
00132 void RPCTBMuon::setCodeAndEtaAddr(int code, int etaAddr) {
00133 setCode(code);
00134 m_EtaAddress = etaAddr;
00135 }
00136
00137 int RPCTBMuon::getGBData() const { return m_GBData;}
00138
00139 std::string RPCTBMuon::getGBDataBitStr() const {
00140 std::string str = "00";
00141 if (m_GBData == 1)
00142 str = "01";
00143 else if (m_GBData == 2)
00144 str = "10";
00145 else if (m_GBData == 3)
00146 str = "11";
00147 return str;
00148 }
00149
00150 void RPCTBMuon::setGBDataKilledFirst() { m_GBData = m_GBData | 1;}
00151
00152 void RPCTBMuon::setGBDataKilledLast() { m_GBData = m_GBData | 2; }
00153
00154 bool RPCTBMuon::gBDataKilledFirst() const { return (m_GBData & 1);}
00155
00156 bool RPCTBMuon::gBDataKilledLast() const { return (m_GBData & 2);}
00157
00158
00159
00160 void RPCTBMuon::kill() { m_Killed = true; }
00161
00164 bool RPCTBMuon::wasKilled() const {
00165 if(m_PtCode > 0 && m_Killed)
00166 return true;
00167 else return false;
00168 }
00169
00172 bool RPCTBMuon::isLive() const {
00173 if(m_PtCode > 0 && !m_Killed)
00174 return true;
00175 else return false;
00176 }
00177
00178
00179 #ifndef _STAND_ALONE
00180 RPCTBMuon::RPCTBMuon(const RPCPacMuon& pacMuon):
00181 RPCMuon(pacMuon)
00182 {
00183 m_Killed = false;
00184
00185 m_GBData = 0;
00186
00187 m_EtaAddress = 0;
00188 m_PhiAddress = 0;
00189 }
00190 #endif //_STAND_ALONE
00191
00192
00193 unsigned int RPCTBMuon::toBits(RPCTBMuon::MuonBitsType muonBitsType) const {
00194 if (muonBitsType == mbtPACOut) {
00195 return PACOut::toBits(*this);
00196 }
00197 else if (muonBitsType == mbtTBSortOut) {
00198 return TBOut::toBits(*this);
00199 }
00200 else if (muonBitsType == mbtTCSortOut) {
00201 return TCOut::toBits(*this);
00202 }
00203 else if (muonBitsType == mbtHSBOut) {
00204 return HSBOut::toBits(*this);
00205 }
00206 else if (muonBitsType == mbtFSBOut) {
00207 return FSBOut::toBits(*this);
00208 }
00209 else {
00210 throw RPCException("unknown value of muonBitsType");
00211
00212 }
00213 return 0;
00214 }
00215
00216 void RPCTBMuon::fromBits(RPCTBMuon::MuonBitsType muonBitsType, unsigned int value) {
00217 if (muonBitsType == mbtPACOut) {
00218 PACOut::fromBits(*this, value);
00219 }
00220 else if (muonBitsType == mbtTBSortOut) {
00221 TBOut::fromBits(*this, value);
00222 }
00223 else if (muonBitsType == mbtTCSortOut) {
00224 TCOut::fromBits(*this, value);
00225 }
00226 else if (muonBitsType == mbtHSBOut) {
00227 HSBOut::fromBits(*this, value);
00228 }
00229 else if (muonBitsType == mbtFSBOut) {
00230 FSBOut::fromBits(*this, value);
00231 }
00232 else {
00233 RPCException("unknown value of muonBitsType");
00234
00235 }
00236 }
00237
00238 void RPCTBMuon::PACOut::fromBits(RPCTBMuon& muon, unsigned int value) {
00239 unsigned int shift = 0;
00240 muon.m_Sign = (value & (m_signBitsMask<<shift)) >> shift; shift += m_signBitsCnt;
00241 muon.m_PtCode = (value & (m_ptBitsMask<<shift)) >> shift; shift += m_ptBitsCnt;
00242 muon.m_Quality = (value & (m_qualBitsMask<<shift)) >> shift; shift += m_qualBitsCnt;
00243 }
00244
00245 unsigned int RPCTBMuon::PACOut::toBits(const RPCTBMuon& muon) {
00246 unsigned int value = 0;
00247 unsigned int shift = 0;
00248 value = (muon.m_Sign<<shift); shift += m_signBitsCnt;
00249 value = value | (muon.m_PtCode<<shift); shift += m_ptBitsCnt;
00250 value = value | (muon.m_Quality<<shift); shift += m_qualBitsCnt;
00251
00252 return value;
00253 }
00254
00255
00256 void RPCTBMuon::TBOut::fromBits(RPCTBMuon& muon, unsigned int value) {
00257 unsigned int shift = 0;
00258 muon.m_Sign = (value & (m_signBitsMask<<shift)) >> shift; shift += m_signBitsCnt;
00259 muon.m_PtCode = (value & (m_ptBitsMask<<shift)) >> shift; shift += m_ptBitsCnt;
00260 muon.m_Quality = (value & (m_qualBitsMask<<shift)) >> shift; shift += m_qualBitsCnt;
00261 muon.m_PhiAddress = (value & (m_phiBitsMask<<shift)) >> shift; shift += m_phiBitsCnt;
00262 muon.m_EtaAddress = (value & (m_etaBitsMask<<shift)) >> shift; shift += m_etaBitsCnt;
00263 muon.m_GBData = (value & (m_gbDataBitsMask<<shift))>> shift; shift += m_gbDataBitsCnt;
00264 }
00265
00266 unsigned int RPCTBMuon::TBOut::toBits(const RPCTBMuon& muon) {
00267 unsigned int value = 0;
00268 unsigned int shift = 0;
00269 value = (muon.m_Sign<<shift); shift += m_signBitsCnt;
00270 value = value | (muon.m_PtCode<<shift); shift += m_ptBitsCnt;
00271 value = value | (muon.m_Quality<<shift); shift += m_qualBitsCnt;
00272 value = value | (muon.m_PhiAddress<<shift); shift += m_phiBitsCnt;
00273 value = value | (muon.m_EtaAddress<<shift); shift += m_etaBitsCnt;
00274 value = value | (muon.m_GBData<<shift); shift += m_gbDataBitsCnt;
00275 return value;
00276 }
00277
00278
00279 void RPCTBMuon::TCOut::fromBits(RPCTBMuon& muon, unsigned int value) {
00280 unsigned int shift = 0;
00281 muon.m_Sign = (value & (m_signBitsMask<<shift)) >> shift; shift += m_signBitsCnt;
00282 muon.m_PtCode = (value & (m_ptBitsMask<<shift)) >> shift; shift += m_ptBitsCnt;
00283 muon.m_Quality = (value & (m_qualBitsMask<<shift)) >> shift; shift += m_qualBitsCnt;
00284 muon.m_PhiAddress = (value & (m_phiBitsMask<<shift)) >> shift; shift += m_phiBitsCnt;
00285 muon.m_EtaAddress = (value & (m_etaBitsMask<<shift)) >> shift; shift += m_etaBitsCnt;
00286 muon.m_GBData = (value & (m_gbDataBitsMask<<shift))>> shift; shift += m_gbDataBitsCnt;
00287 }
00288
00289 unsigned int RPCTBMuon::TCOut::toBits(const RPCTBMuon& muon) {
00290 unsigned int value = 0;
00291 unsigned int shift = 0;
00292 value = (muon.m_Sign<<shift); shift += m_signBitsCnt;
00293 value = value | (muon.m_PtCode<<shift); shift += m_ptBitsCnt;
00294 value = value | (muon.m_Quality<<shift); shift += m_qualBitsCnt;
00295 value = value | (muon.m_PhiAddress<<shift); shift += m_phiBitsCnt;
00296 value = value | (muon.m_EtaAddress<<shift); shift += m_etaBitsCnt;
00297 value = value | (muon.m_GBData<<shift); shift += m_gbDataBitsCnt;
00298 return value;
00299 }
00300
00301
00302 unsigned int RPCTBMuon::HSBOut::toBits(const RPCTBMuon& muon) {
00303 unsigned int value = 0;
00304
00305 unsigned int shift = 0;
00306 value = value | (muon.m_Sign<<shift); shift += m_signBitsCnt;
00307
00308 value = value | (muon.m_PtCode<<shift); shift += m_ptBitsCnt;
00309 value = value | (muon.m_Quality<<shift); shift += m_qualBitsCnt;
00310 value = value | (muon.m_PhiAddress<<shift); shift += m_phiBitsCnt;
00311 value = value | (muon.m_EtaAddress<<shift); shift += m_etaBitsCnt;
00312
00313 return value;
00314 }
00315
00316 void RPCTBMuon::HSBOut::fromBits(RPCTBMuon& muon, unsigned int value) {
00317 unsigned int shift = 0;
00318 muon.m_Sign = (value & (m_signBitsMask<<shift)) >> shift; shift += m_signBitsCnt;
00319 muon.m_PtCode = (value & (m_ptBitsMask<<shift)) >> shift; shift += m_ptBitsCnt;
00320 muon.m_Quality = (value & (m_qualBitsMask<<shift)) >> shift; shift += m_qualBitsCnt;
00321 muon.m_PhiAddress = (value & (m_phiBitsMask<<shift)) >> shift; shift += m_phiBitsCnt;
00322 muon.m_EtaAddress = (value & (m_etaBitsMask<<shift)) >> shift; shift += m_etaBitsCnt;
00323 }
00324
00325 unsigned int RPCTBMuon::FSBOut::toBits(const RPCTBMuon& muon) {
00326 unsigned int value = 0;
00327
00328 unsigned int shift = 0;
00329
00330 unsigned int ptCode = (~(muon.m_PtCode)) & m_ptBitsMask;
00331 unsigned int quality = (~(muon.m_Quality)) & m_qualBitsMask;
00332
00333 value = value | muon.m_PhiAddress; shift += m_phiBitsCnt;
00334 value = value | (ptCode<<shift); shift += m_ptBitsCnt;
00335 value = value | (quality<<shift); shift += m_qualBitsCnt;
00336
00337
00338 value = value | (muon.m_EtaAddress<<shift); shift += m_etaBitsCnt + 1;
00339 value = value | (muon.m_Sign<<shift); shift += m_signBitsCnt;
00340
00341 return value;
00342 }
00343
00344 void RPCTBMuon::FSBOut::fromBits(RPCTBMuon& muon, unsigned int value) {
00345 unsigned int shift = 0;
00346 muon.m_PhiAddress = value & m_phiBitsMask; shift += m_phiBitsCnt;
00347 muon.m_PtCode = (value & (m_ptBitsMask<<shift)) >> shift; shift += m_ptBitsCnt;
00348 muon.m_Quality = (value & (m_qualBitsMask<<shift)) >> shift; shift += m_qualBitsCnt;
00349
00350
00351 muon.m_EtaAddress = (value & (m_etaBitsMask<<shift)) >> shift; shift += m_etaBitsCnt + 1;
00352 muon.m_Sign = (value & (m_signBitsMask<<shift)) >> shift; shift += m_signBitsCnt;
00353
00354 muon.m_PtCode = (~(muon.m_PtCode)) & m_ptBitsMask;
00355 muon.m_Quality = (~(muon.m_Quality)) & m_qualBitsMask;
00356 }
00357
00358
00359 std::string RPCTBMuon::toString(int format) const {
00360 ostringstream ostr;
00361 if(format == 0) {
00362 ostr<<"qu "<<m_Quality<<", pt "<<setw(2)<<m_PtCode<<", sig "<<m_Sign
00363 <<", phi "<<setw(3)<<m_PhiAddress<<", eta "<<setw(2)<<m_EtaAddress;
00364 }
00365 else if( format == 1) {
00366 ostr<<" "<<m_Quality<<" "<<setw(2)<<m_PtCode<<" "<<m_Sign
00367 <<" "<<setw(3)<<m_PhiAddress<<" "<<setw(2)<<m_EtaAddress;
00368 }
00369 else if( format == 2) {
00370 ostr<<" "<<m_Quality<<" "<<setw(2)<<m_PtCode<<" "<<m_Sign;
00371 }
00372
00373 return ostr.str();
00374 }