File indexing completed on 2024-04-06 12:15:27
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #include <memory>
0018
0019
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
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
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;
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
0134
0135
0136 } catch (edm::Exception const& ex) {
0137 std::cout << "in walking " << ex.what() << std::endl;
0138 }
0139 }
0140
0141
0142 void GeoHierarchy::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0143 edm::LogInfo("GeoHierarchy") << "begins";
0144
0145
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
0161 DEFINE_FWK_MODULE(GeoHierarchy);