File indexing completed on 2024-04-06 12:15:42
0001 #include <cassert>
0002
0003 #include "DataFormats/PortableTestObjects/interface/TestHostObject.h"
0004 #include "FWCore/Framework/interface/Event.h"
0005 #include "FWCore/Framework/interface/EventSetup.h"
0006 #include "FWCore/Framework/interface/Frameworkfwd.h"
0007 #include "FWCore/Framework/interface/global/EDAnalyzer.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0011 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0012 #include "FWCore/Utilities/interface/EDGetToken.h"
0013 #include "FWCore/Utilities/interface/InputTag.h"
0014
0015 class TestAlpakaObjectAnalyzer : public edm::global::EDAnalyzer<> {
0016 public:
0017 TestAlpakaObjectAnalyzer(edm::ParameterSet const& config)
0018 : source_{config.getParameter<edm::InputTag>("source")}, token_{consumes(source_)} {
0019 if (std::string const& eb = config.getParameter<std::string>("expectBackend"); not eb.empty()) {
0020 expectBackend_ = cms::alpakatools::toBackend(eb);
0021 backendToken_ = consumes(edm::InputTag(source_.label(), "backend", source_.process()));
0022 }
0023 }
0024
0025 void analyze(edm::StreamID sid, edm::Event const& event, edm::EventSetup const&) const override {
0026 portabletest::TestHostObject const& product = event.get(token_);
0027
0028 auto const& value = product.value();
0029 {
0030 edm::LogInfo msg("TestAlpakaObjectAnalyzer");
0031 msg << source_.encode() << ".data() at " << product.data() << '\n';
0032 msg << source_.encode() << ".buffer().data() at " << product.buffer().data() << '\n';
0033 msg << source_.encode() << ".value() = {\n";
0034 msg << " .x: " << value.x << '\n';
0035 msg << " .y: " << value.y << '\n';
0036 msg << " .z: " << value.z << '\n';
0037 msg << " .id: " << value.id << '\n';
0038 msg << "}\n";
0039 }
0040
0041
0042 assert(product.buffer().data() == product.data());
0043
0044
0045 assert(value.x == 5.);
0046 assert(value.y == 12.);
0047 assert(value.z == 13.);
0048 assert(value.id == 42);
0049
0050
0051 if (expectBackend_) {
0052 auto backend = static_cast<cms::alpakatools::Backend>(event.get(backendToken_));
0053 if (expectBackend_ != backend) {
0054 throw cms::Exception("Assert") << "Expected input backend " << cms::alpakatools::toString(*expectBackend_)
0055 << ", got " << cms::alpakatools::toString(backend);
0056 }
0057 }
0058 }
0059
0060 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0061 edm::ParameterSetDescription desc;
0062 desc.add<edm::InputTag>("source");
0063 desc.add<std::string>("expectBackend", "")
0064 ->setComment(
0065 "Expected backend of the input collection. Empty value means to not perform the check. Default: empty "
0066 "string");
0067 descriptions.addWithDefaultLabel(desc);
0068 }
0069
0070 private:
0071 const edm::InputTag source_;
0072 const edm::EDGetTokenT<portabletest::TestHostObject> token_;
0073 edm::EDGetTokenT<unsigned short> backendToken_;
0074 std::optional<cms::alpakatools::Backend> expectBackend_;
0075 };
0076
0077 #include "FWCore/Framework/interface/MakerMacros.h"
0078 DEFINE_FWK_MODULE(TestAlpakaObjectAnalyzer);