File indexing completed on 2023-03-17 10:48:14
0001 #include "Geometry/CaloEventSetup/interface/CaloGeometryDBEP.h"
0002 #include "Geometry/CaloEventSetup/interface/CaloGeometryDBWriter.h"
0003 #include "Geometry/EcalAlgo/interface/EcalBarrelGeometry.h"
0004 #include "Geometry/EcalAlgo/interface/EcalEndcapGeometry.h"
0005 #include "Geometry/EcalAlgo/interface/EcalPreshowerGeometry.h"
0006 #include "Geometry/HcalTowerAlgo/interface/HcalGeometry.h"
0007 #include "Geometry/HcalTowerAlgo/interface/CaloTowerGeometry.h"
0008 #include "Geometry/HcalTowerAlgo/interface/CaloGeometryDBHcal.h"
0009 #include "Geometry/HcalTowerAlgo/interface/CaloGeometryDBCaloTower.h"
0010 #include "Geometry/ForwardGeometry/interface/ZdcGeometry.h"
0011 #include "Geometry/ForwardGeometry/interface/CastorGeometry.h"
0012 #include "Geometry/Records/interface/HcalRecNumberingRecord.h"
0013 #include "Geometry/HGCalGeometry/interface/HGCalGeometry.h"
0014 #include "Geometry/HGCalGeometry/interface/CaloGeometryDBHGCal.h"
0015
0016 template <>
0017 CaloGeometryDBEP<HcalGeometry, CaloGeometryDBWriter>::PtrType
0018 CaloGeometryDBEP<HcalGeometry, CaloGeometryDBWriter>::produceAligned(
0019 const typename HcalGeometry::AlignedRecord& iRecord) {
0020 const auto [alignPtr, globalPtr] = getAlignGlobal(iRecord);
0021
0022 TrVec tvec;
0023 DimVec dvec;
0024 IVec ivec;
0025 IVec dins;
0026
0027 const auto& pG = iRecord.get(geometryToken_);
0028
0029 pG.getSummary(tvec, ivec, dvec, dins);
0030
0031 CaloGeometryDBWriter::writeIndexed(tvec, dvec, ivec, dins, HcalGeometry::dbString());
0032
0033
0034 const auto& hcalTopology = iRecord.get(additionalTokens_.topology);
0035
0036
0037
0038
0039
0040 assert(dvec.size() <= hcalTopology.getNumberOfShapes() * HcalGeometry::k_NumberOfParametersPerShape);
0041 HcalGeometry* hcalGeometry = new HcalGeometry(hcalTopology);
0042 PtrType ptr(hcalGeometry);
0043
0044 const unsigned int nTrParm(hcalGeometry->numberOfTransformParms());
0045
0046 ptr->fillDefaultNamedParameters();
0047 ptr->allocateCorners(hcalTopology.ncells() + hcalTopology.getHFSize());
0048 ptr->allocatePar(hcalGeometry->numberOfShapes(), HcalGeometry::k_NumberOfParametersPerShape);
0049
0050 for (unsigned int i(0); i < dins.size(); ++i) {
0051 const unsigned int nPerShape(HcalGeometry::k_NumberOfParametersPerShape);
0052 DimVec dims;
0053 dims.reserve(nPerShape);
0054
0055 const unsigned int indx(ivec.size() == 1 ? 0 : i);
0056
0057 DimVec::const_iterator dsrc(dvec.begin() + ivec[indx] * nPerShape);
0058
0059 for (unsigned int j(0); j != nPerShape; ++j) {
0060 dims.push_back(*dsrc);
0061 ++dsrc;
0062 }
0063
0064 const CCGFloat* myParm(CaloCellGeometry::getParmPtr(dims, ptr->parMgr(), ptr->parVecVec()));
0065
0066 const DetId id(hcalTopology.denseId2detId(dins[i]));
0067
0068 const unsigned int iGlob(nullptr == globalPtr ? 0 : HcalGeometry::alignmentTransformIndexGlobal(id));
0069
0070 assert(nullptr == globalPtr || iGlob < globalPtr->m_align.size());
0071
0072 const AlignTransform* gt(nullptr == globalPtr ? nullptr : &globalPtr->m_align[iGlob]);
0073
0074 assert(nullptr == gt || iGlob == HcalGeometry::alignmentTransformIndexGlobal(DetId(gt->rawId())));
0075
0076 const unsigned int iLoc(nullptr == alignPtr ? 0 : HcalGeometry::alignmentTransformIndexLocal(id));
0077
0078 assert(nullptr == alignPtr || iLoc < alignPtr->m_align.size());
0079
0080 const AlignTransform* at(nullptr == alignPtr ? nullptr : &alignPtr->m_align[iLoc]);
0081
0082 assert(nullptr == at || (HcalGeometry::alignmentTransformIndexLocal(DetId(at->rawId())) == iLoc));
0083
0084 Pt3D lRef;
0085 Pt3DVec lc(8, Pt3D(0, 0, 0));
0086 hcalGeometry->localCorners(lc, &dims.front(), dins[i], lRef);
0087
0088 const Pt3D lBck(0.25 * (lc[4] + lc[5] + lc[6] + lc[7]));
0089 const Pt3D lCor(lc[0]);
0090
0091
0092 const unsigned int jj(i * nTrParm);
0093
0094 Tr3D tr;
0095 const ROOT::Math::Translation3D tl(tvec[jj], tvec[jj + 1], tvec[jj + 2]);
0096 const ROOT::Math::EulerAngles ea(6 == nTrParm ? ROOT::Math::EulerAngles(tvec[jj + 3], tvec[jj + 4], tvec[jj + 5])
0097 : ROOT::Math::EulerAngles());
0098 const ROOT::Math::Transform3D rt(ea, tl);
0099 double xx, xy, xz, dx;
0100 double yx, yy, yz, dy;
0101 double zx, zy, zz, dz;
0102 rt.GetComponents(xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz);
0103 tr = Tr3D(CLHEP::HepRep3x3(xx, xy, xz, yx, yy, yz, zx, zy, zz), CLHEP::Hep3Vector(dx, dy, dz));
0104
0105
0106 const Tr3D atr(nullptr == at ? tr
0107 : (nullptr == gt ? at->transform() * tr : at->transform() * gt->transform() * tr));
0108
0109
0110 const Pt3D gRef(atr * lRef);
0111 const GlobalPoint fCtr(gRef.x(), gRef.y(), gRef.z());
0112 const Pt3D gBck(atr * lBck);
0113 const GlobalPoint fBck(gBck.x(), gBck.y(), gBck.z());
0114 const Pt3D gCor(atr * lCor);
0115 const GlobalPoint fCor(gCor.x(), gCor.y(), gCor.z());
0116
0117 assert(hcalTopology.detId2denseId(id) == dins[i]);
0118 ptr->newCell(fCtr, fBck, fCor, myParm, id);
0119 }
0120
0121 ptr->initializeParms();
0122
0123 return ptr;
0124 }
0125
0126 template <>
0127 CaloGeometryDBEP<CaloTowerGeometry, CaloGeometryDBWriter>::PtrType
0128 CaloGeometryDBEP<CaloTowerGeometry, CaloGeometryDBWriter>::produceAligned(
0129 const typename CaloTowerGeometry::AlignedRecord& iRecord) {
0130 const auto [alignPtr, globalPtr] = getAlignGlobal(iRecord);
0131
0132 TrVec tvec;
0133 DimVec dvec;
0134 IVec ivec;
0135 IVec dins;
0136
0137 const auto& pG = iRecord.get(geometryToken_);
0138
0139 pG.getSummary(tvec, ivec, dvec, dins);
0140
0141 CaloGeometryDBWriter::writeIndexed(tvec, dvec, ivec, dins, CaloTowerGeometry::dbString());
0142
0143
0144 const auto& caloTopology = iRecord.get(additionalTokens_.topology);
0145
0146 CaloTowerGeometry* ctg = new CaloTowerGeometry(&caloTopology);
0147
0148 const unsigned int nTrParm(tvec.size() / ctg->numberOfCellsForCorners());
0149
0150 assert(dvec.size() == ctg->numberOfShapes() * CaloTowerGeometry::k_NumberOfParametersPerShape);
0151
0152 PtrType ptr(ctg);
0153
0154 ptr->fillDefaultNamedParameters();
0155
0156 ptr->allocateCorners(ctg->numberOfCellsForCorners());
0157
0158 ptr->allocatePar(dvec.size(), CaloTowerGeometry::k_NumberOfParametersPerShape);
0159
0160 for (unsigned int i(0); i < dins.size(); ++i) {
0161 const unsigned int nPerShape(ctg->numberOfParametersPerShape());
0162 DimVec dims;
0163 dims.reserve(nPerShape);
0164
0165 const unsigned int indx(ivec.size() == 1 ? 0 : i);
0166
0167 DimVec::const_iterator dsrc(dvec.begin() + ivec[indx] * nPerShape);
0168
0169 for (unsigned int j(0); j != nPerShape; ++j) {
0170 dims.push_back(*dsrc);
0171 ++dsrc;
0172 }
0173
0174 const CCGFloat* myParm(CaloCellGeometry::getParmPtr(dims, ptr->parMgr(), ptr->parVecVec()));
0175
0176 const DetId id(caloTopology.detIdFromDenseIndex(dins[i]));
0177
0178 const unsigned int iGlob(nullptr == globalPtr ? 0 : ctg->alignmentTransformIndexGlobal(id));
0179
0180 assert(nullptr == globalPtr || iGlob < globalPtr->m_align.size());
0181
0182 const AlignTransform* gt(nullptr == globalPtr ? nullptr : &globalPtr->m_align[iGlob]);
0183
0184 assert(nullptr == gt || iGlob == ctg->alignmentTransformIndexGlobal(DetId(gt->rawId())));
0185
0186 const unsigned int iLoc(nullptr == alignPtr ? 0 : ctg->alignmentTransformIndexLocal(id));
0187
0188 assert(nullptr == alignPtr || iLoc < alignPtr->m_align.size());
0189
0190 const AlignTransform* at(nullptr == alignPtr ? nullptr : &alignPtr->m_align[iLoc]);
0191
0192 assert(nullptr == at || (ctg->alignmentTransformIndexLocal(DetId(at->rawId())) == iLoc));
0193
0194 const CaloGenericDetId gId(id);
0195
0196 Pt3D lRef;
0197 Pt3DVec lc(8, Pt3D(0, 0, 0));
0198 ctg->localCorners(lc, &dims.front(), dins[i], lRef);
0199
0200 const Pt3D lBck(0.25 * (lc[4] + lc[5] + lc[6] + lc[7]));
0201 const Pt3D lCor(lc[0]);
0202
0203
0204 const unsigned int jj(i * nTrParm);
0205 Tr3D tr;
0206 const ROOT::Math::Translation3D tl(tvec[jj], tvec[jj + 1], tvec[jj + 2]);
0207 const ROOT::Math::EulerAngles ea(6 == nTrParm ? ROOT::Math::EulerAngles(tvec[jj + 3], tvec[jj + 4], tvec[jj + 5])
0208 : ROOT::Math::EulerAngles());
0209 const ROOT::Math::Transform3D rt(ea, tl);
0210 double xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz;
0211 rt.GetComponents(xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz);
0212 tr = Tr3D(CLHEP::HepRep3x3(xx, xy, xz, yx, yy, yz, zx, zy, zz), CLHEP::Hep3Vector(dx, dy, dz));
0213
0214
0215 const Tr3D atr(nullptr == at ? tr
0216 : (nullptr == gt ? at->transform() * tr : at->transform() * gt->transform() * tr));
0217
0218
0219 const Pt3D gRef(atr * lRef);
0220 const GlobalPoint fCtr(gRef.x(), gRef.y(), gRef.z());
0221 const Pt3D gBck(atr * lBck);
0222 const GlobalPoint fBck(gBck.x(), gBck.y(), gBck.z());
0223 const Pt3D gCor(atr * lCor);
0224 const GlobalPoint fCor(gCor.x(), gCor.y(), gCor.z());
0225
0226 assert(caloTopology.denseIndex(id) == dins[i]);
0227
0228 ptr->newCell(fCtr, fBck, fCor, myParm, id);
0229 }
0230
0231 ptr->initializeParms();
0232
0233 return ptr;
0234 }
0235
0236 template <>
0237 CaloGeometryDBEP<HGCalGeometry, CaloGeometryDBWriter>::PtrType
0238 CaloGeometryDBEP<HGCalGeometry, CaloGeometryDBWriter>::produceAligned(
0239 const typename HGCalGeometry::AlignedRecord& iRecord) {
0240 TrVec tvec;
0241 DimVec dvec;
0242 IVec ivec;
0243 IVec dins;
0244
0245 const auto& geom = iRecord.get(geometryToken_);
0246
0247 geom.getSummary(tvec, ivec, dvec, dins);
0248
0249 CaloGeometryDBWriter::writeIndexed(tvec, dvec, ivec, dins, HGCalGeometry::dbString());
0250
0251
0252 const auto& topology = iRecord.get(additionalTokens_.topology);
0253
0254 assert(dvec.size() <= topology.totalGeomModules() * HGCalGeometry::k_NumberOfParametersPerShape);
0255 HGCalGeometry* hcg = new HGCalGeometry(topology);
0256 PtrType ptr(hcg);
0257
0258 ptr->allocateCorners(topology.ncells());
0259 ptr->allocatePar(HGCalGeometry::k_NumberOfShapes, HGCalGeometry::k_NumberOfParametersPerShape);
0260
0261 const unsigned int nTrParm(ptr->numberOfTransformParms());
0262 const unsigned int nPerShape(HGCalGeometry::k_NumberOfParametersPerShape);
0263
0264 for (auto it : dins) {
0265 DetId id = topology.encode(topology.geomDenseId2decId(it));
0266
0267 int layer = ivec[it];
0268
0269
0270 const unsigned int jj(it * nTrParm);
0271 Tr3D tr;
0272 const ROOT::Math::Translation3D tl(tvec[jj], tvec[jj + 1], tvec[jj + 2]);
0273 const ROOT::Math::EulerAngles ea(6 == nTrParm ? ROOT::Math::EulerAngles(tvec[jj + 3], tvec[jj + 4], tvec[jj + 5])
0274 : ROOT::Math::EulerAngles());
0275 const ROOT::Math::Transform3D rt(ea, tl);
0276 double xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz;
0277 rt.GetComponents(xx, xy, xz, dx, yx, yy, yz, dy, zx, zy, zz, dz);
0278 tr = Tr3D(CLHEP::HepRep3x3(xx, xy, xz, yx, yy, yz, zx, zy, zz), CLHEP::Hep3Vector(dx, dy, dz));
0279
0280
0281 DimVec dims;
0282 dims.reserve(nPerShape);
0283
0284 DimVec::const_iterator dsrc(dvec.begin() + layer * nPerShape);
0285 for (unsigned int j(0); j != nPerShape; ++j) {
0286 dims.push_back(*dsrc);
0287 ++dsrc;
0288 }
0289
0290 std::vector<GlobalPoint> corners(FlatHexagon::ncorner_);
0291
0292 FlatHexagon::createCorners(dims, tr, corners);
0293
0294 const CCGFloat* myParm(CaloCellGeometry::getParmPtr(dims, ptr->parMgr(), ptr->parVecVec()));
0295 GlobalPoint front(
0296 FlatHexagon::oneBySix_ *
0297 (corners[0].x() + corners[1].x() + corners[2].x() + corners[3].x() + corners[4].x() + corners[5].x()),
0298 FlatHexagon::oneBySix_ *
0299 (corners[0].y() + corners[1].y() + corners[2].y() + corners[3].y() + corners[4].y() + corners[5].y()),
0300 FlatHexagon::oneBySix_ *
0301 (corners[0].z() + corners[1].z() + corners[2].z() + corners[3].z() + corners[4].z() + corners[5].z()));
0302
0303 GlobalPoint back(
0304 FlatHexagon::oneBySix_ *
0305 (corners[6].x() + corners[7].x() + corners[8].x() + corners[9].x() + corners[10].x() + corners[11].x()),
0306 FlatHexagon::oneBySix_ *
0307 (corners[6].y() + corners[7].y() + corners[8].y() + corners[9].y() + corners[10].y() + corners[11].y()),
0308 FlatHexagon::oneBySix_ *
0309 (corners[6].z() + corners[7].z() + corners[8].z() + corners[9].z() + corners[10].z() + corners[11].z()));
0310
0311 if (front.mag2() > back.mag2()) {
0312 std::swap(front, back);
0313 std::swap_ranges(
0314 corners.begin(), corners.begin() + FlatHexagon::ncornerBy2_, corners.begin() + FlatHexagon::ncornerBy2_);
0315 }
0316
0317 ptr->newCell(front, back, corners[0], myParm, id);
0318 }
0319
0320 ptr->initializeParms();
0321
0322 return ptr;
0323 }
0324
0325 template class CaloGeometryDBEP<EcalBarrelGeometry, CaloGeometryDBWriter>;
0326 template class CaloGeometryDBEP<EcalEndcapGeometry, CaloGeometryDBWriter>;
0327 template class CaloGeometryDBEP<EcalPreshowerGeometry, CaloGeometryDBWriter>;
0328
0329 template class CaloGeometryDBEP<HcalGeometry, CaloGeometryDBWriter>;
0330 template class CaloGeometryDBEP<CaloTowerGeometry, CaloGeometryDBWriter>;
0331 template class CaloGeometryDBEP<ZdcGeometry, CaloGeometryDBWriter>;
0332 template class CaloGeometryDBEP<CastorGeometry, CaloGeometryDBWriter>;
0333
0334 typedef CaloGeometryDBEP<EcalBarrelGeometry, CaloGeometryDBWriter> EcalBarrelGeometryToDBEP;
0335
0336 DEFINE_FWK_EVENTSETUP_MODULE(EcalBarrelGeometryToDBEP);
0337
0338 typedef CaloGeometryDBEP<EcalEndcapGeometry, CaloGeometryDBWriter> EcalEndcapGeometryToDBEP;
0339
0340 DEFINE_FWK_EVENTSETUP_MODULE(EcalEndcapGeometryToDBEP);
0341
0342 typedef CaloGeometryDBEP<EcalPreshowerGeometry, CaloGeometryDBWriter> EcalPreshowerGeometryToDBEP;
0343
0344 DEFINE_FWK_EVENTSETUP_MODULE(EcalPreshowerGeometryToDBEP);
0345
0346 typedef CaloGeometryDBEP<HcalGeometry, CaloGeometryDBWriter> HcalGeometryToDBEP;
0347
0348 DEFINE_FWK_EVENTSETUP_MODULE(HcalGeometryToDBEP);
0349
0350 typedef CaloGeometryDBEP<CaloTowerGeometry, CaloGeometryDBWriter> CaloTowerGeometryToDBEP;
0351
0352 DEFINE_FWK_EVENTSETUP_MODULE(CaloTowerGeometryToDBEP);
0353
0354 typedef CaloGeometryDBEP<ZdcGeometry, CaloGeometryDBWriter> ZdcGeometryToDBEP;
0355
0356 DEFINE_FWK_EVENTSETUP_MODULE(ZdcGeometryToDBEP);
0357
0358 typedef CaloGeometryDBEP<CastorGeometry, CaloGeometryDBWriter> CastorGeometryToDBEP;
0359
0360 DEFINE_FWK_EVENTSETUP_MODULE(CastorGeometryToDBEP);
0361
0362 typedef CaloGeometryDBEP<HGCalGeometry, CaloGeometryDBWriter> HGCalGeometryToDBEP;
0363
0364 DEFINE_FWK_EVENTSETUP_MODULE(HGCalGeometryToDBEP);