File indexing completed on 2024-04-06 12:30:42
0001 #include "SimMuon/CSCDigitizer/src/CSCDigiProducer.h"
0002
0003 #include "DataFormats/Common/interface/Handle.h"
0004
0005 #include "SimMuon/CSCDigitizer/src/CSCConfigurableStripConditions.h"
0006 #include "SimMuon/CSCDigitizer/src/CSCDbStripConditions.h"
0007
0008 #include "FWCore/Framework/interface/ESHandle.h"
0009 #include "FWCore/Framework/interface/Event.h"
0010 #include "FWCore/Framework/interface/EventSetup.h"
0011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0012 #include "FWCore/ServiceRegistry/interface/Service.h"
0013 #include "FWCore/Utilities/interface/Exception.h"
0014 #include "FWCore/Utilities/interface/InputTag.h"
0015 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
0016 #include <FWCore/MessageLogger/interface/MessageLogger.h>
0017
0018 #include <string>
0019
0020 CSCDigiProducer::CSCDigiProducer(const edm::ParameterSet &ps) : theDigitizer(ps), theStripConditions(nullptr) {
0021 geom_Token =
0022 esConsumes<CSCGeometry, MuonGeometryRecord>(edm::ESInputTag("", ps.getParameter<std::string>("GeometryType")));
0023 magfield_Token = esConsumes<MagneticField, IdealMagneticFieldRecord>();
0024 pdt_Token = esConsumes<ParticleDataTable, edm::DefaultRecord>();
0025 produces<CSCWireDigiCollection>("MuonCSCWireDigi");
0026 produces<CSCStripDigiCollection>("MuonCSCStripDigi");
0027 produces<CSCComparatorDigiCollection>("MuonCSCComparatorDigi");
0028 produces<DigiSimLinks>("MuonCSCWireDigiSimLinks");
0029 produces<DigiSimLinks>("MuonCSCStripDigiSimLinks");
0030 std::string stripConditions(ps.getParameter<std::string>("stripConditions"));
0031
0032 edm::ParameterSet stripPSet = ps.getParameter<edm::ParameterSet>("strips");
0033 if (stripConditions == "Configurable") {
0034 theStripConditions = new CSCConfigurableStripConditions(stripPSet);
0035 } else if (stripConditions == "Database") {
0036 theStripConditions = new CSCDbStripConditions(stripPSet, consumesCollector());
0037 } else {
0038 throw cms::Exception("CSCDigiProducer") << "Bad option for strip conditions: " << stripConditions;
0039 }
0040 theDigitizer.setStripConditions(theStripConditions);
0041
0042 edm::Service<edm::RandomNumberGenerator> rng;
0043 if (!rng.isAvailable()) {
0044 throw cms::Exception("Configuration") << "CSCDigitizer requires the RandomNumberGeneratorService\n"
0045 "which is not present in the configuration file. You must add the "
0046 "service\n"
0047 "in the configuration file or remove the modules that require it.";
0048 }
0049
0050 std::string mix_ = ps.getParameter<std::string>("mixLabel");
0051 std::string collection_ = ps.getParameter<std::string>("InputCollection");
0052 cf_token = consumes<CrossingFrame<PSimHit>>(edm::InputTag(mix_, collection_));
0053 }
0054
0055 CSCDigiProducer::~CSCDigiProducer() { delete theStripConditions; }
0056
0057 void CSCDigiProducer::produce(edm::Event &ev, const edm::EventSetup &eventSetup) {
0058 edm::LogVerbatim("CSCDigitizer") << "[CSCDigiProducer::produce] starting event " << ev.id().event() << " of run "
0059 << ev.id().run();
0060 edm::Service<edm::RandomNumberGenerator> rng;
0061 CLHEP::HepRandomEngine *engine = &rng->getEngine(ev.streamID());
0062
0063 edm::Handle<CrossingFrame<PSimHit>> cf;
0064 ev.getByToken(cf_token, cf);
0065
0066 std::unique_ptr<MixCollection<PSimHit>> hits(new MixCollection<PSimHit>(cf.product()));
0067
0068
0069
0070 std::unique_ptr<CSCWireDigiCollection> pWireDigis(new CSCWireDigiCollection());
0071 std::unique_ptr<CSCStripDigiCollection> pStripDigis(new CSCStripDigiCollection());
0072 std::unique_ptr<CSCComparatorDigiCollection> pComparatorDigis(new CSCComparatorDigiCollection());
0073 std::unique_ptr<DigiSimLinks> pWireDigiSimLinks(new DigiSimLinks());
0074 std::unique_ptr<DigiSimLinks> pStripDigiSimLinks(new DigiSimLinks());
0075
0076
0077 if (hits->size() > 0) {
0078
0079 edm::ESHandle<CSCGeometry> hGeom = eventSetup.getHandle(geom_Token);
0080 const CSCGeometry *pGeom = &*hGeom;
0081
0082 theDigitizer.setGeometry(pGeom);
0083
0084
0085 edm::ESHandle<MagneticField> magfield = eventSetup.getHandle(magfield_Token);
0086
0087 theDigitizer.setMagneticField(&*magfield);
0088
0089
0090 edm::ESHandle<ParticleDataTable> pdt = eventSetup.getHandle(pdt_Token);
0091 theDigitizer.setParticleDataTable(&*pdt);
0092
0093 theStripConditions->initializeEvent(eventSetup);
0094
0095
0096 theDigitizer.doAction(
0097 *hits, *pWireDigis, *pStripDigis, *pComparatorDigis, *pWireDigiSimLinks, *pStripDigiSimLinks, engine);
0098 }
0099
0100
0101 ev.put(std::move(pWireDigis), "MuonCSCWireDigi");
0102 ev.put(std::move(pStripDigis), "MuonCSCStripDigi");
0103 ev.put(std::move(pComparatorDigis), "MuonCSCComparatorDigi");
0104 ev.put(std::move(pWireDigiSimLinks), "MuonCSCWireDigiSimLinks");
0105 ev.put(std::move(pStripDigiSimLinks), "MuonCSCStripDigiSimLinks");
0106 }