Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-05-27 01:56:30

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 
0004 // includes for CMSSW
0005 #include "FWCore/Framework/interface/MakerMacros.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/MessageLogger/interface/MessageLogger.h"
0010 #include "FWCore/Utilities/interface/InputTag.h"
0011 
0012 // includes for Alpaka
0013 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/stream/EDProducer.h"
0014 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDPutToken.h"
0015 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESGetToken.h"
0016 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/Event.h"
0017 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0018 
0019 // includes for HGCal, 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"
0027 #include "RecoLocalCalo/HGCalRecAlgos/interface/HGCalESProducerTools.h"  // for json, search_fedkey
0028 
0029 // standard includes
0030 #include <string>
0031 #include <vector>
0032 #include <iomanip>  // for std::setw
0033 
0034 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0035 
0036   using namespace cms::alpakatools;
0037 
0038   class HGCalRecHitESProducersTest : public stream::EDProducer<> {
0039   public:
0040     explicit HGCalRecHitESProducersTest(const edm::ParameterSet&);
0041     static void fillDescriptions(edm::ConfigurationDescriptions&);
0042 
0043   private:
0044     const int maxchans_, maxfeds_;
0045     const std::string fedjson_;  // JSON file of FED configuration
0046     void produce(device::Event&, device::EventSetup const&) override;
0047     void beginRun(edm::Run const&, edm::EventSetup const&) override;
0048     edm::ESWatcher<HGCalModuleConfigurationRcd> configWatcher_;
0049     edm::ESGetToken<HGCalMappingModuleIndexer, HGCalElectronicsMappingRcd> indexerToken_;
0050     edm::ESGetToken<HGCalConfiguration, HGCalModuleConfigurationRcd> configToken_;
0051     device::ESGetToken<hgcalrechit::HGCalCalibParamDevice, HGCalModuleConfigurationRcd> calibParamToken_;
0052   };
0053 
0054   HGCalRecHitESProducersTest::HGCalRecHitESProducersTest(const edm::ParameterSet& iConfig)
0055       : EDProducer(iConfig),
0056         maxchans_(iConfig.getParameter<int>("maxchans")),
0057         maxfeds_(iConfig.getParameter<int>("maxfeds")),
0058         fedjson_(iConfig.getParameter<std::string>("fedjson")) {
0059     std::cout << "HGCalRecHitESProducersTest::HGCalRecHitESProducersTest" << std::endl;
0060     indexerToken_ = esConsumes(iConfig.getParameter<edm::ESInputTag>("indexSource"));
0061     configToken_ = esConsumes(iConfig.getParameter<edm::ESInputTag>("configSource"));
0062     calibParamToken_ = esConsumes(iConfig.getParameter<edm::ESInputTag>("calibParamSource"));
0063   }
0064 
0065   void HGCalRecHitESProducersTest::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0066     edm::ParameterSetDescription desc;
0067     desc.add("indexSource", edm::ESInputTag{})->setComment("Label for module indexer to set SoA size");
0068     desc.add("configSource", edm::ESInputTag{})->setComment("Label for HGCal configuration for unpacking raw data");
0069     desc.add("calibParamSource", edm::ESInputTag{})->setComment("Label for calibration parameters");
0070     desc.add<int>("maxchans", 200)->setComment("Maximum number of channels to print");
0071     desc.add<int>("maxfeds", 25)->setComment("Maximum number of FED IDs to test");
0072     desc.add<std::string>("fedjson", "")->setComment("JSON file with FED configuration parameters");
0073     descriptions.addWithDefaultLabel(desc);
0074   }
0075 
0076   void HGCalRecHitESProducersTest::beginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) {
0077     std::cout << "HGCalRecHitESProducersTest::beginRun" << std::endl;
0078   }
0079 
0080   static std::string int2hex(int value) {
0081     std::stringstream stream;
0082     stream << "0x" << std::hex << value;
0083     return stream.str();
0084   }
0085 
0086   void HGCalRecHitESProducersTest::produce(device::Event& iEvent, device::EventSetup const& iSetup) {
0087     std::cout << "HGCalRecHitESProducersTest::produce" << std::endl;
0088     auto queue = iEvent.queue();
0089     auto const& moduleMap = iSetup.getData(indexerToken_);
0090     auto const& config = iSetup.getData(configToken_);  // HGCalConfiguration
0091     auto const& calibParamDevice = iSetup.getData(calibParamToken_);
0092     //printf("HGCalRecHitESProducersTest::produce: time to load calibParamDevice from calib ESProducers: %f seconds\n", duration(start,now()));
0093 
0094     // Check if there are new conditions and read them
0095     std::string line = "HGCalRecHitESProducersTest::produce " + std::string(90, '-');
0096     if (configWatcher_.check(iSetup)) {
0097       std::cout << line << std::endl;
0098       std::cout << "HGCalRecHitESProducersTest::produce: moduleMap.getMaxDataSize()=" << moduleMap.getMaxDataSize()
0099                 << ", moduleMap.getMaxERxSize()=" << moduleMap.getMaxERxSize() << std::endl;
0100 
0101       // ESProducer for global HGCal configuration (structs) with header markers, etc.
0102       auto nfeds = config.feds.size();  // number of FEDs
0103       std::cout << "HGCalRecHitESProducersTest::produce: config=" << config << std::endl;
0104       std::cout << "HGCalRecHitESProducersTest::produce: nfeds=" << nfeds << ", config=" << config << std::endl;
0105       std::cout << "HGCalRecHitESProducersTest::produce: configuration:" << std::endl;
0106       for (std::size_t fedid = 0; fedid < nfeds; ++fedid) {
0107         auto fed = config.feds[fedid];   // HGCalFedConfig
0108         auto nmods = fed.econds.size();  // number of ECON-Ds for this FED
0109         std::cout << "  fedid=" << fedid << ", nmods=" << nmods << ", passthroughMode=" << fed.mismatchPassthroughMode
0110                   << ", cbHeaderMarker=0x" << std::hex << fed.cbHeaderMarker << ", slinkHeaderMarker=0x"
0111                   << fed.slinkHeaderMarker << std::dec << std::endl;
0112         std::cout << "  modid  nrocs  headerMarker" << std::endl;
0113         for (std::size_t modid = 0; modid < nmods; ++modid) {
0114           auto mod = fed.econds[modid];
0115           auto nrocs = mod.rocs.size();  // number of ECON-Ds for this FED
0116           std::cout << std::setw(7) << modid << std::setw(7) << nrocs << std::setw(14) << int2hex(mod.headerMarker)
0117                     << std::endl;
0118         }
0119       }
0120 
0121       // Alpaka ESProducer for SoA with calibration parameters with pedestals, etc.
0122       std::cout << line << std::endl;
0123       int size = calibParamDevice.view().metadata().size();
0124       std::cout << "HGCalRecHitESProducersTest::produce: device size=" << size << std::endl;
0125       std::cout << "HGCalRecHitESProducersTest::produce: calibration constants:" << std::endl;
0126       std::cout << "   idx    hex     ADC_ped   CM_slope   CM_ped   BXm1_slope" << std::endl;
0127       for (int idx = 0; idx < size; idx++) {
0128         if (idx >= maxchans_)
0129           break;
0130         std::cout << std::setw(6) << idx << std::setw(7) << int2hex(idx) << std::dec << std::setw(12)
0131                   << calibParamDevice.view()[idx].ADC_ped() << std::setw(11) << calibParamDevice.view()[idx].CM_slope()
0132                   << std::setw(9) << calibParamDevice.view()[idx].CM_ped() << std::setw(13)
0133                   << calibParamDevice.view()[idx].BXm1_slope() << std::endl;
0134       }
0135     }
0136 
0137     // test JSON parser
0138     json fed_data;
0139     std::cout << line << std::endl;
0140     std::cout << "HGCalRecHitESProducersTest::produce: testing search_fedkey with " << fedjson_ << std::endl;
0141     if (fedjson_ == "") {
0142       fed_data = json::parse(R"({
0143         // numerical range
0144         "8-20": { },
0145         // glob pattern
0146         "[0-9]": { },
0147         // glob pattern
0148         "2[0-9]": { },
0149         // glob wildcard (default)
0150         "*": { }
0151       })",
0152                              nullptr,
0153                              true,
0154                              /*ignore_comments*/ true);
0155     } else {
0156       edm::FileInPath fedfip(fedjson_);  // e.g. HGCalCommissioning/LocalCalibration/data/config_feds.json
0157       std::ifstream fedfile(fedjson_);
0158       fed_data = json::parse(fedfile, nullptr, true, /*ignore_comments*/ true);
0159     }
0160     std::vector<std::string> fedkeys;
0161     for (int fedid = 0; fedid <= maxfeds_; fedid++) {
0162       const auto fedkey = hgcal::search_fedkey(fedid, fed_data, fedjson_);  // search matching key
0163       fedkeys.push_back(fedkey);
0164     }
0165     std::cout << "   fedid   fedkey" << std::endl;
0166     for (int fedid = 0; fedid <= maxfeds_; fedid++) {
0167       std::cout << std::setw(8) << fedid << "   '" + fedkeys[fedid] + "'" << std::endl;
0168     }
0169 
0170     std::cout << line << std::endl;
0171   }
0172 
0173 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
0174 
0175 // define this as a plug-in
0176 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0177 DEFINE_FWK_ALPAKA_MODULE(HGCalRecHitESProducersTest);