CMS 3D CMS Logo

SiPixelCalibDigiProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SiPixelCalibDigiProducer
4 // Class: SiPixelCalibDigiProducer
5 //
13 //
14 // Original Author: Freya Blekman
15 // Created: Wed Oct 31 15:28:52 CET 2007
16 //
17 //
18 
19 // system include files
20 
21 // user include files
23 
25 
32 
34 #include <sstream>
35 
36 //
37 // constants, enums and typedefs
38 //
39 
40 //
41 // static data member definitions
42 //
43 
44 //
45 // constructors and destructor
46 //
48  : src_(iConfig.getParameter<edm::InputTag>("src")),
49  iEventCounter_(0),
50  ignore_non_pattern_(iConfig.getParameter<bool>("ignoreNonPattern")),
51  control_pattern_size_(iConfig.getParameter<bool>("checkPatternEachEvent")),
52  includeErrors_(iConfig.getUntrackedParameter<bool>("includeErrors", false)),
53  errorType(iConfig.getUntrackedParameter<int>("errorTypeNumber", 1)),
54  conf_(iConfig),
55  number_of_pixels_per_pattern_(0),
56  use_realeventnumber_(iConfig.getParameter<bool>("useRealEventNumber"))
57 
58 {
59  tPixelDigi = consumes<edm::DetSetVector<PixelDigi>>(src_);
60  //register your products
61  produces<edm::DetSetVector<SiPixelCalibDigi>>();
62  if (includeErrors_)
63  produces<edm::DetSetVector<SiPixelCalibDigiError>>();
64 }
65 
67  // do anything here that needs to be done at desctruction time
68  // (e.g. close files, deallocate resources etc.)
69 }
70 
71 //
72 // member functions
73 //
74 
76 // function description:
77 // this function checks where/when the pattern changes so that one can fill the data from the temporary container into the event
79  // std::cout << "in store() " << std::endl;
80  if (iEventCounter_ % pattern_repeat_ == 0) {
81  // std::cout << "now at event " << iEventCounter_ <<" where we save the calibration information into the CMSSW digi";
82  return true;
83  } else if (iEventCounter_ == calib_->expectedTotalEvents())
84  return true;
85  else
86  return false;
87  return true;
88 }
90 // function description:
91 // fill function, uses maps to keep track of which pixel is where in the local storage container. Called every event to fill and compress the digi data into calibdig format
93  // figure out which calibration point we're on now..
94  short icalibpoint = calib_->vcalIndexForEvent(iEventCounter_);
96  iEvent.getByToken(tPixelDigi, pixelDigis);
97 
98  edm::LogInfo("SiPixelCalibProducer") << "in fill(), calibpoint " << icalibpoint << " ndigis " << pixelDigis->size()
99  << std::endl;
100  // loop over the data and store things
102  for (digiIter = pixelDigis->begin(); digiIter != pixelDigis->end(); ++digiIter) { // ITERATOR OVER DET IDs
103  uint32_t detid = digiIter->id;
104  edm::DetSet<PixelDigi>::const_iterator ipix; // ITERATOR OVER DIGI DATA
105 
106  for (ipix = digiIter->data.begin(); ipix != digiIter->end(); ++ipix) {
107  // fill in the appropriate location of the temporary data container
108  fillPixel(detid, ipix->row(), ipix->column(), icalibpoint, ipix->adc());
109  }
110  }
111 }
113 // function description:
114 // this is the function where we check the cabling map and see if we can assign a fed id to the det ID.
115 // returns false if no fed <-> detid association was found
117  // edm::LogInfo("SiPixelCalibProducer") << "in checkFED" << std::endl;
118 
119  if (detid_to_fedid_[detid])
120  return true;
121  for (int fedid = 0; fedid <= 40; ++fedid) {
122  // edm::LogInfo("SiPixelCalibProducer") << " looking at fedid " << fedid << std::endl;
124  if (converter.hasDetUnit(detid)) {
125  detid_to_fedid_[detid] = fedid;
126  edm::LogInfo("SiPixelCalibDigiProducer")
127  << "matched detid " << detid << " to fed " << detid_to_fedid_[detid] << std::endl;
128  return true;
129  }
130  }
131  return false;
132 }
133 
135 // function description:
136 // this is the function where we look in the maps to find the correct calibration digi container, after which the data is filled.
137 void SiPixelCalibDigiProducer::fillPixel(uint32_t detid, short row, short col, short ipoint, short adc) {
138  // edm::LogInfo("SiPixelCalibProducer") << " in fillpixel()" << std::endl;
139 
140  // edm::LogInfo("SiPixelCalibProducer") << "in fillPixel " << detid << " " << row << " " << col << " " << ipoint << " " << adc << std::endl;
141  if (!checkFED(detid)) {
142  edm::LogError("SiPixelCalibDigiProducer") << " was unable to match detid " << detid << " to a FED!" << std::endl;
143  return;
144  }
145  if (!checkPixel(detid, row, col)) {
146  return;
147  }
148  // now the check if the pixel exists and fill
149  //
150  pixelstruct temppixelworker;
151  temppixelworker.first = detid;
152  temppixelworker.second.first = row;
153  temppixelworker.second.second = col;
154  std::map<pixelstruct, SiPixelCalibDigi>::const_iterator ipix = intermediate_data_.find(temppixelworker);
155 
156  if (ipix == intermediate_data_.end()) {
157  SiPixelCalibDigi tempdigi(calib_->nVCal());
158  tempdigi.setrowcol(row, col);
159  intermediate_data_[temppixelworker] = tempdigi;
160  }
161 
162  intermediate_data_[temppixelworker].fill(ipoint, adc);
163  return;
164 }
166 // function description:
167 // this function cleans up after everything in the pattern is filled. This involves setting the content of the intermediate_data_ containers to zero and completely emptying the map
169  // edm::LogInfo("SiPixelCalibProducer") << "in clear() " << std::endl;
170  // this is where we empty the containers so they can be re-filled
171  // the idea: the detPixelMap_ container shrinks/expands as a function
172  // of the number of pixels looked at at one particular time...
173  // unlike the intermediate_data_ container which only expands when
174  // detPixelMap_ becomes bigger than intermedate_data_
175 
176  // shrink the detPixelMap_
177  uint32_t tempsize = intermediate_data_.size();
178  if (tempsize > number_of_pixels_per_pattern_) {
179  edm::LogError("SiPixelCalibDigiProducer") << "Number of pixels in pattern is now: " << tempsize << ", size is was "
180  << number_of_pixels_per_pattern_ << std::endl;
182  }
183 
185  intermediate_data_.clear();
186 
187  // and erase the error bits
188  error_data_.erase(error_data_.begin(), error_data_.end());
189  error_data_.clear();
190 }
191 
193 // function description:
194 // This method gets the pattern from the calib_ (SiPixelCalibConfiguration) object and fills a vector of pairs that is easier to check
196  // edm::LogInfo("SiPixelCalibProducer") << "in setPattern()" << std::endl;
197  uint32_t patternnumber = (iEventCounter_ - 1) / pattern_repeat_;
198  uint32_t rowpatternnumber = patternnumber / calib_->nColumnPatterns();
199  uint32_t colpatternnumber = patternnumber % calib_->nColumnPatterns();
200  edm::LogInfo("SiPixelCalibDigiProducer")
201  << " rowpatternnumbers = " << rowpatternnumber << " " << colpatternnumber << " " << patternnumber << std::endl;
202  // update currentpattern_
203  std::vector<short> calibcols = calib_->getColumnPattern();
204  std::vector<short> calibrows = calib_->getRowPattern();
205  std::vector<short> temprowvals(0);
206  std::vector<short> tempcolvals(0);
207  uint32_t nminuscol = 0;
208  uint32_t nminusrow = 0;
209  uint32_t npatterns = 0;
210  for (uint32_t icol = 0; icol < calibcols.size(); icol++) {
211  if (calibcols[icol] == -1) {
212  nminuscol++;
213  } else if (nminuscol == colpatternnumber) {
214  //edm::LogInfo("SiPixelCalibProducer") << "col " << calibcols[icol] << std::endl;
215  short val = calibcols[icol];
216  tempcolvals.push_back(val);
217  } else if (nminuscol > colpatternnumber)
218  break;
219  }
220  for (uint32_t irow = 0; irow < calibrows.size(); irow++) {
221  // edm::LogInfo("SiPixelCalibProducer") << "row " << irow <<" "<< nminusrow<<" " << calibrows[irow] << std::endl;
222  if (calibrows[irow] == -1)
223  nminusrow++;
224  else if (nminusrow == rowpatternnumber) {
225  short val = calibrows[irow];
226  temprowvals.push_back(val);
227  } else if (nminusrow > rowpatternnumber)
228  break;
229  }
230  //now clean up the currentpattern_;
231  while (currentpattern_.size() > temprowvals.size() * tempcolvals.size()) {
232  currentpattern_.erase(currentpattern_.end());
233  }
234  for (uint32_t irow = 0; irow < temprowvals.size(); irow++) {
235  for (uint32_t icol = 0; icol < tempcolvals.size(); icol++) {
236  std::pair<short, short> pattern(temprowvals[irow], tempcolvals[icol]);
237  npatterns++;
238  if (npatterns > currentpattern_.size())
239  currentpattern_.push_back(pattern);
240  else
241  currentpattern_[npatterns - 1] = pattern;
242  }
243  }
244 }
245 
247 // function description:
248 // produce method. This is the main loop method
250  // edm::LogInfo("SiPixelCalibDigiProducer") <<"in produce() " << std::endl;
251  using namespace edm;
252  iSetup.get<SiPixelCalibConfigurationRcd>().get(calib_);
256  if (use_realeventnumber_) {
257  iEventCounter_ = iEvent.id().event() - 1;
258  } else
259  iEventCounter_++;
260  if (iEventCounter_ % pattern_repeat_ == 1)
261  setPattern();
262 
263  // edm::LogInfo("SiPixelCalibDigiProducer") << "now starting fill..." << std::endl;
264  fill(iEvent, iSetup); // fill method where the actual looping over the digis is done.
265  // edm::LogInfo("SiPixelCalibDigiProducer") << "done filling..." << std::endl;
266  auto pOut = std::make_unique<edm::DetSetVector<SiPixelCalibDigi>>();
267  auto pErr = std::make_unique<edm::DetSetVector<SiPixelCalibDigiError>>();
268 
269  // copy things over into pOut if necessary (this is only once per pattern)
270  if (store()) {
271  // edm::LogInfo("SiPixelCalibDigiProducer") << "in loop" << std::endl;
272  for (std::map<pixelstruct, SiPixelCalibDigi>::const_iterator idet = intermediate_data_.begin();
273  idet != intermediate_data_.end();
274  ++idet) {
275  uint32_t detid = idet->first.first;
276  if (!control_pattern_size_) {
277  if (!checkPixel(idet->first.first, idet->first.second.first, idet->first.second.second))
278  continue;
279  }
280 
281  SiPixelCalibDigi tempdigi = idet->second;
282  edm::DetSet<SiPixelCalibDigi>& detSet = pOut->find_or_insert(detid);
283  detSet.data.push_back(tempdigi);
284  }
285  if (includeErrors_) {
286  for (std::map<pixelstruct, SiPixelCalibDigiError>::const_iterator ierr = error_data_.begin();
287  ierr != error_data_.end();
288  ++ierr) {
289  uint32_t detid = ierr->first.first;
290  SiPixelCalibDigiError temperror = ierr->second;
291  edm::DetSet<SiPixelCalibDigiError>& errSet = pErr->find_or_insert(detid);
292  errSet.data.push_back(temperror);
293  }
294  }
295  edm::LogInfo("INFO") << "now filling event " << iEventCounter_ << " as pixel pattern changes every "
296  << pattern_repeat_ << " events..." << std::endl;
297  clear();
298  }
299  iEvent.put(std::move(pOut));
300  if (includeErrors_)
301  iEvent.put(std::move(pErr));
302 }
303 //-----------------------------------------------
304 // method to check that the pixels are actually valid...
305 bool SiPixelCalibDigiProducer::checkPixel(uint32_t detid, short row, short col) {
306  if (!control_pattern_size_ && !store())
307  return true;
308 
309  if (!ignore_non_pattern_)
310  return true;
311 
312  edm::LogInfo("SiPixelCalibDigiProducer") << "Event" << iEventCounter_ << ",now in checkpixel() " << std::endl;
313  if (currentpattern_.empty())
314  setPattern();
315  // uint32_t iroc;
316  uint32_t fedid = detid_to_fedid_[detid];
317 
318  SiPixelFrameConverter formatter(theCablingMap_.product(), fedid);
319  sipixelobjects::DetectorIndex detector = {detid, row, col};
321 
322  formatter.toCabling(cabling, detector);
323  // cabling should now contain cabling.roc and cabling.dcol and cabling.pxid
324 
325  // however, the coordinates now need to be converted from dcl, pxid to the row,col coordinates used in the calibration info
327  loc.dcol = cabling.dcol;
328  loc.pxid = cabling.pxid;
329  sipixelobjects::LocalPixel locpixel(loc);
330  currentpair_.first = locpixel.rocRow();
331  currentpair_.second = locpixel.rocCol();
332 
333  for (uint32_t i = 0; i < currentpattern_.size(); ++i) {
334  // edm::LogInfo("SiPixelCalibDigiProducer") << "found pair " << currentpair_.first << "," << currentpair_.second << " calib " << currentpattern_[i].first << ","<< currentpattern_[i].second << " input " << row << "," << col << std::endl;
335  if (currentpair_ == currentpattern_[i]) {
336  return true;
337  }
338  }
339  std::ostringstream errorlog;
340  errorlog << "DETID " << detid << ", row, col (offline)=" << row << "," << col
341  << " row, col (ROC) =" << currentpair_.first << "," << currentpair_.second
342  << " found no match in list of patterns: ";
343  for (uint32_t i = 0; i < currentpattern_.size(); ++i) {
344  if (i != 0 && i != currentpattern_.size() - 1)
345  errorlog << " ";
346  errorlog << "(";
347  errorlog << currentpattern_[i].first;
348  errorlog << ",";
349  errorlog << currentpattern_[i].second;
350  errorlog << ")";
351  }
352  edm::LogError("ERROR") << errorlog.str() << std::endl;
353  if (includeErrors_) { // book the error
354 
355  pixelstruct temppixelworker;
356  temppixelworker.first = detid;
357  temppixelworker.second.first = row;
358  temppixelworker.second.second = col;
359  std::map<pixelstruct, SiPixelCalibDigiError>::const_iterator ierr = error_data_.find(temppixelworker);
360  if (ierr == error_data_.end()) {
361  SiPixelCalibDigiError temperr(row, col, 1);
362  error_data_[temppixelworker] = temperr;
363  }
364  }
365 
366  return false;
367 }
368 
EventNumber_t event() const
Definition: EventID.h:41
virtual void fill(edm::Event &iEvent, const edm::EventSetup &iSetup)
std::vector< short > getRowPattern() const
virtual bool checkFED(uint32_t detid)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
std::map< pixelstruct, SiPixelCalibDigiError > error_data_
std::map< pixelstruct, SiPixelCalibDigi > intermediate_data_
identify pixel inside single ROC
Definition: LocalPixel.h:7
std::vector< std::pair< short, short > > currentpattern_
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
short vcalIndexForEvent(const uint32_t &eventnumber) const
edm::ESHandle< SiPixelFedCablingMap > theCablingMap_
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
void setrowcol(uint16_t row, uint16_t col)
virtual bool checkPixel(uint32_t detid, short row, short col)
constexpr int adc(sample_type sample)
get the ADC sample (12 bits)
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:361
double collumn and pixel ID in double collumn representation
Definition: LocalPixel.h:22
std::pair< uint32_t, std::pair< short, short > > pixelstruct
std::vector< short > getColumnPattern() const
virtual void fillPixel(uint32_t detid, short row, short col, short ipoint, short adc)
edm::EDGetTokenT< edm::DetSetVector< PixelDigi > > tPixelDigi
edm::EventID id() const
Definition: EventBase.h:59
collection_type data
Definition: DetSet.h:80
HLT enums.
T get() const
Definition: EventSetup.h:71
SiPixelCalibDigiProducer(const edm::ParameterSet &iConfig)
col
Definition: cuy.py:1010
edm::ESHandle< SiPixelCalibConfiguration > calib_
std::pair< short, short > currentpair_
iterator begin()
Return an iterator to the first DetSet.
Definition: DetSetVector.h:346
std::map< uint32_t, uint32_t > detid_to_fedid_
collection_type::const_iterator const_iterator
Definition: DetSet.h:33
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:104
T const * product() const
Definition: ESHandle.h:86
def move(src, dest)
Definition: eostools.py:511
edm::ESHandle< TrackerGeometry > theGeometry_