File indexing completed on 2024-04-06 12:26:19
0001
0002 #include <memory>
0003 #include <string>
0004 #include <vector>
0005
0006
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
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
0162 #include "FWCore/Framework/interface/MakerMacros.h"
0163 DEFINE_FWK_MODULE(SiPixelPhase2DigiToClusterCUDA);