File indexing completed on 2024-04-06 12:14:16
0001 #ifndef GEOMETRY_CALOGEOMETRY_CALOSUBDETECTORGEOMETRY_H
0002 #define GEOMETRY_CALOGEOMETRY_CALOSUBDETECTORGEOMETRY_H 1
0003
0004 #include <algorithm>
0005 #include <memory>
0006 #include <vector>
0007 #include <set>
0008 #if !defined(__CINT__) && !defined(__MAKECINT__) && !defined(__REFLEX__)
0009 #include <atomic>
0010 #endif
0011 #include "DataFormats/DetId/interface/DetId.h"
0012 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
0013 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
0014 #include "DataFormats/Math/interface/deltaR.h"
0015
0016
0017
0018
0019
0020
0021
0022
0023 class CaloSubdetectorGeometry {
0024 public:
0025 typedef std::vector<std::shared_ptr<const CaloCellGeometry> > CellSet;
0026 typedef CaloCellGeometry::CCGFloat CCGFloat;
0027
0028 typedef std::set<DetId> DetIdSet;
0029
0030 typedef CaloCellGeometry::ParMgr ParMgr;
0031 typedef CaloCellGeometry::ParVec ParVec;
0032 typedef CaloCellGeometry::ParVecVec ParVecVec;
0033
0034 typedef std::vector<CCGFloat> TrVec;
0035 typedef std::vector<unsigned int> IVec;
0036 typedef std::vector<CCGFloat> DimVec;
0037
0038 CaloSubdetectorGeometry();
0039
0040
0041 virtual ~CaloSubdetectorGeometry();
0042
0043
0044 CaloSubdetectorGeometry(const CaloSubdetectorGeometry&) = delete;
0045 CaloSubdetectorGeometry& operator=(const CaloSubdetectorGeometry&) = delete;
0046
0047 virtual void newCell(const GlobalPoint& f1,
0048 const GlobalPoint& f2,
0049 const GlobalPoint& f3,
0050 const CCGFloat* parm,
0051 const DetId& detId) = 0;
0052
0053
0054 virtual bool present(const DetId& id) const;
0055
0056
0057 virtual std::shared_ptr<const CaloCellGeometry> getGeometry(const DetId& id) const;
0058
0059
0060
0061
0062
0063 virtual const std::vector<DetId>& getValidDetIds(DetId::Detector det = DetId::Detector(0), int subdet = 0) const;
0064
0065
0066 virtual DetId getClosestCell(const GlobalPoint& r) const;
0067
0068
0069
0070
0071
0072
0073
0074 virtual DetIdSet getCells(const GlobalPoint& r, double dR) const;
0075 virtual CellSet getCellSet(const GlobalPoint& r, double dR) const;
0076
0077 CCGFloat deltaPhi(const DetId& detId) const;
0078
0079 CCGFloat deltaEta(const DetId& detId) const;
0080
0081 void allocateCorners(CaloCellGeometry::CornersVec::size_type n);
0082
0083 CaloCellGeometry::CornersMgr* cornersMgr() { return m_cmgr; }
0084
0085 void allocatePar(ParVec::size_type n, unsigned int m);
0086
0087 ParMgr* parMgr() { return m_parMgr; }
0088 const ParMgr* parMgrConst() const { return m_parMgr; }
0089
0090 ParVecVec& parVecVec() { return m_parVecVec; }
0091 const ParVecVec& parVecVec() const { return m_parVecVec; }
0092
0093 virtual unsigned int numberOfShapes() const { return 1; }
0094 virtual unsigned int numberOfParametersPerShape() const { return 1; }
0095 virtual unsigned int numberOfTransformParms() const { return 6; }
0096
0097 virtual void fillDefaultNamedParameters() const { return; }
0098
0099 virtual void getSummary(TrVec& trVector, IVec& iVector, DimVec& dimVector, IVec& dinsVector) const;
0100
0101 virtual void initializeParms() { return; }
0102
0103 virtual bool valid(const DetId& id) const {
0104 return (std::find(m_validIds.begin(), m_validIds.end(), id) != m_validIds.end());
0105 }
0106
0107 protected:
0108 virtual unsigned int indexFor(const DetId& id) const;
0109 virtual unsigned int sizeForDenseIndex(const DetId& id) const;
0110
0111 virtual const CaloCellGeometry* getGeometryRawPtr(uint32_t index) const = 0;
0112 virtual std::shared_ptr<const CaloCellGeometry> cellGeomPtr(uint32_t index) const;
0113
0114 ParVecVec m_parVecVec;
0115
0116 static CCGFloat deltaR(const GlobalPoint& p1, const GlobalPoint& p2) { return reco::deltaR(p1, p2); }
0117
0118 void addValidID(const DetId& id);
0119
0120 std::vector<DetId> m_validIds;
0121
0122 private:
0123 ParMgr* m_parMgr;
0124
0125 CaloCellGeometry::CornersMgr* m_cmgr;
0126
0127 bool m_sortedIds;
0128
0129 #if !defined(__CINT__) && !defined(__MAKECINT__) && !defined(__REFLEX__)
0130 mutable std::atomic<std::vector<CCGFloat>*> m_deltaPhi;
0131 mutable std::atomic<std::vector<CCGFloat>*> m_deltaEta;
0132 #else
0133 mutable std::vector<CCGFloat>* m_deltaPhi;
0134 mutable std::vector<CCGFloat>* m_deltaEta;
0135 #endif
0136 };
0137
0138 #endif