Back to home page

Project CMSSW displayed by LXR

 
 

    


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 //#define EDM_ML_DEBUG
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]));  // ctr rear  face in local
0097       const Pt3D lCor(lc[0]);
0098 
0099       //----------------------------------- create transform from 6 numbers ---
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       // now prepend alignment(s) for final transform
0111       const Tr3D atr(nullptr == at ? tr
0112                                    : (nullptr == gt ? at->transform() * tr : at->transform() * gt->transform() * tr));
0113       //--------------------------------- done making transform  ---------------
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]));  // ctr rear  face in local
0180       const Pt3D lCor(lc[0]);
0181 
0182       //----------------------------------- create transform from 6 numbers ---
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       // now prepend alignment(s) for final transform
0194       const Tr3D atr(nullptr == at ? tr
0195                                    : (nullptr == gt ? at->transform() * tr : at->transform() * gt->transform() * tr));
0196       //--------------------------------- done making transform  ---------------
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();  // initializations; must happen after cells filled
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);