File indexing completed on 2024-04-06 12:29:41
0001 #include "SimDataFormats/CaloTest/interface/HGCalTestNumbering.h"
0002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0003 #include <iostream>
0004
0005 uint32_t HGCalTestNumbering::packSquareIndex(int zp, int lay, int sec, int subsec, int cell) {
0006 if (!HGCalTestNumbering::isValidSquare(zp, lay, sec, subsec, lay)) {
0007 zp = lay = sec = subsec = cell = 0;
0008 }
0009
0010 uint32_t rawid = 0;
0011 rawid |= ((cell & kHGCalCellSMask) << kHGCalCellSOffset);
0012 rawid |= ((sec & kHGCalSectorSMask) << kHGCalSectorSOffset);
0013 if (subsec < 0)
0014 subsec = 0;
0015 rawid |= ((subsec & kHGCalSubSectorSMask) << kHGCalSubSectorSOffset);
0016 rawid |= ((lay & kHGCalLayerSMask) << kHGCalLayerSOffset);
0017 if (zp > 0)
0018 rawid |= ((zp & kHGCalZsideSMask) << kHGCalZsideSOffset);
0019 return rawid;
0020 }
0021
0022 uint32_t HGCalTestNumbering::packHexagonIndex(int subdet, int zp, int lay, int wafer, int celltyp, int cell) {
0023 if (!HGCalTestNumbering::isValidHexagon(subdet, zp, lay, wafer, celltyp, cell)) {
0024 subdet = zp = lay = wafer = celltyp = cell = 0;
0025 }
0026
0027 uint32_t rawid = 0;
0028 rawid |= ((cell & kHGCalCellHMask) << kHGCalCellHOffset);
0029 rawid |= ((celltyp & kHGCalCellTypHMask) << kHGCalCellTypHOffset);
0030 rawid |= ((wafer & kHGCalWaferHMask) << kHGCalWaferHOffset);
0031 rawid |= ((lay & kHGCalLayerHMask) << kHGCalLayerHOffset);
0032 if (zp > 0)
0033 rawid |= ((zp & kHGCalZsideHMask) << kHGCalZsideHOffset);
0034 rawid |= ((subdet & kHGCalSubdetHMask) << kHGCalSubdetHOffset);
0035 return rawid;
0036 }
0037
0038 void HGCalTestNumbering::unpackSquareIndex(const uint32_t& idx, int& zp, int& lay, int& sec, int& subsec, int& cell) {
0039 cell = (idx >> kHGCalCellSOffset) & kHGCalCellSMask;
0040 subsec = ((idx >> kHGCalSubSectorSOffset) & kHGCalSubSectorSMask ? 1 : -1);
0041 sec = (idx >> kHGCalSectorSOffset) & kHGCalSectorSMask;
0042 lay = (idx >> kHGCalLayerSOffset) & kHGCalLayerSMask;
0043 zp = ((idx >> kHGCalZsideSOffset) & kHGCalZsideSMask ? 1 : -1);
0044 }
0045
0046 void HGCalTestNumbering::unpackHexagonIndex(
0047 const uint32_t& idx, int& subdet, int& zp, int& lay, int& wafer, int& celltyp, int& cell) {
0048 cell = (idx >> kHGCalCellHOffset) & kHGCalCellHMask;
0049 celltyp = (idx >> kHGCalCellTypHOffset) & kHGCalCellTypHMask;
0050 wafer = (idx >> kHGCalWaferHOffset) & kHGCalWaferHMask;
0051 lay = (idx >> kHGCalLayerHOffset) & kHGCalLayerHMask;
0052 zp = ((idx >> kHGCalZsideHOffset) & kHGCalZsideHMask ? 1 : -1);
0053 subdet = (idx >> kHGCalSubdetHOffset) & kHGCalSubdetHMask;
0054 }
0055
0056 bool HGCalTestNumbering::isValidSquare(int zp, int lay, int sec, int subsec, int cell) {
0057 if (cell > kHGCalCellSMask || sec > kHGCalSectorSMask || subsec > kHGCalSubSectorSMask || lay > kHGCalLayerSMask) {
0058 #ifdef EDM_ML_DEBUG
0059 std::cout << "[HGCalTestNumbering] request for new id for layer=" << lay << " zp=" << zp << " sector=" << sec
0060 << " subsec=" << subsec << " cell=" << cell << " has one or more fields out of bounds and will be reset"
0061 << std::endl;
0062 #endif
0063 return false;
0064 }
0065 return true;
0066 }
0067
0068 bool HGCalTestNumbering::isValidHexagon(int subdet, int zp, int lay, int wafer, int celltyp, int cell) {
0069 if (cell > kHGCalCellHMask || celltyp > kHGCalCellTypHMask || wafer > kHGCalWaferHMask || lay > kHGCalLayerSMask ||
0070 subdet > kHGCalSubdetHMask) {
0071 edm::LogWarning("HGCSim") << "[HGCalTestNumbering] request for new id for layer=" << lay << " zp=" << zp
0072 << " wafer=" << wafer << " celltyp=" << celltyp << " cell=" << cell
0073 << " for subdet=" << subdet
0074 << " has one or more fields out of bounds and will be reset *****";
0075 return false;
0076 }
0077 return true;
0078 }