CMS 3D CMS Logo

CSCEventData.cc
Go to the documentation of this file.
6 #include <iostream>
7 #include <iterator>
10 
11 #ifdef LOCAL_UNPACK
12 bool CSCEventData::debug = false;
13 #else
14 std::atomic<bool> CSCEventData::debug{false};
15 #endif
16 
17 CSCEventData::CSCEventData(int chamberType, uint16_t format_version)
18  : theDMBHeader(format_version),
19  theALCTHeader(nullptr),
20  theAnodeData(nullptr),
21  theALCTTrailer(nullptr),
22  theTMBData(nullptr),
23  theDMBTrailer(format_version),
24  theChamberType(chamberType),
25  alctZSErecovered(nullptr),
26  zseEnable(0),
27  theFormatVersion(format_version) {
28  for (unsigned i = 0; i < MAX_CFEB; ++i) {
29  theCFEBData[i] = nullptr;
30  }
31 }
32 
33 CSCEventData::CSCEventData(const uint16_t* buf, uint16_t format_version) : theFormatVersion(format_version) {
34  theFormatVersion = format_version;
36 }
37 
38 void CSCEventData::unpack_data(const uint16_t* buf) {
39  // zero everything
40  init();
41  const uint16_t* pos = buf;
42  if (debug) {
43  LogTrace("CSCEventData|CSCRawToDigi") << "The event data ";
44  for (int i = 0; i < 16; ++i) {
45  LogTrace("CSCEventData|CSCRawToDigi") << std::hex << pos[i] << " ";
46  }
47  }
48 
50  if (!(theDMBHeader.check())) {
51  LogTrace("CSCEventData|CSCRawToDigi") << "Bad DMB Header??? "
52  << " first four words: ";
53  for (int i = 0; i < 4; ++i) {
54  LogTrace("CSCEventData|CSCRawToDigi") << std::hex << pos[i] << " ";
55  }
56  }
57 
58  if (debug) {
59  LogTrace("CSCEventData|CSCRawToDigi") << "nalct = " << nalct();
60  LogTrace("CSCEventData|CSCRawToDigi") << "nclct = " << nclct();
61  }
62 
63  if (debug) {
64  LogTrace("CSCEventData|CSCRawToDigi") << "size in words of DMBHeader" << theDMBHeader.sizeInWords();
65  LogTrace("CSCEventData|CSCRawToDigi") << "sizeof(DMBHeader)" << sizeof(theDMBHeader);
66  }
67 
69 
70  if (nalct() == 1) {
71  if (isALCT(pos)) //checking for ALCTData
72  {
74  if (!theALCTHeader->check()) {
75  LogTrace("CSCEventData|CSCRawToDigi") << "+++WARNING: Corrupt ALCT data - won't attempt to decode";
76  } else {
77  //dataPresent|=0x40;
78  pos += theALCTHeader->sizeInWords(); //size of the header
79  //fill ALCT Digis
81 
82  //theAnodeData = new CSCAnodeData(*theALCTHeader, pos);
83 
85  /*
86  std::cout << " ****The ALCT information from CSCEventData.cc (begin)**** " << std::endl; ///to_rm
87  std::cout << " alctHeader2007().size: " << theALCTHeader->alctHeader2007().sizeInWords() << std::endl; ///to_rm
88  std::cout << " ALCT Header Content: " << std::endl; ///to_rm
90  for(int k=0; k<theALCTHeader->sizeInWords(); k+=4){
91  std::cout << std::hex << theALCTHeader->data()[k+3]
92  << " " << theALCTHeader->data()[k+2]
93  << " " << theALCTHeader->data()[k+1]
94  << " " << theALCTHeader->data()[k] << std::dec << std::endl;
95  }
96  */
97  //std::cout << " ALCT Size: " << theAnodeData->sizeInWords() << std::endl;
99  // int zseEnable = 0;
100  zseEnable = (theALCTHeader->data()[5] & 0x1000) >> 12;
101  //std::cout << " ZSE Bit: " << zseEnable << std::endl; /// to_rm
102  int sizeInWord_ZSE = 0;
103 
104  //alctZSErecovered = new unsigned short [theAnodeData->sizeInWords()];
105 
106  if (zseEnable) {
109  int nWGs_per_layer = ((theALCTHeader->data()[6] & 0x0007) + 1) * 16;
111  int nWG_round_up = int(nWGs_per_layer / 12) + (nWGs_per_layer % 3 ? 1 : 0);
112  //std::cout << " Words per layer: " << nWG_round_up << std::endl; ///to_rm
113  const uint16_t* posZSE = pos;
114  std::vector<unsigned short> alctZSErecoveredVector;
115  alctZSErecoveredVector.clear();
116 
117  //alctZSErecovered = new unsigned short [theAnodeData->sizeInWords()];
118  //delete [] alctZSErecovered;
119  //std::cout << " ALCT Buffer with ZSE: " << std::endl; ///to_rm
123  //unsigned short * posZSEdebug = pos; ///to_rm
124 
126  /*
127  while (*posZSEdebug != 0xDE0D){
128  unsigned short d = *posZSEdebug;
129  unsigned short c = *(posZSEdebug+1);
130  unsigned short b = *(posZSEdebug+2);
131  unsigned short a = *(posZSEdebug+3);
132  posZSEdebug+=4;
133  std::cout << std::hex << a << " " << b << " " << c << " " << d << std::dec << std::endl;
134  }
135  */
137 
139  int alctZSErecoveredPos = 0;
140  while (*posZSE != 0xDE0D) {
141  if ((*posZSE == 0x1000) && (*posZSE != 0x3000)) {
142  for (int j = 0; j < nWG_round_up; j++) {
143  alctZSErecoveredVector.push_back(0x0000);
144  }
145  alctZSErecoveredPos += nWG_round_up;
146  } else {
147  alctZSErecoveredVector.push_back(*posZSE);
148  ++alctZSErecoveredPos;
149  }
150  posZSE++;
151  sizeInWord_ZSE++;
152  }
153 
154  alctZSErecovered = new unsigned short[alctZSErecoveredVector.size()];
155 
157  for (int l = 0; l < (int)alctZSErecoveredVector.size(); l++) {
158  alctZSErecovered[l] = alctZSErecoveredVector[l];
159  }
160 
161  unsigned short* posRecovered = alctZSErecovered;
162  theAnodeData = new CSCAnodeData(*theALCTHeader, posRecovered);
163 
166  /*
167  std::cout << " The ALCT payload recovered: " << std::endl;
168  for(int k=0; k<theAnodeData->sizeInWords(); k+=4){
169  std::cout << std::hex << alctZSErecovered[k+3] << " "
170  << alctZSErecovered[k+2] << " "
171  << alctZSErecovered[k+1] << " "
172  << alctZSErecovered[k] << std::dec << std::endl;
173  }
174  */
175  //delete [] alctZSErecovered;
176  //std::cout << " ALCT SizeZSE : " << sizeInWord_ZSE << std::endl; ///to_rm
177  //std::cout << " ALCT SizeZSE Recovered: " << alctZSErecoveredPos << std::endl; ///to_rm
178  //std::cout << " ALCT Size Expected: " << theAnodeData->sizeInWords() << std::endl; ///to_rm
179  pos += sizeInWord_ZSE;
180  } else {
181  //pos +=sizeInWord_ZSE;
183  pos += theAnodeData->sizeInWords(); // size of the data is determined during unpacking
184  }
185  //std::cout << " ****The ALCT information from CSCEventData.cc (end)**** " << std::endl; ///to_rm
188  }
189  } else {
190  LogTrace("CSCEventData|CSCRawToDigi") << "Error:nalct reported but no ALCT data found!!!";
191  }
192  }
193 
194  if (nclct() == 1) {
195  if (isTMB(pos)) {
196  //dataPresent|=0x20;
197  theTMBData = new CSCTMBData(pos); //fill all TMB data
198  pos += theTMBData->size();
199  } else {
200  LogTrace("CSCEventData|CSCRawToDigi") << "Error:nclct reported but no TMB data found!!!";
201  }
202  }
203 
204  //now let's try to find and unpack the DMBTrailer
205  bool dmbTrailerReached = false;
206  for (int i = 0; i < 12000; ++i) //8000 max for cfeb + 1980ALCT + 287 TMB
207  {
208  dmbTrailerReached = (*(i + pos) & 0xF000) == 0xF000 && (*(i + pos + 1) & 0xF000) == 0xF000 &&
209  (*(i + pos + 2) & 0xF000) == 0xF000 && (*(i + pos + 3) & 0xF000) == 0xF000 &&
210  (*(i + pos + 4) & 0xF000) == 0xE000 && (*(i + pos + 5) & 0xF000) == 0xE000 &&
211  (*(i + pos + 6) & 0xF000) == 0xE000 && (*(i + pos + 7) & 0xF000) == 0xE000;
212  if (dmbTrailerReached) {
213  // theDMBTrailer = *( (CSCDMBTrailer *) (pos+i) );
215  break;
216  }
217  }
218  if (dmbTrailerReached) {
219  for (int icfeb = 0; icfeb < MAX_CFEB; ++icfeb) {
220  theCFEBData[icfeb] = nullptr;
221  int cfeb_available = theDMBHeader.cfebAvailable(icfeb);
222  unsigned int cfebTimeout = theDMBTrailer.cfeb_starttimeout() | theDMBTrailer.cfeb_endtimeout();
223  //cfeb_available cannot be trusted - need additional verification!
224  if (cfeb_available == 1) {
225  if ((cfebTimeout >> icfeb) & 1) {
226  if (debug)
227  LogTrace("CSCEventData|CSCRawToDigi") << "CFEB Timed out! ";
228  } else {
229  //dataPresent|=(0x1>>icfeb);
230  // Fill CFEB data and convert it into cathode digis
231 
232  // Check if we have here DCFEB using DMB format version field (new ME11 with DCFEBs - 0x2, other chamber types 0x1)
233  bool isDCFEB = false;
234  if (theDMBHeader.format_version() == 2)
235  isDCFEB = true;
236 
237  theCFEBData[icfeb] = new CSCCFEBData(icfeb, pos, theFormatVersion, isDCFEB);
238  pos += theCFEBData[icfeb]->sizeInWords();
239  }
240  }
241  }
243  size_ = pos - buf;
244  } else {
245  LogTrace("CSCEventData|CSCRawToDigi") << "Critical Error: DMB Trailer was not found!!! ";
246  }
247 
248  // std::cout << "CSC format: " << theFormatVersion << " " << getFormatVersion() << std::endl;
249 }
250 
251 bool CSCEventData::isALCT(const short unsigned int* buf) {
252  return (((buf[0] & 0xFFFF) == 0xDB0A) || (((buf[0] & 0xF800) == 0x6000) && ((buf[1] & 0xF800) == 0)));
253 }
254 
255 bool CSCEventData::isTMB(const short unsigned int* buf) { return ((buf[0] & 0xFFF) == 0xB0C); }
256 
258 
260 
262  // check for self-assignment before destructing
263  if (&data != this)
264  destroy();
265  copy(data);
266  return *this;
267 }
268 
270  //dataPresent = 0;
271  theALCTHeader = nullptr;
272  theAnodeData = nullptr;
273  theALCTTrailer = nullptr;
274  theTMBData = nullptr;
275  for (int icfeb = 0; icfeb < MAX_CFEB; ++icfeb) {
276  theCFEBData[icfeb] = nullptr;
277  }
278  alctZSErecovered = nullptr;
279  zseEnable = 0;
280 }
281 
283  init();
284  theFormatVersion = data.theFormatVersion;
285  theDMBHeader = data.theDMBHeader;
286  theDMBTrailer = data.theDMBTrailer;
287  if (data.theALCTHeader != nullptr)
288  theALCTHeader = new CSCALCTHeader(*(data.theALCTHeader));
289  if (data.theAnodeData != nullptr)
290  theAnodeData = new CSCAnodeData(*(data.theAnodeData));
291  if (data.theALCTTrailer != nullptr)
292  theALCTTrailer = new CSCALCTTrailer(*(data.theALCTTrailer));
293  if (data.theTMBData != nullptr)
294  theTMBData = new CSCTMBData(*(data.theTMBData));
295  for (int icfeb = 0; icfeb < MAX_CFEB; ++icfeb) {
296  theCFEBData[icfeb] = nullptr;
297  if (data.theCFEBData[icfeb] != nullptr)
298  theCFEBData[icfeb] = new CSCCFEBData(*(data.theCFEBData[icfeb]));
299  }
300  size_ = data.size_;
301  theChamberType = data.theChamberType;
302 }
303 
305  if (zseEnable) {
306  delete[] alctZSErecovered;
307  }
308  delete theALCTHeader;
309  delete theAnodeData;
310  delete theALCTTrailer;
311  delete theTMBData;
312  for (int icfeb = 0; icfeb < MAX_CFEB; ++icfeb) {
313  delete theCFEBData[icfeb];
314  }
315  /*
316  std::cout << "Before delete alctZSErecovered " << std::endl;
317  delete [] alctZSErecovered;
318  std::cout << "After delete alctZSErecovered " << std::endl;
319  */
320 }
321 
322 std::vector<CSCStripDigi> CSCEventData::stripDigis(const CSCDetId& idlayer) const {
323  std::vector<CSCStripDigi> result;
324  for (unsigned icfeb = 0; icfeb < MAX_CFEB; ++icfeb) {
325  std::vector<CSCStripDigi> newDigis = stripDigis(idlayer, icfeb);
326  result.insert(result.end(), newDigis.begin(), newDigis.end());
327  }
328  return result;
329 }
330 
331 std::vector<CSCStripDigi> CSCEventData::stripDigis(unsigned idlayer, unsigned icfeb) const {
332  // assert(ilayer > 0 && ilayer <= 6); // off because now idlayer is raw cscdetid
333  std::vector<CSCStripDigi> result;
334  if (theCFEBData[icfeb] != nullptr) {
335  std::vector<CSCStripDigi> newDigis = theCFEBData[icfeb]->digis(idlayer);
336  result.insert(result.end(), newDigis.begin(), newDigis.end());
337  }
338 
339  return result;
340 }
341 
342 std::vector<CSCWireDigi> CSCEventData::wireDigis(unsigned ilayer) const {
343  if (theAnodeData == nullptr) {
344  return std::vector<CSCWireDigi>();
345  } else {
346  return theAnodeData->wireDigis(ilayer);
347  }
348 }
349 
350 std::vector<std::vector<CSCStripDigi> > CSCEventData::stripDigis() const {
351  std::vector<std::vector<CSCStripDigi> > result;
352  for (int layer = 1; layer <= 6; ++layer) {
353  std::vector<CSCStripDigi> digis = stripDigis(layer);
354  result.push_back(digis);
355  }
356  return result;
357 }
358 
359 std::vector<std::vector<CSCWireDigi> > CSCEventData::wireDigis() const {
360  std::vector<std::vector<CSCWireDigi> > result;
361  for (int layer = 1; layer <= 6; ++layer) {
362  result.push_back(wireDigis(layer));
363  }
364  return result;
365 }
366 
367 const CSCCFEBData* CSCEventData::cfebData(unsigned icfeb) const { return theCFEBData[icfeb]; }
368 
370  if (nalct() == 0)
371  throw cms::Exception("No ALCT for this chamber");
372  return theALCTHeader;
373 }
374 
376  if (nalct() == 0)
377  throw cms::Exception("No ALCT for this chamber");
378  return theALCTTrailer;
379 }
380 
382  if (nalct() == 0)
383  throw cms::Exception("No ALCT for this chamber");
384  return theAnodeData;
385 }
386 
388  if (nclct() == 0)
389  throw cms::Exception("No CLCT for this chamber");
390  return theTMBData;
391 }
392 
394  if ((nclct() == 0) || (tmbData() == nullptr))
395  throw cms::Exception("No CLCT header for this chamber");
396  return tmbData()->tmbHeader();
397 }
398 
400  if ((nclct() == 0) || (tmbData() == nullptr))
401  throw cms::Exception("No CLCT data for this chamber");
402  return tmbData()->clctData();
403 }
404 
405 void CSCEventData::setEventInformation(int bxnum, int lvl1num) {
406  theDMBHeader.setBXN(bxnum);
407  theDMBHeader.setL1A(lvl1num);
408  theDMBHeader.setL1A24(lvl1num);
409  if (theALCTHeader) {
411  }
412  if (theTMBData) {
414 
415  assert(theChamberType > 0);
416 
418 
419  // Set number of CFEBs to 7 for Post-LS1 ME11
420  if ((theFormatVersion == 2013) && ((theChamberType == 1) || (theChamberType == 2))) {
422  }
423  /*
424  // Set number of CFEBs to 4 for ME13 chambers
425  if (theChamberType == 4) {
426  theTMBData->tmbHeader()->setNCFEBs(4);
427  }
428 */
429  }
430  for (unsigned cfeb = 0; cfeb < 7; cfeb++) {
431  if (theCFEBData[cfeb])
432  theCFEBData[cfeb]->setL1A(lvl1num);
433  }
434 }
435 
437  if (theAnodeData == nullptr) {
438  assert(theChamberType > 0);
444  // set data available flag
446  }
447 }
448 
450  int nCFEBs = 5;
451  if ((theFormatVersion == 2013) && ((theChamberType == 1) || (theChamberType == 2))) {
452  nCFEBs = 7;
453  }
454  if (theTMBData == nullptr) {
455  if (theFormatVersion == 2013) { // Set to TMB format for Post-LS1 data
456  theTMBData = new CSCTMBData(2013, 0x7a76, nCFEBs);
457  } else {
458  theTMBData = new CSCTMBData(2007, 0x50c3);
459  }
462  }
463  theTMBData->tmbHeader()->setNCFEBs(nCFEBs);
464  // std::cout << "nCFEBs: " << theTMBData->tmbHeader()->NCFEBs() << std::endl;
465 }
466 
467 void CSCEventData::add(const CSCStripDigi& digi, int layer) {
468  //@@ need special logic here for ME11
469  unsigned cfeb = (digi.getStrip() - 1) / 16;
470  bool sixteenSamples = false;
471  if (digi.getADCCounts().size() == 16)
472  sixteenSamples = true;
473  if (theCFEBData[cfeb] == nullptr) {
474  bool isDCFEB = false;
475  if (theDMBHeader.format_version() == 2)
476  isDCFEB = true;
477  theCFEBData[cfeb] = new CSCCFEBData(cfeb, sixteenSamples, theFormatVersion, isDCFEB);
478  theDMBHeader.addCFEB(cfeb);
479  }
480  theCFEBData[cfeb]->add(digi, layer);
481 }
482 
483 void CSCEventData::add(const CSCWireDigi& digi, int layer) {
485  theAnodeData->add(digi, layer);
488 }
489 
490 void CSCEventData::add(const CSCComparatorDigi& digi, int layer) {
491  checkTMBClasses();
492  theTMBData->clctData()->add(digi, layer);
493 }
494 
495 void CSCEventData::add(const CSCComparatorDigi& digi, const CSCDetId& cid) {
496  checkTMBClasses();
497  theTMBData->clctData()->add(digi, cid);
498 }
499 
500 void CSCEventData::add(const std::vector<CSCALCTDigi>& digis) {
502  theALCTHeader->add(digis);
503 }
504 
505 void CSCEventData::add(const std::vector<CSCCLCTDigi>& digis) {
506  checkTMBClasses();
507  theTMBData->tmbHeader()->add(digis);
508 }
509 
510 void CSCEventData::add(const std::vector<CSCCorrelatedLCTDigi>& digis) {
511  checkTMBClasses();
512  theTMBData->tmbHeader()->add(digis);
513 }
514 
515 std::ostream& operator<<(std::ostream& os, const CSCEventData& evt) {
516  for (int ilayer = 1; ilayer <= 6; ++ilayer) {
517  std::vector<CSCStripDigi> stripDigis = evt.stripDigis(ilayer);
518  //copy(stripDigis.begin(), stripDigis.end(), std::ostream_iterator<CSCStripDigi>(os, "\n"));
519  //print your scas here
520  std::vector<CSCWireDigi> wireDigis = evt.wireDigis(ilayer);
521  //copy(wireDigis.begin(), wireDigis.end(), std::ostream_iterator<CSCWireDigi>(os, "\n"));
522  }
523  return os;
524 }
525 
526 boost::dynamic_bitset<> CSCEventData::pack() {
527  boost::dynamic_bitset<> result =
529 
530  // Container for CRC calculations
531  std::vector<std::pair<unsigned int, unsigned short*> > crcvec;
532 
533  if (theALCTHeader != nullptr) {
534  boost::dynamic_bitset<> alctHeader = theALCTHeader->pack();
536  crcvec.push_back(std::make_pair(theALCTHeader->sizeInWords(), theALCTHeader->data()));
537  }
538  if (theAnodeData != nullptr) {
539  boost::dynamic_bitset<> anodeData =
541  result = bitset_utilities::append(result, anodeData);
542  crcvec.push_back(std::make_pair(theAnodeData->sizeInWords(), theAnodeData->data()));
543  }
544  if (theALCTTrailer != nullptr) {
545  unsigned int crc = calcALCTcrc(crcvec);
546  theALCTTrailer->setCRC(crc);
547  boost::dynamic_bitset<> alctTrailer =
550  }
551  if (theTMBData != nullptr) {
553  }
554 
555  for (int icfeb = 0; icfeb < MAX_CFEB; ++icfeb) {
556  if (theCFEBData[icfeb] != nullptr) {
557  boost::dynamic_bitset<> cfebData =
558  bitset_utilities::ushortToBitset(theCFEBData[icfeb]->sizeInWords() * 16, theCFEBData[icfeb]->data());
560  }
561  }
562 
563  boost::dynamic_bitset<> dmbTrailer =
566  return result;
567 }
568 
569 unsigned int CSCEventData::calcALCTcrc(std::vector<std::pair<unsigned int, unsigned short*> >& vec) {
570  int CRC = 0;
571  // int size=0;
572 
573  for (unsigned int n = 0; n < vec.size(); n++) {
574  // size += vec[n].first;
575  for (uint16_t j = 0, w = 0; j < vec[n].first; j++) {
576  if (vec[n].second != nullptr) {
577  w = vec[n].second[j] & 0xffff;
578  for (uint32_t i = 15, t = 0, ncrc = 0; i < 16; i--) {
579  t = ((w >> i) & 1) ^ ((CRC >> 21) & 1);
580  ncrc = (CRC << 1) & 0x3ffffc;
581  ncrc |= (t ^ (CRC & 1)) << 1;
582  ncrc |= t;
583  CRC = ncrc;
584  }
585  }
586  }
587  }
588 
589  // std::cout << "ALCT CRC vector size: " << size << ", crc: 0x" << std::hex << CRC<< std::endl;
590  return CRC;
591 }
592 
594  CSCEventData chamberData(5);
595  CSCDetId detId(1, 3, 2, 1, 3);
596  std::vector<CSCCLCTDigi> clctDigis;
597  // Both CLCTs are read-out at the same (pre-trigger) bx, so the last-but-one
598  // arguments in both digis must be the same.
599  clctDigis.push_back(CSCCLCTDigi(1, 1, 4, 1, 0, 30, 3, 2, 1)); // valid for 2007
600  clctDigis.push_back(CSCCLCTDigi(1, 1, 2, 1, 1, 31, 1, 2, 2));
601 
602  // BX of LCT (8th argument) is 1-bit word (the least-significant bit
603  // of ALCT's bx).
604  std::vector<CSCCorrelatedLCTDigi> corrDigis;
605  corrDigis.push_back(CSCCorrelatedLCTDigi(1, 1, 2, 10, 98, 5, 0, 1, 0, 0, 0, 0));
606  corrDigis.push_back(CSCCorrelatedLCTDigi(2, 1, 2, 20, 15, 9, 1, 0, 0, 0, 0, 0));
607 
608  chamberData.add(clctDigis);
609  chamberData.add(corrDigis);
610 
611  CSCWireDigi wireDigi(10, 6);
612  CSCComparatorDigi comparatorDigi(30, 1, 6);
613  chamberData.add(wireDigi, 3);
614  chamberData.add(comparatorDigi, 3);
615 
616  CSCEventData newData = cscPackAndUnpack(chamberData);
617 
618  std::vector<CSCCLCTDigi> clcts = newData.tmbHeader()->CLCTDigis(detId.rawId());
619  assert(cscPackerCompare(clcts[0], clctDigis[0]));
620  assert(cscPackerCompare(clcts[1], clctDigis[1]));
621 
622  std::vector<CSCCorrelatedLCTDigi> lcts = newData.tmbHeader()->CorrelatedLCTDigis(detId.rawId());
623  assert(cscPackerCompare(lcts[0], corrDigis[0]));
624  assert(cscPackerCompare(lcts[1], corrDigis[1]));
625 
626  // test strip digis
627  CSCDetId me1adet1(1, 1, 1, 4, 1);
628  CSCDetId me1bdet1(1, 1, 4, 4, 6);
629  CSCDetId me1adet2(2, 1, 1, 4, 2);
630  CSCDetId me1bdet2(2, 1, 4, 4, 5);
631 
632  std::vector<int> sca(16, 600);
633  std::vector<unsigned short> overflow(16, 0), overlap(16, 0), errorfl(16, 0);
634  CSCStripDigi me1a(5, sca, overflow, overlap, errorfl);
635  CSCStripDigi me1b(8, sca, overflow, overlap, errorfl);
636 
637  CSCEventData forward(1);
638  CSCEventData backward(1);
639 
640  forward.add(me1a, me1adet1.layer());
641  forward.add(me1b, me1bdet1.layer());
642  backward.add(me1a, me1adet2.layer());
643  backward.add(me1b, me1adet2.layer());
644  std::vector<CSCStripDigi> me1afs = forward.stripDigis(me1adet1);
645  std::vector<CSCStripDigi> me1bfs = forward.stripDigis(me1bdet1);
646  std::vector<CSCStripDigi> me1abs = backward.stripDigis(me1adet2);
647  std::vector<CSCStripDigi> me1bbs = backward.stripDigis(me1bdet2);
648  //FIXME The current code works under the assumption that ME11 and ME1A
649  // go into separate EventData. They need to be combined.
650  assert(me1afs.size() == 16);
651  assert(me1bfs.size() == 16);
652  assert(me1abs.size() == 16);
653  assert(me1bbs.size() == 16);
654 
655  assert(me1afs[4].getStrip() == 5);
656  assert(me1bfs[7].getStrip() == 8);
657  assert(me1abs[4].getStrip() == 5);
658  assert(me1bbs[7].getStrip() == 8);
659  assert(me1afs[4].pedestal() == 600);
660  assert(me1bfs[7].pedestal() == 600);
661  assert(me1abs[4].pedestal() == 600);
662  assert(me1bbs[7].pedestal() == 600);
663 }
CSCEventData::size
unsigned short size() const
size of the data buffer used, in bytes
Definition: CSCEventData.h:41
MAX_CFEB
#define MAX_CFEB
Maximum available CFEBs per chamber (for old system 5, for new ME11 should be 7)
Definition: CSCEventData.h:26
CSCALCTHeader::check
bool check() const
Definition: CSCALCTHeader.h:165
CSCEventData::destroy
void destroy()
Definition: CSCEventData.cc:304
CSCEventData::checkTMBClasses
void checkTMBClasses()
makes new TMB classes, if needed
Definition: CSCEventData.cc:449
CSCEventData::pack
boost::dynamic_bitset pack()
returns the packed event data.
Definition: CSCEventData.cc:526
CSCDMBHeader::setL1A
void setL1A(int l1a)
Definition: CSCDMBHeader.h:28
mps_fire.i
i
Definition: mps_fire.py:355
CSCALCTHeader::data
unsigned short int * data()
Definition: CSCALCTHeader.h:146
CSCEventData::theChamberType
int theChamberType
Definition: CSCEventData.h:167
CSCDMBTrailer::cfeb_endtimeout
unsigned cfeb_endtimeout() const
Definition: CSCDMBTrailer.h:33
CSCEventData
Definition: CSCEventData.h:28
CSCEventData::alctHeader
CSCALCTHeader * alctHeader() const
user must check if nalct > 0
Definition: CSCEventData.cc:369
MessageLogger.h
CSCEventData.h
CSCEventData::tmbData
CSCTMBData * tmbData() const
user must check in nclct > 0
Definition: CSCEventData.cc:387
dqmiodumpmetadata.n
n
Definition: dqmiodumpmetadata.py:28
CSCEventData::cfebData
const CSCCFEBData * cfebData(unsigned icfeb) const
unpacked in long mode: has overflow and error bits decoded
Definition: CSCEventData.cc:367
CSCTMBHeader::CorrelatedLCTDigis
std::vector< CSCCorrelatedLCTDigi > CorrelatedLCTDigis(uint32_t idlayer) const
returns CorrelatedLCT digis
Definition: CSCTMBHeader.h:70
CSCCFEBData::sizeInWords
unsigned sizeInWords() const
Definition: CSCCFEBData.h:46
CSCTMBData::size
const unsigned short size() const
Definition: CSCTMBData.h:37
CSCDMBTrailer
Definition: CSCDMBTrailer.h:16
CSCDMBHeader::addCFEB
void addCFEB(int icfeb)
Definition: CSCDMBHeader.h:23
CSCDMBHeader::addNALCT
void addNALCT()
Definition: CSCDMBHeader.h:26
CSCALCTHeader::sizeInWords
int sizeInWords()
in 16-bit words
Definition: CSCALCTHeader.h:149
CSCEventData::clctData
CSCCLCTData * clctData() const
user must check if nclct > 0
Definition: CSCEventData.cc:399
CSCStripDigi.h
CSCWireDigi::getWireGroup
int getWireGroup() const
default
Definition: CSCWireDigi.h:22
CSCEventData::stripDigis
std::vector< CSCStripDigi > stripDigis(const CSCDetId &idlayer) const
returns all the strip digis in the chamber, with the comparator information.
Definition: CSCEventData.cc:322
CSCDMBHeader::data
unsigned short * data()
Definition: CSCDMBHeader.h:53
CSCEventData::selfTest
static void selfTest()
Definition: CSCEventData.cc:593
CSCDMBHeader::cfebAvailable
bool cfebAvailable(unsigned icfeb)
Definition: CSCDMBHeader.h:21
pos
Definition: PixelAliasList.h:18
CSCEventData::tmbHeader
CSCTMBHeader * tmbHeader() const
user must check if nclct > 0
Definition: CSCEventData.cc:393
CSCCFEBData.h
CSCTMBHeader::setEventInformation
void setEventInformation(const CSCDMBHeader &dmbHeader)
fills fields like bxn and l1a
Definition: CSCTMBHeader.h:32
CSCEventData::theDMBHeader
CSCDMBHeader theDMBHeader
Definition: CSCEventData.h:149
CSCStripDigi::getStrip
int getStrip() const
Definition: CSCStripDigi.h:41
cms::cuda::assert
assert(be >=bs)
CSCALCTHeader::add
void add(const std::vector< CSCALCTDigi > &digis)
Definition: CSCALCTHeader.cc:189
CSCCFEBData
Definition: CSCCFEBData.h:13
edm::second
U second(std::pair< T, U > const &p)
Definition: ParameterSet.cc:215
CSCEventData::isALCT
bool isALCT(const uint16_t *buf)
if dealing with ALCT data
Definition: CSCEventData.cc:251
CSCEventData::calcALCTcrc
unsigned int calcALCTcrc(std::vector< std::pair< unsigned int, unsigned short * > > &vec)
Definition: CSCEventData.cc:569
CSCEventData::unpack_data
void unpack_data(const uint16_t *buf)
Definition: CSCEventData.cc:38
CSCEventData::alctZSErecovered
unsigned short * alctZSErecovered
Auxiliary bufer to recove the ALCT raw payload from zero suppression.
Definition: CSCEventData.h:170
CSCTMBHeader::CLCTDigis
std::vector< CSCCLCTDigi > CLCTDigis(uint32_t idlayer)
returns CLCT digis
Definition: CSCTMBHeader.h:67
CSCEventData::theALCTHeader
CSCALCTHeader * theALCTHeader
Definition: CSCEventData.h:154
CSCDMBHeader::sizeInWords
unsigned sizeInWords() const
Definition: CSCDMBHeader.h:48
CSCALCTTrailer
Definition: CSCALCTTrailer.h:53
CSCTMBData::tmbHeader
CSCTMBHeader * tmbHeader()
Definition: CSCTMBData.h:39
cscPackerCompare.h
CSCCFEBData::add
void add(const CSCStripDigi &, int layer)
Definition: CSCCFEBData.cc:82
CSCEventData::size_
int size_
Definition: CSCEventData.h:164
bitset_utilities::append
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
Definition: bitset_append.cc:10
CSCDMBHeader::setL1A24
void setL1A24(int l1a)
Definition: CSCDMBHeader.h:29
CSCTMBData::clctData
CSCCLCTData * clctData()
Definition: CSCTMBData.h:40
CSCCLCTDigi
Definition: CSCCLCTDigi.h:17
CSCEventData::init
void init()
Definition: CSCEventData.cc:269
CSCTMBData::pack
boost::dynamic_bitset pack()
not const because it sets size int TMBTrailer
Definition: CSCTMBData.cc:394
CSCALCTTrailer::sizeInWords
static int sizeInWords()
in 16-bit frames
Definition: CSCALCTTrailer.h:83
CSCALCTHeader
Definition: CSCALCTHeader.h:21
CSCAnodeData::wireDigis
std::vector< CSCWireDigi > wireDigis(int layer) const
input layer is from 1 to 6
Definition: CSCAnodeData.h:22
CSCCFEBData::setL1A
void setL1A(unsigned l1a)
Definition: CSCCFEBData.cc:159
CSCWireDigi::getWireGroupBX
int getWireGroupBX() const
return BX assigned for the wire group (16 upper bits from the wire group number)
Definition: CSCWireDigi.h:24
CSCEventData::dmbTrailer
const CSCDMBTrailer * dmbTrailer() const
DMB trailer.
Definition: CSCEventData.h:97
CSCALCTTrailer::data
unsigned short * data()
Definition: CSCALCTTrailer.h:62
CSCDMBHeader::check
bool check() const
Definition: CSCDMBHeader.h:51
cscPackerCompare
bool cscPackerCompare(const T &t1, const T &t2)
Definition: cscPackerCompare.h:9
CSCEventData::operator=
CSCEventData operator=(const CSCEventData &data)
Definition: CSCEventData.cc:261
w
const double w
Definition: UKUtility.cc:23
CSCEventData::alctData
CSCAnodeData * alctData() const
user must check if nalct > 0
Definition: CSCEventData.cc:381
CSCDetId::layer
int layer() const
Definition: CSCDetId.h:56
CSCAnodeData::sizeInWords
unsigned short int sizeInWords() const
the amount of the input binary buffer read, in 16-bit words
Definition: CSCAnodeData.h:19
CSCComparatorDigi
Definition: CSCComparatorDigi.h:16
CSCAnodeData::data
unsigned short * data()
Definition: CSCAnodeData.h:17
CSCEventData::CSCEventData
CSCEventData()
Definition: CSCEventData.h:33
OrderedSet.t
t
Definition: OrderedSet.py:90
cscPackAndUnpack
T cscPackAndUnpack(T &t)
Definition: cscPackerCompare.h:19
CSCDMBTrailer::cfeb_starttimeout
unsigned cfeb_starttimeout() const
Definition: CSCDMBTrailer.h:37
CSCDMBHeader::setBXN
void setBXN(int bxn)
Definition: CSCDMBHeader.h:27
CSCDMBTrailer::data
unsigned short * data()
Definition: CSCDMBTrailer.h:58
CSCEventData::alctTrailer
CSCALCTTrailer * alctTrailer() const
user must check if nalct > 0
Definition: CSCEventData.cc:375
CSCCLCTData::add
void add(const CSCComparatorDigi &digi, int layer)
TODO for packing. Doesn't do flipping yet.
Definition: CSCCLCTData.cc:191
CSCEventData::theTMBData
CSCTMBData * theTMBData
Definition: CSCEventData.h:157
CSCEventData::nalct
int nalct() const
the flag for existence of ALCT data
Definition: CSCEventData.h:69
CSCWireDigi
Definition: CSCWireDigi.h:14
CSCDetId
Definition: CSCDetId.h:26
createfilelist.int
int
Definition: createfilelist.py:10
CSCALCTHeader::setDAVForChannel
void setDAVForChannel(int wireGroup)
Definition: CSCALCTHeader.h:138
CSCEventData::add
void add(const CSCStripDigi &, int layer)
routines to add digis to the data
Definition: CSCEventData.cc:467
CSCEventData::nclct
int nclct() const
the number of CLCTs
Definition: CSCEventData.h:72
CSCStripDigi::getADCCounts
std::vector< int > const & getADCCounts() const
Get ADC readings.
Definition: CSCStripDigi.h:44
goodZToMuMu_cfi.overlap
overlap
Definition: goodZToMuMu_cfi.py:108
operator<<
std::ostream & operator<<(std::ostream &os, const CSCEventData &evt)
Definition: CSCEventData.cc:515
CSCTMBData
Definition: CSCTMBData.h:24
EcalCondDBWriter_cfi.pedestal
pedestal
Definition: EcalCondDBWriter_cfi.py:49
RawDataTask_cfi.CRC
CRC
Definition: RawDataTask_cfi.py:59
CSCALCTHeader::ALCTDigis
std::vector< CSCALCTDigi > ALCTDigis() const
Definition: CSCALCTHeader.cc:152
CSCDMBTrailer::sizeInWords
unsigned sizeInWords() const
Definition: CSCDMBTrailer.h:61
CSCEventData::debug
static std::atomic< bool > debug
Definition: CSCEventData.h:128
visDQMUpload.buf
buf
Definition: visDQMUpload.py:154
cmsLHEtoEOSManager.l
l
Definition: cmsLHEtoEOSManager.py:193
CSCEventData::wireDigis
std::vector< std::vector< CSCWireDigi > > wireDigis() const
deprecated. Use the above method instead.
Definition: CSCEventData.cc:359
CSCDMBHeader::addNCLCT
void addNCLCT()
Definition: CSCDMBHeader.h:24
CSCTMBHeader
Definition: CSCTMBHeader.h:25
CSCEventData::zseEnable
int zseEnable
Definition: CSCEventData.h:171
CSCDMBHeader
Definition: CSCDMBHeader.h:15
CSCEventData::wireDigis
std::vector< CSCWireDigi > wireDigis(unsigned ilayer) const
Definition: CSCEventData.cc:342
CSCStripDigi
Definition: CSCStripDigi.h:17
DetId::rawId
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
CSCDMBHeader::format_version
unsigned format_version() const
Definition: CSCDMBHeader.h:49
CSCEventData::theDMBTrailer
CSCDMBTrailer theDMBTrailer
Definition: CSCEventData.h:162
CSCALCTHeader::setBXNCount
void setBXNCount(unsigned int bxn)
Definition: CSCALCTHeader.h:78
bitset_utilities::ushortToBitset
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.
Definition: bitset_append.cc:23
CSCALCTHeader::setEventInformation
void setEventInformation(const CSCDMBHeader &)
Definition: CSCALCTHeader.cc:119
CSCEventData::theCFEBData
CSCCFEBData * theCFEBData[7]
for up to MAX_CFEB CFEB boards
Definition: CSCEventData.h:160
CSCAnodeData
Definition: CSCAnodeData.h:10
Exception
Definition: hltDiff.cc:246
CSCTMBHeader::setNCFEBs
void setNCFEBs(uint16_t ncfebs)
Definition: CSCTMBHeader.h:64
CSCALCTTrailer::setCRC
void setCRC(unsigned int crc)
Definition: CSCALCTTrailer.h:85
bitset_append.h
CSCEventData::theAnodeData
CSCAnodeData * theAnodeData
Definition: CSCEventData.h:155
Exception.h
CSCTMBHeader::add
void add(const std::vector< CSCCLCTDigi > &digis)
these methods need more brains to figure which one goes first
Definition: CSCTMBHeader.cc:114
CSCEventData::copy
void copy(const CSCEventData &)
Definition: CSCEventData.cc:282
CSCEventData::theALCTTrailer
CSCALCTTrailer * theALCTTrailer
Definition: CSCEventData.h:156
data
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
CSCALCTHeader::pack
boost::dynamic_bitset pack()
Definition: CSCALCTHeader.cc:221
CSCEventData::setEventInformation
void setEventInformation(int bxnum, int lvl1num)
Definition: CSCEventData.cc:405
CSCEventData::theFormatVersion
uint16_t theFormatVersion
Output Format Version (2005, 2013)
Definition: CSCEventData.h:174
mps_fire.result
result
Definition: mps_fire.py:303
LogTrace
#define LogTrace(id)
Definition: MessageLogger.h:671
CSCEventData::checkALCTClasses
void checkALCTClasses()
makes new ALCT classes, if needed
Definition: CSCEventData.cc:436
CSCCFEBData::digis
void digis(uint32_t idlayer, std::vector< CSCStripDigi > &result) const
faster way to get to digis
Definition: CSCCFEBData.cc:202
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
CSCEventData::stripDigis
std::vector< std::vector< CSCStripDigi > > stripDigis() const
deprecated. Use the above methods instead
Definition: CSCEventData.cc:350
CSCCLCTData
Definition: CSCCLCTData.h:24
CSCEventData::~CSCEventData
~CSCEventData()
Definition: CSCEventData.cc:259
CSCAnodeData::add
void add(const CSCWireDigi &wireDigi, int layer)
Definition: CSCAnodeData.h:25
CSCEventData::isTMB
bool isTMB(const uint16_t *buf)
if dealing with TMB data
Definition: CSCEventData.cc:255
CSCCorrelatedLCTDigi
Definition: CSCCorrelatedLCTDigi.h:19
CSCALCTHeader::alctFirmwareVersion
unsigned short int alctFirmwareVersion() const
Definition: CSCALCTHeader.h:137