File indexing completed on 2025-03-08 03:04:01
0001 #ifndef DataFormats_ETLDetId_ETLDetId_h
0002 #define DataFormats_ETLDetId_ETLDetId_h
0003
0004 #include "DataFormats/ForwardDetId/interface/MTDDetId.h"
0005 #include <ostream>
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 class ETLDetId : public MTDDetId {
0017 private:
0018
0019 static constexpr uint32_t kETLoldToNewShift = 2;
0020 static constexpr uint32_t kETLoldFieldMask = 0x7FFF;
0021 static constexpr uint32_t kETLformatV2 = 1;
0022
0023 public:
0024 static constexpr uint32_t kETLmoduleOffset = 5;
0025 static constexpr uint32_t kETLmoduleMask = 0x7FF;
0026 static constexpr uint32_t kETLmodTypeOffset = 3;
0027 static constexpr uint32_t kETLmodTypeMask = 0x3;
0028 static constexpr uint32_t kETLsensorOffset = 1;
0029 static constexpr uint32_t kETLsensorMask = 0x3;
0030
0031 static constexpr int kETLv1maxRing = 11;
0032 static constexpr int kETLv1maxModule = 176;
0033 static constexpr int kETLv1nDisc = 1;
0034
0035
0036 static constexpr uint32_t kETLnDiscOffset = 3;
0037 static constexpr uint32_t kETLnDiscMask = 0x1;
0038 static constexpr uint32_t kETLdiscSideOffset = 2;
0039 static constexpr uint32_t kETLdiscSideMask = 0x1;
0040 static constexpr uint32_t kETLsectorMask = 0x3;
0041
0042 static constexpr int kETLv4maxRing = 16;
0043 static constexpr int kETLv4maxSector = 4;
0044 static constexpr int kETLv4maxModule = 248;
0045 static constexpr int kETLv4nDisc = 2;
0046
0047 static constexpr int kETLv5maxRing = 14;
0048 static constexpr int kETLv5maxSector = 2;
0049 static constexpr int kETLv5maxModule = 517;
0050 static constexpr int kETLv5nDisc = kETLv4nDisc;
0051
0052 static constexpr uint32_t kSoff = 4;
0053
0054
0055
0056
0057 ETLDetId() : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0058 id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset;
0059 id_ |= kETLformatV2;
0060 }
0061
0062
0063 ETLDetId(const uint32_t& raw_id) {
0064 uint32_t tmpId = raw_id;
0065 if ((tmpId & kETLformatV2) == 0) {
0066 tmpId = newForm(tmpId);
0067 }
0068 id_ = MTDDetId(tmpId).rawId();
0069 }
0070
0071
0072 ETLDetId(const DetId& det_id) {
0073 uint32_t tmpId = det_id.rawId();
0074 if ((tmpId & kETLformatV2) == 0) {
0075 tmpId = newForm(tmpId);
0076 }
0077 id_ = MTDDetId(tmpId).rawId();
0078 }
0079
0080
0081
0082 ETLDetId(uint32_t zside, uint32_t ring, uint32_t module, uint32_t modtyp)
0083 : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0084 id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset | (zside & kZsideMask) << kZsideOffset |
0085 (ring & kRodRingMask) << kRodRingOffset | (module & kETLmoduleMask) << kETLmoduleOffset |
0086 (modtyp & kETLmodTypeMask) << kETLmodTypeOffset;
0087 id_ |= kETLformatV2;
0088 }
0089
0090 ETLDetId(uint32_t zside, uint32_t ring, uint32_t module, uint32_t modtyp, uint32_t sensor)
0091 : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0092 id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset | (zside & kZsideMask) << kZsideOffset |
0093 (ring & kRodRingMask) << kRodRingOffset | (module & kETLmoduleMask) << kETLmoduleOffset |
0094 (modtyp & kETLmodTypeMask) << kETLmodTypeOffset | (sensor & kETLsensorMask) << kETLsensorOffset;
0095 id_ |= kETLformatV2;
0096 }
0097
0098
0099
0100
0101 inline uint32_t encodeSector(uint32_t& disc, uint32_t& discside, uint32_t& sector) const {
0102 return (sector + discside * kSoff + 2 * kSoff * disc);
0103 }
0104
0105
0106
0107 static void decodeSector(const uint32_t rr, uint32_t& nDisc, uint32_t& discSide, uint32_t& sector) {
0108 nDisc = (((rr - 1) >> kETLnDiscOffset) & kETLnDiscMask) + 1;
0109 discSide = ((rr - 1) >> kETLdiscSideOffset) & kETLdiscSideMask;
0110 sector = ((rr - 1) & kETLsectorMask) + 1;
0111 }
0112
0113
0114 ETLDetId(uint32_t zside, uint32_t disc, uint32_t discside, uint32_t sector, uint32_t module, uint32_t modtyp)
0115 : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0116 id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset | (zside & kZsideMask) << kZsideOffset |
0117 (encodeSector(disc, discside, sector) & kRodRingMask) << kRodRingOffset |
0118 (module & kETLmoduleMask) << kETLmoduleOffset | (modtyp & kETLmodTypeMask) << kETLmodTypeOffset;
0119 id_ |= kETLformatV2;
0120 }
0121
0122 ETLDetId(uint32_t zside,
0123 uint32_t disc,
0124 uint32_t discside,
0125 uint32_t sector,
0126 uint32_t module,
0127 uint32_t modtyp,
0128 uint32_t sensor)
0129 : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0130 id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset | (zside & kZsideMask) << kZsideOffset |
0131 (encodeSector(disc, discside, sector) & kRodRingMask) << kRodRingOffset |
0132 (module & kETLmoduleMask) << kETLmoduleOffset | (modtyp & kETLmodTypeMask) << kETLmodTypeOffset |
0133 (sensor & kETLsensorMask) << kETLsensorOffset;
0134 id_ |= kETLformatV2;
0135 }
0136
0137
0138
0139
0140 inline int module() const { return (id_ >> kETLmoduleOffset) & kETLmoduleMask; }
0141
0142
0143 inline int modType() const { return (id_ >> kETLmodTypeOffset) & kETLmodTypeMask; }
0144
0145
0146 inline int sensor() const { return (id_ >> kETLsensorOffset) & kETLsensorMask; }
0147
0148 ETLDetId geographicalId() const { return id_; }
0149
0150
0151
0152
0153
0154 inline int sector() const { return ((((id_ >> kRodRingOffset) & kRodRingMask) - 1) & kETLsectorMask) + 1; }
0155
0156
0157 inline int discSide() const {
0158 return ((((id_ >> kRodRingOffset) & kRodRingMask) - 1) >> kETLdiscSideOffset) & kETLdiscSideMask;
0159 }
0160
0161
0162 inline int nDisc() const {
0163 return (((((id_ >> kRodRingOffset) & kRodRingMask) - 1) >> kETLnDiscOffset) & kETLnDiscMask) + 1;
0164 }
0165
0166 uint32_t newForm(const uint32_t& rawid) {
0167 uint32_t fixedP = rawid & (0xFFFFFFFF - kETLoldFieldMask);
0168 uint32_t shiftP = (rawid & kETLoldFieldMask) >> kETLoldToNewShift;
0169 return ((fixedP | shiftP) | kETLformatV2);
0170 }
0171 };
0172
0173 std::ostream& operator<<(std::ostream&, const ETLDetId&);
0174
0175 #endif