File indexing completed on 2025-01-21 01:39:26
0001 #include "FWCore/Framework/interface/ESProducer.h"
0002 #include "FWCore/Framework/interface/ModuleFactory.h"
0003 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0006 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0007 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
0008 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
0009 #include "CalibTracker/Records/interface/SiStripDetCablingRcd.h"
0010 #include "CalibTracker/Records/interface/SiStripRegionCablingRcd.h"
0011 #include "CalibFormats/SiStripObjects/interface/SiStripDetCabling.h"
0012 #include "CalibFormats/SiStripObjects/interface/SiStripRegionCabling.h"
0013 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
0014 #include "Geometry/Records/interface/TrackerTopologyRcd.h"
0015
0016 using namespace sistrip;
0017
0018 class SiStripRegionConnectivity : public edm::ESProducer {
0019 public:
0020 SiStripRegionConnectivity(const edm::ParameterSet&);
0021 ~SiStripRegionConnectivity() override = default;
0022
0023 std::unique_ptr<SiStripRegionCabling> produceRegionCabling(const SiStripRegionCablingRcd&);
0024
0025 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0026
0027 private:
0028 edm::ESGetToken<SiStripDetCabling, SiStripDetCablingRcd> detcablingToken_;
0029 edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> tkgeomToken_;
0030 edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> tTopoToken_;
0031
0032
0033 uint32_t etadivisions_;
0034 uint32_t phidivisions_;
0035
0036
0037 double etamax_;
0038 };
0039
0040 SiStripRegionConnectivity::SiStripRegionConnectivity(const edm::ParameterSet& pset)
0041 : etadivisions_(pset.getUntrackedParameter<unsigned int>("EtaDivisions", 10)),
0042 phidivisions_(pset.getUntrackedParameter<unsigned int>("PhiDivisions", 10)),
0043 etamax_(pset.getUntrackedParameter<double>("EtaMax", 2.4))
0044
0045 {
0046 auto cc = setWhatProduced(this, &SiStripRegionConnectivity::produceRegionCabling);
0047 detcablingToken_ = cc.consumes();
0048 tkgeomToken_ = cc.consumes();
0049 tTopoToken_ = cc.consumes();
0050 }
0051
0052 void SiStripRegionConnectivity::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0053 edm::ParameterSetDescription desc;
0054 desc.addUntracked<unsigned int>("EtaDivisions", 10);
0055 desc.addUntracked<unsigned int>("PhiDivisions", 10);
0056 desc.addUntracked<double>("EtaMax", 2.4);
0057 descriptions.addWithDefaultLabel(desc);
0058 }
0059
0060 std::unique_ptr<SiStripRegionCabling> SiStripRegionConnectivity::produceRegionCabling(
0061 const SiStripRegionCablingRcd& iRecord) {
0062 const auto& detcabling = iRecord.get(detcablingToken_);
0063 const auto& tkgeom = iRecord.get(tkgeomToken_);
0064 const auto& tTopo = iRecord.get(tTopoToken_);
0065
0066
0067
0068
0069 auto RegionConnections = std::make_unique<SiStripRegionCabling>(etadivisions_, phidivisions_, etamax_);
0070
0071
0072 SiStripRegionCabling::Cabling regioncabling(
0073 etadivisions_ * phidivisions_,
0074 SiStripRegionCabling::RegionCabling(
0075 SiStripRegionCabling::ALLSUBDETS,
0076 SiStripRegionCabling::WedgeCabling(SiStripRegionCabling::ALLLAYERS, SiStripRegionCabling::ElementCabling())));
0077
0078
0079 for (const auto& idet : detcabling.getDetCabling()) {
0080 if (!idet.first || (idet.first == sistrip::invalid32_))
0081 continue;
0082
0083
0084 auto geom_det = tkgeom.idToDetUnit(DetId(idet.first));
0085 auto strip_det = dynamic_cast<StripGeomDetUnit const*>(geom_det);
0086 if (!strip_det) {
0087 continue;
0088 }
0089
0090
0091 double eta = tkgeom.idToDet(DetId(idet.first))->position().eta();
0092 double phi = tkgeom.idToDet(DetId(idet.first))->position().phi().value();
0093 uint32_t reg = RegionConnections->region(SiStripRegionCabling::Position(eta, phi));
0094
0095
0096 uint32_t subdet = static_cast<uint32_t>(SiStripRegionCabling::subdetFromDetId(idet.first));
0097
0098
0099 uint32_t layer = tTopo.layer(idet.first);
0100
0101
0102 const std::vector<const FedChannelConnection*>& conns = idet.second;
0103
0104
0105 regioncabling[reg][subdet][layer].push_back(SiStripRegionCabling::Element());
0106 auto& elem = regioncabling[reg][subdet][layer].back();
0107 elem.first = idet.first;
0108 elem.second.resize(conns.size());
0109 for (const auto& iconn : conns) {
0110 if ((iconn != nullptr) && (iconn->apvPairNumber() < conns.size())) {
0111 elem.second[iconn->apvPairNumber()] = *iconn;
0112 }
0113 }
0114 }
0115
0116
0117 RegionConnections->setRegionCabling(regioncabling);
0118
0119 return RegionConnections;
0120 }
0121
0122 DEFINE_FWK_EVENTSETUP_MODULE(SiStripRegionConnectivity);