Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-04-24 01:28:05

0001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0002 #include "Geometry/HGCalCommonData/interface/HGCalProperty.h"
0003 #include "Geometry/HGCalCommonData/interface/HGCalTileIndex.h"
0004 
0005 //#define EDM_ML_DEBUG
0006 
0007 int32_t HGCalTileIndex::tileIndex(int32_t layer, int32_t ring, int32_t phi) {
0008   int32_t id(0);
0009   id |= (((phi & HGCalProperty::kHGCalPhiMask) << HGCalProperty::kHGCalPhiOffset) |
0010          ((ring & HGCalProperty::kHGCalRingMask) << HGCalProperty::kHGCalRingOffset) |
0011          ((layer & HGCalProperty::kHGCalLayerMask) << HGCalProperty::kHGCalLayerOffset));
0012   return id;
0013 }
0014 
0015 int32_t HGCalTileIndex::tileLayer(int32_t id) {
0016   return ((id >> HGCalProperty::kHGCalLayerOffset) & HGCalProperty::kHGCalLayerMask);
0017 }
0018 
0019 int32_t HGCalTileIndex::tileRing(int32_t id) {
0020   return ((id >> HGCalProperty::kHGCalRingOffset) & HGCalProperty::kHGCalRingMask);
0021 }
0022 
0023 int32_t HGCalTileIndex::tilePhi(int32_t id) {
0024   return ((id >> HGCalProperty::kHGCalPhiOffset) & HGCalProperty::kHGCalPhiMask);
0025 }
0026 
0027 int32_t HGCalTileIndex::tileCassette(int32_t iphi, int32_t phiOffset, int32_t nphiCassette, int32_t cassettes) {
0028   int32_t cassette(0);
0029   if (nphiCassette > 1) {
0030     cassette = (iphi - phiOffset) / nphiCassette;
0031     if (cassette < 0)
0032       cassette += cassettes;
0033     else if (cassette >= cassettes)
0034       cassette = cassettes - 1;
0035   }
0036   return (cassette + 1);
0037 }
0038 
0039 int32_t HGCalTileIndex::tileProperty(int32_t type, int32_t sipm) {
0040   return (((type % HGCalProperty::kHGCalFactor) * HGCalProperty::kHGCalOffsetType) +
0041           ((sipm % HGCalProperty::kHGCalFactor) * HGCalProperty::kHGCalOffsetSiPM));
0042 }
0043 
0044 int32_t HGCalTileIndex::tileType(int32_t property) {
0045   return ((property / HGCalProperty::kHGCalOffsetType) % HGCalProperty::kHGCalFactor);
0046 }
0047 
0048 int32_t HGCalTileIndex::tileSiPM(int32_t property) {
0049   return ((property / HGCalProperty::kHGCalOffsetSiPM) % HGCalProperty::kHGCalFactor);
0050 }
0051 
0052 int32_t HGCalTileIndex::tilePack(int32_t ly, int32_t k1, int32_t k2) {
0053   return (
0054       ((ly % HGCalProperty::kHGCalTilePack) * HGCalProperty::kHGCalTilePack + (k1 % HGCalProperty::kHGCalTilePack)) *
0055           HGCalProperty::kHGCalTilePack +
0056       (k2 % HGCalProperty::kHGCalTilePack));
0057 }
0058 
0059 std::tuple<int32_t, int32_t, int32_t> HGCalTileIndex::tileUnpack(int32_t index) {
0060   int32_t ly =
0061       (index / (HGCalProperty::kHGCalTilePack * HGCalProperty::kHGCalTilePack)) % HGCalProperty::kHGCalTilePack;
0062   int32_t k1 = (index / HGCalProperty::kHGCalTilePack) % HGCalProperty::kHGCalTilePack;
0063   int32_t k2 = (index % HGCalProperty::kHGCalTilePack);
0064   return std::make_tuple(ly, k1, k2);
0065 }
0066 
0067 bool HGCalTileIndex::tileExist(const int32_t* hex, int32_t zside, int32_t iphi) {
0068   int32_t phi(iphi - 1);
0069   if (zside > 0) {
0070     phi += HGCalProperty::kHGCalTilePhisBy2;
0071     if (phi >= HGCalProperty::kHGCalTilePhis)
0072       phi -= HGCalProperty::kHGCalTilePhis;
0073   }
0074   int32_t jj = phi % HGCalProperty::kHGCalTilePhisBy3;
0075   int32_t iw = jj / HGCalProperty::kHGCalTilePhisWord;
0076   int32_t ibit = HGCalProperty::kHGCalTilePhisWord - (jj % HGCalProperty::kHGCalTilePhisWord) - 1;
0077   bool ok = (hex[iw] & (1 << ibit));
0078 #ifdef EDM_ML_DEBUG
0079   if (!ok)
0080     edm::LogWarning("HGCalGeom") << "tileExist::Phi " << iphi << " " << phi << " zside " << zside << " jj|iw|ibit "
0081                                  << jj << "|" << iw << "|" << ibit << " hex " << std::hex << hex[iw] << std::dec
0082                                  << " OK " << ok;
0083 #endif
0084   return ok;
0085 }
0086 
0087 bool HGCalTileIndex::tileFineExist(const int32_t* hex, int32_t zside, int32_t iphi) {
0088   int32_t phi(iphi - 1);
0089   if (zside > 0) {
0090     phi += HGCalProperty::kHGCalFineTilePhisBy2;
0091     if (phi >= HGCalProperty::kHGCalFineTilePhis)
0092       phi -= HGCalProperty::kHGCalFineTilePhis;
0093   }
0094   int32_t jj = phi % HGCalProperty::kHGCalFineTilePhisBy3;
0095   int32_t iw = jj / HGCalProperty::kHGCalTilePhisWord;
0096   int32_t ibit = HGCalProperty::kHGCalTilePhisWord - (jj % HGCalProperty::kHGCalTilePhisWord) - 1;
0097   bool ok = (hex[iw] & (1 << ibit));
0098 #ifdef EDM_ML_DEBUG
0099   if (!ok)
0100     edm::LogWarning("HGCalGeom") << "tileFineExist::Phi " << iphi << " " << phi << " zside " << zside << " jj|iw|ibit "
0101                                  << jj << ":" << iw << ":" << ibit << " hex " << std::hex << hex[iw] << ":"
0102                                  << (1 << ibit) << std::dec << " OK " << ok;
0103   else
0104     edm::LogVerbatim("HGCalGeom") << "tileFineExist::Phi " << iphi << " " << phi << " zside " << zside << " jj|iw|ibit "
0105                                   << jj << ":" << iw << ":" << ibit << " hex " << std::hex << hex[iw] << ":"
0106                                   << (1 << ibit) << std::dec << " OK " << ok;
0107 #endif
0108   return ok;
0109 }