Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-02-05 03:15:14

0001 // Author: Izaak Neutelings (March 2024)
0002 // Based on: https://github.com/CMS-HGCAL/cmssw/blob/hgcal-condformat-HGCalNANO-13_2_0_pre3_linearity/RecoLocalCalo/HGCalRecAlgos/plugins/alpaka/HGCalRecHitProducer.cc
0003 #include "FWCore/Framework/interface/MakerMacros.h"
0004 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0006 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0008 #include "FWCore/Utilities/interface/InputTag.h"
0009 #include "FWCore/Utilities/interface/StreamID.h"
0010 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/stream/EDProducer.h"
0011 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDPutToken.h"
0012 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESGetToken.h"
0013 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/Event.h"
0014 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0015 #include "HeterogeneousCore/AlpakaInterface/interface/CopyToDevice.h"
0016 #include <iomanip>  // for std::setw
0017 #include <future>
0018 
0019 // includes for size, calibration, and configuration parameters
0020 #include "FWCore/Framework/interface/ESWatcher.h"
0021 #include "CondFormats/HGCalObjects/interface/HGCalConfiguration.h"
0022 #include "CondFormats/HGCalObjects/interface/HGCalMappingModuleIndexer.h"
0023 #include "CondFormats/DataRecord/interface/HGCalElectronicsMappingRcd.h"
0024 #include "CondFormats/DataRecord/interface/HGCalModuleConfigurationRcd.h"
0025 #include "CondFormats/HGCalObjects/interface/HGCalCalibrationParameterHost.h"
0026 #include "CondFormats/HGCalObjects/interface/alpaka/HGCalCalibrationParameterDevice.h"  // also for HGCalConfigParamDevice
0027 
0028 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0029 
0030   using namespace cms::alpakatools;
0031 
0032   class HGCalRecHitESProducersTest : public stream::EDProducer<> {
0033   public:
0034     explicit HGCalRecHitESProducersTest(const edm::ParameterSet&);
0035     static void fillDescriptions(edm::ConfigurationDescriptions&);
0036 
0037   private:
0038     void produce(device::Event&, device::EventSetup const&) override;
0039     void beginRun(edm::Run const&, edm::EventSetup const&) override;
0040     edm::ESWatcher<HGCalModuleConfigurationRcd> configWatcher_;
0041     edm::ESGetToken<HGCalMappingModuleIndexer, HGCalElectronicsMappingRcd> indexerToken_;
0042     edm::ESGetToken<HGCalConfiguration, HGCalModuleConfigurationRcd> configToken_;
0043     device::ESGetToken<hgcalrechit::HGCalConfigParamDevice, HGCalModuleConfigurationRcd> configParamToken_;
0044     device::ESGetToken<hgcalrechit::HGCalCalibParamDevice, HGCalModuleConfigurationRcd> calibParamToken_;
0045   };
0046 
0047   HGCalRecHitESProducersTest::HGCalRecHitESProducersTest(const edm::ParameterSet& iConfig) : EDProducer(iConfig) {
0048     std::cout << "HGCalRecHitESProducersTest::HGCalRecHitESProducersTest" << std::endl;
0049     indexerToken_ = esConsumes(iConfig.getParameter<edm::ESInputTag>("indexSource"));
0050     configToken_ = esConsumes(iConfig.getParameter<edm::ESInputTag>("configSource"));
0051     configParamToken_ = esConsumes(iConfig.getParameter<edm::ESInputTag>("configParamSource"));
0052     calibParamToken_ = esConsumes(iConfig.getParameter<edm::ESInputTag>("calibParamSource"));
0053   }
0054 
0055   void HGCalRecHitESProducersTest::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0056     edm::ParameterSetDescription desc;
0057     desc.add("indexSource", edm::ESInputTag{})->setComment("Label for module indexer to set SoA size");
0058     desc.add("configSource", edm::ESInputTag{})->setComment("Label for HGCal configuration for unpacking raw data");
0059     desc.add("configParamSource", edm::ESInputTag{})
0060         ->setComment("Label for ROC configuration parameters for calibrations");
0061     desc.add("calibParamSource", edm::ESInputTag{})->setComment("Label for calibration parameters");
0062     descriptions.addWithDefaultLabel(desc);
0063   }
0064 
0065   void HGCalRecHitESProducersTest::beginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) {
0066     std::cout << "HGCalRecHitESProducersTest::beginRun" << std::endl;
0067   }
0068 
0069   static std::string int2hex(int value) {
0070     std::stringstream stream;
0071     stream << "0x" << std::hex << value;
0072     return stream.str();
0073   }
0074 
0075   void HGCalRecHitESProducersTest::produce(device::Event& iEvent, device::EventSetup const& iSetup) {
0076     std::cout << "HGCalRecHitESProducersTest::produce" << std::endl;
0077     auto queue = iEvent.queue();
0078     auto const& moduleMap = iSetup.getData(indexerToken_);
0079     auto const& config = iSetup.getData(configToken_);  // HGCalConfiguration
0080     auto const& configParamDevice = iSetup.getData(configParamToken_);
0081     //printf("HGCalRecHitESProducersTest::produce: time to load configParamDevice from config ESProducers: %f seconds\n", duration(start,now()));
0082     auto const& calibParamDevice = iSetup.getData(calibParamToken_);
0083     //printf("HGCalRecHitESProducersTest::produce: time to load calibParamDevice from calib ESProducers: %f seconds\n", duration(start,now()));
0084 
0085     // Check if there are new conditions and read them
0086     if (configWatcher_.check(iSetup)) {
0087       std::cout << "HGCalRecHitESProducersTest::produce: moduleMap.getMaxDataSize()=" << moduleMap.getMaxDataSize()
0088                 << ", moduleMap.getMaxERxSize()=" << moduleMap.getMaxERxSize() << std::endl;
0089 
0090       // ESProducer for global HGCal configuration (structs) with header markers, etc.
0091       auto nfeds = config.feds.size();  // number of FEDs
0092       std::cout << "HGCalRecHitESProducersTest::produce: config=" << config << std::endl;
0093       std::cout << "HGCalRecHitESProducersTest::produce: nfeds=" << nfeds << ", config=" << config << std::endl;
0094       for (std::size_t fedid = 0; fedid < nfeds; ++fedid) {
0095         auto fed = config.feds[fedid];   // HGCalFedConfig
0096         auto nmods = fed.econds.size();  // number of ECON-Ds for this FED
0097         std::cout << "  fedid=" << fedid << ", nmods=" << nmods << ", passthroughMode=" << fed.mismatchPassthroughMode
0098                   << ", cbHeaderMarker=0x" << std::hex << fed.cbHeaderMarker << ", slinkHeaderMarker=0x"
0099                   << fed.slinkHeaderMarker << std::dec << std::endl;
0100         std::cout << "  modid  nrocs  headerMarker" << std::endl;
0101         for (std::size_t modid = 0; modid < nmods; ++modid) {
0102           auto mod = fed.econds[modid];
0103           auto nrocs = mod.rocs.size();  // number of ECON-Ds for this FED
0104           std::cout << std::setw(7) << modid << std::setw(7) << nrocs << std::setw(14) << int2hex(mod.headerMarker)
0105                     << std::endl;
0106         }
0107       }
0108 
0109       // Alpaka ESProducer for SoA with configuration parameters with gains
0110       int size = configParamDevice.view().metadata().size();
0111       std::cout << "HGCalRecHitESProducersTest::produce: device size=" << size << std::endl;
0112       std::cout << "  imod  gain" << std::endl;
0113       for (int imod = 0; imod < size; imod++) {
0114         if (imod >= 250)
0115           break;
0116         std::cout << std::setw(6) << imod << std::setw(6) << uint32_t(configParamDevice.view()[imod].gain())
0117                   << std::endl;
0118       }
0119 
0120       // Alpaka ESProducer for SoA with calibration parameters with pedestals, etc.
0121       size = calibParamDevice.view().metadata().size();
0122       std::cout << "HGCalRecHitESProducersTest::produce: device size=" << size << std::endl;
0123       std::cout << "   idx    hex     ADC_ped   CM_slope   CM_ped   BXm1_slope" << std::endl;
0124       for (int idx = 0; idx < size; idx++) {
0125         if (idx >= 250)
0126           break;
0127         std::cout << std::setw(6) << idx << std::setw(7) << int2hex(idx) << std::dec << std::setw(12)
0128                   << calibParamDevice.view()[idx].ADC_ped() << std::setw(11) << calibParamDevice.view()[idx].CM_slope()
0129                   << std::setw(9) << calibParamDevice.view()[idx].CM_ped() << std::setw(13)
0130                   << calibParamDevice.view()[idx].BXm1_slope() << std::endl;
0131       }
0132     }
0133   }
0134 
0135 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
0136 
0137 // define this as a plug-in
0138 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0139 DEFINE_FWK_ALPAKA_MODULE(HGCalRecHitESProducersTest);