CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiStripZeroSuppression.cc
Go to the documentation of this file.
2 
11 #include <memory>
12 
15  : inputTags(conf.getParameter<std::vector<edm::InputTag> >("RawDigiProducersList")),
16  algorithms(SiStripRawProcessingFactory::create(conf.getParameter<edm::ParameterSet>("Algorithms"))),
17  storeCM(conf.getParameter<bool>("storeCM")),
18  mergeCollections(conf.getParameter<bool>("mergeCollections"))
19 
20 {
21 
22  produceRawDigis = conf.getParameter<bool>("produceRawDigis");
23  produceCalculatedBaseline = conf.getParameter<bool>("produceCalculatedBaseline");
24  produceBaselinePoints = conf.getParameter<bool>("produceBaselinePoints");
25  storeInZScollBadAPV = conf.getParameter<bool>("storeInZScollBadAPV");
26  fixCM = conf.getParameter<bool>("fixCM");
27 
28  if(mergeCollections){
29  storeCM = false;
30  produceRawDigis = false;
31  DigisToMergeZS = conf.getParameter<edm::InputTag>("DigisToMergeZS");
32  DigisToMergeVR = conf.getParameter<edm::InputTag>("DigisToMergeVR");
33  produces< edm::DetSetVector<SiStripDigi> > ("ZeroSuppressed");
34  }
35 
36  for(tag_iterator_t inputTag = inputTags.begin(); inputTag != inputTags.end(); ++inputTag ){
37  produces< edm::DetSetVector<SiStripDigi> > (inputTag->instance());
38  if(produceRawDigis) produces< edm::DetSetVector<SiStripRawDigi> > (inputTag->instance());
39  if(produceCalculatedBaseline) produces< edm::DetSetVector<SiStripProcessedRawDigi> > ("BADAPVBASELINE"+inputTag->instance());
40  if(produceBaselinePoints) produces< edm::DetSetVector<SiStripDigi> > ("BADAPVBASELINEPOINTS"+inputTag->instance());
41  if(storeCM) produces< edm::DetSetVector<SiStripProcessedRawDigi> > ("APVCM"+inputTag->instance());
42  }
43 
44 
45 
46 
47 
48 }
49 
52 
53  algorithms->initialize(es, e);
54 
55  if(mergeCollections){
57  }else{
58  this->StandardZeroSuppression(e);
59  }
60 }
61 
63 
64  for(tag_iterator_t inputTag = inputTags.begin(); inputTag != inputTags.end(); ++inputTag ) {
65 
67  e.getByLabel(*inputTag,input);
68 
69  if (input->size())
70  processRaw(*inputTag, *input);
71 
72  std::auto_ptr< edm::DetSetVector<SiStripDigi> > output(new edm::DetSetVector<SiStripDigi>(output_base) );
73  e.put( output, inputTag->instance() );
74 
75  if(produceRawDigis){
76  std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > outputraw(new edm::DetSetVector<SiStripRawDigi>(output_base_raw) );
77  e.put(outputraw, inputTag->instance() );
78  }
79 
81  std::auto_ptr< edm::DetSetVector<SiStripProcessedRawDigi> > outputbaseline(new edm::DetSetVector<SiStripProcessedRawDigi>(output_baseline) );
82  e.put(outputbaseline, "BADAPVBASELINE"+inputTag->instance() );
83  }
84 
86  std::auto_ptr< edm::DetSetVector<SiStripDigi> > outputbaselinepoints(new edm::DetSetVector<SiStripDigi>(output_baseline_points) );
87  e.put(outputbaselinepoints, "BADAPVBASELINEPOINTS"+inputTag->instance() );
88  }
89 
90  if(storeCM){
91  std::auto_ptr< edm::DetSetVector<SiStripProcessedRawDigi> > outputAPVCM(new edm::DetSetVector<SiStripProcessedRawDigi>(output_apvcm) );
92  e.put( outputAPVCM,"APVCM"+inputTag->instance());
93  }
94 
95  }
96 }
97 
98 
99 
100 
101 inline
104 
105  output_apvcm.clear();
106  output_baseline.clear();
107  output_baseline_points.clear();
108  output_base.clear();
109  output_base_raw.clear();
110 
111  if(storeCM) output_apvcm.reserve(16000);
112  if(produceCalculatedBaseline) output_baseline.reserve(16000);
114  if(produceRawDigis) output_base_raw.reserve(16000);
115  output_base.reserve(16000);
116 
117 
119  rawDigis = input.begin(); rawDigis != input.end(); ++rawDigis) {
120 
121  edm::DetSet<SiStripDigi> suppressedDigis(rawDigis->id);
122  int16_t nAPVflagged = 0;
123 
124  if ( "ProcessedRaw" == inputTag.instance()) nAPVflagged = algorithms->SuppressProcessedRawData(*rawDigis, suppressedDigis);
125  else if ( "VirginRaw" == inputTag.instance()) nAPVflagged = algorithms->SuppressVirginRawData(*rawDigis, suppressedDigis);
126  else
127  throw cms::Exception("Unknown input type")
128  << inputTag.instance() << " unknown. SiStripZeroZuppression can only process types \"VirginRaw\" and \"ProcessedRaw\" ";
129 
130  //here storing the output
131  this->storeExtraOutput(rawDigis->id, nAPVflagged);
132  if (suppressedDigis.size() && (storeInZScollBadAPV || nAPVflagged ==0))
133  output_base.push_back(suppressedDigis);
134 
135  if (produceRawDigis && nAPVflagged > 0){
136  edm::DetSet<SiStripRawDigi> outRawDigis(rawDigis->id);
137  this->formatRawDigis(rawDigis, outRawDigis);
138  output_base_raw.push_back(outRawDigis);
139  }
140 
141  }
142 
143 }
144 
145 inline
147  rawDigis, edm::DetSet<SiStripRawDigi>& outRawDigis){
148 
149  const std::vector<bool>& apvf = algorithms->GetAPVFlags();
150  edm::DetSet<SiStripRawDigi>::const_iterator itRawDigis = rawDigis->begin();
151 
152  uint32_t strip=0;
153  for (; itRawDigis != rawDigis->end(); ++itRawDigis){
154  int16_t APVn = strip/128;
155  if(apvf[APVn]) outRawDigis.push_back(*itRawDigis);
156  else outRawDigis.push_back(SiStripRawDigi(0));
157  ++strip;
158  }
159 
160 }
161 
162 
163 inline
164 void SiStripZeroSuppression::storeExtraOutput(uint32_t id, int16_t nAPVflagged){
165 
166  const std::vector< std::pair<short,float> >& vmedians = algorithms->getAPVsCM();
167  if(storeCM) this->storeCMN(id, vmedians);
168  if(nAPVflagged > 0){
169  if(produceCalculatedBaseline) this->storeBaseline(id, vmedians);
171  }
172 }
173 
174 
175 inline
176 void SiStripZeroSuppression::storeBaseline(uint32_t id, const std::vector< std::pair<short,float> >& vmedians){
177 
178  std::map< uint16_t, std::vector < int16_t> >& baselinemap = algorithms->GetBaselineMap();
179 
180  edm::DetSet<SiStripProcessedRawDigi> baselineDetSet(id);
181  std::map< uint16_t, std::vector < int16_t> >::iterator itBaselineMap;
182 
183  for(size_t i=0;i<vmedians.size();++i){
184  uint16_t APVn = vmedians[i].first;
185  float median = vmedians[i].second;
186  itBaselineMap = baselinemap.find(APVn);
187  if(itBaselineMap==baselinemap.end()){
188  for(size_t strip=0; strip < 128; ++strip) baselineDetSet.push_back(SiStripProcessedRawDigi(median));
189  } else {
190  for(size_t strip=0; strip < 128; ++strip) baselineDetSet.push_back(SiStripProcessedRawDigi((itBaselineMap->second)[strip]));
191  }
192 
193  }
194 
195  if(baselineDetSet.size())
196  output_baseline.push_back(baselineDetSet);
197 
198 }
199 
200 inline
202 
203  std::map< uint16_t, std::map< uint16_t, int16_t> >& BasPointVec = algorithms->GetSmoothedPoints();
204  std::map< uint16_t, std::map< uint16_t, int16_t> >::iterator itBasPointVect = BasPointVec.begin() ;
205  std::map< uint16_t, int16_t>::iterator itBaselinePointMap;
206 
207  edm::DetSet<SiStripDigi> baspointDetSet(id);
208 
209  for(; itBasPointVect != BasPointVec.end(); ++itBasPointVect){
210  uint16_t APVn= itBasPointVect->first;
211  itBaselinePointMap =itBasPointVect->second.begin();
212  for(;itBaselinePointMap != itBasPointVect->second.end(); ++itBaselinePointMap){
213  uint16_t bpstrip = (itBaselinePointMap->first) + APVn*128;
214  int16_t bp = itBaselinePointMap->second;
215  baspointDetSet.push_back(SiStripDigi(bpstrip,bp+128));
216 
217  }
218  }
219 
220 
221  if(baspointDetSet.size())
222  output_baseline_points.push_back(baspointDetSet);
223 
224 }
225 
226 inline
227 void SiStripZeroSuppression::storeCMN(uint32_t id, const std::vector< std::pair<short,float> >& vmedians){
228 
230  short apvNb=0;
231 
232  std::vector<bool> apvf;
233  apvf.clear();
234  apvf.insert(apvf.begin(), 6, false);
235 
236  if(fixCM){
237  std::vector<bool>& apvFlagged = algorithms->GetAPVFlags();
238  for(uint16_t it=0; it< apvFlagged.size(); ++it) apvf[it] = apvFlagged[it];
239  }
240 
241  for(size_t i=0;i<vmedians.size();++i){
242  if(vmedians[i].first>apvNb){
243  for(int i=0;i<vmedians[i].first-apvNb;++i){
244  apvDetSet.push_back(SiStripProcessedRawDigi(-999.));
245  apvNb++;
246  }
247  }
248 
249  if(fixCM&&apvf[vmedians[i].first]){
250  apvDetSet.push_back(SiStripProcessedRawDigi(-999.));
251  }else{
252  apvDetSet.push_back(SiStripProcessedRawDigi(vmedians[i].second));
253  }
254  apvNb++;
255  }
256 
257  if(apvDetSet.size())
258  output_apvcm.push_back(apvDetSet);
259 
260 }
261 
262 
264 
265  std::cout<< "starting Merging" << std::endl;
268  e.getByLabel(DigisToMergeZS,inputdigi);
269  e.getByLabel(DigisToMergeVR,inputraw);
270 
271  std::cout << inputdigi->size() << " " << inputraw->size() << std::endl;
272 
273  if (inputraw->size()){
274 
275  std::vector<edm::DetSet<SiStripDigi> > outputdigi;
276  outputdigi.clear();
277 
278  //std::cout << "copying the input ZS to the output ZS collection" << std::endl;
279  for ( edm::DetSetVector<SiStripDigi>::const_iterator Digis = inputdigi->begin(); Digis != inputdigi->end(); ++Digis) outputdigi.push_back(*Digis);
280 
281 
282  std::cout << "looping over the raw data collection" << std::endl;
283  for ( edm::DetSetVector<SiStripRawDigi>::const_iterator rawDigis = inputraw->begin(); rawDigis != inputraw->end(); ++rawDigis) {
284 
285  edm::DetSet<SiStripRawDigi>::const_iterator itRawDigis = rawDigis->begin();
286  uint16_t nAPV = rawDigis->size()/128;
287  uint32_t rawDetId = rawDigis->id;
288 
289  std::vector<bool> restoredAPV;
290  restoredAPV.clear();
291  restoredAPV.insert(restoredAPV.begin(), nAPV, false);
292 
293 
294  bool isModuleRestored = false;
295  for( uint16_t strip =0; strip < rawDigis->size();++strip){
296  if(itRawDigis[strip].adc()!=0){
297  restoredAPV[strip/128] = true;
298  isModuleRestored = true;
299  }
300  }
301 
302 
303  if(isModuleRestored){
304  std::cout << "apply the ZS to the raw data collection" << std::endl;
305  edm::DetSet<SiStripDigi> suppressedDigis(rawDetId);
306  std::vector<int16_t> processedRawDigis(rawDigis->size());
307  algorithms->SuppressVirginRawData(*rawDigis, suppressedDigis);
308 
309  if(suppressedDigis.size()){
310  std::cout << "looking for the detId with the new ZS in the collection of the zero suppressed data" << std::endl;
311  std::vector<edm::DetSet<SiStripDigi> >::iterator zsModule = outputdigi.begin();
312  //std::vector<edm::DetSet<SiStripDigi> >::iterator LastLowerIdDigis = zsModule;
313 
314  uint32_t zsDetId = zsModule->id;
315  bool isModuleInZscollection = false;
316  while((zsDetId <= rawDetId)&&(zsModule != outputdigi.end())&&(!isModuleInZscollection)){
317  //std::cout << rawDetId << " ==== " << zsDetId << std::endl;
318  if( zsDetId == rawDetId){
319  isModuleInZscollection = true;
320  }else{
321  ++zsModule;
322  zsDetId = zsModule->id;
323  }
324  }
325  std::cout << "after the look " << rawDetId << " ==== " << zsDetId << std::endl;
326  std::cout << "exiting looking for the detId with the new ZS in the collection of the zero suppressed data" << std::endl;
327 
328  //creating the map containing the digis (in rawdigi format) merged
329  std::vector<uint16_t> MergedRawDigis;
330  MergedRawDigis.clear();
331  MergedRawDigis.insert(MergedRawDigis.begin(), nAPV*128, 0);
332 
333  uint32_t count=0; // to be removed...
334 
335  edm::DetSet<SiStripDigi> newDigiToIndert(rawDetId);
336  if(!isModuleInZscollection){
337  std::cout << "WE HAVE A PROBLEM, THE MODULE IS NTOT FOUND" << std::endl;
338  outputdigi.insert(zsModule, newDigiToIndert);
339  --zsModule;
340  std::cout << "new module id -1 " << zsModule->id << std::endl;
341  ++zsModule;
342  std::cout << "new module id " << zsModule->id << std::endl;
343  ++zsModule;
344  std::cout << "new module id +1 " << zsModule->id << std::endl;
345  --zsModule;
346 
347  } else {
348  std::cout << "inserting only the digis for not restored APVs" << std::endl;
349  std::cout << "size : " << zsModule->size() << std::endl;
350  edm::DetSet<SiStripDigi>::iterator itZsModule = zsModule->begin();
351  for(; itZsModule != zsModule->end(); ++itZsModule){
352  uint16_t adc = itZsModule->adc();
353  uint16_t strip = itZsModule->strip();
354  if(!restoredAPV[strip/128]){
355  MergedRawDigis[strip] = adc;
356  ++count;
357  std::cout << "original count: "<< count << " strip: " << strip << " adc: " << adc << std::endl;
358  }
359  }
360 
361  }
362 
363  std::cout << "size of digis to keep: " << count << std::endl;
364  std::cout << "inserting only the digis for the restored APVs" << std::endl;
365  std::cout << "size : " << suppressedDigis.size() << std::endl;
366  edm::DetSet<SiStripDigi>::iterator itSuppDigi = suppressedDigis.begin();
367  for(; itSuppDigi != suppressedDigis.end(); ++itSuppDigi){
368  uint16_t adc = itSuppDigi->adc();
369  uint16_t strip = itSuppDigi->strip();
370  if(restoredAPV[strip/128]){
371  MergedRawDigis[strip] = adc;
372  std::cout << "new suppressed strip: " << strip << " adc: " << adc << std::endl;
373  }
374  }
375 
376 
377 
378  std::cout << "suppressing the raw digis" << std::endl;
379  zsModule->clear();
380  for(uint16_t strip=0; strip < MergedRawDigis.size(); ++strip){
381  uint16_t adc = MergedRawDigis[strip];
382  if(adc) zsModule->push_back(SiStripDigi(strip, adc));
383  }
384  std::cout << "size zsModule after the merging: " << zsModule->size() << std::endl;
385  if((count + suppressedDigis.size()) != zsModule->size()) std::cout << "WE HAVE A PROBLEM!!!! THE NUMBER OF DIGIS IS NOT RIGHT==============" << std::endl;
386  std::cout << "exiting suppressing the raw digis" << std::endl;
387  }//if new ZS digis size
388  } //if module restored
389  }//loop over raw data collection
390 
391  uint32_t oldid =0;
392  for(edm::DetSetVector<SiStripDigi>::const_iterator dg = outputdigi.begin(); dg != outputdigi.end(); ++dg){
393  uint32_t iddg = dg->id;
394  if(iddg < oldid){
395  std::cout<< "NOT IN THE RIGHT ORGER" << std:: endl;
396  std::cout<< "======================="<< std:: endl;
397  }
398  oldid = iddg;
399  }
400 
401 
402  std::cout << "write the output vector" << std::endl;
403  std::auto_ptr< edm::DetSetVector<SiStripDigi> > output(new edm::DetSetVector<SiStripDigi>(outputdigi) );
404  e.put( output, "ZeroSuppressed" );
405 
406 
407  }//if inputraw.size
408 
409 
410 
411 }
412 
414 
415  for(tag_iterator_t inputTag = inputTags.begin(); inputTag != inputTags.end(); ++inputTag ) {
416 
419  e.getByLabel(*inputTag,inputdigi);
420  e.getByLabel(*inputTag,inputraw);
421 
422  std::vector<edm::DetSet<SiStripDigi> > outputdigi;
423  std::vector<edm::DetSet<SiStripRawDigi> > outputraw;
424 
425 
426  if (inputraw->size())
427  processRaw(*inputTag, *inputraw);
428 
429 
430  for ( std::vector<edm::DetSet<SiStripDigi> >::const_iterator itinputdigi = inputdigi->begin(); itinputdigi !=inputdigi->end(); ++itinputdigi) {
431  output_base.push_back(*itinputdigi);
432  }
433 
434  std::auto_ptr< edm::DetSetVector<SiStripDigi> > output(new edm::DetSetVector<SiStripDigi>(output_base) );
435  e.put( output, inputTag->instance() );
436 
437  }
438 
439 }
int adc(sample_type sample)
get the ADC sample (12 bits)
iterator end()
Definition: DetSet.h:61
std::vector< edm::InputTag > inputTags
T getParameter(std::string const &) const
virtual void produce(edm::Event &, const edm::EventSetup &)
int i
Definition: DBlmapReader.cc:9
void formatRawDigis(edm::DetSetVector< SiStripRawDigi >::const_iterator, edm::DetSet< SiStripRawDigi > &)
void push_back(const T &t)
Definition: DetSet.h:69
std::vector< edm::DetSet< SiStripDigi > > output_base
void strip(std::string &input, const std::string &blanks=" \n\t")
Definition: stringTools.cc:16
void CollectionMergedZeroSuppression(edm::Event &)
collection_type::iterator iterator
Definition: DetSet.h:33
A signed Digi for the silicon strip detector, containing only adc information, and suitable for stori...
void processRaw(const edm::InputTag &, const edm::DetSetVector< SiStripRawDigi > &)
std::vector< edm::DetSet< SiStripDigi > > output_baseline_points
void StandardZeroSuppression(edm::Event &)
size_type size() const
Definition: DetSet.h:64
U second(std::pair< T, U > const &p)
std::auto_ptr< SiStripRawProcessingAlgorithms > algorithms
void storeExtraOutput(uint32_t, int16_t)
void storeCMN(uint32_t, const std::vector< std::pair< short, float > > &)
void MergeCollectionsZeroSuppression(edm::Event &)
std::vector< edm::DetSet< SiStripProcessedRawDigi > > output_apvcm
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:85
std::vector< edm::DetSet< SiStripProcessedRawDigi > > output_baseline
A Digi for the silicon strip detector, containing both strip and adc information, and suitable for st...
Definition: SiStripDigi.h:12
bool first
Definition: L1TdeRCT.cc:94
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
tuple conf
Definition: dbtoconf.py:185
void storeBaseline(uint32_t, const std::vector< std::pair< short, float > > &)
iterator begin()
Definition: DetSet.h:60
std::vector< edm::DetSet< SiStripRawDigi > > output_base_raw
SiStripZeroSuppression(const edm::ParameterSet &)
tuple cout
Definition: gather_cfg.py:121
iterator begin()
Return an iterator to the first DetSet.
Definition: DetSetVector.h:341
collection_type::const_iterator const_iterator
Definition: DetSet.h:34
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:106
A Digi for the silicon strip detector, containing only adc information, and suitable for storing raw ...
std::string const & instance() const
Definition: InputTag.h:26
SurfaceDeformation * create(int type, const std::vector< double > &params)
std::vector< edm::InputTag >::const_iterator tag_iterator_t