File indexing completed on 2024-06-28 02:36:36
0001 #include "FWCore/Framework/interface/Frameworkfwd.h"
0002 #include "FWCore/Framework/interface/global/EDAnalyzer.h"
0003 #include "FWCore/Framework/interface/Event.h"
0004 #include "FWCore/Framework/interface/EventSetup.h"
0005 #include "FWCore/Framework/interface/ESTransientHandle.h"
0006 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0008 #include "FWCore/Utilities/interface/StreamID.h"
0009
0010 #include "RecoMTD/DetLayers/interface/MTDDetLayerGeometry.h"
0011 #include "RecoMTD/Records/interface/MTDRecoGeometryRecord.h"
0012
0013 #include "RecoMTD/DetLayers/interface/MTDSectorForwardDoubleLayer.h"
0014 #include "RecoMTD/DetLayers/interface/MTDDetSector.h"
0015
0016 #include <DataFormats/ForwardDetId/interface/ETLDetId.h>
0017
0018 #include <sstream>
0019
0020 #include "DataFormats/Math/interface/Rounding.h"
0021
0022 using namespace std;
0023 using namespace edm;
0024 using namespace cms_rounding;
0025
0026 class TestETLNavigation : public global::EDAnalyzer<> {
0027 public:
0028 TestETLNavigation(const ParameterSet& pset);
0029
0030 void analyze(edm::StreamID, edm::Event const&, edm::EventSetup const&) const override;
0031
0032 private:
0033 inline std::string fround(const double in, const size_t prec) const {
0034 std::stringstream ss;
0035 ss << std::setprecision(prec) << std::fixed << std::setw(14) << roundIfNear0(in);
0036 return ss.str();
0037 }
0038
0039 inline std::string fvecround(const GlobalPoint vecin, const size_t prec) const {
0040 std::stringstream ss;
0041 ss << std::setprecision(prec) << std::fixed << std::setw(14) << roundVecIfNear0(vecin);
0042 return ss.str();
0043 }
0044
0045 const edm::ESInputTag tag_;
0046 edm::ESGetToken<MTDDetLayerGeometry, MTDRecoGeometryRecord> geomToken_;
0047 };
0048
0049 TestETLNavigation::TestETLNavigation(const ParameterSet& iConfig) : tag_(edm::ESInputTag{"", ""}) {
0050 geomToken_ = esConsumes<MTDDetLayerGeometry, MTDRecoGeometryRecord>(tag_);
0051 }
0052
0053 void TestETLNavigation::analyze(edm::StreamID, edm::Event const&, edm::EventSetup const& es) const {
0054 auto geo = es.getTransientHandle(geomToken_);
0055
0056 const vector<const DetLayer*>& layers = geo->allETLLayers();
0057
0058
0059
0060 LogVerbatim("MTDLayerDumpFull") << "\n\nTest of ETL navigation \n\n";
0061 LogVerbatim("MTDLayerDump") << "\n\nTest of ETL navigation \n\n";
0062
0063 for (const auto& ilay : layers) {
0064 const MTDSectorForwardDoubleLayer* layer = static_cast<const MTDSectorForwardDoubleLayer*>(ilay);
0065
0066 LogVerbatim("MTDLayerDumpFull") << std::fixed << "\nETL layer " << std::setw(4) << layer->subDetector()
0067 << " at z = " << fround(layer->surface().position().z(), 4)
0068 << " sectors = " << std::setw(14) << layer->sectors().size()
0069 << " dets = " << std::setw(14) << layer->basicComponents().size()
0070 << " front dets = " << std::setw(14)
0071 << layer->frontLayer()->basicComponents().size() << " back dets = " << std::setw(14)
0072 << layer->backLayer()->basicComponents().size();
0073 LogVerbatim("MTDLayerDump") << std::fixed << "\nETL layer " << std::setw(4) << layer->subDetector()
0074 << " at z = " << fround(layer->surface().position().z(), 2)
0075 << " sectors = " << std::setw(14) << layer->sectors().size()
0076 << " dets = " << std::setw(14) << layer->basicComponents().size()
0077 << " front dets = " << std::setw(14) << layer->frontLayer()->basicComponents().size()
0078 << " back dets = " << std::setw(14) << layer->backLayer()->basicComponents().size();
0079
0080 unsigned int isectInd(0);
0081 for (const auto& isector : layer->sectors()) {
0082 isectInd++;
0083 LogVerbatim("MTDLayerDumpFull") << std::fixed << "\nSector " << std::setw(4) << isectInd << "\n" << (*isector);
0084 LogVerbatim("MTDLayerDump") << std::fixed << "\nSector " << std::setw(4) << isectInd << "\n" << (*isector);
0085 unsigned int imodInd(0);
0086 for (const auto& imod : isector->basicComponents()) {
0087 imodInd++;
0088 ETLDetId modId(imod->geographicalId().rawId());
0089 LogVerbatim("MTDLayerDumpFull") << std::fixed << std::setw(5) << imodInd << " ETLDetId " << modId.rawId()
0090 << " side = " << std::setw(4) << modId.mtdSide()
0091 << " Disc/Side/Sector = " << std::setw(4) << modId.nDisc() << " "
0092 << std::setw(4) << modId.discSide() << " " << std::setw(4) << modId.sector()
0093 << " mod/type = " << std::setw(4) << modId.module() << " " << std::setw(4)
0094 << modId.modType() << " pos = " << fvecround(imod->position(), 4);
0095 LogVerbatim("MTDLayerDump") << std::fixed << std::setw(5) << imodInd << " ETLDetId " << modId.rawId()
0096 << " side = " << std::setw(4) << modId.mtdSide()
0097 << " Disc/Side/Sector = " << std::setw(4) << modId.nDisc() << " " << std::setw(4)
0098 << modId.discSide() << " " << std::setw(4) << modId.sector()
0099 << " mod/type = " << std::setw(4) << modId.module() << " " << std::setw(4)
0100 << modId.modType() << " pos = " << fvecround(imod->position(), 2);
0101 for (int iside = -1; iside <= 1; iside += 2) {
0102 size_t idetNew = isector->hshift(modId, iside);
0103 if (idetNew >= isector->basicComponents().size()) {
0104 LogVerbatim("MTDLayerDumpFull")
0105 << "...............hshift= " << std::fixed << std::setw(2) << iside << " out of range";
0106 LogVerbatim("MTDLayerDump") << "...............hshift= " << std::fixed << std::setw(2) << iside
0107 << " out of range";
0108 } else {
0109 ETLDetId newId(isector->basicComponents()[idetNew]->geographicalId().rawId());
0110 LogVerbatim("MTDLayerDumpFull")
0111 << std::fixed << "...............hshift= " << std::setw(2) << iside << " side = " << std::setw(4)
0112 << newId.mtdSide() << " Disc/Side/Sector = " << std::setw(4) << newId.nDisc() << " " << std::setw(4)
0113 << newId.discSide() << " " << std::setw(4) << newId.sector() << " mod/type = " << std::setw(4)
0114 << newId.module() << " " << std::setw(4) << newId.modType()
0115 << " pos = " << fvecround(isector->basicComponents()[idetNew]->position(), 4);
0116 LogVerbatim("MTDLayerDump") << std::fixed << "...............hshift= " << std::setw(2) << iside
0117 << " side = " << std::setw(4) << newId.mtdSide()
0118 << " Disc/Side/Sector = " << std::setw(4) << newId.nDisc() << " "
0119 << std::setw(4) << newId.discSide() << " " << std::setw(4) << newId.sector()
0120 << " mod/type = " << std::setw(4) << newId.module() << " " << std::setw(4)
0121 << newId.modType()
0122 << " pos = " << fvecround(isector->basicComponents()[idetNew]->position(), 2);
0123 }
0124 }
0125 for (int iside = -1; iside <= 1; iside += 2) {
0126 size_t closest(isector->basicComponents().size());
0127 size_t idetNew = isector->vshift(modId, iside, closest);
0128 if (idetNew >= isector->basicComponents().size()) {
0129 LogVerbatim("MTDLayerDumpFull")
0130 << "...............vshift= " << std::fixed << std::setw(2) << iside << " out of range";
0131 LogVerbatim("MTDLayerDump") << "...............vshift= " << std::fixed << std::setw(2) << iside
0132 << " out of range";
0133 if (closest < isector->basicComponents().size()) {
0134 ETLDetId newId(isector->basicComponents()[closest]->geographicalId().rawId());
0135 LogVerbatim("MTDLayerDumpFull")
0136 << std::fixed << ".......closest.vshift= " << std::setw(2) << iside << " side = " << std::setw(4)
0137 << newId.mtdSide() << " Disc/Side/Sector = " << std::setw(4) << newId.nDisc() << " " << std::setw(4)
0138 << newId.discSide() << " " << std::setw(4) << newId.sector() << " mod/type = " << std::setw(4)
0139 << newId.module() << " " << std::setw(4) << newId.modType()
0140 << " pos = " << fvecround(isector->basicComponents()[closest]->position(), 4);
0141 LogVerbatim("MTDLayerDump")
0142 << std::fixed << ".......closest.vshift= " << std::setw(2) << iside << " side = " << std::setw(4)
0143 << newId.mtdSide() << " Disc/Side/Sector = " << std::setw(4) << newId.nDisc() << " " << std::setw(4)
0144 << newId.discSide() << " " << std::setw(4) << newId.sector() << " mod/type = " << std::setw(4)
0145 << newId.module() << " " << std::setw(4) << newId.modType()
0146 << " pos = " << fvecround(isector->basicComponents()[closest]->position(), 2);
0147 }
0148 } else {
0149 ETLDetId newId(isector->basicComponents()[idetNew]->geographicalId().rawId());
0150 LogVerbatim("MTDLayerDumpFull")
0151 << std::fixed << "...............vshift= " << std::setw(2) << iside << " side = " << std::setw(4)
0152 << newId.mtdSide() << " Disc/Side/Sector = " << std::setw(4) << newId.nDisc() << " " << std::setw(4)
0153 << newId.discSide() << " " << std::setw(4) << newId.sector() << " mod/type = " << std::setw(4)
0154 << newId.module() << " " << std::setw(4) << newId.modType()
0155 << " pos = " << fvecround(isector->basicComponents()[idetNew]->position(), 4);
0156 LogVerbatim("MTDLayerDump") << std::fixed << "...............vshift= " << std::setw(2) << iside
0157 << " side = " << std::setw(4) << newId.mtdSide()
0158 << " Disc/Side/Sector = " << std::setw(4) << newId.nDisc() << " "
0159 << std::setw(4) << newId.discSide() << " " << std::setw(4) << newId.sector()
0160 << " mod/type = " << std::setw(4) << newId.module() << " " << std::setw(4)
0161 << newId.modType()
0162 << " pos = " << fvecround(isector->basicComponents()[idetNew]->position(), 2);
0163 }
0164 }
0165 }
0166 }
0167 }
0168 }
0169
0170
0171 #include <FWCore/Framework/interface/MakerMacros.h>
0172 DEFINE_FWK_MODULE(TestETLNavigation);