Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-18 03:42:14

0001 #include "FWCore/Framework/interface/MakerMacros.h"
0002 #include "FWCore/Framework/interface/SourceFactory.h"
0003 #include "FWCore/Framework/interface/ESHandle.h"
0004 #include "FWCore/Framework/interface/ESProducer.h"
0005 #include "FWCore/Framework/interface/ESTransientHandle.h"
0006 #include "FWCore/Framework/interface/EventSetupRecordIntervalFinder.h"
0007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0008 #include "FWCore/Utilities/interface/ESGetToken.h"
0009 #include "DataFormats/Math/interface/libminifloat.h"
0010 
0011 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESGetToken.h"
0012 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESProducer.h"
0013 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h"
0014 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0015 #include "HeterogeneousCore/AlpakaInterface/interface/host.h"
0016 #include "HeterogeneousCore/AlpakaInterface/interface/memory.h"
0017 
0018 #include "CondFormats/HGCalObjects/interface/HGCalConfiguration.h"
0019 #include "CondFormats/HGCalObjects/interface/HGCalMappingModuleIndexer.h"
0020 #include "CondFormats/DataRecord/interface/HGCalElectronicsMappingRcd.h"
0021 #include "CondFormats/DataRecord/interface/HGCalModuleConfigurationRcd.h"      // depends on HGCalElectronicsMappingRcd
0022 #include "CondFormats/HGCalObjects/interface/HGCalCalibrationParameterHost.h"  // for HGCalConfigParamHost
0023 #include "CondFormats/HGCalObjects/interface/alpaka/HGCalCalibrationParameterDevice.h"
0024 
0025 #include <string>
0026 #include <iostream>  // for std::cout
0027 #include <iomanip>   // for std::setw
0028 
0029 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0030 
0031   namespace hgcalrechit {
0032 
0033     class HGCalConfigurationESProducer : public ESProducer {
0034     public:
0035       HGCalConfigurationESProducer(const edm::ParameterSet& iConfig) : ESProducer(iConfig) {
0036         if (iConfig.exists("gain"))
0037           gain_ = iConfig.getParameter<int>("gain");
0038         auto cc = setWhatProduced(this);  //HGCalConfigurationESProducer::produce
0039         indexToken_ = cc.consumes(iConfig.getParameter<edm::ESInputTag>("indexSource"));
0040         configToken_ = cc.consumes(iConfig.getParameter<edm::ESInputTag>("configSource"));
0041       }
0042 
0043       static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0044         edm::ParameterSetDescription desc;
0045         desc.add<edm::ESInputTag>("indexSource", edm::ESInputTag(""))
0046             ->setComment("Label for module indexer to set SoA size");
0047         desc.add<edm::ESInputTag>("configSource", edm::ESInputTag(""))
0048             ->setComment("Label for ROC configuration parameters");
0049         desc.addOptional<int>("gain", 2)->setComment(
0050             "Manual override for gain for all modules (1: 80 fC, 2: 160 fC, 4: 320 fC)");
0051         descriptions.addWithDefaultLabel(desc);
0052       }
0053 
0054       std::optional<hgcalrechit::HGCalConfigParamHost> produce(const HGCalModuleConfigurationRcd& iRecord) {
0055         auto const& config = iRecord.get(configToken_);
0056         auto const& moduleMap = iRecord.get(indexToken_);
0057 
0058         // load dense indexing
0059         const uint32_t nERx = moduleMap.getMaxERxSize();  // half-ROC-level size
0060         hgcalrechit::HGCalConfigParamHost product(nERx, cms::alpakatools::host());
0061 
0062         // fill SoA with gain
0063         if (gain_ > 0) {  // fill with single value from user override
0064           for (uint32_t iroc = 0; iroc < nERx; iroc++) {
0065             product.view()[iroc].gain() = gain_;
0066           }
0067         } else {  // fill with ROC-dependent value from JSON via HGCalConfiguration
0068           for (uint32_t ifed = 0; ifed < config.feds.size(); ++ifed) {
0069             for (uint32_t imod = 0; imod < config.feds[ifed].econds.size(); ++imod) {
0070               for (uint32_t iroc = 0; iroc < config.feds[ifed].econds[imod].rocs.size(); ++iroc) {
0071                 //uint32_t i = getIndexForModuleErx(ifed,imod,iroc); // dense index for ROCs
0072                 uint32_t iroc_dense = moduleMap.getIndexForModuleErx(ifed, imod, iroc);  // dense index for eRx half-ROC
0073                 product.view()[iroc_dense].gain() = config.feds[ifed].econds[imod].rocs[iroc].gain;
0074               }
0075             }
0076           }
0077         }
0078 
0079         return product;
0080       }  // end of produce()
0081 
0082     private:
0083       edm::ESGetToken<HGCalMappingModuleIndexer, HGCalElectronicsMappingRcd> indexToken_;
0084       edm::ESGetToken<HGCalConfiguration, HGCalModuleConfigurationRcd> configToken_;
0085       int32_t gain_ = -1;  // manual override of YAML files
0086     };
0087 
0088   }  // namespace hgcalrechit
0089 
0090 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
0091 
0092 DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE(hgcalrechit::HGCalConfigurationESProducer);