Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:26:19

0001 // C++ includes
0002 #include <memory>
0003 #include <string>
0004 #include <vector>
0005 
0006 // CMSSW includes
0007 #include "CUDADataFormats/Common/interface/Product.h"
0008 #include "CUDADataFormats/SiPixelCluster/interface/SiPixelClustersCUDA.h"
0009 #include "CUDADataFormats/SiPixelCluster/interface/gpuClusteringConstants.h"
0010 #include "CUDADataFormats/SiPixelDigi/interface/SiPixelDigiErrorsCUDA.h"
0011 #include "CUDADataFormats/SiPixelDigi/interface/SiPixelDigisCUDA.h"
0012 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0013 #include "EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h"
0014 #include "EventFilter/SiPixelRawToDigi/interface/PixelUnpackingRegions.h"
0015 #include "FWCore/Framework/interface/ConsumesCollector.h"
0016 #include "FWCore/Framework/interface/Event.h"
0017 #include "FWCore/Framework/interface/EventSetup.h"
0018 #include "FWCore/Framework/interface/stream/EDProducer.h"
0019 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0020 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0021 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0022 #include "HeterogeneousCore/CUDACore/interface/ScopedContext.h"
0023 #include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelClusterThresholds.h"
0024 
0025 // local includes
0026 #include "SiPixelRawToClusterGPUKernel.h"
0027 
0028 class SiPixelPhase2DigiToClusterCUDA : public edm::stream::EDProducer<edm::ExternalWork> {
0029 public:
0030   explicit SiPixelPhase2DigiToClusterCUDA(const edm::ParameterSet& iConfig);
0031   ~SiPixelPhase2DigiToClusterCUDA() override = default;
0032 
0033   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0034   using GPUAlgo = pixelgpudetails::SiPixelRawToClusterGPUKernel<pixelTopology::Phase2>;
0035 
0036 private:
0037   void acquire(const edm::Event& iEvent,
0038                const edm::EventSetup& iSetup,
0039                edm::WaitingTaskWithArenaHolder waitingTaskHolder) override;
0040   void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0041 
0042   const edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> geomToken_;
0043   const edm::EDGetTokenT<edm::DetSetVector<PixelDigi>> pixelDigiToken_;
0044 
0045   edm::EDPutTokenT<cms::cuda::Product<SiPixelDigisCUDA>> digiPutToken_;
0046   edm::EDPutTokenT<cms::cuda::Product<SiPixelDigiErrorsCUDA>> digiErrorPutToken_;
0047   edm::EDPutTokenT<cms::cuda::Product<SiPixelClustersCUDA>> clusterPutToken_;
0048 
0049   cms::cuda::ContextState ctxState_;
0050 
0051   GPUAlgo gpuAlgo_;
0052 
0053   const bool includeErrors_;
0054   const SiPixelClusterThresholds clusterThresholds_;
0055   uint32_t nDigis_;
0056 };
0057 
0058 SiPixelPhase2DigiToClusterCUDA::SiPixelPhase2DigiToClusterCUDA(const edm::ParameterSet& iConfig)
0059     : geomToken_(esConsumes()),
0060       pixelDigiToken_(consumes<edm::DetSetVector<PixelDigi>>(iConfig.getParameter<edm::InputTag>("InputDigis"))),
0061       digiPutToken_(produces<cms::cuda::Product<SiPixelDigisCUDA>>()),
0062       clusterPutToken_(produces<cms::cuda::Product<SiPixelClustersCUDA>>()),
0063       includeErrors_(iConfig.getParameter<bool>("IncludeErrors")),
0064       clusterThresholds_{iConfig.getParameter<int32_t>("clusterThreshold_layer1"),
0065                          iConfig.getParameter<int32_t>("clusterThreshold_otherLayers"),
0066                          static_cast<float>(iConfig.getParameter<double>("ElectronPerADCGain")),
0067                          static_cast<int8_t>(iConfig.getParameter<int>("Phase2ReadoutMode")),
0068                          static_cast<uint16_t>(iConfig.getParameter<uint32_t>("Phase2DigiBaseline")),
0069                          static_cast<uint8_t>(iConfig.getParameter<uint32_t>("Phase2KinkADC"))} {
0070   if (includeErrors_) {
0071     digiErrorPutToken_ = produces<cms::cuda::Product<SiPixelDigiErrorsCUDA>>();
0072   }
0073 }
0074 
0075 void SiPixelPhase2DigiToClusterCUDA::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0076   edm::ParameterSetDescription desc;
0077 
0078   desc.add<bool>("IncludeErrors", true);
0079   desc.add<int32_t>("clusterThreshold_layer1", 4000);
0080   desc.add<int32_t>("clusterThreshold_otherLayers", 4000);
0081   desc.add<double>("ElectronPerADCGain", 1500);
0082   desc.add<int32_t>("Phase2ReadoutMode", 3);
0083   desc.add<uint32_t>("Phase2DigiBaseline", 1000);
0084   desc.add<uint32_t>("Phase2KinkADC", 8);
0085   desc.add<edm::InputTag>("InputDigis", edm::InputTag("simSiPixelDigis:Pixel"));
0086   descriptions.addWithDefaultLabel(desc);
0087 }
0088 
0089 void SiPixelPhase2DigiToClusterCUDA::acquire(const edm::Event& iEvent,
0090                                              const edm::EventSetup& iSetup,
0091                                              edm::WaitingTaskWithArenaHolder waitingTaskHolder) {
0092   cms::cuda::ScopedContextAcquire ctx{iEvent.streamID(), std::move(waitingTaskHolder), ctxState_};
0093 
0094   auto const& input = iEvent.get(pixelDigiToken_);
0095 
0096   const TrackerGeometry* geom_ = &iSetup.getData(geomToken_);
0097 
0098   nDigis_ = 0;
0099 
0100   auto xDigis = cms::cuda::make_host_unique<uint16_t[]>(gpuClustering::maxNumDigis, ctx.stream());
0101   auto yDigis = cms::cuda::make_host_unique<uint16_t[]>(gpuClustering::maxNumDigis, ctx.stream());
0102   auto adcDigis = cms::cuda::make_host_unique<uint16_t[]>(gpuClustering::maxNumDigis, ctx.stream());
0103   auto moduleIds = cms::cuda::make_host_unique<uint16_t[]>(gpuClustering::maxNumDigis, ctx.stream());
0104   auto packedData = cms::cuda::make_host_unique<uint32_t[]>(gpuClustering::maxNumDigis, ctx.stream());
0105   auto rawIds = cms::cuda::make_host_unique<uint32_t[]>(gpuClustering::maxNumDigis, ctx.stream());
0106 
0107   for (auto DSViter = input.begin(); DSViter != input.end(); DSViter++) {
0108     unsigned int detid = DSViter->detId();
0109     DetId detIdObject(detid);
0110     const GeomDetUnit* genericDet = geom_->idToDetUnit(detIdObject);
0111     auto const gind = genericDet->index();
0112     for (auto const& px : *DSViter) {
0113       moduleIds[nDigis_] = uint16_t(gind);
0114 
0115       xDigis[nDigis_] = uint16_t(px.row());
0116       yDigis[nDigis_] = uint16_t(px.column());
0117       adcDigis[nDigis_] = uint16_t(px.adc());
0118 
0119       packedData[nDigis_] = uint32_t(px.packedData());
0120 
0121       rawIds[nDigis_] = uint32_t(detid);
0122 
0123       nDigis_++;
0124     }
0125   }
0126 
0127   if (nDigis_ == 0)
0128     return;
0129 
0130   gpuAlgo_.makePhase2ClustersAsync(clusterThresholds_,
0131                                    moduleIds.get(),
0132                                    xDigis.get(),
0133                                    yDigis.get(),
0134                                    adcDigis.get(),
0135                                    packedData.get(),
0136                                    rawIds.get(),
0137                                    nDigis_,
0138                                    ctx.stream());
0139 }
0140 
0141 void SiPixelPhase2DigiToClusterCUDA::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0142   cms::cuda::ScopedContextProduce ctx{ctxState_};
0143 
0144   if (nDigis_ == 0) {
0145     ctx.emplace(iEvent, digiPutToken_, nDigis_, ctx.stream());
0146     ctx.emplace(iEvent, clusterPutToken_, pixelTopology::Phase2::numberOfModules, ctx.stream());
0147     if (includeErrors_) {
0148       ctx.emplace(iEvent, digiErrorPutToken_, SiPixelDigiErrorsCUDA{});
0149     }
0150     return;
0151   }
0152 
0153   auto tmp = gpuAlgo_.getResults();
0154   ctx.emplace(iEvent, digiPutToken_, std::move(tmp.first));
0155   ctx.emplace(iEvent, clusterPutToken_, std::move(tmp.second));
0156   if (includeErrors_) {
0157     ctx.emplace(iEvent, digiErrorPutToken_, gpuAlgo_.getErrors());
0158   }
0159 }
0160 
0161 // define as framework plugin
0162 #include "FWCore/Framework/interface/MakerMacros.h"
0163 DEFINE_FWK_MODULE(SiPixelPhase2DigiToClusterCUDA);