Back to home page

Project CMSSW displayed by LXR

 
 

    


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

0001 #include "FWCore/Framework/interface/MakerMacros.h"
0002 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0003 
0004 #include "CalibCalorimetry/HcalAlgos/interface/HcalTimeSlew.h"
0005 
0006 #include "CondFormats/DataRecord/interface/HcalSiPMCharacteristicsRcd.h"
0007 #include "CondFormats/HcalObjects/interface/alpaka/HcalSiPMCharacteristicsDevice.h"
0008 #include "CondFormats/DataRecord/interface/HcalMahiConditionsRcd.h"
0009 #include "CondFormats/HcalObjects/interface/alpaka/HcalMahiConditionsDevice.h"
0010 #include "CondFormats/DataRecord/interface/HcalRecoParamsRcd.h"
0011 #include "CondFormats/HcalObjects/interface/alpaka/HcalRecoParamWithPulseShapeDevice.h"
0012 
0013 #include "DataFormats/HcalDigi/interface/alpaka/HcalDigiDeviceCollection.h"
0014 #include "DataFormats/HcalRecHit/interface/alpaka/HcalRecHitDeviceCollection.h"
0015 
0016 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0017 #include "HeterogeneousCore/AlpakaCore/interface/MoveToDeviceCache.h"
0018 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/Event.h"
0019 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EventSetup.h"
0020 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDGetToken.h"
0021 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDPutToken.h"
0022 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/stream/EDProducer.h"
0023 #include "HeterogeneousCore/CUDACore/interface/JobConfigurationGPURecord.h"
0024 
0025 #include "HcalMahiPulseOffsetsSoA.h"
0026 #include "Mahi.h"
0027 
0028 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0029   namespace {
0030     using HcalMahiPulseOffsetsCache =
0031         cms::alpakatools::MoveToDeviceCache<Device, PortableHostCollection<hcal::HcalMahiPulseOffsetsSoA>>;
0032   }
0033 
0034   class HBHERecHitProducerPortable : public stream::EDProducer<edm::GlobalCache<HcalMahiPulseOffsetsCache>> {
0035   public:
0036     explicit HBHERecHitProducerPortable(edm::ParameterSet const&, HcalMahiPulseOffsetsCache const*);
0037     ~HBHERecHitProducerPortable() override = default;
0038     static void fillDescriptions(edm::ConfigurationDescriptions&);
0039     static std::unique_ptr<HcalMahiPulseOffsetsCache> initializeGlobalCache(edm::ParameterSet const& ps);
0040 
0041     static void globalEndJob(HcalMahiPulseOffsetsCache*) {}
0042 
0043   private:
0044     void produce(device::Event&, device::EventSetup const&) override;
0045 
0046     using IProductTypef01 = hcal::Phase1DigiDeviceCollection;
0047     const device::EDGetToken<IProductTypef01> digisTokenF01HE_;
0048 
0049     using IProductTypef5 = hcal::Phase0DigiDeviceCollection;
0050     const device::EDGetToken<IProductTypef5> digisTokenF5HB_;
0051 
0052     using IProductTypef3 = hcal::Phase1DigiDeviceCollection;
0053     const device::EDGetToken<IProductTypef3> digisTokenF3HB_;
0054 
0055     using OProductType = hcal::RecHitDeviceCollection;
0056     const device::EDPutToken<OProductType> rechitsM0Token_;
0057 
0058     const device::ESGetToken<hcal::HcalMahiConditionsPortableDevice, HcalMahiConditionsRcd> mahiConditionsToken_;
0059     const device::ESGetToken<hcal::HcalSiPMCharacteristicsPortableDevice, HcalSiPMCharacteristicsRcd>
0060         sipmCharacteristicsToken_;
0061     const device::ESGetToken<hcal::HcalRecoParamWithPulseShapeDevice, HcalRecoParamsRcd> recoParamsToken_;
0062     //
0063 
0064     hcal::reconstruction::ConfigParameters configParameters_;
0065   };
0066 
0067   HBHERecHitProducerPortable::HBHERecHitProducerPortable(edm::ParameterSet const& ps, HcalMahiPulseOffsetsCache const*)
0068       : EDProducer(ps),
0069         digisTokenF01HE_{consumes(ps.getParameter<edm::InputTag>("digisLabelF01HE"))},
0070         digisTokenF5HB_{consumes(ps.getParameter<edm::InputTag>("digisLabelF5HB"))},
0071         digisTokenF3HB_{consumes(ps.getParameter<edm::InputTag>("digisLabelF3HB"))},
0072         rechitsM0Token_{produces()},
0073         mahiConditionsToken_{esConsumes()},
0074         sipmCharacteristicsToken_{esConsumes()},
0075         recoParamsToken_{esConsumes()} {
0076     configParameters_.maxTimeSamples = ps.getParameter<uint32_t>("maxTimeSamples");
0077     configParameters_.kprep1dChannelsPerBlock = ps.getParameter<uint32_t>("kprep1dChannelsPerBlock");
0078     configParameters_.sipmQTSShift = ps.getParameter<int>("sipmQTSShift");
0079     configParameters_.sipmQNTStoSum = ps.getParameter<int>("sipmQNTStoSum");
0080     configParameters_.firstSampleShift = ps.getParameter<int>("firstSampleShift");
0081     //TODO: produce only pedestals_width or convertedPedestalWidths depending on this bool
0082     configParameters_.useEffectivePedestals = ps.getParameter<bool>("useEffectivePedestals");
0083 
0084     configParameters_.meanTime = ps.getParameter<double>("meanTime");
0085     configParameters_.timeSigmaSiPM = ps.getParameter<double>("timeSigmaSiPM");
0086     configParameters_.timeSigmaHPD = ps.getParameter<double>("timeSigmaHPD");
0087     configParameters_.ts4Thresh = ps.getParameter<double>("ts4Thresh");
0088 
0089     configParameters_.applyTimeSlew = ps.getParameter<bool>("applyTimeSlew");
0090     auto const tzeroValues = ps.getParameter<std::vector<double>>("tzeroTimeSlewParameters");
0091     auto const slopeValues = ps.getParameter<std::vector<double>>("slopeTimeSlewParameters");
0092     auto const tmaxValues = ps.getParameter<std::vector<double>>("tmaxTimeSlewParameters");
0093 
0094     configParameters_.tzeroTimeSlew = tzeroValues[HcalTimeSlew::Medium];
0095     configParameters_.slopeTimeSlew = slopeValues[HcalTimeSlew::Medium];
0096     configParameters_.tmaxTimeSlew = tmaxValues[HcalTimeSlew::Medium];
0097 
0098     auto threadsMinimize = ps.getParameter<std::vector<uint32_t>>("kernelMinimizeThreads");
0099     configParameters_.kernelMinimizeThreads[0] = threadsMinimize[0];
0100     configParameters_.kernelMinimizeThreads[1] = threadsMinimize[1];
0101     configParameters_.kernelMinimizeThreads[2] = threadsMinimize[2];
0102   }
0103 
0104   void HBHERecHitProducerPortable::fillDescriptions(edm::ConfigurationDescriptions& cdesc) {
0105     edm::ParameterSetDescription desc;
0106     desc.add<uint32_t>("maxTimeSamples", 10);
0107     desc.add<uint32_t>("kprep1dChannelsPerBlock", 32);
0108     desc.add<edm::InputTag>("digisLabelF01HE", edm::InputTag{"hcalRawToDigiGPU", "f01HEDigisGPU"});
0109     desc.add<edm::InputTag>("digisLabelF5HB", edm::InputTag{"hcalRawToDigiGPU", "f5HBDigisGPU"});
0110     desc.add<edm::InputTag>("digisLabelF3HB", edm::InputTag{"hcalRawToDigiGPU", "f3HBDigisGPU"});
0111     desc.add<std::string>("recHitsLabelM0HBHE", "recHitsM0HBHE");
0112     desc.add<int>("sipmQTSShift", 0);
0113     desc.add<int>("sipmQNTStoSum", 3);
0114     desc.add<int>("firstSampleShift", 0);
0115     desc.add<bool>("useEffectivePedestals", true);
0116 
0117     desc.add<double>("meanTime", 0.f);
0118     desc.add<double>("timeSigmaSiPM", 2.5f);
0119     desc.add<double>("timeSigmaHPD", 5.0f);
0120     desc.add<double>("ts4Thresh", 0.0);
0121 
0122     desc.add<bool>("applyTimeSlew", true);
0123     desc.add<std::vector<double>>("tzeroTimeSlewParameters", {23.960177, 11.977461, 9.109694});
0124     desc.add<std::vector<double>>("slopeTimeSlewParameters", {-3.178648, -1.5610227, -1.075824});
0125     desc.add<std::vector<double>>("tmaxTimeSlewParameters", {16.00, 10.00, 6.25});
0126     desc.add<std::vector<uint32_t>>("kernelMinimizeThreads", {16, 1, 1});
0127 
0128     desc.add<std::vector<int>>("pulseOffsets", {-3, -2, -1, 0, 1, 2, 3, 4});
0129 
0130     cdesc.addWithDefaultLabel(desc);
0131   }
0132 
0133   std::unique_ptr<HcalMahiPulseOffsetsCache> HBHERecHitProducerPortable::initializeGlobalCache(
0134       edm::ParameterSet const& ps) {
0135     std::vector<int> offsets = ps.getParameter<std::vector<int>>("pulseOffsets");
0136 
0137     PortableHostCollection<hcal::HcalMahiPulseOffsetsSoA> obj(offsets.size(), cms::alpakatools::host());
0138     auto view = obj.view();
0139 
0140     for (uint32_t i = 0; i < offsets.size(); i++) {
0141       view[i] = offsets[i];
0142     }
0143 
0144     return std::make_unique<HcalMahiPulseOffsetsCache>(std::move(obj));
0145   }
0146 
0147   void HBHERecHitProducerPortable::produce(device::Event& event, device::EventSetup const& setup) {
0148     auto& queue = event.queue();
0149 
0150     // get device collections from event
0151     auto const& f01HEDigisDev = event.get(digisTokenF01HE_);
0152     auto const& f5HBDigisDev = event.get(digisTokenF5HB_);
0153     auto const& f3HBDigisDev = event.get(digisTokenF3HB_);
0154 
0155     auto const f01DigisSize = f01HEDigisDev->metadata().size();
0156     auto const f5DigisSize = f5HBDigisDev->metadata().size();
0157     auto const f3DigisSize = f3HBDigisDev->metadata().size();
0158 
0159     auto const totalChannels = f01DigisSize + f5DigisSize + f3DigisSize;
0160     OProductType outputGPU_{totalChannels, queue};
0161 
0162     if (totalChannels > 0) {
0163       // conditions
0164       auto const& mahiConditionsDev = setup.getData(mahiConditionsToken_);
0165       auto const& sipmCharacteristicsDev = setup.getData(sipmCharacteristicsToken_);
0166       auto const& recoParamsWithPulseShapeDev = setup.getData(recoParamsToken_);
0167       auto const& mahiPulseOffsetsDev = globalCache()->get(queue);
0168 
0169       //
0170       // schedule algorithms
0171       //
0172       hcal::reconstruction::runMahiAsync(queue,
0173                                          f01HEDigisDev.const_view(),
0174                                          f5HBDigisDev.const_view(),
0175                                          f3HBDigisDev.const_view(),
0176                                          outputGPU_.view(),
0177                                          mahiConditionsDev.const_view(),
0178                                          sipmCharacteristicsDev.const_view(),
0179                                          recoParamsWithPulseShapeDev.const_view(),
0180                                          mahiPulseOffsetsDev.const_view(),
0181                                          configParameters_);
0182     }
0183     //put into the event
0184     event.emplace(rechitsM0Token_, std::move(outputGPU_));
0185   }
0186 
0187 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
0188 
0189 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0190 DEFINE_FWK_ALPAKA_MODULE(HBHERecHitProducerPortable);