CMS 3D CMS Logo

AnalysisDescriptions.cc
Go to the documentation of this file.
1 
5 
6 using namespace std;
7 using namespace sistrip;
8 
9 // -----------------------------------------------------------------------------
21  std::string partition ) {
22 
23  // Check
24  if ( ( !dbParams_.usingDbCache() && !deviceFactory(__func__) ) ||
25  ( dbParams_.usingDbCache() && !databaseCache(__func__) ) ) {
26  return analyses_.emptyRange();
27  }
28 
29  try {
30 
31  if ( !dbParams_.usingDbCache() ) {
32 
33  SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
34  SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
35  for ( ; iter != jter; ++iter ) {
36 
37  if ( partition.empty() || partition == iter->second.partitionName() ) {
38 
39  if ( iter->second.partitionName() == SiStripPartition::defaultPartitionName_ ) { continue; }
40 
41  AnalysisDescriptionsRange range = analyses_.find( iter->second.partitionName() );
42  if ( range == analyses_.emptyRange() ) {
43 
45  if ( analysis_type == AnalysisDescription::T_ANALYSIS_FASTFEDCABLING ) {
46  tmp1 = deviceFactory(__func__)->getAnalysisHistory( iter->second.partitionName(),
47  iter->second.fastCablingVersion().first,
48  iter->second.fastCablingVersion().second,
49  analysis_type );
50  } else if ( analysis_type == AnalysisDescription::T_ANALYSIS_TIMING ) {
51  tmp1 = deviceFactory(__func__)->getAnalysisHistory( iter->second.partitionName(),
52  iter->second.apvTimingVersion().first,
53  iter->second.apvTimingVersion().second,
54  analysis_type );
55  } else if ( analysis_type == AnalysisDescription::T_ANALYSIS_OPTOSCAN ) {
56  tmp1 = deviceFactory(__func__)->getAnalysisHistory( iter->second.partitionName(),
57  iter->second.optoScanVersion().first,
58  iter->second.optoScanVersion().second,
59  analysis_type );
60  } else if ( analysis_type == AnalysisDescription::T_ANALYSIS_VPSPSCAN ) {
61  tmp1 = deviceFactory(__func__)->getAnalysisHistory( iter->second.partitionName(),
62  iter->second.vpspScanVersion().first,
63  iter->second.vpspScanVersion().second,
64  analysis_type );
65  } else if ( analysis_type == AnalysisDescription::T_ANALYSIS_CALIBRATION ) {
66  tmp1 = deviceFactory(__func__)->getAnalysisHistory( iter->second.partitionName(),
67  iter->second.apvCalibVersion().first,
68  iter->second.apvCalibVersion().second,
69  analysis_type );
70  } else if ( analysis_type == AnalysisDescription::T_ANALYSIS_PEDESTALS ) {
71  tmp1 = deviceFactory(__func__)->getAnalysisHistory( iter->second.partitionName(),
72  iter->second.pedestalsVersion().first,
73  iter->second.pedestalsVersion().second,
74  analysis_type );
75  } else if ( analysis_type == AnalysisDescription::T_ANALYSIS_PEDSFULLNOISE ) {
76  tmp1 = deviceFactory(__func__)->getAnalysisHistory( iter->second.partitionName(),
77  iter->second.pedestalsVersion().first,
78  iter->second.pedestalsVersion().second,
79  analysis_type );
80  } else if ( analysis_type == AnalysisDescription::T_ANALYSIS_APVLATENCY ) {
81  tmp1 = deviceFactory(__func__)->getAnalysisHistory( iter->second.partitionName(),
82  iter->second.apvLatencyVersion().first,
83  iter->second.apvLatencyVersion().second,
84  analysis_type );
85  } else if ( analysis_type == AnalysisDescription::T_ANALYSIS_FINEDELAY ) {
86  tmp1 = deviceFactory(__func__)->getAnalysisHistory( iter->second.partitionName(),
87  iter->second.fineDelayVersion().first,
88  iter->second.fineDelayVersion().second,
89  analysis_type );
90  } else {
91  std::stringstream ss;
92  ss << "[SiStripConfigDb::" << __func__ << "]"
93  << " Unexpected analysis type \""
94  << analysisType( analysis_type )
95  << "\"! Aborting download...";
96  edm::LogWarning(mlConfigDb_) << ss.str();
97  return analyses_.emptyRange();
98  }
99 
100  // Make local copy
102  CommissioningAnalysisFactory::vectorCopy( tmp1, tmp2 );
103 
104  // Add to cache
105  analyses_.loadNext( iter->second.partitionName(), tmp2 );
106 
107  // Some debug
108  AnalysisDescriptionsRange anals = analyses_.find( iter->second.partitionName() );
109  std::stringstream ss;
110  ss << "[SiStripConfigDb::" << __func__ << "]"
111  << " Downloaded " << anals.size()
112  << " analysis descriptions of type \""
113  << analysisType( analysis_type )
114  << "\" to local cache for partition \""
115  << iter->second.partitionName() << "\"" << std::endl;
116  ss << "[SiStripConfigDb::" << __func__ << "]"
117  << " Cache holds analysis descriptions for "
118  << analyses_.size() << " partitions.";
119  LogTrace(mlConfigDb_) << ss.str();
120 
121  }
122  }
123  }
124 
125  } else { // Use database cache
126  std::stringstream ss;
127  ss << "[SiStripConfigDb::" << __func__ << "]"
128  << " No database cache for analysis objects!";
129  edm::LogWarning(mlConfigDb_) << ss.str();
130  }
131 
132  } catch (...) { handleException( __func__ ); }
133 
134  // Create range object
135  uint16_t np = 0;
136  uint16_t nc = 0;
137  AnalysisDescriptionsRange anals = analyses_.emptyRange();
138  if ( !partition.empty() ) {
139  anals = analyses_.find( partition );
140  np = 1;
141  nc = anals.size();
142  } else {
143  if ( !analyses_.empty() ) {
144  anals = AnalysisDescriptionsRange( analyses_.find( dbParams_.partitions().begin()->second.partitionName() ).begin(),
145  analyses_.find( (--(dbParams_.partitions().end()))->second.partitionName() ).end() );
146  } else { anals = analyses_.emptyRange(); }
147  np = analyses_.size();
148  nc = anals.size();
149  }
150 
151  stringstream ss;
152  ss << "[SiStripConfigDb::" << __func__ << "]"
153  << " Found " << nc << " analysis descriptions";
154  if ( !dbParams_.usingDbCache() ) { ss << " in " << np << " database partition(s)"; }
155  else { ss << " from shared memory name '" << dbParams_.sharedMemory() << "'"; }
156  if ( analyses_.empty() ) { edm::LogWarning(mlConfigDb_) << ss.str(); }
157  else { LogTrace(mlConfigDb_) << ss.str(); }
158 
159  return anals;
160 
161 }
162 
163 // -----------------------------------------------------------------------------
164 //
166 
167  if ( !deviceFactory(__func__) ) { return; }
168 
169  if ( partition.empty() ) {
170  stringstream ss;
171  ss << "[SiStripConfigDb::" << __func__ << "]"
172  << " Partition string is empty,"
173  << " therefore cannot add analysis descriptions to local cache!";
174  edm::LogWarning(mlConfigDb_) << ss.str();
175  return;
176  }
177 
178  if ( anals.empty() ) {
179  stringstream ss;
180  ss << "[SiStripConfigDb::" << __func__ << "]"
181  << " Vector of analysis descriptions is empty,"
182  << " therefore cannot add analysis descriptions to local cache!";
183  edm::LogWarning(mlConfigDb_) << ss.str();
184  return;
185  }
186 
187  SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
188  SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
189  for ( ; iter != jter; ++iter ) { if ( partition == iter->second.partitionName() ) { break; } }
190  if ( iter == dbParams_.partitions().end() ) {
191  stringstream ss;
192  ss << "[SiStripConfigDb::" << __func__ << "]"
193  << " Partition \"" << partition
194  << "\" not found in partition list, "
195  << " therefore cannot add analysis descriptions!";
196  edm::LogWarning(mlConfigDb_) << ss.str();
197  return;
198  }
199 
200  AnalysisDescriptionsRange range = analyses_.find( partition );
201  if ( range == analyses_.emptyRange() ) {
202 
203  // Make local copy
205  CommissioningAnalysisFactory::vectorCopy( anals, tmp );
206 
207  // Add to local cache
208  analyses_.loadNext( partition, tmp );
209 
210  // Some debug
211  std::stringstream ss;
212  ss << "[SiStripConfigDb::" << __func__ << "]"
213  << " Added " << anals.size()
214  << " analysis descriptions to local cache for partition \""
215  << partition << "\"."
216  << " (Cache holds analysis descriptions for "
217  << analyses_.size() << " partitions.)";
218  LogTrace(mlConfigDb_) << ss.str();
219  } else {
220  stringstream ss;
221  ss << "[SiStripConfigDb::" << __func__ << "]"
222  << " Partition \"" << partition
223  << "\" already found in local cache, "
224  << " therefore cannot add analysis descriptions!";
225  edm::LogWarning(mlConfigDb_) << ss.str();
226  return;
227  }
228 
229 }
230 
231 // -----------------------------------------------------------------------------
232 //
233 void SiStripConfigDb::uploadAnalysisDescriptions( bool calibration_for_physics,
234  std::string partition ) {
235 
236  if ( dbParams_.usingDbCache() ) {
238  << "[SiStripConfigDb::" << __func__ << "]"
239  << " Using database cache! No uploads allowed!";
240  return;
241  }
242 
243  if ( !deviceFactory(__func__) ) { return; }
244 
245  if ( analyses_.empty() ) {
247  << "[SiStripConfigDb::" << __func__ << "]"
248  << " Found no cached analysis descriptions, therefore no upload!";
249  return;
250  }
251 
252  if ( calibration_for_physics && !allowCalibUpload_ ) {
254  << "[SiStripConfigDb::" << __func__ << "]"
255  << " Attempting to upload calibration constants"
256  << " without uploading any hardware descriptions!"
257  << " Aborting upload...";
258  return;
259  } else { allowCalibUpload_ = false; }
260 
261  try {
262 
263  SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
264  SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
265  for ( ; iter != jter; ++iter ) {
266 
267  if ( partition.empty() || partition == iter->second.partitionName() ) {
268 
269  AnalysisDescriptionsRange range = analyses_.find( iter->second.partitionName() );
270  if ( range != analyses_.emptyRange() ) {
271 
272  AnalysisDescriptionsV anals( range.begin(), range.end() );
273 
274  vector<AnalysisType> analysis_type; // check how many different analysis type we have --> more than one analysis table could be uploaded in the same job
275  for(auto element : anals){
276  if(std::find(analysis_type.begin(),analysis_type.end(),element->getType()) == analysis_type.end() and element->getType() != AnalysisDescription::T_UNKNOWN){
277  analysis_type.push_back(element->getType());
278  }
279  else if(element->getType() == AnalysisDescription::T_UNKNOWN){
281  << "[SiStripConfigDb::" << __func__ << "]"
282  << " Analysis type is UNKNOWN. Aborting upload!";
283  return;
284  }
285  }
286 
287  vector<AnalysisDescriptionsV> analysisToUpload; // in case there are more than one analysis type to be uploaded
288  for(auto type : analysis_type){
289  AnalysisDescriptionsV ana_temp;
290  for(auto element : anals){
291  if(element->getType() == type)
292  ana_temp.push_back(element);
293  }
294  analysisToUpload.push_back(ana_temp);
295  }
296 
297  // perform the upload
298  for(auto analysis : analysisToUpload){
299 
300  uint32_t version = deviceFactory(__func__)->uploadAnalysis( iter->second.runNumber(),
301  iter->second.partitionName(),
302  analysis.front()->getType(),
303  analysis,
304  calibration_for_physics);
305  // Update current state with analysis descriptions
306  if ( calibration_for_physics ) { deviceFactory(__func__)->uploadAnalysisState( version );}
307  }
308 
309  // Some debug
310  std::stringstream ss;
311  ss << "[SiStripConfigDb::" << __func__ << "]"
312  << " Uploaded " << anals.size()
313  << " device descriptions to database for partition \""
314  << iter->second.partitionName() << "\".";
315  LogTrace(mlConfigDb_) << ss.str();
316 
317  } else {
318  stringstream ss;
319  ss << "[SiStripConfigDb::" << __func__ << "]"
320  << " Vector of device descriptions is empty for partition \""
321  << iter->second.partitionName()
322  << "\", therefore aborting upload for this partition!";
323  edm::LogWarning(mlConfigDb_) << ss.str();
324  continue;
325  }
326 
327  }else {
328  // stringstream ss;
329  // ss << "[SiStripConfigDb::" << __func__ << "]"
330  // << " Cannot find partition \"" << partition
331  // << "\" in cached partitions list: \""
332  // << dbParams_.partitionNames( dbParams_.partitionNames() )
333  // << "\", therefore aborting upload for this partition!";
334  // edm::LogWarning(mlConfigDb_) << ss.str();
335  }
336  }
337  } catch (...) { handleException( __func__ ); }
338 
339  allowCalibUpload_ = true;
340 
341 }
342 
343 // -----------------------------------------------------------------------------
344 //
346  LogTrace(mlConfigDb_) << "[SiStripConfigDb::" << __func__ << "]";
347 
348  if ( analyses_.empty() ) {
349  stringstream ss;
350  ss << "[SiStripConfigDb::" << __func__ << "]"
351  << " Found no cached analysis descriptions!";
352  //edm::LogWarning(mlConfigDb_) << ss.str();
353  return;
354  }
355 
356  // Reproduce temporary cache for "all partitions except specified one" (or clear all if none specified)
357  AnalysisDescriptions temporary_cache;
358  if ( partition.empty() ) { temporary_cache = AnalysisDescriptions(); }
359  else {
360  SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
361  SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
362  for ( ; iter != jter; ++iter ) {
363  if ( partition != iter->second.partitionName() ) {
364  AnalysisDescriptionsRange range = analyses_.find( iter->second.partitionName() );
365  if ( range != analyses_.emptyRange() ) {
366  temporary_cache.loadNext( partition, AnalysisDescriptionsV( range.begin(), range.end() ) );
367  } else {
368  // stringstream ss;
369  // ss << "[SiStripConfigDb::" << __func__ << "]"
370  // << " Cannot find partition \"" << iter->second.partitionName()
371  // << "\" in local cache!";
372  // edm::LogWarning(mlConfigDb_) << ss.str();
373  }
374  }
375  }
376  }
377 
378  // Delete objects in local cache for specified partition (or all if not specified)
379  AnalysisDescriptionsRange anals = analyses_.emptyRange();
380  if ( partition.empty() ) {
381  if ( !analyses_.empty() ) {
382  anals = AnalysisDescriptionsRange( analyses_.find( dbParams_.partitions().begin()->second.partitionName() ).begin(),
383  analyses_.find( (--(dbParams_.partitions().end()))->second.partitionName() ).end() );
384  } else { anals = analyses_.emptyRange(); }
385  } else {
386  SiStripDbParams::SiStripPartitions::const_iterator iter = dbParams_.partitions().begin();
387  SiStripDbParams::SiStripPartitions::const_iterator jter = dbParams_.partitions().end();
388  for ( ; iter != jter; ++iter ) { if ( partition == iter->second.partitionName() ) { break; } }
389  anals = analyses_.find( iter->second.partitionName() );
390  }
391 
392  if ( anals != analyses_.emptyRange() ) {
393  AnalysisDescriptionsV::const_iterator ianal = anals.begin();
394  AnalysisDescriptionsV::const_iterator janal = anals.end();
395  for ( ; ianal != janal; ++ianal ) { if ( *ianal ) { delete *ianal; } }
396  } else {
397  stringstream ss;
398  ss << "[SiStripConfigDb::" << __func__ << "]";
399  if ( partition.empty() ) { ss << " Found no analysis descriptions in local cache!"; }
400  else { ss << " Found no analysis descriptions in local cache for partition \"" << partition << "\"!"; }
401  edm::LogWarning(mlConfigDb_) << ss.str();
402  }
403 
404  // Overwrite local cache with temporary cache
405  analyses_ = temporary_cache;
406 
407 }
408 
409 // -----------------------------------------------------------------------------
410 //
412 
413  std::stringstream ss;
414  ss << "[SiStripConfigDb::" << __func__ << "]"
415  << " Contents of AnalysisDescriptions container:" << std::endl;
416  ss << " Number of partitions: " << analyses_.size() << std::endl;
417 
418  // Loop through partitions
419  uint16_t cntr = 0;
420  AnalysisDescriptions::const_iterator ianal = analyses_.begin();
421  AnalysisDescriptions::const_iterator janal = analyses_.end();
422  for ( ; ianal != janal; ++ianal ) {
423 
424  cntr++;
425  if ( partition.empty() || partition == ianal->first ) {
426 
427  ss << " Partition number : " << cntr << " (out of " << analyses_.size() << ")" << std::endl;
428  ss << " Partition name : \"" << ianal->first << "\"" << std::endl;
429  ss << " Num of analyses : " << ianal->second.size() << std::endl;
430 
431  // Extract FEC crate, slot, etc
432  std::map< uint32_t, vector<uint32_t> > analyses;
433  AnalysisDescriptionsV::const_iterator iter = ianal->second.begin();
434  AnalysisDescriptionsV::const_iterator jter = ianal->second.end();
435  for ( ; iter != jter; ++iter ) {
436  if ( *iter ) {
437  DeviceAddress addr = deviceAddress( **iter );
438  uint32_t key = SiStripFecKey( addr.fecCrate_,
439  addr.fecSlot_,
440  addr.fecRing_,
441  0,
442  0,
443  0,
444  0 ).key();
445  uint32_t data = SiStripFecKey( addr.fecCrate_,
446  addr.fecSlot_,
447  addr.fecRing_,
448  addr.ccuAddr_,
449  addr.ccuChan_,
450  addr.lldChan_,
451  addr.i2cAddr_ ).key();
452  if ( find( analyses[key].begin(), analyses[key].end(), data ) == analyses[key].end() ) {
453  analyses[key].push_back( data );
454  }
455  }
456  }
457 
458  // Sort contents
459  std::map< uint32_t, std::vector<uint32_t> > tmp;
460  std::map< uint32_t, std::vector<uint32_t> >::const_iterator ii = analyses.begin();
461  std::map< uint32_t, std::vector<uint32_t> >::const_iterator jj = analyses.end();
462  for ( ; ii != jj; ++ii ) {
463  std::vector<uint32_t> temp = ii->second;
464  std::sort( temp.begin(), temp.end() );
465  std::vector<uint32_t>::const_iterator iii = temp.begin();
466  std::vector<uint32_t>::const_iterator jjj = temp.end();
467  for ( ; iii != jjj; ++iii ) { tmp[ii->first].push_back( *iii ); }
468  }
469  analyses.clear();
470  analyses = tmp;
471 
472  // Print FEC crate, slot, etc...
473  std::map< uint32_t, std::vector<uint32_t> >::const_iterator ianal = analyses.begin();
474  std::map< uint32_t, std::vector<uint32_t> >::const_iterator janal = analyses.end();
475  for ( ; ianal != janal; ++ianal ) {
476  SiStripFecKey key(ianal->first);
477  ss << " Found " << std::setw(3) << ianal->second.size()
478  << " analyses for FEC crate/slot/ring "
479  << key.fecCrate() << "/"
480  << key.fecSlot() << "/"
481  << key.fecRing();
482  //<< " (ccu/module/lld/i2c): ";
483  // if ( !ianal->second.empty() ) {
484  // uint16_t first = ianal->second.front();
485  // uint16_t last = ianal->second.front();
486  // std::vector<uint32_t>::const_iterator chan = ianal->second.begin();
487  // for ( ; chan != ianal->second.end(); chan++ ) {
488  // if ( chan != ianal->second.begin() ) {
489  // if ( *chan != last+1 ) {
490  // ss << std::setw(2) << first << "->" << std::setw(2) << last << ", ";
491  // if ( chan != ianal->second.end() ) { first = *(chan+1); }
492  // }
493  // }
494  // last = *chan;
495  // }
496  // if ( first != last ) { ss << std::setw(2) << first << "->" << std::setw(2) << last; }
497  ss << std::endl;
498  }
499 
500  }
501 
502  }
503 
504  LogTrace(mlConfigDb_) << ss.str();
505 
506 }
507 
508 // -----------------------------------------------------------------------------
509 //
511 
512  DeviceAddress addr;
513  try {
514  addr.fecCrate_ = static_cast<uint16_t>( desc.getCrate() + sistrip::FEC_CRATE_OFFSET );
515  addr.fecSlot_ = static_cast<uint16_t>( desc.getSlot() );
516  addr.fecRing_ = static_cast<uint16_t>( desc.getRing() + sistrip::FEC_RING_OFFSET );
517  addr.ccuAddr_ = static_cast<uint16_t>( desc.getCcuAdr() );
518  addr.ccuChan_ = static_cast<uint16_t>( desc.getCcuChan() );
519  addr.lldChan_ = static_cast<uint16_t>( SiStripFecKey::lldChan( desc.getI2cAddr() ) );
520  addr.i2cAddr_ = static_cast<uint16_t>( desc.getI2cAddr() );
521  addr.fedId_ = static_cast<uint16_t>( desc.getFedId() ); //@@ offset required? crate/slot needed?
522  addr.feUnit_ = static_cast<uint16_t>( desc.getFeUnit() );
523  addr.feChan_ = static_cast<uint16_t>( desc.getFeChan() );
524  } catch (...) { handleException( __func__ ); }
525 
526  return addr;
527 }
528 
529 // -----------------------------------------------------------------------------
530 //
532  if ( analysis_type == AnalysisDescription::T_ANALYSIS_FASTFEDCABLING ) { return "FAST_CABLING"; }
533  else if ( analysis_type == AnalysisDescription::T_ANALYSIS_TIMING ) { return "APV_TIMING"; }
534  else if ( analysis_type == AnalysisDescription::T_ANALYSIS_OPTOSCAN ) { return "OPTO_SCAN"; }
535  else if ( analysis_type == AnalysisDescription::T_ANALYSIS_PEDESTALS ) { return "PEDESTALS"; }
536  else if ( analysis_type == AnalysisDescription::T_ANALYSIS_PEDSFULLNOISE ) { return "PEDSFULLNOISE"; }
537  else if ( analysis_type == AnalysisDescription::T_ANALYSIS_APVLATENCY ) { return "APV_LATENCY"; }
538  else if ( analysis_type == AnalysisDescription::T_ANALYSIS_FINEDELAY ) { return "FINE_DELAY"; }
539  else if ( analysis_type == AnalysisDescription::T_ANALYSIS_CALIBRATION ) { return "CALIBRATION"; }
540  else if ( analysis_type == AnalysisDescription::T_UNKNOWN ) { return "UNKNOWN ANALYSIS TYPE"; }
541  else { return "UNDEFINED ANALYSIS TYPE"; }
542 }
type
Definition: HCALResponse.h:21
static const std::string defaultPartitionName_
const uint16_t & fecRing() const
void loadNext(K const &k, std::vector< T > const &v)
Definition: MapOfVectors.h:99
void uploadAnalysisDescriptions(bool calibration_for_physics=false, std::string partition="")
void addAnalysisDescriptions(std::string partition, AnalysisDescriptionsV &)
static const uint16_t FEC_RING_OFFSET
const uint16_t & lldChan() const
const uint16_t & fecSlot() const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
sistrip classes
const uint32_t & key() const
Definition: SiStripKey.h:125
static const char mlConfigDb_[]
Utility class that identifies a position within the strip tracker control structure, down to the level of an APV25.
Definition: SiStripFecKey.h:45
int np
Definition: AMPTWrapper.h:33
CommissioningAnalysisDescription AnalysisDescription
void clearAnalysisDescriptions(std::string partition="")
#define end
Definition: vmac.h:39
DeviceAddress deviceAddress(const deviceDescription &)
AnalysisDescriptionsRange getAnalysisDescriptions(AnalysisType, std::string partition="")
#define LogTrace(id)
ii
Definition: cuy.py:589
const uint16_t & fecCrate() const
AnalysisDescriptions::range AnalysisDescriptionsRange
CommissioningAnalysisDescription::commissioningType AnalysisType
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
#define begin
Definition: vmac.h:32
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
std::string analysisType(AnalysisType) const
std::vector< AnalysisDescription * > AnalysisDescriptionsV
static const uint16_t FEC_CRATE_OFFSET
void printAnalysisDescriptions(std::string partition="")