Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:15:27

0001 // -*- C++ -*-
0002 //
0003 /* 
0004  Description: <one line class summary>
0005 
0006  Implementation:
0007      <Notes on implementation>
0008 */
0009 
0010 //
0011 // Original Author:  Riccardo Ranieri
0012 //         Created:  Wed May 3 10:30:00 CEST 2006
0013 //
0014 //
0015 
0016 // system include files
0017 #include <memory>
0018 
0019 // user include files
0020 #include "FWCore/Framework/interface/Frameworkfwd.h"
0021 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0022 
0023 #include "FWCore/Framework/interface/Event.h"
0024 #include "FWCore/Framework/interface/EventSetup.h"
0025 #include "FWCore/Framework/interface/MakerMacros.h"
0026 
0027 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0028 
0029 #include "Geometry/CommonDetUnit/interface/TrackingGeometry.h"
0030 
0031 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0032 
0033 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
0034 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
0035 
0036 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0037 
0038 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0039 #include "Geometry/TrackerGeometryBuilder/interface/trackerHierarchy.h"
0040 
0041 #include "DataFormats/Common/interface/Trie.h"
0042 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0043 
0044 #include <string>
0045 #include <iostream>
0046 
0047 template <typename Det>
0048 struct Print {
0049   // typedef edm::TrieNode<Det> const node;
0050   void operator()(Det det, std::string const& label) const {
0051     if (!det)
0052       return;
0053     for (char i : label)
0054       std::cout << int(i) << '/';
0055     std::cout << " " << det->geographicalId().rawId() << std::endl;
0056   }
0057 };
0058 
0059 class GeoHierarchy : public edm::one::EDAnalyzer<> {
0060 public:
0061   explicit GeoHierarchy(const edm::ParameterSet&);
0062   ~GeoHierarchy() override;
0063 
0064   void analyze(edm::Event const& iEvent, edm::EventSetup const&) override;
0065 
0066 private:
0067   // ----------member data ---------------------------
0068   edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> ddToken_;
0069   edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> ttopoToken_;
0070   bool fromDDD_;
0071   bool printDDD_;
0072 };
0073 
0074 GeoHierarchy::GeoHierarchy(const edm::ParameterSet& ps) : ddToken_(esConsumes()), ttopoToken_(esConsumes()) {
0075   fromDDD_ = ps.getParameter<bool>("fromDDD");
0076   printDDD_ = ps.getUntrackedParameter<bool>("printDDD", true);
0077 }
0078 
0079 GeoHierarchy::~GeoHierarchy() {}
0080 
0081 template <typename Iter>
0082 void constructAndDumpTrie(const TrackerTopology* tTopo, Iter b, Iter e) {
0083   typedef typename std::iterator_traits<Iter>::value_type Det;
0084   edm::Trie<Det> trie(nullptr);
0085   typedef edm::TrieNode<Det> Node;
0086   typedef Node const* node_pointer;  // sigh....
0087   typedef edm::TrieNodeIter<Det> node_iterator;
0088 
0089   std::cout << "In Tracker Geom there are " << e - b << " modules" << std::endl;
0090   Iter last = b;
0091   try {
0092     for (; b != e; ++b) {
0093       last = b;
0094       unsigned int rawid = (*b)->geographicalId().rawId();
0095       trie.insert(trackerHierarchy(tTopo, rawid), *b);
0096     }
0097   } catch (edm::Exception const& ex) {
0098     std::cout << "in filling " << ex.what() << std::endl;
0099     unsigned int rawid = (*last)->geographicalId().rawId();
0100     int subdetid = (*last)->geographicalId().subdetId();
0101     std::cout << rawid << " " << subdetid << std::endl;
0102   }
0103 
0104   try {
0105     Print<Det> pr;
0106     edm::walkTrie(pr, *trie.initialNode());
0107     std::cout << std::endl;
0108 
0109     unsigned int layerId[] = {1, 3, 5, 21, 22, 41, 42, 61, 62};
0110     int layerSize[9];
0111     for (int i = 0; i < 9; i++) {
0112       std::string s;
0113       if (layerId[i] > 9)
0114         s += char(layerId[i] / 10);
0115       s += char(layerId[i] % 10);
0116       node_iterator eit;
0117       node_iterator p(trie.node(s));
0118       layerSize[i] = std::distance(p, eit);
0119     }
0120 
0121     edm::LogInfo("TkDetLayers") << "------ Geometry constructed with: ------"
0122                                 << "\n"
0123                                 << "n pxlBarLayers: " << layerSize[0] << "\n"
0124                                 << "n tibLayers:    " << layerSize[1] << "\n"
0125                                 << "n tobLayers:    " << layerSize[2] << "\n"
0126                                 << "n negPxlFwdLayers: " << layerSize[3] << "\n"
0127                                 << "n posPxlFwdLayers: " << layerSize[4] << "\n"
0128                                 << "n negTidLayers: " << layerSize[5] << "\n"
0129                                 << "n posTidLayers: " << layerSize[6] << "\n"
0130                                 << "n negTecLayers: " << layerSize[7] << "\n"
0131                                 << "n posTecLayers: " << layerSize[8] << "\n";
0132 
0133     //      << "n barreLayers:  " << this->barrelLayers().size() << "\n"
0134     //<< "n negforwardLayers: " << this->negForwardLayers().size() << "\n"
0135     //<< "n posForwardLayers: " << this->posForwardLayers().size() ;
0136   } catch (edm::Exception const& ex) {
0137     std::cout << "in walking " << ex.what() << std::endl;
0138   }
0139 }
0140 
0141 // ------------ method called to produce the data  ------------
0142 void GeoHierarchy::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0143   edm::LogInfo("GeoHierarchy") << "begins";
0144 
0145   //first instance tracking geometry
0146   auto const& pDD = iSetup.getData(ddToken_);
0147   const TrackerTopology* tTopo = &iSetup.getData(ttopoToken_);
0148   //
0149   GeometricDet const* rDD = pDD.trackerDet();
0150   std::vector<const GeometricDet*> modules;
0151   (*rDD).deepComponents(modules);
0152 
0153   std::cout << "\nGeometricDet Hierarchy\n" << std::endl;
0154   constructAndDumpTrie(tTopo, modules.begin(), modules.end());
0155 
0156   std::cout << "\nGDet Hierarchy\n" << std::endl;
0157   constructAndDumpTrie(tTopo, pDD.dets().begin(), pDD.dets().end());
0158 }
0159 
0160 //define this as a plug-in
0161 DEFINE_FWK_MODULE(GeoHierarchy);