1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
#ifndef MuonDetId_RPCDetId_h
#define MuonDetId_RPCDetId_h
/** \class RPCDetId
*
* DetUnit identifier for RPCs
*
* \author Ilaria Segoni
*/
#include <DataFormats/DetId/interface/DetId.h>
#include <FWCore/Utilities/interface/Exception.h>
#include <iosfwd>
class RPCDetId : public DetId {
public:
RPCDetId();
/// Construct from a packed id. It is required that the Detector part of
/// id is Muon and the SubDet part is RPC, otherwise an exception is thrown.
RPCDetId(uint32_t id);
RPCDetId(DetId id);
/// Construct from fully qualified identifier.
RPCDetId(int region, int ring, int station, int sector, int layer, int subsector, int roll);
/// Sort Operator based on the raw detector id
bool operator<(const RPCDetId& r) const {
if (r.station() == this->station()) {
if (this->layer() == r.layer()) {
return this->rawId() < r.rawId();
} else {
return (this->layer() < r.layer());
}
} else {
return this->station() < r.station();
}
}
void buildfromDB(int region,
int ring,
int layer,
int sector,
const std::string& subsector,
const std::string& roll,
const std::string& dbname);
/// Built from the trigger det Index
void buildfromTrIndex(int trIndex);
/// Region id: 0 for Barrel, +/-1 For +/- Endcap
int region() const { return int((id_ >> RegionStartBit_) & RegionMask_) + minRegionId; }
/// Ring id: Wheel number in Barrel (from -2 to +2) Ring Number in Endcap (from 1 to 3)
/// Ring has a different meaning in Barrel and Endcap! In Barrel it is wheel, in Endcap
/// it is the physical ring located on a disk (a disk contains three rings). In Endcap
/// the ring is the group of chambers with same r (distance of beam axis) and increasing phi
int ring() const {
int ring_ = (id_ >> RingStartBit_) & RingMask_;
if (ring_ < RingBarrelOffSet) {
if (this->region() == 0) {
throw cms::Exception("InvalidDetId") << "RPCDetId ctor:"
<< " Ring - Region Inconsistency, "
<< " region " << this->region() << " ring " << ring_ << std::endl;
}
return int(ring_ + minRingForwardId);
} else { // if(ring_ >= RingBarrelOffSet)
return int(ring_ - RingBarrelOffSet + minRingBarrelId);
}
}
/// Station id : For Barrel: the four groups of chambers at same r (distance from beam axis) and increasing phi
/// For Endcap: the three groups of chambers at same z (distance from interaction point), i.e. the disk
int station() const { return int((id_ >> StationStartBit_) & StationMask_) + minStationId; }
/// Sector id: the group of chambers at same phi (and increasing r)
int sector() const { return int((id_ >> SectorStartBit_) & SectorMask_) + (minSectorId + 1); }
/// Layer id: each station can have two layers of chambers: layer 1 is the inner chamber and layer 2 is the outer chamber (when present)
/// Only in Barrel: RB1 and RB2.
int layer() const { return int((id_ >> LayerStartBit_) & LayerMask_) + minLayerId; }
/// SubSector id : some sectors are divided along the phi direction in subsectors (from 1 to 4 in Barrel, from 1 to 6 in Endcap)
int subsector() const { return int((id_ >> SubSectorStartBit_) & SubSectorMask_) + (minSubSectorId + 1); }
/// Roll id (also known as eta partition): each chamber is divided along the strip direction in
/// two or three parts (rolls) for Barrel and two, three or four parts for endcap
int roll() const {
return int((id_ >> RollStartBit_) & RollMask_); // value 0 is used as wild card
}
int trIndex() const { return trind; }
/// Return the corresponding ChamberId
RPCDetId chamberId() const { return RPCDetId(id_ & chamberIdMask_); }
static constexpr int minRegionId = -1;
static constexpr int maxRegionId = 1;
static constexpr int minRingForwardId = 1;
static constexpr int maxRingForwardId = 3;
static constexpr int minRingBarrelId = -2;
static constexpr int maxRingBarrelId = 2;
static constexpr int RingBarrelOffSet = 3;
static constexpr int minStationId = 1;
static constexpr int maxStationId = 4;
static constexpr int minSectorId = 0;
static constexpr int maxSectorId = 12;
static constexpr int minSectorBarrelId = 1;
static constexpr int maxSectorBarrelId = 12;
static constexpr int minSectorForwardId = 1;
static constexpr int maxSectorForwardId = 6;
static constexpr int minLayerId = 1;
static constexpr int maxLayerId = 2;
static constexpr int minSubSectorId = 0;
static constexpr int maxSubSectorId = 6;
static constexpr int minSubSectorBarrelId = 1;
static constexpr int maxSubSectorBarrelId = 4;
static constexpr int minSubSectorForwardId = 1;
static constexpr int maxSubSectorForwardId = 6;
static constexpr int minRollId = 0;
static constexpr int maxRollId = 5; // used to be 4 ... need 5 for upgrade
// if we decide to divide the upgrade RE3/1 and RE4/1 up to eta=2.4
// and we want basically to have 0.10 eta / roll ...
private:
static constexpr int RegionNumBits_ = 2;
static constexpr int RegionStartBit_ = 0;
static constexpr int RegionMask_ = 0X3;
static constexpr int RingNumBits_ = 3;
static constexpr int RingStartBit_ = RegionStartBit_ + RegionNumBits_;
static constexpr unsigned int RingMask_ = 0X7;
static constexpr int StationNumBits_ = 2;
static constexpr int StationStartBit_ = RingStartBit_ + RingNumBits_;
static constexpr unsigned int StationMask_ = 0X3;
static constexpr int SectorNumBits_ = 4;
static constexpr int SectorStartBit_ = StationStartBit_ + StationNumBits_;
static constexpr unsigned int SectorMask_ = 0XF;
static constexpr int LayerNumBits_ = 1;
static constexpr int LayerStartBit_ = SectorStartBit_ + SectorNumBits_;
static constexpr unsigned int LayerMask_ = 0X1;
static constexpr int SubSectorNumBits_ = 3;
static constexpr int SubSectorStartBit_ = LayerStartBit_ + LayerNumBits_;
static constexpr unsigned int SubSectorMask_ = 0X7;
static constexpr int RollNumBits_ = 3;
static constexpr int RollStartBit_ = SubSectorStartBit_ + SubSectorNumBits_;
static constexpr unsigned int RollMask_ = 0X7;
public:
static constexpr uint32_t chamberIdMask_ = ~(RollMask_ << RollStartBit_);
private:
void init(int region, int ring, int station, int sector, int layer, int subsector, int roll);
int trind;
}; // RPCDetId
std::ostream& operator<<(std::ostream& os, const RPCDetId& id);
#endif
|