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