CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes
sistrip::FEDEmulatorModule Class Reference
Inheritance diagram for sistrip::FEDEmulatorModule:
edm::stream::EDProducer<>

Public Member Functions

 FEDEmulatorModule (const edm::ParameterSet &)
 
 ~FEDEmulatorModule () override
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
 EDProducer (const EDProducer &)=delete
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 
const EDProduceroperator= (const EDProducer &)=delete
 

Private Member Functions

void produce (edm::Event &, const edm::EventSetup &) override
 
void updateFedCabling (const SiStripFedCablingRcd &rcd)
 
void updateNoises (const SiStripNoisesRcd &rcd)
 
void updatePedestals (const SiStripPedestalsRcd &rcd)
 

Private Attributes

std::unique_ptr< SiStripRawProcessingAlgorithmsalgorithms_
 object for zero-suppression More...
 
bool byModule_
 
edm::ESWatcher< SiStripFedCablingRcdcablingWatcher_
 
const SiStripFedCablingfedCabling_
 
edm::ESGetToken< SiStripFedCabling, SiStripFedCablingRcdfedCablingToken_
 
sistrip::FEDEmulator fedEmulator_
 
const SiStripNoisesnoises_
 
edm::ESGetToken< SiStripNoises, SiStripNoisesRcdnoisesToken_
 
edm::ESWatcher< SiStripNoisesRcdnoisesWatcher_
 
const SiStripPedestalspedestals_
 
edm::ESGetToken< SiStripPedestals, SiStripPedestalsRcdpedestalsToken_
 
edm::ESWatcher< SiStripPedestalsRcdpedestalsWatcher_
 
edm::InputTag spyReorderedDigisTag_
 
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyReorderedDigisToken_
 
edm::InputTag spyVirginRawDigisTag_
 
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyVirginRawDigisToken_
 

Static Private Attributes

static const char *const messageLabel_ = "SiStripFEDEmulatorModule"
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer<>
using CacheTypes = CacheContexts< T... >
 
using GlobalCache = typename CacheTypes::GlobalCache
 
using HasAbility = AbilityChecker< T... >
 
using InputProcessBlockCache = typename CacheTypes::InputProcessBlockCache
 
using LuminosityBlockCache = typename CacheTypes::LuminosityBlockCache
 
using LuminosityBlockContext = LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCache >
 
using LuminosityBlockSummaryCache = typename CacheTypes::LuminosityBlockSummaryCache
 
using RunCache = typename CacheTypes::RunCache
 
using RunContext = RunContextT< RunCache, GlobalCache >
 
using RunSummaryCache = typename CacheTypes::RunSummaryCache
 

Detailed Description

Definition at line 57 of file SiStripFEDEmulatorModule.cc.

Constructor & Destructor Documentation

◆ FEDEmulatorModule()

sistrip::FEDEmulatorModule::FEDEmulatorModule ( const edm::ParameterSet iConfig)
explicit

Definition at line 105 of file SiStripFEDEmulatorModule.cc.

References byModule_, fedEmulator_, sistrip::FEDEmulator::initialise(), spyReorderedDigisTag_, spyReorderedDigisToken_, spyVirginRawDigisTag_, and spyVirginRawDigisToken_.

106  : spyReorderedDigisTag_(iConfig.getParameter<edm::InputTag>("SpyReorderedDigisTag")),
107  spyVirginRawDigisTag_(iConfig.getParameter<edm::InputTag>("SpyVirginRawDigisTag")),
108  byModule_(iConfig.getParameter<bool>("ByModule")),
110  consumesCollector())),
111  fedCablingToken_(esConsumes<>()),
112  pedestalsToken_(esConsumes<>()),
113  noisesToken_(esConsumes<>()),
117  spyReorderedDigisToken_ = consumes<edm::DetSetVector<SiStripRawDigi> >(spyReorderedDigisTag_);
118  spyVirginRawDigisToken_ = consumes<edm::DetSetVector<SiStripRawDigi> >(spyVirginRawDigisTag_);
119 
121 
122  if (!byModule_) { //if not by module
123  //the medians will be produced by fed id/channel
124  produces<std::map<uint32_t, std::vector<uint32_t> > >("Medians");
125  produces<edm::DetSetVector<SiStripRawDigi> >("PedestalsOrdered");
126  produces<edm::DetSetVector<SiStripProcessedRawDigi> >("NoisesOrdered");
127  produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrDigisOrdered");
128  produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrDigisOrdered");
129  } else { //by module
130  produces<edm::DetSetVector<SiStripRawDigi> >("ModulePedestals");
131  produces<edm::DetSetVector<SiStripProcessedRawDigi> >("ModuleNoises");
132  produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrModuleDigis");
133  produces<std::map<uint32_t, std::vector<uint32_t> > >("ModuleMedians");
134  produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrModuleDigis");
135  produces<edm::DetSetVector<SiStripDigi> >("ZSModuleDigis");
136  } //end of by module check
137 
138  } //end of FEDEmulatorModule constructor
edm::ESWatcher< SiStripNoisesRcd > noisesWatcher_
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
void updatePedestals(const SiStripPedestalsRcd &rcd)
edm::ESGetToken< SiStripNoises, SiStripNoisesRcd > noisesToken_
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyReorderedDigisToken_
void updateFedCabling(const SiStripFedCablingRcd &rcd)
void updateNoises(const SiStripNoisesRcd &rcd)
edm::ESWatcher< SiStripPedestalsRcd > pedestalsWatcher_
edm::ESGetToken< SiStripFedCabling, SiStripFedCablingRcd > fedCablingToken_
void initialise(const bool byModule)
std::unique_ptr< SiStripRawProcessingAlgorithms > algorithms_
object for zero-suppression
static std::unique_ptr< SiStripRawProcessingAlgorithms > create(const edm::ParameterSet &, edm::ConsumesCollector)
edm::ESGetToken< SiStripPedestals, SiStripPedestalsRcd > pedestalsToken_
edm::ESWatcher< SiStripFedCablingRcd > cablingWatcher_
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyVirginRawDigisToken_

◆ ~FEDEmulatorModule()

sistrip::FEDEmulatorModule::~FEDEmulatorModule ( )
override

Definition at line 140 of file SiStripFEDEmulatorModule.cc.

140 {}

Member Function Documentation

◆ produce()

void sistrip::FEDEmulatorModule::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
overrideprivate

Definition at line 149 of file SiStripFEDEmulatorModule.cc.

References algorithms_, FedChannelConnection::apvPairNumber(), edm::DetSetVector< T >::begin(), byModule_, cablingWatcher_, edm::ESWatcher< T >::check(), gather_cfg::cout, FedChannelConnection::detId(), MillePedeFileConverter_cfg::e, edm::DetSet< T >::empty(), edm::DetSetVector< T >::end(), fedCabling_, SiStripFedCabling::fedConnection(), fedEmulator_, sistrip::SpyUtilities::fedIndex(), iEvent, sistrip::FEDEmulator::initialiseModule(), genParticles_cff::map, eostools::move(), FedChannelConnection::nApvPairs(), noises_, noisesWatcher_, pedestals_, pedestalsWatcher_, edm::Handle< T >::product(), sistrip::FEDEmulator::retrieveNoises(), sistrip::FEDEmulator::retrievePedestals(), edm::DetSetVector< T >::size(), spyReorderedDigisToken_, spyVirginRawDigisToken_, sistrip::STRIPS_PER_FEDCH, sistrip::FEDEmulator::subtractCM(), sistrip::FEDEmulator::subtractPedestals(), and sistrip::FEDEmulator::zeroSuppress().

149  {
150  cablingWatcher_.check(iSetup);
151  pedestalsWatcher_.check(iSetup);
152  noisesWatcher_.check(iSetup);
153 
154  //initialise the algorithms object for the zero suppression
155  algorithms_->initialize(iSetup);
156 
157  //retrieve the digis
159  try { //to get the digis from the event
160  if (!byModule_) {
161  iEvent.getByToken(spyReorderedDigisToken_, lDigisHandle);
162  } else { //digis supplied by module
163  iEvent.getByToken(spyVirginRawDigisToken_, lDigisHandle);
164  } //end of by module check
165  } catch (const cms::Exception& e) {
166  std::cout << e.what();
167  return;
168  } //end of get digis try
169 
170  const edm::DetSetVector<SiStripRawDigi>* lInputDigis = lDigisHandle.product();
171 
172  unsigned int lNDigis = lInputDigis->size();
173 
174  //define output containers
175  //reserve space, will push_back elements
176  std::vector<edm::DetSetVector<SiStripRawDigi>::detset> pedsData;
177  pedsData.reserve(lNDigis);
178  std::vector<edm::DetSetVector<SiStripProcessedRawDigi>::detset> noiseData;
179  noiseData.reserve(lNDigis);
180  std::vector<edm::DetSetVector<SiStripRawDigi>::detset> pedSubtrData;
181  pedSubtrData.reserve(lNDigis);
182  std::vector<edm::DetSetVector<SiStripRawDigi>::detset> cmSubtrData;
183  cmSubtrData.reserve(lNDigis);
184  //zero suppressed contained - no fixed size (could be empty) so no need to reserve elements.
185  std::vector<edm::DetSet<SiStripDigi> > zsData;
186 
187  //this is a map: no reserve/resize
188  std::map<uint32_t, std::vector<uint32_t> > medsData;
189 
190  edm::DetSetVector<SiStripRawDigi>::const_iterator inputChannel = lInputDigis->begin();
191 
192  for (; inputChannel != lInputDigis->end(); ++inputChannel) { //loop on input channels
193  uint32_t lDetId = inputChannel->detId(); //either fedIndex or detId
194 
195  pedsData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
196  noiseData.push_back(edm::DetSetVector<SiStripProcessedRawDigi>::detset(lDetId));
197  pedSubtrData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
198  cmSubtrData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
199 
200  unsigned int lNStrips = inputChannel->size();
201 
202  //define output digi containers
203  std::vector<SiStripRawDigi>& pedsDetSetData = pedsData.back().data;
204  pedsDetSetData.reserve(lNStrips);
205  std::vector<SiStripProcessedRawDigi>& noiseDetSetData = noiseData.back().data;
206  noiseDetSetData.reserve(lNStrips);
207  std::vector<SiStripRawDigi>& pedSubtrDetSetData = pedSubtrData.back().data;
208  pedSubtrDetSetData.reserve(lNStrips);
209  std::vector<SiStripRawDigi>& cmSubtrDetSetData = cmSubtrData.back().data;
210  cmSubtrDetSetData.reserve(lNStrips);
211  //zero suppressed - slightly different procedure as not fixed size
212  edm::DetSet<SiStripDigi> zsDetSetData(lDetId);
213 
214  //determine the number of APV pairs in the channel
215  uint32_t lNPairs = static_cast<uint32_t>(lNStrips * 1. / sistrip::STRIPS_PER_FEDCH);
216  uint32_t lPair = 0;
217 
218  std::vector<uint32_t> medsDetSetData;
219  medsDetSetData.reserve(lNPairs * 2); //2*number of pairs per module. If not by module, lNPairs = 1...
220 
221  if (!byModule_) { //the input is not stored by module
222  //need to retrieve the proper detId from cabling
223  uint16_t lFedId = 0;
224  uint16_t lFedChannel = 0;
225  sistrip::SpyUtilities::fedIndex(lDetId, lFedId, lFedChannel);
226 
227  const FedChannelConnection& lConnection = fedCabling_->fedConnection(lFedId, lFedChannel);
228  lDetId = lConnection.detId();
229  lNPairs = lConnection.nApvPairs();
230  lPair = lConnection.apvPairNumber();
231  } //end of by module check
232 
233  fedEmulator_.initialiseModule(lDetId, lNPairs, lPair);
234 
235  //get the pedestal values
236  //stored by module in the database
237  fedEmulator_.retrievePedestals(pedestals_); // FIXME maybe move into FEDEmulator then?
239 
240  //last option: fill medians from these ped subtr data
241  //if want something else, need to call a method to fill
242  //the data member medians_ of the class fedEmulator.
244  inputChannel, pedsDetSetData, noiseDetSetData, pedSubtrDetSetData, medsDetSetData, true);
245 
246  fedEmulator_.subtractCM(pedSubtrDetSetData, cmSubtrDetSetData);
247 
248  //fill the median map
249  medsData[inputChannel->detId()] = medsDetSetData;
250 
251  //zero suppress the digis
252  fedEmulator_.zeroSuppress(cmSubtrDetSetData, zsDetSetData, algorithms_);
253  if (!zsDetSetData.empty())
254  zsData.push_back(zsDetSetData);
255 
256  } //loop on input channels
257 
258  std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lPeds(new edm::DetSetVector<SiStripRawDigi>(pedsData, true));
259  std::unique_ptr<edm::DetSetVector<SiStripProcessedRawDigi> > lNoises(
260  new edm::DetSetVector<SiStripProcessedRawDigi>(noiseData, true));
261 
262  std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputPedSubtr(
263  new edm::DetSetVector<SiStripRawDigi>(pedSubtrData, true));
264 
265  std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputCMSubtr(
266  new edm::DetSetVector<SiStripRawDigi>(cmSubtrData, true));
267 
268  std::unique_ptr<std::map<uint32_t, std::vector<uint32_t> > > lMedians(
269  new std::map<uint32_t, std::vector<uint32_t> >(medsData));
270 
271  //zero suppressed digis
272  std::unique_ptr<edm::DetSetVector<SiStripDigi> > lOutputZS(new edm::DetSetVector<SiStripDigi>(zsData));
273 
274  if (!byModule_) {
275  iEvent.put(std::move(lMedians), "Medians");
276  iEvent.put(std::move(lPeds), "PedestalsOrdered");
277  iEvent.put(std::move(lNoises), "NoisesOrdered");
278  iEvent.put(std::move(lOutputPedSubtr), "PedSubtrDigisOrdered");
279  iEvent.put(std::move(lOutputCMSubtr), "CMSubtrDigisOrdered");
280  } else {
281  iEvent.put(std::move(lPeds), "ModulePedestals");
282  iEvent.put(std::move(lNoises), "ModuleNoises");
283  iEvent.put(std::move(lOutputPedSubtr), "PedSubtrModuleDigis");
284  iEvent.put(std::move(lMedians), "ModuleMedians");
285  iEvent.put(std::move(lOutputCMSubtr), "CMSubtrModuleDigis");
286  iEvent.put(std::move(lOutputZS), "ZSModuleDigis");
287  }
288 
289  } //produce method
edm::ESWatcher< SiStripNoisesRcd > noisesWatcher_
void subtractPedestals(const edm::DetSetVector< SiStripRawDigi >::const_iterator &inputChannel, std::vector< SiStripRawDigi > &pedsDetSetData, std::vector< SiStripProcessedRawDigi > &noiseDetSetData, std::vector< SiStripRawDigi > &pedSubtrDetSetData, std::vector< uint32_t > &medsDetSetData, const bool fillApvsForCM)
FedChannelConnection fedConnection(uint16_t fed_id, uint16_t fed_ch) const
T const * product() const
Definition: Handle.h:70
const SiStripFedCabling * fedCabling_
void fedIndex(uint32_t aFedIndex, uint16_t &aFedId, uint16_t &aFedChannel)
void retrieveNoises(const edm::ESHandle< SiStripNoises > &aHandle)
int iEvent
Definition: GenABIO.cc:224
size_type size() const
Return the number of contained DetSets.
Definition: DetSetVector.h:250
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyReorderedDigisToken_
Class containning control, module, detector and connection information, at the level of a FED channel...
void initialiseModule(const uint32_t aDetId, const uint32_t aNPairs, const uint32_t aPair)
void subtractCM(const std::vector< SiStripRawDigi > &pedSubtrDetSetData, std::vector< SiStripRawDigi > &cmSubtrDetSetData)
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:316
const uint32_t & detId() const
edm::ESWatcher< SiStripPedestalsRcd > pedestalsWatcher_
static const uint16_t STRIPS_PER_FEDCH
std::unique_ptr< SiStripRawProcessingAlgorithms > algorithms_
object for zero-suppression
void zeroSuppress(const std::vector< SiStripRawDigi > &cmSubtrDetSetData, edm::DetSet< SiStripDigi > &zsDetSetData, const std::unique_ptr< SiStripRawProcessingAlgorithms > &algorithms)
const uint16_t & nApvPairs() const
uint16_t apvPairNumber() const
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
iterator begin()
Return an iterator to the first DetSet.
Definition: DetSetVector.h:305
void retrievePedestals(const edm::ESHandle< SiStripPedestals > &aHandle)
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:102
def move(src, dest)
Definition: eostools.py:511
edm::ESWatcher< SiStripFedCablingRcd > cablingWatcher_
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyVirginRawDigisToken_
const SiStripPedestals * pedestals_

◆ updateFedCabling()

void sistrip::FEDEmulatorModule::updateFedCabling ( const SiStripFedCablingRcd rcd)
private

Definition at line 142 of file SiStripFEDEmulatorModule.cc.

References fedCabling_, fedCablingToken_, and edm::eventsetup::EventSetupRecordImplementation< T >::get().

142  {
144  }
const SiStripFedCabling * fedCabling_
PRODUCT const & get(ESGetToken< PRODUCT, T > const &iToken) const
edm::ESGetToken< SiStripFedCabling, SiStripFedCablingRcd > fedCablingToken_

◆ updateNoises()

void sistrip::FEDEmulatorModule::updateNoises ( const SiStripNoisesRcd rcd)
private

Definition at line 146 of file SiStripFEDEmulatorModule.cc.

References edm::eventsetup::DependentRecordImplementation< RecordT, ListT >::get(), noises_, and noisesToken_.

146 { noises_ = &rcd.get(noisesToken_); }
edm::ESGetToken< SiStripNoises, SiStripNoisesRcd > noisesToken_
ProductT const & get(ESGetToken< ProductT, DepRecordT > const &iToken) const

◆ updatePedestals()

void sistrip::FEDEmulatorModule::updatePedestals ( const SiStripPedestalsRcd rcd)
private

Definition at line 145 of file SiStripFEDEmulatorModule.cc.

References edm::eventsetup::EventSetupRecordImplementation< T >::get(), pedestals_, and pedestalsToken_.

145 { pedestals_ = &rcd.get(pedestalsToken_); }
PRODUCT const & get(ESGetToken< PRODUCT, T > const &iToken) const
edm::ESGetToken< SiStripPedestals, SiStripPedestalsRcd > pedestalsToken_
const SiStripPedestals * pedestals_

Member Data Documentation

◆ algorithms_

std::unique_ptr<SiStripRawProcessingAlgorithms> sistrip::FEDEmulatorModule::algorithms_
private

object for zero-suppression

Definition at line 79 of file SiStripFEDEmulatorModule.cc.

Referenced by produce().

◆ byModule_

bool sistrip::FEDEmulatorModule::byModule_
private

Definition at line 73 of file SiStripFEDEmulatorModule.cc.

Referenced by FEDEmulatorModule(), and produce().

◆ cablingWatcher_

edm::ESWatcher<SiStripFedCablingRcd> sistrip::FEDEmulatorModule::cablingWatcher_
private

Definition at line 88 of file SiStripFEDEmulatorModule.cc.

Referenced by produce().

◆ fedCabling_

const SiStripFedCabling* sistrip::FEDEmulatorModule::fedCabling_
private

Definition at line 84 of file SiStripFEDEmulatorModule.cc.

Referenced by produce(), and updateFedCabling().

◆ fedCablingToken_

edm::ESGetToken<SiStripFedCabling, SiStripFedCablingRcd> sistrip::FEDEmulatorModule::fedCablingToken_
private

Definition at line 81 of file SiStripFEDEmulatorModule.cc.

Referenced by updateFedCabling().

◆ fedEmulator_

sistrip::FEDEmulator sistrip::FEDEmulatorModule::fedEmulator_
private

Definition at line 75 of file SiStripFEDEmulatorModule.cc.

Referenced by FEDEmulatorModule(), and produce().

◆ messageLabel_

const char *const sistrip::FEDEmulatorModule::messageLabel_ = "SiStripFEDEmulatorModule"
staticprivate

Definition at line 77 of file SiStripFEDEmulatorModule.cc.

◆ noises_

const SiStripNoises* sistrip::FEDEmulatorModule::noises_
private

Definition at line 86 of file SiStripFEDEmulatorModule.cc.

Referenced by produce(), and updateNoises().

◆ noisesToken_

edm::ESGetToken<SiStripNoises, SiStripNoisesRcd> sistrip::FEDEmulatorModule::noisesToken_
private

Definition at line 83 of file SiStripFEDEmulatorModule.cc.

Referenced by updateNoises().

◆ noisesWatcher_

edm::ESWatcher<SiStripNoisesRcd> sistrip::FEDEmulatorModule::noisesWatcher_
private

Definition at line 90 of file SiStripFEDEmulatorModule.cc.

Referenced by produce().

◆ pedestals_

const SiStripPedestals* sistrip::FEDEmulatorModule::pedestals_
private

Definition at line 85 of file SiStripFEDEmulatorModule.cc.

Referenced by produce(), and updatePedestals().

◆ pedestalsToken_

edm::ESGetToken<SiStripPedestals, SiStripPedestalsRcd> sistrip::FEDEmulatorModule::pedestalsToken_
private

Definition at line 82 of file SiStripFEDEmulatorModule.cc.

Referenced by updatePedestals().

◆ pedestalsWatcher_

edm::ESWatcher<SiStripPedestalsRcd> sistrip::FEDEmulatorModule::pedestalsWatcher_
private

Definition at line 89 of file SiStripFEDEmulatorModule.cc.

Referenced by produce().

◆ spyReorderedDigisTag_

edm::InputTag sistrip::FEDEmulatorModule::spyReorderedDigisTag_
private

Definition at line 67 of file SiStripFEDEmulatorModule.cc.

Referenced by FEDEmulatorModule().

◆ spyReorderedDigisToken_

edm::EDGetTokenT<edm::DetSetVector<SiStripRawDigi> > sistrip::FEDEmulatorModule::spyReorderedDigisToken_
private

Definition at line 69 of file SiStripFEDEmulatorModule.cc.

Referenced by FEDEmulatorModule(), and produce().

◆ spyVirginRawDigisTag_

edm::InputTag sistrip::FEDEmulatorModule::spyVirginRawDigisTag_
private

Definition at line 68 of file SiStripFEDEmulatorModule.cc.

Referenced by FEDEmulatorModule().

◆ spyVirginRawDigisToken_

edm::EDGetTokenT<edm::DetSetVector<SiStripRawDigi> > sistrip::FEDEmulatorModule::spyVirginRawDigisToken_
private

Definition at line 70 of file SiStripFEDEmulatorModule.cc.

Referenced by FEDEmulatorModule(), and produce().