File indexing completed on 2024-04-06 12:14:39
0001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0002 #include "Geometry/CaloGeometry/interface/CaloGenericDetId.h"
0003 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
0004 #include "Geometry/ForwardGeometry/interface/ZdcGeometry.h"
0005 #include "Geometry/ForwardGeometry/interface/IdealZDCTrapezoid.h"
0006 #include "Geometry/ForwardGeometry/interface/ZdcHardcodeGeometryData.h"
0007 #include <algorithm>
0008
0009 #include <Math/Transform3D.h>
0010 #include <Math/EulerAngles.h>
0011
0012 #include <algorithm>
0013
0014 typedef CaloCellGeometry::Pt3D Pt3D;
0015 typedef CaloCellGeometry::Pt3DVec Pt3DVec;
0016 typedef CaloCellGeometry::Tr3D Tr3D;
0017
0018 typedef CaloSubdetectorGeometry::CCGFloat CCGFloat;
0019
0020
0021
0022 ZdcGeometry::ZdcGeometry()
0023 : theTopology(new ZdcTopology),
0024 lastReqDet_(DetId::Detector(0)),
0025 lastReqSubdet_(0),
0026 m_ownsTopology(true),
0027 m_cellVec(k_NumberOfCellsForCorners) {}
0028
0029 ZdcGeometry::ZdcGeometry(const ZdcTopology* topology)
0030 : theTopology(topology),
0031 lastReqDet_(DetId::Detector(0)),
0032 lastReqSubdet_(0),
0033 m_ownsTopology(false),
0034 m_cellVec(k_NumberOfCellsForCorners) {}
0035
0036 ZdcGeometry::~ZdcGeometry() {
0037 if (m_ownsTopology)
0038 delete theTopology;
0039 }
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 unsigned int ZdcGeometry::alignmentTransformIndexLocal(const DetId& id) {
0060 const CaloGenericDetId gid(id);
0061 assert(gid.isZDC());
0062
0063 return (0 > HcalZDCDetId(id).zside() ? 0 : 1);
0064 }
0065
0066 unsigned int ZdcGeometry::alignmentTransformIndexGlobal(const DetId& ) { return (unsigned int)DetId::Calo - 1; }
0067
0068 void ZdcGeometry::localCorners(Pt3DVec& lc, const CCGFloat* pv, unsigned int , Pt3D& ref) {
0069 IdealZDCTrapezoid::localCorners(lc, pv, ref);
0070 }
0071
0072 void ZdcGeometry::newCell(const GlobalPoint& f1,
0073 const GlobalPoint& ,
0074 const GlobalPoint& ,
0075 const CCGFloat* parm,
0076 const DetId& detId) {
0077 const CaloGenericDetId cgid(detId);
0078 #ifdef EDM_ML_DEBUG
0079 edm::LogVerbatim("ZDCGeom") << "ZDCGeometry " << HcalZDCDetId(detId) << " Generic ID " << std::hex << cgid.rawId()
0080 << std::dec << " ZDC? " << cgid.isZDC();
0081 #endif
0082 assert(cgid.isZDC());
0083
0084 const unsigned int di(cgid.denseIndex());
0085
0086 m_cellVec[di] = IdealZDCTrapezoid(f1, cornersMgr(), parm);
0087 addValidID(detId);
0088 }
0089
0090 const CaloCellGeometry* ZdcGeometry::getGeometryRawPtr(uint32_t index) const {
0091
0092 if (m_cellVec.size() < index)
0093 return nullptr;
0094 const CaloCellGeometry* cell(&m_cellVec[index]);
0095 return (((cell == nullptr) || (nullptr == cell->param())) ? nullptr : cell);
0096 }
0097
0098 void ZdcGeometry::getSummary(CaloSubdetectorGeometry::TrVec& tVec,
0099 CaloSubdetectorGeometry::IVec& iVec,
0100 CaloSubdetectorGeometry::DimVec& dVec,
0101 CaloSubdetectorGeometry::IVec& ) const {
0102 tVec.reserve(m_validIds.size() * numberOfTransformParms());
0103 iVec.reserve(numberOfShapes() == 1 ? 1 : m_validIds.size());
0104 dVec.reserve(numberOfShapes() * numberOfParametersPerShape());
0105
0106 for (const auto& pv : parVecVec()) {
0107 for (float iv : pv) {
0108 dVec.emplace_back(iv);
0109 }
0110 }
0111
0112 for (uint32_t i(0); i != m_validIds.size(); ++i) {
0113 Tr3D tr;
0114 std::shared_ptr<const CaloCellGeometry> ptr(cellGeomPtr(i));
0115 #ifdef EDM_ML_DEBUG
0116 edm::LogVerbatim("ZDCGeom") << "ZDCGeometry:Summary " << i << ":" << HcalZDCDetId::kSizeForDenseIndexingRun1
0117 << " Pointer " << ptr << ":" << (nullptr != ptr);
0118 #endif
0119 if (i < static_cast<int32_t>(HcalZDCDetId::kSizeForDenseIndexingRun1))
0120 assert(nullptr != ptr);
0121 if (ptr != nullptr) {
0122 ptr->getTransform(tr, (Pt3DVec*)nullptr);
0123
0124 if (Tr3D() == tr) {
0125 const GlobalPoint& gp(ptr->getPosition());
0126 tr = HepGeom::Translate3D(gp.x(), gp.y(), gp.z());
0127 }
0128
0129 const CLHEP::Hep3Vector tt(tr.getTranslation());
0130 tVec.emplace_back(tt.x());
0131 tVec.emplace_back(tt.y());
0132 tVec.emplace_back(tt.z());
0133 if (6 == numberOfTransformParms()) {
0134 const CLHEP::HepRotation rr(tr.getRotation());
0135 const ROOT::Math::Transform3D rtr(
0136 rr.xx(), rr.xy(), rr.xz(), tt.x(), rr.yx(), rr.yy(), rr.yz(), tt.y(), rr.zx(), rr.zy(), rr.zz(), tt.z());
0137 ROOT::Math::EulerAngles ea;
0138 rtr.GetRotation(ea);
0139 tVec.emplace_back(ea.Phi());
0140 tVec.emplace_back(ea.Theta());
0141 tVec.emplace_back(ea.Psi());
0142 }
0143
0144 const CCGFloat* par(ptr->param());
0145
0146 unsigned int ishape(9999);
0147 for (unsigned int ivv(0); ivv != parVecVec().size(); ++ivv) {
0148 bool ok(true);
0149 const CCGFloat* pv(&(*parVecVec()[ivv].begin()));
0150 for (unsigned int k(0); k != numberOfParametersPerShape(); ++k) {
0151 ok = ok && (fabs(par[k] - pv[k]) < 1.e-6);
0152 }
0153 if (ok) {
0154 ishape = ivv;
0155 break;
0156 }
0157 }
0158 assert(9999 != ishape);
0159
0160 const unsigned int nn((numberOfShapes() == 1) ? (unsigned int)1 : m_validIds.size());
0161 if (iVec.size() < nn)
0162 iVec.emplace_back(ishape);
0163 }
0164 }
0165 }