6 const int EEDetId::QuadColLimits[
EEDetId::nCols + 1] = {0, 8, 17, 27, 36, 45, 54, 62, 70, 76, 79};
8 const int EEDetId::iYoffset[
EEDetId::nCols + 1] = {0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0};
11 41, 51, 41, 51, 41, 51, 36, 51, 36, 51, 26, 51, 26, 51, 26, 51, 21, 51, 21, 51, 21, 51, 21, 51, 21, 51, 16, 51, 16,
12 51, 14, 51, 14, 51, 14, 51, 14, 51, 14, 51, 9, 51, 9, 51, 9, 51, 9, 51, 9, 51, 6, 51, 6, 51, 6, 51, 6, 51,
13 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 4, 51, 4, 51, 4, 51, 4, 51, 4, 56, 1, 58, 1, 59, 1, 60, 1,
14 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 61, 1, 61, 1, 60,
15 1, 59, 1, 58, 4, 56, 4, 51, 4, 51, 4, 51, 4, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6, 51, 6,
16 51, 6, 51, 6, 51, 9, 51, 9, 51, 9, 51, 9, 51, 9, 51, 14, 51, 14, 51, 14, 51, 14, 51, 14, 51, 16, 51, 16, 51,
17 21, 51, 21, 51, 21, 51, 21, 51, 21, 51, 26, 51, 26, 51, 26, 51, 36, 51, 36, 51, 41, 51, 41, 51, 41, 51};
20 0, 10, 20, 30, 40, 50, 60, 75, 90, 105, 120, 145, 170, 195, 220, 245, 270, 300, 330,
21 360, 390, 420, 450, 480, 510, 540, 570, 605, 640, 675, 710, 747, 784, 821, 858, 895, 932, 969,
22 1006, 1043, 1080, 1122, 1164, 1206, 1248, 1290, 1332, 1374, 1416, 1458, 1500, 1545, 1590, 1635, 1680, 1725, 1770,
23 1815, 1860, 1905, 1950, 1995, 2040, 2085, 2130, 2175, 2220, 2265, 2310, 2355, 2400, 2447, 2494, 2541, 2588, 2635,
24 2682, 2729, 2776, 2818, 2860, 2903, 2946, 2988, 3030, 3071, 3112, 3152, 3192, 3232, 3272, 3311, 3350, 3389, 3428,
25 3467, 3506, 3545, 3584, 3623, 3662, 3701, 3740, 3779, 3818, 3857, 3896, 3935, 3974, 4013, 4052, 4092, 4132, 4172,
26 4212, 4253, 4294, 4336, 4378, 4421, 4464, 4506, 4548, 4595, 4642, 4689, 4736, 4783, 4830, 4877, 4924, 4969, 5014,
27 5059, 5104, 5149, 5194, 5239, 5284, 5329, 5374, 5419, 5464, 5509, 5554, 5599, 5644, 5689, 5734, 5779, 5824, 5866,
28 5908, 5950, 5992, 6034, 6076, 6118, 6160, 6202, 6244, 6281, 6318, 6355, 6392, 6429, 6466, 6503, 6540, 6577, 6614,
29 6649, 6684, 6719, 6754, 6784, 6814, 6844, 6874, 6904, 6934, 6964, 6994, 7024, 7054, 7079, 7104, 7129, 7154, 7179,
30 7204, 7219, 7234, 7249, 7264, 7274, 7284, 7294, 7304, 7314};
43 crystal_ix = iz *
ix(SC, crystal);
47 crystal_iy =
iy(SC, crystal);
54 <<
"EEDetId: Cannot create object. Unknown mode for (int, int, int) constructor.";
58 throw cms::Exception(
"InvalidDetId") <<
"EEDetId: Cannot create object. Indexes out of bounds \n" 59 <<
"x = " << crystal_ix <<
" y = " << crystal_iy <<
" z = " << iz;
62 id_ |= (crystal_iy & 0x7f) | ((crystal_ix & 0x7f) << 7) | ((iz > 0) ? (0x4000) : (0));
67 const int iz(hi <
kEEhalf ? -1 : 1);
68 const uint32_t di(hi %
kEEhalf);
70 const int iy(1 + ii / 2);
71 const int ix(
kxf[ii] + di -
kdi[ii]);
92 if (iSC > 4 * nSCinQuadrant || iSC < 1) {
98 if (iSC > 3 * nSCinQuadrant) {
99 iSCmap = iSC - 3 * nSCinQuadrant;
102 }
else if (iSC > 2 * nSCinQuadrant) {
103 iSCmap = iSC - 2 * nSCinQuadrant;
106 }
else if (iSC > nSCinQuadrant) {
107 iSCmap = iSC - nSCinQuadrant;
123 if (iq == 1 || iq == 3)
124 ixCrys = iqx * (5 * (iCol - 1) + (
int)(iCrys + 4) / 5);
125 else if (iq == 2 || iq == 4)
126 ixCrys = iqx * (5 * (iCol - 1) + (iCrys - 1) % 5 + 1);
146 if (iSC > 4 * nSCinQuadrant || iSC < 1) {
152 if (iSC > 3 * nSCinQuadrant) {
153 iSCmap = iSC - 3 * nSCinQuadrant;
156 }
else if (iSC > 2 * nSCinQuadrant) {
157 iSCmap = iSC - 2 * nSCinQuadrant;
160 }
else if (iSC > nSCinQuadrant) {
161 iSCmap = iSC - nSCinQuadrant;
179 if (iq == 1 || iq == 3)
180 iyCrys = iqy * (5 * (iSCy - 1) + (iCrys - 1) % 5 + 1);
181 else if (iq == 2 || iq == 4)
182 iyCrys = iqy * (5 * (iSCy - 1) + (
int)(iCrys + 4) / 5);
188 if (iQuadrant == 1 || iQuadrant == 4)
190 else if (iQuadrant == 2 || iQuadrant == 3)
198 if (iQuadrant == 1 || iQuadrant == 2)
200 else if (iQuadrant == 3 || iQuadrant == 4)
225 if (0 < jx && 21 > jx && 0 < jy && 21 > jy) {
226 const int iquad((10 < jx && 10 < jy ? 1 : (11 > jx && 10 < jy ? 2 : (11 > jx && 11 > jy ? 3 : 4))));
228 const int iCol = (1 == iquad || 4 == iquad ? jx - 10 : 11 - jx);
229 const int iRow = (1 == iquad || 2 == iquad ? jy - 10 : 11 - jy);
231 static const int nSCinQuadrant =
ISC_MAX / 4;
235 const int qOff(nSCinQuadrant * (iquad - 1));
239 return (yOff >= iRow ? -1 : (
QuadColLimits[iCol] < iscOne ? -2 : iscOne + qOff));
262 if (iQuadrant == 1 || iQuadrant == 3) {
267 else if (iQuadrant == 2 || iQuadrant == 4) {
272 int icrys = 5 * icrCol + icrRow + 1;
281 return id.ix() == 50 ||
id.ix() == 51;
285 for (
int i = -1;
i <= 1; ++
i) {
286 for (
int j = -1; j <= 1; ++j) {
300 returnValue = ax + 50 - ay;
321 returnValue = 91 - returnValue;
327 returnValue = 271 - returnValue;
333 returnValue = 1 + (360 + returnValue - 10 - 1) % 360;
346 const int index1(iPhi - 1);
347 const int quad(index1 / 90);
348 int indexq(index1 - quad * 90 + 1);
349 if (0 == quad || 2 == quad)
350 indexq = 91 - indexq;
351 const int indexh(indexq > 45 ? 91 - indexq : indexq);
367 : (indexh <= 39 ? 30 : (indexh <= 44 ? indexh - 9 : 35)))))))));
379 : (indexh <= 30 ? 73 - indexh
381 : (indexh <= 39 ? 77 - indexh
382 : (indexh <= 44 ? 37 : 36)))))))));
383 const int bxh(indexq > 45 ? ayh : axh);
384 const int byh(indexq > 45 ? axh : ayh);
385 const int cx((quad == 0 || quad == 3 ? bxh : -bxh + 1) +
IX_MAX / 2);
386 const int cy((quad == 0 || quad == 1 ? byh : -byh + 1) +
IY_MAX / 2);
388 return EEDetId(cx, cy, (zEnd > 0 ? 1 : -1));
392 int newX =
ix() + nrStepsX;
393 int newY =
iy() + nrStepsY;
403 int newZSide = -1 *
zside();
438 return ((ax <= 10 && ay == 50) || (ax == 10 && ay >= 48) || (ax <= 15 && ax >= 11 && ay == 47) ||
439 (ax == 15 && ay == 46) || (ax <= 25 && ax >= 16 && ay == 45) || (ax == 25 && ay <= 44 && ay >= 43) ||
440 (ax <= 30 && ax >= 26 && ay == 42) || (ax == 30 && ay <= 41 && ay >= 38) ||
441 (ax <= 35 && ax >= 31 && ay == 37) || (ax == 35 && ay == 36));
446 !((crystal_ix >= 1 && crystal_ix <= 3 && (crystal_iy <= 40 || crystal_iy > 60)) ||
447 (crystal_ix >= 4 && crystal_ix <= 5 && (crystal_iy <= 35 || crystal_iy > 65)) ||
448 (crystal_ix >= 6 && crystal_ix <= 8 && (crystal_iy <= 25 || crystal_iy > 75)) ||
449 (crystal_ix >= 9 && crystal_ix <= 13 && (crystal_iy <= 20 || crystal_iy > 80)) ||
450 (crystal_ix >= 14 && crystal_ix <= 15 && (crystal_iy <= 15 || crystal_iy > 85)) ||
451 (crystal_ix >= 16 && crystal_ix <= 20 && (crystal_iy <= 13 || crystal_iy > 87)) ||
452 (crystal_ix >= 21 && crystal_ix <= 25 && (crystal_iy <= 8 || crystal_iy > 92)) ||
453 (crystal_ix >= 26 && crystal_ix <= 35 && (crystal_iy <= 5 || crystal_iy > 95)) ||
454 (crystal_ix >= 36 && crystal_ix <= 39 && (crystal_iy <= 3 || crystal_iy > 97)) ||
455 (crystal_ix >= 98 && crystal_ix <= 100 && (crystal_iy <= 40 || crystal_iy > 60)) ||
456 (crystal_ix >= 96 && crystal_ix <= 97 && (crystal_iy <= 35 || crystal_iy > 65)) ||
457 (crystal_ix >= 93 && crystal_ix <= 95 && (crystal_iy <= 25 || crystal_iy > 75)) ||
458 (crystal_ix >= 88 && crystal_ix <= 92 && (crystal_iy <= 20 || crystal_iy > 80)) ||
459 (crystal_ix >= 86 && crystal_ix <= 87 && (crystal_iy <= 15 || crystal_iy > 85)) ||
460 (crystal_ix >= 81 && crystal_ix <= 85 && (crystal_iy <= 13 || crystal_iy > 87)) ||
461 (crystal_ix >= 76 && crystal_ix <= 80 && (crystal_iy <= 8 || crystal_iy > 92)) ||
462 (crystal_ix >= 66 && crystal_ix <= 75 && (crystal_iy <= 5 || crystal_iy > 95)) ||
463 (crystal_ix >= 62 && crystal_ix <= 65 && (crystal_iy <= 3 || crystal_iy > 97)) ||
464 ((crystal_ix == 40 || crystal_ix == 61) &&
465 ((crystal_iy >= 46 && crystal_iy <= 55) || crystal_iy <= 3 || crystal_iy > 97)) ||
466 ((crystal_ix == 41 || crystal_ix == 60) && crystal_iy >= 44 && crystal_iy <= 57) ||
467 ((crystal_ix == 42 || crystal_ix == 59) && crystal_iy >= 43 && crystal_iy <= 58) ||
468 ((crystal_ix == 43 || crystal_ix == 58) && crystal_iy >= 42 && crystal_iy <= 59) ||
469 ((crystal_ix == 44 || crystal_ix == 45 || crystal_ix == 57 || crystal_ix == 56) && crystal_iy >= 41 &&
471 (crystal_ix >= 46 && crystal_ix <= 55 && crystal_iy >= 40 && crystal_iy <= 61));
480 return s <<
"(EE iz " << ((
id.zside() > 0) ? (
"+ ") : (
"- ")) <<
" ix " <<
id.ix() <<
" , iy " <<
id.iy() <<
')';
static bool isNextToBoundary(EEDetId id)
static int distanceX(const EEDetId &a, const EEDetId &b)
std::ostream & operator<<(std::ostream &s, const EEDetId &id)
constexpr uint32_t rawId() const
get the raw id
EEDetId offsetBy(int nrStepsX, int nrStepsY) const
int ixQuadrantOne() const
static EEDetId unhashIndex(int hi)
static const int SCCRYSTALMODE
static bool validHashIndex(int i)
static const int iYoffset[nCols+1]
static bool isOuterRingXY(int ax, int ay)
static bool slowValidDetId(int crystal_ix, int crystal_iy)
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
int iPhiOuterRing() const
Abs< T >::type abs(const T &t)
static bool isNextToRingBoundary(EEDetId id)
static int distanceY(const EEDetId &a, const EEDetId &b)
static bool isNextToDBoundary(EEDetId id)
EEDetId switchZSide() const
static bool validDetId(int crystal_ix, int crystal_iy, int iz)
static const int QuadColLimits[nCols+1]
static const unsigned short kxf[2 *IY_MAX]
static EEDetId idOuterRing(int iPhi, int zEnd)
int iyQuadrantOne() const
static const unsigned short kdi[2 *IY_MAX]
constexpr DetId()
Create an empty or null id (also for persistence)
constexpr Detector det() const
get the detector field from this detid