1+ #include " CommonTools/Utils/interface/StringToEnumValue.h"
12#include " CondFormats/DataRecord/interface/EcalRecHitConditionsRcd.h"
3+ #include " CondFormats/EcalObjects/interface/EcalChannelStatusCode.h"
4+ #include " CondFormats/EcalObjects/interface/EcalRecHitParameters.h"
25#include " CondFormats/EcalObjects/interface/alpaka/EcalRecHitConditionsDevice.h"
3- #include " CondFormats/EcalObjects/interface/alpaka/EcalRecHitParametersDevice.h"
46#include " DataFormats/EcalRecHit/interface/EcalRecHit.h"
57#include " DataFormats/EcalRecHit/interface/RecoTypes.h"
68#include " DataFormats/EcalRecHit/interface/alpaka/EcalUncalibratedRecHitDeviceCollection.h"
79#include " DataFormats/EcalRecHit/interface/alpaka/EcalRecHitDeviceCollection.h"
10+ #include " DataFormats/Portable/interface/PortableObject.h"
811#include " FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
912#include " FWCore/ParameterSet/interface/EmptyGroupDescription.h"
1013#include " FWCore/ParameterSet/interface/ParameterSet.h"
1114#include " FWCore/ParameterSet/interface/ParameterSetDescription.h"
15+ #include " HeterogeneousCore/AlpakaCore/interface/MoveToDeviceCache.h"
1216#include " HeterogeneousCore/AlpakaCore/interface/alpaka/EDGetToken.h"
1317#include " HeterogeneousCore/AlpakaCore/interface/alpaka/EDPutToken.h"
1418#include " HeterogeneousCore/AlpakaCore/interface/alpaka/Event.h"
1519#include " HeterogeneousCore/AlpakaCore/interface/alpaka/EventSetup.h"
1620#include " HeterogeneousCore/AlpakaCore/interface/alpaka/stream/EDProducer.h"
17- #include " HeterogeneousCore/CUDACore/interface/JobConfigurationGPURecord.h"
1821
1922#include " DeclsForKernels.h"
2023#include " EcalRecHitBuilder.h"
2124
2225namespace ALPAKA_ACCELERATOR_NAMESPACE {
26+ namespace {
27+ using EcalRecHitParametersCache =
28+ cms::alpakatools::MoveToDeviceCache<Device, PortableHostObject<EcalRecHitParameters>>;
29+ }
2330
24- class EcalRecHitProducerPortable : public stream ::EDProducer<> {
31+ class EcalRecHitProducerPortable : public stream ::EDProducer<edm::GlobalCache<EcalRecHitParametersCache> > {
2532 public:
26- explicit EcalRecHitProducerPortable (edm::ParameterSet const & ps);
33+ explicit EcalRecHitProducerPortable (edm::ParameterSet const & ps, EcalRecHitParametersCache const * );
2734 ~EcalRecHitProducerPortable () override = default ;
2835 static void fillDescriptions (edm::ConfigurationDescriptions&);
36+ static std::unique_ptr<EcalRecHitParametersCache> initializeGlobalCache (edm::ParameterSet const & ps);
2937
3038 void produce (device::Event&, device::EventSetup const &) override ;
3139
40+ static void globalEndJob (EcalRecHitParametersCache*) {}
41+
3242 private:
3343 bool const isPhase2_;
3444 // input
@@ -45,7 +55,6 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
4555
4656 // conditions tokens
4757 const device::ESGetToken<EcalRecHitConditionsDevice, EcalRecHitConditionsRcd> recHitConditionsToken_;
48- const device::ESGetToken<EcalRecHitParametersDevice, JobConfigurationGPURecord> recHitParametersToken_;
4958 };
5059
5160 void EcalRecHitProducerPortable::fillDescriptions (edm::ConfigurationDescriptions& confDesc) {
@@ -75,17 +84,65 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
7584 edm::ParameterDescription<double >(" EELaserMAX" , 8.0 , true )) or
7685 true >> edm::EmptyGroupDescription ());
7786
87+ // channel statuses to be exluded from reconstruction
88+ desc.add <std::vector<std::string>>(" ChannelStatusToBeExcluded" ,
89+ {" kDAC" ,
90+ " kNoisy" ,
91+ " kNNoisy" ,
92+ " kFixedG6" ,
93+ " kFixedG1" ,
94+ " kFixedG0" ,
95+ " kNonRespondingIsolated" ,
96+ " kDeadVFE" ,
97+ " kDeadFE" ,
98+ " kNoDataNoTP" });
99+
100+ // reco flags association to channel status flags
101+ edm::ParameterSetDescription psd0;
102+ psd0.add <std::vector<std::string>>(" kGood" , {" kOk" , " kDAC" , " kNoLaser" , " kNoisy" });
103+ psd0.add <std::vector<std::string>>(" kNeighboursRecovered" , {" kFixedG0" , " kNonRespondingIsolated" , " kDeadVFE" });
104+ psd0.add <std::vector<std::string>>(" kDead" , {" kNoDataNoTP" });
105+ psd0.add <std::vector<std::string>>(" kNoisy" , {" kNNoisy" , " kFixedG6" , " kFixedG1" });
106+ psd0.add <std::vector<std::string>>(" kTowerRecovered" , {" kDeadFE" });
107+ desc.add <edm::ParameterSetDescription>(" flagsMapDBReco" , psd0);
108+
78109 confDesc.addWithDefaultLabel (desc);
79110 }
80111
81- EcalRecHitProducerPortable::EcalRecHitProducerPortable (const edm::ParameterSet& ps)
112+ std::unique_ptr<EcalRecHitParametersCache> EcalRecHitProducerPortable::initializeGlobalCache (
113+ edm::ParameterSet const & ps) {
114+ PortableHostObject<EcalRecHitParameters> params (cms::alpakatools::host ());
115+
116+ // Translate string representation of ChannelStatusToBeExcluded to enum values and pack into bitset
117+ auto const & channelStatusToBeExcluded = StringToEnumValue<EcalChannelStatusCode::Code>(
118+ ps.getParameter <std::vector<std::string>>(" ChannelStatusToBeExcluded" ));
119+ for (auto const & st : channelStatusToBeExcluded) {
120+ params->channelStatusCodesToBeExcluded .set (st);
121+ }
122+
123+ // Generate map of channel status codes and corresponding recoFlag bits
124+ auto const & fmdbRecoPset = ps.getParameter <edm::ParameterSet>(" flagsMapDBReco" );
125+ auto const & recoFlagStrings = fmdbRecoPset.getParameterNames ();
126+ for (auto const & recoFlagString : recoFlagStrings) {
127+ auto const recoFlag = static_cast <EcalRecHit::Flags>(StringToEnumValue<EcalRecHit::Flags>(recoFlagString));
128+ auto const & channelStatusCodeStrings = fmdbRecoPset.getParameter <std::vector<std::string>>(recoFlagString);
129+ for (auto const & channelStatusCodeString : channelStatusCodeStrings) {
130+ auto const chStatCode = StringToEnumValue<EcalChannelStatusCode::Code>(channelStatusCodeString);
131+ // set recoFlagBits for this channel status code
132+ params->recoFlagBits .at (chStatCode) = static_cast <uint32_t >(recoFlag);
133+ }
134+ }
135+
136+ return std::make_unique<EcalRecHitParametersCache>(std::move (params));
137+ }
138+
139+ EcalRecHitProducerPortable::EcalRecHitProducerPortable (const edm::ParameterSet& ps, EcalRecHitParametersCache const *)
82140 : isPhase2_{ps.getParameter <bool >(" isPhase2" )},
83141 uncalibRecHitsTokenEB_{consumes (ps.getParameter <edm::InputTag>(" uncalibrecHitsInLabelEB" ))},
84142 uncalibRecHitsTokenEE_{isPhase2_ ? device::EDGetToken<InputProduct>{}
85143 : consumes (ps.getParameter <edm::InputTag>(" uncalibrecHitsInLabelEE" ))},
86144 recHitsTokenEB_{produces (ps.getParameter <std::string>(" recHitsLabelEB" ))},
87- recHitConditionsToken_{esConsumes ()},
88- recHitParametersToken_{esConsumes ()} {
145+ recHitConditionsToken_{esConsumes ()} {
89146 if (!isPhase2_) {
90147 recHitsTokenEE_ = produces (ps.getParameter <std::string>(" recHitsLabelEE" ));
91148 }
@@ -147,7 +204,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE {
147204
148205 // conditions
149206 auto const & recHitConditionsDev = setup.getData (recHitConditionsToken_);
150- auto const & recHitParametersDev = setup. getData (recHitParametersToken_ );
207+ auto const * recHitParametersDev = globalCache ()-> get (queue). const_data ( );
151208
152209 //
153210 // schedule algorithms
0 commit comments