CMS 3D CMS Logo

GEMDigiProducer.cc
Go to the documentation of this file.
1 #ifndef SimMuon_GEMDigitizer_GEMDigiProducer_h
2 #define SimMuon_GEMDigitizer_GEMDigiProducer_h
3 
5 
24 
27 
28 #include <sstream>
29 #include <string>
30 #include <map>
31 #include <vector>
32 
33 namespace CLHEP {
34  class HepRandomEngine;
35 }
36 
38 public:
40 
41  explicit GEMDigiProducer(const edm::ParameterSet& ps);
42 
43  ~GEMDigiProducer() override;
44 
45  void beginRun(const edm::Run&, const edm::EventSetup&) override;
46 
47  void produce(edm::Event&, const edm::EventSetup&) override;
48 
49  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
50 
51 private:
52  //Name of Collection used for create the XF
55 
57 
58  std::unique_ptr<GEMDigiModule> gemDigiModule_;
59 };
60 
61 GEMDigiProducer::GEMDigiProducer(const edm::ParameterSet& ps) : gemDigiModule_(std::make_unique<GEMDigiModule>(ps)) {
62  produces<GEMDigiCollection>();
63  produces<GEMDigiSimLinks>("GEM");
64 
66  if (!rng.isAvailable()) {
67  throw cms::Exception("Configuration")
68  << "GEMDigiProducer::GEMDigiProducer() - RandomNumberGeneratorService is not present in configuration file.\n"
69  << "Add the service in the configuration file or remove the modules that require it.";
70  }
71 
72  std::string mix_(ps.getParameter<std::string>("mixLabel"));
73  std::string collection_(ps.getParameter<std::string>("inputCollection"));
74 
75  cf_token = consumes<CrossingFrame<PSimHit> >(edm::InputTag(mix_, collection_));
76  geom_token_ = esConsumes<GEMGeometry, MuonGeometryRecord, edm::Transition::BeginRun>();
77 }
78 
80 
83  desc.add<std::string>("inputCollection", "g4SimHitsMuonGEMHits");
84  desc.add<std::string>("mixLabel", "mix");
85 
86  desc.add<double>("signalPropagationSpeed", 0.66);
87  desc.add<double>("timeResolution", 5.);
88  desc.add<double>("timeJitter", 1.0);
89  desc.add<double>("averageShapingTime", 50.0);
90  desc.add<double>("averageEfficiency", 0.98);
91  desc.add<double>("averageNoiseRate", 0.001);
92  // intrinsic noise rate (Hz/cm^2)
93 
94  // in terms of 25 ns
95  desc.add<int>("minBunch", -5);
96  desc.add<int>("maxBunch", 3);
97 
98  desc.add<bool>("fixedRollRadius", true);
99  // Uses fixed radius in the center of the roll
100  desc.add<bool>("digitizeOnlyMuons", false);
101  desc.add<bool>("simulateBkgNoise", false);
102  // false == No background simulation
103  desc.add<bool>("simulateNoiseCLS", true);
104  desc.add<bool>("simulateElectronBkg", true);
105  // flase == simulate only neutral bkg
106  desc.add<bool>("simulateIntrinsicNoise", false);
107  desc.add<bool>("bx0filter", false);
108 
109  desc.add<double>("instLumi", 7.5);
110  // in units of 1E34 cm^-2 s^-1. Internally the background is parmetrized from FLUKA+GEANT result at 5E+34 (PU 140). We are adding a 1.5 factor for PU 200
111  desc.add<double>("rateFact", 1.0);
112  // We are adding also a safety factor of 2 to tak into account the new beam pipe effect (not yet known). Hits can be thrown away later at re-digi step. Parameters are kept in sync with the ones used in the GEM digitizer
113  desc.add<double>("bxWidth", 25E-9);
114  desc.add<double>("referenceInstLumi", 5.);
115  // referecne inst. luminosity 5E+34 cm^-2s^-1
116  desc.add<double>("resolutionX", 0.03);
117 
118  // The follwing parameters are needed to model the background contribution
119  // The parameters have been obtained after the fit of th perdicted by FLUKA
120  // By default the backgroundmodeling with these parameters should be disabled with
121  // the 9_2_X release setting simulateBkgNoise = false
122  desc.add<double>("GE11ModNeuBkgParam0", 5710.23);
123  desc.add<double>("GE11ModNeuBkgParam1", -43.3928);
124  desc.add<double>("GE11ModNeuBkgParam2", 0.0863681);
125  desc.add<double>("GE21ModNeuBkgParam0", 1440.44);
126  desc.add<double>("GE21ModNeuBkgParam1", -7.48607);
127  desc.add<double>("GE21ModNeuBkgParam2", 0.0103078);
128  desc.add<double>("GE11ElecBkgParam0", 406.249);
129  desc.add<double>("GE11ElecBkgParam1", -2.90939);
130  desc.add<double>("GE11ElecBkgParam2", 0.00548191);
131  desc.add<double>("GE21ElecBkgParam0", 97.0505);
132  desc.add<double>("GE21ElecBkgParam1", -43.3928);
133  desc.add<double>("GE21ElecBkgParam2", 00.000550599);
134 
135  descriptions.add("simMuonGEMDigisDef", desc);
136 }
137 
140  gemDigiModule_->setGeometry(&*hGeom);
141  geometry_ = &*hGeom;
142 }
143 
146  CLHEP::HepRandomEngine* engine = &rng->getEngine(e.streamID());
147 
149  e.getByToken(cf_token, cf);
150 
152 
153  // Create empty output
154  auto digis = std::make_unique<GEMDigiCollection>();
155  auto gemDigiSimLinks = std::make_unique<GEMDigiSimLinks>();
156 
157  // arrange the hits by eta partition
158  std::map<uint32_t, edm::PSimHitContainer> hitMap;
159  for (const auto& hit : hits) {
160  hitMap[GEMDetId(hit.detUnitId()).rawId()].emplace_back(hit);
161  }
162 
163  // simulate signal and noise for each eta partition
164  const auto& etaPartitions(geometry_->etaPartitions());
165 
166  for (const auto& roll : etaPartitions) {
167  const GEMDetId detId(roll->id());
168  const uint32_t rawId(detId.rawId());
169  const auto& simHits(hitMap[rawId]);
170 
171  LogDebug("GEMDigiProducer") << "GEMDigiProducer: found " << simHits.size() << " hit(s) in eta partition" << rawId;
172 
173  gemDigiModule_->simulate(roll, simHits, engine);
174  gemDigiModule_->fillDigis(rawId, *digis);
175  (*gemDigiSimLinks).insert(gemDigiModule_->gemDigiSimLinks());
176  }
177 
178  // store them in the event
179  e.put(std::move(digis));
180  e.put(std::move(gemDigiSimLinks), "GEM");
181 }
182 
184 #endif
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
T const * product() const
Definition: Handle.h:70
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
~GEMDigiProducer() override
edm::ESGetToken< GEMGeometry, MuonGeometryRecord > geom_token_
GEMDigiProducer(const edm::ParameterSet &ps)
std::unique_ptr< GEMDigiModule > gemDigiModule_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
edm::EDGetTokenT< CrossingFrame< PSimHit > > cf_token
void beginRun(const edm::Run &, const edm::EventSetup &) override
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const GEMGeometry * geometry_
void produce(edm::Event &, const edm::EventSetup &) override
edm::DetSetVector< GEMDigiSimLink > GEMDigiSimLinks
def move(src, dest)
Definition: eostools.py:511
Definition: Run.h:45
#define LogDebug(id)
const std::vector< const GEMEtaPartition * > & etaPartitions() const
Return a vector of all GEM eta partitions.
Definition: GEMGeometry.cc:40