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  doAPVRestore(conf.getParameter<bool>("doAPVRestore")),
19  mergeCollections(conf.getParameter<bool>("mergeCollections"))
20 
21 {
22 
23  if(doAPVRestore){
24  produceRawDigis = conf.getParameter<bool>("produceRawDigis");
25  produceCalculatedBaseline = conf.getParameter<bool>("produceCalculatedBaseline");
26  produceBaselinePoints = conf.getParameter<bool>("produceBaselinePoints");
27  storeInZScollBadAPV = conf.getParameter<bool>("storeInZScollBadAPV");
28  useCMMeanMap = conf.getParameter<bool>("useCMMeanMap");
29  fixCM = conf.getParameter<bool>("fixCM");
30  } else {
31  produceRawDigis = false;
33  produceBaselinePoints = false;
34  storeInZScollBadAPV = false;
35  useCMMeanMap = false;
36  fixCM = false;
37  }
38 
39  if(mergeCollections){
40  storeCM = false;
41  produceRawDigis = false;
42  }
43 
44  for(tag_iterator_t inputTag = inputTags.begin(); inputTag != inputTags.end(); ++inputTag ){
45  produces< edm::DetSetVector<SiStripDigi> > (inputTag->instance());
46  if(produceRawDigis)
47  produces< edm::DetSetVector<SiStripRawDigi> > (inputTag->instance());
48  }
49 
51  produces< edm::DetSetVector<SiStripProcessedRawDigi> > ("BADAPVBASELINE");
52 
54  produces< edm::DetSetVector<SiStripDigi> > ("BADAPVBASELINEPOINTS");
55 
56  if(storeCM)
57  produces< edm::DetSetVector<SiStripProcessedRawDigi> > ("APVCM");
58 
59 
60 }
61 
64 
65  //std::cout << "SiStripZeroSuppression EventN: " <<e.id() << std::endl;
66  algorithms->initialize(es);
67  if( doAPVRestore && useCMMeanMap) algorithms->restorer->LoadMeanCMMap( e );
68 
71  else
72  this->StandardZeroSuppression(e);
73 
74 }
75 
77 
78  for(tag_iterator_t inputTag = inputTags.begin(); inputTag != inputTags.end(); ++inputTag ) {
79 
81  e.getByLabel(*inputTag,input);
82 
83  std::vector<edm::DetSet<SiStripDigi> > output_base;
84  std::vector<edm::DetSet<SiStripRawDigi> > output_base_raw;
85 
86  if (input->size())
87  processRaw(*inputTag, *input, output_base, output_base_raw );
88 
89  std::auto_ptr< edm::DetSetVector<SiStripDigi> > output(new edm::DetSetVector<SiStripDigi>(output_base) );
90  e.put( output, inputTag->instance() );
91 
92 
93  if(produceRawDigis){
94  std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > outputraw(new edm::DetSetVector<SiStripRawDigi>(output_base_raw) );
95  e.put(outputraw, inputTag->instance() );
96 
97 
98  }
99  }
100 
101 
103  std::auto_ptr< edm::DetSetVector<SiStripProcessedRawDigi> > outputbaseline(new edm::DetSetVector<SiStripProcessedRawDigi>(output_baseline) );
104  e.put(outputbaseline, "BADAPVBASELINE" );
105  }
106 
108  std::auto_ptr< edm::DetSetVector<SiStripDigi> > outputbaselinepoints(new edm::DetSetVector<SiStripDigi>(output_baseline_points) );
109  e.put(outputbaselinepoints, "BADAPVBASELINEPOINTS" );
110  }
111 
112  if(storeCM){
113  std::auto_ptr< edm::DetSetVector<SiStripProcessedRawDigi> > outputAPVCM(new edm::DetSetVector<SiStripProcessedRawDigi>(output_apvcm) );
114  e.put( outputAPVCM,"APVCM");
115  }
116 }
117 
118 
120 
121  for(tag_iterator_t inputTag = inputTags.begin(); inputTag != inputTags.end(); ++inputTag ) {
122 
125  e.getByLabel(*inputTag,inputdigi);
126  e.getByLabel(*inputTag,inputraw);
127 
128  std::vector<edm::DetSet<SiStripDigi> > outputdigi;
129  std::vector<edm::DetSet<SiStripRawDigi> > outputraw;
130 
131  if (inputraw->size())
132  processRaw(*inputTag, *inputraw, outputdigi, outputraw );
133 
134 
135  for ( std::vector<edm::DetSet<SiStripDigi> >::const_iterator itinputdigi = inputdigi->begin(); itinputdigi !=inputdigi->end(); ++itinputdigi) {
136  outputdigi.push_back(*itinputdigi);
137  }
138 
139  std::auto_ptr< edm::DetSetVector<SiStripDigi> > output(new edm::DetSetVector<SiStripDigi>(outputdigi) );
140  e.put( output, inputTag->instance() );
141 
142  }
143 
144 }
145 
146 inline
149 
150  if(storeCM){
151  output_apvcm.clear();
152  output_apvcm.reserve(16000);
153  }
154 
156  output_baseline.clear();
157  output_baseline.reserve(16000);
158  }
159 
161  output_baseline_points.clear();
162  output_baseline_points.reserve(16000);
163  }
164 
165  output.reserve(10000);
166  outputraw.reserve(10000);
168  rawDigis = input.begin(); rawDigis != input.end(); ++rawDigis) {
169 
170  edm::DetSet<SiStripDigi> suppressedDigis(rawDigis->id);
171 
172  int16_t nAPVflagged = 0;
173 
174  if ( "ProcessedRaw" == inputTag.instance()) {
175  std::vector<int16_t> processedRawDigis, processedRawDigisCopy ;
176  transform(rawDigis->begin(), rawDigis->end(), back_inserter(processedRawDigis), boost::bind(&SiStripRawDigi::adc , _1));
177  if( doAPVRestore ){
178  processedRawDigisCopy.assign(processedRawDigis.begin(), processedRawDigis.end());
179  }
180  algorithms->subtractorCMN->subtract( rawDigis->id, processedRawDigis);
181  if( doAPVRestore ){
182  nAPVflagged = algorithms->restorer->inspect( rawDigis->id, processedRawDigisCopy, algorithms->subtractorCMN->getAPVsCM() );
183  algorithms->restorer->restore( processedRawDigis );
184  }
185  algorithms->suppressor->suppress( processedRawDigis, suppressedDigis );
186 
187  const std::vector< std::pair<short,float> >& vmedians= algorithms->subtractorCMN->getAPVsCM();
188  if(storeCM) this->storeCMN(rawDigis->id, vmedians);
189  if(produceCalculatedBaseline&& nAPVflagged > 0){
190  std::map< uint16_t, std::vector < int16_t> >& baselinemap = algorithms->restorer->GetBaselineMap();
191  this->storeBaseline(rawDigis->id, vmedians, baselinemap);
192  }
193  // if(produceBaselinePoints&& nAPVflagged > 0){
194  // std::vector< std::map< uint16_t, int16_t> >& baselinpoints = algorithms->restorer->GetSmoothedPoints();
195  // this->storeBaselinePoints(rawDigis->id, baselinpoints);
196  // }
197  } else if ( "VirginRaw" == inputTag.instance()) {
198  std::vector<int16_t> processedRawDigis(rawDigis->size()), processedRawDigisCopy;
199  algorithms->subtractorPed->subtract( *rawDigis, processedRawDigis);
200  if( doAPVRestore ){
201  processedRawDigisCopy.assign(processedRawDigis.begin(), processedRawDigis.end());
202  }
203  algorithms->subtractorCMN->subtract( rawDigis->id, processedRawDigis);
204  if( doAPVRestore ){
205  nAPVflagged = algorithms->restorer->inspect( rawDigis->id, processedRawDigisCopy, algorithms->subtractorCMN->getAPVsCM() );
206  algorithms->restorer->restore( processedRawDigis );
207  }
208  algorithms->suppressor->suppress( processedRawDigis, suppressedDigis );
209 
210  const std::vector< std::pair<short,float> >& vmedians = algorithms->subtractorCMN->getAPVsCM();
211  if(storeCM) this->storeCMN(rawDigis->id, vmedians);
212  if(produceCalculatedBaseline&& nAPVflagged > 0){
213  std::map< uint16_t, std::vector < int16_t> >& baselinemap = algorithms->restorer->GetBaselineMap();
214  this->storeBaseline(rawDigis->id, vmedians, baselinemap);
215  }
216  // if(produceBaselinePoints&& nAPVflagged > 0){
217  // std::vector< std::map< uint16_t, int16_t> >& baselinpoints = algorithms->restorer->GetSmoothedPoints();
218  // this->storeBaselinePoints(rawDigis->id, baselinpoints);
219  // }
220 
221  } else
222 
223  throw cms::Exception("Unknown input type")
224  << inputTag.instance() << " unknown. SiStripZeroZuppression can only process types \"VirginRaw\" and \"ProcessedRaw\" ";
225 
226  if (suppressedDigis.size() && (storeInZScollBadAPV || nAPVflagged ==0))
227  output.push_back(suppressedDigis);
228 
229  if (produceRawDigis && nAPVflagged > 0)
230  outputraw.push_back(*rawDigis);
231 
232  }
233 
234 }
235 
236 
237 inline
238 void SiStripZeroSuppression::storeBaseline(uint32_t id, const std::vector< std::pair<short,float> >& vmedians, std::map< uint16_t, std::vector < int16_t> >& baselinemap){
239 
240  edm::DetSet<SiStripProcessedRawDigi> baselineDetSet(id);
241  std::map< uint16_t, std::vector < int16_t> >::iterator itBaselineMap;
242 
243  for(size_t i=0;i<vmedians.size();++i){
244  uint16_t APVn = vmedians[i].first;
245  float median = vmedians[i].second;
246  itBaselineMap = baselinemap.find(APVn);
247  if(itBaselineMap==baselinemap.end()){
248  for(size_t strip=0; strip < 128; ++strip) baselineDetSet.push_back(SiStripProcessedRawDigi(median));
249  } else {
250  for(size_t strip=0; strip < 128; ++strip) baselineDetSet.push_back(SiStripProcessedRawDigi((itBaselineMap->second)[strip]));
251  }
252 
253  }
254 
255  if(baselineDetSet.size())
256  output_baseline.push_back(baselineDetSet);
257 
258 }
259 
260 inline
261 void storeBaselinePoints(uint32_t id, std::vector< std::map< uint16_t, int16_t> >& BasPointVec){
262 
263  /*dm::DetSet<SiStripDigi> baspointDetSet(id);
264  std::vector< std::map< uint16_t, int16_t> >::iterator itBasPointVec;
265 
266  for(size_t i=0;i<vmedians.size();++i){
267  uint16_t APVn = vmedians[i].first;
268  float median = vmedians[i].second;
269  itBaselineMap = baselinemap.find(APVn);
270  if(itBaselineMap==baselinemap.end()){
271  for(size_t strip=0; strip < 128; ++strip) baselineDetSet.push_back(SiStripProcessedRawDigi(median));
272  } else {
273  for(size_t strip=0; strip < 128; ++strip) baselineDetSet.push_back(SiStripProcessedRawDigi((itBaselineMap->second)[strip]));
274  }
275 
276  }
277 
278  if(baselineDetSet.size())
279  output_baseline_points.push_back(baselineDetSet);
280  */
281 }
282 
283 inline
284 void SiStripZeroSuppression::storeCMN(uint32_t id, const std::vector< std::pair<short,float> >& vmedians){
285 
287  short apvNb=0;
288  for(size_t i=0;i<vmedians.size();++i){
289  if(vmedians[i].first>apvNb){
290  for(int i=0;i<vmedians[i].first-apvNb;++i){
291  apvDetSet.push_back(SiStripProcessedRawDigi(0.));
292  apvNb++;
293  }
294  }
295  apvDetSet.push_back(SiStripProcessedRawDigi(vmedians[i].second));
296  //std::cout << "CM patch in VR " << rawDigis->id << " " << vmedians[i].first << " " << vmedians[i].second << " " << apvNb<< std::endl;
297  apvNb++;
298  }
299  if(fixCM) algorithms->restorer->fixAPVsCM( apvDetSet );
300  if(apvDetSet.size())
301  output_apvcm.push_back(apvDetSet);
302 
303 }
const uint16_t & adc() const
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 push_back(const T &t)
Definition: DetSet.h:67
void strip(std::string &input, const std::string &blanks=" \n\t")
Definition: stringTools.cc:16
void CollectionMergedZeroSuppression(edm::Event &)
A signed Digi for the silicon strip detector, containing only adc information, and suitable for stori...
std::vector< edm::DetSet< SiStripDigi > > output_baseline_points
void StandardZeroSuppression(edm::Event &)
void storeBaselinePoints(uint32_t id, std::vector< std::map< uint16_t, int16_t > > &BasPointVec)
size_type size() const
Definition: DetSet.h:62
U second(std::pair< T, U > const &p)
std::auto_ptr< SiStripRawProcessingAlgorithms > algorithms
void storeCMN(uint32_t, const std::vector< std::pair< short, float > > &)
std::vector< edm::DetSet< SiStripProcessedRawDigi > > output_apvcm
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:84
void storeBaseline(uint32_t, const std::vector< std::pair< short, float > > &, std::map< uint16_t, std::vector< int16_t > > &)
std::vector< edm::DetSet< SiStripProcessedRawDigi > > output_baseline
void processRaw(const edm::InputTag &, const edm::DetSetVector< SiStripRawDigi > &, std::vector< edm::DetSet< SiStripDigi > > &, std::vector< edm::DetSet< SiStripRawDigi > > &)
bool first
Definition: L1TdeRCT.cc:79
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:355
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:356
tuple conf
Definition: dbtoconf.py:185
tuple input
Definition: collect_tpl.py:10
SiStripZeroSuppression(const edm::ParameterSet &)
iterator begin()
Return an iterator to the first DetSet.
Definition: DetSetVector.h:341
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:106
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