CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
CSCTMBData.cc
Go to the documentation of this file.
1 
8 
9 #include <iomanip> // dump for JK
10 #include <iostream>
11 #include <cstdio>
14 
15 #ifdef LOCAL_UNPACK
16 bool CSCTMBData::debug = false;
17 #else
18 std::atomic<bool> CSCTMBData::debug{false};
19 #endif
20 
22  : theOriginalBuffer(nullptr),
23  theB0CLine(0),
24  theE0FLine(0),
25  theTMBHeader(2007, 0x50c3),
26  theComparatorData(&theTMBHeader),
27  theGEMData(nullptr),
28  theTMBScopeIsPresent(false),
29  theTMBScope(nullptr),
30  theTMBMiniScopeIsPresent(false),
31  theTMBMiniScope(nullptr),
32  theBlockedCFEBIsPresent(false),
33  theTMBBlockedCFEB(nullptr),
34  theTMBTrailer(theTMBHeader.sizeInWords() + theComparatorData.sizeInWords(), 2007),
35  size_(0),
36  cWordCnt(0),
37  theRPCDataIsPresent(false),
38  theGEMDataIsPresent(false) {}
39 
40 CSCTMBData::CSCTMBData(int firmwareVersion, int firmwareRevision, int cfebs)
41  : theOriginalBuffer(nullptr),
42  theB0CLine(0),
43  theE0FLine(0),
44  theTMBHeader(firmwareVersion, firmwareRevision),
45  theComparatorData(&theTMBHeader),
46  theGEMData(nullptr),
47  theTMBScopeIsPresent(false),
48  theTMBScope(nullptr),
49  theTMBMiniScopeIsPresent(false),
50  theTMBMiniScope(nullptr),
51  theBlockedCFEBIsPresent(false),
52  theTMBBlockedCFEB(nullptr),
53  theTMBTrailer(theTMBHeader.sizeInWords() + theComparatorData.sizeInWords(), firmwareVersion),
54  size_(0),
55  cWordCnt(0),
56  theRPCDataIsPresent(false),
57  theGEMDataIsPresent(false) {
58  theTMBHeader.setNCFEBs(cfebs);
61 }
62 
63 CSCTMBData::CSCTMBData(const uint16_t* buf)
64  : theOriginalBuffer(buf),
65  theTMBHeader(2007, 0x50c3),
66  theComparatorData(&theTMBHeader),
67  theGEMData(nullptr),
68  theTMBScopeIsPresent(false),
69  theTMBScope(nullptr),
70  theTMBMiniScopeIsPresent(false),
71  theTMBMiniScope(nullptr),
72  theBlockedCFEBIsPresent(false),
73  theTMBBlockedCFEB(nullptr),
74  theTMBTrailer(theTMBHeader.sizeInWords() + theComparatorData.sizeInWords(), 2007),
75  theRPCDataIsPresent(false),
76  theGEMDataIsPresent(false) {
77  size_ = UnpackTMB(buf);
78 }
79 
80 // Explicitly-defined copy constructor is needed when the scope data is
81 // present, to prevent the same pointer from being deleted twice. -SV.
83  : theOriginalBuffer(data.theOriginalBuffer),
84  theB0CLine(data.theB0CLine),
85  theE0FLine(data.theE0FLine),
86  theTMBHeader(data.theTMBHeader),
87  theComparatorData(data.theComparatorData),
88  theRPCData(data.theRPCData),
89  theGEMData(data.theGEMData),
90  theTMBScopeIsPresent(data.theTMBScopeIsPresent),
91  theTMBMiniScopeIsPresent(data.theTMBMiniScopeIsPresent),
92  theBlockedCFEBIsPresent(data.theBlockedCFEBIsPresent),
93  theTMBTrailer(data.theTMBTrailer),
94  size_(data.size_),
95  cWordCnt(data.cWordCnt),
96  theRPCDataIsPresent(data.theRPCDataIsPresent),
97  theGEMDataIsPresent(data.theGEMDataIsPresent) {
99  theTMBScope = new CSCTMBScope(*(data.theTMBScope));
100  } else {
101  theTMBScope = nullptr;
102  }
103 
106  } else {
107  theTMBMiniScope = nullptr;
108  }
109 
112  } else {
113  theTMBBlockedCFEB = nullptr;
114  }
115 
116  if (theGEMDataIsPresent) {
117  theGEMData = new CSCGEMData(*(data.theGEMData));
118  } else {
119  theGEMData = nullptr;
120  }
121 }
122 
124  if (theTMBScopeIsPresent) {
125  delete theTMBScope;
126  theTMBScopeIsPresent = false;
127  }
128 
130  delete theTMBMiniScope;
131  theTMBMiniScopeIsPresent = false;
132  }
133 
135  delete theTMBBlockedCFEB;
136  theBlockedCFEBIsPresent = false;
137  }
138 
139  if (theGEMDataIsPresent) {
140  delete theGEMData;
141  theGEMDataIsPresent = false;
142  }
143 }
144 
147 int findLine(const uint16_t* buf, uint16_t marker, int first, int maxToDo) {
148  for (int i = first; i < maxToDo; ++i) {
149  if (buf[i] == marker) {
150  return i;
151  }
152  }
153  return -1;
154 }
155 
157  std::vector<std::bitset<16> > theTotalTMBData(theE0FLine + 1 - theB0CLine);
158  unsigned i = 0;
159  for (unsigned int line = theB0CLine; line < theE0FLine + 1; ++line) {
160  theTotalTMBData[i] = std::bitset<16>(theOriginalBuffer[line]);
161  ++i;
162  }
163  if (!theTotalTMBData.empty()) {
164  std::bitset<22> CRC = calCRC22(theTotalTMBData);
165  LogTrace("CSCTMBData|CSCRawToDigi") << " Test here " << CRC.to_ulong();
166  return CRC.to_ulong();
167  } else {
168  LogTrace("CSCTMBData|CSCRawToDigi") << "theTotalTMBData doesn't exist";
169  return 0;
170  }
171 }
172 
173 int CSCTMBData::UnpackTMB(const uint16_t* buf) {
175  unsigned short int firmwareVersion = 0;
176  unsigned short int firmwareRevision = 0;
177  int Ntbins = 0;
178  int NRPCtbins = 0; // Number of RPC tbins
179  int NGEMtbins = 0; // Number of GEM tbins
180  int NGEMEnabled = 0; // Number of Enabled GEM Fibers
181  int GEMFibersMask = 0;
182  bool isGEMfirmware = false;
183 
184  int b0cLine = 0;
185 
188  if (buf[b0cLine] == 0xdb0c) {
189  firmwareVersion = 2007;
190  firmwareRevision = buf[b0cLine + 7] & 0x7fff;
191  Ntbins = buf[b0cLine + 19] & 0xF8;
192  if ((firmwareRevision < 0x4000) /* New Run3 (O)TMB firmware revision format */
193  && (((firmwareRevision >> 9) & 0x2) == 0x2))
194  isGEMfirmware = true;
195 
196  if (isGEMfirmware) {
197  GEMFibersMask = buf[b0cLine + 36] & 0xf; // GEM enabled fibers 4-bits mask
199  // for (int i = 0; i < 4; i++)
200  // NGEMEnabled += (buf[b0cLine + 36] >> i) & 0x1; // Get number of enabled GEM fibers
201  NGEMEnabled = 4; // Currently always assume that all 4 fibers are enabled
202  NGEMtbins = (buf[b0cLine + 36] >> 5) & 0x1F; // Get GEM tbins
203  }
204  // } else {
205  {
206  NRPCtbins = (buf[b0cLine + 36] >> 5) & 0x1F; // Get RPC tbins
207  }
208  } else if (buf[b0cLine] == 0x6b0c) {
209  firmwareVersion = 2006;
210  Ntbins = buf[b0cLine + 1] & 0x1f;
211  NRPCtbins = Ntbins;
212  } else {
213  LogTrace("CSCTMBData|CSCRawToDigi") << "+++ Can't find b0C flag";
214  }
215 
216  if ((firmwareVersion == 2007) &&
217  (!(((buf[b0cLine] & 0xFFFF) == 0xDB0C) && ((buf[b0cLine + 1] & 0xf000) == 0xD000) &&
218  ((buf[b0cLine + 2] & 0xf000) == 0xD000) && ((buf[b0cLine + 3] & 0xf000) == 0xD000)))) {
219  LogTrace("CSCTMBData|CSCRawToDigi") << "+++ CSCTMBData warning: error in header in 2007 format!";
220  }
221 
222  int MaxSizeRPC = 1 + NRPCtbins * 2 * 4 + 1;
223  int MaxSizeGEM = 1 + NGEMEnabled * NGEMtbins * 4 + 1;
224  //int MaxSizeScope = 5;
225  int e0bLine = -1;
226  switch (firmwareVersion) {
227  case 2007:
228  e0bLine = 42; //last word of header2007
229  break;
230  case 2006:
231  e0bLine = 26; //last word of header in 2006 format
232  break;
233  default:
234  edm::LogError("CSCTMBData|CSCRawToDigi") << "+++ undetermined firmware format - cant find e0bLine";
235  }
236 
237  theTMBHeader = CSCTMBHeader(buf);
238 
239  if (!theTMBHeader.check()) {
240  LogTrace("CSCTMBData|CSCRawToDigi") << "+++ CSCTMBData warning: Bad TMB header e0bLine=" << std::hex
241  << buf[e0bLine];
242  return 0;
243  }
244 
245  int currentPosition = theTMBHeader.sizeInWords();
246  int theFirmwareVersion = theTMBHeader.FirmwareVersion();
247 
249  CSCComparatorData(theTMBHeader.NCFEBs(), theTMBHeader.NTBins(), buf + e0bLine + 1, theFirmwareVersion);
250 
251  if (!theComparatorData.check()) {
252  LogTrace("CSCTMBData|CSCRawToDigi") << "+++ CSCTMBData warning: Bad CLCT data";
253  } else {
254  currentPosition += theComparatorData.sizeInWords();
255  }
256 
257  // look for RPC data
258  int b04Line = currentPosition;
259 
260  if (buf[b04Line] == 0x6b04) {
261  // we need an e04 line to calculate the size
262  int e04Line = findLine(buf, 0x6e04, currentPosition, currentPosition + MaxSizeRPC);
263  if (e04Line != -1) {
264  theRPCDataIsPresent = true;
265  theRPCData = CSCRPCData(buf + b04Line, e04Line - b04Line + 1);
266  currentPosition += theRPCData.sizeInWords();
267  } else {
268  LogTrace("CSCTMBData|CSCRawToDigi") << "CSCTMBData::corrupt RPC data! Failed to find end! ";
269  return 0;
270  }
271  }
272 
273  // look for GEM data
274  int c04Line = currentPosition;
275 
276  if (buf[c04Line] == 0x6c04) {
277  // we need an d04 line to calculate the size
278  int d04Line = findLine(buf, 0x6d04, currentPosition, currentPosition + MaxSizeGEM);
279  if (d04Line != -1) {
280  theGEMDataIsPresent = true;
281  theGEMData = new CSCGEMData(buf + c04Line, d04Line - c04Line + 1, GEMFibersMask);
282  if (theGEMData != nullptr)
283  currentPosition += theGEMData->sizeInWords();
284  } else {
285  LogTrace("CSCTMBData|CSCRawToDigi") << "CSCTMBData::corrupt GEM data! Failed to find end! ";
286  return 0;
287  }
288  }
289 
290  int TotTMBReadout = 0;
291  switch (firmwareVersion) {
292  case 2007:
293  if (theGEMDataIsPresent) {
294  TotTMBReadout = 43 + Ntbins * 6 * 5 + 1 + NGEMEnabled * NGEMtbins * 4 + 2 + 8 * 256 + 8;
295  } else {
296  TotTMBReadout = 43 + Ntbins * 6 * 5 + 1 + NRPCtbins * 2 * 4 + 2 + 8 * 256 + 8;
297  };
298  break;
299  case 2006:
300  TotTMBReadout =
301  27 + Ntbins * 6 * 5 + 1 + NRPCtbins * 2 * 4 + 2 + 8 * 256 + 8; //see tmb2004 manual (version v2p06) page54.
302  break;
303  default:
304  edm::LogError("CSCTMBData|CSCRawToDigi") << "can't find TotTMBReadout - unknown firmware version!";
305  break;
306  }
307 
308  //std::cout << " !!!TMB Scope!!! " << std::endl;
309  if (buf[currentPosition] == 0x6b05) {
310  int b05Line = currentPosition;
311  LogTrace("CSCTMBData|CSCRawToDigi") << "found scope!";
312  int e05Line = findLine(buf, 0x6e05, currentPosition, TotTMBReadout - currentPosition);
313  if (e05Line != -1) {
314  theTMBScopeIsPresent = true;
315  theTMBScope = new CSCTMBScope(buf, b05Line, e05Line);
316  // The size of the TMB scope data can vary, and I see no good reasons
317  // not to determine it dynamically. -SV, 5 Nov 2008.
318  //currentPosition+=theTMBScope->sizeInWords();
319  currentPosition += (e05Line - b05Line + 1);
320  } else {
321  LogTrace("CSCTMBData|CSCRawToDigi") << "+++ CSCTMBData warning: found 0x6b05 line, but not 0x6e05! +++";
322  }
323  }
324 
326  if (buf[currentPosition] == 0x6b07) {
327  int Line6b07 = currentPosition;
328  LogTrace("CSCTMBData") << " TMBData ---> Begin of MiniScope found ";
329  int Line6E07 = findLine(buf, 0x6E07, currentPosition, TotTMBReadout - currentPosition);
330  if (Line6E07 != -1) {
331  LogTrace("CSCTMBData") << " TMBData --> End of MiniScope found " << Line6E07 - Line6b07 + 1 << " words ";
333  theTMBMiniScope = new CSCTMBMiniScope(buf, Line6b07, Line6E07);
334  currentPosition += (Line6E07 - Line6b07 + 1);
335  } else {
336  LogTrace("CSCTMBData") << "+++ CSCTMBData warning MiniScope!: found 0x6b07 line, but not 0x6e07! +++";
337  }
338  }
340 
342  if (buf[currentPosition] == 0x6BCB) {
343  int Line6BCB = currentPosition;
344  LogTrace("CSCTMBData") << " TMBData ---> Begin of Blocked CFEB found ";
345  int Line6ECB = findLine(buf, 0x6ECB, currentPosition, TotTMBReadout - currentPosition);
346  if (Line6ECB != -1) {
347  LogTrace("CSCTMBData") << " TMBData --> End of Blocked CFEB found " << Line6ECB - Line6BCB + 1 << " words ";
349  theTMBBlockedCFEB = new CSCTMBBlockedCFEB(buf, Line6BCB, Line6ECB);
350  currentPosition += (Line6ECB - Line6BCB + 1);
351  } else {
352  LogTrace("CSCTMBData") << "+++ CSCTMBData warning Blocked CFEB!: found 0x6BCB line, but not 0x6ECB! +++";
353  }
354  }
356 
357  int maxLine = findLine(buf, 0xde0f, currentPosition, TotTMBReadout - currentPosition);
358  if (maxLine == -1) {
359  LogTrace("CSCTMBData|CSCRawToDigi") << "+++ CSCTMBData warning: No e0f line!";
360  return 0;
361  }
362 
363  //Now for CRC check put this information into bitset
364 
365  theB0CLine = b0cLine;
366  theE0FLine = maxLine;
367 
368  // finally, the trailer
369  int e0cLine = findLine(buf, 0x6e0c, currentPosition, maxLine);
370  if (e0cLine == -1) {
371  LogTrace("CSCTMBData|CSCRawToDigi") << "+++ CSCTMBData warning: No e0c line!";
372  } else {
373  theTMBTrailer = CSCTMBTrailer(buf + e0cLine, firmwareVersion);
374  LogTrace("CSCTMBData|CSCRawToDigi") << "TMB trailer size: " << theTMBTrailer.sizeInWords();
375  }
376 
377  checkSize();
378 
379  // Dump of TMB; format proposed by JK.
380 #ifdef TMBDUMP
381  LogTrace("CSCTMBData") << "Dump of TMB data:";
382  for (int line = b0cLine; line <= maxLine + 3; line++) {
383  LogTrace("CSCTMBData") << "Adr= " << std::setw(4) << line << " Data= " << std::setfill('0') << std::setw(5)
384  << std::uppercase << std::hex << buf[line] << std::dec << std::endl;
385  }
386 #endif
387 
388  // size, since we count from 0 and have one more trailer word
389  // there are sometimes multiple "de0f" lines in trailer, so key on "6e0c"
390  return e0cLine - b0cLine + theTMBTrailer.sizeInWords();
391 } //UnpackTMB
392 
393 bool CSCTMBData::checkSize() const {
394  // sum up all the components and see if they have the size indicated in the TMBTrailer
395  return true;
396 }
397 
398 std::bitset<22> CSCTMBData::calCRC22(const std::vector<std::bitset<16> >& datain) {
399  std::bitset<22> CRC;
400  CRC.reset();
401  for (unsigned int i = 0; i < datain.size() - 3; ++i) {
402  CRC = nextCRC22_D16(datain[i], CRC);
403  }
404  return CRC;
405 }
406 
409  throw("No TMBScope in this chamber");
410  return *theTMBScope;
411 }
412 
415  throw("No TMBScope in this chamber");
416  return *theTMBMiniScope;
417 }
418 
420  if (!theGEMDataIsPresent)
421  throw("No GEM Data in this chamber");
422  return theGEMData;
423 }
424 
425 std::bitset<22> CSCTMBData::nextCRC22_D16(const std::bitset<16>& D, const std::bitset<22>& C) {
426  std::bitset<22> NewCRC;
427 
428  NewCRC[0] = D[0] ^ C[6];
429  NewCRC[1] = D[1] ^ D[0] ^ C[6] ^ C[7];
430  NewCRC[2] = D[2] ^ D[1] ^ C[7] ^ C[8];
431  NewCRC[3] = D[3] ^ D[2] ^ C[8] ^ C[9];
432  NewCRC[4] = D[4] ^ D[3] ^ C[9] ^ C[10];
433  NewCRC[5] = D[5] ^ D[4] ^ C[10] ^ C[11];
434  NewCRC[6] = D[6] ^ D[5] ^ C[11] ^ C[12];
435  NewCRC[7] = D[7] ^ D[6] ^ C[12] ^ C[13];
436  NewCRC[8] = D[8] ^ D[7] ^ C[13] ^ C[14];
437  NewCRC[9] = D[9] ^ D[8] ^ C[14] ^ C[15];
438  NewCRC[10] = D[10] ^ D[9] ^ C[15] ^ C[16];
439  NewCRC[11] = D[11] ^ D[10] ^ C[16] ^ C[17];
440  NewCRC[12] = D[12] ^ D[11] ^ C[17] ^ C[18];
441  NewCRC[13] = D[13] ^ D[12] ^ C[18] ^ C[19];
442  NewCRC[14] = D[14] ^ D[13] ^ C[19] ^ C[20];
443  NewCRC[15] = D[15] ^ D[14] ^ C[20] ^ C[21];
444  NewCRC[16] = D[15] ^ C[0] ^ C[21];
445  NewCRC[17] = C[1];
446  NewCRC[18] = C[2];
447  NewCRC[19] = C[3];
448  NewCRC[20] = C[4];
449  NewCRC[21] = C[5];
450 
451  return NewCRC;
452 }
453 
454 boost::dynamic_bitset<> CSCTMBData::pack() {
455  boost::dynamic_bitset<> result =
457  boost::dynamic_bitset<> comparatorData =
459  result = bitset_utilities::append(result, comparatorData);
460  boost::dynamic_bitset<> newResult = result;
461  // theTMBTrailer.setCRC(TMBCRCcalc());
462 
463  boost::dynamic_bitset<> tmbTrailer =
465  result = bitset_utilities::append(result, tmbTrailer);
466 
467  // now convert to a vector<bitset<16>>, so we can calculate the crc
468  std::vector<std::bitset<16> > wordVector;
469  // try to tune so it stops before the e0f line
470  for (unsigned pos = 0; pos < result.size() - 16; pos += 16) {
471  std::bitset<16> word;
472  for (int i = 0; i < 16; ++i) {
473  word[i] = result[pos + i];
474  }
475  wordVector.push_back(word);
476  }
477  theTMBTrailer.setCRC(calCRC22(wordVector).to_ulong());
479  newResult = bitset_utilities::append(newResult, tmbTrailer);
480 
481  return newResult;
482 }
483 
485  CSCTMBData tmbData;
486  cscClassPackerCompare(tmbData);
487 }
CSCTMBTrailer * tmbTrailer()
Definition: CSCTMBData.h:51
unsigned theE0FLine
Definition: CSCTMBData.h:77
bool theRPCDataIsPresent
Definition: CSCTMBData.h:103
uint16_t NTBins() const
Definition: CSCTMBHeader.h:66
CSCTMBTrailer theTMBTrailer
Definition: CSCTMBData.h:95
CSCGEMData * theGEMData
Definition: CSCTMBData.h:82
static void selfTest()
tests packing
Definition: CSCTMBData.cc:484
int TMBCRCcalc()
Definition: CSCTMBData.cc:156
boost::dynamic_bitset pack()
not const because it sets size int TMBTrailer
Definition: CSCTMBData.cc:454
bool theBlockedCFEBIsPresent
Definition: CSCTMBData.h:92
boost::dynamic_bitset append(const boost::dynamic_bitset<> &bs1, const boost::dynamic_bitset<> &bs2)
this method takes two bitsets bs1 and bs2 and returns result of bs2 appended to the end of bs1 ...
std::bitset< 22 > nextCRC22_D16(const std::bitset< 16 > &D, const std::bitset< 22 > &C)
Definition: CSCTMBData.cc:425
unsigned short size_
Definition: CSCTMBData.h:101
bool theTMBMiniScopeIsPresent
Definition: CSCTMBData.h:89
int sizeInWords() const
in 16-bit frames
Definition: CSCTMBTrailer.h:42
unsigned theB0CLine
Definition: CSCTMBData.h:76
CSCRPCData theRPCData
Definition: CSCTMBData.h:81
unsigned short * data()
Definition: CSCTMBTrailer.h:43
Log< level::Error, false > LogError
bool cscClassPackerCompare(T &t)
bool theGEMDataIsPresent
Definition: CSCTMBData.h:104
#define LogTrace(id)
uint16_t NCFEBs() const
Definition: CSCTMBHeader.h:67
tuple result
Definition: mps_fire.py:311
int sizeInWords() const
in 16-bit words
std::bitset< 22 > calCRC22(const std::vector< std::bitset< 16 > > &datain)
Definition: CSCTMBData.cc:398
void setNCFEBs(uint16_t ncfebs)
Definition: CSCTMBHeader.h:74
uint64_t word
CSCTMBHeader theTMBHeader
Definition: CSCTMBData.h:79
static std::atomic< bool > debug
Definition: CSCTMBData.h:99
CSCTMBBlockedCFEB * theTMBBlockedCFEB
Definition: CSCTMBData.h:93
const uint16_t * theOriginalBuffer
Definition: CSCTMBData.h:73
unsigned short * data()
Definition: CSCTMBHeader.h:107
CSCTMBScope & tmbScope() const
Definition: CSCTMBData.cc:407
void setCRC(int crc)
int sizeInWords()
Definition: CSCRPCData.h:21
unsigned short int sizeInWords() const
Definition: CSCTMBHeader.h:103
int sizeInWords() const
Definition: CSCGEMData.h:21
CSCComparatorData theComparatorData
Definition: CSCTMBData.h:80
CSCTMBMiniScope * theTMBMiniScope
Definition: CSCTMBData.h:90
DecomposeProduct< arg, typename Div::arg > D
Definition: Factorize.h:141
CSCComparatorData * comparatorData()
Definition: CSCTMBData.h:41
bool theTMBScopeIsPresent
The TMB scope is not present in most of data hence its dynamic.
Definition: CSCTMBData.h:84
bool check() const
Definition: CSCTMBHeader.h:112
CSCTMBScope * theTMBScope
Definition: CSCTMBData.h:85
CSCGEMData * gemData() const
Definition: CSCTMBData.cc:419
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
int findLine(const uint16_t *buf, uint16_t marker, int first, int maxToDo)
Definition: CSCTMBData.cc:147
int FirmwareVersion() const
Definition: CSCTMBHeader.h:40
bool checkSize() const
sees if the size adds up to the word count
Definition: CSCTMBData.cc:393
boost::dynamic_bitset ushortToBitset(const unsigned int numberOfBits, unsigned short *buf)
this method takes numberOfBits bits from unsigned short * array and returns them in the bitset obj...
int UnpackTMB(const uint16_t *buf)
Definition: CSCTMBData.cc:173
unsigned short * data()
CSCTMBMiniScope & tmbMiniScope() const
Definition: CSCTMBData.cc:413