Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // dump of ETL layers structure
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 //define this as a plug-in
0171 #include <FWCore/Framework/interface/MakerMacros.h>
0172 DEFINE_FWK_MODULE(TestETLNavigation);