Back to home page

Project CMSSW displayed by LXR

 
 

    


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     // check that the product data is held in the product buffer
0042     assert(product.buffer().data() == product.data());
0043 
0044     // check that the product content is as expected
0045     assert(value.x == 5.);
0046     assert(value.y == 12.);
0047     assert(value.z == 13.);
0048     assert(value.id == 42);
0049 
0050     // check that the backend is as expected
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);