CMS 3D CMS Logo

L1GlobaTriggerRawToDigi.cc
Go to the documentation of this file.
1 
16 // this class header
18 
19 // system include files
20 #include <iostream>
21 #include <iomanip>
22 #include <algorithm>
23 
24 // user include files
27 
32 
36 
40 
45 
48 
51 
56 
59 
62 
63 // constructor(s)
65 
66  // input tag for DAQ GT record
67  m_daqGtInputTag(pSet.getParameter<edm::InputTag> ("DaqGtInputTag")),
68 
69  // FED Id for GT DAQ record
70  // default value defined in DataFormats/FEDRawData/src/FEDNumbering.cc
71  // default value: assume the DAQ record is the last GT record
72  m_daqGtFedId(pSet.getUntrackedParameter<int> (
73  "DaqGtFedId", FEDNumbering::MAXTriggerGTPFEDID)),
74 
75  // mask for active boards
76  m_activeBoardsMaskGt(pSet.getParameter<unsigned int> ("ActiveBoardsMask")),
77 
78  // number of bunch crossing to be unpacked
79  m_unpackBxInEvent(pSet.getParameter<int> ("UnpackBxInEvent")),
80 
81  // create GTFE, FDL, PSB cards once per producer
82  // content will be reset whenever needed
83 
84  m_lowSkipBxInEvent(0), m_uppSkipBxInEvent(0),
85 
86  m_recordLength0(0), m_recordLength1(0),
87 
88  m_totalBxInEvent(0), m_verbosity(pSet.getUntrackedParameter<int> ("Verbosity", 0)),
89 
90  m_isDebugEnabled(edm::isDebugEnabled())
91 
92 {
93 
94  produces<L1GlobalTriggerReadoutRecord> ();
95  produces<L1MuGMTReadoutCollection> ();
96 
97  produces<std::vector<L1MuRegionalCand> > ("DT");
98  produces<std::vector<L1MuRegionalCand> > ("CSC");
99  produces<std::vector<L1MuRegionalCand> > ("RPCb");
100  produces<std::vector<L1MuRegionalCand> > ("RPCf");
101  produces<std::vector<L1MuGMTCand> > ();
102  consumes<FEDRawDataCollection>(m_daqGtInputTag);
103 
104  // create GTFE, FDL, PSB cards once per producer
105  // content will be reset whenever needed
106  m_gtfeWord = new L1GtfeWord();
107  m_gtFdlWord = new L1GtFdlWord();
108  m_gtPsbWord = new L1GtPsbWord();
109 
110  if (m_verbosity && m_isDebugEnabled) {
111 
112  LogDebug("L1GlobalTriggerRawToDigi")
113  << "\nInput tag for DAQ GT record: " << m_daqGtInputTag
114  << "\nFED Id for DAQ GT record: " << m_daqGtFedId
115  << "\nMask for active boards (hex format): " << std::hex
116  << std::setw(sizeof(m_activeBoardsMaskGt) * 2) << std::setfill('0')
118  << std::dec << std::setfill(' ')
119  << "\nNumber of bunch crossing to be unpacked: "
120  << m_unpackBxInEvent << "\n"
121  << std::endl;
122  }
123 
124  if ( ( m_unpackBxInEvent > 0 ) && ( ( m_unpackBxInEvent % 2 ) == 0 )) {
126 
127  if (m_verbosity) {
128  edm::LogInfo("L1GlobalTriggerRawToDigi")
129  << "\nWARNING: Number of bunch crossing to be unpacked rounded to: "
130  << m_unpackBxInEvent << "\n The number must be an odd number!\n"
131  << std::endl;
132  }
133  }
134 
135 }
136 
137 // destructor
139 
140  delete m_gtfeWord;
141  delete m_gtFdlWord;
142  delete m_gtPsbWord;
143 
144 }
145 
148  static const char* const kComm1=
149  "# input tag for GT readout collection: \n"
150  "# source = hardware record, \n"
151  "# l1GtPack = GT packer (DigiToRaw)";
152  desc.add<edm::InputTag>("DaqGtInputTag",edm::InputTag("l1GtPack"))->setComment(kComm1);
153  static const char* const kComm2=
154  "# FED Id for GT DAQ record \n"
155  "# default value defined in DataFormats/FEDRawData/src/FEDNumbering.cc";
156  desc.addUntracked<int>("DaqGtFedId",FEDNumbering::MAXTriggerGTPFEDID)->setComment(kComm2);
157  static const char* const kComm3=
158  "# mask for active boards (actually 16 bits) \n"
159  "# if bit is zero, the corresponding board will not be unpacked \n"
160  "# default: no board masked";
161  desc.add<unsigned int>("ActiveBoardsMask",0xFFFF)->setComment(kComm3);
162  static const char* const kComm4=
163  "# number of 'bunch crossing in the event' (bxInEvent) to be unpacked \n"
164  "# symmetric around L1Accept (bxInEvent = 0): \n"
165  "# 1 (bxInEvent = 0); 3 (F 0 1) (standard record); 5 (E F 0 1 2) (debug record) \n"
166  "# even numbers (except 0) 'rounded' to the nearest lower odd number \n"
167  "# negative value: unpack all available bxInEvent \n"
168  "# if more bxInEvent than available are required, unpack what exists and write a warning";
169  desc.add<int>("UnpackBxInEvent",-1)->setComment(kComm4);
170  desc.addUntracked<int>("Verbosity",0);
171  descriptions.add("l1GlobalTriggerRawToDigi",desc);
172 }
173 
174 
175 // member functions
176 
177 // method called to produce the data
179 
180  // get records from EventSetup
181 
182  // muon trigger scales
184  evSetup.get<L1MuTriggerScalesRcd> ().get(trigscales_h);
185  m_TriggerScales = trigscales_h.product();
186 
187  edm::ESHandle<L1MuTriggerPtScale> trigptscale_h;
188  evSetup.get<L1MuTriggerPtScaleRcd> ().get(trigptscale_h);
189  m_TriggerPtScale = trigptscale_h.product();
190 
191  // board maps
193  evSetup.get<L1GtBoardMapsRcd> ().get(l1GtBM);
194 
195  const std::vector<L1GtBoard> boardMaps = l1GtBM->gtBoardMaps();
196  int boardMapsSize = boardMaps.size();
197 
198  typedef std::vector<L1GtBoard>::const_iterator CItBoardMaps;
199 
200  // create an ordered vector for the GT DAQ record
201  // header (pos 0 in record) and trailer (last position in record)
202  // not included, as they are not in board list
203  std::vector<L1GtBoard> gtRecordMap;
204  gtRecordMap.reserve(boardMapsSize);
205 
206  for (int iPos = 0; iPos < boardMapsSize; ++iPos) {
207  for (CItBoardMaps itBoard = boardMaps.begin(); itBoard != boardMaps.end(); ++itBoard) {
208 
209  if (itBoard->gtPositionDaqRecord() == iPos) {
210  gtRecordMap.push_back(*itBoard);
211  break;
212  }
213 
214  }
215  }
216 
217  // raw collection
218 
220  iEvent.getByLabel(m_daqGtInputTag, fedHandle);
221 
222  if (!fedHandle.isValid()) {
223  if (m_verbosity) {
224  edm::LogWarning("L1GlobalTriggerRawToDigi")
225  << "\nWarning: FEDRawDataCollection with input tag " << m_daqGtInputTag
226  << "\nrequested in configuration, but not found in the event."
227  << "\nQuit unpacking this event" << std::endl;
228  }
229 
230  produceEmptyProducts(iEvent);
231 
232  return;
233  }
234 
235  // retrieve data for Global Trigger FED (GT + GMT)
236  const FEDRawData& raw = ( fedHandle.product() )->FEDData(m_daqGtFedId);
237 
238  int gtSize = raw.size();
239 
240  // get a const pointer to the beginning of the data buffer
241  const unsigned char* ptrGt = raw.data();
242 
243  // get a const pointer to the end of the data buffer
244  const unsigned char* endPtrGt = ptrGt + gtSize;
245 
246  //
247  if (m_verbosity && m_isDebugEnabled) {
248 
249  LogTrace("L1GlobalTriggerRawToDigi") << "\n Size of raw data: "
250  << gtSize << "\n" << std::endl;
251 
252  std::ostringstream myCoutStream;
253  dumpFedRawData(ptrGt, gtSize, myCoutStream);
254 
255  LogTrace("L1GlobalTriggerRawToDigi") << "\n Dump FEDRawData\n"
256  << myCoutStream.str() << "\n" << std::endl;
257 
258  }
259 
260  // unpack header (we have one header only)
261  int headerSize = 8;
262 
263  if ((ptrGt + headerSize) > endPtrGt) {
264  // a common error - no need to print an error anymore
265  produceEmptyProducts(iEvent);
266 
267  return;
268  }
269 
270 
271  FEDHeader cmsHeader(ptrGt);
272  FEDTrailer cmsTrailer(ptrGt + gtSize - headerSize);
273 
274  unpackHeader(ptrGt, cmsHeader);
275  ptrGt += headerSize; // advance with header size
276 
277  // unpack first GTFE to find the length of the record and the active boards
278  // here GTFE assumed immediately after the header
279 
280  // if pointer after GTFE payload is greater than pointer at
281  // the end of GT payload, produce empty products and quit unpacking
282  if ((ptrGt + m_gtfeWord->getSize()) > endPtrGt) {
283  edm::LogError("L1GlobalTriggerRawToDigi")
284  << "\nError: Pointer after GTFE greater than end pointer."
285  << "\n Put empty products in the event!"
286  << "\n Quit unpacking this event." << std::endl;
287 
288  produceEmptyProducts(iEvent);
289 
290  return;
291  }
292 
293  bool gtfeUnpacked = false;
294 
295  for (CItBoardMaps itBoard = boardMaps.begin(); itBoard != boardMaps.end(); ++itBoard) {
296 
297  if (itBoard->gtBoardType() == GTFE) {
298 
299  // unpack GTFE
300  if (itBoard->gtPositionDaqRecord() == 1) {
301 
302  m_gtfeWord->unpack(ptrGt);
303  ptrGt += m_gtfeWord->getSize(); // advance with GTFE block size
304  gtfeUnpacked = true;
305 
306  if (m_verbosity && m_isDebugEnabled) {
307 
308  std::ostringstream myCoutStream;
309  m_gtfeWord->print(myCoutStream);
310  LogTrace("L1GlobalTriggerRawToDigi") << myCoutStream.str() << "\n" << std::endl;
311  }
312 
313  // break the loop - GTFE was found
314  break;
315 
316  } else {
317 
318  if (m_verbosity) {
319  edm::LogWarning("L1GlobalTriggerRawToDigi")
320  << "\nWarning: GTFE block found in raw data does not follow header."
321  << "\nAssumed start position of the block is wrong!"
322  << "\nQuit unpacking this event" << std::endl;
323  }
324 
325  produceEmptyProducts(iEvent);
326 
327  return;
328  }
329 
330  }
331  }
332 
333  // quit if no GTFE found
334  if (!gtfeUnpacked) {
335 
336  if (m_verbosity) {
337  edm::LogWarning("L1GlobalTriggerRawToDigi")
338  << "\nWarning: no GTFE block found in raw data."
339  << "\nCan not find the record length (BxInEvent) and the active boards!"
340  << "\nQuit unpacking this event" << std::endl;
341  }
342 
343  produceEmptyProducts(iEvent);
344 
345  return;
346  }
347 
348  // life normal here, GTFE found
349 
350  // get list of active blocks
351  // blocks not active are not written to the record
352  cms_uint16_t activeBoardsGtInitial = m_gtfeWord->activeBoards();
353  cms_uint16_t altNrBxBoardInitial = m_gtfeWord->altNrBxBoard();
354 
355  // mask some boards, if needed
356  cms_uint16_t activeBoardsGt = activeBoardsGtInitial & m_activeBoardsMaskGt;
357  m_gtfeWord->setActiveBoards(activeBoardsGt);
358 
359  if (m_verbosity) {
360  LogDebug("L1GlobalTriggerRawToDigi") << "\nActive boards before masking: 0x" << std::hex
361  << std::setw(sizeof ( activeBoardsGtInitial ) * 2) << std::setfill('0')
362  << activeBoardsGtInitial << std::dec << std::setfill(' ')
363  << "\nActive boards after masking: 0x" << std::hex << std::setw(
364  sizeof ( activeBoardsGt ) * 2) << std::setfill('0') << activeBoardsGt << std::dec
365  << std::setfill(' ') << " \n" << std::endl;
366  }
367 
368  // loop over other blocks in the raw record, count them if they are active
369 
370  int numberGtfeBoards = 0;
371  int numberFdlBoards = 0;
372  int numberPsbBoards = 0;
373  int numberGmtBoards = 0;
374  int numberTcsBoards = 0;
375  int numberTimBoards = 0;
376 
377  for (CItBoardMaps itBoard = boardMaps.begin(); itBoard != boardMaps.end(); ++itBoard) {
378 
379  int iActiveBit = itBoard->gtBitDaqActiveBoards();
380  bool activeBoardToUnpack = false;
381 
382  if (iActiveBit >= 0) {
383  activeBoardToUnpack = activeBoardsGt & ( 1 << iActiveBit );
384  } else {
385  // board not in the ActiveBoards for the record
386  continue;
387  }
388 
389  if (activeBoardToUnpack) {
390 
391  switch (itBoard->gtBoardType()) {
392  case GTFE: {
393  numberGtfeBoards++;
394  }
395 
396  break;
397  case FDL: {
398  numberFdlBoards++;
399  }
400 
401  break;
402  case PSB: {
403  numberPsbBoards++;
404  }
405 
406  break;
407  case GMT: {
408  numberGmtBoards++;
409  }
410 
411  break;
412  case TCS: {
413  numberTcsBoards++;
414  }
415 
416  break;
417  case TIM: {
418  numberTimBoards++;
419  }
420 
421  break;
422  default: {
423  // do nothing, all blocks are given in GtBoardType enum
424  if (m_verbosity) {
425  LogDebug("L1GlobalTriggerRawToDigi") << "\nBoard of type "
426  << itBoard->gtBoardType() << " not expected in record.\n"
427  << std::endl;
428  }
429  }
430 
431  break;
432  }
433  }
434 
435  }
436 
437  // produce the L1GlobalTriggerReadoutRecord now, after we found the maximum number of
438  // BxInEvent the record has and how many boards are active (it is just reserving space
439  // for vectors)
440  //LogDebug("L1GlobalTriggerRawToDigi")
441  //<< "\nL1GlobalTriggerRawToDigi: producing L1GlobalTriggerReadoutRecord\n"
442  //<< "\nL1GlobalTriggerRawToDigi: producing L1MuGMTReadoutCollection;\n"
443  //<< std::endl;
444 
445  // get number of Bx in the event from GTFE block corresponding to alternative 0 and 1 in
448 
449  int maxBxInEvent = std::max(m_recordLength0, m_recordLength1);
450 
451 
452  std::unique_ptr<L1GlobalTriggerReadoutRecord> gtReadoutRecord(new L1GlobalTriggerReadoutRecord(
453  maxBxInEvent, numberFdlBoards, numberPsbBoards));
454 
455  // produce also the GMT readout collection and set the reference in GT record
456  std::unique_ptr<L1MuGMTReadoutCollection> gmtrc(new L1MuGMTReadoutCollection(maxBxInEvent));
457 
458  //edm::RefProd<L1MuGMTReadoutCollection> refProdMuGMT = iEvent.getRefBeforePut<
459  // L1MuGMTReadoutCollection> ();
460 
461  //if (m_verbosity) {
462  // LogDebug("L1GlobalTriggerRawToDigi")
463  // << "\nL1GlobalTriggerRawToDigi: set L1MuGMTReadoutCollection RefProd"
464  // << " in L1GlobalTriggerReadoutRecord.\n" << std::endl;
465  //}
466  //gtReadoutRecord->setMuCollectionRefProd(refProdMuGMT);
467 
468 
469  // ... then unpack modules other than GTFE, if requested
470 
471  for (CItBoardMaps itBoard = gtRecordMap.begin(); itBoard != gtRecordMap.end(); ++itBoard) {
472 
473  int iActiveBit = itBoard->gtBitDaqActiveBoards();
474 
475  bool activeBoardToUnpack = false;
476  bool activeBoardInitial = false;
477 
478  int altNrBxBoardVal = -1;
479 
480  if (iActiveBit >= 0) {
481  activeBoardInitial = activeBoardsGtInitial & ( 1 << iActiveBit );
482  activeBoardToUnpack = activeBoardsGt & ( 1 << iActiveBit );
483 
484  altNrBxBoardVal = (altNrBxBoardInitial & ( 1 << iActiveBit )) >> iActiveBit;
485 
486  if (altNrBxBoardVal == 1) {
488  } else if (altNrBxBoardVal == 0) {
490  } else {
491  if (m_verbosity) {
492  edm::LogWarning("L1GlobalTriggerRawToDigi")
493  << "\n\nWARNING: Wrong value altNrBxBoardVal = " << altNrBxBoardVal
494  << " for board " << std::hex << ( itBoard->gtBoardId() ) << std::dec
495  << "\n iActiveBit = " << iActiveBit
496  << "\n altNrBxBoardInitial = 0x" << std::hex << altNrBxBoardInitial << std::dec
497  << "\n activeBoardsGt = 0x" << std::hex << activeBoardsGt << std::dec
498  << "\n activeBoardInitial = " << activeBoardInitial
499  << "\n activeBoardToUnpack = " << activeBoardToUnpack
500  << "\n Set altNrBxBoardVal tentatively to "
501  << m_recordLength0 << "\n Job may crash or produce wrong results!\n\n"
502  << std::endl;
503  }
504 
506  }
507 
508  // number of BX required to be unpacked
509 
511  if (m_verbosity) {
512  LogDebug("L1GlobalTriggerRawToDigi")
513  << "\nWARNING: Number of available bunch crosses for board"
514  << ( itBoard->gtBoardId() ) << " in the record ( " << m_totalBxInEvent
515  << " ) \n is smaller than the number of bunch crosses requested to be unpacked ("
516  << m_unpackBxInEvent << " )!!! \n Unpacking only "
517  << m_totalBxInEvent << " bunch crosses.\n" << std::endl;
518  }
519 
520  m_lowSkipBxInEvent = 0;
522 
523  } else if (m_unpackBxInEvent < 0) {
524 
525  m_lowSkipBxInEvent = 0;
527 
528  if (m_verbosity) {
529  LogDebug("L1GlobalTriggerRawToDigi") << "\nUnpacking all " << m_totalBxInEvent
530  << " bunch crosses available." << "\n" << std::endl;
531  }
532 
533 
534  } else if (m_unpackBxInEvent == 0) {
535 
538 
539  if (m_verbosity) {
540  LogDebug("L1GlobalTriggerRawToDigi")
541  << "\nNo bxInEvent required to be unpacked from " << m_totalBxInEvent
542  << " bunch crosses available." << "\n" << std::endl;
543  }
544 
545  // change RecordLength
546  // cast int to cms_uint16_t (there are normally 3 or 5 BxInEvent)
547  m_gtfeWord->setRecordLength(static_cast<cms_uint16_t> (m_unpackBxInEvent));
548  m_gtfeWord->setRecordLength1(static_cast<cms_uint16_t> (m_unpackBxInEvent));
549 
550  } else {
551 
554 
555  if (m_verbosity) {
556  LogDebug("L1GlobalTriggerRawToDigi") << "\nUnpacking " << m_unpackBxInEvent
557  << " bunch crosses from " << m_totalBxInEvent
558  << " bunch crosses available." << "\n" << std::endl;
559  }
560 
561  // change RecordLength
562  // cast int to cms_uint16_t (there are normally 3 or 5 BxInEvent)
563  m_gtfeWord->setRecordLength(static_cast<cms_uint16_t> (m_unpackBxInEvent));
564  m_gtfeWord->setRecordLength1(static_cast<cms_uint16_t> (m_unpackBxInEvent));
565 
566  }
567 
568  } else {
569  // board not in the ActiveBoards for the record
570  continue;
571  }
572 
573  if (!activeBoardInitial) {
574  if (m_verbosity) {
575  LogDebug("L1GlobalTriggerRawToDigi") << "\nBoard of type "
576  << itBoard->gtBoardName() << " with index " << itBoard->gtBoardIndex()
577  << " not active initially in raw data.\n" << std::endl;
578  }
579  continue;
580  }
581 
582  // active board initially, could unpack it
583  switch (itBoard->gtBoardType()) {
584 
585  case FDL: {
586  for (int iFdl = 0; iFdl < m_totalBxInEvent; ++iFdl) {
587 
588  // if pointer after FDL payload is greater than pointer at
589  // the end of GT payload, produce empty products and quit unpacking
590  if ((ptrGt + m_gtFdlWord->getSize()) > endPtrGt) {
591  edm::LogError("L1GlobalTriggerRawToDigi")
592  << "\nError: Pointer after FDL " << iFdl
593  << " greater than end pointer."
594  << "\n Put empty products in the event!"
595  << "\n Quit unpacking this event." << std::endl;
596 
597  produceEmptyProducts(iEvent);
598 
599  return;
600  }
601 
602  // unpack only if requested, otherwise skip it
603  if (activeBoardToUnpack) {
604 
605  // unpack only bxInEvent requested, otherwise skip it
606  if ( ( iFdl >= m_lowSkipBxInEvent ) && ( iFdl < m_uppSkipBxInEvent )) {
607 
608  m_gtFdlWord->unpack(ptrGt);
609 
610  // add 1 to the GT luminosity number to use the same convention as
611  // offline, where LS number starts with 1;
612  // in GT hardware, LS starts with 0
613  cms_uint16_t lsNr = m_gtFdlWord->lumiSegmentNr() + 1;
615 
616  // add FDL block to GT readout record
617  gtReadoutRecord->setGtFdlWord(*m_gtFdlWord);
618 
619  if (m_verbosity && m_isDebugEnabled) {
620 
621  std::ostringstream myCoutStream;
622  m_gtFdlWord->print(myCoutStream);
623  LogTrace("L1GlobalTriggerRawToDigi") << myCoutStream.str() << "\n"
624  << std::endl;
625  }
626 
627  // ... and reset it
628  m_gtFdlWord->reset();
629  }
630 
631  }
632 
633  ptrGt += m_gtFdlWord->getSize(); // advance with FDL block size
634 
635  }
636  }
637 
638  break;
639  case PSB: {
640  for (int iPsb = 0; iPsb < m_totalBxInEvent; ++iPsb) {
641 
642  // if pointer after PSB payload is greater than pointer at
643  // the end of GT payload, produce empty products and quit unpacking
644  if ((ptrGt + m_gtPsbWord->getSize()) > endPtrGt) {
645  edm::LogError("L1GlobalTriggerRawToDigi")
646  << "\nError: Pointer after PSB " << iPsb
647  << " greater than end pointer."
648  << "\n Put empty products in the event!"
649  << "\n Quit unpacking this event." << std::endl;
650 
651  produceEmptyProducts(iEvent);
652 
653  return;
654  }
655 
656  // unpack only if requested, otherwise skip it
657  if (activeBoardToUnpack) {
658 
659  // unpack only bxInEvent requested, otherwise skip it
660  if ( ( iPsb >= m_lowSkipBxInEvent ) && ( iPsb < m_uppSkipBxInEvent )) {
661 
662  unpackPSB(evSetup, ptrGt, *m_gtPsbWord);
663 
664  // add PSB block to GT readout record
665  gtReadoutRecord->setGtPsbWord(*m_gtPsbWord);
666 
667  if (m_verbosity && m_isDebugEnabled) {
668 
669  std::ostringstream myCoutStream;
670  m_gtPsbWord->print(myCoutStream);
671  LogTrace("L1GlobalTriggerRawToDigi") << myCoutStream.str() << "\n"
672  << std::endl;
673  }
674 
675  // ... and reset it
676  m_gtPsbWord->reset();
677  }
678 
679  }
680 
681  ptrGt += m_gtPsbWord->getSize(); // advance with PSB block size
682 
683  }
684  }
685  break;
686  case GMT: {
687 
688  // 17*64/8 TODO FIXME ask Ivan for a getSize() function for GMT record
689  unsigned int gmtRecordSize = 136;
690  unsigned int gmtCollSize = m_totalBxInEvent * gmtRecordSize;
691 
692  // if pointer after GMT payload is greater than pointer at
693  // the end of GT payload, produce empty products and quit unpacking
694  if ((ptrGt + gmtCollSize) > endPtrGt) {
695  edm::LogError("L1GlobalTriggerRawToDigi")
696  << "\nError: Pointer after GMT "
697  << " greater than end pointer."
698  << "\n Put empty products in the event!"
699  << "\n Quit unpacking this event." << std::endl;
700 
701  produceEmptyProducts(iEvent);
702 
703  return;
704  }
705 
706  // unpack only if requested, otherwise skip it
707  if (activeBoardToUnpack) {
708  unpackGMT(ptrGt, gmtrc, iEvent);
709  }
710 
711 
712  ptrGt += gmtCollSize; // advance with GMT block size
713  }
714  break;
715  default: {
716  // do nothing, all blocks are given in GtBoardType enum
717  if (m_verbosity) {
718 
719  LogDebug("L1GlobalTriggerRawToDigi") << "\nBoard of type "
720  << itBoard->gtBoardType() << " not expected in record.\n" << std::endl;
721  }
722  }
723  break;
724 
725  }
726 
727  }
728 
729  // add GTFE block to GT readout record, after updating active boards and record length
730 
731  gtReadoutRecord->setGtfeWord(*m_gtfeWord);
732 
733  // ... and reset it
734  m_gtfeWord->reset();
735 
736 
737 
738  // unpack trailer
739 
740  int trailerSize = 8;
741 
742  // if pointer after trailer is greater than pointer at
743  // the end of GT payload, produce empty products and quit unpacking
744  if ((ptrGt + trailerSize) > endPtrGt) {
745  edm::LogError("L1GlobalTriggerRawToDigi")
746  << "\nError: Pointer after trailer "
747  << " greater than end pointer."
748  << "\n Put empty products in the event!"
749  << "\n Quit unpacking this event." << std::endl;
750 
751  produceEmptyProducts(iEvent);
752 
753  return;
754  }
755 
756  unpackTrailer(ptrGt, cmsTrailer);
757 
758  //
759  if (m_verbosity && m_isDebugEnabled) {
760  std::ostringstream myCoutStream;
761  gtReadoutRecord->print(myCoutStream);
762  LogTrace("L1GlobalTriggerRawToDigi")
763  << "\n The following L1 GT DAQ readout record was unpacked.\n"
764  << myCoutStream.str() << "\n" << std::endl;
765  }
766 
767  // put records into event
768 
769  iEvent.put(std::move(gmtrc));
770  iEvent.put(std::move(gtReadoutRecord));
771 
772 }
773 
774 // unpack header
775 void L1GlobalTriggerRawToDigi::unpackHeader(const unsigned char* gtPtr, FEDHeader& cmsHeader) {
776 
777  // TODO if needed in another format
778 
779  // print the header info
780  if (m_verbosity && m_isDebugEnabled) {
781 
782  const cms_uint64_t* payload =
783  reinterpret_cast<cms_uint64_t*> (const_cast<unsigned char*> (gtPtr));
784 
785  std::ostringstream myCoutStream;
786 
787  // one word only
788  int iWord = 0;
789 
790  myCoutStream << std::setw(4) << iWord << " " << std::hex << std::setfill('0')
791  << std::setw(16) << payload[iWord] << std::dec << std::setfill(' ') << "\n"
792  << std::endl;
793 
794  myCoutStream << " Event_type: " << std::hex << " hex: " << " " << std::setw(1)
795  << std::setfill('0') << cmsHeader.triggerType() << std::setfill(' ') << std::dec
796  << " dec: " << cmsHeader.triggerType() << std::endl;
797 
798  myCoutStream << " LVL1_Id: " << std::hex << " hex: " << "" << std::setw(6)
799  << std::setfill('0') << cmsHeader.lvl1ID() << std::setfill(' ') << std::dec
800  << " dec: " << cmsHeader.lvl1ID() << std::endl;
801 
802  myCoutStream << " BX_Id: " << std::hex << " hex: " << " " << std::setw(3)
803  << std::setfill('0') << cmsHeader.bxID() << std::setfill(' ') << std::dec
804  << " dec: " << cmsHeader.bxID() << std::endl;
805 
806  myCoutStream << " Source_Id: " << std::hex << " hex: " << " " << std::setw(3)
807  << std::setfill('0') << cmsHeader.sourceID() << std::setfill(' ') << std::dec
808  << " dec: " << cmsHeader.sourceID() << std::endl;
809 
810  myCoutStream << " FOV: " << std::hex << " hex: " << " " << std::setw(1)
811  << std::setfill('0') << cmsHeader.version() << std::setfill(' ') << std::dec
812  << " dec: " << cmsHeader.version() << std::endl;
813 
814  myCoutStream << " H: " << std::hex << " hex: " << " " << std::setw(1)
815  << std::setfill('0') << cmsHeader.moreHeaders() << std::setfill(' ') << std::dec
816  << " dec: " << cmsHeader.moreHeaders() << std::endl;
817 
818  LogDebug("L1GlobalTriggerRawToDigi") << "\n CMS Header \n" << myCoutStream.str() << "\n"
819  << std::endl;
820 
821  }
822 
823 }
824 
825 // unpack PSB records
826 // psbPtr pointer to the beginning of the each PSB block obtained from gtPtr
828  const edm::EventSetup& evSetup, const unsigned char* psbPtr, L1GtPsbWord& psbWord) {
829 
830  //LogDebug("L1GlobalTriggerRawToDigi")
831  //<< "\nUnpacking PSB block.\n"
832  //<< std::endl;
833 
835 
836  int psbSize = psbWord.getSize();
837  int psbWords = psbSize / uLength;
838 
839  const cms_uint64_t* payload =
840  reinterpret_cast<cms_uint64_t*> (const_cast<unsigned char*> (psbPtr));
841 
842  for (int iWord = 0; iWord < psbWords; ++iWord) {
843 
844  // fill PSB
845  // the second argument must match the word index defined in L1GtPsbWord class
846 
847  psbWord.setBoardId(payload[iWord], iWord);
848  psbWord.setBxInEvent(payload[iWord], iWord);
849  psbWord.setBxNr(payload[iWord], iWord);
850  psbWord.setEventNr(payload[iWord], iWord);
851 
852  psbWord.setAData(payload[iWord], iWord);
853  psbWord.setBData(payload[iWord], iWord);
854 
855  psbWord.setLocalBxNr(payload[iWord], iWord);
856 
857  LogTrace("L1GlobalTriggerRawToDigi") << std::setw(4) << iWord << " " << std::hex
858  << std::setfill('0') << std::setw(16) << payload[iWord] << std::dec
859  << std::setfill(' ') << std::endl;
860 
861  }
862 
863 }
864 
865 // unpack the GMT record
866 void L1GlobalTriggerRawToDigi::unpackGMT(const unsigned char* chp, std::unique_ptr<
868 
869  //LogDebug("L1GlobalTriggerRawToDigi")
870  //<< "\nUnpacking GMT collection.\n"
871  //<< std::endl;
872 
873  // 17*64/2 TODO FIXME ask Ivan for a getSize() function for GMT record
874  const unsigned int gmtRecordSize32 = 34;
875 
876  std::unique_ptr<std::vector<L1MuRegionalCand> > DTCands(new std::vector<L1MuRegionalCand>);
877  std::unique_ptr<std::vector<L1MuRegionalCand> > CSCCands(new std::vector<L1MuRegionalCand>);
878  std::unique_ptr<std::vector<L1MuRegionalCand> > RPCbCands(new std::vector<L1MuRegionalCand>);
879  std::unique_ptr<std::vector<L1MuRegionalCand> > RPCfCands(new std::vector<L1MuRegionalCand>);
880  std::unique_ptr<std::vector<L1MuGMTCand> > GMTCands(new std::vector<L1MuGMTCand>);
881 
882  const unsigned* p = (const unsigned*) chp;
883 
884  // min Bx's in the event, computed after m_totalBxInEvent is obtained from GTFE block
885  // assume symmetrical number of BX around L1Accept
886  int iBxInEvent = ( m_totalBxInEvent + 1 ) / 2 - m_totalBxInEvent;
887 
888  for (int iGmtRec = 0; iGmtRec < m_totalBxInEvent; ++iGmtRec) {
889 
890  // unpack only bxInEvent requested, otherwise skip it
891  if ( ( iGmtRec >= m_lowSkipBxInEvent ) && ( iGmtRec < m_uppSkipBxInEvent )) {
892 
893  // Dump the block
894  const cms_uint64_t* bp =
895  reinterpret_cast<cms_uint64_t*> (const_cast<unsigned*> (p));
896  for (int iWord = 0; iWord < 17; iWord++) {
897  LogTrace("L1GlobalTriggerRawToDigi") << std::setw(4) << iWord << " " << std::hex
898  << std::setfill('0') << std::setw(16) << *bp++ << std::dec << std::setfill(
899  ' ') << std::endl;
900  }
901 
902  L1MuGMTReadoutRecord gmtrr(iBxInEvent);
903 
904  gmtrr.setEvNr( ( *p ) & 0xffffff);
905  gmtrr.setBCERR( ( ( *p ) >> 24 ) & 0xff);
906  p++;
907 
908  gmtrr.setBxNr( ( *p ) & 0xfff);
909  if ( ( ( *p ) >> 15 ) & 1) {
910  gmtrr.setBxInEvent( ( ( ( *p ) >> 12 ) & 7 ) - 8);
911  } else {
912  gmtrr.setBxInEvent( ( ( ( *p ) >> 12 ) & 7 ));
913  }
914  // to do: check here the block length and the board id
915  p++;
916 
917  for (int im = 0; im < 16; im++) {
918  // flip the pt and quality bits -- this should better be done by GMT input chips
919  unsigned waux = *p++;
920  waux = ( waux & 0xffff00ff ) | ( ( ~waux ) & 0x0000ff00 );
921  L1MuRegionalCand cand(waux, iBxInEvent);
922  // fix the type assignment (csc=2, rpcb=1) -- should be done by GMT input chips
923  if (im >= 4 && im < 8) cand.setType(1);
924  if (im >= 8 && im < 12) cand.setType(2);
926  cand.setEtaValue(m_TriggerScales->getRegionalEtaScale(cand.type_idx())->getCenter(
927  cand.eta_packed()));
929  gmtrr.setInputCand(im, cand);
930  if (!cand.empty()) {
931  if (im < 4) DTCands->push_back(cand);
932  if (im >= 4 && im < 8) RPCbCands->push_back(cand);
933  if (im >= 8 && im < 12) CSCCands->push_back(cand);
934  if (im >= 12) RPCfCands->push_back(cand);
935  }
936  }
937 
938  unsigned char* prank = (unsigned char*) ( p + 12 );
939 
940  for (int im = 0; im < 12; im++) {
941  unsigned waux = *p++;
942  unsigned raux = im < 8 ? *prank++ : 0; // only fwd and brl cands have valid rank
943  L1MuGMTExtendedCand cand(waux, raux, iBxInEvent);
947  if (im < 4)
948  gmtrr.setGMTBrlCand(im, cand);
949  else if (im < 8)
950  gmtrr.setGMTFwdCand(im - 4, cand);
951  else {
952  gmtrr.setGMTCand(im - 8, cand);
953  if (!cand.empty()) GMTCands->push_back(cand);
954  }
955  }
956 
957  // skip the two sort rank words and two chip BX words
958  p += 4;
959 
960  gmtrc->addRecord(gmtrr);
961 
962  } else {
963  // increase the pointer with the GMT record size
964  p += gmtRecordSize32;
965  }
966 
967  // increase the BxInEvent number
968  iBxInEvent++;
969 
970  }
971 
972  iEvent.put(std::move(DTCands), "DT");
973  iEvent.put(std::move(CSCCands), "CSC");
974  iEvent.put(std::move(RPCbCands), "RPCb");
975  iEvent.put(std::move(RPCfCands), "RPCf");
976  iEvent.put(std::move(GMTCands));
977 
978 }
979 
980 // unpack trailer word
981 // trPtr pointer to the beginning of trailer obtained from gtPtr
982 void L1GlobalTriggerRawToDigi::unpackTrailer(const unsigned char* trlPtr, FEDTrailer& cmsTrailer) {
983 
984  // TODO if needed in another format
985 
986  // print the trailer info
987  if (m_verbosity && m_isDebugEnabled) {
988 
989  const cms_uint64_t* payload =
990  reinterpret_cast<cms_uint64_t*> (const_cast<unsigned char*> (trlPtr));
991 
992  std::ostringstream myCoutStream;
993 
994  // one word only
995  int iWord = 0;
996 
997  myCoutStream << std::setw(4) << iWord << " " << std::hex << std::setfill('0')
998  << std::setw(16) << payload[iWord] << std::dec << std::setfill(' ') << "\n"
999  << std::endl;
1000 
1001  myCoutStream << " Event_length: " << std::hex << " hex: " << "" << std::setw(6)
1002  << std::setfill('0') << cmsTrailer.lenght() << std::setfill(' ') << std::dec
1003  << " dec: " << cmsTrailer.lenght() << std::endl;
1004 
1005  myCoutStream << " CRC: " << std::hex << " hex: " << " " << std::setw(4)
1006  << std::setfill('0') << cmsTrailer.crc() << std::setfill(' ') << std::dec
1007  << " dec: " << cmsTrailer.crc() << std::endl;
1008 
1009  myCoutStream << " Event_status: " << std::hex << " hex: " << " " << std::setw(2)
1010  << std::setfill('0') << cmsTrailer.evtStatus() << std::setfill(' ') << std::dec
1011  << " dec: " << cmsTrailer.evtStatus() << std::endl;
1012 
1013  myCoutStream << " TTS_bits: " << std::hex << " hex: " << " " << std::setw(1)
1014  << std::setfill('0') << cmsTrailer.ttsBits() << std::setfill(' ') << std::dec
1015  << " dec: " << cmsTrailer.ttsBits() << std::endl;
1016 
1017  myCoutStream << " More trailers: " << std::hex << " hex: " << " " << std::setw(1)
1018  << std::setfill('0') << cmsTrailer.moreTrailers() << std::setfill(' ') << std::dec
1019  << " dec: " << cmsTrailer.moreTrailers() << std::endl;
1020 
1021  LogDebug("L1GlobalTriggerRawToDigi") << "\n CMS Trailer \n" << myCoutStream.str() << "\n"
1022  << std::endl;
1023 
1024  }
1025 
1026 }
1027 
1028 // produce empty products in case of problems
1030 
1031  std::unique_ptr<L1GlobalTriggerReadoutRecord> gtReadoutRecord(
1033 
1034  std::unique_ptr<L1MuGMTReadoutCollection> gmtrc(new L1MuGMTReadoutCollection());
1035 
1036  std::unique_ptr<std::vector<L1MuRegionalCand> > DTCands(new std::vector<L1MuRegionalCand>);
1037  std::unique_ptr<std::vector<L1MuRegionalCand> > CSCCands(new std::vector<L1MuRegionalCand>);
1038  std::unique_ptr<std::vector<L1MuRegionalCand> > RPCbCands(new std::vector<L1MuRegionalCand>);
1039  std::unique_ptr<std::vector<L1MuRegionalCand> > RPCfCands(new std::vector<L1MuRegionalCand>);
1040  std::unique_ptr<std::vector<L1MuGMTCand> > GMTCands(new std::vector<L1MuGMTCand>);
1041 
1042  // put empty records into event
1043 
1044  iEvent.put(std::move(gmtrc));
1045  iEvent.put(std::move(gtReadoutRecord));
1046 
1047  iEvent.put(std::move(DTCands), "DT");
1048  iEvent.put(std::move(CSCCands), "CSC");
1049  iEvent.put(std::move(RPCbCands), "RPCb");
1050  iEvent.put(std::move(RPCfCands), "RPCf");
1051  iEvent.put(std::move(GMTCands));
1052 
1053 }
1054 
1055 
1056 
1057 // dump FED raw data
1059  const unsigned char* gtPtr, int gtSize, std::ostream& myCout) {
1060 
1061  LogDebug("L1GlobalTriggerRawToDigi") << "\nDump FED raw data.\n" << std::endl;
1062 
1065 
1066  int gtWords = gtSize / uLength;
1067  LogTrace("L1GlobalTriggerRawToDigi") << "\nFED GT words (" << wLength << " bits):" << gtWords
1068  << "\n" << std::endl;
1069 
1070  const cms_uint64_t* payload =
1071  reinterpret_cast<cms_uint64_t*> (const_cast<unsigned char*> (gtPtr));
1072 
1073  for (unsigned int i = 0; i < gtSize / sizeof(cms_uint64_t); i++) {
1074  myCout << std::setw(4) << i << " " << std::hex << std::setfill('0') << std::setw(16)
1075  << payload[i] << std::dec << std::setfill(' ') << std::endl;
1076  }
1077 
1078 }
1079 
1080 // static class members
1081 
#define LogDebug(id)
const L1MuTriggerScales * m_TriggerScales
muon trigger scales to convert unpacked data into physical quantities
bool isDebugEnabled()
void reset()
reset the content of a L1GtPsbWord
Definition: L1GtPsbWord.cc:432
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:127
const unsigned int getSize() const
get the size of the GTFE block in GT DAQ record (in multiple of 8 bits)
Definition: L1GtfeWord.h:229
int version()
Version identifier of the FED data format.
Definition: FEDHeader.cc:32
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
virtual void print(std::ostream &myCout) const
pretty print the content of a L1GtfeWord
Definition: L1GtfeWord.cc:321
const L1MuScale * getPtScale() const
get the Pt scale
unsigned int phiIndex() const
get phi-code
Definition: L1MuGMTCand.h:73
void unpackHeader(const unsigned char *, FEDHeader &)
block unpackers
cms_uint16_t m_activeBoardsMaskGt
mask for active boards
void produce(edm::Event &, const edm::EventSetup &) override
static const int UnitLength
one unit in the word is UnitLength bits
virtual bool empty() const
return empty flag
void setGMTBrlCand(int nr, L1MuGMTExtendedCand const &cand)
set GMT barrel candidate
int evtStatus()
Event fragment status information.
Definition: FEDTrailer.cc:27
bool moreTrailers()
Definition: FEDTrailer.cc:37
int m_recordLength0
total Bx&#39;s in the event, obtained from GTFE block
void setBData(cms_uint16_t bDataVal, int iB)
Definition: L1GtPsbWord.cc:337
~L1GlobalTriggerRawToDigi() override
destructor
unsigned int etaIndex() const
get eta-code
Definition: L1MuGMTCand.h:108
void setGMTFwdCand(int nr, L1MuGMTExtendedCand const &cand)
set GMT forward candidate
void unpack(const unsigned char *fdlPtr)
Definition: L1GtFdlWord.cc:891
void setInputCand(int nr, unsigned data)
set Input muon
void unpackPSB(const edm::EventSetup &, const unsigned char *, L1GtPsbWord &)
virtual float getCenter(unsigned packed) const =0
get the center of bin represented by packed
void setRecordLength(cms_uint16_t recordLengthValue)
Definition: L1GtfeWord.h:109
void setPtValue(float ptVal)
Set Pt Value.
const unsigned int getSize() const
get the size of the FDL block in GT DAQ record (in multiple of 8 bits)
Definition: L1GtFdlWord.h:392
const cms_uint16_t altNrBxBoard() const
get/set alternative for number of BX per board
Definition: L1GtfeWord.h:187
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
static const int WordLength
GT DAQ record organized in words of WordLength bits.
const cms_uint16_t recordLength() const
get/set record length for alternative 0
Definition: L1GtfeWord.h:104
void setEventNr(cms_uint32_t eventNrValue)
Definition: L1GtPsbWord.h:134
int sourceID()
Identifier of the FED.
Definition: FEDHeader.cc:28
void setBxNr(cms_uint16_t bxNrValue)
Definition: L1GtPsbWord.h:113
bool empty() const
is it an empty muon candidate?
Definition: L1MuGMTCand.h:64
virtual void reset()
reset the content of a L1GtfeWord
Definition: L1GtfeWord.cc:306
int iEvent
Definition: GenABIO.cc:230
const L1MuTriggerPtScale * m_TriggerPtScale
void setPhiValue(float phiVal)
Set Phi Value.
bool moreHeaders()
Definition: FEDHeader.cc:36
void setBoardId(cms_uint16_t boardIdValue)
Definition: L1GtPsbWord.h:71
int m_recordLength1
corresponding to alternative 1 in altNrBxBoard()
void setPhiValue(float phiVal)
Setters for physical values.
Definition: L1MuGMTCand.h:177
void setLumiSegmentNr(const cms_uint16_t &lumiSegmentNrValue)
Definition: L1GtFdlWord.h:357
edm::InputTag m_daqGtInputTag
input tags for GT DAQ record
void setBxInEvent(int bxInEventValue)
Definition: L1GtPsbWord.h:92
const L1MuScale * getPhiScale() const
get the phi scale
void reset()
reset the content of a L1GtFdlWord
Definition: L1GtFdlWord.cc:732
void setEtaValue(float etaVal)
Set Eta Value (need to set type, first)
unsigned eta_packed() const
return eta packed as in hardware
unsigned short cms_uint16_t
Definition: typedefs.h:13
void setType(unsigned type)
Set Type: 0 DT, 1 bRPC, 2 CSC, 3 fRPC.
void setRecordLength1(cms_uint16_t recordLengthValue)
Definition: L1GtfeWord.h:90
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:74
L1GlobalTriggerRawToDigi(const edm::ParameterSet &)
constructor(s)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:464
const cms_uint16_t activeBoards() const
get/set boards contributing to EVM respectively DAQ record
Definition: L1GtfeWord.h:163
#define LogTrace(id)
void print(std::ostream &myCout) const
pretty print the content of a L1GtFdlWord
Definition: L1GtFdlWord.cc:766
void print(std::ostream &myCout) const
pretty print
Definition: L1GtPsbWord.cc:453
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
int ttsBits()
Current value of the Trigger Throttling System bitsAQ).
Definition: FEDTrailer.cc:32
const cms_uint16_t lumiSegmentNr() const
get/set luminosity segment number of the actual bx
Definition: L1GtFdlWord.h:352
int m_totalBxInEvent
number of Bx for a board, obtained from GTFE block (record length & alternative)
T const * product() const
Definition: Handle.h:81
int lenght()
The length of the event fragment counted in 64-bit words including header and trailer.
Definition: FEDTrailer.cc:17
void setActiveBoards(cms_uint16_t activeBoardsValue)
Definition: L1GtfeWord.h:168
const T & get() const
Definition: EventSetup.h:55
void setEtaValue(float etaVal)
Set Eta Value (need to set type, first)
Definition: L1MuGMTCand.h:183
int bxID()
The bunch crossing number.
Definition: FEDHeader.cc:24
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void setBxNr(int bxnr)
set counters
void unpackTrailer(const unsigned char *, FEDTrailer &)
unpack trailer word
const L1MuScale * getRegionalEtaScale(int isys) const
get the regioanl muon trigger eta scale, isys = 0(DT), 1(bRPC), 2(CSC), 3(fwdRPC) ...
HLT enums.
const std::vector< L1GtBoard > & gtBoardMaps() const
get / set / print the L1 GT board map
Definition: L1GtBoardMaps.h:47
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
virtual float getLowEdge(unsigned packed) const =0
get the low edge of bin represented by packed
void unpackGMT(const unsigned char *, std::unique_ptr< L1MuGMTReadoutCollection > &, edm::Event &)
unpack the GMT record
void setLocalBxNr(cms_uint16_t localBxNrValue)
Definition: L1GtPsbWord.h:183
int crc()
Cyclic Redundancy Code of the event fragment including header and trailer.
Definition: FEDTrailer.cc:22
const L1MuScale * getGMTEtaScale() const
get the GMT eta scale
void setGMTCand(int nr, L1MuGMTExtendedCand const &cand)
set GMT candidate (does not store rank)
int lvl1ID()
Level-1 event number generated by the TTC system.
Definition: FEDHeader.cc:20
unsigned long long cms_uint64_t
Definition: typedefs.h:17
void produceEmptyProducts(edm::Event &)
produce empty products in case of problems
void setPtValue(float ptVal)
Set Pt Value.
Definition: L1MuGMTCand.h:180
unsigned pt_packed() const
return pt packed as in hardware
const cms_uint16_t recordLength1() const
get/set record length for alternative 1
Definition: L1GtfeWord.h:85
unsigned int ptIndex() const
get pt-code
Definition: L1MuGMTCand.h:76
int triggerType()
Event Trigger type identifier.
Definition: FEDHeader.cc:16
void setAData(cms_uint16_t aDataVal, int iA)
Definition: L1GtPsbWord.cc:242
T const * product() const
Definition: ESHandle.h:86
virtual void unpack(const unsigned char *gtfePtr)
Definition: L1GtfeWord.cc:380
unsigned type_idx() const
return type: 0 DT, 1 bRPC, 2 CSC, 3 fRPC
def move(src, dest)
Definition: eostools.py:510
unsigned phi_packed() const
return phi packed as in hardware
const unsigned int getSize() const
get the size of the PSB block in GT DAQ record (in multiple of 8 bits)
Definition: L1GtPsbWord.h:198
void dumpFedRawData(const unsigned char *, int, std::ostream &)
dump FED raw data