File indexing completed on 2023-10-25 09:49:13
0001 #ifndef EcalEndcapGeometry_h
0002 #define EcalEndcapGeometry_h
0003
0004 #include "Geometry/CaloGeometry/interface/EZArrayFL.h"
0005 #include "DataFormats/EcalDetId/interface/EEDetId.h"
0006 #include "DataFormats/EcalDetId/interface/EBDetId.h"
0007 #include "Geometry/Records/interface/IdealGeometryRecord.h"
0008 #include "Geometry/Records/interface/EcalEndcapGeometryRecord.h"
0009 #include "CondFormats/AlignmentRecord/interface/EEAlignmentRcd.h"
0010 #include "Geometry/EcalCommonData/interface/EcalEndcapNumberingScheme.h"
0011 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
0012 #include "Geometry/Records/interface/PEcalEndcapRcd.h"
0013 #include "FWCore/Utilities/interface/thread_safety_macros.h"
0014 #include <vector>
0015 #include <map>
0016 #include <atomic>
0017
0018 class TruncatedPyramid;
0019
0020 class EcalEndcapGeometry final : public CaloSubdetectorGeometry {
0021 public:
0022 typedef std::vector<TruncatedPyramid> CellVec;
0023
0024 typedef CaloCellGeometry::CCGFloat CCGFloat;
0025 typedef CaloCellGeometry::Pt3D Pt3D;
0026 typedef CaloCellGeometry::Pt3DVec Pt3DVec;
0027
0028 typedef IdealGeometryRecord IdealRecord;
0029 typedef EcalEndcapGeometryRecord AlignedRecord;
0030 typedef EEAlignmentRcd AlignmentRecord;
0031 typedef PEcalEndcapRcd PGeometryRecord;
0032
0033 typedef EZArrayFL<EBDetId> OrderedListOfEBDetId;
0034
0035 typedef std::vector<OrderedListOfEBDetId*> VecOrdListEBDetIdPtr;
0036
0037 typedef EcalEndcapNumberingScheme NumberingScheme;
0038
0039 typedef EEDetId DetIdType;
0040
0041 enum { k_NumberOfCellsForCorners = EEDetId::kSizeForDenseIndexing };
0042
0043 enum { k_NumberOfShapes = 1 };
0044
0045 enum { k_NumberOfParametersPerShape = 11 };
0046
0047 static std::string dbString() { return "PEcalEndcapRcd"; }
0048
0049 unsigned int numberOfShapes() const override { return k_NumberOfShapes; }
0050 unsigned int numberOfParametersPerShape() const override { return k_NumberOfParametersPerShape; }
0051
0052 EcalEndcapGeometry();
0053
0054 ~EcalEndcapGeometry() override;
0055
0056 int getNumberOfModules() const { return _nnmods; }
0057
0058 int getNumberOfCrystalPerModule() const { return _nncrys; }
0059
0060 void setNumberOfModules(const int nnmods) { _nnmods = nnmods; }
0061
0062 void setNumberOfCrystalPerModule(const int nncrys) { _nncrys = nncrys; }
0063
0064 const OrderedListOfEBDetId* getClosestBarrelCells(EEDetId id) const;
0065
0066
0067 DetId getClosestCell(const GlobalPoint& r) const override;
0068
0069 CaloSubdetectorGeometry::DetIdSet getCells(const GlobalPoint& r, double dR) const override;
0070
0071 void initializeParms() override;
0072
0073 CCGFloat avgAbsZFrontFaceCenter() const;
0074
0075 static std::string hitString() { return "EcalHitsEE"; }
0076
0077 static std::string producerTag() { return "EcalEndcap"; }
0078
0079 static unsigned int numberOfAlignments() { return 4; }
0080
0081 static unsigned int alignmentTransformIndexLocal(const DetId& id);
0082
0083 static unsigned int alignmentTransformIndexGlobal(const DetId& id);
0084
0085 static DetId detIdFromLocalAlignmentIndex(unsigned int iLoc);
0086
0087 static void localCorners(Pt3DVec& lc, const CCGFloat* pv, unsigned int i, Pt3D& ref);
0088
0089 void newCell(const GlobalPoint& f1,
0090 const GlobalPoint& f2,
0091 const GlobalPoint& f3,
0092 const CCGFloat* parm,
0093 const DetId& detId) override;
0094
0095 bool present(const DetId& id) const override;
0096
0097 protected:
0098
0099 const CaloCellGeometry* getGeometryRawPtr(uint32_t index) const override;
0100
0101 private:
0102 static int myPhi(int i) {
0103 i += 720;
0104 return (1 + (i - 1) % 360);
0105 }
0106
0107
0108 int _nnmods;
0109
0110
0111 int _nncrys;
0112
0113 CCGFloat zeP, zeN;
0114
0115 CCGFloat m_wref, m_xlo[2], m_xhi[2], m_ylo[2], m_yhi[2], m_xoff[2], m_yoff[2], m_del;
0116
0117 unsigned int m_nref;
0118
0119 unsigned int xindex(CCGFloat x, CCGFloat z) const;
0120 unsigned int yindex(CCGFloat y, CCGFloat z) const;
0121
0122 EEDetId gId(float x, float y, float z) const;
0123
0124 mutable std::atomic<EZMgrFL<EBDetId>*> m_borderMgr;
0125
0126 mutable std::atomic<VecOrdListEBDetIdPtr*> m_borderPtrVec;
0127
0128 CMS_THREAD_GUARD(m_check) mutable CCGFloat m_avgZ;
0129 mutable std::atomic<bool> m_check;
0130
0131 CellVec m_cellVec;
0132 };
0133
0134 #endif