File indexing completed on 2024-06-13 03:23:31
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 enum class EtlLayout { tp = 1, v4 = 2, v5 = 3, v8 = 4 };
0055
0056
0057
0058
0059 ETLDetId() : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0060 id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset;
0061 id_ |= kETLformatV2;
0062 }
0063
0064
0065 ETLDetId(const uint32_t& raw_id) {
0066 uint32_t tmpId = raw_id;
0067 if ((tmpId & kETLformatV2) == 0) {
0068 tmpId = newForm(tmpId);
0069 }
0070 id_ = MTDDetId(tmpId).rawId();
0071 }
0072
0073
0074 ETLDetId(const DetId& det_id) {
0075 uint32_t tmpId = det_id.rawId();
0076 if ((tmpId & kETLformatV2) == 0) {
0077 tmpId = newForm(tmpId);
0078 }
0079 id_ = MTDDetId(tmpId).rawId();
0080 }
0081
0082
0083
0084 ETLDetId(uint32_t zside, uint32_t ring, uint32_t module, uint32_t modtyp)
0085 : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0086 id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset | (zside & kZsideMask) << kZsideOffset |
0087 (ring & kRodRingMask) << kRodRingOffset | (module & kETLmoduleMask) << kETLmoduleOffset |
0088 (modtyp & kETLmodTypeMask) << kETLmodTypeOffset;
0089 id_ |= kETLformatV2;
0090 }
0091
0092 ETLDetId(uint32_t zside, uint32_t ring, uint32_t module, uint32_t modtyp, uint32_t sensor)
0093 : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0094 id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset | (zside & kZsideMask) << kZsideOffset |
0095 (ring & kRodRingMask) << kRodRingOffset | (module & kETLmoduleMask) << kETLmoduleOffset |
0096 (modtyp & kETLmodTypeMask) << kETLmodTypeOffset | (sensor & kETLsensorMask) << kETLsensorOffset;
0097 id_ |= kETLformatV2;
0098 }
0099
0100
0101
0102
0103 inline uint32_t encodeSector(uint32_t& disc, uint32_t& discside, uint32_t& sector) const {
0104 return (sector + discside * kSoff + 2 * kSoff * disc);
0105 }
0106
0107
0108
0109 static void decodeSector(const uint32_t rr, uint32_t& nDisc, uint32_t& discSide, uint32_t& sector) {
0110 nDisc = (((rr - 1) >> kETLnDiscOffset) & kETLnDiscMask) + 1;
0111 discSide = ((rr - 1) >> kETLdiscSideOffset) & kETLdiscSideMask;
0112 sector = ((rr - 1) & kETLsectorMask) + 1;
0113 }
0114
0115
0116 ETLDetId(uint32_t zside, uint32_t disc, uint32_t discside, uint32_t sector, uint32_t module, uint32_t modtyp)
0117 : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0118 id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset | (zside & kZsideMask) << kZsideOffset |
0119 (encodeSector(disc, discside, sector) & kRodRingMask) << kRodRingOffset |
0120 (module & kETLmoduleMask) << kETLmoduleOffset | (modtyp & kETLmodTypeMask) << kETLmodTypeOffset;
0121 id_ |= kETLformatV2;
0122 }
0123
0124 ETLDetId(uint32_t zside,
0125 uint32_t disc,
0126 uint32_t discside,
0127 uint32_t sector,
0128 uint32_t module,
0129 uint32_t modtyp,
0130 uint32_t sensor)
0131 : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0132 id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset | (zside & kZsideMask) << kZsideOffset |
0133 (encodeSector(disc, discside, sector) & kRodRingMask) << kRodRingOffset |
0134 (module & kETLmoduleMask) << kETLmoduleOffset | (modtyp & kETLmodTypeMask) << kETLmodTypeOffset |
0135 (sensor & kETLsensorMask) << kETLsensorOffset;
0136 id_ |= kETLformatV2;
0137 }
0138
0139
0140
0141
0142 inline int module() const { return (id_ >> kETLmoduleOffset) & kETLmoduleMask; }
0143
0144
0145 inline int modType() const { return (id_ >> kETLmodTypeOffset) & kETLmodTypeMask; }
0146
0147
0148 inline int sensor() const { return (id_ >> kETLsensorOffset) & kETLsensorMask; }
0149
0150 ETLDetId geographicalId() const { return id_; }
0151
0152
0153
0154
0155
0156 inline int sector() const { return ((((id_ >> kRodRingOffset) & kRodRingMask) - 1) & kETLsectorMask) + 1; }
0157
0158
0159 inline int discSide() const {
0160 return ((((id_ >> kRodRingOffset) & kRodRingMask) - 1) >> kETLdiscSideOffset) & kETLdiscSideMask;
0161 }
0162
0163
0164 inline int nDisc() const {
0165 return (((((id_ >> kRodRingOffset) & kRodRingMask) - 1) >> kETLnDiscOffset) & kETLnDiscMask) + 1;
0166 }
0167
0168 uint32_t newForm(const uint32_t& rawid) {
0169 uint32_t fixedP = rawid & (0xFFFFFFFF - kETLoldFieldMask);
0170 uint32_t shiftP = (rawid & kETLoldFieldMask) >> kETLoldToNewShift;
0171 return ((fixedP | shiftP) | kETLformatV2);
0172 }
0173 };
0174
0175 std::ostream& operator<<(std::ostream&, const ETLDetId&);
0176
0177 #endif