File indexing completed on 2023-03-17 11:12:05
0001 #include "FWCore/Framework/interface/stream/EDProducer.h"
0002 #include "FWCore/Framework/interface/MakerMacros.h"
0003 #include "FWCore/Framework/interface/ESHandle.h"
0004 #include "FWCore/Framework/interface/ConsumesCollector.h"
0005 #include "FWCore/Framework/interface/Event.h"
0006 #include "FWCore/Framework/interface/EventSetup.h"
0007 #include "FWCore/Utilities/interface/ESGetToken.h"
0008 #include "FWCore/Utilities/interface/Exception.h"
0009 #include "FWCore/Utilities/interface/InputTag.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0012
0013 #include "DataFormats/Common/interface/Handle.h"
0014 #include "DataFormats/GEMDigi/interface/ME0DigiCollection.h"
0015 #include "DataFormats/GEMDigi/interface/ME0PadDigiCollection.h"
0016
0017 #include "Geometry/Records/interface/MuonGeometryRecord.h"
0018 #include "Geometry/GEMGeometry/interface/ME0Geometry.h"
0019
0020 #include <set>
0021
0022
0023
0024 class ME0PadDigiProducer : public edm::stream::EDProducer<> {
0025 public:
0026 explicit ME0PadDigiProducer(const edm::ParameterSet& ps);
0027
0028 ~ME0PadDigiProducer() override;
0029
0030 void beginRun(const edm::Run&, const edm::EventSetup&) override;
0031
0032 void produce(edm::Event&, const edm::EventSetup&) override;
0033
0034 private:
0035 void buildPads(const ME0DigiCollection& digis, ME0PadDigiCollection& out_pads) const;
0036
0037
0038 edm::EDGetTokenT<ME0DigiCollection> digi_token_;
0039 edm::InputTag digis_;
0040 edm::ESGetToken<ME0Geometry, MuonGeometryRecord> geom_token_;
0041
0042 const ME0Geometry* geometry_;
0043 };
0044
0045 ME0PadDigiProducer::ME0PadDigiProducer(const edm::ParameterSet& ps) : geometry_(nullptr) {
0046 digis_ = ps.getParameter<edm::InputTag>("InputCollection");
0047
0048 digi_token_ = consumes<ME0DigiCollection>(digis_);
0049 geom_token_ = esConsumes<ME0Geometry, MuonGeometryRecord, edm::Transition::BeginRun>();
0050
0051 produces<ME0PadDigiCollection>();
0052 }
0053
0054 ME0PadDigiProducer::~ME0PadDigiProducer() {}
0055
0056 void ME0PadDigiProducer::beginRun(const edm::Run& run, const edm::EventSetup& eventSetup) {
0057 edm::ESHandle<ME0Geometry> hGeom = eventSetup.getHandle(geom_token_);
0058 geometry_ = &*hGeom;
0059 }
0060
0061 void ME0PadDigiProducer::produce(edm::Event& e, const edm::EventSetup& eventSetup) {
0062 edm::Handle<ME0DigiCollection> hdigis;
0063 e.getByToken(digi_token_, hdigis);
0064
0065
0066 std::unique_ptr<ME0PadDigiCollection> pPads(new ME0PadDigiCollection());
0067
0068
0069 buildPads(*(hdigis.product()), *pPads);
0070
0071
0072 e.put(std::move(pPads));
0073 }
0074
0075 void ME0PadDigiProducer::buildPads(const ME0DigiCollection& det_digis, ME0PadDigiCollection& out_pads) const {
0076 for (const auto& p : geometry_->etaPartitions()) {
0077
0078 std::set<std::pair<int, int> > proto_pads;
0079
0080
0081
0082 auto digis = det_digis.get(p->id());
0083 for (auto d = digis.first; d != digis.second; ++d) {
0084 int pad_num = 1 + static_cast<int>(p->padOfStrip(d->strip()));
0085 proto_pads.emplace(pad_num, d->bx());
0086 }
0087
0088
0089 for (const auto& d : proto_pads) {
0090 ME0PadDigi pad_digi(d.first, d.second);
0091 out_pads.insertDigi(p->id(), pad_digi);
0092 }
0093 }
0094 }
0095
0096 DEFINE_FWK_MODULE(ME0PadDigiProducer);