Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:14:18

0001 #include "Geometry/CaloTopology/interface/EcalTrigTowerConstituentsMap.h"
0002 #include "DataFormats/EcalDetId/interface/EBDetId.h"
0003 #include "DataFormats/EcalDetId/interface/EEDetId.h"
0004 
0005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0006 
0007 #include "FWCore/Utilities/interface/Exception.h"
0008 #include <cassert>
0009 
0010 EcalTrigTowerConstituentsMap::EcalTrigTowerConstituentsMap() {}
0011 
0012 EcalTrigTowerDetId EcalTrigTowerConstituentsMap::barrelTowerOf(const DetId& id) {
0013   assert(id.det() == DetId::Ecal && id.subdetId() == EcalBarrel);
0014   //--------------------
0015   // Ecal Barrel
0016   //--------------------
0017   EBDetId myId(id);
0018   return myId.tower();
0019 }
0020 
0021 EcalTrigTowerDetId EcalTrigTowerConstituentsMap::towerOf(const DetId& id) const {
0022   if (id.det() == DetId::Ecal && id.subdetId() == EcalBarrel) {
0023     //--------------------
0024     // Ecal Barrel
0025     //--------------------
0026     EBDetId myId(id);
0027     return myId.tower();
0028   } else if (id.det() == DetId::Ecal && id.subdetId() == EcalEndcap) {
0029     //--------------------
0030     // Ecal Endcap
0031     //--------------------
0032     EEDetId originalId(id);
0033     // DetId wrappedId=wrapEEDetId(id);
0034     DetId wrappedId(originalId);
0035     EcalTowerMap::const_iterator i = m_items.find(wrappedId);
0036     if (i != m_items.end()) {
0037       int etaTower = i->tower.ietaAbs();
0038       int phiTower = i->tower.iphi();
0039       //trigger tower <-> crystal maping read
0040       //..........from file and done only for 1 quadrant
0041       //move from quadrant 1 to the actual one:
0042       // phiTower = changeTowerQuadrant(phiTower, 1, originalId.iquadrant());
0043       edm::LogVerbatim("EcalTrigTowerConstituentsMap")
0044           << "EcalTrigTowerConstituentsMap " << originalId.zside() << " " << etaTower << " " << phiTower;
0045       return EcalTrigTowerDetId(originalId.zside(), EcalEndcap, etaTower, phiTower);
0046     }
0047   }
0048   return EcalTrigTowerDetId(0);
0049 }
0050 
0051 DetId EcalTrigTowerConstituentsMap::wrapEEDetId(const DetId& eeid) const {
0052   if (!(eeid.det() == DetId::Ecal && eeid.subdetId() == EcalEndcap))
0053     return EEDetId(0);
0054 
0055   EEDetId myId(eeid);
0056   switch ((myId.iquadrant() - 1) % 4) {
0057     case 0:
0058       return DetId(EEDetId(myId.ix(), myId.iy(), 1, EEDetId::XYMODE));
0059       break;
0060     case 1:
0061       return DetId(EEDetId(101 - myId.ix(), myId.iy(), 1, EEDetId::XYMODE));
0062       break;
0063     case 2:
0064       return DetId(EEDetId(101 - myId.ix(), 101 - myId.iy(), 1, EEDetId::XYMODE));
0065       break;
0066     case 3:
0067       return DetId(EEDetId(myId.ix(), 101 - myId.iy(), 1, EEDetId::XYMODE));
0068       break;
0069     default:
0070       /*should never be reached*/
0071       edm::LogError("EcalTrigTowerConstituentsMapError") << "This should never be reached. Profound error!";
0072   }
0073   return EEDetId(0);
0074 }
0075 
0076 DetId EcalTrigTowerConstituentsMap::wrapEcalTrigTowerDetId(const DetId& id) const {
0077   EcalTrigTowerDetId etid(id);
0078 
0079   if (!(etid.det() == DetId::Ecal && etid.subdetId() == EcalTriggerTower && etid.subDet() == EcalEndcap))
0080     return EcalTrigTowerDetId(0);
0081 
0082   switch ((etid.iquadrant() - 1) % 4) {
0083     case 0:
0084       return DetId(EcalTrigTowerDetId(1, EcalEndcap, etid.ietaAbs(), etid.iphi()));
0085       break;
0086     case 1:
0087       return DetId(EcalTrigTowerDetId(
0088           1, EcalEndcap, etid.ietaAbs(), EcalTrigTowerDetId::kEETowersInPhiPerQuadrant * 2 - etid.iphi() + 1));
0089       break;
0090     case 2:
0091       return DetId(EcalTrigTowerDetId(
0092           1, EcalEndcap, etid.ietaAbs(), etid.iphi() - EcalTrigTowerDetId::kEETowersInPhiPerQuadrant * 2));
0093       break;
0094     case 3:
0095       return DetId(EcalTrigTowerDetId(
0096           1, EcalEndcap, etid.ietaAbs(), EcalTrigTowerDetId::kEETowersInPhiPerQuadrant * 4 - etid.iphi() + 1));
0097       break;
0098     default:
0099       /*should never be reached*/
0100       edm::LogError("EcalTrigTowerConstituentsMapError") << "This should never be reached. Profound error!";
0101   }
0102   return EcalTrigTowerDetId(0);
0103 }
0104 
0105 DetId EcalTrigTowerConstituentsMap::changeEEDetIdQuadrantAndZ(const DetId& fromid,
0106                                                               const int& toQuadrant,
0107                                                               const int& tozside) const {
0108   if (!(fromid.det() == DetId::Ecal && fromid.subdetId() == EcalEndcap))
0109     return EEDetId(0);
0110 
0111   EEDetId myId(fromid);
0112   int dQuadrant = toQuadrant - myId.iquadrant();
0113   switch (dQuadrant % 4) {
0114     case 0:
0115       return DetId(EEDetId(myId.ix(), myId.iy(), tozside, EEDetId::XYMODE));
0116       break;
0117     case 1:
0118       /* adjacent tower: they are symetric*/
0119       return DetId(EEDetId(101 - myId.ix(), myId.iy(), tozside, EEDetId::XYMODE));
0120       break;
0121     case 2:
0122       /* opposite quadrant: they are identical*/
0123       return DetId(EEDetId(101 - myId.ix(), 101 - myId.iy(), tozside, EEDetId::XYMODE));
0124       break;
0125     case 3:
0126       /* adjacent tower: they are symetric*/
0127       return DetId(EEDetId(myId.ix(), 101 - myId.iy(), tozside, EEDetId::XYMODE));
0128       break;
0129     default:
0130       /*should never be reached*/
0131       edm::LogError("EcalTrigTowerConstituentsMapError") << "This should never be reached. Profound error!";
0132   }
0133   return EEDetId(0);
0134 }
0135 
0136 int EcalTrigTowerConstituentsMap::changeTowerQuadrant(int phiTower, int fromQuadrant, int toQuadrant) const {
0137   int newPhiTower = phiTower;
0138   int dQuadrant = toQuadrant - fromQuadrant;
0139 
0140   switch (dQuadrant % 4) {
0141     case 0:
0142       newPhiTower = phiTower;
0143       break;
0144     case 1:
0145       /* adjacent tower: they are symetric*/
0146       newPhiTower = EcalTrigTowerDetId::kEETowersInPhiPerQuadrant * 2 - phiTower + 1;
0147       break;
0148     case 2:
0149       /* opposite quadrant: they are identical*/
0150       newPhiTower = phiTower + EcalTrigTowerDetId::kEETowersInPhiPerQuadrant * 2;
0151       break;
0152     case 3:
0153       /* adjacent tower: they are symetric*/
0154       newPhiTower = EcalTrigTowerDetId::kEETowersInPhiPerQuadrant * 4 - phiTower + 1;
0155       break;
0156     default:
0157       /*should never be reached*/
0158       edm::LogError("EcalTrigTowerConstituentsMapError") << "This should never be reached. Profound error!";
0159   }
0160   return newPhiTower;
0161 }
0162 
0163 void EcalTrigTowerConstituentsMap::assign(const DetId& cell, const EcalTrigTowerDetId& tower) {
0164   if (m_items.find(cell) != m_items.end()) {
0165     throw cms::Exception("EcalTrigTowers")
0166         << "Cell with id " << std::hex << cell.rawId() << std::dec << " is already mapped to a EcalTrigTower "
0167         << m_items.find(cell)->tower << std::endl;
0168   }
0169 
0170   m_items.insert(MapItem(cell, tower));
0171 }
0172 
0173 std::vector<DetId> EcalTrigTowerConstituentsMap::constituentsOf(const EcalTrigTowerDetId& id) const {
0174   std::vector<DetId> items;
0175 
0176   if (id.det() == DetId::Ecal && id.subdetId() == EcalTriggerTower && id.subDet() == EcalBarrel) {
0177     //--------------------
0178     // Ecal Barrel
0179     //--------------------
0180     // trigger towers are 5x5 crystals in the barrel
0181     int etaxtalMin = (id.ietaAbs() - 1) * 5 + 1;
0182     int phixtalMin = ((id.iphi() - 1) * 5 + 11) % 360;
0183     if (phixtalMin <= 0)
0184       phixtalMin += 360;
0185     int etaxtalMax = id.ietaAbs() * 5;
0186     int phixtalMax = ((id.iphi()) * 5 + 10) % 360;
0187     if (phixtalMax <= 0)
0188       phixtalMax += 360;
0189     for (int e = etaxtalMin; e <= etaxtalMax; e++)
0190       for (int p = phixtalMin; p <= phixtalMax; p++)
0191         items.emplace_back(DetId(EBDetId(id.zside() * e, p, EBDetId::ETAPHIMODE)));
0192   } else if (id.det() == DetId::Ecal && id.subdetId() == EcalTriggerTower && id.subDet() == EcalEndcap) {
0193     //--------------------
0194     // Ecal Endcap
0195     //--------------------
0196     //DetId myId=wrapEcalTrigTowerDetId(id);
0197     EcalTowerMap_by_towerDetId::const_iterator lb, ub;
0198     //boost::tuples::tie(lb,ub)=get<1>(m_items).equal_range(myId);
0199     boost::tuples::tie(lb, ub) = boost::get<1>(m_items).equal_range(id);
0200     while (lb != ub) {
0201       //EEDetId mappedId((*lb).cell);
0202       //items.emplace_back(changeEEDetIdQuadrantAndZ(mappedId,id.iquadrant(),id.zside()));
0203       items.emplace_back((*lb).cell);
0204       ++lb;
0205     }
0206   }
0207 
0208   return items;
0209 }