File indexing completed on 2024-04-06 12:32:03
0001 #include <iostream>
0002
0003 template <class T>
0004 T mod(const T& a, const T& b) {
0005 T c = a % b;
0006 return c < 0 ? c + b : c;
0007 }
0008
0009 static const char endcapDccMap[401] = {
0010 " 777777 "
0011 " 666777777888 "
0012 " 66667777778888 "
0013 " 6666667777888888 "
0014 " 666666677778888888 "
0015 " 566666677778888880 "
0016 " 555666667788888000 "
0017 "55555566677888000000"
0018 "555555566 880000000"
0019 "55555555 00000000"
0020 "55555554 10000000"
0021 "554444444 111111100"
0022 "44444444332211111111"
0023 " 444444333222111111 "
0024 " 444443333222211111 "
0025 " 444433333222221111 "
0026 " 4443333322222111 "
0027 " 43333332222221 "
0028 " 333333222222 "
0029 " 333222 "};
0030
0031
0032
0033
0034
0035
0036
0037
0038 inline int dccPhiIndexOfRU(int iDet, int i, int j) {
0039 if (iDet == 1) {
0040
0041
0042 return (j + 2) / 4;
0043 }
0044 char flag = endcapDccMap[i + j * 20];
0045 return (flag == ' ') ? -1 : (flag - '0');
0046 }
0047
0048
0049
0050
0051
0052
0053
0054
0055 inline int dccPhiIndex(int iDet, int i, int j) { return dccPhiIndexOfRU(iDet, i / 5, j / 5); }
0056
0057
0058
0059
0060
0061
0062
0063 inline int dccIndex(int iDet, int i, int j) {
0064 if (iDet == 1) {
0065
0066 int iEtaSM = i / 85;
0067
0068 int iPhiSM = (j + 10) / 20;
0069
0070 return 9 + 18 * iEtaSM + iPhiSM;
0071 }
0072 int iPhi = dccPhiIndex(iDet, i, j);
0073 if (iPhi < 0)
0074 return -1;
0075
0076
0077 return iPhi + iDet / 2 * 45;
0078 }
0079
0080
0081
0082
0083
0084
0085
0086 inline int dccIndexOfRU(int iDet, int i, int j) {
0087 if (iDet == 1) {
0088
0089 int iEtaSM = i / 17;
0090
0091 int iPhiSM = (j + 2) / 4;
0092
0093 return 9 + 18 * iEtaSM + iPhiSM;
0094 }
0095 int iPhi = dccPhiIndexOfRU(iDet, i, j);
0096 if (iPhi < 0)
0097 return -1;
0098
0099
0100 return iPhi + iDet / 2 * 45;
0101 }
0102
0103 inline int abOfDcc(int iDCC) {
0104 if (iDCC < 0 || iDCC > 54)
0105 return -1;
0106 if (iDCC < 9) {
0107 return iDCC / 3;
0108 } else if (iDCC < 27) {
0109
0110
0111
0112
0113 return 3 + mod(iDCC - 26, 18) / 6;
0114 } else if (iDCC < 45) {
0115
0116
0117
0118
0119 return 6 + mod(iDCC - 44, 18) / 6;
0120 } else {
0121
0122
0123 return 9 + (iDCC - 45) / 3;
0124 }
0125 }