13 #include "eformat/SourceIdentifier.h"
14 #include "eformat/Status.h"
26 const std::string&
name,
42 ATH_MSG_DEBUG((gTowersmode==ConversionMode::Encoding ?
"Encoding" :
"Decoding") <<
" gTowers ");
51 return StatusCode::SUCCESS;
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++){
137 Afiber[irow][
icol] = dataArray[fpgaPosition + (7*irow) + 1 +
icol];
143 for (
int irow = 0; irow <
rows; irow++){
145 Bfiber[irow][
icol] = dataArray[fpgaPosition + (7*irow) + 1 +
icol];
151 for (
int irow = 0; irow <
rows; irow++){
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++){
274 Et = Atwr[irow][
icol];
275 EtF = AtwrF[irow][
icol];
276 IsSaturated = Asatur[irow][
icol];
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++){
300 Et = Btwr[irow][
icol];
301 EtF = BtwrF[irow][
icol];
302 IsSaturated = Bsatur[irow][
icol];
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++){
324 Et = Ctwr[irow][
icol];
325 EtF = CtwrF[irow][
icol];
326 IsSaturated = Csatur[irow][
icol];
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);
341 Et = Ctwr[irow][
icol];
342 EtF = CtwrF[irow][
icol];
343 IsSaturated = Csatur[irow][
icol];
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;
407 int rows = inputData.size();
408 int cols = inputData[0].size();
411 for (
int j=0; j<
cols; j++){
416 jf_lar_rx_data[
i][j] = 0;
419 jf_lar_rx_data[
i][j] = (inputData[0][0] & 0x03F0000);
428 int rows = inputData.size();
429 int cols = inputData[0].size();
432 for (
int j=0; j<
cols; j++){
437 jf_lar_rx_data[
i][j] = 0;
440 jf_lar_rx_data[
i][j] = (inputData[0][0] & 0x03F0000);
449 int rows = inputData.size();
450 int cols = inputData[0].size();
453 for (
int j=0; j<
cols; j++){
457 else if( j<
cols-1 ) {
458 outputData[
i][j] = 0;
461 outputData[
i][j] = ( inputData[0][0] & 0x03F0000);
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]; };
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" ;
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" ;
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){
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" ;
797 hTREXval = Xfiber[iFiber][ihword];
798 lTREXval = Xfiber[iFiber][ilword];
803 if(ilword == ihword){
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" ;
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" ;
873 if(ilword == ihword){
874 int mask = 0x00000FFF;
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" ;
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){
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" ;
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" ;
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){
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" ;
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" ;
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){
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" ;
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" ;
1114 if(ilword == ihword){
1115 int mask = 0x00000FFF;
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" ;
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" ;
1176 if(ilword == ihword){
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" ;
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" ;
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;
1349 std::array<uint32_t, 32> dIn;
1350 std::array<uint32_t, 9> crc_s;
1351 std::array<uint32_t, 9> crc_r;
1356 int crc_word = 0x000;
1357 unsigned int mask = 0x00000001;
1359 for(
int k =0;
k < numWords;
k++) {
1361 for (
int i =0 ;
i < 32;
i++ ) {
1362 dIn[31-
i] = (inWords[
k] & (
mask <<
i));
1363 dIn[31-
i] = ((dIn[31-
i] >>
i) & 0x00000001);
1367 for (
int i =0 ;
i<32;
i++ ) {
1368 dIn[
i] = inWords[
k] & (
mask <<
i);
1369 dIn[
i] = ((dIn[
i] >>
i) & 0x0000001);
1372 for(
int j=0; j<9; j++){
1373 crc_s[j] = crc_r[j];
1376 crc_r[0] = crc_s[0] ^ crc_s[2] ^ crc_s[3] ^ crc_s[6] ^ crc_s[8] ^ dIn[0] ^ dIn[2] ^ dIn[3] ^ dIn[5] ^ dIn[6] ^ dIn[7] ^ dIn[8] ^ dIn[9] ^ dIn[10] ^ dIn[11] ^ dIn[15] ^ dIn[18] ^ dIn[19] ^ dIn[20] ^ dIn[21] ^ dIn[22] ^ dIn[23] ^ dIn[25] ^ dIn[26] ^ dIn[29] ^ dIn[31];
1378 crc_r[1] = crc_s[1] ^ crc_s[2] ^ crc_s[4] ^ crc_s[6] ^ crc_s[7] ^ crc_s[8] ^ dIn[0] ^ dIn[1] ^ dIn[2] ^ dIn[4] ^ dIn[5] ^ dIn[12] ^ dIn[15] ^ dIn[16] ^ dIn[18] ^ dIn[24] ^ dIn[25] ^ dIn[27] ^ dIn[29] ^ dIn[30] ^ dIn[31];
1380 crc_r[2] = crc_s[2] ^ crc_s[3] ^ crc_s[5] ^ crc_s[7] ^ crc_s[8] ^ dIn[1] ^ dIn[2] ^ dIn[3] ^ dIn[5] ^ dIn[6] ^ dIn[13] ^ dIn[16] ^ dIn[17] ^ dIn[19] ^ dIn[25] ^ dIn[26] ^ dIn[28] ^ dIn[30] ^ dIn[31];
1382 crc_r[3] = crc_s[0] ^ crc_s[2] ^ crc_s[4] ^ dIn[0] ^ dIn[4] ^ dIn[5] ^ dIn[8] ^ dIn[9] ^ dIn[10] ^ dIn[11] ^ dIn[14] ^ dIn[15] ^ dIn[17] ^ dIn[19] ^ dIn[21] ^ dIn[22] ^ dIn[23] ^ dIn[25] ^ dIn[27];
1384 crc_r[4] = crc_s[1] ^ crc_s[2] ^ crc_s[5] ^ crc_s[6] ^ crc_s[8] ^ dIn[0] ^ dIn[1] ^ dIn[2] ^ dIn[3] ^ dIn[7] ^ dIn[8] ^ dIn[12] ^ dIn[16] ^ dIn[19] ^ dIn[21] ^ dIn[24] ^ dIn[25] ^ dIn[28] ^ dIn[29] ^ dIn[31];
1386 crc_r[5] = crc_s[0] ^ crc_s[7] ^ crc_s[8] ^ dIn[0] ^ dIn[1] ^ dIn[4] ^ dIn[5] ^ dIn[6] ^ dIn[7] ^ dIn[10] ^ dIn[11] ^ dIn[13] ^ dIn[15] ^ dIn[17] ^ dIn[18] ^ dIn[19] ^ dIn[21] ^ dIn[23] ^ dIn[30] ^ dIn[31];
1388 crc_r[6] = crc_s[0] ^ crc_s[1] ^ crc_s[2] ^ crc_s[3] ^ crc_s[6] ^ dIn[0] ^ dIn[1] ^ dIn[3] ^ dIn[9] ^ dIn[10] ^ dIn[12] ^ dIn[14] ^ dIn[15] ^ dIn[16] ^ dIn[21] ^ dIn[23] ^ dIn[24] ^ dIn[25] ^ dIn[26] ^ dIn[29];
1390 crc_r[7] = crc_s[0] ^ crc_s[1] ^ crc_s[4] ^ crc_s[6] ^ crc_s[7] ^ crc_s[8] ^ dIn[0] ^ dIn[1] ^ dIn[3] ^ dIn[4] ^ dIn[5] ^ dIn[6] ^ dIn[7] ^ dIn[8] ^ dIn[9] ^ dIn[13] ^ dIn[16] ^ dIn[17] ^ dIn[18] ^ dIn[19] ^ dIn[20] ^ dIn[21] ^ dIn[23] ^ dIn[24] ^ dIn[27] ^ dIn[29] ^ dIn[30] ^ dIn[31];
1392 crc_r[8] = crc_s[1] ^ crc_s[2] ^ crc_s[5] ^ crc_s[7] ^ crc_s[8] ^ dIn[1] ^ dIn[2] ^ dIn[4] ^ dIn[5] ^ dIn[6] ^ dIn[7] ^ dIn[8] ^ dIn[9] ^ dIn[10] ^ dIn[14] ^ dIn[17] ^ dIn[18] ^ dIn[19] ^ dIn[20] ^ dIn[21] ^ dIn[22] ^ dIn[24] ^ dIn[25] ^ dIn[28] ^ dIn[30] ^ dIn[31];
1397 for (
int i = 0;
i < 9;
i++) {
1398 crc_word = crc_word | (crc_r[8-
i] <<
i) ;
1402 for(
int i = 0;
i < 9;
i++ ){
1403 crc_word = crc_word | (crc_r[
i] <<
i);
1412 int mask = 0x00000001;
1414 std::array<uint32_t, 23> dIn;
1416 std::array<uint32_t, 9> crc_r;
1417 std::array<uint32_t, 9> crc_in_s;
1422 int crc_word = 0x000;
1427 for(
int i = 0;
i < 23;
i++){
1428 dIn[22-
i] = ( inword & (
mask <<
i));
1429 dIn[22-
i] = ( dIn[22-
i] >>
i);
1431 for(
int i = 0;
i < 9;
i++){
1432 crc_in_s[8-
i] = ( in_crc & (
mask <<
i) );
1433 crc_in_s[8-
i] = ( crc_in_s[8-
i] >>
i );
1437 for(
int i = 0;
i < 23;
i++) {
1438 dIn[
i] = ( inword & (
mask <<
i) );
1439 dIn[
i] = (dIn[
i] >>
i);
1441 for(
int i=0;
i<9;
i++){
1442 crc_in_s[
i] = ( in_crc & (
mask <<
i));
1443 crc_in_s[
i] = (crc_in_s[
i] >>
i);
1447 crc_r[0] = crc_in_s[1] ^ crc_in_s[4] ^ crc_in_s[5] ^ crc_in_s[6] ^ crc_in_s[7] ^ crc_in_s[8] ^ dIn[0] ^ dIn[2] ^ dIn[3] ^ dIn[5] ^ dIn[6] ^ dIn[7] ^ dIn[8] ^ dIn[9] ^ dIn[10] ^ dIn[11] ^ dIn[15] ^ dIn[18] ^ dIn[19] ^ dIn[20] ^ dIn[21] ^ dIn[22];
1448 crc_r[1] = crc_in_s[1] ^ crc_in_s[2] ^ crc_in_s[4] ^ dIn[0] ^ dIn[1] ^ dIn[2] ^ dIn[4] ^ dIn[5] ^ dIn[12] ^ dIn[15] ^ dIn[16] ^ dIn[18];
1449 crc_r[2] = crc_in_s[2] ^ crc_in_s[3] ^ crc_in_s[5] ^ dIn[1] ^ dIn[2] ^ dIn[3] ^ dIn[5] ^ dIn[6] ^ dIn[13] ^ dIn[16] ^ dIn[17] ^ dIn[19];
1450 crc_r[3] = crc_in_s[0] ^ crc_in_s[1] ^ crc_in_s[3] ^ crc_in_s[5] ^ crc_in_s[7] ^ crc_in_s[8] ^ dIn[0] ^ dIn[4] ^ dIn[5] ^ dIn[8] ^ dIn[9] ^ dIn[10] ^ dIn[11] ^ dIn[14] ^ dIn[15] ^ dIn[17] ^ dIn[19] ^ dIn[21] ^ dIn[22];
1451 crc_r[4] = crc_in_s[2] ^ crc_in_s[5] ^ crc_in_s[7] ^ dIn[0] ^ dIn[1] ^ dIn[2] ^ dIn[3] ^ dIn[7] ^ dIn[8] ^ dIn[12] ^ dIn[16] ^ dIn[19] ^ dIn[21];
1452 crc_r[5] = crc_in_s[1] ^ crc_in_s[3] ^ crc_in_s[4] ^ crc_in_s[5] ^ crc_in_s[7] ^ dIn[0] ^ dIn[1] ^ dIn[4] ^ dIn[5] ^ dIn[6] ^ dIn[7] ^ dIn[10] ^ dIn[11] ^ dIn[13] ^ dIn[15] ^ dIn[17] ^ dIn[18] ^ dIn[19] ^ dIn[21];
1453 crc_r[6] = crc_in_s[0] ^ crc_in_s[1] ^ crc_in_s[2] ^ crc_in_s[7] ^ dIn[0] ^ dIn[1] ^ dIn[3] ^ dIn[9] ^ dIn[10] ^ dIn[12] ^ dIn[14] ^ dIn[15] ^ dIn[16] ^ dIn[21];
1454 crc_r[7] = crc_in_s[2] ^ crc_in_s[3] ^ crc_in_s[4] ^ crc_in_s[5] ^ crc_in_s[6] ^ crc_in_s[7] ^ dIn[0] ^ dIn[1] ^ dIn[3] ^ dIn[4] ^ dIn[5] ^ dIn[6] ^ dIn[7] ^ dIn[8] ^ dIn[9] ^ dIn[13] ^ dIn[16] ^ dIn[17] ^ dIn[18] ^ dIn[19] ^ dIn[20] ^ dIn[21];
1455 crc_r[8] = crc_in_s[0] ^ crc_in_s[3] ^ crc_in_s[4] ^ crc_in_s[5] ^ crc_in_s[6] ^ crc_in_s[7] ^ crc_in_s[8] ^ dIn[1] ^ dIn[2] ^ dIn[4] ^ dIn[5] ^ dIn[6] ^ dIn[7] ^ dIn[8] ^ dIn[9] ^ dIn[10] ^ dIn[14] ^ dIn[17] ^ dIn[18] ^ dIn[19] ^ dIn[20] ^ dIn[21] ^ dIn[22];
1459 for(
int i = 0;
i < 9;
i++) {
1460 crc_word = ( crc_word | (crc_r[8-
i] <<
i));
1464 for(
int i = 0;
i < 9;
i++) {
1465 crc_word = ( crc_word | (crc_r[
i] <<
i) );
1473 int din = (0x00000FFF & datumPtr );
1476 if( (din > 0) && ( din < 962 ) ) din = 962;
1478 if( din == 0) din = 0x4EE;
1482 int FPGA_CONVLIN_TH1 = 5;
1483 int FPGA_CONVLIN_TH2 = 749;
1484 int FPGA_CONVLIN_TH3 = 1773;
1485 int FPGA_CONVLIN_TH4 = 2541;
1486 int FPGA_CONVLIN_TH5 = 4029;
1487 int FPGA_CONVLIN_TH6 = 4062;
1489 int FPGA_CONVLIN_OF0 = -5072;
1490 int FPGA_CONVLIN_OF1 = -2012;
1491 int FPGA_CONVLIN_OF2 = -1262;
1492 int FPGA_CONVLIN_OF3 = -3036;
1493 int FPGA_CONVLIN_OF4 = -8120;
1494 int FPGA_CONVLIN_OF5 = -4118720;
1520 r1shv = ((din & 0x0000007F) << 9 ) & 0x0000FE00 ;
1521 r2shv = ((din & 0x00000FFF) << 1 ) & 0x00001FFE ;
1522 r3shv = (din & 0x00000FFF) ;
1523 r4shv = ((din & 0x00000FFF) << 1 ) & 0x00001FFE ;
1524 r5shv = ((din & 0x00000FFF) << 2 ) & 0x00003FFC ;
1525 r6shv = ((din & 0x00000FFF) << 10 ) & 0x003FFC00 ;
1527 r1conv = r1shv + FPGA_CONVLIN_OF0;
1528 r2conv = r2shv + FPGA_CONVLIN_OF1;
1529 r3conv = r3shv + FPGA_CONVLIN_OF2;
1530 r4conv = r4shv + FPGA_CONVLIN_OF3;
1531 r5conv = r5shv + FPGA_CONVLIN_OF4;
1532 r6conv = r6shv + FPGA_CONVLIN_OF5;
1540 if ( din > FPGA_CONVLIN_TH1 ){
1546 if ( din > FPGA_CONVLIN_TH2 ){
1551 if ( din > FPGA_CONVLIN_TH3 ){
1556 if ( din > FPGA_CONVLIN_TH4 ){
1561 if ( din > FPGA_CONVLIN_TH5 ){
1567 if ( din > FPGA_CONVLIN_TH6 ){
1577 if( (! oth0) & (! oth1 ) & (! oth2 ) & (! oth3 ) & (! oth4 ) & (! oth5 ) & (! oth6 ) ) {
1580 else if( ( oth0) & (! oth1 ) & (! oth2 ) & (! oth3 ) & (! oth4 ) & (! oth5 ) & (! oth6 ) ) {
1583 else if( ( oth0) & ( oth1 ) & (! oth2 ) & (! oth3 ) & (! oth4 ) & (! oth5 ) & (! oth6 ) ) {
1586 else if( ( oth0) & ( oth1 ) & ( oth2 ) & (! oth3 ) & (! oth4 ) & (! oth5 ) & (! oth6 ) ) {
1589 else if( ( oth0) & ( oth1 ) & ( oth2 ) & ( oth3 ) & (! oth4 ) & (! oth5 ) & (! oth6 ) ) {
1592 else if( ( oth0) & ( oth1 ) & ( oth2 ) & ( oth3 ) & ( oth4 ) & (! oth5 ) & (! oth6 ) ) {
1595 else if( ( oth0) & ( oth1 ) & ( oth2 ) & ( oth3 ) & ( oth4 ) & ( oth5 ) & (! oth6 ) ) {
1598 else if( ( oth0) & ( oth1 ) & ( oth2 ) & ( oth3 ) & ( oth4 ) & ( oth5 ) & ( oth6 ) ) {
1613 float s_centralPhiWidth = (2*
M_PI)/32;
1614 float s_forwardPhiWidth = (2*
M_PI)/16;
1616 const std::vector<float> s_EtaCenter = { -4.5, -3.8, -3.38, -3.18, -3.15, -3,
1617 -2.8, -2.6, -2.35, -2.1, -1.9, -1.7, -1.5, -1.3, -1.1, -0.9,
1618 -0.7, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1,
1619 1.3, 1.5, 1.7, 1.9, 2.1, 2.35, 2.6, 2.8, 3.0,
1620 3.15, 3.18, 3.38, 3.8, 4.5};
1628 int towerID_base = 20000;
1629 int iEtaOld=0, iPhiOld=0;
1632 if (
iPhi == ((gFEXtowerID - towerID_base)/24)*2){
1636 if (
iPhi == (((gFEXtowerID - towerID_base - 12)/24)*2) + 1){
1638 iPhiOld = (
iPhi-1)/2;
1642 else if (
iEta == 3){
1643 if (
iPhi == ((gFEXtowerID - towerID_base - 1)/24)*2){
1647 if (
iPhi == (((gFEXtowerID - towerID_base - 13)/24)*2) + 1){
1649 iPhiOld = (
iPhi-1)/2;
1653 else if (
iEta == 36){
1654 if (
iPhi == (((gFEXtowerID - towerID_base - 22)/24)*2) + 1){
1656 iPhiOld = (
iPhi-1)/2;
1658 if (
iPhi == ((gFEXtowerID - towerID_base - 10)/24)*2){
1664 else if (
iEta == 37){
1665 if (
iPhi == (((gFEXtowerID - towerID_base - 23)/24)*2) + 1){
1667 iPhiOld = (
iPhi-1)/2;
1669 if (
iPhi == ((gFEXtowerID - towerID_base - 11)/24)*2){
1680 Eta = s_EtaCenter[iEtaOld];
1682 float Phi_gFex = -99;
1684 if (( iEtaOld <= 3 ) || ( (iEtaOld >= 36) )){
1685 Phi_gFex = ( (iPhiOld * s_forwardPhiWidth) + s_forwardPhiWidth/2);
1688 Phi_gFex = ( (iPhiOld * s_centralPhiWidth) + s_centralPhiWidth/2);
1691 if (Phi_gFex <
M_PI) {
1707 if(
x & (0x00000001<<upto) ) {
1708 x = (
x | (0xFFFFFFFF<<(upto+1)) );
1711 x = (
x & 0x000FFFF);
1720 int ABCrows = gtf.size();
1721 int ABcolumns = gtf[0].size();
1724 if(fpga <0 || fpga >2 ) printf(
"*E: gtCalib FPGA number %d out of range\n",fpga);
1729 for(
int irow=0; irow<ABCrows; irow++){
1730 for(
int icolumn=0; icolumn<ABcolumns; icolumn++){
1733 if( towerLSB == 200 ) {
1734 gtf[irow][icolumn] = gtf[irow][icolumn] +
offset;
1736 if( gtf[irow][icolumn] > 2047 ) {
1737 gtf[irow][icolumn] = 2047;
1738 }
else if( gtf[irow][icolumn] < 0 ){
1739 gtf[irow][icolumn] = 0;
1741 gtf[irow][icolumn] = gtf[irow][icolumn] -
offset;
1745 gtf[irow][icolumn] = gtf[irow][icolumn] +
offset;
1747 if( gtf[irow][icolumn] > 1023 ){
1748 gtf[irow][icolumn] = 1023;
1749 }
else if ( gtf[irow][icolumn] < 0 ){
1750 gtf[irow][icolumn] = 0;
1752 gtf[irow][icolumn] = gtf[irow][icolumn] -
offset;
1763 if (!
file.is_open()) {
1765 return StatusCode::FAILURE;
1771 if (
line[0] ==
'#')
continue;
1774 std::stringstream oneLine(
line);
1776 std::vector<float> elements;
1777 std::string element;
1778 while (std::getline(oneLine, element,
' ')) {
1779 elements.push_back(std::stof(element));
1785 if (elements.size() != 5) {
1787 "Unexpected number of elements (5 expected) in file: " <<
fileName);
1788 return StatusCode::FAILURE;
1792 std::array<float, 4> aux_arr{{elements.at(1), elements.at(3),
1793 elements.at(4), elements.at(2)}};
1801 return StatusCode::SUCCESS;
1807 return StatusCode::SUCCESS;
1814 Monitored::Scalar(
"gfexDecoderErrorLocation",location.empty() ? std::string(
"UNKNOWN") : location),