Back to home page

Project CMSSW displayed by LXR

 
 

    


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     // Fill SoA from HCAL rec hit
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   The ECALRecHitSoAProducer currently has no use, but is available via this
0085   module. In the case where ECAL PF Clustering is moved to Alpaka, we can then
0086   decide to use this converted solely for ECAL, or if the SoA is available
0087   we can switch to using just the ECAL RecHit SoA.
0088   */
0089 
0090   /*
0091   template <>
0092   void CaloRecHitSoAProducer<ECAL>::convertRecHit(reco::CaloRecHitHostCollection::View::element to,
0093                                                   const ECAL::CaloRecHitType& from) {
0094     // Fill SoA from ECAL rec hit
0095     to.detId() = from.id().rawId();
0096     to.energy() = from.energy();
0097     to.time() = from.time();
0098     to.flags() = from.flagsBits();
0099   }
0100   */
0101 
0102   using HCALRecHitSoAProducer = CaloRecHitSoAProducer<HCAL>;
0103 
0104   // Purposely commented out; see above.
0105   //using ECALRecHitSoAProducer = CaloRecHitSoAProducer<ECAL>;
0106 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
0107 
0108 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0109 DEFINE_FWK_ALPAKA_MODULE(HCALRecHitSoAProducer);
0110 //DEFINE_FWK_ALPAKA_MODULE(ECALRecHitSoAProducer);