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 ;
573 for(
unsigned int k=0; k<8; k++){
574 if( fiberFields[i][17] & (1<<k) ) {
575 fiberSaturation[i][k] = 1;
579 if ( XMPD_DTYP_ARR[XMPD_NFI[i]][2*k] == 0) {
581 fiberFieldsSatur[i][2*k] = 1;
582 }
else if ( XMPD_DTYP_ARR[XMPD_NFI[i]][k] != 1) {
584 fiberFieldsSatur[i][k] = 1;
585 fiberFieldsSatur[i][k+8] = 1;
591 for (
unsigned int k=0; k<8; ++k){
592 int krow = XMPD_GTRN_ARR[i][k]/12;
593 int kcolumn = XMPD_GTRN_ARR[i][k]%12;
595 int korow = XMPD_GTRN_ARR[i][k];
596 int kxrow = XMPD_GTRN_ARR[i][k];
605 }
else if (XFPGA == 1){
610 if (fiberSaturation[i][k] == 1){
612 if ( ( XMPD_DTYP_ARR[XMPD_NFI[i]][2*k] == 0 ) && ( XMPD_GTRN_ARR[i][2*k] > -1 ) ){
613 int krow2 = XMPD_GTRN_ARR[i][2*k]/12;
614 int kcolumn2 = XMPD_GTRN_ARR[i][2*k]%12;
615 Xsaturation[krow2][kcolumn2] = 1;
618 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 11 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
619 Xsaturation[ krow][kcolumn] = 1;
626 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 3 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
627 Xsaturation[ kxrow][kxcolumn] = 1;
630 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 2 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
631 Xsaturation[ kxrow][kxcolumn] = 1;
634 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 6 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
635 Xsaturation[ korow][kocolumn] = 1;
639 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 3 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
640 Xsaturation[ krow][kcolumn] = 1;
642 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k] == 2 ) && ( XMPD_GTRN_ARR[i][k] > -1 ) ){
643 Xsaturation[ krow][kcolumn] = 1;
647 krow = XMPD_GTRN_ARR[i][k+8]/12;
648 kcolumn = XMPD_GTRN_ARR[i][k+8]%12;
650 korow = XMPD_GTRN_ARR[i][k+8];
651 kxrow = XMPD_GTRN_ARR[i][k+8];
654 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k+8] == 11 ) && ( XMPD_GTRN_ARR[i][k+8] > -1 ) ){
655 Xsaturation[ krow][kcolumn] = 1;
660 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k+8] == 3 ) && ( XMPD_GTRN_ARR[i][k+8] > -1 ) ){
661 Xsaturation[ kxrow][kxcolumn] = 1;
664 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k+8] == 2 ) && ( XMPD_GTRN_ARR[i][k+8] > -1 ) ){
665 Xsaturation[ kxrow][kxcolumn] = 1;
668 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k+8] == 6 ) && ( XMPD_GTRN_ARR[i][k+8] > -1 ) ){
669 Xsaturation[ korow][kocolumn] = 1;
673 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k+8] == 3 ) && ( XMPD_GTRN_ARR[i][k+8] > -1 ) ){
674 Xsaturation[ krow][kcolumn] = 1;
676 if( (XMPD_DTYP_ARR[ XMPD_NFI[i] ][k+8] == 2 ) && ( XMPD_GTRN_ARR[i][k+8] > -1 ) ){
677 Xsaturation[ krow][kcolumn] = 1;
685 for(
int iFiber = 0; iFiber < Xin; iFiber++) {
687 std::array<uint32_t, 6> tmp;
688 for(
int i = 0; i < 6; i++){ tmp[i] = Xfiber[iFiber][i]; };
690 uint32_t CRC =
crc9d32(tmp, 6, 1);
691 int withoutComma = Xfiber[iFiber][6] & 0xFFFFFF00 ;
692 CRC =
crc9d23(withoutComma, CRC, 1 );
693 uint32_t StoredCRC = ( (Xfiber[iFiber][6]>>23) & 0x000001FF);
694 if( (CRC != StoredCRC) && (StoredCRC != 0 ) ) {
696 std::stringstream sdetail;
697 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: Fiber " << iFiber <<
"of Xin " << Xin <<
": BAD New CRC: " << CRC <<
"Stored CRC "<< StoredCRC ;
698 std::stringstream slocation;
699 slocation <<
"Fiber " << iFiber <<
"of Xin " << Xin;
700 std::stringstream stitle;
701 stitle <<
"Bad CRC" ;
702 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
707 int fiber_type = XMPD_NFI[iFiber];
709 for(
int iDatum = 0; iDatum < 16; iDatum++) {
711 int dataType = XMPD_DTYP_ARR[fiber_type][iDatum];
713 int ntower = XMPD_GTRN_ARR[iFiber][iDatum];
715 ATH_MSG_DEBUG(
"[gFexInputByteStreamTool::gtReconstructABC: unused location iFiber "<< iFiber <<
", calo type "<< XCALO_TYPE[iFiber]<<
", data type "<< dataType <<
", iDatum " << iDatum <<
"tower " << ntower);
717 else if( (ntower < 0) || (ntower >383) ){
719 std::stringstream sdetail;
720 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC: bad value of ntower: iFiber "<< iFiber<<
", calo type"<< XCALO_TYPE[iFiber]<<
", data type "<< dataType<<
", iDatum "<< iDatum<<
"tower "<< ntower ;
721 std::stringstream slocation;
722 slocation <<
"iFiber "<< iFiber<<
", calo type"<< XCALO_TYPE[iFiber];
723 std::stringstream stitle;
724 stitle <<
"Bad value of ntower" ;
725 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
731 int ihigh = XMPD_DSTRT_ARR[fiber_type][iDatum];
732 int ihword = ihigh/32;
733 int ihbit = ihigh%32;
749 if( XMSK[iFiber] != 1 ) {
754 if( (XCALO_TYPE[iFiber] < 3) && (ntower>-1) && (ntower<384) ) {
760 if(ilword == ihword){
762 mask = mask << (ilbit);
763 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword] & mask) >> ilbit );
766 fiberFieldsUndecoded[iFiber][iDatum] = etowerData[ntower];
768 etowerDataF[ntower] = etowerData[ntower];
769 fiberFields[iFiber][iDatum] = etowerData[ntower];
774 if( etowerData[ntower] & 0x00000800 ){ etowerData[ntower] = (etowerData[ntower] | 0xFFFFF000) ;}
775 etowerData[ntower] = etowerData[ntower]*4;
776 etowerDataF[ntower] = etowerData[ntower];
781 std::stringstream sdetail;
782 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
783 std::stringstream slocation;
784 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
785 std::stringstream stitle;
786 stitle <<
"Wrongly packed data" ;
787 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
797 hTREXval = Xfiber[iFiber][ihword];
798 lTREXval = Xfiber[iFiber][ilword];
803 if(ilword == ihword){
805 mask = mask << ilbit;
806 htowerData[ntower] = htowerData[ntower] | ( (hTREXval & mask) >> (ilbit) );
808 else if ( ihbit == 7 ) {
811 htowerData[ntower] = htowerData[ntower] | ( (hTREXval & hmask) << 4);
813 htowerData[ntower] = htowerData[ntower] | ( ( (lTREXval & lmask) >> 28)&mask) ;
815 else if ( ihbit == 3) {
818 htowerData[ntower] = htowerData[ntower] | ( ( hTREXval & hmask) << 8);
820 htowerData[ntower] = htowerData[ntower] | ( ( (lTREXval & 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" ;
830 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
837 fiberFieldsUndecoded[iFiber][iDatum] = htowerData[ntower];
838 htowerData[ntower] = 20*htowerData[ntower];
839 htowerDataF[ntower] = htowerData[ntower];
840 fiberFields[iFiber][iDatum] = htowerData[ntower];
844 fiberFieldsUndecoded[iFiber][1] = htowerData[ntower];
846 htowerDataF[ntower] = htowerData[ntower];
847 fiberFields[iFiber][1] = htowerData[ntower];
851 if( htowerData[ntower] & 0x00000800 ){ htowerData[ntower] = (htowerData[ntower] | 0xFFFFF000) ;}
852 htowerData[ntower] = htowerData[ntower]*4;
853 htowerDataF[ntower] = htowerData[ntower];
862 if( (ntower > 32) || (ntower < 0) ){
864 std::stringstream sdetail;
865 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: bad value of nTower for extended region 2.4 - 2.5 in eta" ;
866 std::stringstream slocation;
867 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
868 std::stringstream stitle;
869 stitle <<
"Bad value of nTower in extended eta" ;
870 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
873 if(ilword == ihword){
874 int mask = 0x00000FFF;
875 mask = mask << ilbit;
876 xetowerData[ntower] = xetowerData[ntower] | ( (Xfiber[iFiber][ihword]&mask) >> (ilbit) );
878 else if ( ihbit == 7 ) {
881 xetowerData[ntower] = xetowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
883 xetowerData[ntower] = xetowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&mask) ;
885 else if ( ihbit == 3) {
888 xetowerData[ntower] = xetowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
890 xetowerData[ntower] = xetowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&mask) ;
894 std::stringstream sdetail;
895 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
896 std::stringstream slocation;
897 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
898 std::stringstream stitle;
899 stitle <<
"Wrongly packed data" ;
900 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
905 fiberFieldsUndecoded[iFiber][iDatum] = xetowerData[ntower];
906 undoMLE( xetowerData[ntower] );
907 xetowerDataF[ntower] = xetowerData[ntower];
908 fiberFields[iFiber][iDatum] = xetowerData[ntower];
913 if( xetowerData[ntower] & 0x00000800 ){ xetowerData[ntower] = (xetowerData[ntower] | 0xFFFFF000) ;}
914 xetowerData[ntower] = xetowerData[ntower]*4;
915 xetowerDataF[ntower] = xetowerData[ntower];
923 if(ilword == ihword){
925 mask = mask << ilbit;
926 xhtowerData[ntower] = xhtowerData[ntower] | ( (Xfiber[iFiber][ihword]&mask) >> (ilbit) );
928 else if ( ihbit == 7 ) {
931 xhtowerData[ntower] = xhtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
933 xhtowerData[ntower] = xhtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&mask) ;
935 else if ( ihbit == 3) {
938 xhtowerData[ntower] = xhtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
940 xhtowerData[ntower] = xhtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&mask) ;
944 std::stringstream sdetail;
945 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
946 std::stringstream slocation;
947 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
948 std::stringstream stitle;
949 stitle <<
"Wrongly packed data" ;
950 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
955 std::stringstream sdetail;
956 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: bad value of nTower for extended region 2.4 - 2.5 in eta" ;
957 std::stringstream slocation;
958 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
959 std::stringstream stitle;
960 stitle <<
"Bad value of nTower in extended eta" ;
961 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
966 fiberFieldsUndecoded[iFiber][iDatum] = xhtowerData[ntower];
967 undoMLE( xhtowerData[ntower] );
968 xhtowerDataF[ntower] = xhtowerData[ntower];
969 fiberFields[iFiber][iDatum] = xhtowerData[ntower];
973 if( xhtowerData[ntower] & 0x00000800 ){ xhtowerData[ntower] = (xhtowerData[ntower] | 0xFFFFF000) ;}
974 xhtowerData[ntower] = xhtowerData[ntower]*4;
975 xhtowerDataF[ntower] = xhtowerData[ntower];
983 if(ilword == ihword){
985 mask = mask << ilbit;
986 ohtowerData[ntower] = ohtowerData[ntower] | ( (Xfiber[iFiber][ihword]&mask) >> (ilbit) );
988 else if ( ihbit == 7 ) {
991 ohtowerData[ntower] = ohtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
993 ohtowerData[ntower] = ohtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&mask) ;
995 else if ( ihbit == 3) {
998 ohtowerData[ntower] = ohtowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
1000 ohtowerData[ntower] = ohtowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&mask) ;
1004 std::stringstream sdetail;
1005 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
1006 std::stringstream slocation;
1007 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1008 std::stringstream stitle;
1009 stitle <<
"Wrongly packed data" ;
1010 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1015 std::stringstream sdetail;
1016 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: bad value of nTower for extended region 2.4 - 2.5 in eta" ;
1017 std::stringstream slocation;
1018 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1019 std::stringstream stitle;
1020 stitle <<
"Bad value of nTower in extended eta" ;
1021 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1025 fiberFieldsUndecoded[iFiber][iDatum] = ohtowerData[ntower];
1026 undoMLE( ohtowerData[ntower] );
1027 ohtowerDataF[ntower] = ohtowerData[ntower];
1028 fiberFields[iFiber][iDatum] = ohtowerData[ntower];
1032 if( ohtowerData[ntower] & 0x00000800 ){ ohtowerData[ntower] = (ohtowerData[ntower] | 0xFFFFF000) ;}
1033 ohtowerData[ntower] = ohtowerData[ntower]*4;
1034 ohtowerDataF[ntower] = ohtowerData[ntower];
1043 hHECval = Xfiber[iFiber][ihword];
1044 lHECval = Xfiber[iFiber][ilword];
1045 if(ilword == ihword){
1047 mask = mask << ilbit;
1048 htowerData[ntower] = htowerData[ntower] | ( (hHECval & mask) >> (ilbit) );
1050 else if ( ihbit == 7 ) {
1053 htowerData[ntower] = htowerData[ntower] | ( (hHECval & hmask) << 4);
1055 htowerData[ntower] = htowerData[ntower] | ( ( (lHECval & lmask) >> 28)&mask) ;
1057 else if ( ihbit == 3) {
1060 htowerData[ntower] = htowerData[ntower] | ( ( hHECval & hmask) << 8);
1062 htowerData[ntower] = htowerData[ntower] | ( ( (lHECval & lmask) >> 24) &mask) ;
1066 std::stringstream sdetail;
1067 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
1068 std::stringstream slocation;
1069 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1070 std::stringstream stitle;
1071 stitle <<
"Wrongly packed data" ;
1072 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1076 fiberFieldsUndecoded[iFiber][iDatum] = htowerData[ntower];
1077 undoMLE( htowerData[ntower] );
1078 htowerDataF[ntower] = htowerData[ntower];
1079 fiberFields[iFiber][iDatum] = htowerData[ntower];
1083 if( htowerData[ntower] & 0x00000800 ){ htowerData[ntower] = (htowerData[ntower] | 0xFFFFF000) ;}
1084 htowerData[ntower] = htowerData[ntower]*4;
1085 htowerDataF[ntower] = htowerData[ntower];
1092 else if ( (ntower>-1) && (ntower<384) ){
1102 if( etowerData[ntower] != 0 ) {
1104 std::stringstream sdetail;
1105 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: etowerData[nTower] is not zero, inconsistent constants! "<< etowerData[ntower] ;
1106 std::stringstream slocation;
1107 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1108 std::stringstream stitle;
1109 stitle <<
"etowerData not zero" ;
1110 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1114 if(ilword == ihword){
1115 int mask = 0x00000FFF;
1116 mask = mask << ilbit;
1117 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword]&mask) >> (ilbit) );
1119 else if ( ihbit == 7 ) {
1122 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
1124 etowerData[ntower] = etowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&mask) ;
1126 else if ( ihbit == 3) {
1129 etowerData[ntower] = etowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
1131 etowerData[ntower] = etowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&mask) ;
1135 std::stringstream sdetail;
1136 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
1137 std::stringstream slocation;
1138 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1139 std::stringstream stitle;
1140 stitle <<
"Wrongly packed data" ;
1141 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1146 fiberFieldsUndecoded[iFiber][iDatum] = etowerData[ntower];
1147 undoMLE( etowerData[ntower] );
1148 etowerDataF[ntower] = etowerData[ntower];
1149 fiberFields[iFiber][iDatum] = etowerData[ntower];
1153 if( etowerData[ntower] & 0x00000800 ){ etowerData[ntower] = (etowerData[ntower] | 0xFFFFF000) ;}
1154 etowerData[ntower] = etowerData[ntower]*4;
1155 etowerDataF[ntower] = etowerData[ntower];
1165 if( htowerData[ntower] != 0 ) {
1166 std::stringstream sdetail;
1167 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: etowerData[nTower] is not zero, inconsistent constants! "<< etowerData[ntower] ;
1168 std::stringstream slocation;
1169 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1170 std::stringstream stitle;
1171 stitle <<
"etowerData not zero" ;
1172 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1176 if(ilword == ihword){
1178 mask = mask << ilbit;
1179 htowerData[ntower] = htowerData[ntower] | ( (Xfiber[iFiber][ihword]&mask) >> (ilbit) );
1181 else if ( ihbit == 7 ) {
1184 htowerData[ntower] = htowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 4);
1186 htowerData[ntower] = htowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 28)&mask) ;
1188 else if ( ihbit == 3) {
1191 htowerData[ntower] = htowerData[ntower] | ( (Xfiber[iFiber][ihword]&hmask) << 8);
1193 htowerData[ntower] = htowerData[ntower] | ( ( (Xfiber[iFiber][ilword]&lmask) >> 24)&mask) ;
1197 std::stringstream sdetail;
1198 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrongly packed data "<< fiber_type<<
", "<<dataType<<
", "<<ilword<<
", " <<ihword ;
1199 std::stringstream slocation;
1200 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1201 std::stringstream stitle;
1202 stitle <<
"Wrongly packed data" ;
1203 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1208 fiberFieldsUndecoded[iFiber][iDatum] = htowerData[ntower];
1209 undoMLE( htowerData[ntower] );
1210 htowerDataF[ntower] = htowerData[ntower];
1211 fiberFields[iFiber][iDatum] = htowerData[ntower];
1215 if( htowerData[ntower] & 0x00000800 ){ htowerData[ntower] = (htowerData[ntower] | 0xFFFFF000) ;}
1216 htowerData[ntower] = htowerData[ntower]*4;
1217 htowerDataF[ntower] = htowerData[ntower];
1230 std::stringstream sdetail;
1231 sdetail <<
"[gFexInputByteStreamTool::gtReconstructABC]: wrong detector type "<< dataType ;
1232 std::stringstream slocation;
1233 slocation <<
"Fiber type "<< fiber_type<<
" and data type"<< dataType;
1234 std::stringstream stitle;
1235 stitle <<
"Wrong detector type" ;
1236 printError(slocation.str(),stitle.str(),MSG::DEBUG,sdetail.str());
1246 for(
int itower=0;itower<384;itower++){
1247 int icolumn = itower%12;
1248 int irow = itower/12;
1251 int xF = etowerDataF[itower] + htowerDataF[itower];
1253 int x = ( (etowerData[itower]>>2) + (htowerData[itower]>>2) );
1258 Xgt[irow][icolumn] =
x;
1259 XgtF[irow][icolumn] = xF;
1262 if ( icolumn == 0) {
1263 int xx = ( (xetowerData[irow]>>2) + (xhtowerData[irow]>>2) );
1265 Xgt[irow][icolumn] = Xgt[irow][icolumn] + xx;
1267 if ( icolumn == 4) {
1269 int ox = (ohtowerData[irow] >> 2 ) ;
1271 Xgt[irow][icolumn] = Xgt[irow][icolumn] + ox ;
1275 else if ( XFPGA == 1 ) {
1276 for(
int itower=0;itower<384;itower++){
1277 int icolumn = itower%12;
1278 int irow = itower/12;
1281 int xF = etowerDataF[itower] + htowerDataF[itower] ;
1283 int x = ( (etowerData[itower]>>2) + (htowerData[itower] >> 2) );
1288 Xgt[irow][icolumn] =
x;
1289 XgtF[irow][icolumn] = xF;
1292 if ( icolumn == 11) {
1296 int xx = ( (xetowerData[irow]>>2) + (xhtowerData[irow]>>2) );
1299 Xgt[irow][icolumn] = Xgt[irow][icolumn] + xx;
1301 if ( icolumn == 7 ) {
1304 int xo = ohtowerData[irow]>>2;
1307 Xgt[irow][icolumn] = Xgt[irow][icolumn] + xo;
1311 else if ( XFPGA == 2 ) {
1312 for(
int itower=0;itower<384;itower++){
1313 int icolumn = itower%12;
1314 int irow = itower/12;
1317 int xF = etowerDataF[itower] + htowerDataF[itower] ;
1319 int x = ( (etowerData[itower]>>2 ) + (htowerData[itower]>>2));
1323 Xgt[irow][icolumn] =
x;
1324 XgtF[irow][icolumn] = xF;
1328 ATH_MSG_DEBUG(
"[gFexInputByteStreamTool::gtReconstructABC]: Bad FPGA # "<< XFPGA);
1333 for(
int iFiber = 0; iFiber < Xin; ++iFiber) {
1334 for(
int iDatum = 0; iDatum < 16; ++iDatum) {
1335 int codedData = fiberFieldsUndecoded[iFiber][iDatum];
1336 int saturData = fiberFieldsSatur[iFiber][iDatum];
1337 unsigned int index = (16*iFiber) + iDatum;
1338 FiberTower[
index] = codedData;
1339 FiberTowerSatur[
index] = saturData;