Back to home page

Project CMSSW displayed by LXR

 
 

    


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

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 //#define EDM_ML_DEBUG
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);