File indexing completed on 2025-03-23 16:00:25
0001
0002
0003 #include "RecoMTD/DetLayers/interface/ETLDetLayerGeometryBuilder.h"
0004
0005 #include <RecoMTD/DetLayers/interface/MTDSectorForwardDoubleLayer.h>
0006 #include <RecoMTD/DetLayers/interface/MTDDetSector.h>
0007 #include <DataFormats/ForwardDetId/interface/ETLDetId.h>
0008 #include <Geometry/CommonDetUnit/interface/GeomDet.h>
0009 #include <Geometry/MTDCommonData/interface/MTDTopologyMode.h>
0010
0011 #include <Utilities/General/interface/precomputed_value_sort.h>
0012 #include <Geometry/CommonDetUnit/interface/DetSorting.h>
0013 #include <FWCore/MessageLogger/interface/MessageLogger.h>
0014
0015 #include <iostream>
0016
0017 using namespace std;
0018
0019 pair<vector<DetLayer*>, vector<DetLayer*> > ETLDetLayerGeometryBuilder::buildLayers(const MTDGeometry& geo,
0020 const MTDTopology& topo) {
0021 vector<DetLayer*> result[2];
0022
0023 const int mtdTopologyMode = topo.getMTDTopologyMode();
0024 MTDTopologyMode::EtlLayout etlL = MTDTopologyMode::etlLayoutFromTopoMode(mtdTopologyMode);
0025
0026 unsigned int nSector(1);
0027 if (static_cast<int>(etlL) >= static_cast<int>(MTDTopologyMode::EtlLayout::v5)) {
0028 nSector *= ETLDetId::kETLv5maxSector;
0029 } else {
0030 throw cms::Exception("MTDDetLayers") << "Not implemented scenario " << mtdTopologyMode;
0031 }
0032
0033 for (unsigned endcap = 0; endcap < 2; ++endcap) {
0034
0035 for (unsigned layer = 1; layer <= ETLDetId::kETLv4nDisc; ++layer) {
0036 vector<unsigned> sectors;
0037 sectors.reserve(nSector + 1);
0038 for (unsigned sector = 1; sector <= nSector; ++sector) {
0039 sectors.push_back(sector);
0040 }
0041 MTDSectorForwardDoubleLayer* thelayer = buildLayer(endcap, layer, sectors, geo, topo);
0042 if (thelayer)
0043 result[endcap].push_back(thelayer);
0044 }
0045 }
0046
0047
0048
0049 pair<vector<DetLayer*>, vector<DetLayer*> > res_pair(result[1], result[0]);
0050 return res_pair;
0051 }
0052
0053 bool ETLDetLayerGeometryBuilder::isFront(int layer, int ring, int module) { return (module + 1) % 2; }
0054
0055 MTDSectorForwardDoubleLayer* ETLDetLayerGeometryBuilder::buildLayer(
0056 int endcap, int layer, vector<unsigned>& sectors, const MTDGeometry& geo, const MTDTopology& topo) {
0057 MTDSectorForwardDoubleLayer* result = nullptr;
0058
0059 std::vector<const MTDDetSector*> frontSectors, backSectors;
0060
0061 LogDebug("MTDDetLayers") << "ETL dets array size = " << geo.detsETL().size();
0062
0063 for (unsigned sector : sectors) {
0064 std::vector<const GeomDet*> frontGeomDets, backGeomDets;
0065 LogDebug("MTDDetLayers") << "endcap = " << endcap << " layer = " << layer << " sector = " << sector;
0066 #ifdef EDM_ML_DEBUG
0067 unsigned int nfront(0), nback(0);
0068 #endif
0069 for (auto det : geo.detsETL()) {
0070 ETLDetId theMod(det->geographicalId().rawId());
0071 if (theMod.mtdSide() == endcap && theMod.nDisc() == layer && theMod.sector() == static_cast<int>(sector)) {
0072 LogTrace("MTDLayerDump") << std::fixed << "ETLDetId " << theMod.rawId() << " side = " << std::setw(4)
0073 << theMod.mtdSide() << " Disc/Side/Sector = " << std::setw(4) << theMod.nDisc() << " "
0074 << std::setw(4) << theMod.discSide() << " " << std::setw(4) << theMod.sector()
0075 << " mod/type = " << std::setw(4) << theMod.module() << " " << std::setw(4)
0076 << theMod.modType() << " pos = " << det->position();
0077
0078 if (theMod.discSide() == 0) {
0079 #ifdef EDM_ML_DEBUG
0080 nfront++;
0081 LogTrace("MTDDetLayers") << "Front " << theMod.discSide() << " " << nfront;
0082 #endif
0083 frontGeomDets.emplace_back(det);
0084
0085 } else if (theMod.discSide() == 1) {
0086 #ifdef EDM_ML_DEBUG
0087 nback++;
0088 LogTrace("MTDDetLayers") << "Back " << theMod.discSide() << " " << nback;
0089 #endif
0090 backGeomDets.emplace_back(det);
0091 }
0092 }
0093 }
0094
0095 if (!backGeomDets.empty()) {
0096 std::sort(backGeomDets.begin(), backGeomDets.end(), topo.orderETLSector);
0097 LogDebug("MTDDetLayers") << "backGeomDets size = " << backGeomDets.size();
0098 backSectors.emplace_back(makeDetSector(backGeomDets, topo));
0099 }
0100
0101 if (!frontGeomDets.empty()) {
0102 std::sort(frontGeomDets.begin(), frontGeomDets.end(), topo.orderETLSector);
0103 LogDebug("MTDDetLayers") << "frontGeomDets size = " << frontGeomDets.size();
0104 frontSectors.emplace_back(makeDetSector(frontGeomDets, topo));
0105 assert(!backGeomDets.empty());
0106 float frontz = frontSectors.back()->position().z();
0107 float backz = backSectors.back()->position().z();
0108 assert(std::abs(frontz) < std::abs(backz));
0109 }
0110 }
0111
0112 result = new MTDSectorForwardDoubleLayer(frontSectors, backSectors);
0113 LogTrace("MTDDetLayers") << "New MTDSectorForwardDoubleLayer with " << std::fixed << std::setw(14)
0114 << frontSectors.size() << " and " << std::setw(14) << backSectors.size() << " rings, at Z "
0115 << std::setw(14) << result->specificSurface().position().z() << " R1: " << std::setw(14)
0116 << result->specificSurface().innerRadius() << " R2: " << std::setw(14)
0117 << result->specificSurface().outerRadius();
0118
0119 return result;
0120 }
0121
0122 MTDDetSector* ETLDetLayerGeometryBuilder::makeDetSector(vector<const GeomDet*>& geomDets, const MTDTopology& topo) {
0123 MTDDetSector* result = new MTDDetSector(geomDets, topo);
0124 LogTrace("MTDDetLayers") << "ETLDetLayerGeometryBuilder::makeDetSector new MTDDetSector with " << std::fixed
0125 << std::setw(14) << geomDets.size() << " modules \n"
0126 << (*result);
0127
0128 return result;
0129 }