Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-04-04 01:27:01

0001 // -*- C++ -*-
0002 //
0003 // Package:    SimMuon/DTDigitizer
0004 // Class:      DTChamberMasker
0005 //
0006 /**\class DTChamberMasker DTChamberMasker.cc
0007  SimMuon/DTDigitizer/plugins/DTChamberMasker.cc
0008 
0009  Description: Class to mask DT digis on a chamber by chamber basis
0010 
0011 */
0012 //
0013 // Original Author:  Carlo Battilana
0014 //         Created:  Sun, 11 Jan 2015 15:12:51 GMT
0015 //
0016 //
0017 
0018 // system include files
0019 #include <algorithm>
0020 #include <iostream>
0021 #include <map>
0022 #include <memory>
0023 #include <string>
0024 
0025 // user include files
0026 #include "FWCore/Framework/interface/ConsumesCollector.h"
0027 #include "FWCore/Framework/interface/Frameworkfwd.h"
0028 #include "FWCore/Framework/interface/global/EDProducer.h"
0029 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0030 
0031 #include "DataFormats/Common/interface/Handle.h"
0032 #include "FWCore/Framework/interface/Event.h"
0033 #include "FWCore/Framework/interface/Run.h"
0034 
0035 #include "FWCore/Framework/interface/ESHandle.h"
0036 #include "FWCore/Utilities/interface/ESGetToken.h"
0037 #include "FWCore/Framework/interface/EventSetup.h"
0038 
0039 #include "FWCore/Framework/interface/MakerMacros.h"
0040 
0041 #include "Geometry/DTGeometry/interface/DTGeometry.h"
0042 #include "Geometry/Records/interface/MuonGeometryRecord.h"
0043 
0044 #include "Geometry/DTGeometry/interface/DTChamber.h"
0045 #include "Geometry/DTGeometry/interface/DTLayer.h"
0046 
0047 #include "DataFormats/DTDigi/interface/DTDigiCollection.h"
0048 #include "SimDataFormats/DigiSimLinks/interface/DTDigiSimLinkCollection.h"
0049 #include "DataFormats/MuonDetId/interface/DTChamberId.h"
0050 #include "DataFormats/MuonDetId/interface/DTLayerId.h"
0051 #include "DataFormats/MuonDetId/interface/DTWireId.h"
0052 
0053 #include "CondFormats/DataRecord/interface/MuonSystemAgingRcd.h"
0054 #include "CondFormats/RecoMuonObjects/interface/MuonSystemAging.h"
0055 
0056 #include "CLHEP/Random/RandomEngine.h"
0057 #include "FWCore/AbstractServices/interface/RandomNumberGenerator.h"
0058 #include "FWCore/ServiceRegistry/interface/Service.h"
0059 
0060 //
0061 // class declaration
0062 //
0063 
0064 class DTChamberMasker : public edm::global::EDProducer<> {
0065 public:
0066   explicit DTChamberMasker(const edm::ParameterSet &);
0067 
0068   static void fillDescriptions(edm::ConfigurationDescriptions &);
0069 
0070 private:
0071   void produce(edm::StreamID, edm::Event &, const edm::EventSetup &) const override;
0072 
0073   void createMaskedChamberCollection(edm::ESHandle<DTGeometry> &);
0074 
0075   // ----------member data ---------------------------
0076 
0077   const edm::EDGetTokenT<DTDigiCollection> m_digiTokenR;
0078   const edm::EDGetTokenT<DTDigiSimLinkCollection> m_linkTokenR;
0079   const edm::EDPutTokenT<DTDigiCollection> m_digiTokenP;
0080   const edm::EDPutTokenT<DTDigiSimLinkCollection> m_linkTokenP;
0081   const edm::ESGetToken<MuonSystemAging, MuonSystemAgingRcd> m_agingObjToken;
0082 };
0083 
0084 //
0085 // constants, enums and typedefs
0086 //
0087 
0088 //
0089 // constructors and destructor
0090 //
0091 DTChamberMasker::DTChamberMasker(const edm::ParameterSet &iConfig)
0092     : m_digiTokenR(consumes(iConfig.getParameter<edm::InputTag>("digiTag"))),
0093       m_linkTokenR(consumes(iConfig.getParameter<edm::InputTag>("digiTag"))),
0094       m_digiTokenP(produces()),
0095       m_linkTokenP(produces()),
0096       m_agingObjToken(esConsumes()) {}
0097 
0098 //
0099 // member functions
0100 //
0101 
0102 // ------------ method called to produce the data  ------------
0103 void DTChamberMasker::produce(edm::StreamID, edm::Event &event, const edm::EventSetup &conditions) const {
0104   edm::Service<edm::RandomNumberGenerator> randGenService;
0105   CLHEP::HepRandomEngine &randGen = randGenService->getEngine(event.streamID());
0106 
0107   MuonSystemAging const &agingObj = conditions.getData(m_agingObjToken);
0108 
0109   auto const &chEffs = agingObj.m_DTChambEffs;
0110 
0111   DTDigiCollection filteredDigis;
0112 
0113   if (!m_digiTokenR.isUninitialized()) {
0114     edm::Handle<DTDigiCollection> dtDigis;
0115     event.getByToken(m_digiTokenR, dtDigis);
0116 
0117     for (const auto &dtLayerId : (*dtDigis)) {
0118       uint32_t rawId = (dtLayerId.first).chamberId().rawId();
0119       auto chEffIt = chEffs.find(rawId);
0120 
0121       if (chEffIt == chEffs.end() || randGen.flat() <= chEffIt->second)
0122         filteredDigis.put(dtLayerId.second, dtLayerId.first);
0123     }
0124   }
0125 
0126   DTDigiSimLinkCollection linksCopy;
0127 
0128   if (!m_linkTokenR.isUninitialized()) {
0129     edm::Handle<DTDigiSimLinkCollection> links;
0130     event.getByToken(m_linkTokenR, links);
0131     linksCopy = (*links);
0132   }
0133 
0134   event.emplace(m_digiTokenP, std::move(filteredDigis));
0135   event.emplace(m_linkTokenP, std::move(linksCopy));
0136 }
0137 
0138 // ------------ method fills 'descriptions' with the allowed parameters for the
0139 // module  ------------
0140 void DTChamberMasker::fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
0141   edm::ParameterSetDescription desc;
0142   desc.add<edm::InputTag>("digiTag", edm::InputTag("simMuonDTDigis"));
0143   descriptions.add("dtChamberMasker", desc);
0144 }
0145 
0146 // define this as a plug-in
0147 DEFINE_FWK_MODULE(DTChamberMasker);