CMS 3D CMS Logo

PFRecHitSoAProducer.cc
Go to the documentation of this file.
1 #include <utility>
2 #include <vector>
3 
4 #include <alpaka/alpaka.hpp>
5 
13 
14 #include "CalorimeterDefinitions.h"
15 #include "PFRecHitProducerKernel.h"
16 
18  using namespace particleFlowRecHitProducer;
19 
20  template <typename CAL>
22  public:
24  : topologyToken_(esConsumes(config.getParameter<edm::ESInputTag>("topology"))),
25  pfRecHitsToken_(produces()),
26  synchronise_(config.getUntrackedParameter<bool>("synchronise")) {
27  // Workaround until the ProductID problem in issue https://github.com/cms-sw/cmssw/issues/44643 is fixed
28 #ifdef ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED
29  producesTemporarily("edm::DeviceProduct<alpaka_cuda_async::reco::PFRecHitDeviceCollection>");
30 #endif
31 
32  const std::vector<edm::ParameterSet> producers = config.getParameter<std::vector<edm::ParameterSet>>("producers");
33  recHitsToken_.reserve(producers.size());
34  for (const edm::ParameterSet& producer : producers) {
35  recHitsToken_.emplace_back(consumes(producer.getParameter<edm::InputTag>("src")),
36  esConsumes(producer.getParameter<edm::ESInputTag>("params")));
37  }
38  }
39 
41  const typename CAL::TopologyTypeDevice& topology = setup.getData(topologyToken_);
42 
43  uint32_t num_recHits = 0;
44  for (const auto& token : recHitsToken_)
45  num_recHits += event.get(token.first)->metadata().size();
46 
47  reco::PFRecHitDeviceCollection pfRecHits{(int)num_recHits, event.queue()};
48 
49  if (num_recHits != 0) {
50  PFRecHitProducerKernel<CAL> kernel{event.queue(), num_recHits};
51  for (const auto& token : recHitsToken_)
52  kernel.processRecHits(
53  event.queue(), event.get(token.first), setup.getData(token.second), topology, pfRecHits);
54  kernel.associateTopologyInfo(event.queue(), topology, pfRecHits);
55  }
56 
57  if (synchronise_)
58  alpaka::wait(event.queue());
59 
60  event.emplace(pfRecHitsToken_, std::move(pfRecHits));
61  }
62 
63  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
66  producers.add<edm::InputTag>("src", edm::InputTag(""))->setComment("Input CaloRecHitSoA");
67  producers.add<edm::ESInputTag>("params", edm::ESInputTag(""))->setComment("Quality cut parameters");
68  std::vector<edm::ParameterSet> producersDefault(1);
69  producersDefault[0].addParameter<edm::InputTag>("src", edm::InputTag(""));
70  producersDefault[0].addParameter<edm::ESInputTag>("params", edm::ESInputTag(""));
71  desc.addVPSet("producers", producers, producersDefault)->setComment("List of inputs and quality cuts");
72  desc.add<edm::ESInputTag>("topology", edm::ESInputTag(""))->setComment("Topology information");
73  desc.addUntracked<bool>("synchronise", false)
74  ->setComment("Add synchronisation point after execution (for benchmarking asynchronous execution)");
75  descriptions.addWithDefaultLabel(desc);
76  }
77 
78  private:
80  std::vector<std::pair<device::EDGetToken<typename CAL::CaloRecHitSoATypeDevice>,
84  const bool synchronise_;
85  };
86 
89 } // namespace ALPAKA_ACCELERATOR_NAMESPACE
90 
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
Definition: config.py:1
PortableCollection<::reco::PFRecHitSoA > PFRecHitDeviceCollection
const device::EDPutToken< reco::PFRecHitDeviceCollection > pfRecHitsToken_
PFRecHitSoAProducer< HCAL > PFRecHitSoAProducerHCAL
void produce(edm::StreamID, device::Event &event, const device::EventSetup &setup) const override
const device::ESGetToken< typename CAL::TopologyTypeDevice, typename CAL::TopologyRecordType > topologyToken_
PFRecHitSoAProducer(edm::ParameterSet const &config)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
HLT enums.
void processRecHits(Queue &queue, const typename CAL::CaloRecHitSoATypeDevice &recHits, const typename CAL::ParameterType &params, const typename CAL::TopologyTypeDevice &topology, reco::PFRecHitDeviceCollection &pfRecHits)
#define DEFINE_FWK_ALPAKA_MODULE(name)
Definition: MakerMacros.h:16
std::vector< std::pair< device::EDGetToken< typename CAL::CaloRecHitSoATypeDevice >, device::ESGetToken< typename CAL::ParameterType, typename CAL::ParameterRecordType > > > recHitsToken_
def move(src, dest)
Definition: eostools.py:511
PFRecHitSoAProducer< ECAL > PFRecHitSoAProducerECAL
Definition: event.py:1