Back to home page

Project CMSSW displayed by LXR

 
 

    


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

0001 #ifndef GEOMETRY_CALOTOPOLOGY_ECALBARRELTOPOLOGY_H
0002 #define GEOMETRY_CALOTOPOLOGY_ECALBARRELTOPOLOGY_H 1
0003 
0004 #include <utility>
0005 #include <vector>
0006 #include <iostream>
0007 #include "DataFormats/EcalDetId/interface/EBDetId.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "Geometry/CaloTopology/interface/CaloSubdetectorTopology.h"
0010 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
0011 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
0012 
0013 class EcalBarrelTopology final : public CaloSubdetectorTopology {
0014 public:
0015   /// create a new Topology
0016   EcalBarrelTopology() : theGeom_(nullptr){};
0017 
0018   /// virtual destructor
0019   ~EcalBarrelTopology() override {}
0020 
0021   /// create a new Topology from geometry
0022   EcalBarrelTopology(CaloGeometry const& theGeom) {
0023     theGeom_ = theGeom.getSubdetectorGeometry(DetId::Ecal, EcalBarrel);
0024   }
0025 
0026   /// move the Topology north (increment iphi)
0027   DetId goNorth(const DetId& id) const override { return incrementIphi(EBDetId(id)); }
0028   std::vector<DetId> north(const DetId& id) const override {
0029     EBDetId nextId = goNorth(id);
0030     std::vector<DetId> vNeighborsDetId;
0031     if (!(nextId == EBDetId(0)))
0032       vNeighborsDetId.emplace_back(DetId(nextId.rawId()));
0033     return vNeighborsDetId;
0034   }
0035 
0036   /// move the Topology south (decrement iphi)
0037   DetId goSouth(const DetId& id) const override { return decrementIphi(EBDetId(id)); }
0038   std::vector<DetId> south(const DetId& id) const override {
0039     EBDetId nextId = goSouth(id);
0040     std::vector<DetId> vNeighborsDetId;
0041     if (!(nextId == EBDetId(0)))
0042       vNeighborsDetId.emplace_back(DetId(nextId.rawId()));
0043     return vNeighborsDetId;
0044   }
0045 
0046   /// move the Topology east (negative ieta)
0047   DetId goEast(const DetId& id) const override { return decrementIeta(EBDetId(id)); }
0048   std::vector<DetId> east(const DetId& id) const override {
0049     EBDetId nextId = goEast(id);
0050     std::vector<DetId> vNeighborsDetId;
0051     if (!(nextId == EBDetId(0)))
0052       vNeighborsDetId.emplace_back(DetId(nextId.rawId()));
0053     return vNeighborsDetId;
0054   }
0055 
0056   /// move the Topology west (positive ieta)
0057   DetId goWest(const DetId& id) const override { return incrementIeta(EBDetId(id)); }
0058   std::vector<DetId> west(const DetId& id) const override {
0059     EBDetId nextId = goWest(id);
0060     std::vector<DetId> vNeighborsDetId;
0061     if (!(nextId == EBDetId(0)))
0062       vNeighborsDetId.emplace_back(DetId(nextId.rawId()));
0063     return vNeighborsDetId;
0064   }
0065 
0066   std::vector<DetId> up(const DetId& /*id*/) const override {
0067     edm::LogVerbatim("CaloTopology") << "EcalBarrelTopology::up() not yet implemented";
0068     std::vector<DetId> vNeighborsDetId;
0069     return vNeighborsDetId;
0070   }
0071 
0072   std::vector<DetId> down(const DetId& /*id*/) const override {
0073     edm::LogVerbatim("CaloTopology") << "EcalBarrelTopology::down() not yet implemented";
0074     std::vector<DetId> vNeighborsDetId;
0075     return vNeighborsDetId;
0076   }
0077 
0078 private:
0079   /// move the nagivator to larger ieta (more positive z) (stops at end of barrel and returns null)
0080   EBDetId incrementIeta(const EBDetId&) const;
0081 
0082   /// move the nagivator to smaller ieta (more negative z) (stops at end of barrel and returns null)
0083   EBDetId decrementIeta(const EBDetId&) const;
0084 
0085   /// move the nagivator to larger iphi (wraps around the barrel)
0086   EBDetId incrementIphi(const EBDetId&) const;
0087 
0088   /// move the nagivator to smaller iphi (wraps around the barrel)
0089   EBDetId decrementIphi(const EBDetId&) const;
0090 
0091   const CaloSubdetectorGeometry* theGeom_;
0092 };
0093 
0094 #endif