File indexing completed on 2024-12-20 03:13:47
0001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0002 #include "DataFormats/HcalDetId/interface/HcalZDCDetId.h"
0003 #include "Geometry/CaloEventSetup/interface/CaloGeometryDBEP.h"
0004 #include "Geometry/CaloEventSetup/interface/CaloGeometryDBReader.h"
0005 #include "Geometry/ForwardGeometry/interface/ZdcGeometry.h"
0006 #include "Geometry/ForwardGeometry/interface/CaloGeometryDBZdc.h"
0007 #include "Geometry/ForwardGeometry/interface/CastorGeometry.h"
0008
0009
0010
0011 template class CaloGeometryDBEP<CastorGeometry, CaloGeometryDBReader>;
0012
0013 typedef CaloGeometryDBEP<CastorGeometry, CaloGeometryDBReader> CastorGeometryFromDBEP;
0014
0015 DEFINE_FWK_EVENTSETUP_MODULE(CastorGeometryFromDBEP);
0016
0017 template <>
0018 CaloGeometryDBEP<ZdcGeometry, CaloGeometryDBReader>::PtrType
0019 CaloGeometryDBEP<ZdcGeometry, CaloGeometryDBReader>::produceAligned(const typename ZdcGeometry::AlignedRecord& iRecord) {
0020 const auto [alignPtr, globalPtr] = getAlignGlobal(iRecord);
0021
0022 TrVec tvec;
0023 DimVec dvec;
0024 IVec ivec;
0025 std::vector<uint32_t> dins;
0026
0027 const auto& pG = iRecord.get(geometryToken_);
0028
0029 tvec = pG.getTranslation();
0030 dvec = pG.getDimension();
0031 ivec = pG.getIndexes();
0032 dins = pG.getDenseIndices();
0033
0034 #ifdef EDM_ML_DEBUG
0035 edm::LogVerbatim("ZDCGeometry") << "ZDCGeometry sizes " << tvec.size() << ":" << dvec.size() << ":" << ivec.size()
0036 << ":" << dins.size();
0037 #endif
0038 const auto& zdcTopology = iRecord.get(additionalTokens_.topology);
0039
0040 assert(dvec.size() <= ZdcGeometry::k_NumberOfShapes * ZdcGeometry::k_NumberOfParametersPerShape);
0041 ZdcGeometry* zdcGeometry = new ZdcGeometry(&zdcTopology);
0042 PtrType ptr(zdcGeometry);
0043
0044 if (!dins.empty()) {
0045 const unsigned int nTrParm(tvec.size() / zdcTopology.kSizeForDenseIndexing());
0046
0047 assert(dvec.size() == ZdcGeometry::k_NumberOfShapes * ZdcGeometry::k_NumberOfParametersPerShape);
0048
0049 ptr->fillDefaultNamedParameters();
0050
0051 ptr->allocateCorners(zdcTopology.kSizeForDenseIndexing());
0052 ptr->allocatePar(zdcGeometry->numberOfShapes(), ZdcGeometry::k_NumberOfParametersPerShape);
0053 #ifdef EDM_ML_DEBUG
0054 edm::LogVerbatim("ZDCGeometry") << "ZDCGeometry:Allocate corners and Par";
0055 #endif
0056 for (unsigned int i(0); i < dins.size(); ++i) {
0057 const unsigned int nPerShape(ZdcGeometry::k_NumberOfParametersPerShape);
0058 DimVec dims;
0059 dims.reserve(nPerShape);
0060
0061 const unsigned int indx(ivec.size() == 1 ? 0 : i);
0062
0063 DimVec::const_iterator dsrc(dvec.begin() + ivec[indx] * nPerShape);
0064
0065 for (unsigned int j(0); j != nPerShape; ++j) {
0066 dims.emplace_back(*dsrc);
0067 ++dsrc;
0068 }
0069
0070 const CCGFloat* myParm(CaloCellGeometry::getParmPtr(dims, ptr->parMgr(), ptr->parVecVec()));
0071
0072 const DetId id(zdcTopology.denseId2detId(dins[i]));
0073
0074 const unsigned int iGlob(nullptr == globalPtr ? 0 : ZdcGeometry::alignmentTransformIndexGlobal(id));
0075
0076 assert(nullptr == globalPtr || iGlob < globalPtr->m_align.size());
0077
0078 const AlignTransform* gt(nullptr == globalPtr ? nullptr : &globalPtr->m_align[iGlob]);
0079
0080 assert(nullptr == gt || iGlob == ZdcGeometry::alignmentTransformIndexGlobal(DetId(gt->rawId())));
0081
0082 const unsigned int iLoc(nullptr == alignPtr ? 0 : ZdcGeometry::alignmentTransformIndexLocal(id));
0083
0084 assert(nullptr == alignPtr || iLoc < alignPtr->m_align.size());
0085
0086 const AlignTransform* at(nullptr == alignPtr ? nullptr : &alignPtr->m_align[iLoc]);
0087
0088 assert(nullptr == at || (ZdcGeometry::alignmentTransformIndexLocal(DetId(at->rawId())) == iLoc));
0089
0090 const CaloGenericDetId gId(id);
0091
0092 Pt3D lRef;
0093 Pt3DVec lc(8, Pt3D(0, 0, 0));
0094 zdcGeometry->localCorners(lc, &dims.front(), dins[i], lRef);
0095
0096 const Pt3D lBck(0.25 * (lc[4] + lc[5] + lc[6] + lc[7]));
0097 const Pt3D lCor(lc[0]);
0098
0099
0100 const unsigned int jj(i * nTrParm);
0101 Tr3D tr;
0102 const ROOT::Math::Translation3D tl(tvec[jj], tvec[jj + 1], tvec[jj + 2]);
0103 const ROOT::Math::EulerAngles ea(6 == nTrParm ? ROOT::Math::EulerAngles(tvec[jj + 3], tvec[jj + 4], tvec[jj + 5])
0104 : ROOT::Math::EulerAngles());
0105 const ROOT::Math::Transform3D rt(ea, tl);
0106 double xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz;
0107 rt.GetComponents(xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz);
0108 tr = Tr3D(CLHEP::HepRep3x3(xx, xy, xz, yx, yy, yz, zx, zy, zz), CLHEP::Hep3Vector(dx, dy, dz));
0109
0110
0111 const Tr3D atr(nullptr == at ? tr
0112 : (nullptr == gt ? at->transform() * tr : at->transform() * gt->transform() * tr));
0113
0114
0115 const Pt3D gRef(atr * lRef);
0116 const GlobalPoint fCtr(gRef.x(), gRef.y(), gRef.z());
0117 const Pt3D gBck(atr * lBck);
0118 const GlobalPoint fBck(gBck.x(), gBck.y(), gBck.z());
0119 const Pt3D gCor(atr * lCor);
0120 const GlobalPoint fCor(gCor.x(), gCor.y(), gCor.z());
0121
0122 assert(zdcTopology.detId2denseId(id) == dins[i]);
0123
0124 ptr->newCell(fCtr, fBck, fCor, myParm, id);
0125 #ifdef EDM_ML_DEBUG
0126 edm::LogVerbatim("ZDCGeometry") << "ZDCGeometry Insert cell " << i << ":" << HcalZDCDetId(id);
0127 #endif
0128 }
0129 } else {
0130 const unsigned int nTrParm(tvec.size() / HcalZDCDetId::kSizeForDenseIndexingRun1);
0131
0132 assert(dvec.size() == ZdcGeometry::k_NumberOfShapes * ZdcGeometry::k_NumberOfParametersPerShape);
0133
0134 ptr->fillDefaultNamedParameters();
0135 ptr->allocateCorners(HcalZDCDetId::kSizeForDenseIndexingRun1);
0136 ptr->allocatePar(zdcGeometry->numberOfShapes(), ZdcGeometry::k_NumberOfParametersPerShape);
0137 #ifdef EDM_ML_DEBUG
0138 edm::LogVerbatim("ZDCGeometry") << "ZDCGeometry:Allocate corners and Par";
0139 #endif
0140 for (unsigned int i(0); i != HcalZDCDetId::kSizeForDenseIndexingRun1; ++i) {
0141 const unsigned int nPerShape(ZdcGeometry::k_NumberOfParametersPerShape);
0142 DimVec dims;
0143 dims.reserve(nPerShape);
0144
0145 const unsigned int indx(ivec.size() == 1 ? 0 : i);
0146
0147 DimVec::const_iterator dsrc(dvec.begin() + ivec[indx] * nPerShape);
0148
0149 for (unsigned int j(0); j != nPerShape; ++j) {
0150 dims.emplace_back(*dsrc);
0151 ++dsrc;
0152 }
0153
0154 const CCGFloat* myParm(CaloCellGeometry::getParmPtr(dims, ptr->parMgr(), ptr->parVecVec()));
0155
0156 const DetId id(zdcTopology.denseId2detId(i));
0157
0158 const unsigned int iGlob(nullptr == globalPtr ? 0 : ZdcGeometry::alignmentTransformIndexGlobal(id));
0159
0160 assert(nullptr == globalPtr || iGlob < globalPtr->m_align.size());
0161
0162 const AlignTransform* gt(nullptr == globalPtr ? nullptr : &globalPtr->m_align[iGlob]);
0163
0164 assert(nullptr == gt || iGlob == ZdcGeometry::alignmentTransformIndexGlobal(DetId(gt->rawId())));
0165
0166 const unsigned int iLoc(nullptr == alignPtr ? 0 : ZdcGeometry::alignmentTransformIndexLocal(id));
0167
0168 assert(nullptr == alignPtr || iLoc < alignPtr->m_align.size());
0169
0170 const AlignTransform* at(nullptr == alignPtr ? nullptr : &alignPtr->m_align[iLoc]);
0171
0172 assert(nullptr == at || (ZdcGeometry::alignmentTransformIndexLocal(DetId(at->rawId())) == iLoc));
0173
0174 const CaloGenericDetId gId(id);
0175
0176 Pt3D lRef;
0177 Pt3DVec lc(8, Pt3D(0, 0, 0));
0178 zdcGeometry->localCorners(lc, &dims.front(), i, lRef);
0179 const Pt3D lBck(0.25 * (lc[4] + lc[5] + lc[6] + lc[7]));
0180 const Pt3D lCor(lc[0]);
0181
0182
0183 const unsigned int jj(i * nTrParm);
0184 Tr3D tr;
0185 const ROOT::Math::Translation3D tl(tvec[jj], tvec[jj + 1], tvec[jj + 2]);
0186 const ROOT::Math::EulerAngles ea(6 == nTrParm ? ROOT::Math::EulerAngles(tvec[jj + 3], tvec[jj + 4], tvec[jj + 5])
0187 : ROOT::Math::EulerAngles());
0188 const ROOT::Math::Transform3D rt(ea, tl);
0189 double xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz;
0190 rt.GetComponents(xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz);
0191 tr = Tr3D(CLHEP::HepRep3x3(xx, xy, xz, yx, yy, yz, zx, zy, zz), CLHEP::Hep3Vector(dx, dy, dz));
0192
0193
0194 const Tr3D atr(nullptr == at ? tr
0195 : (nullptr == gt ? at->transform() * tr : at->transform() * gt->transform() * tr));
0196
0197
0198 const Pt3D gRef(atr * lRef);
0199 const GlobalPoint fCtr(gRef.x(), gRef.y(), gRef.z());
0200 const Pt3D gBck(atr * lBck);
0201 const GlobalPoint fBck(gBck.x(), gBck.y(), gBck.z());
0202 const Pt3D gCor(atr * lCor);
0203 const GlobalPoint fCor(gCor.x(), gCor.y(), gCor.z());
0204
0205 ptr->newCell(fCtr, fBck, fCor, myParm, id);
0206 #ifdef EDM_ML_DEBUG
0207 edm::LogVerbatim("ZDCGeometry") << "ZDCGeometry Insert cell " << i << ":" << HcalZDCDetId(id);
0208 #endif
0209 }
0210 }
0211 ptr->initializeParms();
0212
0213 return ptr;
0214 }
0215
0216 template class CaloGeometryDBEP<ZdcGeometry, CaloGeometryDBReader>;
0217
0218 typedef CaloGeometryDBEP<ZdcGeometry, CaloGeometryDBReader> ZdcGeometryFromDBEP;
0219
0220 DEFINE_FWK_EVENTSETUP_MODULE(ZdcGeometryFromDBEP);