63 ATH_CHECK(gTowersContainer.
record(std::make_unique<xAOD::gFexTowerContainer>(),
64 std::make_unique<xAOD::gFexTowerAuxContainer>()));
66 "Recorded gFexTowerContainer (200 MeV resolution, default) with key " <<
m_gTowers200WriteKey.key());
67 gTowers200ContainerPtr = &*gTowersContainer;
73 ATH_CHECK(gTowers50Container.
record(std::make_unique<xAOD::gFexTowerContainer>(),
74 std::make_unique<xAOD::gFexTowerAuxContainer>()));
75 ATH_MSG_DEBUG(
"Recorded gFexTower50Container (50 MeV resolution) with key " << gTowers50Container.
key());
76 gTowers50ContainerPtr = &*gTowers50Container;
80 ATH_CHECK(gFexDataTowersContainer.
record(std::make_unique<xAOD::gFexTowerContainer>(), std::make_unique<xAOD::gFexTowerAuxContainer>()));
81 ATH_MSG_DEBUG(
"Recorded main gFexDataTowerContainer with key " << gFexDataTowersContainer.
key());
84 for (
const ROBF* rob : vrobf) {
88 ATH_MSG_DEBUG(
"Starting to decode " << rob->rod_ndata() <<
" ROD words from ROB 0x" << std::hex << rob->rob_source_id());
90 if(rob->rod_ndata() <= 0){
94 const auto dataArray = std::span{rob->rod_data(), rob->rod_ndata()};
98 unsigned int n_words = rob->rod_ndata();
101 int fpgaPosition = -99;
113 int rows = Afiber.size();
114 int cols = Afiber[0].size();
118 for(
unsigned int iWord=0; iWord<n_words; iWord++) {
121 fpgaPosition = iWord;
125 fpgaPosition = iWord;
129 fpgaPosition = iWord;
135 for (
int irow = 0; irow < rows; irow++){
136 for (
int icol = 0; icol < cols; icol++){
137 Afiber[irow][icol] = dataArray[fpgaPosition + (7*irow) + 1 + icol];
143 for (
int irow = 0; irow < rows; irow++){
144 for (
int icol = 0; icol < cols; icol++){
145 Bfiber[irow][icol] = dataArray[fpgaPosition + (7*irow) + 1 + icol];
151 for (
int irow = 0; irow < rows; irow++){
152 for (
int icol = 0; icol < cols; icol++){
153 Cfiber[irow][icol] = dataArray[fpgaPosition + (7*irow) + 1 + icol];
258 char IsSaturated = 0;
264 int twr_rows = Atwr.size();
265 int twr_cols = Atwr[0].size();
270 for (
int irow = 0; irow < twr_rows; irow++){
271 for (
int icol = 0; icol < twr_cols; icol++){
274 Et = Atwr[irow][icol];
275 EtF = AtwrF[irow][icol];
276 IsSaturated = Asatur[irow][icol];
278 getEtaPhi(Eta, Phi, iEta, iPhi, towerID);
279 if(gTowers200ContainerPtr) {
280 gTowers200ContainerPtr->
push_back( std::make_unique<xAOD::gFexTower>() );
281 gTowers200ContainerPtr->
back()->
initialize(iEta, iPhi, Eta, Phi, Et, Fpga, IsSaturated, towerID);
283 if(gTowers50ContainerPtr) {
284 gTowers50ContainerPtr->
push_back(std::make_unique<xAOD::gFexTower>());
285 gTowers50ContainerPtr->
back()->
initialize(iEta, iPhi, Eta, Phi, EtF, Fpga, IsSaturated, towerID);
296 for (
int irow = 0; irow < twr_rows; irow++){
297 for (
int icol = 0; icol < twr_cols; icol++){
300 Et = Btwr[irow][icol];
301 EtF = BtwrF[irow][icol];
302 IsSaturated = Bsatur[irow][icol];
303 getEtaPhi(Eta, Phi, iEta, iPhi, towerID);
304 if(gTowers200ContainerPtr) {
305 gTowers200ContainerPtr->
push_back( std::make_unique<xAOD::gFexTower>() );
306 gTowers200ContainerPtr->
back()->
initialize(iEta, iPhi, Eta, Phi, Et, Fpga, IsSaturated, towerID);
308 if(gTowers50ContainerPtr) {
309 gTowers50ContainerPtr->
push_back(std::make_unique<xAOD::gFexTower>());
310 gTowers50ContainerPtr->
back()->
initialize(iEta, iPhi, Eta, Phi, EtF, Fpga, IsSaturated, towerID);
320 for (
int irow = 0; irow < twr_rows; irow++){
321 for (
int icol = 0; icol < twr_cols/2; icol++){
324 Et = Ctwr[irow][icol];
325 EtF = CtwrF[irow][icol];
326 IsSaturated = Csatur[irow][icol];
327 getEtaPhi(Eta, Phi, iEta, iPhi, towerID);
328 if(gTowers200ContainerPtr) {
329 gTowers200ContainerPtr->
push_back( std::make_unique<xAOD::gFexTower>() );
330 gTowers200ContainerPtr->
back()->
initialize(iEta, iPhi, Eta, Phi, Et, Fpga, IsSaturated, towerID);
332 if(gTowers50ContainerPtr) {
333 gTowers50ContainerPtr->
push_back(std::make_unique<xAOD::gFexTower>());
334 gTowers50ContainerPtr->
back()->
initialize(iEta, iPhi, Eta, Phi, EtF, Fpga, IsSaturated, towerID);
338 for (
int icol = twr_cols/2; icol < twr_cols; icol++){
341 Et = Ctwr[irow][icol];
342 EtF = CtwrF[irow][icol];
343 IsSaturated = Csatur[irow][icol];
344 getEtaPhi(Eta, Phi, iEta, iPhi, towerID);
345 if(gTowers200ContainerPtr) {
346 gTowers200ContainerPtr->
push_back( std::make_unique<xAOD::gFexTower>() );
347 gTowers200ContainerPtr->
back()->
initialize(iEta, iPhi, Eta, Phi, Et, Fpga, IsSaturated, towerID);
349 if(gTowers50ContainerPtr) {
350 gTowers50ContainerPtr->
push_back(std::make_unique<xAOD::gFexTower>());
351 gTowers50ContainerPtr->
back()->
initialize(iEta, iPhi, Eta, Phi, EtF, Fpga, IsSaturated, towerID);
358 unsigned int n_fiber_twrs = FiberTowerA.size();
361 for (
unsigned int i = 0; i < n_fiber_twrs; i++){
367 IsSaturated = FiberTowerAsatur[i];
368 gFexDataTowersContainer->push_back( std::make_unique<xAOD::gFexTower>() );
369 gFexDataTowersContainer->back()->initialize(iEta, iPhi, Eta, Phi, Et, Fpga, IsSaturated, towerID);
374 for (
unsigned int i = 0; i < n_fiber_twrs; i++){
380 IsSaturated = FiberTowerBsatur[i];
381 gFexDataTowersContainer->push_back( std::make_unique<xAOD::gFexTower>() );
382 gFexDataTowersContainer->back()->initialize(iEta, iPhi, Eta, Phi, Et, Fpga, IsSaturated, towerID);
389 for (
unsigned int i = 0; i < n_fiber_twrsC; i++){
395 IsSaturated = FiberTowerCsatur[i];
396 gFexDataTowersContainer->push_back( std::make_unique<xAOD::gFexTower>() );
397 gFexDataTowersContainer->back()->initialize(iEta, iPhi, Eta, Phi, Et, Fpga, IsSaturated, towerID);
401 return StatusCode::SUCCESS;
469 const gfiber &Xfiber,
int Xin,
473 const std::array<int, gPos::MAX_FIBERS> &XMPD_NFI,
474 const std::array<int, gPos::MAX_FIBERS> &XCALO_TYPE,
476 const gType & XMPD_DSTRT_ARR,
478 const std::array<int, gPos::MAX_FIBERS> &XMSK,
502 Xgt[irow][icolumn] = 0;
503 XgtF[irow][icolumn] = 0;
504 Xsaturation[irow][icolumn] = 0;
509 FiberTowerSatur.fill(0);
525 *BCIDptr = (Xfiber[0][
gPos::W280-1]&0x007F0000) >>16;
528 std::array<int, gPos::AB_TOWERS> etowerData{};
529 std::array<int, gPos::AB_TOWERS> htowerData{};
530 std::array<int, gPos::ABC_ROWS> xetowerData{};
531 std::array<int, gPos::ABC_ROWS> xhtowerData{};
532 std::array<int, gPos::ABC_ROWS> ohtowerData{};
535 std::array<int, gPos::AB_TOWERS> etowerDataF{};
536 std::array<int, gPos::AB_TOWERS> htowerDataF{};
537 std::array<int, gPos::ABC_ROWS> xetowerDataF{};
538 std::array<int, gPos::ABC_ROWS> xhtowerDataF{};
539 std::array<int, gPos::ABC_ROWS> ohtowerDataF{};
546 gFields fiberFieldsUndecoded{{}};
547 gSatur fiberSaturation{{}};
553 for(
unsigned int i=0; i<100; i++){
555 if (XMPD_NFI[i] < 0)
continue;
557 if( ( Xfiber[i][
gPos::W280-1] & 0x000000FF ) == 0x000000BC ) {
559 fiberFields[i][16] = 1;
562 fiberFields[i][16] = 0;
566 fiberFields[i][18] = ( Xfiber[i][
gPos::W280-1] & 0x007F0000) >>16 ;
567 fiberFields[i][19] = ( Xfiber[i][
gPos::W280-1] & 0xFF800000) >>23 ;
569 if (XMPD_DTYP_ARR[ XMPD_NFI[i] ][17] == 8) {
571 fiberFields[i][17] = ( Xfiber[i][
gPos::W280-1] & 0x0000FF00) >>8 ;
585 for(
unsigned int k=0; k<8; k++){
586 if( fiberFields[i][17] & (1<<k) ) {
587 fiberSaturation[i][k] = 1;
590 if ( XMPD_DTYP_ARR[XMPD_NFI[i]][2*k] == 0) {
592 fiberFieldsSatur[i][2*k] = 1;
593 }
else if ( XMPD_DTYP_ARR[XMPD_NFI[i]][k] != 1) {
596 if (!(XFPGA == 1 && XMPD_DTYP_ARR[XMPD_NFI[i]][k] == 11)) {
597 fiberFieldsSatur[i][k] = 1;
604 for (
unsigned int k=0; k<8; ++k){
605 int krow = XMPD_GTRN_ARR[i][k]/12;
606 int kcolumn = XMPD_GTRN_ARR[i][k]%12;
608 int korow = XMPD_GTRN_ARR[i][k];
609 int kxrow = XMPD_GTRN_ARR[i][k];
618 }
else if (XFPGA == 1){
623 if (fiberSaturation[i][k] == 1){
625 if ( ( XMPD_DTYP_ARR[XMPD_NFI[i]][2*k] == 0 ) && ( XMPD_GTRN_ARR[i][2*k] > -1 ) ){
626 int krow2 = XMPD_GTRN_ARR[i][2*k]/12;
627 int kcolumn2 = XMPD_GTRN_ARR[i][2*k]%12;
628 Xsaturation[krow2][kcolumn2] = 1;
638 if( (XFPGA != 1) && (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 11 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
639 Xsaturation[ krow][kcolumn] = 1;
646 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 3 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
647 Xsaturation[ kxrow][kxcolumn] = 1;
650 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 2 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
651 Xsaturation[ kxrow][kxcolumn] = 1;
654 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 6 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
655 Xsaturation[ korow][kocolumn] = 1;
659 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 3 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
660 Xsaturation[ krow][kcolumn] = 1;
662 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 2 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
663 Xsaturation[ krow][kcolumn] = 1;
681 for(
int iFiber = 0; iFiber < Xin; iFiber++) {
683 std::array<uint32_t, 6> tmp;
684 for(
int i = 0; i < 6; i++){ tmp[i] = Xfiber[iFiber][i]; };
686 uint32_t CRC =
crc9d32(tmp, 6, 1);
687 int withoutComma = Xfiber[iFiber][6] & 0xFFFFFF00 ;
688 CRC =
crc9d23(withoutComma, CRC, 1 );
689 uint32_t StoredCRC = ( (Xfiber[iFiber][6]>>23) & 0x000001FF);
690 if( (CRC != StoredCRC) && (StoredCRC != 0 ) ) {
692 std::stringstream sdetail;
693 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: Fiber " << iFiber <<
"of Xin " << Xin <<
": BAD New CRC: " << CRC <<
"Stored CRC "<< StoredCRC ;
694 std::stringstream slocation;
695 slocation <<
"Fiber " << iFiber <<
"of Xin " << Xin;
696 std::stringstream stitle;
697 stitle <<
"Bad CRC" ;
698 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
703 int fiber_type = XMPD_NFI[iFiber];
705 for(
int iDatum = 0; iDatum < 16; iDatum++) {
707 int dataType = XMPD_DTYP_ARR[fiber_type][iDatum];
709 int ntower = XMPD_GTRN_ARR[iFiber][iDatum];
711 ATH_MSG_DEBUG(
"[gFexInputByteStreamTool::gtReconstructABC: unused location iFiber "<< iFiber <<
", calo type "<< XCALO_TYPE[iFiber]<<
", data type "<< dataType <<
", iDatum " << iDatum <<
"tower " << ntower);
713 else if( (ntower < 0) || (ntower >383) ){
715 std::stringstream sdetail;
716 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC: bad value of ntower: iFiber "<< iFiber<<
", calo type"<< XCALO_TYPE[iFiber]<<
", data type "<< dataType<<
", iDatum "<< iDatum<<
"tower "<< ntower ;
717 std::stringstream slocation;
718 slocation <<
"iFiber "<< iFiber<<
", calo type"<< XCALO_TYPE[iFiber];
719 std::stringstream stitle;
720 stitle <<
"Bad value of ntower" ;
721 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
727 int ihigh = XMPD_DSTRT_ARR[fiber_type][iDatum];
728 int ihword = ihigh/32;
729 int ihbit = ihigh%32;
745 if( XMSK[iFiber] != 1 ) {
750 if( (XCALO_TYPE[iFiber] < 3) && (ntower>-1) && (ntower<384) ) {
756 if(ilword == ihword){
758 mask = mask << (ilbit);
759 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword] & mask) >> ilbit );
762 fiberFieldsUndecoded[iFiber][iDatum] = etowerData[ntower];
764 etowerDataF[ntower] = etowerData[ntower];
765 fiberFields[iFiber][iDatum] = etowerData[ntower];
770 if( etowerData[ntower] & 0x00000800 ){ etowerData[ntower] = (etowerData[ntower] | 0xFFFFF000) ;}
771 etowerData[ntower] = etowerData[ntower]*4;
772 etowerDataF[ntower] = etowerData[ntower];
777 std::stringstream sdetail;
778 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
779 std::stringstream slocation;
780 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
781 std::stringstream stitle;
782 stitle <<
"Wrongly packed data" ;
783 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
793 hTREXval = Xfiber[iFiber][ihword];
794 lTREXval = Xfiber[iFiber][ilword];
799 if(ilword == ihword){
801 mask = mask << ilbit;
802 htowerData[ntower] = htowerData[ntower] | ( (hTREXval & mask) >> (ilbit) );
804 else if ( ihbit == 7 ) {
807 htowerData[ntower] = htowerData[ntower] | ( (hTREXval & hmask) << 4);
809 htowerData[ntower] = htowerData[ntower] | ( ( (lTREXval & lmask) >> 28)&mask) ;
811 else if ( ihbit == 3) {
814 htowerData[ntower] = htowerData[ntower] | ( ( hTREXval & hmask) << 8);
816 htowerData[ntower] = htowerData[ntower] | ( ( (lTREXval & lmask) >> 24) &mask) ;
820 std::stringstream sdetail;
821 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
822 std::stringstream slocation;
823 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
824 std::stringstream stitle;
825 stitle <<
"Wrongly packed data" ;
826 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
833 fiberFieldsUndecoded[iFiber][iDatum] = htowerData[ntower];
834 htowerData[ntower] = 20*htowerData[ntower];
835 htowerDataF[ntower] = htowerData[ntower];
836 fiberFields[iFiber][iDatum] = htowerData[ntower];
840 fiberFieldsUndecoded[iFiber][1] = htowerData[ntower];
842 htowerDataF[ntower] = htowerData[ntower];
843 fiberFields[iFiber][1] = htowerData[ntower];
847 if( htowerData[ntower] & 0x00000800 ){ htowerData[ntower] = (htowerData[ntower] | 0xFFFFF000) ;}
848 htowerData[ntower] = htowerData[ntower]*4;
849 htowerDataF[ntower] = htowerData[ntower];
858 if( (ntower > 32) || (ntower < 0) ){
860 std::stringstream sdetail;
861 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: bad value of nTower for extended region 2.4 - 2.5 in eta" ;
862 std::stringstream slocation;
863 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
864 std::stringstream stitle;
865 stitle <<
"Bad value of nTower in extended eta" ;
866 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
869 if(ilword == ihword){
870 int mask = 0x00000FFF;
871 mask = mask << ilbit;
872 xetowerData[ntower] = xetowerData[ntower] | ( (Xfiber[iFiber][ihword]&mask) >> (ilbit) );
874 else if ( ihbit == 7 ) {
877 xetowerData[ntower] = xetowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
879 xetowerData[ntower] = xetowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&mask) ;
881 else if ( ihbit == 3) {
884 xetowerData[ntower] = xetowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
886 xetowerData[ntower] = xetowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&mask) ;
890 std::stringstream sdetail;
891 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
892 std::stringstream slocation;
893 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
894 std::stringstream stitle;
895 stitle <<
"Wrongly packed data" ;
896 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
901 fiberFieldsUndecoded[iFiber][iDatum] = xetowerData[ntower];
902 undoMLE( xetowerData[ntower] );
903 xetowerDataF[ntower] = xetowerData[ntower];
904 fiberFields[iFiber][iDatum] = xetowerData[ntower];
909 if( xetowerData[ntower] & 0x00000800 ){ xetowerData[ntower] = (xetowerData[ntower] | 0xFFFFF000) ;}
910 xetowerData[ntower] = xetowerData[ntower]*4;
911 xetowerDataF[ntower] = xetowerData[ntower];
919 if(ilword == ihword){
921 mask = mask << ilbit;
922 xhtowerData[ntower] = xhtowerData[ntower] | ( (Xfiber[iFiber][ihword]&mask) >> (ilbit) );
924 else if ( ihbit == 7 ) {
927 xhtowerData[ntower] = xhtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
929 xhtowerData[ntower] = xhtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&mask) ;
931 else if ( ihbit == 3) {
934 xhtowerData[ntower] = xhtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
936 xhtowerData[ntower] = xhtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&mask) ;
940 std::stringstream sdetail;
941 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
942 std::stringstream slocation;
943 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
944 std::stringstream stitle;
945 stitle <<
"Wrongly packed data" ;
946 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
951 std::stringstream sdetail;
952 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: bad value of nTower for extended region 2.4 - 2.5 in eta" ;
953 std::stringstream slocation;
954 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
955 std::stringstream stitle;
956 stitle <<
"Bad value of nTower in extended eta" ;
957 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
962 fiberFieldsUndecoded[iFiber][iDatum] = xhtowerData[ntower];
963 undoMLE( xhtowerData[ntower] );
964 xhtowerDataF[ntower] = xhtowerData[ntower];
965 fiberFields[iFiber][iDatum] = xhtowerData[ntower];
969 if( xhtowerData[ntower] & 0x00000800 ){ xhtowerData[ntower] = (xhtowerData[ntower] | 0xFFFFF000) ;}
970 xhtowerData[ntower] = xhtowerData[ntower]*4;
971 xhtowerDataF[ntower] = xhtowerData[ntower];
979 if(ilword == ihword){
981 mask = mask << ilbit;
982 ohtowerData[ntower] = ohtowerData[ntower] | ( (Xfiber[iFiber][ihword]&mask) >> (ilbit) );
984 else if ( ihbit == 7 ) {
987 ohtowerData[ntower] = ohtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
989 ohtowerData[ntower] = ohtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&mask) ;
991 else if ( ihbit == 3) {
994 ohtowerData[ntower] = ohtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
996 ohtowerData[ntower] = ohtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&mask) ;
1000 std::stringstream sdetail;
1001 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
1002 std::stringstream slocation;
1003 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1004 std::stringstream stitle;
1005 stitle <<
"Wrongly packed data" ;
1006 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1011 std::stringstream sdetail;
1012 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: bad value of nTower for extended region 2.4 - 2.5 in eta" ;
1013 std::stringstream slocation;
1014 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1015 std::stringstream stitle;
1016 stitle <<
"Bad value of nTower in extended eta" ;
1017 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1021 fiberFieldsUndecoded[iFiber][iDatum] = ohtowerData[ntower];
1022 undoMLE( ohtowerData[ntower] );
1023 ohtowerDataF[ntower] = ohtowerData[ntower];
1024 fiberFields[iFiber][iDatum] = ohtowerData[ntower];
1028 if( ohtowerData[ntower] & 0x00000800 ){ ohtowerData[ntower] = (ohtowerData[ntower] | 0xFFFFF000) ;}
1029 ohtowerData[ntower] = ohtowerData[ntower]*4;
1030 ohtowerDataF[ntower] = ohtowerData[ntower];
1039 hHECval = Xfiber[iFiber][ihword];
1040 lHECval = Xfiber[iFiber][ilword];
1041 if(ilword == ihword){
1043 mask = mask << ilbit;
1044 htowerData[ntower] = htowerData[ntower] | ( (hHECval & mask) >> (ilbit) );
1046 else if ( ihbit == 7 ) {
1049 htowerData[ntower] = htowerData[ntower] | ( (hHECval & hmask) << 4);
1051 htowerData[ntower] = htowerData[ntower] | ( ( (lHECval & lmask) >> 28)&mask) ;
1053 else if ( ihbit == 3) {
1056 htowerData[ntower] = htowerData[ntower] | ( ( hHECval & hmask) << 8);
1058 htowerData[ntower] = htowerData[ntower] | ( ( (lHECval & lmask) >> 24) &mask) ;
1062 std::stringstream sdetail;
1063 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
1064 std::stringstream slocation;
1065 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1066 std::stringstream stitle;
1067 stitle <<
"Wrongly packed data" ;
1068 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1072 fiberFieldsUndecoded[iFiber][iDatum] = htowerData[ntower];
1073 undoMLE( htowerData[ntower] );
1074 htowerDataF[ntower] = htowerData[ntower];
1075 fiberFields[iFiber][iDatum] = htowerData[ntower];
1079 if( htowerData[ntower] & 0x00000800 ){ htowerData[ntower] = (htowerData[ntower] | 0xFFFFF000) ;}
1080 htowerData[ntower] = htowerData[ntower]*4;
1081 htowerDataF[ntower] = htowerData[ntower];
1088 else if ( (ntower>-1) && (ntower<384) ){
1098 if( etowerData[ntower] != 0 ) {
1100 std::stringstream sdetail;
1101 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: etowerData[nTower] is not zero, inconsistent constants! "<< etowerData[ntower] ;
1102 std::stringstream slocation;
1103 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1104 std::stringstream stitle;
1105 stitle <<
"etowerData not zero" ;
1106 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1110 if(ilword == ihword){
1111 int mask = 0x00000FFF;
1112 mask = mask << ilbit;
1113 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword]&mask) >> (ilbit) );
1115 else if ( ihbit == 7 ) {
1118 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
1120 etowerData[ntower] = etowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&mask) ;
1122 else if ( ihbit == 3) {
1125 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
1127 etowerData[ntower] = etowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&mask) ;
1131 std::stringstream sdetail;
1132 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
1133 std::stringstream slocation;
1134 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1135 std::stringstream stitle;
1136 stitle <<
"Wrongly packed data" ;
1137 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1142 fiberFieldsUndecoded[iFiber][iDatum] = etowerData[ntower];
1143 undoMLE( etowerData[ntower] );
1144 etowerDataF[ntower] = etowerData[ntower];
1145 fiberFields[iFiber][iDatum] = etowerData[ntower];
1149 if( etowerData[ntower] & 0x00000800 ){ etowerData[ntower] = (etowerData[ntower] | 0xFFFFF000) ;}
1150 etowerData[ntower] = etowerData[ntower]*4;
1151 etowerDataF[ntower] = etowerData[ntower];
1161 if( htowerData[ntower] != 0 ) {
1162 std::stringstream sdetail;
1163 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: etowerData[nTower] is not zero, inconsistent constants! "<< etowerData[ntower] ;
1164 std::stringstream slocation;
1165 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1166 std::stringstream stitle;
1167 stitle <<
"etowerData not zero" ;
1168 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1172 if(ilword == ihword){
1174 mask = mask << ilbit;
1175 htowerData[ntower] = htowerData[ntower] | ( (Xfiber[iFiber][ihword]&mask) >> (ilbit) );
1177 else if ( ihbit == 7 ) {
1180 htowerData[ntower] = htowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
1182 htowerData[ntower] = htowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&mask) ;
1184 else if ( ihbit == 3) {
1187 htowerData[ntower] = htowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
1189 htowerData[ntower] = htowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&mask) ;
1193 std::stringstream sdetail;
1194 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
1195 std::stringstream slocation;
1196 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1197 std::stringstream stitle;
1198 stitle <<
"Wrongly packed data" ;
1199 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1204 fiberFieldsUndecoded[iFiber][iDatum] = htowerData[ntower];
1205 undoMLE( htowerData[ntower] );
1206 htowerDataF[ntower] = htowerData[ntower];
1207 fiberFields[iFiber][iDatum] = htowerData[ntower];
1211 if( htowerData[ntower] & 0x00000800 ){ htowerData[ntower] = (htowerData[ntower] | 0xFFFFF000) ;}
1212 htowerData[ntower] = htowerData[ntower]*4;
1213 htowerDataF[ntower] = htowerData[ntower];
1226 std::stringstream sdetail;
1227 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrong detector type "<< dataType ;
1228 std::stringstream slocation;
1229 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1230 std::stringstream stitle;
1231 stitle <<
"Wrong detector type" ;
1232 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1242 for(
int itower=0;itower<384;itower++){
1243 int icolumn = itower%12;
1244 int irow = itower/12;
1247 int xF = etowerDataF[itower] + htowerDataF[itower];
1249 int x = ( (etowerData[itower]>>2) + (htowerData[itower]>>2) );
1254 Xgt[irow][icolumn] =
x;
1255 XgtF[irow][icolumn] = xF;
1258 if ( icolumn == 0) {
1259 int xx = ( (xetowerData[irow]>>2) + (xhtowerData[irow]>>2) );
1261 Xgt[irow][icolumn] = Xgt[irow][icolumn] + xx;
1263 if ( icolumn == 4) {
1265 int ox = (ohtowerData[irow] >> 2 ) ;
1267 Xgt[irow][icolumn] = Xgt[irow][icolumn] + ox ;
1271 else if ( XFPGA == 1 ) {
1272 for(
int itower=0;itower<384;itower++){
1273 int icolumn = itower%12;
1274 int irow = itower/12;
1277 int xF = etowerDataF[itower] + htowerDataF[itower] ;
1279 int x = ( (etowerData[itower]>>2) + (htowerData[itower] >> 2) );
1284 Xgt[irow][icolumn] =
x;
1285 XgtF[irow][icolumn] = xF;
1288 if ( icolumn == 11) {
1292 int xx = ( (xetowerData[irow]>>2) + (xhtowerData[irow]>>2) );
1295 Xgt[irow][icolumn] = Xgt[irow][icolumn] + xx;
1297 if ( icolumn == 7 ) {
1300 int xo = ohtowerData[irow]>>2;
1303 Xgt[irow][icolumn] = Xgt[irow][icolumn] + xo;
1307 else if ( XFPGA == 2 ) {
1308 for(
int itower=0;itower<384;itower++){
1309 int icolumn = itower%12;
1310 int irow = itower/12;
1313 int xF = etowerDataF[itower] + htowerDataF[itower] ;
1315 int x = ( (etowerData[itower]>>2 ) + (htowerData[itower]>>2));
1319 Xgt[irow][icolumn] =
x;
1320 XgtF[irow][icolumn] = xF;
1324 ATH_MSG_DEBUG(
"[gFexInputByteStreamTool::gtReconstructABC]: Bad FPGA # "<< XFPGA);
1329 for(
int iFiber = 0; iFiber < Xin; ++iFiber) {
1330 for(
int iDatum = 0; iDatum < 16; ++iDatum) {
1331 int codedData = fiberFieldsUndecoded[iFiber][iDatum];
1332 int saturData = fiberFieldsSatur[iFiber][iDatum];
1333 unsigned int index = (16*iFiber) + iDatum;
1334 FiberTower[
index] = codedData;
1335 FiberTowerSatur[
index] = saturData;