File indexing completed on 2025-02-05 03:15:17
0001 #include <alpaka/alpaka.hpp>
0002
0003 #include "Geometry/CommonTopologies/interface/SimplePixelTopology.h"
0004 #include "FWCore/Framework/interface/Frameworkfwd.h"
0005 #include "FWCore/Utilities/interface/StreamID.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/InputTag.h"
0010 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDPutToken.h"
0011 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESGetToken.h"
0012 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0013 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/Event.h"
0014 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EventSetup.h"
0015 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/global/EDProducer.h"
0016
0017 #include "DataFormats/TrackSoA/interface/alpaka/TracksSoACollection.h"
0018 #include "DataFormats/TrackSoA/interface/TracksDevice.h"
0019 #include "DataFormats/VertexSoA/interface/alpaka/ZVertexSoACollection.h"
0020 #include "DataFormats/VertexSoA/interface/ZVertexDevice.h"
0021 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0022
0023 #include "vertexFinder.h"
0024
0025 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0026
0027 using namespace cms::alpakatools;
0028
0029 template <typename TrackerTraits>
0030 class PixelVertexProducerAlpaka : public global::EDProducer<> {
0031 using TkSoADevice = TracksSoACollection<TrackerTraits>;
0032 using Algo = vertexFinder::Producer<TrackerTraits>;
0033
0034 public:
0035 explicit PixelVertexProducerAlpaka(const edm::ParameterSet& iConfig);
0036 ~PixelVertexProducerAlpaka() override = default;
0037
0038 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0039
0040 private:
0041 void produce(edm::StreamID streamID, device::Event& iEvent, const device::EventSetup& iSetup) const override;
0042
0043 const Algo algo_;
0044
0045
0046 const int maxVertices_;
0047
0048
0049 const float ptMin_;
0050 const float ptMax_;
0051
0052 device::EDGetToken<TkSoADevice> tokenDeviceTrack_;
0053 device::EDPutToken<ZVertexSoACollection> tokenDeviceVertex_;
0054 };
0055
0056 template <typename TrackerTraits>
0057 PixelVertexProducerAlpaka<TrackerTraits>::PixelVertexProducerAlpaka(const edm::ParameterSet& conf)
0058 : EDProducer(conf),
0059 algo_(conf.getParameter<bool>("oneKernel"),
0060 conf.getParameter<bool>("useDensity"),
0061 conf.getParameter<bool>("useDBSCAN"),
0062 conf.getParameter<bool>("useIterative"),
0063 conf.getParameter<bool>("doSplitting"),
0064 conf.getParameter<int>("minT"),
0065 conf.getParameter<double>("eps"),
0066 conf.getParameter<double>("errmax"),
0067 conf.getParameter<double>("chi2max")),
0068 maxVertices_(conf.getParameter<int>("maxVertices")),
0069 ptMin_(conf.getParameter<double>("PtMin")),
0070 ptMax_(conf.getParameter<double>("PtMax")),
0071 tokenDeviceTrack_(consumes(conf.getParameter<edm::InputTag>("pixelTrackSrc"))),
0072 tokenDeviceVertex_(produces()) {}
0073
0074 template <typename TrackerTraits>
0075 void PixelVertexProducerAlpaka<TrackerTraits>::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0076 edm::ParameterSetDescription desc;
0077
0078
0079
0080 desc.add<bool>("oneKernel", true);
0081 desc.add<bool>("useDensity", true);
0082 desc.add<bool>("useDBSCAN", false);
0083 desc.add<bool>("useIterative", false);
0084 desc.add<bool>("doSplitting", true);
0085
0086 desc.add<int>("minT", 2);
0087 desc.add<double>("eps", 0.07);
0088 desc.add<double>("errmax", 0.01);
0089 desc.add<double>("chi2max", 9.);
0090
0091 desc.add<int>("maxVertices", 256);
0092 desc.add<double>("PtMin", 0.5);
0093 desc.add<double>("PtMax", 75.);
0094 desc.add<edm::InputTag>("pixelTrackSrc", edm::InputTag("pixelTracksAlpaka"));
0095
0096 descriptions.addWithDefaultLabel(desc);
0097 }
0098
0099 template <typename TrackerTraits>
0100 void PixelVertexProducerAlpaka<TrackerTraits>::produce(edm::StreamID streamID,
0101 device::Event& iEvent,
0102 const device::EventSetup& iSetup) const {
0103 auto const& hTracks = iEvent.get(tokenDeviceTrack_);
0104
0105 iEvent.emplace(tokenDeviceVertex_, algo_.makeAsync(iEvent.queue(), hTracks.view(), maxVertices_, ptMin_, ptMax_));
0106 }
0107
0108 using PixelVertexProducerAlpakaPhase1 = PixelVertexProducerAlpaka<pixelTopology::Phase1>;
0109 using PixelVertexProducerAlpakaPhase2 = PixelVertexProducerAlpaka<pixelTopology::Phase2>;
0110 using PixelVertexProducerAlpakaHIonPhase1 = PixelVertexProducerAlpaka<pixelTopology::HIonPhase1>;
0111
0112 }
0113
0114 DEFINE_FWK_ALPAKA_MODULE(PixelVertexProducerAlpakaPhase1);
0115 DEFINE_FWK_ALPAKA_MODULE(PixelVertexProducerAlpakaPhase2);
0116 DEFINE_FWK_ALPAKA_MODULE(PixelVertexProducerAlpakaHIonPhase1);