CMS 3D CMS Logo

EcalCPUUncalibRecHitProducer.cc
Go to the documentation of this file.
1 #include <iostream>
2 
3 // framework
5 
13 
14 // algorithm specific
15 
17 
19 
20 class EcalCPUUncalibRecHitProducer : public edm::stream::EDProducer<edm::ExternalWork> {
21 public:
25 
26 private:
28  void produce(edm::Event&, edm::EventSetup const&) override;
29 
30 private:
31  const bool isPhase2_;
36 
39 };
40 
43 
44  desc.add<edm::InputTag>("recHitsInLabelEB", edm::InputTag{"ecalUncalibRecHitProducerGPU", "EcalUncalibRecHitsEB"});
45  desc.add<std::string>("recHitsOutLabelEB", "EcalUncalibRecHitsEB");
46  desc.add<bool>("containsTimingInformation", false);
47  desc.ifValue(
48  edm::ParameterDescription<bool>("isPhase2", false, true),
50  "recHitsInLabelEE", edm::InputTag{"ecalUncalibRecHitProducerGPU", "EcalUncalibRecHitsEE"}, true) and
51  edm::ParameterDescription<std::string>("recHitsOutLabelEE", "EcalUncalibRecHitsEE", true)) or
52  true >> edm::EmptyGroupDescription());
53 
54  confDesc.add("ecalCPUUncalibRecHitProducer", desc);
55 }
56 
58  : isPhase2_{ps.getParameter<bool>("isPhase2")},
59  recHitsInEBToken_{consumes<InputProduct>(ps.getParameter<edm::InputTag>("recHitsInLabelEB"))},
60  recHitsInEEToken_{isPhase2_ ? edm::EDGetTokenT<InputProduct>{}
61  : consumes<InputProduct>(ps.getParameter<edm::InputTag>("recHitsInLabelEE"))},
62  recHitsOutEBToken_{produces<OutputProduct>(ps.getParameter<std::string>("recHitsOutLabelEB"))},
63  recHitsOutEEToken_{isPhase2_ ? edm::EDPutTokenT<OutputProduct>{}
64  : produces<OutputProduct>(ps.getParameter<std::string>("recHitsOutLabelEE"))},
65  containsTimingInformation_{ps.getParameter<bool>("containsTimingInformation")} {}
66 
68 
70  edm::EventSetup const& setup,
72  // retrieve data/ctx
73  auto const& ebRecHitsProduct = event.get(recHitsInEBToken_);
74  cms::cuda::ScopedContextAcquire ctx{ebRecHitsProduct, std::move(taskHolder)};
75  auto const& ebRecHits = ctx.get(ebRecHitsProduct);
76 
77  // resize the output buffers
78  recHitsEB_.resize(ebRecHits.size);
79 
80  auto lambdaToTransfer = [&ctx](auto& dest, auto* src) {
81  using vector_type = typename std::remove_reference<decltype(dest)>::type;
82  using type = typename vector_type::value_type;
83  using src_type = typename std::remove_pointer<decltype(src)>::type;
84  static_assert(std::is_same<src_type, type>::value && "dst and src data types do not match");
85  cudaCheck(cudaMemcpyAsync(dest.data(), src, dest.size() * sizeof(type), cudaMemcpyDeviceToHost, ctx.stream()));
86  };
87 
88  // enqeue transfers
89  lambdaToTransfer(recHitsEB_.did, ebRecHits.did.get());
90  lambdaToTransfer(recHitsEB_.amplitudesAll, ebRecHits.amplitudesAll.get());
91  lambdaToTransfer(recHitsEB_.amplitude, ebRecHits.amplitude.get());
92  lambdaToTransfer(recHitsEB_.chi2, ebRecHits.chi2.get());
93  lambdaToTransfer(recHitsEB_.pedestal, ebRecHits.pedestal.get());
94  lambdaToTransfer(recHitsEB_.flags, ebRecHits.flags.get());
96  lambdaToTransfer(recHitsEB_.jitter, ebRecHits.jitter.get());
97  lambdaToTransfer(recHitsEB_.jitterError, ebRecHits.jitterError.get());
98  }
99  if (isPhase2_) {
100  lambdaToTransfer(recHitsEB_.amplitudeError, ebRecHits.amplitudeError.get());
101 
102  } else {
103  auto const& eeRecHitsProduct = event.get(recHitsInEEToken_);
104  auto const& eeRecHits = ctx.get(eeRecHitsProduct);
105  recHitsEE_.resize(eeRecHits.size);
106  lambdaToTransfer(recHitsEE_.did, eeRecHits.did.get());
107  lambdaToTransfer(recHitsEE_.amplitudesAll, eeRecHits.amplitudesAll.get());
108  lambdaToTransfer(recHitsEE_.amplitude, eeRecHits.amplitude.get());
109  lambdaToTransfer(recHitsEE_.chi2, eeRecHits.chi2.get());
110  lambdaToTransfer(recHitsEE_.pedestal, eeRecHits.pedestal.get());
111  lambdaToTransfer(recHitsEE_.flags, eeRecHits.flags.get());
113  lambdaToTransfer(recHitsEE_.jitter, eeRecHits.jitter.get());
114  lambdaToTransfer(recHitsEE_.jitterError, eeRecHits.jitterError.get());
115  }
116  }
117 }
118 
120  // tmp vectors
121  auto recHitsOutEB = std::make_unique<OutputProduct>(std::move(recHitsEB_));
122  // put into event
123  event.put(recHitsOutEBToken_, std::move(recHitsOutEB));
124 
125  if (!isPhase2_) {
126  auto recHitsOutEE = std::make_unique<OutputProduct>(std::move(recHitsEE_));
127  event.put(recHitsOutEEToken_, std::move(recHitsOutEE));
128  }
129 }
130 
const edm::EDPutTokenT< OutputProduct > recHitsOutEBToken_
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
StoragePolicy::template StorageSelector< reco::StorageScalarType >::type amplitudeError
const edm::EDGetTokenT< InputProduct > recHitsInEEToken_
void acquire(edm::Event const &, edm::EventSetup const &, edm::WaitingTaskWithArenaHolder) override
const edm::EDPutTokenT< OutputProduct > recHitsOutEEToken_
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
const edm::EDGetTokenT< InputProduct > recHitsInEBToken_
std::enable_if< std::is_same< U, ::calo::common::tags::Vec >::value, void >::type resize(size_t size)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
StoragePolicy::template StorageSelector< reco::StorageScalarType >::type jitterError
StoragePolicy::template StorageSelector< uint32_t >::type flags
StoragePolicy::template StorageSelector< uint32_t >::type did
static void fillDescriptions(edm::ConfigurationDescriptions &)
void produce(edm::Event &, edm::EventSetup const &) override
StoragePolicy::template StorageSelector< reco::ComputationScalarType >::type amplitudesAll
void add(std::string const &label, ParameterSetDescription const &psetDescription)
StoragePolicy::template StorageSelector< reco::StorageScalarType >::type amplitude
StoragePolicy::template StorageSelector< reco::StorageScalarType >::type jitter
StoragePolicy::template StorageSelector< reco::StorageScalarType >::type chi2
#define cudaCheck(ARG,...)
Definition: cudaCheck.h:69
EcalCPUUncalibRecHitProducer(edm::ParameterSet const &ps)
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1
StoragePolicy::template StorageSelector< reco::StorageScalarType >::type pedestal