File indexing completed on 2024-04-06 12:04:02
0001 #ifndef DATAFORMATS_DETID_H
0002 #define DATAFORMATS_DETID_H
0003
0004
0005 #include <ostream>
0006
0007 #include <cstdint>
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 class DetId {
0018 public:
0019 static const int kDetMask = 0xF;
0020 static const int kSubdetMask = 0x7;
0021 static const int kDetOffset = 28;
0022 static const int kSubdetOffset = 25;
0023
0024 enum Detector {
0025 Tracker = 1,
0026 Muon = 2,
0027 Ecal = 3,
0028 Hcal = 4,
0029 Calo = 5,
0030 Forward = 6,
0031 VeryForward = 7,
0032 HGCalEE = 8,
0033 HGCalHSi = 9,
0034 HGCalHSc = 10,
0035 HGCalTrigger = 11
0036 };
0037
0038 constexpr DetId() : id_(0) {}
0039
0040 constexpr DetId(uint32_t id) : id_(id) {}
0041
0042 constexpr DetId(Detector det, int subdet)
0043 : id_(((det & kDetMask) << kDetOffset) | ((subdet & kSubdetMask) << kSubdetOffset)) {}
0044
0045
0046 constexpr Detector det() const { return Detector((id_ >> kDetOffset) & kDetMask); }
0047
0048 constexpr int subdetId() const {
0049 return ((HGCalEE == det()) || (HGCalHSi == det()) || (HGCalHSc == det()) ? 0
0050 : ((id_ >> kSubdetOffset) & kSubdetMask));
0051 }
0052
0053 constexpr uint32_t operator()() const { return id_; }
0054 constexpr operator uint32_t() const { return id_; }
0055
0056
0057 constexpr uint32_t rawId() const { return id_; }
0058
0059 constexpr bool null() const { return id_ == 0; }
0060
0061
0062 constexpr bool operator==(DetId id) const { return id_ == id.id_; }
0063
0064 constexpr bool operator!=(DetId id) const { return id_ != id.id_; }
0065
0066 constexpr bool operator<(DetId id) const { return id_ < id.id_; }
0067
0068 protected:
0069 uint32_t id_;
0070 };
0071
0072
0073 constexpr inline bool operator==(uint32_t i, DetId id) { return i == id(); }
0074 constexpr inline bool operator==(DetId id, uint32_t i) { return i == id(); }
0075
0076 constexpr inline bool operator!=(uint32_t i, DetId id) { return i != id(); }
0077 constexpr inline bool operator!=(DetId id, uint32_t i) { return i != id(); }
0078
0079 constexpr inline bool operator<(uint32_t i, DetId id) { return i < id(); }
0080 constexpr inline bool operator<(DetId id, uint32_t i) { return id() < i; }
0081
0082
0083
0084 namespace std {
0085 template <>
0086 struct hash<DetId> {
0087 typedef DetId argument_type;
0088 typedef std::size_t result_type;
0089 result_type operator()(argument_type const& id) const noexcept { return std::hash<uint32_t>()(id.rawId()); }
0090 };
0091 }
0092
0093 #endif