Back to home page

Project CMSSW displayed by LXR

 
 

    


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   /** Number of regions in eta,phi */
0033   uint32_t etadivisions_;
0034   uint32_t phidivisions_;
0035 
0036   /** Tracker extent in eta */
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   //here build an object of type SiStripRegionCabling using the information from class SiStripDetCabling **PLUS** the geometry.
0067 
0068   //Construct region cabling object
0069   auto RegionConnections = std::make_unique<SiStripRegionCabling>(etadivisions_, phidivisions_, etamax_);
0070 
0071   //Construct region cabling map
0072   SiStripRegionCabling::Cabling regioncabling(
0073       etadivisions_ * phidivisions_,
0074       SiStripRegionCabling::RegionCabling(
0075           SiStripRegionCabling::ALLSUBDETS,
0076           SiStripRegionCabling::WedgeCabling(SiStripRegionCabling::ALLLAYERS, SiStripRegionCabling::ElementCabling())));
0077 
0078   //Loop det cabling
0079   for (const auto& idet : detcabling.getDetCabling()) {
0080     if (!idet.first || (idet.first == sistrip::invalid32_))
0081       continue;
0082 
0083     // Check if geom det unit exists
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     //Calculate region from geometry
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     //Find subdet from det-id
0096     uint32_t subdet = static_cast<uint32_t>(SiStripRegionCabling::subdetFromDetId(idet.first));
0097 
0098     //Find layer from det-id
0099     uint32_t layer = tTopo.layer(idet.first);
0100 
0101     //@@ BELOW IS TEMP FIX TO HANDLE BUG IN DET CABLING
0102     const std::vector<const FedChannelConnection*>& conns = idet.second;
0103 
0104     //Update region cabling map
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   //Add map to region cabling object
0117   RegionConnections->setRegionCabling(regioncabling);
0118 
0119   return RegionConnections;
0120 }
0121 
0122 DEFINE_FWK_EVENTSETUP_MODULE(SiStripRegionConnectivity);