Decode BS to RDO container.
303 {
304
306
307
308
309
310
313 uint32_t sizeReadOutFormatTracklet = 0;
316
317
318 bool isHeaderOK = true;
319
320 unsigned int vDataIndex = 0;
321 for (; isHeaderOK; ++vDataIndex) {
324
325
326 if (rawdata_flag == 0xFF) {
327 break;
328 }
329
330
332
333 switch (flagmentId) {
334 case 0x01:
336 break;
337 case 0x02:
338 sizeReadOutFormatHit =
counter;
339 break;
340 case 0x03:
341 sizeReadOutFormatTracklet =
counter;
342 break;
343
344
345
346
347
348
349 case 0x08:
351 break;
352 case 0x09:
354 break;
355 default:
356 isHeaderOK = false;
357 break;
358 }
359 }
360
361 bool t_debug = (
log.level() <= MSG::DEBUG);
362
363 if (!isHeaderOK || sizeRawData == 0 || sizeRawData >= 0x10000) {
364 unsigned int tmpRodId = rodId + (subDetectorId ==
CSIDE ?
NROD / 2 : 0);
365 if (tmpRodId >
NROD) {
367 }
368
369 if ((t_debug || !m_failedHeaderSizeRawData[tmpRodId])) {
370 log << (!m_failedHeaderSizeRawData[tmpRodId] ? MSG::WARNING
371 : MSG::DEBUG)
372 << "Corrupted data, Skip decoding of this ROD data"
373 << " TgcRODReadout : ROD ID= " << rodId
374 <<
" RawData Size= " << sizeRawData <<
endmsg;
375 log << (!m_failedHeaderSizeRawData[tmpRodId] ? MSG::WARNING
376 : MSG::DEBUG)
377 << "ReadOut Hit Size= " << sizeReadOutFormatHit
378 << " ReadOut Tracklet= " << sizeReadOutFormatTracklet
379 << " ReadOut SL= " << sizeSectorLogicWord
380 << " vDataIndex = " << vDataIndex << " HipT = " << sizeHipTWord
382 }
383 ++m_failedHeaderSizeRawData[tmpRodId];
384
385 return StatusCode::SUCCESS;
386 }
387
388 if (t_debug) {
389 log << MSG::DEBUG <<
"TgcRODReadout : ROD ID=" << rodId
390 << " RawData Size=" << sizeRawData
391 << " ReadOut Hit Size= " << sizeReadOutFormatHit
392 << " ReadOut Tracklet= " << sizeReadOutFormatTracklet
393 <<
" ReadOut SL= " << sizeSectorLogicWord <<
endmsg;
394 }
395
396 uint32_t firstRawDataIndex = vDataIndex;
397
398
399 std::vector<TgcRawData*> vCh;
400
401
410
411 std::unique_ptr<TgcSlbData> slb{};
412
413 for (; vDataIndex < firstRawDataIndex + sizeRawData; ++vDataIndex) {
414 if (t_debug) {
415 log << MSG::DEBUG <<
"Tgc BS Raw:" << vDataIndex <<
": "
416 << std::hex << vData[vDataIndex] <<
endmsg;
417 }
418
419
421
423 if ((rawdata_flag == 0xff) || (rawdata_flag == 0xfc)) {
424 continue;
425 }
426
427 switch (header) {
429
430 rec_type = (vData[vDataIndex] & 0x18000000) >> 27;
431 if (rec_type > 1) {
432 log << MSG::WARNING <<
"Rec Type " << rec_type
433 << " is not supproted "
434 << " Skip decoding of remaining hits of this event..."
436 return StatusCode::SUCCESS;
437 }
438
439
440 if (rec_type == 0) {
441
442 sswId = (vData[vDataIndex] & 0x0F0000) >> 16;
443 } else if (rec_type == 1) {
444
445 sswId = (vData[vDataIndex] & 0x07800000) >> 23;
446 }
447 break;
448
450
451 if (slb != nullptr) {
453 slb.get(), vCh);
455 subDetectorId, rodId, slb.get(), vCh);
456 }
457
458 fe_l1Id = (vData[vDataIndex] & 0x0000F000) >> 12;
459 fe_bcId = vData[vDataIndex] & 0x00000FFF;
460 slbId = (vData[vDataIndex] & 0x1F000000) >> 24;
461
462 if (rec_type == 0) {
463
464 mod = (vData[vDataIndex] & 0x00070000) >> 16;
465 rxId = (vData[vDataIndex] & 0x00F80000) >> 19;
466 } else if (rec_type == 1) {
467
468 mod = (vData[vDataIndex] & 0x000E0000) >> 17;
469 }
470
471 if (fe_l1Id != l1Id) {
472 if (t_debug) {
474 << "l1Id in SLB Header is different from l1Id in "
475 "ROD "
476 << " for rodId:" << rodId << " slbId:" << slbId
477 << " l1Id, bcId (SLB):" << fe_l1Id << ", "
478 << fe_bcId << " l1Id, bcId (ROD):" << l1Id << ", "
480 }
481 }
482 b_error = 0;
483 break;
484
486 if (vData[vDataIndex] & 0x10000000) {
487
488
489 b_error = vData[vDataIndex] & 0x0FFF;
490
491 } else {
492
493
494 rxId = (vData[vDataIndex] & 0x7C00000) >> 22;
495
496 break;
497 }
498
499
503
504 if (!slb) {
505
506 slb =
507 std::make_unique<TgcSlbData>(
bcId, l1Id, sswId, slbId);
508
509 if (!
setSbLoc(subDetectorId, rodId, slb.get(), rxId,
510 cabling, log)) {
511 unsigned int tmpRodId =
512 rodId + (subDetectorId ==
CSIDE ?
NROD / 2 : 0);
513 if (tmpRodId >
NROD) {
515 }
516
517 if ((t_debug || !m_failedSetSbLoc[tmpRodId])) {
518 log << (!m_failedSetSbLoc[tmpRodId] ? MSG::WARNING
519 : MSG::DEBUG)
520 << " Fail to set sbLoc"
521 << " :rodId=" << rodId << " :sswId=" << sswId
522 << " :slbAddress= " << slbId
523 <<
" : rxId= " << rxId <<
endmsg;
524 log << (!m_failedSetSbLoc[tmpRodId] ? MSG::WARNING
525 : MSG::DEBUG)
526 << "Corrupted data, Skip decoding of remaining "
527 "hits of this event..."
529 }
530 ++m_failedSetSbLoc[tmpRodId];
531 return StatusCode::SUCCESS;
532 }
534 slb.get(), mod)) {
535 unsigned int tmpRodId =
536 rodId + (subDetectorId ==
CSIDE ?
NROD / 2 : 0);
537 if (tmpRodId >
NROD) {
539 }
540
541 if ((t_debug || !m_failedSetType[tmpRodId])) {
542 log << (!m_failedSetType[tmpRodId] ? MSG::WARNING
543 : MSG::DEBUG)
544 << " Fail to set Module Type"
545 << " :rodId=" << rodId << " :sswId=" << sswId
546 <<
" :slbAddress= " << slbId <<
endmsg;
547 log << (!m_failedSetType[tmpRodId] ? MSG::WARNING
548 : MSG::DEBUG)
549 << "Corrupted data, Skip decoding of remaining "
550 "hits of this event..."
552 }
553 ++m_failedSetType[tmpRodId];
554 return StatusCode::SUCCESS;
555 }
556 if (b_error) {
557 slb->setError(b_error);
558 }
559 if (t_debug) {
560 log << MSG::DEBUG <<
"TgcRODReadout : slb =" << slb
561 << " : rodId=" << rodId << " : sswId=" << sswId
562 << " : slbAddress= " << slbId << " : rxId= " << rxId
564 }
565 }
566
567
568 for (int iHL = 0; iHL < 32;
569 iHL += 16) {
570 uint32_t vd = vData[vDataIndex] << iHL;
571
580
581 slb->setError(vData[vDataIndex] & 0x0FFF);
582 continue;
583 } else {
584 continue;
585 }
586
587 unsigned long cellAddr = (vd & 0x1F000000) >> 24;
588 unsigned long cellBitMap = (vd & 0x00FF0000) >> 16;
589
590 if (cellAddr < 25) {
591
592 slb->setBitmap(
bcTag, cellAddr, cellBitMap);
593 } else {
594
595 }
596 }
597 break;
598
600 {
601 uint32_t error_context = (vData[vDataIndex] & 0x00FFFFFF);
602 uint16_t error_id = (vData[vDataIndex] & 0x01F000000) >> 24;
603 if ((t_debug && (error_context != 0))) {
604 log << MSG::DEBUG <<
"TgcRODReadout : Error Report "
605 << " : error id =" << error_id
606 <<
" : context =" << error_context <<
endmsg;
607 }
608 } break;
609
610 default:
611 break;
612 }
613 }
614 if (slb != nullptr) {
617 slb.get(), vCh);
618 }
619
620 if (t_debug) {
621 uint32_t firstROHitIndex = vDataIndex;
622 for (; vDataIndex < firstROHitIndex + sizeReadOutFormatHit;
623 ++vDataIndex) {
624 log << MSG::DEBUG <<
"Tgc BS Readout HIT:" << vDataIndex <<
": "
625 << std::hex << vData[vDataIndex] <<
endmsg;
626 }
627 uint32_t firstROTrackletIndex = vDataIndex;
628 for (; vDataIndex < firstROTrackletIndex + sizeReadOutFormatTracklet;
629 ++vDataIndex) {
630 log << MSG::DEBUG <<
"Tgc BS Readout HIT:" << vDataIndex <<
": "
631 << std::hex << vData[vDataIndex] <<
endmsg;
632 }
633 }
634
636
637
638
639 std::vector<TgcRawData*>::iterator ith = vCh.begin();
640 std::vector<TgcRawData*>::iterator ith_e = vCh.end();
641
642 size_t n_vCh = 0;
643 for (; ith != ith_e; ++ith) {
644
646
647 n_vCh += 1;
648 }
649 if (t_debug) {
650 log << MSG::DEBUG << n_vCh
651 <<
"words of were recorded in TgcRdo container" <<
endmsg;
652 }
654 return StatusCode::SUCCESS;
655}
unsigned bcTag(unsigned bcBitMap)
value_type push_back(value_type pElem)
Add an element to the end of the collection.
bool setSbLoc(uint16_t subDetectorId, uint16_t rodId, TgcSlbData *slb, int rxId, const TgcCablingMap &cabling, MsgStream &log) const
Set sbLoc.
std::unique_ptr< TgcSlbDataHelper > m_tgcSlbDataHelper
TGC SLB data helper.