CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CaloTowerTopology.cc
Go to the documentation of this file.
3 
4 static const int DoubleHE = 21;
5 static const int QuadHF = 40;
6 
7 bool CaloTowerTopology::valid(const DetId& id) const {
8  CaloTowerDetId tid(id);
9  bool bad=(tid.ieta()==0 || tid.iphi()<=0 || tid.iphi()>72 || tid.ieta()<-41 || tid.ieta()>41);
10  return !bad;
11 }
12 
13 std::vector<DetId> CaloTowerTopology::east(const DetId& id) const {
14  std::vector<DetId> dd;
15  CaloTowerDetId tid(id);
16  int ieta=tid.ieta();
17  int iphi=tid.iphi();
18 
19  if (ieta==1) {
20  ieta=-1;
21  } else if (ieta==DoubleHE) {
22  ieta--;
23  dd.push_back(CaloTowerDetId(ieta,iphi+1));
24  } else if (ieta-1==-DoubleHE) {
25  if ((iphi%2)==0) iphi--;
26  ieta--;
27  } else if (ieta==QuadHF) {
28  ieta--;
29  dd.push_back(CaloTowerDetId(ieta,((iphi+1)%72)+1));
30  } else if (ieta-1==-QuadHF) {
31  if (((iphi-1)%4)==0) {
32  if (iphi==1) iphi=71;
33  else iphi-=2;
34  }
35  ieta--;
36  } else {
37  ieta--;
38  }
39 
40  if (ieta>=-41) dd.push_back(CaloTowerDetId(ieta,iphi));
41  return dd;
42 }
43 
44 std::vector<DetId> CaloTowerTopology::west(const DetId& id) const {
45  std::vector<DetId> dd;
46  CaloTowerDetId tid(id);
47 
48  int ieta=tid.ieta();
49  int iphi=tid.iphi();
50 
51  if (ieta==-1) {
52  ieta=1;
53  } else if (ieta==-DoubleHE) {
54  ieta++;
55  dd.push_back(CaloTowerDetId(ieta,iphi+1));
56  } else if (ieta+1==DoubleHE) {
57  if ((iphi%2)==0) iphi--;
58  ieta++;
59  } else if (ieta==-QuadHF) {
60  ieta++;
61  dd.push_back(CaloTowerDetId(ieta,((iphi+1)%72)+1));
62  } else if (ieta+1==QuadHF) {
63  if (((iphi-1)%4)==0) {
64  if (iphi==1) iphi=71;
65  else iphi-=2;
66  }
67  ieta++;
68  } else {
69  ieta++;
70  }
71 
72  if (ieta<=41) dd.push_back(CaloTowerDetId(ieta,iphi));
73 
74  return dd;
75 }
76 
77 std::vector<DetId> CaloTowerTopology::north(const DetId& id) const {
78  CaloTowerDetId tid(id);
79  int iphi_n=tid.iphi()+1;
80  if (iphi_n>72) iphi_n=1;
81  if (tid.ietaAbs()>=QuadHF) {
82  iphi_n+=3;
83  if (iphi_n>72) iphi_n-=72;
84  } else if (tid.ietaAbs()>=DoubleHE && (iphi_n%2)==0) {
85  iphi_n++;
86  if (iphi_n>72) iphi_n-=72;
87  }
88 
89  std::vector<DetId> dd;
90  dd.push_back(CaloTowerDetId(tid.ieta(),iphi_n));
91  return dd;
92 }
93 
94 std::vector<DetId> CaloTowerTopology::south(const DetId& id) const {
95  CaloTowerDetId tid(id);
96  int iphi_s=tid.iphi()-1;
97  if (iphi_s==0) iphi_s=72;
98  if (tid.ietaAbs()>=QuadHF) {
99  iphi_s-=3;
100  if (iphi_s<=0) iphi_s+=72;
101  } else if (tid.ietaAbs()>=DoubleHE && (iphi_s%2)==0) {
102  iphi_s--;
103  }
104 
105  std::vector<DetId> dd;
106  dd.push_back(CaloTowerDetId(tid.ieta(),iphi_s));
107  return dd;
108 }
109 
110 std::vector<DetId> CaloTowerTopology::up(const DetId& id) const {
111  return std::vector<DetId>();
112 }
113 
114 std::vector<DetId> CaloTowerTopology::down(const DetId& id) const {
115  return std::vector<DetId>();
116 }
117 
virtual std::vector< DetId > down(const DetId &id) const
virtual std::vector< DetId > south(const DetId &id) const
virtual bool valid(const DetId &id) const
is this detid present in the Topology?
static const int DoubleHE
int ietaAbs() const
get the absolute value of the tower ieta
int bad(Items const &cont)
static const int QuadHF
virtual std::vector< DetId > north(const DetId &id) const
int iphi() const
get the tower iphi
Definition: DetId.h:20
virtual std::vector< DetId > west(const DetId &id) const
virtual std::vector< DetId > east(const DetId &id) const
virtual std::vector< DetId > up(const DetId &id) const
int ieta() const
get the tower ieta