Back to home page

Project CMSSW displayed by LXR

 
 

    


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     @class ETLDetId
0009     @brief Detector identifier class for the Endcap Timing Layer.
0010 
0011     bit 15-5 : module sequential number
0012     bit 4-3  : module type (unused so far)
0013     bit 2-1  : sensor
0014 */
0015 
0016 class ETLDetId : public MTDDetId {
0017 private:
0018   // for conversion from old to new module bit field
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   /// constants for the TDR ETL model
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   // ---------- Constructors, enumerated types ----------
0057 
0058   /** Construct a null id */
0059   ETLDetId() : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0060     id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset;
0061     id_ |= kETLformatV2;
0062   }
0063 
0064   /** Construct from a raw value */
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   /** Construct from generic DetId */
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   /** Construct and fill only the det and sub-det fields. */
0083   // pre v8
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   // v8
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   /** ETL TDR Construct and fill only the det and sub-det fields. */
0101   /** input disc runs from 0 to 1 */
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   /** decode encoded "ring" field, disc numbered from 1 to 2, as in dedicated method */
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   // pre v8
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   // v8
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   // ---------- Common methods ----------
0140 
0141   /** Returns ETL module number. */
0142   inline int module() const { return (id_ >> kETLmoduleOffset) & kETLmoduleMask; }
0143 
0144   /** Returns ETL module type number. */
0145   inline int modType() const { return (id_ >> kETLmodTypeOffset) & kETLmodTypeMask; }
0146 
0147   /** Returns ETL module sensor number. */
0148   inline int sensor() const { return (id_ >> kETLsensorOffset) & kETLsensorMask; }
0149 
0150   ETLDetId geographicalId() const { return id_; }
0151 
0152   // --------- Methods for the TDR ETL model only -----------
0153   // meaningless for TP model
0154 
0155   // starting from 1
0156   inline int sector() const { return ((((id_ >> kRodRingOffset) & kRodRingMask) - 1) & kETLsectorMask) + 1; }
0157 
0158   // 0 = front, 1 = back
0159   inline int discSide() const {
0160     return ((((id_ >> kRodRingOffset) & kRodRingMask) - 1) >> kETLdiscSideOffset) & kETLdiscSideMask;
0161   }
0162 
0163   // starting from 1
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);          // unchanged part of id
0170     uint32_t shiftP = (rawid & kETLoldFieldMask) >> kETLoldToNewShift;  // shifted part
0171     return ((fixedP | shiftP) | kETLformatV2);
0172   }
0173 };
0174 
0175 std::ostream& operator<<(std::ostream&, const ETLDetId&);
0176 
0177 #endif  // DataFormats_ETLDetId_ETLDetId_h