CMS 3D CMS Logo

SiStripFEDEmulatorModule.cc
Go to the documentation of this file.
1 // Original Author: Anne-Marie Magnan
2 // Created: 2010/01/21
3 //
4 
5 #include <sstream>
6 #include <memory>
7 #include <list>
8 #include <algorithm>
9 #include <cassert>
10 #include <vector>
11 
23 
33 
37 
39 
40 //for the zero suppression algorithm(s)
43 
46 
47 using edm::LogError;
48 using edm::LogInfo;
49 using edm::LogWarning;
50 
51 namespace sistrip {
52 
53  //
54  // Class declaration
55  //
56 
58  public:
59  explicit FEDEmulatorModule(const edm::ParameterSet&);
60  ~FEDEmulatorModule() override;
61 
62  private:
63  void produce(edm::Event&, const edm::EventSetup&) override;
64  //virtual void endJob();
65 
66  //tag of spydata collection
71 
72  //by fedIndex or module detid
73  bool byModule_;
74 
76 
77  static const char* const messageLabel_;
78 
79  std::unique_ptr<SiStripRawProcessingAlgorithms> algorithms_;
80 
87 
91  void updateFedCabling(const SiStripFedCablingRcd& rcd);
92  void updatePedestals(const SiStripPedestalsRcd& rcd);
93  void updateNoises(const SiStripNoisesRcd& rcd);
94  };
95 
96 } // namespace sistrip
97 
98 namespace sistrip {
99 
100  //
101  // Constructors and destructor
102  //
103  const char* const FEDEmulatorModule::messageLabel_ = "SiStripFEDEmulatorModule";
104 
106  : spyReorderedDigisTag_(iConfig.getParameter<edm::InputTag>("SpyReorderedDigisTag")),
107  spyVirginRawDigisTag_(iConfig.getParameter<edm::InputTag>("SpyVirginRawDigisTag")),
108  byModule_(iConfig.getParameter<bool>("ByModule")),
109  algorithms_(SiStripRawProcessingFactory::create(iConfig.getParameter<edm::ParameterSet>("Algorithms"),
110  consumesCollector())),
111  fedCablingToken_(esConsumes<>()),
112  pedestalsToken_(esConsumes<>()),
113  noisesToken_(esConsumes<>()),
114  cablingWatcher_(this, &sistrip::FEDEmulatorModule::updateFedCabling),
115  pedestalsWatcher_(this, &sistrip::FEDEmulatorModule::updatePedestals),
116  noisesWatcher_(this, &sistrip::FEDEmulatorModule::updateNoises) {
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
139 
141 
144  }
147 
148  // ------------ method called to for each event ------------
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
290 } //namespace sistrip
291 
292 //
293 // Define as a plug-in
294 //
295 
edm::ESWatcher< SiStripNoisesRcd > noisesWatcher_
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
void updatePedestals(const SiStripPedestalsRcd &rcd)
def create(alignables, pedeDump, additionalData, outputFile, config)
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)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
FedChannelConnection fedConnection(uint16_t fed_id, uint16_t fed_ch) const
T const * product() const
Definition: Handle.h:70
void produce(edm::Event &, const edm::EventSetup &) override
const SiStripFedCabling * fedCabling_
void fedIndex(uint32_t aFedIndex, uint16_t &aFedId, uint16_t &aFedChannel)
Log< level::Error, false > LogError
edm::ESGetToken< SiStripNoises, SiStripNoisesRcd > noisesToken_
sistrip classes
void retrieveNoises(const edm::ESHandle< SiStripNoises > &aHandle)
int iEvent
Definition: GenABIO.cc:224
PRODUCT const & get(ESGetToken< PRODUCT, T > const &iToken) const
size_type size() const
Return the number of contained DetSets.
Definition: DetSetVector.h:259
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyReorderedDigisToken_
Class containning control, module, detector and connection information, at the level of a FED channel...
static const char *const messageLabel_
void initialiseModule(const uint32_t aDetId, const uint32_t aNPairs, const uint32_t aPair)
void updateFedCabling(const SiStripFedCablingRcd &rcd)
void subtractCM(const std::vector< SiStripRawDigi > &pedSubtrDetSetData, std::vector< SiStripRawDigi > &cmSubtrDetSetData)
void updateNoises(const SiStripNoisesRcd &rcd)
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:325
const uint32_t & detId() const
edm::ESWatcher< SiStripPedestalsRcd > pedestalsWatcher_
Log< level::Info, false > LogInfo
edm::ESGetToken< SiStripFedCabling, SiStripFedCablingRcd > fedCablingToken_
static const uint16_t STRIPS_PER_FEDCH
void initialise(const bool byModule)
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)
Constants and enumerated types for FED/FEC systems.
const uint16_t & nApvPairs() const
bool empty() const
Definition: DetSet.h:62
uint16_t apvPairNumber() const
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
HLT enums.
iterator begin()
Return an iterator to the first DetSet.
Definition: DetSetVector.h:314
void retrievePedestals(const edm::ESHandle< SiStripPedestals > &aHandle)
Log< level::Warning, false > LogWarning
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:102
ProductT const & get(ESGetToken< ProductT, DepRecordT > const &iToken) const
FEDEmulatorModule(const edm::ParameterSet &)
sistrip::FEDEmulatorModule SiStripFEDEmulatorModule
edm::ESGetToken< SiStripPedestals, SiStripPedestalsRcd > pedestalsToken_
def move(src, dest)
Definition: eostools.py:511
edm::ESWatcher< SiStripFedCablingRcd > cablingWatcher_
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyVirginRawDigisToken_
const SiStripPedestals * pedestals_