File indexing completed on 2024-04-06 12:15:09
0001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0002 #include "Geometry/HGCalGeometry/interface/HGCalGeometry.h"
0003 #include "Geometry/HGCalGeometry/interface/CaloGeometryDBHGCal.h"
0004 #include "Geometry/CaloEventSetup/interface/CaloGeometryDBEP.h"
0005 #include "Geometry/CaloEventSetup/interface/CaloGeometryDBReader.h"
0006
0007 template <>
0008 CaloGeometryDBEP<HGCalGeometry, CaloGeometryDBReader>::PtrType
0009 CaloGeometryDBEP<HGCalGeometry, CaloGeometryDBReader>::produceAligned(
0010 const typename HGCalGeometry::AlignedRecord& iRecord) {
0011 TrVec tvec;
0012 DimVec dvec;
0013 IVec ivec;
0014 IVec dins;
0015
0016 edm::LogVerbatim("HGCalGeom") << "Reading HGCalGeometry " << calogeometryDBEPimpl::nameHGCal;
0017 const auto& pG = iRecord.get(geometryToken_);
0018
0019 tvec = pG.getTranslation();
0020 dvec = pG.getDimension();
0021 ivec = pG.getIndexes();
0022 dins = pG.getDenseIndices();
0023
0024 const auto& topology = iRecord.get(additionalTokens_.topology);
0025
0026 assert(dvec.size() <= topology.totalGeomModules() * HGCalGeometry::k_NumberOfParametersPerShape);
0027 HGCalGeometry* hcg = new HGCalGeometry(topology);
0028 PtrType ptr(hcg);
0029
0030 ptr->allocateCorners(topology.ncells());
0031 ptr->allocatePar(HGCalGeometry::k_NumberOfShapes, HGCalGeometry::k_NumberOfParametersPerShape);
0032
0033 const unsigned int nTrParm(ptr->numberOfTransformParms());
0034 const unsigned int nPerShape(HGCalGeometry::k_NumberOfParametersPerShape);
0035
0036 for (auto it : dins) {
0037 DetId id = topology.encode(topology.geomDenseId2decId(it));
0038
0039 int layer = ivec[it];
0040
0041
0042 const unsigned int jj(it * nTrParm);
0043 Tr3D tr;
0044 const ROOT::Math::Translation3D tl(tvec[jj], tvec[jj + 1], tvec[jj + 2]);
0045 const ROOT::Math::EulerAngles ea(6 == nTrParm ? ROOT::Math::EulerAngles(tvec[jj + 3], tvec[jj + 4], tvec[jj + 5])
0046 : ROOT::Math::EulerAngles());
0047 const ROOT::Math::Transform3D rt(ea, tl);
0048 double xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz;
0049 rt.GetComponents(xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz);
0050 tr = Tr3D(CLHEP::HepRep3x3(xx, xy, xz, yx, yy, yz, zx, zy, zz), CLHEP::Hep3Vector(dx, dy, dz));
0051
0052
0053 DimVec dims;
0054 dims.reserve(nPerShape);
0055
0056 DimVec::const_iterator dsrc(dvec.begin() + layer * nPerShape);
0057 for (unsigned int j(0); j != nPerShape; ++j) {
0058 dims.emplace_back(*dsrc);
0059 ++dsrc;
0060 }
0061
0062 std::vector<GlobalPoint> corners(FlatHexagon::ncorner_);
0063
0064 FlatHexagon::createCorners(dims, tr, corners);
0065
0066 const CCGFloat* myParm(CaloCellGeometry::getParmPtr(dims, ptr->parMgr(), ptr->parVecVec()));
0067 GlobalPoint front(
0068 FlatHexagon::oneBySix_ *
0069 (corners[0].x() + corners[1].x() + corners[2].x() + corners[3].x() + corners[4].x() + corners[5].x()),
0070 FlatHexagon::oneBySix_ *
0071 (corners[0].y() + corners[1].y() + corners[2].y() + corners[3].y() + corners[4].y() + corners[5].y()),
0072 FlatHexagon::oneBySix_ *
0073 (corners[0].z() + corners[1].z() + corners[2].z() + corners[3].z() + corners[4].z() + corners[5].z()));
0074
0075 GlobalPoint back(
0076 FlatHexagon::oneBySix_ *
0077 (corners[6].x() + corners[7].x() + corners[8].x() + corners[9].x() + corners[10].x() + corners[11].x()),
0078 FlatHexagon::oneBySix_ *
0079 (corners[6].y() + corners[7].y() + corners[8].y() + corners[9].y() + corners[10].y() + corners[11].y()),
0080 FlatHexagon::oneBySix_ *
0081 (corners[6].z() + corners[7].z() + corners[8].z() + corners[9].z() + corners[10].z() + corners[11].z()));
0082
0083 if (front.mag2() > back.mag2()) {
0084 std::swap(front, back);
0085 std::swap_ranges(
0086 corners.begin(), corners.begin() + FlatHexagon::ncornerBy2_, corners.begin() + FlatHexagon::ncornerBy2_);
0087 }
0088
0089 ptr->newCell(front, back, corners[0], myParm, id);
0090 }
0091
0092 ptr->initializeParms();
0093
0094 return ptr;
0095 }
0096
0097 template class CaloGeometryDBEP<HGCalGeometry, CaloGeometryDBReader>;
0098
0099 typedef CaloGeometryDBEP<HGCalGeometry, CaloGeometryDBReader> HGCalGeometryFromDBEP;
0100
0101 DEFINE_FWK_EVENTSETUP_MODULE(HGCalGeometryFromDBEP);