419 Xgt[irow][icolumn] = 0;
420 XgtF[irow][icolumn] = 0;
421 Xsaturation[irow][icolumn] = 0;
439 *BCIDptr = (Xfiber[0][
gPos::W280-1]&0x007F0000) >>16;
442 std::array<int, gPos::AB_TOWERS> etowerData{};
443 std::array<int, gPos::AB_TOWERS> htowerData{};
444 std::array<int, gPos::ABC_ROWS> xetowerData{};
445 std::array<int, gPos::ABC_ROWS> xhtowerData{};
446 std::array<int, gPos::ABC_ROWS> ohtowerData{};
449 std::array<int, gPos::AB_TOWERS> etowerDataF{};
450 std::array<int, gPos::AB_TOWERS> htowerDataF{};
451 std::array<int, gPos::ABC_ROWS> xetowerDataF{};
452 std::array<int, gPos::ABC_ROWS> xhtowerDataF{};
453 std::array<int, gPos::ABC_ROWS> ohtowerDataF{};
460 gFields fiberFieldsUndecoded{{}};
461 gSatur fiberSaturation{{}};
464 for(
unsigned int i=0;
i<100;
i++){
466 if( ( Xfiber[
i][
gPos::W280-1] & 0x000000FF ) == 0x000000BC ) {
468 fiberFields[
i][16] = 1;
471 fiberFields[
i][16] = 0;
475 fiberFields[
i][18] = ( Xfiber[
i][
gPos::W280-1] & 0x007F0000) >>16 ;
476 fiberFields[
i][19] = ( Xfiber[
i][
gPos::W280-1] & 0xFF800000) >>23 ;
478 if (XMPD_DTYP_ARR[ XMPD_NFI[
i] ][17] == 8) {
480 fiberFields[
i][17] = ( Xfiber[
i][
gPos::W280-1] & 0x0000FF00) >>8 ;
482 for(
unsigned int k=0;
k<8;
k++){
483 if( fiberFields[
i][17] & (1<<
k) ) {
484 fiberSaturation[
i][
k] = 1;
490 for(
unsigned int k=0;
k<16;
k++){
491 if( (XMPD_DTYP_ARR[ XMPD_NFI[
i] ][
k] != 4 ) && ( XMPD_GTRN_ARR[
i][
k] > -1 ) ) {
492 int krow = XMPD_GTRN_ARR[
i][
k]/12;
493 int kcolumn = XMPD_GTRN_ARR[
i][
k]%12;
495 if( fiberSaturation[
i][kFilled] == 1 ) {
496 Xsaturation[ krow][kcolumn] = 1;
499 kFilled = kFilled + 1;
505 for(
int iFiber = 0; iFiber < Xin; iFiber++) {
507 std::array<uint32_t, 6>
tmp;
508 for(
int i = 0;
i < 6;
i++){
tmp[
i] = Xfiber[iFiber][
i]; };
511 int withoutComma = Xfiber[iFiber][6] & 0xFFFFFF00 ;
512 CRC =
crc9d23(withoutComma, CRC, 1 );
513 uint32_t StoredCRC = ( (Xfiber[iFiber][6]>>23) & 0x000001FF);
514 if( (CRC != StoredCRC) && (StoredCRC != 0 ) ) {
516 std::stringstream sdetail;
517 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: Fiber " << iFiber <<
"of Xin " << Xin <<
": BAD New CRC: " << CRC <<
"Stored CRC "<< StoredCRC ;
518 std::stringstream slocation;
519 slocation <<
"Fiber " << iFiber <<
"of Xin " << Xin;
520 std::stringstream stitle;
521 stitle <<
"Bad CRC" ;
527 int fiber_type = XMPD_NFI[iFiber];
529 for(
int iDatum = 0; iDatum < 16; iDatum++) {
531 int dataType = XMPD_DTYP_ARR[fiber_type][iDatum];
533 int ntower = XMPD_GTRN_ARR[iFiber][iDatum];
535 ATH_MSG_DEBUG(
"[gFexInputByteStreamTool::gtReconstructABC: unused location iFiber "<< iFiber <<
", calo type "<< XCALO_TYPE[iFiber]<<
", data type "<<
dataType <<
", iDatum " << iDatum <<
"tower " << ntower);
537 else if( (ntower < 0) || (ntower >383) ){
539 std::stringstream sdetail;
540 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC: bad value of ntower: iFiber "<< iFiber<<
", calo type"<< XCALO_TYPE[iFiber]<<
", data type "<<
dataType<<
", iDatum "<< iDatum<<
"tower "<< ntower ;
541 std::stringstream slocation;
542 slocation <<
"iFiber "<< iFiber<<
", calo type"<< XCALO_TYPE[iFiber];
543 std::stringstream stitle;
544 stitle <<
"Bad value of ntower" ;
551 int ihigh = XMPD_DSTRT_ARR[fiber_type][iDatum];
552 int ihword = ihigh/32;
553 int ihbit = ihigh%32;
569 if( XMSK[iFiber] != 1 ) {
574 if( (XCALO_TYPE[iFiber] < 3) && (ntower>-1) && (ntower<384) ) {
580 if(ilword == ihword){
583 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword] &
mask) >> ilbit );
586 fiberFieldsUndecoded[iFiber][iDatum] = etowerData[ntower];
588 etowerDataF[ntower] = etowerData[ntower];
589 fiberFields[iFiber][iDatum] = etowerData[ntower];
594 if( etowerData[ntower] & 0x00000800 ){ etowerData[ntower] = (etowerData[ntower] | 0xFFFFF000) ;}
595 etowerData[ntower] = etowerData[ntower]*4;
596 etowerDataF[ntower] = etowerData[ntower];
601 std::stringstream sdetail;
602 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<
dataType<<
", "<<ilword<<
", " <<ihword ;
603 std::stringstream slocation;
604 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
605 std::stringstream stitle;
606 stitle <<
"Wrongly packed data" ;
617 hTREXval = Xfiber[iFiber][ihword];
618 lTREXval = Xfiber[iFiber][ilword];
623 if(ilword == ihword){
626 htowerData[ntower] = htowerData[ntower] | ( (hTREXval &
mask) >> (ilbit) );
628 else if ( ihbit == 7 ) {
631 htowerData[ntower] = htowerData[ntower] | ( (hTREXval & hmask) << 4);
633 htowerData[ntower] = htowerData[ntower] | ( ( (lTREXval & lmask) >> 28)&
mask) ;
635 else if ( ihbit == 3) {
638 htowerData[ntower] = htowerData[ntower] | ( ( hTREXval & hmask) << 8);
640 htowerData[ntower] = htowerData[ntower] | ( ( (lTREXval & lmask) >> 24) &
mask) ;
644 std::stringstream sdetail;
645 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<
dataType<<
", "<<ilword<<
", " <<ihword ;
646 std::stringstream slocation;
647 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
648 std::stringstream stitle;
649 stitle <<
"Wrongly packed data" ;
657 fiberFieldsUndecoded[iFiber][iDatum] = htowerData[ntower];
658 htowerData[ntower] = 20*htowerData[ntower];
659 htowerDataF[ntower] = htowerData[ntower];
660 fiberFields[iFiber][iDatum] = htowerData[ntower];
664 fiberFieldsUndecoded[iFiber][1] = htowerData[ntower];
666 htowerDataF[ntower] = htowerData[ntower];
667 fiberFields[iFiber][1] = htowerData[ntower];
671 if( htowerData[ntower] & 0x00000800 ){ htowerData[ntower] = (htowerData[ntower] | 0xFFFFF000) ;}
672 htowerData[ntower] = htowerData[ntower]*4;
673 htowerDataF[ntower] = htowerData[ntower];
682 if( (ntower > 32) || (ntower < 0) ){
684 std::stringstream sdetail;
685 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: bad value of nTower for extended region 2.4 - 2.5 in eta" ;
686 std::stringstream slocation;
687 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
688 std::stringstream stitle;
689 stitle <<
"Bad value of nTower in extended eta" ;
693 if(ilword == ihword){
694 int mask = 0x00000FFF;
696 xetowerData[ntower] = xetowerData[ntower] | ( (Xfiber[iFiber][ihword]&
mask) >> (ilbit) );
698 else if ( ihbit == 7 ) {
701 xetowerData[ntower] = xetowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
703 xetowerData[ntower] = xetowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&
mask) ;
705 else if ( ihbit == 3) {
708 xetowerData[ntower] = xetowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
710 xetowerData[ntower] = xetowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&
mask) ;
714 std::stringstream sdetail;
715 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<
dataType<<
", "<<ilword<<
", " <<ihword ;
716 std::stringstream slocation;
717 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
718 std::stringstream stitle;
719 stitle <<
"Wrongly packed data" ;
725 fiberFieldsUndecoded[iFiber][iDatum] = xetowerData[ntower];
726 undoMLE( xetowerData[ntower] );
727 xetowerDataF[ntower] = xetowerData[ntower];
728 fiberFields[iFiber][iDatum] = xetowerData[ntower];
733 if( xetowerData[ntower] & 0x00000800 ){ xetowerData[ntower] = (xetowerData[ntower] | 0xFFFFF000) ;}
734 xetowerData[ntower] = xetowerData[ntower]*4;
735 xetowerDataF[ntower] = xetowerData[ntower];
743 if(ilword == ihword){
746 xhtowerData[ntower] = xhtowerData[ntower] | ( (Xfiber[iFiber][ihword]&
mask) >> (ilbit) );
748 else if ( ihbit == 7 ) {
751 xhtowerData[ntower] = xhtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
753 xhtowerData[ntower] = xhtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&
mask) ;
755 else if ( ihbit == 3) {
758 xhtowerData[ntower] = xhtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
760 xhtowerData[ntower] = xhtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&
mask) ;
764 std::stringstream sdetail;
765 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<
dataType<<
", "<<ilword<<
", " <<ihword ;
766 std::stringstream slocation;
767 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
768 std::stringstream stitle;
769 stitle <<
"Wrongly packed data" ;
775 std::stringstream sdetail;
776 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: bad value of nTower for extended region 2.4 - 2.5 in eta" ;
777 std::stringstream slocation;
778 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
779 std::stringstream stitle;
780 stitle <<
"Bad value of nTower in extended eta" ;
786 fiberFieldsUndecoded[iFiber][iDatum] = xhtowerData[ntower];
787 undoMLE( xhtowerData[ntower] );
788 xhtowerDataF[ntower] = xhtowerData[ntower];
789 fiberFields[iFiber][iDatum] = xhtowerData[ntower];
793 if( xhtowerData[ntower] & 0x00000800 ){ xhtowerData[ntower] = (xhtowerData[ntower] | 0xFFFFF000) ;}
794 xhtowerData[ntower] = xhtowerData[ntower]*4;
795 xhtowerDataF[ntower] = xhtowerData[ntower];
803 if(ilword == ihword){
806 ohtowerData[ntower] = ohtowerData[ntower] | ( (Xfiber[iFiber][ihword]&
mask) >> (ilbit) );
808 else if ( ihbit == 7 ) {
811 ohtowerData[ntower] = ohtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
813 ohtowerData[ntower] = ohtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&
mask) ;
815 else if ( ihbit == 3) {
818 ohtowerData[ntower] = ohtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
820 ohtowerData[ntower] = ohtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&
mask) ;
824 std::stringstream sdetail;
825 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<
dataType<<
", "<<ilword<<
", " <<ihword ;
826 std::stringstream slocation;
827 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
828 std::stringstream stitle;
829 stitle <<
"Wrongly packed data" ;
835 std::stringstream sdetail;
836 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: bad value of nTower for extended region 2.4 - 2.5 in eta" ;
837 std::stringstream slocation;
838 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
839 std::stringstream stitle;
840 stitle <<
"Bad value of nTower in extended eta" ;
845 fiberFieldsUndecoded[iFiber][iDatum] = ohtowerData[ntower];
846 undoMLE( ohtowerData[ntower] );
847 ohtowerDataF[ntower] = ohtowerData[ntower];
848 fiberFields[iFiber][iDatum] = ohtowerData[ntower];
852 if( ohtowerData[ntower] & 0x00000800 ){ ohtowerData[ntower] = (ohtowerData[ntower] | 0xFFFFF000) ;}
853 ohtowerData[ntower] = ohtowerData[ntower]*4;
854 ohtowerDataF[ntower] = ohtowerData[ntower];
863 hHECval = Xfiber[iFiber][ihword];
864 lHECval = Xfiber[iFiber][ilword];
865 if(ilword == ihword){
868 htowerData[ntower] = htowerData[ntower] | ( (hHECval &
mask) >> (ilbit) );
870 else if ( ihbit == 7 ) {
873 htowerData[ntower] = htowerData[ntower] | ( (hHECval & hmask) << 4);
875 htowerData[ntower] = htowerData[ntower] | ( ( (lHECval & lmask) >> 28)&
mask) ;
877 else if ( ihbit == 3) {
880 htowerData[ntower] = htowerData[ntower] | ( ( hHECval & hmask) << 8);
882 htowerData[ntower] = htowerData[ntower] | ( ( (lHECval & lmask) >> 24) &
mask) ;
886 std::stringstream sdetail;
887 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<
dataType<<
", "<<ilword<<
", " <<ihword ;
888 std::stringstream slocation;
889 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
890 std::stringstream stitle;
891 stitle <<
"Wrongly packed data" ;
896 fiberFieldsUndecoded[iFiber][iDatum] = htowerData[ntower];
898 htowerDataF[ntower] = htowerData[ntower];
899 fiberFields[iFiber][iDatum] = htowerData[ntower];
903 if( htowerData[ntower] & 0x00000800 ){ htowerData[ntower] = (htowerData[ntower] | 0xFFFFF000) ;}
904 htowerData[ntower] = htowerData[ntower]*4;
905 htowerDataF[ntower] = htowerData[ntower];
912 else if ( (ntower>-1) && (ntower<384) ){
922 if( etowerData[ntower] != 0 ) {
924 std::stringstream sdetail;
925 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: etowerData[nTower] is not zero, inconsistent constants! "<< etowerData[ntower] ;
926 std::stringstream slocation;
927 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
928 std::stringstream stitle;
929 stitle <<
"etowerData not zero" ;
934 if(ilword == ihword){
935 int mask = 0x00000FFF;
937 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword]&
mask) >> (ilbit) );
939 else if ( ihbit == 7 ) {
942 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
944 etowerData[ntower] = etowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&
mask) ;
946 else if ( ihbit == 3) {
949 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
951 etowerData[ntower] = etowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&
mask) ;
955 std::stringstream sdetail;
956 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<
dataType<<
", "<<ilword<<
", " <<ihword ;
957 std::stringstream slocation;
958 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
959 std::stringstream stitle;
960 stitle <<
"Wrongly packed data" ;
966 fiberFieldsUndecoded[iFiber][iDatum] = etowerData[ntower];
968 etowerDataF[ntower] = etowerData[ntower];
969 fiberFields[iFiber][iDatum] = etowerData[ntower];
973 if( etowerData[ntower] & 0x00000800 ){ etowerData[ntower] = (etowerData[ntower] | 0xFFFFF000) ;}
974 etowerData[ntower] = etowerData[ntower]*4;
975 etowerDataF[ntower] = etowerData[ntower];
985 if( htowerData[ntower] != 0 ) {
986 std::stringstream sdetail;
987 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: etowerData[nTower] is not zero, inconsistent constants! "<< etowerData[ntower] ;
988 std::stringstream slocation;
989 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
990 std::stringstream stitle;
991 stitle <<
"etowerData not zero" ;
996 if(ilword == ihword){
999 htowerData[ntower] = htowerData[ntower] | ( (Xfiber[iFiber][ihword]&
mask) >> (ilbit) );
1001 else if ( ihbit == 7 ) {
1004 htowerData[ntower] = htowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
1006 htowerData[ntower] = htowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&
mask) ;
1008 else if ( ihbit == 3) {
1011 htowerData[ntower] = htowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
1013 htowerData[ntower] = htowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&
mask) ;
1017 std::stringstream sdetail;
1018 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<
dataType<<
", "<<ilword<<
", " <<ihword ;
1019 std::stringstream slocation;
1020 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
1021 std::stringstream stitle;
1022 stitle <<
"Wrongly packed data" ;
1028 fiberFieldsUndecoded[iFiber][iDatum] = htowerData[ntower];
1029 undoMLE( htowerData[ntower] );
1030 htowerDataF[ntower] = htowerData[ntower];
1031 fiberFields[iFiber][iDatum] = htowerData[ntower];
1035 if( htowerData[ntower] & 0x00000800 ){ htowerData[ntower] = (htowerData[ntower] | 0xFFFFF000) ;}
1036 htowerData[ntower] = htowerData[ntower]*4;
1037 htowerDataF[ntower] = htowerData[ntower];
1050 std::stringstream sdetail;
1051 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrong detector type "<<
dataType ;
1052 std::stringstream slocation;
1053 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<<
dataType;
1054 std::stringstream stitle;
1055 stitle <<
"Wrong detector type" ;
1066 for(
int itower=0;itower<384;itower++){
1067 int icolumn = itower%12;
1068 int irow = itower/12;
1071 int xF = etowerDataF[itower] + htowerDataF[itower];
1073 int x = ( (etowerData[itower]>>2) + (htowerData[itower]>>2) );
1078 Xgt[irow][icolumn] =
x;
1079 XgtF[irow][icolumn] = xF;
1082 if ( icolumn == 0) {
1083 int xx = ( (xetowerData[irow]>>2) + (xhtowerData[irow]>>2) );
1085 Xgt[irow][icolumn] = Xgt[irow][icolumn] + xx;
1087 if ( icolumn == 4) {
1089 int ox = (ohtowerData[irow] >> 2 ) ;
1091 Xgt[irow][icolumn] = Xgt[irow][icolumn] + ox ;
1095 else if ( XFPGA == 1 ) {
1096 for(
int itower=0;itower<384;itower++){
1097 int icolumn = itower%12;
1098 int irow = itower/12;
1101 int xF = etowerDataF[itower] + htowerDataF[itower] ;
1103 int x = ( (etowerData[itower]>>2) + (htowerData[itower] >> 2) );
1108 Xgt[irow][icolumn] =
x;
1109 XgtF[irow][icolumn] = xF;
1112 if ( icolumn == 11) {
1116 int xx = ( (xetowerData[irow]>>2) + (xhtowerData[irow]>>2) );
1119 Xgt[irow][icolumn] = Xgt[irow][icolumn] + xx;
1121 if ( icolumn == 7 ) {
1124 int xo = ohtowerData[irow]>>2;
1127 Xgt[irow][icolumn] = Xgt[irow][icolumn] + xo;
1131 else if ( XFPGA == 2 ) {
1132 for(
int itower=0;itower<384;itower++){
1133 int icolumn = itower%12;
1134 int irow = itower/12;
1137 int xF = etowerDataF[itower] + htowerDataF[itower] ;
1139 int x = ( (etowerData[itower]>>2 ) + (htowerData[itower]>>2));
1143 Xgt[irow][icolumn] =
x;
1144 XgtF[irow][icolumn] = xF;
1148 ATH_MSG_DEBUG(
"[gFexInputByteStreamTool::gtReconstructABC]: Bad FPGA # "<< XFPGA);