File indexing completed on 2024-04-06 12:30:45
0001 #ifndef SimMuon_GEMDigitizer_ME0DigiPreRecoProducer_h
0002 #define SimMuon_GEMDigitizer_ME0DigiPreRecoProducer_h
0003
0004 #include "FWCore/Framework/interface/stream/EDProducer.h"
0005 #include "FWCore/Framework/interface/MakerMacros.h"
0006 #include "FWCore/Framework/interface/ESHandle.h"
0007 #include "FWCore/Framework/interface/Event.h"
0008 #include "FWCore/Framework/interface/EventSetup.h"
0009 #include "FWCore/Framework/interface/ConsumesCollector.h"
0010 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
0011 #include "FWCore/Utilities/interface/Exception.h"
0012 #include "FWCore/Utilities/interface/ESGetToken.h"
0013 #include "FWCore/ServiceRegistry/interface/Service.h"
0014 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0015 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0016
0017 #include "DataFormats/Common/interface/Handle.h"
0018 #include "SimDataFormats/CrossingFrame/interface/CrossingFrame.h"
0019 #include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
0020 #include "SimDataFormats/CrossingFrame/interface/MixCollection.h"
0021
0022 #include "SimMuon/GEMDigitizer/interface/ME0DigiPreRecoModelFactory.h"
0023 #include "SimMuon/GEMDigitizer/interface/ME0DigiPreRecoModel.h"
0024
0025 #include "Geometry/Records/interface/MuonGeometryRecord.h"
0026 #include "Geometry/GEMGeometry/interface/ME0Geometry.h"
0027
0028 #include <sstream>
0029 #include <string>
0030 #include <map>
0031 #include <vector>
0032
0033 namespace CLHEP {
0034 class HepRandomEngine;
0035 }
0036
0037 class ME0DigiPreRecoProducer : public edm::stream::EDProducer<> {
0038 public:
0039 explicit ME0DigiPreRecoProducer(const edm::ParameterSet& ps);
0040
0041 ~ME0DigiPreRecoProducer() override;
0042
0043 void beginRun(const edm::Run&, const edm::EventSetup&) override;
0044
0045 void produce(edm::Event&, const edm::EventSetup&) override;
0046
0047 private:
0048
0049 edm::EDGetTokenT<CrossingFrame<PSimHit> > cf_token;
0050 edm::ESGetToken<ME0Geometry, MuonGeometryRecord> geom_token_;
0051
0052 std::string digiPreRecoModelString_;
0053 std::unique_ptr<ME0DigiPreRecoModel> me0DigiPreRecoModel_;
0054 };
0055
0056 ME0DigiPreRecoProducer::ME0DigiPreRecoProducer(const edm::ParameterSet& ps)
0057 : digiPreRecoModelString_(ps.getParameter<std::string>("digiPreRecoModelString")),
0058 me0DigiPreRecoModel_{ME0DigiPreRecoModelFactory::get()->create("ME0" + digiPreRecoModelString_ + "Model", ps)} {
0059 produces<ME0DigiPreRecoCollection>();
0060
0061 edm::Service<edm::RandomNumberGenerator> rng;
0062 if (!rng.isAvailable()) {
0063 throw cms::Exception("Configuration")
0064 << "ME0DigiPreRecoProducer::ME0PreRecoDigiProducer() - RandomNumberGeneratorService is not present in "
0065 "configuration file.\n"
0066 << "Add the service in the configuration file or remove the modules that require it.";
0067 }
0068 LogDebug("ME0DigiPreRecoProducer") << "Using ME0" + digiPreRecoModelString_ + "Model";
0069
0070 std::string mix_(ps.getParameter<std::string>("mixLabel"));
0071 std::string collection_(ps.getParameter<std::string>("inputCollection"));
0072
0073 cf_token = consumes<CrossingFrame<PSimHit> >(edm::InputTag(mix_, collection_));
0074 geom_token_ = esConsumes<ME0Geometry, MuonGeometryRecord, edm::Transition::BeginRun>();
0075 }
0076
0077 ME0DigiPreRecoProducer::~ME0DigiPreRecoProducer() = default;
0078
0079 void ME0DigiPreRecoProducer::beginRun(const edm::Run&, const edm::EventSetup& eventSetup) {
0080
0081 edm::ESHandle<ME0Geometry> hGeom = eventSetup.getHandle(geom_token_);
0082 me0DigiPreRecoModel_->setGeometry(&*hGeom);
0083 me0DigiPreRecoModel_->setup();
0084 }
0085
0086 void ME0DigiPreRecoProducer::produce(edm::Event& e, const edm::EventSetup& eventSetup) {
0087 edm::Service<edm::RandomNumberGenerator> rng;
0088 CLHEP::HepRandomEngine* engine = &rng->getEngine(e.streamID());
0089
0090 edm::Handle<CrossingFrame<PSimHit> > cf;
0091 e.getByToken(cf_token, cf);
0092
0093 MixCollection<PSimHit> hits{cf.product()};
0094
0095
0096 auto digis = std::make_unique<ME0DigiPreRecoCollection>();
0097
0098
0099 std::map<uint32_t, edm::PSimHitContainer> hitMap;
0100 for (const auto& hit : hits) {
0101 hitMap[hit.detUnitId()].push_back(hit);
0102 }
0103
0104
0105 const auto& etaPartitions(me0DigiPreRecoModel_->getGeometry()->etaPartitions());
0106
0107 for (const auto& roll : etaPartitions) {
0108 const ME0DetId detId(roll->id());
0109 const uint32_t rawId(detId.rawId());
0110 const auto& simHits(hitMap[rawId]);
0111
0112 LogDebug("ME0DigiPreRecoProducer") << "ME0DigiPreRecoProducer: found " << simHits.size()
0113 << " hit(s) in eta partition" << rawId;
0114
0115 me0DigiPreRecoModel_->simulateSignal(roll, simHits, engine);
0116 me0DigiPreRecoModel_->simulateNoise(roll, engine);
0117 me0DigiPreRecoModel_->fillDigis(rawId, *digis);
0118 }
0119
0120
0121 e.put(std::move(digis));
0122 }
0123
0124 DEFINE_FWK_MODULE(ME0DigiPreRecoProducer);
0125 #endif