File indexing completed on 2025-02-05 03:15:16
0001 #include <utility>
0002
0003 #include <alpaka/alpaka.hpp>
0004
0005 #include "DataFormats/Common/interface/SortedCollection.h"
0006 #include "DataFormats/ParticleFlowReco/interface/CaloRecHitHostCollection.h"
0007 #include "DataFormats/ParticleFlowReco/interface/alpaka/CaloRecHitDeviceCollection.h"
0008 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0011 #include "FWCore/Utilities/interface/EDGetToken.h"
0012 #include "FWCore/Utilities/interface/InputTag.h"
0013 #include "FWCore/Utilities/interface/StreamID.h"
0014 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/global/EDProducer.h"
0015 #include "CalorimeterDefinitions.h"
0016
0017 #include "DataFormats/HcalRecHit/interface/HcalRecHitHostCollection.h"
0018 #include "DataFormats/HcalRecHit/interface/alpaka/HcalRecHitDeviceCollection.h"
0019
0020 #define DEBUG false
0021
0022 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0023 using namespace particleFlowRecHitProducer;
0024
0025 template <typename CAL>
0026 class CaloRecHitSoAProducer : public global::EDProducer<> {
0027 public:
0028 CaloRecHitSoAProducer(edm::ParameterSet const& config)
0029 : EDProducer(config),
0030 recHitsToken_(consumes(config.getParameter<edm::InputTag>("src"))),
0031 deviceToken_(produces()),
0032 synchronise_(config.getUntrackedParameter<bool>("synchronise")) {}
0033
0034 void produce(edm::StreamID sid, device::Event& event, device::EventSetup const&) const override {
0035 const edm::SortedCollection<typename CAL::CaloRecHitType>& recHits = event.get(recHitsToken_);
0036 const int32_t num_recHits = recHits.size();
0037 if (DEBUG)
0038 printf("Found %d recHits\n", num_recHits);
0039
0040 hcal::RecHitHostCollection hostProduct{num_recHits, event.queue()};
0041 auto& view = hostProduct.view();
0042
0043 for (int i = 0; i < num_recHits; i++) {
0044 convertRecHit(view[i], recHits[i]);
0045
0046 if (DEBUG && i < 10)
0047 printf("recHit %4d %u %f %f\n", i, view.detId(i), view.energy(i), view.timeM0(i));
0048 }
0049
0050 hcal::RecHitDeviceCollection deviceProduct{num_recHits, event.queue()};
0051 alpaka::memcpy(event.queue(), deviceProduct.buffer(), hostProduct.buffer());
0052 if (synchronise_)
0053 alpaka::wait(event.queue());
0054 event.emplace(deviceToken_, std::move(deviceProduct));
0055 }
0056
0057 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0058 edm::ParameterSetDescription desc;
0059 desc.add<edm::InputTag>("src", edm::InputTag(""))->setComment("Input calorimeter rec hit collection");
0060 desc.addUntracked<bool>("synchronise", false)
0061 ->setComment("Add synchronisation point after execution (for benchmarking asynchronous execution)");
0062 descriptions.addWithDefaultLabel(desc);
0063 }
0064
0065 private:
0066 const edm::EDGetTokenT<edm::SortedCollection<typename CAL::CaloRecHitType>> recHitsToken_;
0067 const device::EDPutToken<hcal::RecHitDeviceCollection> deviceToken_;
0068 const bool synchronise_;
0069
0070 static void convertRecHit(hcal::RecHitHostCollection::View::element to, const typename CAL::CaloRecHitType& from);
0071 };
0072
0073 template <>
0074 void CaloRecHitSoAProducer<HCAL>::convertRecHit(hcal::RecHitHostCollection::View::element to,
0075 const HCAL::CaloRecHitType& from) {
0076
0077 to.detId() = from.id().rawId();
0078 to.chi2() = from.chi2();
0079 to.energy() = from.energy();
0080 to.timeM0() = from.time();
0081 }
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102 using HCALRecHitSoAProducer = CaloRecHitSoAProducer<HCAL>;
0103
0104
0105
0106 }
0107
0108 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0109 DEFINE_FWK_ALPAKA_MODULE(HCALRecHitSoAProducer);
0110