CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiStripFEDEmulatorModule.cc
Go to the documentation of this file.
1 // Original Author: Anne-Marie Magnan
2 // Created: 2010/01/21
3 // $Id: SiStripFEDEmulatorModule.cc,v 1.4 2011/05/25 11:49:42 elmer Exp $
4 //
5 
6 #include <sstream>
7 #include <memory>
8 #include <list>
9 #include <algorithm>
10 #include <cassert>
11 #include <vector>
12 
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  //
55  // Class declaration
56  //
57 
59  {
60  public:
61 
62  explicit FEDEmulatorModule(const edm::ParameterSet&);
64 
65  private:
66 
67  virtual void beginRun( edm::Run&, const edm::EventSetup& );
68  virtual void produce(edm::Event&, const edm::EventSetup&);
69  //virtual void endJob();
70 
71  //tag of spydata collection
74 
75  //by fedIndex or module detid
76  bool byModule_;
77 
79 
80  static const char* messageLabel_;
81 
82  std::auto_ptr<SiStripRawProcessingAlgorithms> algorithms_;
83 
84  //utilities for cabling etc...
86 
87  };
88 
89 }//~sistrip
90 
91 namespace sistrip {
92 
93  //
94  // Constructors and destructor
95  //
96  const char* FEDEmulatorModule::messageLabel_ = "SiStripFEDEmulatorModule";
97 
98 
100  spyReorderedDigisTag_(iConfig.getParameter<edm::InputTag>("SpyReorderedDigisTag")),
101  spyVirginRawDigisTag_(iConfig.getParameter<edm::InputTag>("SpyVirginRawDigisTag")),
102  byModule_(iConfig.getParameter<bool>("ByModule")),
103  algorithms_(SiStripRawProcessingFactory::create(iConfig.getParameter<edm::ParameterSet>("Algorithms")))
104  {
105 
107 
108  if (!byModule_) { //if not by module
109  //the medians will be produced by fed id/channel
110  produces<std::map<uint32_t,std::vector<uint32_t> > >("Medians");
111  produces<edm::DetSetVector<SiStripRawDigi> >("PedestalsOrdered");
112  produces<edm::DetSetVector<SiStripProcessedRawDigi> >("NoisesOrdered");
113  produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrDigisOrdered");
114  produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrDigisOrdered");
115  }
116  else { //by module
117  produces<edm::DetSetVector<SiStripRawDigi> >("ModulePedestals");
118  produces<edm::DetSetVector<SiStripProcessedRawDigi> >("ModuleNoises");
119  produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrModuleDigis");
120  produces<std::map<uint32_t,std::vector<uint32_t> > >("ModuleMedians");
121  produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrModuleDigis");
122  produces<edm::DetSetVector<SiStripDigi> >("ZSModuleDigis");
123  }//end of by module check
124 
125  }//end of FEDEmulatorModule constructor
126 
128  {
129  }
130 
131  // ------------ method called to for each event ------------
132  void
134  {
135  //update cabling and pedestals
136  const SiStripFedCabling* lCabling = utility_.getCabling( iSetup );
139 
140  //initialise the algorithms object for the zero suppression
141  algorithms_->initialize(iSetup);
142 
143  //retrieve the digis
145  try { //to get the digis from the event
146  if (!byModule_) {
147  iEvent.getByLabel(spyReorderedDigisTag_, lDigisHandle);
148  }
149  else { //digis supplied by module
150  iEvent.getByLabel(spyVirginRawDigisTag_, lDigisHandle);
151  }//end of by module check
152  } catch (const cms::Exception& e) {
153  std::cout << e.what() ;
154  return;
155  } //end of get digis try
156 
157  const edm::DetSetVector<SiStripRawDigi> * lInputDigis = lDigisHandle.product();
158 
159  unsigned int lNDigis = lInputDigis->size();
160 
161  //define output containers
162  //reserve space, will push_back elements
163  std::vector<edm::DetSetVector<SiStripRawDigi>::detset > pedsData;
164  pedsData.reserve(lNDigis);
165  std::vector<edm::DetSetVector<SiStripProcessedRawDigi>::detset > noiseData;
166  noiseData.reserve(lNDigis);
167  std::vector<edm::DetSetVector<SiStripRawDigi>::detset > pedSubtrData;
168  pedSubtrData.reserve(lNDigis);
169  std::vector<edm::DetSetVector<SiStripRawDigi>::detset > cmSubtrData;
170  cmSubtrData.reserve(lNDigis);
171  //zero suppressed contained - no fixed size (could be empty) so no need to reserve elements.
172  std::vector< edm::DetSet<SiStripDigi> > zsData;
173 
174  //this is a map: no reserve/resize
175  std::map<uint32_t,std::vector<uint32_t> > medsData;
176 
177  edm::DetSetVector<SiStripRawDigi>::const_iterator inputChannel = lInputDigis->begin();
178 
179  for ( ; inputChannel!=lInputDigis->end(); ++inputChannel){//loop on input channels
180  uint32_t lDetId = inputChannel->detId(); //either fedIndex or detId
181 
182  pedsData.push_back( edm::DetSetVector<SiStripRawDigi>::detset(lDetId) );
183  noiseData.push_back( edm::DetSetVector<SiStripProcessedRawDigi>::detset(lDetId) );
184  pedSubtrData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId) );
185  cmSubtrData.push_back( edm::DetSetVector<SiStripRawDigi>::detset(lDetId) );
186 
187  unsigned int lNStrips = inputChannel->size();
188 
189  //define output digi containers
190  std::vector<SiStripRawDigi>& pedsDetSetData = pedsData.back().data;
191  pedsDetSetData.reserve(lNStrips);
192  std::vector<SiStripProcessedRawDigi>& noiseDetSetData = noiseData.back().data;
193  noiseDetSetData.reserve(lNStrips);
194  std::vector<SiStripRawDigi>& pedSubtrDetSetData = pedSubtrData.back().data;
195  pedSubtrDetSetData.reserve(lNStrips);
196  std::vector<SiStripRawDigi>& cmSubtrDetSetData = cmSubtrData.back().data;
197  cmSubtrDetSetData.reserve(lNStrips);
198  //zero suppressed - slightly different procedure as not fixed size
199  edm::DetSet<SiStripDigi> zsDetSetData(lDetId);
200 
201  //determine the number of APV pairs in the channel
202  uint32_t lNPairs = static_cast<uint32_t>(lNStrips*1./sistrip::STRIPS_PER_FEDCH);
203  uint32_t lPair = 0;
204 
205  std::vector<uint32_t> medsDetSetData;
206  medsDetSetData.reserve(lNPairs*2); //2*number of pairs per module. If not by module, lNPairs = 1...
207 
208  if (!byModule_) { //the input is not stored by module
209  //need to retrieve the proper detId from cabling
210  uint16_t lFedId = 0;
211  uint16_t lFedChannel = 0;
212  sistrip::SpyUtilities::fedIndex(lDetId, lFedId, lFedChannel);
213 
214  const FedChannelConnection & lConnection = lCabling->connection(lFedId,lFedChannel);
215  lDetId = lConnection.detId();
216  lNPairs = lConnection.nApvPairs();
217  lPair = lConnection.apvPairNumber();
218  }//end of by module check
219 
220  fedEmulator_.initialiseModule(lDetId,lNPairs,lPair);
221 
222  //get the pedestal values
223  //stored by module in the database
224  fedEmulator_.retrievePedestals(lPedsHandle);
225  fedEmulator_.retrieveNoises(lNoiseHandle);
226 
227  //last option: fill medians from these ped subtr data
228  //if want something else, need to call a method to fill
229  //the data member medians_ of the class fedEmulator.
230  fedEmulator_.subtractPedestals(inputChannel,
231  pedsDetSetData,
232  noiseDetSetData,
233  pedSubtrDetSetData,
234  medsDetSetData,
235  true);
236 
237  fedEmulator_.subtractCM(pedSubtrDetSetData,cmSubtrDetSetData);
238 
239  //fill the median map
240  medsData[inputChannel->detId()] = medsDetSetData;
241 
242  //zero suppress the digis
243  fedEmulator_.zeroSuppress(cmSubtrDetSetData, zsDetSetData, algorithms_);
244  if (zsDetSetData.size()) zsData.push_back( zsDetSetData );
245 
246  }//loop on input channels
247 
248 
249  std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > lPeds(new edm::DetSetVector<SiStripRawDigi>(pedsData,true));
250  std::auto_ptr<edm::DetSetVector<SiStripProcessedRawDigi> > lNoises(new edm::DetSetVector<SiStripProcessedRawDigi>(noiseData,true));
251 
252  std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputPedSubtr(new edm::DetSetVector<SiStripRawDigi>(pedSubtrData,true));
253 
254  std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputCMSubtr(new edm::DetSetVector<SiStripRawDigi>(cmSubtrData,true));
255 
256  std::auto_ptr<std::map<uint32_t,std::vector<uint32_t> > > lMedians(new std::map<uint32_t,std::vector<uint32_t> >(medsData));
257 
258  //zero suppressed digis
259  std::auto_ptr< edm::DetSetVector<SiStripDigi> > lOutputZS(new edm::DetSetVector<SiStripDigi>(zsData));
260 
261  if (!byModule_) {
262  iEvent.put(lMedians,"Medians");
263  iEvent.put(lPeds,"PedestalsOrdered");
264  iEvent.put(lNoises,"NoisesOrdered");
265  iEvent.put(lOutputPedSubtr,"PedSubtrDigisOrdered");
266  iEvent.put(lOutputCMSubtr,"CMSubtrDigisOrdered");
267  }
268  else {
269  iEvent.put(lPeds,"ModulePedestals");
270  iEvent.put(lNoises,"ModuleNoises");
271  iEvent.put(lOutputPedSubtr,"PedSubtrModuleDigis");
272  iEvent.put(lMedians,"ModuleMedians");
273  iEvent.put(lOutputCMSubtr,"CMSubtrModuleDigis");
274  iEvent.put(lOutputZS,"ZSModuleDigis");
275  }
276 
277  }//produce method
278 
279  // ------------ method called once each job just before starting event loop ------------
280  void
282  {
283 
284  }
285 
286 
287 
288 
289 }//namespace sistrip
290 
291 //
292 // Define as a plug-in
293 //
294 
void zeroSuppress(const std::vector< SiStripRawDigi > &cmSubtrDetSetData, edm::DetSet< SiStripDigi > &zsDetSetData, const std::auto_ptr< SiStripRawProcessingAlgorithms > &algorithms)
virtual char const * what() const
Definition: Exception.cc:141
static void fedIndex(uint32_t aFedIndex, uint16_t &aFedId, uint16_t &aFedChannel)
virtual void beginRun(edm::Run &, const edm::EventSetup &)
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:17
edm::ESHandle< SiStripNoises > getNoiseHandle(const edm::EventSetup &eventSetup)
uint16_t apvPairNumber() const
std::auto_ptr< SiStripRawProcessingAlgorithms > algorithms_
object for zero-suppression
edm::ESHandle< SiStripPedestals > getPedestalHandle(const edm::EventSetup &eventSetup)
const FedChannelConnection & connection(uint16_t fed_id, uint16_t fed_ch) const
void retrieveNoises(const edm::ESHandle< SiStripNoises > &aHandle)
size_type size() const
Definition: DetSet.h:64
int iEvent
Definition: GenABIO.cc:243
const uint32_t & detId() const
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:85
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)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:356
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:356
size_type size() const
Return the number of contained DetSets.
Definition: DetSetVector.h:278
static const uint16_t STRIPS_PER_FEDCH
void initialise(const bool byModule)
Constants and enumerated types for FED/FEC systems.
const SiStripFedCabling * getCabling(const edm::EventSetup &)
Updates the cabling object from the DB.
virtual void produce(edm::Event &, const edm::EventSetup &)
const uint16_t & nApvPairs() const
T const * product() const
Definition: Handle.h:74
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
tuple cout
Definition: gather_cfg.py:121
iterator begin()
Return an iterator to the first DetSet.
Definition: DetSetVector.h:341
void retrievePedestals(const edm::ESHandle< SiStripPedestals > &aHandle)
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:106
FEDEmulatorModule(const edm::ParameterSet &)
SurfaceDeformation * create(int type, const std::vector< double > &params)
sistrip::FEDEmulatorModule SiStripFEDEmulatorModule
Definition: Run.h:33