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