CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
FastL1RegionMap.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: FastL1CaloSim
4 // Class: FastL1RegionMap
5 //
13 //
14 // Original Author: Chi Nhan Nguyen
15 // Created: Mon Feb 19 13:25:24 CST 2007
16 // $Id: FastL1RegionMap.cc,v 1.12 2009/05/05 09:08:39 elmer Exp $
17 //
18 
19 
21 #include <cstdlib>
22 
24 {
25  nTower = 4608;
26  nRegion = 396;
27 
28 }
29 
31 
34 {
35  if(theInstance == 0)
36  {
38  }
39  return theInstance;
40 }
41 
42 // Region ID from DetId
43 std::pair<int, int>
45 {
46 
47  return FastL1RegionMap::getRegionEtaPhiIndex(std::pair<int, int>(tower.ieta(), tower.iphi()));
48 }
49 
50 // Region-Tower ID from DetId
51 int
53 {
54  return FastL1RegionMap::getRegionTowerIndex(std::pair<int, int>(tower.ieta(), tower.iphi()));
55 }
56 
57 
58 // Mapping of calotowers and regions
59 // input: calotower ieta,iphi
60 // output: region ieta,iphi
61 std::pair<int, int>
62 FastL1RegionMap::getRegionEtaPhiIndex(std::pair<int, int> EtaPhi)
63 {
65  // barrel: 2x(17x72) [eta,phi] -> 2x1224 (etaid: +/- 1-17 phiid: 1-72)
66  // endcap: 2x(11x72) [eta,phi] -> 2x792 (etaid: +/- 18-28 phiid: 1-72)
67  // forward: 2x(4x18) [eta,phi] -> 2x72 (etaid: +/- 29-32 phiid: 1-18)
69  // barrel: 2x(20x72) [eta,phi] -> 2x1440 (etaid: +/- 1-20 phiid: 1-72)
70  // endcap: 2x(18x36) [eta,phi] -> 2x648 (etaid: +/- 21-38 phiid: 1-36)
71  // forward: 2x(3x18) [eta,phi] -> 2x54 (etaid: +/- 40-41 phiid: 1-18)
73  // barrel: 2x(20x72) [eta,phi] -> 2x1440 (etaid: +/- 1-20 phiid: 1-72 interv: 1)
74  // endcap: 2x(19x36) [eta,phi] -> 2x684 (etaid: +/- 21-39 phiid: 1-72 interv: 2)
75  // forward: 2x(2x18) [eta,phi] -> 2x36 (etaid: +/- 40-41 phiid: 1-72 interv: 4)
77  // barrel: 2x(20x72) [eta,phi] -> 2x1440 (etaid: +/- 1-20 phiid: 1-72 interv: 1)
78  // endcap: 2x(18x36) [eta,phi] -> 2x684 (etaid: +/- 21-28 phiid: 1-72 interv: 2)
79  // forward: 2x(2x18) [eta,phi] -> 2x36 (etaid: +/- 29-32 phiid: 1-72 interv: 4)
80 
81  int iTwrEta = EtaPhi.first;
82  int iTwrPhi = EtaPhi.second;
83 
84  //iTwrPhi = convertFromECal_to_HCal_iphi(iTwrPhi);
85 
86  int iphi=999; // 0-17
87  int ieta=999; // 0-21 (barrel: 6-15, endcap: 4,5,16,17, HF: 0-3,18-21??)
88 
89  // Right now: only barrel/endcap parts work!!!
90  if (abs(iTwrEta)<=28) {
91 
92  //int isub; // 0-15 4x4 region matrix
93 
94  iphi = ((iTwrPhi + 1) / 4) % 18;
95 
96  if (iTwrEta > 0) {
97  ieta = (iTwrEta - 1) / 4 + 11;
98  } else {
99  ieta = (iTwrEta + 1) / 4 + 10;
100  }
101  }
102 
103  // Test HF!!!
104  if (abs(iTwrEta)>=29 && abs(iTwrEta)<=32) {
105  iphi = ((iTwrPhi + 1) / 4) % 18;
106 
107  if (iTwrEta == 29) {
108  ieta = 18;
109  }
110 
111  if (iTwrEta == 30) {
112  ieta = 19;
113  }
114 
115  if (iTwrEta == 31) {
116  ieta = 20;
117  }
118 
119  if (iTwrEta == 32) {
120  ieta = 21;
121  }
122 
123  if (iTwrEta == -29) {
124  ieta = 3;
125  }
126 
127  if (iTwrEta == -30) {
128  ieta = 2;
129  }
130 
131  if (iTwrEta == -31) {
132  ieta = 1;
133  }
134 
135  if (iTwrEta == -32) {
136  ieta = 0;
137  }
138 
139  /*
140  if (iTwrEta >= 29 && iTwrEta <= 32) {
141  ieta = 18;
142  }
143  if (iTwrEta >= 33 && iTwrEta <= 35) {
144  ieta = 19;
145  }
146  if (iTwrEta >= 36 && iTwrEta <= 38) {
147  ieta = 20;
148  }
149  if (iTwrEta >= 39 && iTwrEta <= 41) {
150  ieta = 21;
151  }
152 
153  if (iTwrEta <= -29 && iTwrEta >= -32) {
154  ieta = 3;
155  }
156  if (iTwrEta <= -33 && iTwrEta >= -35) {
157  ieta = 2;
158  }
159  if (iTwrEta <= -36 && iTwrEta >= -38) {
160  ieta = 1;
161  }
162  if (iTwrEta <= -39 && iTwrEta >= -41) {
163  ieta = 0;
164  }
165  */
166  }
167 
168  return std::pair<int, int>(ieta, iphi);
169 }
170 
171 // Mapping of calotowers and regions
172 // input: calotower ieta,iphi
173 // output: region isub 0-15 of 4x4 matrix
174 int
175 FastL1RegionMap::getRegionTowerIndex(std::pair<int, int> EtaPhi)
176 {
177  int iTwrEta = EtaPhi.first;
178  int iTwrPhi = EtaPhi.second;
179 
180  //iTwrPhi = convertFromECal_to_HCal_iphi(iTwrPhi);
181 
182  // Right now: only barrel/encap part!!!
183  int isub = 999; // 0-15 4x4 region matrix
184 
185  if (abs(iTwrEta)<=41) {
186  //if (abs(iTwrEta)<=28) {
187  if (iTwrEta > 0) {
188  isub = 4*(3 - (iTwrPhi + 1) %4) + ((iTwrEta - 1) % 4) ;
189  } else {
190  isub = 4*(3 - (iTwrPhi + 1) %4) + (3 + (iTwrEta+1)%4) ;
191  }
192  }
193 
194  return isub;
195 }
196 
197 int
199 {
200  return FastL1RegionMap::getRegionTowerIndex(std::pair<int, int>(iEta,iPhi));
201 }
202 
203 std::pair<int, int>
205 {
206  int ieta = regionId%22;
207  int iphi = regionId/22;
208 
209  return std::pair<int, int>(ieta, iphi);
210 }
211 
212 int
214 {
215 
216  std::pair<int, int> ietaphi(ieta,iphi);
217  std::pair<int, int> iep = getRegionEtaPhiIndex(ietaphi);
218 
219  int rgnid = iep.second*22 + iep.first;
220 
221  return rgnid;
222 }
223 
224 int
226 {
227  return getRegionIndex(tower.ieta(), tower.iphi());
228 }
229 
230 // ascii visualisation of mapping
231 void
233  // Region IDs
234  for (int iRgn=0; iRgn<396; iRgn++) {
235  if (iRgn%22 == 0) std::cerr << std::endl;
236  std::cerr << iRgn << " ";
237  }
238 
239  for (int iRgn=0; iRgn<396; iRgn++) {
240  if (iRgn%22 == 0) std::cerr << std::endl;
241  //std::pair<int, int> pep = m_Regions[iRgn].SetEtaPhiIndex();
242  for (int iTwr=0; iTwr<16; iTwr++) {
243 
244  if (iTwr%4 == 0) std::cerr << " | ";
245  std::cerr << iRgn << " ";
246  }
247  }
248 
249 }
250 
251 std::pair<double, double>
253 {
254 
255  std::pair<int, int> ep = getRegionEtaPhiIndex(iRgn);
256 
257  // this only true for barrel + endcap!
258  double eta = 999.;
259  double phi = 999.;
260 
261  // phi
262  if (ep.second <= 9) {
263  //phi = ep.second * 0.349065 + 0.1745329; // 10 degrees
264  phi = ep.second * 0.349065 ;
265  //phi = ep.second * 0.3490658504 + 0.1745329252; // 10 degrees
266  } else {
267  //phi = (18-ep.second) * (-0.349065) + 0.1745329; // -10 degrees
268  phi = (18-ep.second) * (-0.349065);
269  }
270  // eta
271  if (ep.first >= 11 && ep.first <= 15 )
272  eta = (ep.first-11)*0.349 + 0.1745;
273  //eta = (ep.first-11)*0.3490658504 + 0.1745329252;
274  if (ep.first == 16 )
275  eta = 1.956;
276  if (ep.first == 17 )
277  eta = 2.586;
278  if (ep.first == 18 )
279  eta = 3.25;
280  if (ep.first == 19 )
281  eta = 3.75;
282  if (ep.first == 20 )
283  eta = 4.25;
284  if (ep.first == 21 )
285  eta = 4.75;
286 
287  if (ep.first >= 6 && ep.first <= 10 )
288  eta = (10-ep.first)*(-0.348) - 0.174;
289  if (ep.first == 5 )
290  eta = -1.956;
291  if (ep.first == 4 )
292  eta = -2.586;
293  if (ep.first == 3 )
294  eta = -3.25;
295  if (ep.first == 2 )
296  eta = -3.75;
297  if (ep.first == 1 )
298  eta = -4.25;
299  if (ep.first == 0 )
300  eta = -4.75;
301 
302  //std::cout << "eta, phi ID: "<< ep.first << ", " << ep.second << std::endl;
303  //std::cout << "eta, phi: "<< eta << ", " << phi << std::endl;
304 
305 
306  return std::pair<double, double>(eta, phi);
307 }
308 
309 
310 // mapping from ECAL iphi numbering to HCAL iphi numbering
311 // which is shifted by 2 towers down
312 int
314 {
315  int iphi = 999;
316  if (iphi_ecal>=3)
317  iphi = iphi_ecal - 2;
318  else if (iphi_ecal==1 || iphi_ecal==2)
319  iphi = 70 + iphi_ecal;
320 
321  return iphi;
322 }
323 
324 
325 // mapping from HCAL iphi numbering to ECAL iphi numbering
326 // which is shifted by 2 towers down
327 int
329 {
330  int iphi = 999;
331  if (iphi_hcal>=1 && iphi_hcal<=70)
332  iphi = iphi_hcal + 2;
333  else if (iphi_hcal==71 || iphi_hcal==72)
334  iphi = iphi_hcal - 70;
335 
336  return iphi;
337 }
338 
339 std::pair<int, int>
341 {
342  if (iphi < 72)
343  return std::pair<int, int>(ieta, iphi+1);
344  else
345  return std::pair<int, int>(ieta, 1);
346 }
347 
348 std::pair<int, int>
350 {
351  if (iphi > 1)
352  return std::pair<int, int>(ieta, iphi-1);
353  else
354  return std::pair<int, int>(ieta, 72);
355 }
356 
357 std::pair<int, int>
359 {
360  if (ieta == 1) return std::pair<int, int>(-1, iphi);
361 
362  if (ieta > -32)
363  return std::pair<int, int>(ieta-1, iphi);
364  else
365  return std::pair<int, int>(999, iphi);
366 }
367 
368 std::pair<int, int>
370 {
371  if (ieta == -1) return std::pair<int, int>(1, iphi);
372 
373  if (ieta < 32)
374  return std::pair<int, int>(ieta+1, iphi);
375  else
376  return std::pair<int, int>(999, iphi);
377 }
378 
379 std::pair<int, int>
381 {
382  int iEta = ieta - 1;
383  int iPhi = iphi + 1;
384  if (ieta <= -32)
385  iEta = 999;
386  if (ieta == 1)
387  iEta = -1;
388  if (iphi == 72)
389  iPhi = 1;
390 
391  return std::pair<int, int>(iEta, iPhi);
392 }
393 
394 std::pair<int, int>
396 {
397  int iEta = ieta + 1;
398  int iPhi = iphi + 1;
399  if (ieta >= 32)
400  iEta = 999;
401  if (ieta == -1)
402  iEta = 1;
403  if (iphi == 72)
404  iPhi = 1;
405 
406  return std::pair<int, int>(iEta, iPhi);
407 }
408 
409 
410 
411 std::pair<int, int>
413 {
414  int iEta = ieta - 1;
415  int iPhi = iphi - 1;
416  if (ieta <= -32)
417  iEta = 999;
418  if (ieta == 1)
419  iEta = -1;
420  if (iphi == 1)
421  iPhi = 72;
422 
423  return std::pair<int, int>(iEta, iPhi);
424 }
425 
426 std::pair<int, int>
428 {
429  int iEta = ieta + 1;
430  int iPhi = iphi - 1;
431  if (ieta >= 32)
432  iEta = 999;
433  if (ieta == -1)
434  iEta = 1;
435  if (iphi == 1)
436  iPhi = 72;
437 
438  return std::pair<int, int>(iEta, iPhi);
439 }
std::pair< int, int > GetTowerNEEtaPhi(int ieta, int iphi)
std::pair< int, int > GetTowerNWEtaPhi(int ieta, int iphi)
std::pair< int, int > GetTowerSEEtaPhi(int ieta, int iphi)
static FastL1RegionMap * getFastL1RegionMap()
int getRegionIndex(int ieta, int iphi)
std::pair< double, double > getRegionCenterEtaPhi(int iRgn)
#define abs(x)
Definition: mlp_lapack.h:159
int getRegionTowerIndex(std::pair< int, int > iEtaPhi)
std::pair< int, int > GetTowerSWEtaPhi(int ieta, int iphi)
T eta() const
std::pair< int, int > GetTowerWestEtaPhi(int ieta, int iphi)
std::pair< int, int > GetTowerSouthEtaPhi(int ieta, int iphi)
int iphi() const
get the tower iphi
int convertFromECal_to_HCal_iphi(int iphi_ecal)
int convertFromHCal_to_ECal_iphi(int iphi_hcal)
static FastL1RegionMap * theInstance
std::pair< int, int > GetTowerNorthEtaPhi(int ieta, int iphi)
std::pair< int, int > GetTowerEastEtaPhi(int ieta, int iphi)
int ieta() const
get the tower ieta
std::pair< int, int > getRegionEtaPhiIndex(std::pair< int, int > iEtaPhi)
Definition: DDAxes.h:10