Back to home page

Project CMSSW displayed by LXR

 
 

    


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     @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   // ---------- Constructors, enumerated types ----------
0055 
0056   /** Construct a null id */
0057   ETLDetId() : MTDDetId(DetId::Forward, ForwardSubdetector::FastTime) {
0058     id_ |= (MTDType::ETL & kMTDsubdMask) << kMTDsubdOffset;
0059     id_ |= kETLformatV2;
0060   }
0061 
0062   /** Construct from a raw value */
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   /** Construct from generic DetId */
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   /** Construct and fill only the det and sub-det fields. */
0081   // pre v8
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   // v8
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   /** ETL TDR Construct and fill only the det and sub-det fields. */
0099   /** input disc runs from 0 to 1 */
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   /** decode encoded "ring" field, disc numbered from 1 to 2, as in dedicated method */
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   // pre v8
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   // v8
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   // ---------- Common methods ----------
0138 
0139   /** Returns ETL module number. */
0140   inline int module() const { return (id_ >> kETLmoduleOffset) & kETLmoduleMask; }
0141 
0142   /** Returns ETL module type number. */
0143   inline int modType() const { return (id_ >> kETLmodTypeOffset) & kETLmodTypeMask; }
0144 
0145   /** Returns ETL module sensor number. */
0146   inline int sensor() const { return (id_ >> kETLsensorOffset) & kETLsensorMask; }
0147 
0148   ETLDetId geographicalId() const { return id_; }
0149 
0150   // --------- Methods for the TDR ETL model only -----------
0151   // meaningless for TP model
0152 
0153   // starting from 1
0154   inline int sector() const { return ((((id_ >> kRodRingOffset) & kRodRingMask) - 1) & kETLsectorMask) + 1; }
0155 
0156   // 0 = front, 1 = back
0157   inline int discSide() const {
0158     return ((((id_ >> kRodRingOffset) & kRodRingMask) - 1) >> kETLdiscSideOffset) & kETLdiscSideMask;
0159   }
0160 
0161   // starting from 1
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);          // unchanged part of id
0168     uint32_t shiftP = (rawid & kETLoldFieldMask) >> kETLoldToNewShift;  // shifted part
0169     return ((fixedP | shiftP) | kETLformatV2);
0170   }
0171 };
0172 
0173 std::ostream& operator<<(std::ostream&, const ETLDetId&);
0174 
0175 #endif  // DataFormats_ETLDetId_ETLDetId_h