File indexing completed on 2023-03-17 13:02:33
0001 #include "DataFormats/ForwardDetId/interface/HGCalDetId.h"
0002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0003 #include "Geometry/CaloTopology/interface/HGCalTBTopology.h"
0004 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
0005
0006
0007
0008 HGCalTBTopology::HGCalTBTopology(const HGCalTBDDDConstants* hdcons, int det) : hdcons_(hdcons) {
0009 sectors_ = hdcons_->sectors();
0010 layers_ = hdcons_->layers(true);
0011 cells_ = hdcons_->maxCells(true);
0012 mode_ = hdcons_->geomMode();
0013 kHGhalf_ = sectors_ * layers_ * cells_;
0014 firstLay_ = hdcons_->firstLayer();
0015 det_ = DetId::Forward;
0016 subdet_ = static_cast<ForwardSubdetector>(det);
0017 kHGeomHalf_ = sectors_ * layers_;
0018 types_ = 2;
0019 kHGhalfType_ = sectors_ * layers_ * cells_ * types_;
0020 kSizeForDenseIndexing = static_cast<unsigned int>(2 * kHGhalf_);
0021 #ifdef EDM_ML_DEBUG
0022 edm::LogVerbatim("HGCalGeom") << "HGCalTBTopology initialized for detector " << det << ":" << det_ << ":" << subdet_
0023 << " having " << sectors_ << " Sectors, " << layers_ << " Layers from " << firstLay_
0024 << ", " << cells_ << " cells and total channels " << kSizeForDenseIndexing << ":"
0025 << (2 * kHGeomHalf_);
0026 #endif
0027 }
0028
0029 HGCalTBTopology::~HGCalTBTopology() {}
0030
0031 std::vector<DetId> HGCalTBTopology::neighbors(DetId idin) const {
0032 std::vector<DetId> ids = north(idin);
0033 for (const auto& id : south(idin))
0034 ids.emplace_back(id);
0035 for (const auto& id : east(idin))
0036 ids.emplace_back(id);
0037 for (const auto& id : west(idin))
0038 ids.emplace_back(id);
0039 return ids;
0040 }
0041
0042 unsigned int HGCalTBTopology::allGeomModules() const { return (static_cast<unsigned int>(2 * hdcons_->wafers())); }
0043
0044 DetId HGCalTBTopology::denseId2detId(uint32_t hi) const {
0045 HGCalTBTopology::DecodedDetId id;
0046 if (validHashIndex(hi)) {
0047 id.zSide = ((int)(hi) < kHGhalfType_ ? -1 : 1);
0048 int di = ((int)(hi) % kHGhalfType_);
0049 int type = (di % types_);
0050 id.iType = (type == 0 ? -1 : 1);
0051 id.iSec1 = (((di - type) / types_) % sectors_);
0052 id.iLay = (((((di - type) / types_) - id.iSec1 + 1) / sectors_) % layers_ + 1);
0053 id.iCell1 = (((((di - type) / types_) - id.iSec1 + 1) / sectors_ - id.iLay + 1) / layers_ + 1);
0054 #ifdef EDM_ML_DEBUG
0055 edm::LogVerbatim("HGCalGeom") << "Input Hex " << hi << " o/p " << id.zSide << ":" << id.iLay << ":" << id.iType
0056 << ":" << id.iSec1 << ":" << id.iCell1;
0057 #endif
0058 }
0059 return encode(id);
0060 }
0061
0062 uint32_t HGCalTBTopology::detId2denseId(const DetId& idin) const {
0063 HGCalTBTopology::DecodedDetId id = decode(idin);
0064 int type = (id.iType > 0) ? 1 : 0;
0065 uint32_t idx =
0066 static_cast<uint32_t>(((id.zSide > 0) ? kHGhalfType_ : 0) +
0067 ((((id.iCell1 - 1) * layers_ + id.iLay - 1) * sectors_ + id.iSec1) * types_ + type));
0068 #ifdef EDM_ML_DEBUG
0069 edm::LogVerbatim("HGCalGeom") << "Input Hex " << id.zSide << ":" << id.iLay << ":" << id.iSec1 << ":" << id.iCell1
0070 << ":" << id.iType << " Constants " << kHGeomHalf_ << ":" << layers_ << ":" << sectors_
0071 << ":" << types_ << " o/p " << idx;
0072 #endif
0073 return idx;
0074 }
0075
0076 uint32_t HGCalTBTopology::detId2denseGeomId(const DetId& idin) const {
0077 HGCalTBTopology::DecodedDetId id = decode(idin);
0078 uint32_t idx;
0079 idx = (uint32_t)(((id.zSide > 0) ? kHGeomHalf_ : 0) + (id.iLay - 1) * sectors_ + id.iSec1);
0080 #ifdef EDM_ML_DEBUG
0081 edm::LogVerbatim("HGCalGeom") << "Geom Hex I/P " << id.zSide << ":" << id.iLay << ":" << id.iSec1 << ":" << id.iType
0082 << " Constants " << kHGeomHalf_ << ":" << layers_ << ":" << sectors_ << " o/p " << idx;
0083 #endif
0084 return idx;
0085 }
0086
0087 bool HGCalTBTopology::valid(const DetId& idin) const {
0088 HGCalTBTopology::DecodedDetId id = decode(idin);
0089 bool flag;
0090 flag = (idin.det() == det_ && idin.subdetId() == (int)(subdet_) && id.iCell1 >= 0 && id.iCell1 < cells_ &&
0091 id.iLay > 0 && id.iLay <= layers_ && id.iSec1 >= 0 && id.iSec1 <= sectors_);
0092 if (flag)
0093 flag = hdcons_->isValidHex(id.iLay, id.iSec1, id.iCell1, true);
0094 return flag;
0095 }
0096
0097 DetId HGCalTBTopology::offsetBy(const DetId startId, int nrStepsX, int nrStepsY) const {
0098 if (startId.det() == DetId::Forward && startId.subdetId() == static_cast<int>(subdet_)) {
0099 DetId id = changeXY(startId, nrStepsX, nrStepsY);
0100 if (valid(id))
0101 return id;
0102 }
0103 return DetId(0);
0104 }
0105
0106 DetId HGCalTBTopology::switchZSide(const DetId startId) const {
0107 HGCalTBTopology::DecodedDetId id_ = decode(startId);
0108 id_.zSide = -id_.zSide;
0109 DetId id = encode(id_);
0110 if (valid(id))
0111 return id;
0112 else
0113 return DetId(0);
0114 }
0115
0116 HGCalTBTopology::DecodedDetId HGCalTBTopology::geomDenseId2decId(const uint32_t& hi) const {
0117 HGCalTBTopology::DecodedDetId id;
0118 if (hi < totalGeomModules()) {
0119 id.zSide = ((int)(hi) < kHGeomHalf_ ? -1 : 1);
0120 int di = ((int)(hi) % kHGeomHalf_);
0121 id.iSec1 = (di % sectors_);
0122 di = (di - id.iSec1) / sectors_;
0123 id.iLay = (di % layers_) + 1;
0124 id.iType = ((di - id.iLay + 1) / layers_ == 0) ? -1 : 1;
0125 #ifdef EDM_ML_DEBUG
0126 edm::LogVerbatim("HGCalGeom") << "Geom Hex I/P " << hi << " O/P " << id.zSide << ":" << id.iType << ":" << id.iLay
0127 << ":" << id.iSec1;
0128 #endif
0129 }
0130 return id;
0131 }
0132
0133 HGCalTBTopology::DecodedDetId HGCalTBTopology::decode(const DetId& startId) const {
0134 HGCalTBTopology::DecodedDetId idx;
0135 HGCalDetId id(startId);
0136 idx.iCell1 = id.cell();
0137 idx.iCell2 = 0;
0138 idx.iLay = id.layer();
0139 idx.iSec1 = id.wafer();
0140 idx.iSec2 = 0;
0141 idx.iType = id.waferType();
0142 idx.zSide = id.zside();
0143 idx.det = id.subdetId();
0144 return idx;
0145 }
0146
0147 DetId HGCalTBTopology::encode(const HGCalTBTopology::DecodedDetId& idx) const {
0148 DetId id;
0149 #ifdef EDM_ML_DEBUG
0150 edm::LogVerbatim("HGCalGeomX") << "Encode " << idx.det << ":" << idx.zSide << ":" << idx.iType << ":" << idx.iLay
0151 << ":" << idx.iSec1 << ":" << idx.iSec2 << ":" << idx.iCell1 << ":" << idx.iCell2;
0152 #endif
0153 id = HGCalDetId((ForwardSubdetector)(idx.det), idx.zSide, idx.iLay, ((idx.iType > 0) ? 1 : 0), idx.iSec1, idx.iCell1)
0154 .rawId();
0155 return id;
0156 }
0157
0158 DetId HGCalTBTopology::changeXY(const DetId& id, int nrStepsX, int nrStepsY) const { return DetId(); }
0159
0160 DetId HGCalTBTopology::changeZ(const DetId& id, int nrStepsZ) const { return DetId(); }
0161
0162 #include "FWCore/Utilities/interface/typelookup.h"
0163
0164 TYPELOOKUP_DATA_REG(HGCalTBTopology);