File indexing completed on 2024-04-06 12:30:49
0001 #include "SimMuon/RPCDigitizer/src/IRPCDigitizer.h"
0002 #include "SimMuon/RPCDigitizer/src/RPCSimFactory.h"
0003 #include "SimMuon/RPCDigitizer/src/RPCSim.h"
0004 #include "SimDataFormats/TrackingHit/interface/PSimHit.h"
0005 #include "Geometry/RPCGeometry/interface/RPCRoll.h"
0006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0008 #include "SimMuon/RPCDigitizer/src/RPCSimSetUp.h"
0009
0010
0011
0012 IRPCDigitizer::IRPCDigitizer(const edm::ParameterSet& config)
0013 : theRPCSim{RPCSimFactory::get()->create(config.getParameter<std::string>("digiIRPCModel"),
0014 config.getParameter<edm::ParameterSet>("digiIRPCModelConfig"))} {
0015 theNoise = config.getParameter<bool>("doBkgNoise");
0016 }
0017
0018 IRPCDigitizer::~IRPCDigitizer() = default;
0019
0020 void IRPCDigitizer::doAction(MixCollection<PSimHit>& simHits,
0021 RPCDigiCollection& rpcDigis,
0022 RPCDigiSimLinks& rpcDigiSimLink,
0023 CLHEP::HepRandomEngine* engine) {
0024 theRPCSim->setRPCSimSetUp(theSimSetUp);
0025
0026
0027 std::map<int, edm::PSimHitContainer> hitMap;
0028 for (MixCollection<PSimHit>::MixItr hitItr = simHits.begin(); hitItr != simHits.end(); ++hitItr) {
0029 hitMap[hitItr->detUnitId()].push_back(*hitItr);
0030 }
0031
0032 if (!theGeometry) {
0033 throw cms::Exception("Configuration")
0034 << "IRPCDigitizer requires the RPCGeometry \n which is not present in the configuration file. You must add "
0035 "the service\n in the configuration file or remove the modules that require it.";
0036 }
0037
0038 const std::vector<const RPCRoll*>& rpcRolls = theGeometry->rolls();
0039 for (auto r = rpcRolls.begin(); r != rpcRolls.end(); r++) {
0040 RPCDetId id = (*r)->id();
0041 const edm::PSimHitContainer& rollSimHits = hitMap[id];
0042
0043 if ((*r)->isIRPC()) {
0044 theRPCSim->simulate(*r, rollSimHits, engine);
0045
0046 if (theNoise) {
0047 theRPCSim->simulateNoise(*r, engine);
0048 }
0049 }
0050
0051 theRPCSim->fillDigis((*r)->id(), rpcDigis);
0052 rpcDigiSimLink.insert(theRPCSim->rpcDigiSimLinks());
0053 }
0054 }
0055
0056 const RPCRoll* IRPCDigitizer::findDet(int detId) const {
0057 assert(theGeometry != nullptr);
0058 const GeomDetUnit* detUnit = theGeometry->idToDetUnit(RPCDetId(detId));
0059 return dynamic_cast<const RPCRoll*>(detUnit);
0060 }