CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/FastSimulation/L1CaloTriggerProducer/src/FastL1RegionMap.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:    FastL1CaloSim
00004 // Class:      FastL1RegionMap
00005 // 
00013 //
00014 // Original Author:  Chi Nhan Nguyen
00015 //         Created:  Mon Feb 19 13:25:24 CST 2007
00016 // $Id: FastL1RegionMap.cc,v 1.12 2009/05/05 09:08:39 elmer Exp $
00017 //
00018 
00019 
00020 #include "FastSimulation/L1CaloTriggerProducer/interface/FastL1RegionMap.h"
00021 #include <cstdlib>
00022 
00023 FastL1RegionMap::FastL1RegionMap()
00024 {
00025   nTower = 4608;
00026   nRegion = 396;
00027 
00028 }
00029 
00030 FastL1RegionMap* FastL1RegionMap::theInstance = 0;
00031 
00032 FastL1RegionMap*
00033 FastL1RegionMap::getFastL1RegionMap()
00034 {
00035   if(theInstance == 0)
00036     {
00037       theInstance = new FastL1RegionMap();
00038     }
00039   return theInstance;
00040 }
00041 
00042 // Region ID from DetId
00043 std::pair<int, int> 
00044 FastL1RegionMap::getRegionEtaPhiIndex(CaloTowerDetId tower)
00045 {
00046 
00047   return FastL1RegionMap::getRegionEtaPhiIndex(std::pair<int, int>(tower.ieta(), tower.iphi()));
00048 }
00049 
00050 // Region-Tower ID from DetId
00051 int 
00052 FastL1RegionMap::getRegionTowerIndex(CaloTowerDetId tower)
00053 {
00054   return FastL1RegionMap::getRegionTowerIndex(std::pair<int, int>(tower.ieta(), tower.iphi()));
00055 }
00056 
00057 
00058 // Mapping of calotowers and regions
00059 // input:  calotower ieta,iphi
00060 // output: region ieta,iphi
00061 std::pair<int, int> 
00062 FastL1RegionMap::getRegionEtaPhiIndex(std::pair<int, int> EtaPhi)
00063 {
00065   // barrel: 2x(17x72) [eta,phi] -> 2x1224 (etaid: +/- 1-17  phiid: 1-72)
00066   // endcap: 2x(11x72) [eta,phi] -> 2x792  (etaid: +/- 18-28 phiid: 1-72)
00067   // forward: 2x(4x18) [eta,phi] -> 2x72   (etaid: +/- 29-32 phiid: 1-18)
00069   // barrel:  2x(20x72) [eta,phi] -> 2x1440 (etaid: +/- 1-20  phiid: 1-72)
00070   // endcap:  2x(18x36) [eta,phi] -> 2x648  (etaid: +/- 21-38 phiid: 1-36)
00071   // forward: 2x(3x18)  [eta,phi] -> 2x54   (etaid: +/- 40-41 phiid: 1-18)
00073   // barrel: 2x(20x72) [eta,phi] -> 2x1440 (etaid: +/- 1-20  phiid: 1-72 interv: 1)
00074   // endcap: 2x(19x36) [eta,phi] -> 2x684  (etaid: +/- 21-39 phiid: 1-72 interv: 2)
00075   // forward: 2x(2x18) [eta,phi] -> 2x36   (etaid: +/- 40-41 phiid: 1-72 interv: 4)
00077   // barrel: 2x(20x72) [eta,phi] -> 2x1440 (etaid: +/- 1-20  phiid: 1-72 interv: 1)
00078   // endcap: 2x(18x36) [eta,phi] -> 2x684  (etaid: +/- 21-28 phiid: 1-72 interv: 2)
00079   // forward: 2x(2x18) [eta,phi] -> 2x36   (etaid: +/- 29-32 phiid: 1-72 interv: 4)
00080 
00081   int iTwrEta = EtaPhi.first;
00082   int iTwrPhi = EtaPhi.second;
00083 
00084   //iTwrPhi = convertFromECal_to_HCal_iphi(iTwrPhi);
00085 
00086   int iphi=999; // 0-17 
00087   int ieta=999; // 0-21 (barrel: 6-15, endcap: 4,5,16,17, HF: 0-3,18-21??)
00088 
00089   // Right now: only barrel/endcap parts work!!!
00090   if (abs(iTwrEta)<=28) {
00091 
00092     //int isub; // 0-15 4x4 region matrix 
00093     
00094     iphi = ((iTwrPhi + 1) / 4) % 18;
00095     
00096     if (iTwrEta > 0) {
00097       ieta = (iTwrEta - 1) / 4  + 11;
00098     } else {
00099       ieta = (iTwrEta + 1) / 4  + 10;
00100     }
00101   }
00102 
00103   // Test HF!!!
00104   if (abs(iTwrEta)>=29 && abs(iTwrEta)<=32) {
00105     iphi = ((iTwrPhi + 1) / 4) % 18;
00106 
00107     if (iTwrEta == 29) {
00108       ieta = 18;
00109     } 
00110 
00111     if (iTwrEta == 30) {
00112       ieta = 19;
00113     } 
00114 
00115     if (iTwrEta == 31) {
00116       ieta = 20;
00117     } 
00118 
00119     if (iTwrEta == 32) {
00120       ieta = 21;
00121     } 
00122 
00123     if (iTwrEta == -29) {
00124       ieta = 3;
00125     } 
00126 
00127     if (iTwrEta == -30) {
00128       ieta = 2;
00129     } 
00130 
00131     if (iTwrEta == -31) {
00132       ieta = 1;
00133     } 
00134 
00135     if (iTwrEta == -32) {
00136       ieta = 0;
00137     } 
00138 
00139     /*
00140     if (iTwrEta >= 29 && iTwrEta <= 32) {
00141       ieta = 18;
00142     } 
00143     if (iTwrEta >= 33 && iTwrEta <= 35) {
00144       ieta = 19;
00145     } 
00146     if (iTwrEta >= 36 && iTwrEta <= 38) {
00147       ieta = 20;
00148     } 
00149     if (iTwrEta >= 39 && iTwrEta <= 41) {
00150       ieta = 21;
00151     } 
00152 
00153     if (iTwrEta <= -29 && iTwrEta >= -32) {
00154       ieta = 3;
00155     } 
00156     if (iTwrEta <= -33 && iTwrEta >= -35) {
00157       ieta = 2;
00158     } 
00159     if (iTwrEta <= -36 && iTwrEta >= -38) {
00160       ieta = 1;
00161     } 
00162     if (iTwrEta <= -39 && iTwrEta >= -41) {
00163       ieta = 0;
00164     } 
00165     */
00166   }
00167 
00168   return std::pair<int, int>(ieta, iphi);
00169 }
00170 
00171 // Mapping of calotowers and regions
00172 // input:  calotower ieta,iphi
00173 // output: region isub 0-15 of 4x4 matrix
00174 int 
00175 FastL1RegionMap::getRegionTowerIndex(std::pair<int, int> EtaPhi)
00176 {
00177   int iTwrEta = EtaPhi.first;
00178   int iTwrPhi = EtaPhi.second;
00179 
00180   //iTwrPhi = convertFromECal_to_HCal_iphi(iTwrPhi);
00181 
00182   // Right now: only barrel/encap part!!!
00183   int isub = 999; // 0-15 4x4 region matrix 
00184 
00185   if (abs(iTwrEta)<=41) {
00186     //if (abs(iTwrEta)<=28) {
00187     if (iTwrEta > 0) {
00188       isub = 4*(3 - (iTwrPhi + 1) %4) + ((iTwrEta  - 1)  % 4) ;
00189     } else {
00190       isub = 4*(3 - (iTwrPhi + 1) %4) + (3 + (iTwrEta+1)%4) ;
00191     }
00192   }
00193 
00194   return isub;
00195 }
00196 
00197 int 
00198 FastL1RegionMap::getRegionTowerIndex(int iEta, int iPhi)
00199 {
00200   return FastL1RegionMap::getRegionTowerIndex(std::pair<int, int>(iEta,iPhi));
00201 }
00202 
00203 std::pair<int, int>
00204 FastL1RegionMap::getRegionEtaPhiIndex(int regionId)
00205 {
00206   int ieta = regionId%22;  
00207   int iphi = regionId/22;
00208 
00209   return std::pair<int, int>(ieta, iphi);
00210 }
00211 
00212 int
00213 FastL1RegionMap::getRegionIndex(int ieta, int iphi)
00214 {
00215 
00216   std::pair<int, int> ietaphi(ieta,iphi);
00217   std::pair<int, int> iep = getRegionEtaPhiIndex(ietaphi);
00218 
00219   int rgnid = iep.second*22 + iep.first;
00220 
00221   return rgnid;
00222 }
00223 
00224 int
00225 FastL1RegionMap::getRegionIndex(CaloTowerDetId tower)
00226 {
00227   return getRegionIndex(tower.ieta(), tower.iphi());
00228 }
00229 
00230 // ascii visualisation of mapping
00231 void 
00232 FastL1RegionMap::display() {
00233   // Region IDs
00234   for (int iRgn=0; iRgn<396; iRgn++) {
00235     if (iRgn%22 == 0) std::cerr << std::endl;   
00236     std::cerr << iRgn << " ";
00237   }
00238 
00239   for (int iRgn=0; iRgn<396; iRgn++) {
00240     if (iRgn%22 == 0) std::cerr << std::endl;   
00241     //std::pair<int, int> pep = m_Regions[iRgn].SetEtaPhiIndex();
00242     for (int iTwr=0; iTwr<16; iTwr++) {
00243       
00244       if (iTwr%4 == 0) std::cerr << " | ";   
00245       std::cerr << iRgn << " ";
00246     }
00247   }
00248   
00249 }
00250 
00251 std::pair<double, double>
00252 FastL1RegionMap::getRegionCenterEtaPhi(int iRgn)
00253 {
00254 
00255   std::pair<int, int> ep = getRegionEtaPhiIndex(iRgn);
00256 
00257   // this only true for barrel + endcap!
00258   double eta = 999.;  
00259   double phi = 999.;  
00260 
00261   // phi
00262   if (ep.second <= 9) {
00263     //phi = ep.second * 0.349065 + 0.1745329; // 10 degrees
00264     phi = ep.second * 0.349065 ;
00265     //phi = ep.second * 0.3490658504 + 0.1745329252; // 10 degrees
00266   } else {
00267     //phi = (18-ep.second)  * (-0.349065)  + 0.1745329; // -10 degrees
00268     phi = (18-ep.second)  * (-0.349065);
00269   }
00270   // eta
00271   if (ep.first >= 11 && ep.first <= 15 )
00272     eta = (ep.first-11)*0.349 + 0.1745;
00273     //eta = (ep.first-11)*0.3490658504 + 0.1745329252;
00274   if (ep.first == 16 )
00275     eta = 1.956;
00276   if (ep.first == 17 )
00277     eta = 2.586;
00278   if (ep.first == 18 )
00279     eta = 3.25;
00280   if (ep.first == 19 )
00281     eta = 3.75;
00282   if (ep.first == 20 )
00283     eta = 4.25;
00284   if (ep.first == 21 )
00285     eta = 4.75;
00286 
00287   if (ep.first >= 6 && ep.first <= 10 )
00288     eta = (10-ep.first)*(-0.348) - 0.174;
00289   if (ep.first == 5 )
00290     eta = -1.956;
00291   if (ep.first == 4 )
00292     eta = -2.586;
00293   if (ep.first == 3 )
00294     eta = -3.25;
00295   if (ep.first == 2 )
00296     eta = -3.75;
00297   if (ep.first == 1 )
00298     eta = -4.25;
00299   if (ep.first == 0 )
00300     eta = -4.75;
00301 
00302   //std::cout << "eta, phi ID: "<< ep.first << ", " << ep.second << std::endl;
00303   //std::cout << "eta, phi: "<< eta << ", " << phi << std::endl;
00304  
00305 
00306   return std::pair<double, double>(eta, phi);
00307 }
00308 
00309 
00310 // mapping from ECAL iphi numbering to HCAL iphi numbering
00311 // which is shifted by 2 towers down
00312 int
00313 FastL1RegionMap::convertFromECal_to_HCal_iphi(int iphi_ecal)
00314 {
00315   int iphi = 999;
00316   if (iphi_ecal>=3)
00317     iphi = iphi_ecal - 2;
00318   else if (iphi_ecal==1 || iphi_ecal==2)
00319     iphi = 70 + iphi_ecal;
00320  
00321   return iphi; 
00322 }
00323 
00324 
00325 // mapping from HCAL iphi numbering to ECAL iphi numbering
00326 // which is shifted by 2 towers down
00327 int
00328 FastL1RegionMap::convertFromHCal_to_ECal_iphi(int iphi_hcal)
00329 {
00330   int iphi = 999;
00331   if (iphi_hcal>=1 && iphi_hcal<=70)
00332     iphi = iphi_hcal + 2;
00333   else if (iphi_hcal==71 || iphi_hcal==72)
00334     iphi = iphi_hcal - 70;
00335  
00336   return iphi; 
00337 }
00338 
00339 std::pair<int, int> 
00340 FastL1RegionMap::GetTowerNorthEtaPhi(int ieta, int iphi) 
00341 { 
00342   if (iphi < 72) 
00343     return std::pair<int, int>(ieta, iphi+1); 
00344   else 
00345     return std::pair<int, int>(ieta, 1); 
00346 }
00347 
00348 std::pair<int, int> 
00349 FastL1RegionMap::GetTowerSouthEtaPhi(int ieta, int iphi) 
00350 { 
00351   if (iphi > 1) 
00352     return std::pair<int, int>(ieta, iphi-1); 
00353   else 
00354     return std::pair<int, int>(ieta, 72); 
00355 }
00356 
00357 std::pair<int, int> 
00358 FastL1RegionMap::GetTowerWestEtaPhi(int ieta, int iphi) 
00359 { 
00360   if (ieta == 1) return std::pair<int, int>(-1, iphi);
00361 
00362   if (ieta > -32) 
00363     return std::pair<int, int>(ieta-1, iphi); 
00364   else 
00365     return std::pair<int, int>(999, iphi); 
00366 }
00367 
00368 std::pair<int, int> 
00369 FastL1RegionMap::GetTowerEastEtaPhi(int ieta, int iphi) 
00370 { 
00371   if (ieta == -1) return std::pair<int, int>(1, iphi);
00372 
00373   if (ieta < 32) 
00374     return std::pair<int, int>(ieta+1, iphi); 
00375   else 
00376     return std::pair<int, int>(999, iphi); 
00377 }
00378 
00379 std::pair<int, int> 
00380 FastL1RegionMap::GetTowerNWEtaPhi(int ieta, int iphi) 
00381 { 
00382   int iEta = ieta - 1;
00383   int iPhi = iphi + 1;
00384   if (ieta <= -32) 
00385     iEta = 999;
00386   if (ieta == 1) 
00387     iEta = -1;
00388   if (iphi == 72) 
00389     iPhi = 1;
00390 
00391   return std::pair<int, int>(iEta, iPhi); 
00392 }
00393 
00394 std::pair<int, int> 
00395 FastL1RegionMap::GetTowerNEEtaPhi(int ieta, int iphi) 
00396 { 
00397   int iEta = ieta + 1;
00398   int iPhi = iphi + 1;
00399   if (ieta >= 32) 
00400     iEta = 999;
00401   if (ieta == -1) 
00402     iEta = 1;
00403   if (iphi == 72) 
00404     iPhi = 1;
00405 
00406   return std::pair<int, int>(iEta, iPhi); 
00407 }
00408 
00409 
00410 
00411 std::pair<int, int> 
00412 FastL1RegionMap::GetTowerSWEtaPhi(int ieta, int iphi) 
00413 { 
00414   int iEta = ieta - 1;
00415   int iPhi = iphi - 1;
00416   if (ieta <= -32) 
00417     iEta = 999;
00418   if (ieta == 1) 
00419     iEta = -1;
00420   if (iphi == 1) 
00421     iPhi = 72;
00422 
00423   return std::pair<int, int>(iEta, iPhi); 
00424 }
00425 
00426 std::pair<int, int> 
00427 FastL1RegionMap::GetTowerSEEtaPhi(int ieta, int iphi) 
00428 { 
00429   int iEta = ieta + 1;
00430   int iPhi = iphi - 1;
00431   if (ieta >= 32) 
00432     iEta = 999;
00433   if (ieta == -1) 
00434     iEta = 1;
00435   if (iphi == 1) 
00436     iPhi = 72;
00437 
00438   return std::pair<int, int>(iEta, iPhi); 
00439 }