Go to the documentation of this file.00001 #include "DataFormats/CaloTowers/interface/CaloTowerDetId.h"
00002 #include "Geometry/CaloTopology/interface/CaloTowerTopology.h"
00003
00004 static const int DoubleHE = 21;
00005 static const int QuadHF = 40;
00006
00007 bool CaloTowerTopology::valid(const DetId& id) const {
00008 CaloTowerDetId tid(id);
00009 bool bad=(tid.ieta()==0 || tid.iphi()<=0 || tid.iphi()>72 || tid.ieta()<-41 || tid.ieta()>41);
00010 return !bad;
00011 }
00012
00013 std::vector<DetId> CaloTowerTopology::east(const DetId& id) const {
00014 std::vector<DetId> dd;
00015 CaloTowerDetId tid(id);
00016 int ieta=tid.ieta();
00017 int iphi=tid.iphi();
00018
00019 if (ieta==1) {
00020 ieta=-1;
00021 } else if (ieta==DoubleHE) {
00022 ieta--;
00023 dd.push_back(CaloTowerDetId(ieta,iphi+1));
00024 } else if (ieta-1==-DoubleHE) {
00025 if ((iphi%2)==0) iphi--;
00026 ieta--;
00027 } else if (ieta==QuadHF) {
00028 ieta--;
00029 dd.push_back(CaloTowerDetId(ieta,((iphi+1)%72)+1));
00030 } else if (ieta-1==-QuadHF) {
00031 if (((iphi-1)%4)==0) {
00032 if (iphi==1) iphi=71;
00033 else iphi-=2;
00034 }
00035 ieta--;
00036 } else {
00037 ieta--;
00038 }
00039
00040 if (ieta>=-41) dd.push_back(CaloTowerDetId(ieta,iphi));
00041 return dd;
00042 }
00043
00044 std::vector<DetId> CaloTowerTopology::west(const DetId& id) const {
00045 std::vector<DetId> dd;
00046 CaloTowerDetId tid(id);
00047
00048 int ieta=tid.ieta();
00049 int iphi=tid.iphi();
00050
00051 if (ieta==-1) {
00052 ieta=1;
00053 } else if (ieta==-DoubleHE) {
00054 ieta++;
00055 dd.push_back(CaloTowerDetId(ieta,iphi+1));
00056 } else if (ieta+1==DoubleHE) {
00057 if ((iphi%2)==0) iphi--;
00058 ieta++;
00059 } else if (ieta==-QuadHF) {
00060 ieta++;
00061 dd.push_back(CaloTowerDetId(ieta,((iphi+1)%72)+1));
00062 } else if (ieta+1==QuadHF) {
00063 if (((iphi-1)%4)==0) {
00064 if (iphi==1) iphi=71;
00065 else iphi-=2;
00066 }
00067 ieta++;
00068 } else {
00069 ieta++;
00070 }
00071
00072 if (ieta<=41) dd.push_back(CaloTowerDetId(ieta,iphi));
00073
00074 return dd;
00075 }
00076
00077 std::vector<DetId> CaloTowerTopology::north(const DetId& id) const {
00078 CaloTowerDetId tid(id);
00079 int iphi_n=tid.iphi()+1;
00080 if (iphi_n>72) iphi_n=1;
00081 if (tid.ietaAbs()>=QuadHF) {
00082 iphi_n+=3;
00083 if (iphi_n>72) iphi_n-=72;
00084 } else if (tid.ietaAbs()>=DoubleHE && (iphi_n%2)==0) {
00085 iphi_n++;
00086 if (iphi_n>72) iphi_n-=72;
00087 }
00088
00089 std::vector<DetId> dd;
00090 dd.push_back(CaloTowerDetId(tid.ieta(),iphi_n));
00091 return dd;
00092 }
00093
00094 std::vector<DetId> CaloTowerTopology::south(const DetId& id) const {
00095 CaloTowerDetId tid(id);
00096 int iphi_s=tid.iphi()-1;
00097 if (iphi_s==0) iphi_s=72;
00098 if (tid.ietaAbs()>=QuadHF) {
00099 iphi_s-=3;
00100 if (iphi_s<=0) iphi_s+=72;
00101 } else if (tid.ietaAbs()>=DoubleHE && (iphi_s%2)==0) {
00102 iphi_s--;
00103 }
00104
00105 std::vector<DetId> dd;
00106 dd.push_back(CaloTowerDetId(tid.ieta(),iphi_s));
00107 return dd;
00108 }
00109
00110 std::vector<DetId> CaloTowerTopology::up(const DetId& ) const {
00111 return std::vector<DetId>();
00112 }
00113
00114 std::vector<DetId> CaloTowerTopology::down(const DetId& ) const {
00115 return std::vector<DetId>();
00116 }
00117