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) ieta=-1; 00020 else if (ieta==DoubleHE) { 00021 ieta--; 00022 dd.push_back(CaloTowerDetId(ieta,iphi+1)); 00023 } else if (ieta-1==-DoubleHE) { 00024 if ((iphi%2)==0) iphi--; 00025 ieta--; 00026 } else if (ieta==QuadHF) { 00027 ieta--; 00028 dd.push_back(CaloTowerDetId(ieta,((iphi+1)%72)+1)); 00029 } else if (ieta-1==-QuadHF) { 00030 if (((iphi-1)%4)==0) 00031 if (iphi==1) iphi=71; 00032 else iphi-=2; 00033 ieta--; 00034 } else ieta--; 00035 00036 if (ieta>=-41) 00037 dd.push_back(CaloTowerDetId(ieta,iphi)); 00038 return dd; 00039 } 00040 00041 std::vector<DetId> CaloTowerTopology::west(const DetId& id) const { 00042 std::vector<DetId> dd; 00043 CaloTowerDetId tid(id); 00044 00045 int ieta=tid.ieta(); 00046 int iphi=tid.iphi(); 00047 00048 if (ieta==-1) ieta=1; 00049 else if (ieta==-DoubleHE) { 00050 ieta++; 00051 dd.push_back(CaloTowerDetId(ieta,iphi+1)); 00052 } else if (ieta+1==DoubleHE) { 00053 if ((iphi%2)==0) iphi--; 00054 ieta++; 00055 } else if (ieta==-QuadHF) { 00056 ieta++; 00057 dd.push_back(CaloTowerDetId(ieta,((iphi+1)%72)+1)); 00058 } else if (ieta+1==QuadHF) { 00059 if (((iphi-1)%4)==0) 00060 if (iphi==1) iphi=71; 00061 else iphi-=2; 00062 ieta++; 00063 } else ieta++; 00064 00065 if (ieta<=41) 00066 dd.push_back(CaloTowerDetId(ieta,iphi)); 00067 00068 return dd; 00069 } 00070 00071 std::vector<DetId> CaloTowerTopology::north(const DetId& id) const { 00072 CaloTowerDetId tid(id); 00073 int iphi_n=tid.iphi()+1; 00074 if (iphi_n>72) iphi_n=1; 00075 if (tid.ietaAbs()>=DoubleHE && (iphi_n%2)==0) { 00076 iphi_n++; 00077 if (iphi_n>72) iphi_n-=72; 00078 } 00079 if (tid.ietaAbs()>=QuadHF) { 00080 iphi_n+=3; 00081 if (iphi_n>72) iphi_n-=72; 00082 } 00083 00084 std::vector<DetId> dd; 00085 dd.push_back(CaloTowerDetId(tid.ieta(),iphi_n)); 00086 return dd; 00087 } 00088 00089 std::vector<DetId> CaloTowerTopology::south(const DetId& id) const { 00090 CaloTowerDetId tid(id); 00091 int iphi_s=tid.iphi()-1; 00092 if (iphi_s==0) iphi_s=72; 00093 if (tid.ietaAbs()>=DoubleHE && (iphi_s%2)==0) iphi_s--; 00094 if (tid.ietaAbs()>=QuadHF) { 00095 iphi_s-=3; 00096 if (iphi_s<=0) iphi_s+=72; 00097 } 00098 00099 std::vector<DetId> dd; 00100 dd.push_back(CaloTowerDetId(tid.ieta(),iphi_s)); 00101 return dd; 00102 } 00103 00104 std::vector<DetId> CaloTowerTopology::up(const DetId& id) const { 00105 return std::vector<DetId>(); 00106 } 00107 00108 std::vector<DetId> CaloTowerTopology::down(const DetId& id) const { 00109 return std::vector<DetId>(); 00110 } 00111