Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:20:49

0001 #include "L1Trigger/L1TMuon/interface/MuonTriggerPrimitive.h"
0002 
0003 // Muon primitive digi types
0004 #include "DataFormats/L1DTTrackFinder/interface/L1MuDTChambPhDigi.h"
0005 #include "DataFormats/L1DTTrackFinder/interface/L1MuDTChambThDigi.h"
0006 #include "DataFormats/CSCDigi/interface/CSCCorrelatedLCTDigi.h"
0007 #include "DataFormats/RPCRecHit/interface/RPCRecHit.h"
0008 #include "DataFormats/RPCDigi/interface/RPCDigi.h"
0009 #include "DataFormats/L1TMuon/interface/CPPFDigi.h"
0010 #include "DataFormats/GEMDigi/interface/GEMPadDigiCluster.h"
0011 #include "DataFormats/GEMDigi/interface/ME0TriggerDigi.h"
0012 
0013 // Muon detector ID types
0014 #include "DataFormats/MuonDetId/interface/DTChamberId.h"
0015 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
0016 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
0017 #include "DataFormats/MuonDetId/interface/GEMDetId.h"
0018 #include "DataFormats/MuonDetId/interface/ME0DetId.h"
0019 
0020 #include <iostream>
0021 
0022 using namespace L1TMuon;
0023 
0024 namespace {
0025   const char subsystem_names[][4] = {"DT", "CSC", "RPC", "GEM", "ME0"};
0026 }
0027 
0028 // _____________________________________________________________________________
0029 // Constructors from DT data
0030 TriggerPrimitive::TriggerPrimitive(const DTChamberId& detid,
0031                                    const L1MuDTChambPhDigi& digi_phi,
0032                                    const int segment_number)
0033     : _id(detid), _subsystem(L1TMuon::kDT) {
0034   calculateGlobalSector(detid, _globalsector, _subsector);
0035   _eta = 0.;
0036   _phi = 0.;
0037   _rho = 0.;
0038   _theta = 0.;
0039   // fill in information from theta trigger
0040   _dt.theta_bti_group = -1;
0041   _dt.segment_number = segment_number;
0042   _dt.theta_code = -1;
0043   _dt.theta_quality = -1;
0044   // now phi trigger
0045   _dt.bx = digi_phi.bxNum();
0046   _dt.wheel = digi_phi.whNum();
0047   _dt.sector = digi_phi.scNum();
0048   _dt.station = digi_phi.stNum();
0049   _dt.radialAngle = digi_phi.phi();
0050   _dt.bendingAngle = digi_phi.phiB();
0051   _dt.qualityCode = digi_phi.code();
0052   _dt.Ts2TagCode = digi_phi.Ts2Tag();
0053   _dt.BxCntCode = digi_phi.BxCnt();
0054   _dt.RpcBit = digi_phi.RpcBit();
0055 }
0056 
0057 TriggerPrimitive::TriggerPrimitive(const DTChamberId& detid,
0058                                    const L1MuDTChambThDigi& digi_th,
0059                                    const int theta_bti_group)
0060     : _id(detid), _subsystem(L1TMuon::kDT) {
0061   calculateGlobalSector(detid, _globalsector, _subsector);
0062   _eta = 0.;
0063   _phi = 0.;
0064   _rho = 0.;
0065   _theta = 0.;
0066   // fill in information from theta trigger
0067   _dt.theta_bti_group = theta_bti_group;
0068   _dt.segment_number = digi_th.position(theta_bti_group);
0069   _dt.theta_code = digi_th.code(theta_bti_group);
0070   _dt.theta_quality = digi_th.quality(theta_bti_group);
0071   // now phi trigger
0072   _dt.bx = digi_th.bxNum();
0073   _dt.wheel = digi_th.whNum();
0074   _dt.sector = digi_th.scNum();
0075   _dt.station = digi_th.stNum();
0076   _dt.radialAngle = -1;
0077   _dt.bendingAngle = -1;
0078   _dt.qualityCode = -1;
0079   _dt.Ts2TagCode = -1;
0080   _dt.BxCntCode = -1;
0081   _dt.RpcBit = -10;
0082 }
0083 
0084 TriggerPrimitive::TriggerPrimitive(const DTChamberId& detid,
0085                                    const L1MuDTChambPhDigi& digi_phi,
0086                                    const L1MuDTChambThDigi& digi_th,
0087                                    const int theta_bti_group)
0088     : _id(detid), _subsystem(L1TMuon::kDT) {
0089   calculateGlobalSector(detid, _globalsector, _subsector);
0090   _eta = 0.;
0091   _phi = 0.;
0092   _rho = 0.;
0093   _theta = 0.;
0094   // fill in information from theta trigger
0095   _dt.theta_bti_group = theta_bti_group;
0096   _dt.segment_number = digi_th.position(theta_bti_group);
0097   _dt.theta_code = digi_th.code(theta_bti_group);
0098   _dt.theta_quality = digi_th.quality(theta_bti_group);
0099   // now phi trigger
0100   _dt.bx = digi_phi.bxNum();
0101   _dt.wheel = digi_phi.whNum();
0102   _dt.sector = digi_phi.scNum();
0103   _dt.station = digi_phi.stNum();
0104   _dt.radialAngle = digi_phi.phi();
0105   _dt.bendingAngle = digi_phi.phiB();
0106   _dt.qualityCode = digi_phi.code();
0107   _dt.Ts2TagCode = digi_phi.Ts2Tag();
0108   _dt.BxCntCode = digi_phi.BxCnt();
0109   _dt.RpcBit = digi_phi.RpcBit();
0110 }
0111 
0112 // _____________________________________________________________________________
0113 // Constructor from CSC data
0114 TriggerPrimitive::TriggerPrimitive(const CSCDetId& detid, const CSCCorrelatedLCTDigi& digi)
0115     : _id(detid), _subsystem(L1TMuon::kCSC) {
0116   calculateGlobalSector(detid, _globalsector, _subsector);
0117   _eta = 0.;
0118   _phi = 0.;
0119   _rho = 0.;
0120   _theta = 0.;
0121   _csc.trknmb = digi.getTrknmb();
0122   _csc.valid = digi.isValid();
0123   _csc.quality = digi.getQuality();
0124   _csc.keywire = digi.getKeyWG();
0125   _csc.strip = digi.getStrip();
0126   _csc.pattern = digi.getPattern();
0127   _csc.bend = digi.getBend();
0128   _csc.bx = digi.getBX();
0129   _csc.mpclink = digi.getMPCLink();
0130   _csc.bx0 = digi.getBX0();
0131   _csc.syncErr = digi.getSyncErr();
0132   _csc.cscID = digi.getCSCID();
0133   _csc.alct_quality = digi.getALCT().getQuality();
0134   _csc.clct_quality = digi.getCLCT().getQuality();
0135   // run-3
0136   _csc.pattern_run3 = digi.getRun3Pattern();
0137   _csc.slope = digi.getSlope();
0138   _csc.strip_quart_bit = digi.getQuartStripBit();
0139   _csc.strip_eighth_bit = digi.getEighthStripBit();
0140   _csc.strip_quart = digi.getStrip(4);
0141   _csc.strip_eighth = digi.getStrip(8);
0142 
0143   // Use ME1/1a --> ring 4 convention
0144   const bool is_me11a = (detid.station() == 1 && detid.ring() == 1 && digi.getStrip() >= 128);
0145   if (is_me11a) {
0146     _id = CSCDetId(detid.endcap(), detid.station(), 4, detid.chamber(), detid.layer());
0147     _csc.strip = digi.getStrip() - 128;
0148   }
0149 }
0150 
0151 // _____________________________________________________________________________
0152 // Constructors from RPC data
0153 TriggerPrimitive::TriggerPrimitive(const RPCDetId& detid, const RPCDigi& digi) : _id(detid), _subsystem(L1TMuon::kRPC) {
0154   calculateGlobalSector(detid, _globalsector, _subsector);
0155   _eta = 0.;
0156   _phi = 0.;
0157   _rho = 0.;
0158   _theta = 0.;
0159   _rpc.strip = digi.strip();
0160   _rpc.strip_low = digi.strip();
0161   _rpc.strip_hi = digi.strip();
0162   _rpc.phi_int = 0;
0163   _rpc.theta_int = 0;
0164   _rpc.emtf_sector = 0;
0165   _rpc.emtf_link = 0;
0166   _rpc.bx = digi.bx();
0167   _rpc.valid = 1;
0168   _rpc.x = digi.hasX() ? digi.coordinateX() : -999999.;
0169   _rpc.y = digi.hasY() ? digi.coordinateY() : -999999.;
0170   _rpc.time = digi.hasTime() ? digi.time() : -999999.;
0171   _rpc.isCPPF = false;
0172 }
0173 
0174 TriggerPrimitive::TriggerPrimitive(const RPCDetId& detid, const RPCRecHit& rechit)
0175     : _id(detid), _subsystem(L1TMuon::kRPC) {
0176   calculateGlobalSector(detid, _globalsector, _subsector);
0177   _eta = 0.;
0178   _phi = 0.;
0179   _rho = 0.;
0180   _theta = 0.;
0181   _rpc.strip = rechit.firstClusterStrip() + (rechit.clusterSize() - 1) / 2;
0182   _rpc.strip_low = rechit.firstClusterStrip();
0183   _rpc.strip_hi = rechit.firstClusterStrip() + rechit.clusterSize() - 1;
0184   _rpc.phi_int = 0;
0185   _rpc.theta_int = 0;
0186   _rpc.emtf_sector = 0;
0187   _rpc.emtf_link = 0;
0188   _rpc.bx = rechit.BunchX();
0189   _rpc.valid = 1;
0190   _rpc.x = rechit.localPosition().x();
0191   _rpc.y = rechit.localPosition().y();
0192   _rpc.time = rechit.time();
0193   _rpc.isCPPF = false;
0194 }
0195 
0196 // _____________________________________________________________________________
0197 // Constructor from CPPF data
0198 TriggerPrimitive::TriggerPrimitive(const RPCDetId& detid, const l1t::CPPFDigi& digi)
0199     : _id(detid), _subsystem(L1TMuon::kRPC) {
0200   calculateGlobalSector(detid, _globalsector, _subsector);
0201   _eta = 0.;
0202   _phi = 0.;
0203   _rho = 0.;
0204   _theta = 0.;
0205   // In unpacked CPPF digis, the strip number and cluster size are not available, and are set to -99
0206   _rpc.strip = (digi.first_strip() < 0 ? 0 : digi.first_strip() + ((digi.cluster_size() - 1) / 2));
0207   _rpc.strip_low = (digi.first_strip() < 0 ? 0 : digi.first_strip());
0208   _rpc.strip_hi = (digi.first_strip() < 0 ? 0 : digi.first_strip() + digi.cluster_size() - 1);
0209   _rpc.phi_int = digi.phi_int();
0210   _rpc.theta_int = digi.theta_int();
0211   _rpc.emtf_sector = digi.emtf_sector();
0212   _rpc.emtf_link = digi.emtf_link();
0213   _rpc.bx = digi.bx();
0214   _rpc.valid = digi.valid();
0215   _rpc.x = -999999.;
0216   _rpc.y = -999999.;
0217   _rpc.time = -999999.;
0218   _rpc.isCPPF = true;
0219 }
0220 
0221 // _____________________________________________________________________________
0222 // Constructor from GEM data
0223 TriggerPrimitive::TriggerPrimitive(const GEMDetId& detid, const GEMPadDigiCluster& digi)
0224     : _id(detid), _subsystem(L1TMuon::kGEM) {
0225   calculateGlobalSector(detid, _globalsector, _subsector);
0226   _eta = 0.;
0227   _phi = 0.;
0228   _rho = 0.;
0229   _theta = 0.;
0230   _gem.pad = digi.pads().front() + ((digi.pads().size() - 1) / 2);
0231   _gem.pad_low = digi.pads().front();
0232   _gem.pad_hi = digi.pads().front() + digi.pads().size() - 1;
0233   _gem.bx = digi.bx();
0234 }
0235 
0236 // _____________________________________________________________________________
0237 // Constructor from ME0 data
0238 TriggerPrimitive::TriggerPrimitive(const ME0DetId& detid, const ME0TriggerDigi& digi)
0239     : _id(detid), _subsystem(L1TMuon::kME0) {
0240   calculateGlobalSector(detid, _globalsector, _subsector);
0241   _eta = 0.;
0242   _phi = 0.;
0243   _rho = 0.;
0244   _theta = 0.;
0245   _me0.chamberid = digi.getChamberid();
0246   _me0.quality = digi.getQuality();
0247   _me0.phiposition = digi.getPhiposition();
0248   _me0.partition = digi.getPartition();
0249   _me0.deltaphi = digi.getDeltaphi();
0250   _me0.bend = digi.getBend();
0251   _me0.bx = digi.getBX();
0252 }
0253 
0254 // Constructor from GE0 data
0255 TriggerPrimitive::TriggerPrimitive(const GEMDetId& detid, const ME0TriggerDigi& digi)
0256     : _id(detid), _subsystem(L1TMuon::kME0) {
0257   calculateGlobalSector(detid, _globalsector, _subsector);
0258   _eta = 0.;
0259   _phi = 0.;
0260   _rho = 0.;
0261   _theta = 0.;
0262   _me0.chamberid = digi.getChamberid();
0263   _me0.quality = digi.getQuality();
0264   _me0.phiposition = digi.getPhiposition();
0265   _me0.partition = digi.getPartition();
0266   _me0.deltaphi = digi.getDeltaphi();
0267   _me0.bend = digi.getBend();
0268   _me0.bx = digi.getBX();
0269 }
0270 
0271 // _____________________________________________________________________________
0272 // Copy constructor
0273 TriggerPrimitive::TriggerPrimitive(const TriggerPrimitive& tp)
0274     : _dt(tp._dt),
0275       _csc(tp._csc),
0276       _rpc(tp._rpc),
0277       _gem(tp._gem),
0278       _me0(tp._me0),
0279       _id(tp._id),
0280       _subsystem(tp._subsystem),
0281       _globalsector(tp._globalsector),
0282       _subsector(tp._subsector),
0283       _eta(tp._eta),
0284       _phi(tp._phi),
0285       _rho(tp._rho),
0286       _theta(tp._theta) {}
0287 
0288 TriggerPrimitive& TriggerPrimitive::operator=(const TriggerPrimitive& tp) {
0289   this->_dt = tp._dt;
0290   this->_csc = tp._csc;
0291   this->_rpc = tp._rpc;
0292   this->_gem = tp._gem;
0293   this->_me0 = tp._me0;
0294   this->_id = tp._id;
0295   this->_subsystem = tp._subsystem;
0296   this->_globalsector = tp._globalsector;
0297   this->_subsector = tp._subsector;
0298   this->_eta = tp._eta;
0299   this->_phi = tp._phi;
0300   this->_rho = tp._rho;
0301   this->_theta = tp._theta;
0302   return *this;
0303 }
0304 
0305 bool TriggerPrimitive::operator==(const TriggerPrimitive& tp) const {
0306   // Copied from Numpy
0307   // https://github.com/numpy/numpy/blob/v1.14.0/numpy/core/numeric.py#L2260-L2355
0308   auto isclose = [](float a, float b, float rtol = 1.e-5, float atol = 1.e-8) {
0309     return std::abs(a - b) <= (atol + rtol * std::abs(b));
0310   };
0311 
0312   switch (_subsystem) {
0313     case kDT:
0314       return (this->_dt.bx == tp._dt.bx && this->_dt.wheel == tp._dt.wheel && this->_dt.sector == tp._dt.sector &&
0315               this->_dt.station == tp._dt.station && this->_dt.radialAngle == tp._dt.radialAngle &&
0316               this->_dt.bendingAngle == tp._dt.bendingAngle && this->_dt.qualityCode == tp._dt.qualityCode &&
0317               this->_dt.Ts2TagCode == tp._dt.Ts2TagCode && this->_dt.BxCntCode == tp._dt.BxCntCode &&
0318               this->_dt.RpcBit == tp._dt.RpcBit && this->_dt.theta_bti_group == tp._dt.theta_bti_group &&
0319               this->_dt.segment_number == tp._dt.segment_number && this->_dt.theta_code == tp._dt.theta_code &&
0320               this->_dt.theta_quality == tp._dt.theta_quality && this->_id == tp._id &&
0321               this->_subsystem == tp._subsystem && this->_globalsector == tp._globalsector &&
0322               this->_subsector == tp._subsector);
0323     case kCSC:
0324       return (this->_csc.trknmb == tp._csc.trknmb && this->_csc.valid == tp._csc.valid &&
0325               this->_csc.quality == tp._csc.quality && this->_csc.keywire == tp._csc.keywire &&
0326               this->_csc.strip == tp._csc.strip && this->_csc.pattern == tp._csc.pattern &&
0327               this->_csc.bend == tp._csc.bend && this->_csc.bx == tp._csc.bx && this->_csc.mpclink == tp._csc.mpclink &&
0328               this->_csc.bx0 == tp._csc.bx0 && this->_csc.syncErr == tp._csc.syncErr &&
0329               this->_csc.cscID == tp._csc.cscID && this->_csc.alct_quality == tp._csc.alct_quality &&
0330               this->_csc.clct_quality == tp._csc.clct_quality && this->_id == tp._id &&
0331               this->_subsystem == tp._subsystem && this->_globalsector == tp._globalsector &&
0332               this->_subsector == tp._subsector);
0333     case kRPC:
0334       return (this->_rpc.strip == tp._rpc.strip && this->_rpc.strip_low == tp._rpc.strip_low &&
0335               this->_rpc.strip_hi == tp._rpc.strip_hi && this->_rpc.phi_int == tp._rpc.phi_int &&
0336               this->_rpc.theta_int == tp._rpc.theta_int && this->_rpc.emtf_sector == tp._rpc.emtf_sector &&
0337               this->_rpc.emtf_link == tp._rpc.emtf_link && this->_rpc.bx == tp._rpc.bx &&
0338               this->_rpc.valid == tp._rpc.valid && isclose(this->_rpc.x, tp._rpc.x) &&  // floating-point
0339               isclose(this->_rpc.y, tp._rpc.y) &&                                       // floating-point
0340               isclose(this->_rpc.time, tp._rpc.time) &&                                 // floating-point
0341               this->_rpc.isCPPF == tp._rpc.isCPPF && this->_id == tp._id && this->_subsystem == tp._subsystem &&
0342               this->_globalsector == tp._globalsector && this->_subsector == tp._subsector);
0343     case kGEM:
0344       return (this->_gem.pad == tp._gem.pad && this->_gem.pad_low == tp._gem.pad_low &&
0345               this->_gem.pad_hi == tp._gem.pad_hi && this->_gem.bx == tp._gem.bx && this->_id == tp._id &&
0346               this->_subsystem == tp._subsystem && this->_globalsector == tp._globalsector &&
0347               this->_subsector == tp._subsector);
0348     case kME0:
0349       return (this->_me0.chamberid == tp._me0.chamberid && this->_me0.quality == tp._me0.quality &&
0350               this->_me0.phiposition == tp._me0.phiposition && this->_me0.partition == tp._me0.partition &&
0351               this->_me0.deltaphi == tp._me0.deltaphi && this->_me0.bend == tp._me0.bend &&
0352               this->_me0.bx == tp._me0.bx && this->_id == tp._id && this->_subsystem == tp._subsystem &&
0353               this->_globalsector == tp._globalsector && this->_subsector == tp._subsector);
0354     default:
0355       throw cms::Exception("Invalid Subsystem")
0356           << "The specified subsystem for this track stub is out of range" << std::endl;
0357   }
0358   return false;
0359 }
0360 
0361 // _____________________________________________________________________________
0362 int TriggerPrimitive::getBX() const {
0363   switch (_subsystem) {
0364     case kDT:
0365       return _dt.bx;
0366     case kCSC:
0367       return _csc.bx;
0368     case kRPC:
0369       return _rpc.bx;
0370     case kGEM:
0371       return _gem.bx;
0372     case kME0:
0373       return _me0.bx;
0374     default:
0375       throw cms::Exception("Invalid Subsystem")
0376           << "The specified subsystem for this track stub is out of range" << std::endl;
0377   }
0378   return -1;
0379 }
0380 
0381 int TriggerPrimitive::getStrip() const {
0382   switch (_subsystem) {
0383     case kDT:
0384       return _dt.radialAngle;
0385     case kCSC:
0386       return _csc.strip;
0387     case kRPC:
0388       return _rpc.strip;
0389     case kGEM:
0390       return _gem.pad;
0391     case kME0:
0392       return _me0.phiposition;
0393     default:
0394       throw cms::Exception("Invalid Subsystem")
0395           << "The specified subsystem for this track stub is out of range" << std::endl;
0396   }
0397   return -1;
0398 }
0399 
0400 int TriggerPrimitive::getWire() const {
0401   switch (_subsystem) {
0402     case kDT:
0403       return _dt.theta_bti_group;
0404     case kCSC:
0405       return _csc.keywire;
0406     case kRPC:
0407       return -1;
0408     case kGEM:
0409       return -1;
0410     case kME0:
0411       return -1;
0412     default:
0413       throw cms::Exception("Invalid Subsystem")
0414           << "The specified subsystem for this track stub is out of range" << std::endl;
0415   }
0416   return -1;
0417 }
0418 
0419 int TriggerPrimitive::getPattern() const {
0420   switch (_subsystem) {
0421     case kDT:
0422       return -1;
0423     case kCSC:
0424       return _csc.pattern;
0425     case kRPC:
0426       return -1;
0427     case kGEM:
0428       return -1;
0429     case kME0:
0430       return -1;
0431     default:
0432       throw cms::Exception("Invalid Subsystem")
0433           << "The specified subsystem for this track stub is out of range" << std::endl;
0434   }
0435   return -1;
0436 }
0437 
0438 void TriggerPrimitive::print(std::ostream& out) const {
0439   unsigned idx = (unsigned)_subsystem;
0440   out << subsystem_names[idx] << " Trigger Primitive" << std::endl;
0441   out << "eta: " << _eta << " phi: " << _phi << " rho: " << _rho << " theta: " << _theta << std::endl;
0442   switch (_subsystem) {
0443     case kDT:
0444       out << detId<DTChamberId>() << std::endl;
0445       out << "Local BX      : " << _dt.bx << std::endl;
0446       out << "Segment Nmb   : " << _dt.segment_number << std::endl;
0447       out << "Packed Phi    : " << _dt.radialAngle << std::endl;
0448       out << "Packed Bend   : " << _dt.bendingAngle << std::endl;
0449       out << "Quality Code  : " << _dt.qualityCode << std::endl;
0450       out << "Ts2Tag Code   : " << _dt.Ts2TagCode << std::endl;
0451       out << "BxCnt Code    : " << _dt.BxCntCode << std::endl;
0452       out << "RPC Bit       : " << _dt.RpcBit << std::endl;
0453       out << "Theta BTI Grp : " << _dt.theta_bti_group << std::endl;
0454       out << "Theta Code    : " << _dt.theta_code << std::endl;
0455       out << "Theta Quality : " << _dt.theta_quality << std::endl;
0456       break;
0457     case kCSC:
0458       out << detId<CSCDetId>() << std::endl;
0459       out << "Local BX      : " << _csc.bx << std::endl;
0460       out << "Segment Nmb   : " << _csc.trknmb << std::endl;
0461       out << "Segment Valid : " << _csc.valid << std::endl;
0462       out << "Quality Code  : " << _csc.quality << std::endl;
0463       out << "Key Wire Grp  : " << _csc.keywire << std::endl;
0464       out << "Half-Strip    : " << _csc.strip << std::endl;
0465       out << "CLCT Pattern  : " << _csc.pattern << std::endl;
0466       out << "Packed Bend   : " << _csc.bend << std::endl;
0467       out << "MPC Link      : " << _csc.mpclink << std::endl;
0468       out << "BX0           : " << _csc.bx0 << std::endl;
0469       out << "Sync Error    : " << _csc.syncErr << std::endl;
0470       out << "CSCID         : " << _csc.cscID << std::endl;
0471       out << "ALCT Quality  : " << _csc.alct_quality << std::endl;
0472       out << "CLCT Quality  : " << _csc.clct_quality << std::endl;
0473       break;
0474     case kRPC:
0475       out << detId<RPCDetId>() << std::endl;
0476       out << "Local BX      : " << _rpc.bx << std::endl;
0477       out << "Strip         : " << _rpc.strip << std::endl;
0478       out << "Strip low     : " << _rpc.strip_low << std::endl;
0479       out << "Strip high    : " << _rpc.strip_hi << std::endl;
0480       out << "Integer phi   : " << _rpc.phi_int << std::endl;
0481       out << "Integer theta : " << _rpc.theta_int << std::endl;
0482       out << "EMTF sector   : " << _rpc.emtf_sector << std::endl;
0483       out << "EMTF link     : " << _rpc.emtf_link << std::endl;
0484       out << "Valid         : " << _rpc.valid << std::endl;
0485       out << "Local x       : " << _rpc.x << std::endl;
0486       out << "Local y       : " << _rpc.y << std::endl;
0487       out << "Time          : " << _rpc.time << std::endl;
0488       out << "IsCPPF        : " << _rpc.isCPPF << std::endl;
0489       break;
0490     case kGEM:
0491       out << detId<GEMDetId>() << std::endl;
0492       out << "Local BX      : " << _gem.bx << std::endl;
0493       out << "Pad           : " << _gem.pad << std::endl;
0494       out << "Pad low       : " << _gem.pad_low << std::endl;
0495       out << "Pad high      : " << _gem.pad_hi << std::endl;
0496       break;
0497     case kME0:
0498       if (detId<DetId>().subdetId() == MuonSubdetId::ME0) {
0499         out << detId<ME0DetId>() << std::endl;
0500       } else {
0501         out << detId<GEMDetId>() << std::endl;
0502       }
0503 
0504       out << "Local BX      : " << _me0.bx << std::endl;
0505       out << "Chamber id    : " << _me0.chamberid << std::endl;
0506       out << "Quality       : " << _me0.quality << std::endl;
0507       out << "Phiposition   : " << _me0.phiposition << std::endl;
0508       out << "Partition     : " << _me0.partition << std::endl;
0509       out << "Deltaphi      : " << _me0.deltaphi << std::endl;
0510       out << "Bend          : " << _me0.bend << std::endl;
0511       break;
0512     default:
0513       throw cms::Exception("Invalid Subsystem")
0514           << "The specified subsystem for this track stub is out of range" << std::endl;
0515   }
0516 }