pxar
 All Classes Namespaces Functions Variables Typedefs Friends
dut.cc
1 
5 #include "api.h"
6 #include "log.h"
7 #include "dictionaries.h"
8 #include "helper.h"
9 #include <vector>
10 #include <algorithm>
11 
12 using namespace pxar;
13 
14 // DUT class functions
15 
16 void dut::info() {
17  if (status()) {
18  LOG(logINFO) << "The DUT currently contains the following objects:";
19 
20  LOG(logINFO) << std::setw(2) << tbm.size() << " TBM Cores (" << getNEnabledTbms()
21  << " ON)";
22 
23  for(std::vector<tbmConfig>::iterator tbmIt = tbm.begin(); tbmIt != tbm.end(); tbmIt++) {
24  LOG(logINFO) << "\tTBM Core "
25  << ((tbmIt-tbm.begin())%2 == 0 ? "alpha" : "beta " )
26  << " (" << static_cast<int>(tbmIt - tbm.begin()) << "): "
27  << (*tbmIt).dacs.size() << " registers set";
28  }
29 
30  // We currently hide the possibility to enable pixels on some ROCs only,
31  // so looking at ROC 0 as default is safe:
32  LOG(logINFO) << std::setw(2) << roc.size() << " ROCs (" << getNEnabledRocs()
33  << " ON) with " << roc.at(0).pixels.size() << " pixelConfigs";
34 
35  for(std::vector<rocConfig>::iterator rocIt = roc.begin(); rocIt != roc.end(); rocIt++) {
36  LOG(logINFO) << "\tROC " << static_cast<int>(rocIt-roc.begin()) << ": "
37  << (*rocIt).dacs.size() << " DACs set, Pixels: "
38  << getNMaskedPixels(static_cast<int>(rocIt-roc.begin())) << " masked, "
39  << getNEnabledPixels(static_cast<int>(rocIt-roc.begin())) << " active.";
40  }
41  }
42 }
43 
44 size_t dut::getNEnabledPixels(uint8_t rocid) {
45  if (!_initialized || rocid >= roc.size()) return 0;
46  return std::count_if(roc.at(rocid).pixels.begin(),roc.at(rocid).pixels.end(),configEnableSet(true));
47 }
48 
50  if (!_initialized) return 0;
51  size_t nenabled = 0;
52  // Loop over all ROCs
53  for (std::vector<rocConfig>::iterator rocit = roc.begin() ; rocit != roc.end(); ++rocit){
54  nenabled += std::count_if(rocit->pixels.begin(),rocit->pixels.end(),configEnableSet(true));
55  }
56  return nenabled;
57 }
58 
59 size_t dut::getNMaskedPixels(uint8_t rocid) {
60  if (!_initialized || rocid >= roc.size()) return 0;
61  return std::count_if(roc.at(rocid).pixels.begin(),roc.at(rocid).pixels.end(),configMaskSet(true));
62 }
63 
65  if (!_initialized) return 0;
66  size_t nmasked = 0;
67  // Loop over all ROCs
68  for (std::vector<rocConfig>::iterator rocit = roc.begin() ; rocit != roc.end(); ++rocit){
69  nmasked += std::count_if(rocit->pixels.begin(),rocit->pixels.end(),configMaskSet(true));
70  }
71  return nmasked;
72 }
73 
75  if (!status()) return 0;
76  // loop over result, count enabled ROCs
77  size_t count = 0;
78  for (std::vector<rocConfig>::iterator it = roc.begin(); it != roc.end(); ++it){
79  if (it->enable()) count++;
80  }
81  return count;
82 }
83 
84 size_t dut::getNRocs() {
85  return roc.size();
86 }
87 
88 std::string dut::getRocType() {
89  if(roc.empty()) return "";
90 
91  // Get singleton DAC dictionary object:
92  DeviceDictionary * _dict = DeviceDictionary::getInstance();
93 
94  // And get the device name from the dictionary object:
95  // Returning the type of ROC 0 should be fine since we're not mixing types.
96  return _dict->getName(roc.front().type);
97 }
98 
99 std::string dut::getTbmType() {
100  if(tbm.empty()) return "";
101 
102  // Get singleton DAC dictionary object:
103  DeviceDictionary * _dict = DeviceDictionary::getInstance();
104 
105  // And get the device name from the dictionary object:
106  return _dict->getName(tbm.front().type);
107 }
108 
110  if (!status()) return 0;
111  // loop over result, count enabled TBMs
112  size_t count = 0;
113  for (std::vector<tbmConfig>::iterator it = tbm.begin(); it != tbm.end(); ++it){
114  if (it->enable) count++;
115  }
116  return count;
117 }
118 
119 size_t dut::getNTbms() {
120  return tbm.size();
121 }
122 
123 
124 std::vector< pixelConfig > dut::getEnabledPixels(size_t rocid) {
125 
126  std::vector< pixelConfig > result;
127 
128  // Check if DUT is allright and the roc we are looking at exists:
129  if (!status() || !(rocid < roc.size())) return result;
130 
131  // Search for pixels that have enable set
132  for (std::vector<pixelConfig>::iterator it = roc.at(rocid).pixels.begin(); it != roc.at(rocid).pixels.end(); ++it){
133  if (it->enable()) result.push_back(*it);
134  }
135  return result;
136 }
137 
138 std::vector< pixelConfig > dut::getEnabledPixels() {
139 
140  std::vector< pixelConfig > result;
141 
142  // Check if DUT is allright and the roc we are looking at exists:
143  if (!status()) return result;
144 
145  // Loop over all ROCs
146  for (std::vector<rocConfig>::iterator rocit = roc.begin() ; rocit != roc.end(); ++rocit){
147  // Search for pixels that have enable set
148  for (std::vector<pixelConfig>::iterator it = rocit->pixels.begin(); it != rocit->pixels.end(); ++it){
149  if (it->enable()) result.push_back(*it);
150  }
151  }
152  return result;
153 }
154 
155 std::vector< pixelConfig > dut::getMaskedPixels(size_t rocid) {
156 
157  std::vector< pixelConfig > result;
158 
159  // Check if DUT is allright and the roc we are looking at exists:
160  if (!status() || !(rocid < roc.size())) return result;
161 
162  // Search for pixels that have enable set
163  for (std::vector<pixelConfig>::iterator it = roc.at(rocid).pixels.begin(); it != roc.at(rocid).pixels.end(); ++it){
164  if (it->mask()) result.push_back(*it);
165  }
166  return result;
167 }
168 
169 std::vector< pixelConfig > dut::getMaskedPixels() {
170 
171  std::vector< pixelConfig > result;
172 
173  // Check if DUT is allright and the roc we are looking at exists:
174  if (!status()) return result;
175 
176  // Loop over all ROCs
177  for (std::vector<rocConfig>::iterator rocit = roc.begin() ; rocit != roc.end(); ++rocit){
178  // Search for pixels that have enable set
179  for (std::vector<pixelConfig>::iterator it = rocit->pixels.begin(); it != rocit->pixels.end(); ++it){
180  if (it->mask()) result.push_back(*it);
181  }
182  }
183  return result;
184 }
185 
186 std::vector< bool > dut::getEnabledColumns(size_t roci2c) {
187 
188  std::vector< bool > result(52,false);
189 
190  // Check if DUT is allright and the roc we are looking at exists:
191  if (!status()) return result;
192 
193  for(std::vector<rocConfig>::iterator rocit = roc.begin(); rocit != roc.end(); ++rocit){
194  if(rocit->i2c_address == roci2c) {
195  // Search for pixels that have enable set
196  for(std::vector<pixelConfig>::iterator it = rocit->pixels.begin(); it != rocit->pixels.end(); ++it){
197  if (it->enable()) result.at((*it).column()) = true;
198  }
199  }
200  }
201  return result;
202 }
203 
204 std::vector< rocConfig > dut::getEnabledRocs() {
205  std::vector< rocConfig > result;
206  if (!_initialized) return result;
207  // search for rocs that have enable set
208  for (std::vector<rocConfig>::iterator it = roc.begin(); it != roc.end(); ++it){
209  if (it->enable()) result.push_back(*it);
210  }
211  return result;
212 }
213 
214 std::vector< uint8_t > dut::getEnabledRocIDs() {
215 
216  std::vector< uint8_t > result = std::vector<uint8_t>();
217 
218  if (!_initialized) return result;
219 
220  // search for rocs that have enable set
221  for (std::vector<rocConfig>::iterator it = roc.begin(); it != roc.end(); ++it){
222  if (it->enable()) result.push_back(static_cast<uint8_t>(it - roc.begin()));
223  }
224  return result;
225 }
226 
227 std::vector< uint8_t > dut::getEnabledRocI2Caddr() {
228 
229  std::vector< uint8_t > result = std::vector<uint8_t>();
230 
231  if (!_initialized) return result;
232 
233  // search for rocs that have enable set
234  for (std::vector<rocConfig>::iterator it = roc.begin(); it != roc.end(); ++it){
235  if (it->enable()) result.push_back(it->i2c_address);
236  }
237  return result;
238 }
239 
240 std::vector< uint8_t > dut::getRocI2Caddr() {
241 
242  std::vector< uint8_t > result = std::vector<uint8_t>();
243 
244  if (!_initialized) return result;
245 
246  // search for rocs that have enable set
247  for (std::vector<rocConfig>::iterator it = roc.begin(); it != roc.end(); ++it){
248  result.push_back(it->i2c_address);
249  }
250  return result;
251 }
252 
253 std::vector< tbmConfig > dut::getEnabledTbms() {
254  std::vector< tbmConfig > result;
255  if (!_initialized) return result;
256  // search for rocs that have enable set
257  for (std::vector<tbmConfig>::iterator it = tbm.begin(); it != tbm.end(); ++it){
258  if (it->enable) result.push_back(*it);
259  }
260  return result;
261 }
262 
263 bool dut::getPixelEnabled(uint8_t column, uint8_t row) {
264  std::vector<pixelConfig>::iterator it = std::find_if(roc.at(0).pixels.begin(),
265  roc.at(0).pixels.end(),
266  findPixelXY(column,row));
267  if(it != roc.at(0).pixels.end()) { return it->enable(); }
268  return false;
269 }
270 
272  if (!status()) return false;
273  // search for pixels that DO NOT have enable set
274  std::vector<pixelConfig>::iterator it = std::find_if(roc.at(0).pixels.begin(),
275  roc.at(0).pixels.end(),
276  configEnableSet(false));
277  if(it != roc.at(0).pixels.end())
278  return false; // found a disabled pixel
279  else
280  return true; // all pixels are enabled
281 }
282 
283 
285  if (!status()) return false;
286  // check that we have all 16 ROCs
287  if (roc.size()<16) return false;
288  // search for pixels that DO NOT have enable set
289  std::vector<rocConfig>::iterator it = std::find_if(roc.begin(),
290  roc.end(),
291  configEnableSet(false));
292  if(it != roc.end()) return false;
293  // 16 ROCs are enabled:
294  return true;
295 }
296 
297 
298 pixelConfig dut::getPixelConfig(size_t rocid, uint8_t column, uint8_t row) {
299 
300  pixelConfig result; // initialized with 0 by constructor
301  if (!status()) return result;
302  // find pixel with specified column and row
303  std::vector<pixelConfig>::iterator it = std::find_if(roc.at(rocid).pixels.begin(),
304  roc.at(rocid).pixels.end(),
305  findPixelXY(column,row));
306  // if pixel found, set result accordingly
307  if(it != roc.at(rocid).pixels.end()){
308  result = *it;
309  }
310  return result;
311 }
312 
313 
314 uint8_t dut::getDAC(size_t rocId, std::string dacName) {
315 
316  if(status() && rocId < roc.size()) {
317  // Convert the name to lower case for comparison:
318  std::transform(dacName.begin(), dacName.end(), dacName.begin(), ::tolower);
319 
320  // Get singleton DAC dictionary object:
321  RegisterDictionary * _dict = RegisterDictionary::getInstance();
322 
323  // And get the register value from the dictionary object:
324  uint8_t _register = _dict->getRegister(dacName, ROC_REG);
325  return roc[rocId].dacs[_register];
326  }
327  throw InvalidConfig("Could not identify DAC " + dacName);
328  return 0x0;
329 }
330 
331 std::vector< std::pair<std::string,uint8_t> > dut::getDACs(size_t rocId) {
332 
333  if(status() && rocId < roc.size()) {
334  std::vector< std::pair<std::string,uint8_t> > vec;
335 
336  // Get singleton DAC dictionary object:
337  RegisterDictionary * _dict = RegisterDictionary::getInstance();
338 
339  for(std::map< uint8_t,uint8_t >::iterator it = roc.at(rocId).dacs.begin();
340  it != roc.at(rocId).dacs.end(); ++it) {
341  vec.push_back(std::make_pair(_dict->getName(it->first,ROC_REG),it->second));
342  }
343  return vec;
344  }
345  else return std::vector< std::pair<std::string,uint8_t> >();
346 }
347 
348 std::vector< std::pair<std::string,uint8_t> > dut::getTbmDACs(size_t tbmId) {
349 
350  if(status() && tbmId < tbm.size()) {
351  std::vector< std::pair<std::string,uint8_t> > vec;
352 
353  // Get singleton DAC dictionary object:
354  RegisterDictionary * _dict = RegisterDictionary::getInstance();
355 
356  for(std::map< uint8_t,uint8_t >::iterator it = tbm.at(tbmId).dacs.begin();
357  it != tbm.at(tbmId).dacs.end(); ++it) {
358  // We need to strip the core identifier in order to look up the register name from the dictionary (&0x0F):
359  vec.push_back(std::make_pair(_dict->getName((it->first&0x0F),TBM_REG),it->second));
360  }
361  return vec;
362  }
363  else return std::vector< std::pair<std::string,uint8_t> >();
364 }
365 
366 void dut::printDACs(size_t rocId) {
367 
368  if(status() && rocId < roc.size()) {
369  // Get singleton DAC dictionary object:
370  RegisterDictionary * _dict = RegisterDictionary::getInstance();
371 
372 
373  LOG(logINFO) << "Printing current DAC settings for ROC " << rocId << ":";
374  for(std::map< uint8_t,uint8_t >::iterator it = roc.at(rocId).dacs.begin();
375  it != roc.at(rocId).dacs.end(); ++it) {
376  LOG(logINFO) << "DAC " << _dict->getName(it->first,ROC_REG) << " (" << static_cast<int>(it->first) << ") = " << static_cast<int>(it->second);
377  }
378  }
379 }
380 
381 void dut::setROCEnable(size_t rocId, bool enable) {
382 
383  // Check if ROC exists:
384  if(rocId < roc.size())
385  // Set its status to the desired value:
386  roc[rocId].setEnable(enable);
387 }
388 
389 void dut::setTBMEnable(size_t tbmId, bool enable) {
390 
391  // Check if TBM exists:
392  if(tbmId < tbm.size())
393  // Set its status to the desired value:
394  tbm[tbmId].enable = enable;
395 }
396 
397 void dut:: maskPixel(uint8_t column, uint8_t row, bool mask) {
398 
399  if(status()) {
400  // Loop over all ROCs
401  for (std::vector<rocConfig>::iterator rocit = roc.begin() ; rocit != roc.end(); ++rocit){
402  // Find pixel with specified column and row
403  std::vector<pixelConfig>::iterator it = std::find_if(rocit->pixels.begin(),
404  rocit->pixels.end(),
405  findPixelXY(column,row));
406  // Set enable bit
407  if(it != rocit->pixels.end()) {
408  it->setMask(mask);
409  } else {
410  LOG(logWARNING) << "Pixel at column " << static_cast<int>(column) << " and row " << static_cast<int>(row) << " not found for ROC " << static_cast<int>(rocit - roc.begin()) << "!" ;
411  }
412  }
413  }
414 }
415 
416 void dut:: maskPixel(uint8_t column, uint8_t row, bool mask, uint8_t rocid) {
417 
418  if(status() && rocid < roc.size()) {
419  // Find pixel with specified column and row
420  std::vector<pixelConfig>::iterator it = std::find_if(roc.at(rocid).pixels.begin(),
421  roc.at(rocid).pixels.end(),
422  findPixelXY(column,row));
423  // Set mask:
424  if(it != roc.at(rocid).pixels.end()){
425  it->setMask(mask);
426  } else {
427  LOG(logWARNING) << "Pixel at column " << static_cast<int>(column) << " and row " << static_cast<int>(row) << " not found for ROC " << static_cast<int>(rocid)<< "!" ;
428  }
429  }
430 }
431 
432 void dut::testPixel(uint8_t column, uint8_t row, bool enable) {
433 
434  if(status()) {
435  // Loop over all ROCs
436  for (std::vector<rocConfig>::iterator rocit = roc.begin() ; rocit != roc.end(); ++rocit){
437  // Find pixel with specified column and row
438  std::vector<pixelConfig>::iterator it = std::find_if(rocit->pixels.begin(),
439  rocit->pixels.end(),
440  findPixelXY(column,row));
441  // Set enable bit
442  if(it != rocit->pixels.end()) {
443  it->setEnable(enable);
444  } else {
445  LOG(logWARNING) << "Pixel at column " << static_cast<int>(column) << " and row " << static_cast<int>(row) << " not found for ROC " << static_cast<int>(rocit - roc.begin())<< "!" ;
446  }
447  }
448  }
449 }
450 
451 void dut::testPixel(uint8_t column, uint8_t row, bool enable, uint8_t rocid) {
452 
453  if(status() && rocid < roc.size()) {
454  // Find pixel with specified column and row
455  std::vector<pixelConfig>::iterator it = std::find_if(roc.at(rocid).pixels.begin(),
456  roc.at(rocid).pixels.end(),
457  findPixelXY(column,row));
458  // Set mask:
459  if(it != roc.at(rocid).pixels.end()){
460  it->setEnable(enable);
461  } else {
462  LOG(logWARNING) << "Pixel at column " << static_cast<int>(column) << " and row " << static_cast<int>(row) << " not found for ROC " << static_cast<int>(rocid)<< "!" ;
463  }
464  }
465 }
466 
467 void dut::maskAllPixels(bool mask) {
468 
469  if(status()) {
470  LOG(logDEBUGAPI) << "Set mask bit to " << static_cast<int>(mask) << " for all pixels on all ROCs.";
471  // Loop over all ROCs
472  for (std::vector<rocConfig>::iterator rocit = roc.begin() ; rocit != roc.end(); ++rocit){
473  // loop over all pixel, set enable according to parameter
474  for (std::vector<pixelConfig>::iterator pixelit = rocit->pixels.begin() ; pixelit != rocit->pixels.end(); ++pixelit){
475  pixelit->setMask(mask);
476  }
477  }
478  }
479 }
480 
481 void dut::maskAllPixels(bool mask, uint8_t rocid) {
482 
483  if(status() && rocid < roc.size()) {
484  LOG(logDEBUGAPI) << "Set mask bit to " << static_cast<int>(mask) << " for all pixels on ROC " << static_cast<int>(rocid);
485  // loop over all pixel, set enable according to parameter
486  for (std::vector<pixelConfig>::iterator pixelit = roc.at(rocid).pixels.begin() ; pixelit != roc.at(rocid).pixels.end(); ++pixelit){
487  pixelit->setMask(mask);
488  }
489  }
490 }
491 
492 void dut::testAllPixels(bool enable, uint8_t rocid) {
493 
494  if(status() && rocid < roc.size()) {
495  LOG(logDEBUGAPI) << "Set enable bit to " << static_cast<int>(enable) << " for all pixels on ROC " << static_cast<int>(rocid);
496  // loop over all pixel, set enable according to parameter
497  for (std::vector<pixelConfig>::iterator pixelit = roc.at(rocid).pixels.begin() ; pixelit != roc.at(rocid).pixels.end(); ++pixelit){
498  pixelit->setEnable(enable);
499  }
500  }
501 }
502 
503 void dut::testAllPixels(bool enable) {
504 
505  if(status()) {
506  LOG(logDEBUGAPI) << "Set enable bit to " << static_cast<int>(enable) << " for all pixels on all ROCs";
507  // Loop over all ROCs
508  for (std::vector<rocConfig>::iterator rocit = roc.begin() ; rocit != roc.end(); ++rocit){
509  // loop over all pixel, set enable according to parameter
510  for (std::vector<pixelConfig>::iterator pixelit = rocit->pixels.begin() ; pixelit != rocit->pixels.end(); ++pixelit){
511  pixelit->setEnable(enable);
512  }
513  }
514  }
515 }
516 
517 bool dut::updateTrimBits(pixelConfig trimming, uint8_t rocid) {
518 
519  if(status() && rocid < roc.size()) {
520 
521  // Find the pixel in the given ROC pixels vector:
522  std::vector<pixelConfig>::iterator px = std::find_if(roc.at(rocid).pixels.begin(),
523  roc.at(rocid).pixels.end(),
524  findPixelXY(trimming.column(),trimming.row()));
525  // Pixel was not found:
526  if(px == roc.at(0).pixels.end()) return false;
527  // Pixel was found, set the new trimming values:
528  px->setTrim(trimming.trim());
529  return true;
530  }
531  else { return false; }
532 }
533 
534 bool dut::updateTrimBits(uint8_t column, uint8_t row, uint8_t trim, uint8_t rocid) {
535 
536  if(status() && rocid < roc.size()) {
537 
538  // Find the pixel in the given ROC pixels vector:
539  std::vector<pixelConfig>::iterator px = std::find_if(roc.at(rocid).pixels.begin(),
540  roc.at(rocid).pixels.end(),
541  findPixelXY(column,row));
542  // Pixel was not found:
543  if(px == roc.at(0).pixels.end()) return false;
544  // Pixel was found, set the new trimming values:
545  px->setTrim(trim);
546  return true;
547  }
548  else { return false; }
549 }
550 
551 bool dut::updateTrimBits(std::vector<pixelConfig> trimming, uint8_t rocid) {
552 
553  if(status() && rocid < roc.size()) {
554  // Loop over all trimbit pixelConfigs we got as parameter:
555  for (std::vector<pixelConfig>::iterator it = trimming.begin(); it != trimming.end(); ++it){
556 
557  // Find the pixel in the given ROC pixels vector:
558  std::vector<pixelConfig>::iterator px = std::find_if(roc.at(rocid).pixels.begin(),
559  roc.at(rocid).pixels.end(),
560  findPixelXY(it->column(),it->row()));
561  // Pixel was not found:
562  if(px == roc.at(0).pixels.end()) return false;
563  // Pixel was found, set the new trimming values:
564  px->setTrim(it->trim());
565  }
566  return true;
567  }
568  else { return false; }
569 }
570 
571 bool dut::status() {
572 
573  if(!_initialized || !_programmed) {
574  LOG(logERROR) << "DUT structure not initialized/programmed yet!";
575  }
576 
577  return (_initialized && _programmed);
578 }
void setTBMEnable(size_t tbmId, bool enable)
Definition: dut.cc:389
size_t getNTbms()
Definition: dut.cc:119
std::vector< pixelConfig > getEnabledPixels()
Definition: dut.cc:138
size_t getNMaskedPixels()
Definition: dut.cc:64
void printDACs(size_t rocId)
Definition: dut.cc:366
std::vector< uint8_t > getEnabledRocI2Caddr()
Definition: dut.cc:227
void testPixel(uint8_t column, uint8_t row, bool enable)
Definition: dut.cc:432
std::vector< rocConfig > getEnabledRocs()
Definition: dut.cc:204
void info()
Definition: dut.cc:16
void maskAllPixels(bool mask, uint8_t rocid)
Definition: dut.cc:481
bool updateTrimBits(std::vector< pixelConfig > trimming, uint8_t rocid)
Definition: dut.cc:551
void setROCEnable(size_t rocId, bool enable)
Definition: dut.cc:381
size_t getNEnabledPixels()
Definition: dut.cc:49
pixelConfig getPixelConfig(size_t rocid, uint8_t column, uint8_t row)
Definition: dut.cc:298
std::vector< std::pair< std::string, uint8_t > > getDACs(size_t rocId)
Definition: dut.cc:331
std::vector< uint8_t > getEnabledRocIDs()
Definition: dut.cc:214
void testAllPixels(bool enable)
Definition: dut.cc:503
bool getAllPixelEnable()
Definition: dut.cc:271
std::string getRocType()
Definition: dut.cc:88
size_t getNEnabledRocs()
Definition: dut.cc:74
size_t getNEnabledTbms()
Definition: dut.cc:109
bool getPixelEnabled(uint8_t column, uint8_t row)
Definition: dut.cc:263
std::vector< uint8_t > getRocI2Caddr()
Definition: dut.cc:240
void maskPixel(uint8_t column, uint8_t row, bool mask)
Definition: dut.cc:397
uint8_t getDAC(size_t rocId, std::string dacName)
Definition: dut.cc:314
size_t getNRocs()
Definition: dut.cc:84
bool status()
Definition: dut.cc:571
std::string getTbmType()
Definition: dut.cc:99
bool getModuleEnable()
Definition: dut.cc:284
std::vector< pixelConfig > getMaskedPixels()
Definition: dut.cc:169
std::vector< tbmConfig > getEnabledTbms()
Definition: dut.cc:253
std::vector< std::pair< std::string, uint8_t > > getTbmDACs(size_t tbmId)
Definition: dut.cc:348