Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-23 16:00:25

0001 //#define EDM_ML_DEBUG
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];  // one for each endcap
0022 
0023   const int mtdTopologyMode = topo.getMTDTopologyMode();
0024   MTDTopologyMode::EtlLayout etlL = MTDTopologyMode::etlLayoutFromTopoMode(mtdTopologyMode);
0025   // loop on number of sectors per face, two faces per disc (i.e. layer) taken into account in layer building (front/back)
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     // number of layers is two, identical for post TDR scenarios, pick v4
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   // the first entry is Z+ ( MTD side 1), the second is Z- (MTD side 0)
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         // front layer face
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           // back layer face
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 }