File indexing completed on 2023-03-17 11:22:26
0001 #ifndef RecoTracker_MkFitCMS_interface_LayerNumberConverter_h
0002 #define RecoTracker_MkFitCMS_interface_LayerNumberConverter_h
0003
0004 #include <stdexcept>
0005
0006 namespace mkfit {
0007
0008 enum struct TkLayout { phase0 = 0, phase1 = 1, phase2 = 2 };
0009
0010 class LayerNumberConverter {
0011 public:
0012 LayerNumberConverter(TkLayout layout) : lo_(layout) {}
0013 void reset(TkLayout layout) { lo_ = layout; }
0014 unsigned int nLayers() const {
0015 if (lo_ == TkLayout::phase0)
0016 return 69;
0017 if (lo_ == TkLayout::phase1)
0018 return 72;
0019 if (lo_ == TkLayout::phase2)
0020 return 60;
0021 return 10;
0022 }
0023 TkLayout getEra() const { return lo_; }
0024 int convertLayerNumber(int det, int lay, bool useMatched, int isStereo, bool posZ) const {
0025 if (lo_ == TkLayout::phase2) {
0026 if (det == 1)
0027 return lay - 1;
0028 if (det == 2)
0029 return 16 + lay - 1 + (posZ ? 0 : 22);
0030 if (det == 5)
0031 return 4 + (2 * (lay - 1)) + isStereo;
0032 if (det == 4)
0033 return 16 + 12 + (2 * (lay - 1)) + isStereo + (posZ ? 0 : 22);
0034 throw std::runtime_error("bad subDet");
0035 }
0036
0037 if (det == 1 || det == 3 || det == 5) {
0038 return convertBarrelLayerNumber(det, lay, useMatched, isStereo);
0039 } else {
0040 int disk = convertDiskNumber(det, lay, useMatched, isStereo);
0041 if (disk < 0)
0042 return -1;
0043
0044 int lOffset = 0;
0045 if (lo_ == TkLayout::phase1)
0046 lOffset = 1;
0047 disk += 17 + lOffset;
0048 if (!posZ)
0049 disk += 25 + 2 * lOffset;
0050 return disk;
0051 }
0052 return -1;
0053 }
0054 bool doesHaveStereo(int det, int lay) const {
0055 if (lo_ == TkLayout::phase2) {
0056 if (det == 1 || det == 2)
0057 return false;
0058 if (det == 4 || det == 5)
0059 return true;
0060 throw std::runtime_error("bad subDet");
0061 }
0062 if (det == 3 || det == 5) {
0063 return lay == 1 || lay == 2;
0064 }
0065 if (det == 4 || det == 6) {
0066 return true;
0067 }
0068 return false;
0069 }
0070
0071 int convertBarrelLayerNumber(int cmsswdet, int cmsswlay, bool useMatched, int isStereo) const {
0072 int lOffset = 0;
0073 if (lo_ == TkLayout::phase1)
0074 lOffset = 1;
0075 if (cmsswdet == 2 || cmsswdet == 4 || cmsswdet == 6)
0076 return -1;
0077 if (cmsswdet == 1)
0078 return cmsswlay - 1;
0079 if (useMatched) {
0080
0081 if (cmsswdet == 3) {
0082 if (cmsswlay == 1 && isStereo == -1)
0083 return 3 + lOffset;
0084 else if (cmsswlay == 2 && isStereo == -1)
0085 return 4 + lOffset;
0086 else if (cmsswlay == 3 && isStereo == 0)
0087 return 5 + lOffset;
0088 else if (cmsswlay == 4 && isStereo == 0)
0089 return 6 + lOffset;
0090 }
0091
0092 else if (cmsswdet == 5) {
0093 if (cmsswlay == 1 && isStereo == -1)
0094 return 7 + lOffset;
0095 else if (cmsswlay == 2 && isStereo == -1)
0096 return 8 + lOffset;
0097 else if (cmsswlay >= 3 && cmsswlay <= 6 && isStereo == 0)
0098 return 6 + cmsswlay + lOffset;
0099 }
0100 return -1;
0101 } else {
0102
0103 if (cmsswdet == 3) {
0104 if ((cmsswlay == 1 || cmsswlay == 2) && (isStereo == 0 || isStereo == 1)) {
0105 return 1 + cmsswlay * 2 + isStereo + lOffset;
0106 } else if (cmsswlay == 3 && isStereo == 0)
0107 return 7 + lOffset;
0108 else if (cmsswlay == 4 && isStereo == 0)
0109 return 8 + lOffset;
0110 }
0111
0112 else if (cmsswdet == 5) {
0113 if ((cmsswlay == 1 || cmsswlay == 2) && (isStereo == 0 || isStereo == 1)) {
0114 return 7 + cmsswlay * 2 + isStereo + lOffset;
0115 } else if (cmsswlay >= 3 && cmsswlay <= 6 && isStereo == 0)
0116 return 10 + cmsswlay + lOffset;
0117 }
0118 return -1;
0119 }
0120 }
0121 int convertDiskNumber(int cmsswdet, int cmsswdisk, bool useMatched, int isStereo) const {
0122 if (cmsswdet == 1 || cmsswdet == 3 || cmsswdet == 5)
0123 return -1;
0124 if (cmsswdet == 2)
0125 return cmsswdisk - 1;
0126 int lOffset = 0;
0127 if (lo_ == TkLayout::phase1)
0128 lOffset = 1;
0129 if (useMatched) {
0130 return -1;
0131 } else {
0132 if ((isStereo != 0 && isStereo != 1) || cmsswdisk < 1)
0133 return -1;
0134
0135 if (cmsswdet == 4 && cmsswdisk <= 3)
0136 return cmsswdisk * 2 + isStereo + lOffset;
0137
0138 else if (cmsswdet == 6 && cmsswdisk <= 9)
0139 return 6 + cmsswdisk * 2 + isStereo + lOffset;
0140 return -1;
0141 }
0142 }
0143
0144 private:
0145 TkLayout lo_;
0146 };
0147
0148 }
0149
0150 #endif