File indexing completed on 2024-04-06 12:20:16
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef L1Trigger_L1TCalorimeter_CaloStage2Nav_h
0013 #define L1Trigger_L1TCalorimeter_CaloStage2Nav_h
0014
0015 #include "L1Trigger/L1TCalorimeter/interface/CaloTools.h"
0016 #include <utility>
0017 #include <cstdlib>
0018
0019
0020
0021
0022 namespace l1t {
0023
0024 class CaloStage2Nav {
0025 public:
0026 CaloStage2Nav();
0027 CaloStage2Nav(int iEta, int iPhi);
0028 explicit CaloStage2Nav(std::pair<int, int> pos);
0029
0030
0031 static int offsetIPhi(int iPhi, int offset) {
0032 if (iPhi == 0)
0033 return 0;
0034 else {
0035 iPhi += offset;
0036 while (iPhi <= 0)
0037 iPhi += 72;
0038 while (iPhi > 72)
0039 iPhi -= 72;
0040 return iPhi;
0041 }
0042 }
0043
0044
0045 static int offsetIEta(int iEta, int offset) {
0046 int etaMax = CaloTools::kHFEnd;
0047 int etaBoundaryHF = CaloTools::kHFBegin;
0048
0049 if (iEta == 0)
0050 return 0;
0051 if (abs(iEta) > etaMax)
0052 return 0;
0053 if (abs(iEta) == etaBoundaryHF)
0054 return 0;
0055
0056 if (iEta > etaBoundaryHF) {
0057 int iEta_tmp = iEta;
0058
0059 if (offset < 0) {
0060 if (iEta_tmp + offset <= etaBoundaryHF)
0061 iEta_tmp--;
0062 if (iEta_tmp + offset <= 0)
0063 iEta_tmp--;
0064 if (iEta_tmp + offset <= -etaBoundaryHF)
0065 iEta_tmp--;
0066 if (iEta_tmp + offset <= -etaMax)
0067 return -etaMax;
0068 return iEta_tmp + offset;
0069 }
0070 if (offset >= 0) {
0071 if (iEta_tmp + offset >= etaMax)
0072 return etaMax;
0073 return iEta_tmp + offset;
0074 }
0075 } else if (iEta > 0) {
0076 int iEta_tmp = iEta;
0077
0078 if (offset < 0) {
0079 if (iEta_tmp + offset <= 0)
0080 iEta_tmp--;
0081 if (iEta_tmp + offset <= -etaBoundaryHF)
0082 iEta_tmp--;
0083 if (iEta_tmp + offset <= -etaMax)
0084 return -etaMax;
0085 return iEta_tmp + offset;
0086 }
0087 if (offset >= 0) {
0088 if (iEta_tmp + offset >= etaBoundaryHF)
0089 iEta_tmp++;
0090 if (iEta_tmp + offset >= etaMax)
0091 return etaMax;
0092 else
0093 return iEta_tmp + offset;
0094 }
0095 } else if (iEta > -etaBoundaryHF) {
0096 int iEta_tmp = iEta;
0097
0098 if (offset < 0) {
0099 if (iEta_tmp + offset <= -etaBoundaryHF)
0100 iEta_tmp--;
0101 if (iEta_tmp + offset <= -etaMax)
0102 return -etaMax;
0103 return iEta_tmp + offset;
0104 }
0105 if (offset >= 0) {
0106 if (iEta_tmp + offset >= 0)
0107 iEta_tmp++;
0108 if (iEta_tmp + offset >= etaBoundaryHF)
0109 iEta_tmp++;
0110 if (iEta_tmp + offset >= etaMax)
0111 return etaMax;
0112 return iEta_tmp + offset;
0113 }
0114 } else {
0115 int iEta_tmp = iEta;
0116
0117 if (offset < 0) {
0118 if (iEta_tmp + offset <= -etaMax)
0119 return -etaMax;
0120 return iEta_tmp + offset;
0121 }
0122 if (offset >= 0) {
0123 if (iEta_tmp + offset >= -etaBoundaryHF)
0124 iEta_tmp++;
0125 if (iEta_tmp + offset >= 0)
0126 iEta_tmp++;
0127 if (iEta_tmp + offset >= etaBoundaryHF)
0128 iEta_tmp++;
0129 if (iEta_tmp + offset >= etaMax)
0130 return etaMax;
0131 return iEta_tmp + offset;
0132 }
0133 }
0134 return 0;
0135 }
0136
0137 std::pair<int, int> offsetFromCurrPos(int iEtaOffset, int iPhiOffset) const;
0138
0139 std::pair<int, int> move(int iEtaOffset, int iPhiOffset);
0140 std::pair<int, int> north() { return move(0, 1); }
0141 std::pair<int, int> south() { return move(0, -1); }
0142 std::pair<int, int> east() { return move(1, 0); }
0143 std::pair<int, int> west() { return move(-1, 0); }
0144
0145 std::pair<int, int> currPos() const { return currPos_; }
0146 int currIEta() const { return currPos().first; }
0147 int currIPhi() const { return currPos().second; }
0148
0149 void resetPos() { currPos_ = homePos_; }
0150 void resetIEta() { currPos_.first = homePos_.first; }
0151 void resetIPhi() { currPos_.second = homePos_.second; }
0152 void setHomePos(int iEta, int iPhi) {
0153 homePos_.first = iEta;
0154 homePos_.second = iPhi;
0155 }
0156 void setHomePos(std::pair<int, int> pos) { setHomePos(pos.first, pos.second); }
0157
0158 private:
0159 std::pair<int, int> homePos_;
0160 std::pair<int, int>
0161 currPos_;
0162 };
0163
0164 }
0165
0166 #endif