CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_0/src/Geometry/CaloTopology/src/CaloTowerTopology.cc

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& /*id*/) const {
00111   return std::vector<DetId>();
00112 }
00113 
00114 std::vector<DetId> CaloTowerTopology::down(const DetId& /*id*/) const {
00115   return std::vector<DetId>();
00116 }
00117