Back to home page

Project CMSSW displayed by LXR

 
 

    


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     // get layer
0039     int layer = ivec[it];
0040 
0041     // get transformation
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     // get parameters
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()) {  // front should always point to the center, so swap front and back
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();  // initializations; must happen after cells filled
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);