File indexing completed on 2025-07-10 23:57:04
0001 #include <memory>
0002 #include <optional>
0003 #include <stdexcept>
0004 #include <string>
0005 #include <utility>
0006 #include <vector>
0007
0008 #include "CalibTracker/Records/interface/SiPixelGainCalibrationForHLTSoARcd.h"
0009 #include "CalibTracker/Records/interface/SiPixelMappingSoARecord.h"
0010 #include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h"
0011 #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h"
0012 #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h"
0013 #include "CondFormats/SiPixelObjects/interface/alpaka/SiPixelGainCalibrationForHLTDevice.h"
0014 #include "CondFormats/SiPixelObjects/interface/alpaka/SiPixelMappingDevice.h"
0015 #include "CondFormats/SiPixelObjects/interface/alpaka/SiPixelMappingUtilities.h"
0016 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0017 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
0018 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0019 #include "DataFormats/SiPixelClusterSoA/interface/alpaka/SiPixelClustersSoACollection.h"
0020 #include "DataFormats/SiPixelDigiSoA/interface/alpaka/SiPixelDigiErrorsSoACollection.h"
0021 #include "DataFormats/SiPixelDigiSoA/interface/alpaka/SiPixelDigisSoACollection.h"
0022 #include "DataFormats/SiPixelRawData/interface/SiPixelFormatterErrors.h"
0023 #include "EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h"
0024 #include "EventFilter/SiPixelRawToDigi/interface/PixelUnpackingRegions.h"
0025 #include "FWCore/Framework/interface/ESWatcher.h"
0026 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0027 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0028 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0029 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0030 #include "FWCore/Utilities/interface/ESGetToken.h"
0031 #include "FWCore/Utilities/interface/InputTag.h"
0032 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDPutToken.h"
0033 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESGetToken.h"
0034 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/Event.h"
0035 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/stream/SynchronizingEDProducer.h"
0036 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0037 #include "RecoLocalTracker/SiPixelClusterizer/interface/SiPixelClusterThresholds.h"
0038
0039 #include "SiPixelRawToClusterKernel.h"
0040
0041 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0042
0043 template <typename TrackerTraits>
0044 class SiPixelRawToCluster : public stream::SynchronizingEDProducer<> {
0045 public:
0046 explicit SiPixelRawToCluster(const edm::ParameterSet& iConfig);
0047 ~SiPixelRawToCluster() override = default;
0048
0049 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0050 using Algo = pixelDetails::SiPixelRawToClusterKernel<TrackerTraits>;
0051
0052 private:
0053 void acquire(device::Event const& iEvent, device::EventSetup const& iSetup) override;
0054 void produce(device::Event& iEvent, device::EventSetup const& iSetup) override;
0055
0056 edm::EDGetTokenT<FEDRawDataCollection> rawGetToken_;
0057 edm::EDPutTokenT<SiPixelFormatterErrors> fmtErrorToken_;
0058 device::EDPutToken<SiPixelDigisSoACollection> digiPutToken_;
0059 device::EDPutToken<SiPixelDigiErrorsSoACollection> digiErrorPutToken_;
0060 device::EDPutToken<SiPixelClustersSoACollection> clusterPutToken_;
0061
0062 edm::ESWatcher<SiPixelFedCablingMapRcd> recordWatcher_;
0063 const device::ESGetToken<SiPixelMappingDevice, SiPixelMappingSoARecord> mapToken_;
0064 const device::ESGetToken<SiPixelGainCalibrationForHLTDevice, SiPixelGainCalibrationForHLTSoARcd> gainsToken_;
0065 const edm::ESGetToken<SiPixelFedCablingMap, SiPixelFedCablingMapRcd> cablingMapToken_;
0066
0067 std::unique_ptr<SiPixelFedCablingTree> cabling_;
0068 std::vector<unsigned int> fedIds_;
0069 const SiPixelFedCablingMap* cablingMap_ = nullptr;
0070 std::unique_ptr<PixelUnpackingRegions> regions_;
0071
0072 Algo Algo_;
0073 PixelDataFormatter::Errors errors_;
0074
0075 const bool includeErrors_;
0076 const bool useQuality_;
0077 const bool verbose_;
0078 uint32_t nDigis_;
0079 const SiPixelClusterThresholds clusterThresholds_;
0080 };
0081
0082 template <typename TrackerTraits>
0083 SiPixelRawToCluster<TrackerTraits>::SiPixelRawToCluster(const edm::ParameterSet& iConfig)
0084 : SynchronizingEDProducer(iConfig),
0085 rawGetToken_(consumes(iConfig.getParameter<edm::InputTag>("InputLabel"))),
0086 digiPutToken_(produces()),
0087 clusterPutToken_(produces()),
0088 mapToken_(esConsumes()),
0089 gainsToken_(esConsumes()),
0090 cablingMapToken_(esConsumes<SiPixelFedCablingMap, SiPixelFedCablingMapRcd>(
0091 edm::ESInputTag("", iConfig.getParameter<std::string>("CablingMapLabel")))),
0092 includeErrors_(iConfig.getParameter<bool>("IncludeErrors")),
0093 useQuality_(iConfig.getParameter<bool>("UseQualityInfo")),
0094 verbose_(iConfig.getParameter<bool>("verbose")),
0095 clusterThresholds_{iConfig.getParameter<int32_t>("clusterThreshold_layer1"),
0096 iConfig.getParameter<int32_t>("clusterThreshold_otherLayers"),
0097 static_cast<float>(iConfig.getParameter<double>("VCaltoElectronGain")),
0098 static_cast<float>(iConfig.getParameter<double>("VCaltoElectronGain_L1")),
0099 static_cast<float>(iConfig.getParameter<double>("VCaltoElectronOffset")),
0100 static_cast<float>(iConfig.getParameter<double>("VCaltoElectronOffset_L1"))} {
0101 if (includeErrors_) {
0102 digiErrorPutToken_ = produces();
0103 fmtErrorToken_ = produces();
0104 }
0105
0106
0107 if (!iConfig.getParameter<edm::ParameterSet>("Regions").getParameterNames().empty()) {
0108 regions_ = std::make_unique<PixelUnpackingRegions>(iConfig, consumesCollector());
0109 }
0110 }
0111
0112 template <typename TrackerTraits>
0113 void SiPixelRawToCluster<TrackerTraits>::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0114 edm::ParameterSetDescription desc;
0115 desc.add<bool>("IncludeErrors", true);
0116 desc.add<bool>("UseQualityInfo", false);
0117 desc.add<bool>("verbose", false)->setComment("verbose FED / ROC errors output");
0118
0119
0120 desc.addOptionalNode(edm::ParameterDescription<uint32_t>("MaxFEDWords", 0, true), false)
0121 ->setComment("This parameter is obsolete and will be ignored.");
0122 desc.add<int32_t>("clusterThreshold_layer1", pixelClustering::clusterThresholdLayerOne);
0123 desc.add<int32_t>("clusterThreshold_otherLayers", pixelClustering::clusterThresholdOtherLayers);
0124 desc.add<double>("VCaltoElectronGain", 47.f);
0125 desc.add<double>("VCaltoElectronGain_L1", 50.f);
0126 desc.add<double>("VCaltoElectronOffset", -60.f);
0127 desc.add<double>("VCaltoElectronOffset_L1", -670.f);
0128
0129 desc.add<edm::InputTag>("InputLabel", edm::InputTag("rawDataCollector"));
0130 {
0131 edm::ParameterSetDescription psd0;
0132 psd0.addOptional<std::vector<edm::InputTag>>("inputs");
0133 psd0.addOptional<std::vector<double>>("deltaPhi");
0134 psd0.addOptional<std::vector<double>>("maxZ");
0135 psd0.addOptional<edm::InputTag>("beamSpot");
0136 desc.add<edm::ParameterSetDescription>("Regions", psd0)
0137 ->setComment("## Empty Regions PSet means complete unpacking");
0138 }
0139 desc.add<std::string>("CablingMapLabel", "")->setComment("CablingMap label");
0140 descriptions.addWithDefaultLabel(desc);
0141 }
0142
0143 template <typename TrackerTraits>
0144 void SiPixelRawToCluster<TrackerTraits>::acquire(device::Event const& iEvent, device::EventSetup const& iSetup) {
0145 auto const& hMap = iSetup.getData(mapToken_);
0146 auto const& dGains = iSetup.getData(gainsToken_);
0147
0148
0149 if (recordWatcher_.check(iSetup)) {
0150
0151 cablingMap_ = &iSetup.getData(cablingMapToken_);
0152 fedIds_ = cablingMap_->fedIds();
0153 cabling_ = cablingMap_->cablingTree();
0154 LogDebug("map version:") << cablingMap_->version();
0155 }
0156
0157
0158 std::optional<cms::alpakatools::device_buffer<Device, unsigned char[]>> modulesToUnpackRegional;
0159 const unsigned char* modulesToUnpack;
0160 if (regions_) {
0161 regions_->run(iEvent, iSetup);
0162 LogDebug("SiPixelRawToCluster") << "region2unpack #feds: " << regions_->nFEDs();
0163 LogDebug("SiPixelRawToCluster") << "region2unpack #modules (BPIX,EPIX,total): " << regions_->nBarrelModules()
0164 << " " << regions_->nForwardModules() << " " << regions_->nModules();
0165
0166 modulesToUnpackRegional = SiPixelMappingUtilities::getModToUnpRegionalAsync(
0167 *(regions_->modulesToUnpack()), cabling_.get(), fedIds_, iEvent.queue());
0168 modulesToUnpack = modulesToUnpackRegional->data();
0169 } else {
0170 modulesToUnpack = hMap->modToUnpDefault();
0171 }
0172
0173 const auto& buffers = iEvent.get(rawGetToken_);
0174
0175 errors_.clear();
0176
0177
0178 unsigned int wordCounter = 0;
0179 unsigned int fedCounter = 0;
0180 bool errorsInEvent = false;
0181 std::vector<unsigned int> index(fedIds_.size(), 0);
0182 std::vector<cms_uint32_t const*> start(fedIds_.size(), nullptr);
0183 std::vector<ptrdiff_t> words(fedIds_.size(), 0);
0184
0185 ErrorChecker errorcheck;
0186 for (uint32_t i = 0; i < fedIds_.size(); ++i) {
0187 const int fedId = fedIds_[i];
0188 if (regions_ && !regions_->mayUnpackFED(fedId))
0189 continue;
0190
0191
0192
0193
0194 assert(fedId >= FEDNumbering::MINSiPixeluTCAFEDID);
0195 fedCounter++;
0196
0197
0198 const FEDRawData& rawData = buffers.FEDData(fedId);
0199
0200
0201 int nWords = rawData.size() / sizeof(cms_uint64_t);
0202 if (nWords == 0) {
0203 continue;
0204 }
0205
0206 const cms_uint64_t* trailer = reinterpret_cast<const cms_uint64_t*>(rawData.data()) + (nWords - 1);
0207 if (not errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors_)) {
0208 continue;
0209 }
0210
0211 const cms_uint64_t* header = reinterpret_cast<const cms_uint64_t*>(rawData.data());
0212 header--;
0213 bool moreHeaders = true;
0214 while (moreHeaders) {
0215 header++;
0216 bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors_);
0217 moreHeaders = headerStatus;
0218 }
0219
0220
0221 bool moreTrailers = true;
0222 trailer++;
0223 while (moreTrailers) {
0224 trailer--;
0225 bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors_);
0226 moreTrailers = trailerStatus;
0227 }
0228
0229 const cms_uint32_t* bw = (const cms_uint32_t*)(header + 1);
0230 const cms_uint32_t* ew = (const cms_uint32_t*)(trailer);
0231
0232 assert(0 == (ew - bw) % 2);
0233 index[i] = wordCounter;
0234 start[i] = bw;
0235 words[i] = (ew - bw);
0236 wordCounter += (ew - bw);
0237
0238 }
0239 nDigis_ = wordCounter;
0240 if (nDigis_ == 0)
0241 return;
0242
0243
0244 pixelDetails::WordFedAppender wordFedAppender(iEvent.queue(), nDigis_);
0245 for (uint32_t i = 0; i < fedIds_.size(); ++i) {
0246 wordFedAppender.initializeWordFed(fedIds_[i], index[i], start[i], words[i]);
0247 }
0248 Algo_.makePhase1ClustersAsync(iEvent.queue(),
0249 clusterThresholds_,
0250 hMap.const_view(),
0251 modulesToUnpack,
0252 dGains.const_view(),
0253 wordFedAppender,
0254 wordCounter,
0255 fedCounter,
0256 useQuality_,
0257 includeErrors_,
0258 verbose_);
0259 }
0260
0261 template <typename TrackerTraits>
0262 void SiPixelRawToCluster<TrackerTraits>::produce(device::Event& iEvent, device::EventSetup const& iSetup) {
0263 if (nDigis_ == 0) {
0264
0265
0266
0267
0268
0269
0270 iEvent.emplace(digiPutToken_, 0, iEvent.queue());
0271 iEvent.emplace(clusterPutToken_, pixelTopology::Phase1::numberOfModules, iEvent.queue());
0272 if (includeErrors_) {
0273 iEvent.emplace(digiErrorPutToken_, 0, iEvent.queue());
0274 iEvent.emplace(fmtErrorToken_);
0275 }
0276 return;
0277 }
0278
0279 iEvent.emplace(digiPutToken_, Algo_.getDigis());
0280 iEvent.emplace(clusterPutToken_, Algo_.getClusters());
0281 if (includeErrors_) {
0282 iEvent.emplace(digiErrorPutToken_, Algo_.getErrors());
0283 iEvent.emplace(fmtErrorToken_, std::move(errors_));
0284 }
0285 }
0286
0287 using SiPixelRawToClusterPhase1 = SiPixelRawToCluster<pixelTopology::Phase1>;
0288 using SiPixelRawToClusterHIonPhase1 = SiPixelRawToCluster<pixelTopology::HIonPhase1>;
0289
0290 }
0291
0292
0293 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0294 DEFINE_FWK_ALPAKA_MODULE(SiPixelRawToClusterPhase1);
0295 DEFINE_FWK_ALPAKA_MODULE(SiPixelRawToClusterHIonPhase1);