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
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
0025
0026 EBDetId myId(id);
0027 return myId.tower();
0028 } else if (id.det() == DetId::Ecal && id.subdetId() == EcalEndcap) {
0029
0030
0031
0032 EEDetId originalId(id);
0033
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
0040
0041
0042
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
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
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
0119 return DetId(EEDetId(101 - myId.ix(), myId.iy(), tozside, EEDetId::XYMODE));
0120 break;
0121 case 2:
0122
0123 return DetId(EEDetId(101 - myId.ix(), 101 - myId.iy(), tozside, EEDetId::XYMODE));
0124 break;
0125 case 3:
0126
0127 return DetId(EEDetId(myId.ix(), 101 - myId.iy(), tozside, EEDetId::XYMODE));
0128 break;
0129 default:
0130
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
0146 newPhiTower = EcalTrigTowerDetId::kEETowersInPhiPerQuadrant * 2 - phiTower + 1;
0147 break;
0148 case 2:
0149
0150 newPhiTower = phiTower + EcalTrigTowerDetId::kEETowersInPhiPerQuadrant * 2;
0151 break;
0152 case 3:
0153
0154 newPhiTower = EcalTrigTowerDetId::kEETowersInPhiPerQuadrant * 4 - phiTower + 1;
0155 break;
0156 default:
0157
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
0179
0180
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
0195
0196
0197 EcalTowerMap_by_towerDetId::const_iterator lb, ub;
0198
0199 boost::tuples::tie(lb, ub) = boost::get<1>(m_items).equal_range(id);
0200 while (lb != ub) {
0201
0202
0203 items.emplace_back((*lb).cell);
0204 ++lb;
0205 }
0206 }
0207
0208 return items;
0209 }