File indexing completed on 2025-02-05 03:14:57
0001 #include "CondFormats/DataRecord/interface/EcalMappingElectronicsRcd.h"
0002 #include "CondFormats/EcalObjects/interface/alpaka/EcalElectronicsMappingDevice.h"
0003 #include "DataFormats/EcalDigi/interface/alpaka/EcalDigiDeviceCollection.h"
0004 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0005 #include "EventFilter/EcalRawToDigi/interface/DCCRawDataDefinitions.h"
0006 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0009 #include "FWCore/Utilities/interface/ESGetToken.h"
0010 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDGetToken.h"
0011 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDPutToken.h"
0012 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/Event.h"
0013 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EventSetup.h"
0014 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/stream/EDProducer.h"
0015
0016 #include <alpaka/alpaka.hpp>
0017
0018 #include "DeclsForKernels.h"
0019 #include "UnpackPortable.h"
0020
0021 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0022
0023 class EcalRawToDigiPortable : public stream::EDProducer<> {
0024 public:
0025 explicit EcalRawToDigiPortable(edm::ParameterSet const& ps);
0026 ~EcalRawToDigiPortable() override = default;
0027 static void fillDescriptions(edm::ConfigurationDescriptions&);
0028
0029 void produce(device::Event&, device::EventSetup const&) override;
0030
0031 private:
0032 edm::EDGetTokenT<FEDRawDataCollection> rawDataToken_;
0033 using OutputProduct = EcalDigiDeviceCollection;
0034 device::EDPutToken<OutputProduct> digisDevEBToken_;
0035 device::EDPutToken<OutputProduct> digisDevEEToken_;
0036 device::ESGetToken<EcalElectronicsMappingDevice, EcalMappingElectronicsRcd> eMappingToken_;
0037
0038 std::vector<int> fedsToUnpack_;
0039
0040 ecal::raw::ConfigurationParameters config_;
0041 };
0042
0043 void EcalRawToDigiPortable::fillDescriptions(edm::ConfigurationDescriptions& confDesc) {
0044 edm::ParameterSetDescription desc;
0045
0046 desc.add<edm::InputTag>("InputLabel", edm::InputTag("rawDataCollector"));
0047 std::vector<int> feds(54);
0048 for (uint32_t i = 0; i < 54; ++i)
0049 feds[i] = i + 601;
0050 desc.add<std::vector<int>>("FEDs", feds);
0051 desc.add<uint32_t>("maxChannelsEB", 61200);
0052 desc.add<uint32_t>("maxChannelsEE", 14648);
0053 desc.add<std::string>("digisLabelEB", "ebDigis");
0054 desc.add<std::string>("digisLabelEE", "eeDigis");
0055
0056 confDesc.addWithDefaultLabel(desc);
0057 }
0058
0059 EcalRawToDigiPortable::EcalRawToDigiPortable(const edm::ParameterSet& ps)
0060 : EDProducer(ps),
0061 rawDataToken_{consumes<FEDRawDataCollection>(ps.getParameter<edm::InputTag>("InputLabel"))},
0062 digisDevEBToken_{produces(ps.getParameter<std::string>("digisLabelEB"))},
0063 digisDevEEToken_{produces(ps.getParameter<std::string>("digisLabelEE"))},
0064 eMappingToken_{esConsumes()},
0065 fedsToUnpack_{ps.getParameter<std::vector<int>>("FEDs")} {
0066 config_.maxChannelsEB = ps.getParameter<uint32_t>("maxChannelsEB");
0067 config_.maxChannelsEE = ps.getParameter<uint32_t>("maxChannelsEE");
0068 }
0069
0070 void EcalRawToDigiPortable::produce(device::Event& event, device::EventSetup const& setup) {
0071
0072 auto const& eMappingProduct = setup.getData(eMappingToken_);
0073
0074
0075 const auto rawDataHandle = event.getHandle(rawDataToken_);
0076
0077
0078 uint32_t size = 0;
0079 uint32_t feds = 0;
0080 for (auto const& fed : fedsToUnpack_) {
0081 auto const& data = rawDataHandle->FEDData(fed);
0082 auto const nbytes = data.size();
0083
0084
0085 if (nbytes < globalFieds::EMPTYEVENTSIZE)
0086 continue;
0087
0088 size += nbytes;
0089 ++feds;
0090 }
0091
0092 auto& queue = event.queue();
0093
0094
0095 ecal::raw::InputDataHost inputHost(queue, size, feds);
0096
0097
0098 OutputProduct digisDevEB{static_cast<int32_t>(config_.maxChannelsEB), queue};
0099 OutputProduct digisDevEE{static_cast<int32_t>(config_.maxChannelsEE), queue};
0100
0101
0102 auto digiViewEB = cms::alpakatools::make_device_view<uint32_t>(queue, digisDevEB.view().size());
0103 auto digiViewEE = cms::alpakatools::make_device_view<uint32_t>(queue, digisDevEE.view().size());
0104 alpaka::memset(queue, digiViewEB, 0);
0105 alpaka::memset(queue, digiViewEE, 0);
0106
0107
0108 uint32_t currentCummOffset = 0;
0109 uint32_t fedCounter = 0;
0110 for (auto const& fed : fedsToUnpack_) {
0111 auto const& data = rawDataHandle->FEDData(fed);
0112 auto const nbytes = data.size();
0113
0114
0115 if (nbytes < globalFieds::EMPTYEVENTSIZE)
0116 continue;
0117
0118
0119 std::memcpy(inputHost.data.data() + currentCummOffset, data.data(), nbytes);
0120
0121 inputHost.offsets[fedCounter] = currentCummOffset;
0122 inputHost.feds[fedCounter] = fed;
0123
0124
0125 currentCummOffset += nbytes;
0126 ++fedCounter;
0127 }
0128 assert(currentCummOffset == size);
0129 assert(fedCounter == feds);
0130
0131
0132 if (fedCounter > 0) {
0133 ecal::raw::unpackRaw(queue, inputHost, digisDevEB, digisDevEE, eMappingProduct, fedCounter, currentCummOffset);
0134 }
0135
0136 event.emplace(digisDevEBToken_, std::move(digisDevEB));
0137 event.emplace(digisDevEEToken_, std::move(digisDevEE));
0138 }
0139
0140 }
0141
0142 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0143 DEFINE_FWK_ALPAKA_MODULE(EcalRawToDigiPortable);