519 {
520
521 int s,
c,
f, nfrag,
ngain,
nchan, nsamp,
size,
ch,
extra = 0,
pmt, fragType, nhits = 0;
522 int id,
type, rflag,
unit, pulse, nsmpl, algor, niter;
523 const unsigned int*
data;
525 char fr[2] = {
'F',
'R' };
526 char gb[2] = { 'G', 'B' };
527 std::string unitName[4] = { "ADC count", "pCb", "Cs pCb", "MeV" };
528 std::string shapeName[4] = { "Phys", "Laser", "CIS", "Simul" };
529 std::string
algName[8] = {
"Unknown",
"OF1",
"OF2",
"Fit",
"ManyAmps",
"Flat",
"Alg6",
"Alg7" };
530
537
538 bool isFrag5 = false;
540 std::vector<unsigned int> OFC;
541
542 TileRawChannel2Bytes5::TileChanData Frag5Data[48];
543
544 bool beamROD = (subdet_id == 0x50 || subdet_id >= 0x60);
545 if (subdet_id >= 0x60) {
547
548 } else {
550 }
551
552 find_frag(roddata, rodsize, version, verbosity, frag.data(), nfrag);
553
554 if (verbosity > 9) return;
555
556 for (f = 0;
f < nfrag; ++
f) {
557
558 id = frag[
f]->id & 0xFFFF;
559 type = (frag[
f]->id >> 16) & 0xFF;
560 rflag = (frag[
f]->id) >> 24;
561 unit = (rflag & 0xC0) >> 6;
562 pulse = (rflag & 0x30) >> 4;
563 nsmpl = (rflag & 0x08) >> 3;
564 algor = (rflag & 0x04) >> 2;
565 niter = (rflag & 0x03);
567 data = frag[
f]->data;
568
569 if (type==0x40 || type==0x41 || type==0x42){
570
571 const unsigned char *
adc;
572 const unsigned short *
result;
573 int tmdb_ch1 = std::min(5U,((robsourceid)>>16)&0xF);
574 bool EB = (tmdb_ch1>2);
576 int tmdb_ch2 = (((robsourceid))&0xF)*nmod;
577 const char * dr56EB[10] = { "D5-L","D5-R","D6-L","D6-R","D4-L","D4-R","XX-X","XX-X","XX-X","XX-X" };
578 const char * dr56LB[10] = { "D0-x","D1-L","D1-R","D2-L","D2-R","D3-L","D3-R","B8-L","B8-R","XX-X" };
579 const char ** dr56rl = (
EB) ? dr56EB : dr56LB;
580 const char * ch11[6] = { "AUX","LBA","LBC","EBA","EBC","UNK" };
581 const char * ch12[6] = { "aux","lba","lbc","eba","ebc","unk" };
582 const char * dr56hlEB[4] = {" D6L "," D6H "," D56L"," D56H"};
583 const char * dr56hlLB[4] = {" DxL "," DxH "," DxxL"," DxxH"};
584
585 const char * dr56thEB[4] = {" D5 "," D6 "," D56 ", "BCID "};
586 const char * dr56thLB[4] = {" Dx "," Dy "," Dxy ", "BCID "};
587 const char ** dr56th = (
m_runPeriod < 3) ? (EB ? dr56hlEB : dr56hlLB)
588 : (
EB ? dr56thEB : dr56thLB);
589
590 const char *
tit[4] = {
"TMDB digits",
"TMDB energy",
"TMDB decision",
"Unknown"};
591
592 std::cout << std::hex << std::endl <<
tit[
type&3] <<
" fragment 0x" <<
type <<
" vers 0x"<<
id <<
", "
593 << std::dec <<
size <<
" words found"<< std::endl << std::endl;
594
595 int nchmod = 4;
596 int nsamp = 7;
597 int nch = 32;
598 int ntd = (
EB) ? 3 : 1;
599 int ntdl = (
EB) ? 9 : 5;
601 switch (type) {
602
603 case 0x40:
604
606 nchmod = nch/nmod;
607 std::cout << "ch cell ";
608 for (
int ind=nsamp;
ind>0; --
ind) {
609 std::cout <<
" S"<<
ind;
610 }
611 std::cout << std::endl;
612 adc =
reinterpret_cast<const unsigned char *
>(
data);
613 for (int pword=0;pword<nch;++pword) {
614 int pword1=pword%nchmod;
615 if (!EB && nchmod==8) {
617 if (pword1==0) pword1=9;
618 else pword1 -= 1;
619 } else {
620 if (pword1>6) pword1=9;
621 }
622 } else {
623 if (pword1>9) pword1=9;
624 }
625 std::cout << std::setw(2) << pword <<
" | " << ch11[tmdb_ch1] <<std::setfill(
'0')<<std::setw(2) <<tmdb_ch2+
count
626 << "-" <<std::setfill(' ')<<std::setw(4)<<dr56rl[pword1];
627 for (
int ind=nsamp-1;
ind>-1; --
ind) {
628 std::cout <<
" | " << std::setw(3) << (
static_cast<unsigned>(
adc[pword+nch*
ind]) );
629 }
630 std::cout << std::endl;
631 if ((pword+1)%nchmod==0)
count+=1;
632 }
633 break;
634
635 case 0x41:
637 nchmod = nch/nmod;
638 std::cout << "ch cell energy" << std::endl;
639 for (
int pword=0;pword<
size;++pword) {
640 int pword1=pword%nchmod;
641 if (!EB && nchmod==8) {
643 if (pword1==0) pword1=9;
644 else pword1 -= 1;
645 } else {
646 if (pword1>6) pword1=9;
647 }
648 } else {
649 if (pword1>9) pword1=9;
650 }
651 std::cout << std::setw(2) << pword<<
" | " << ch11[tmdb_ch1] <<std::setfill(
'0')<<std::setw(2) <<tmdb_ch2+
count
652 << "-" <<std::setfill(' ')<<std::setw(4)<<dr56rl[pword1]
653 <<
" | "<< std::setw(6) <<
static_cast<int>(
data[pword])
654 << std::endl;
655 if ((pword+1)%nchmod==0)
count+=1;
656 }
657 break;
658
659 case 0x42:
660 {
661 std::cout << "nn name TMDB SL_Board SL_Trigger_Sector "
662 << dr56th[3] << dr56th[2] << dr56th[1] << dr56th[0] << std::endl;
663 result =
reinterpret_cast<const unsigned short *
>(
data);
666 int tmdb = (tmdb_ch2) / 8 + 1;
667 int slb =
tmdb * 3 - 1;
668 std::string tmdb_name =
"TM0" + (
EB ? std::to_string(tmdb) :
"X");
669 for (int pword = 0; pword < ntd; ++pword) {
670 count = (
EB) ? pword * 3 : pword * 4 + 1;
671 unsigned short r =
result[pword];
673 int slts1 = slb * 2 - 2;
674 int slts2 = slts1 + 1;
675 std::string slt_sectors = " - ";
676 if (EB) {
677 std::stringstream slts12;
678 slts12 << std::setfill(' ') << std::setw(2) << slts1 << "-"
679 << std::setfill(' ') << std::setw(2) << std::left << slts2;
680 slt_sectors = slts12.str();
681 }
682 std::stringstream slb_name;
683 slb_name <<
"SL_E" << std::setfill(
'0') << std::setw(2) << (
EB ? std::to_string(slb) :
"XX");
684 for(int pqword = 0; pqword < 4; ++pqword){
685 std::cout << std::setw(2) << pqword + pword * 4 << " | "
686 << ((
count > 0 &&
count < ntdl) ? ch11[tmdb_ch1] : ch12[tmdb_ch1])
687 << std::setfill(
'0') << std::setw(2) << tmdb_ch2 +
count
688 << std::setfill(' ') << std::setw(6) << tmdb_name
689 << std::setfill(' ') << std::setw(10) << slb_name.str()
690 << std::setfill(' ') << std::setw(15) << slt_sectors
691 << std::setfill(
' ') << std::setw(11) << ((
m_runPeriod < 3) ? ((
r >> 3) & 1) :
bcid)
692 << std::setw(5) << ((
r >> 2) & 1) << std::setw(5) << ((
r >> 1) & 1) << std::setw(5) << (
r & 1) << std::endl;
695 }
696 ++slb;
697 if (slb > 24) slb = 1;
698 }
699 }
700 break;
701 default:
703 }
704
705 } else if (id < 0x100 || beamROD) {
706 id &= 0xFF;
707
708 switch (id) {
709
713 if ((type == 0x1) || (type == 0x2)) {
714 bool isLastChannelEOB = ((
data[
size - 1] >> 24) & 0x7) == 0x4;
716 std::cout << "\nBeam ToF TDC, ";
717 } else {
718 std::cout <<
"\nBeam TDC 0x" << std::setfill(
'0') << std::hex << std::setw(2) <<
id <<
setupDec <<
", ";
719 }
720 std::cout << (isLastChannelEOB ?
size - 1 :
size) <<
" hits found";
721 prev = 0xFF;
722 for (c = 0;
c <
size; ++
c) {
724 unsigned short res1 = (
data[
c] >> 13) & 0x1;
725
726 chan = (
type == 0x1) ? (data[c] >> 17) & 0x3FF
727 : (
data[
c] >> 16) & 0x7FF;
728
729 if (chan > 31) {
730 int wordType = (
data[
c] >> 24) & 0x7;
731 if (wordType == 0x2) {
732 std::cout <<
"\n header, " << ((
data[
c] >> 8) & 0x3F) <<
" channels";
733 } else if (wordType == 0x4) {
734 std::cout <<
"\n end of block, event counter: " << (
data[
c] & 0xFFFFFF) << std::endl;
735 } else {
736 std::cout <<
"\n unknown word: 0x" << std::hex <<
data[
c] << std::dec << std::endl;
737 }
738 continue;
739 }
740 if (prev != chan) {
741 std::cout <<
"\n ch" << std::setw(3) <<
chan <<
":";
742 nhits = 0;
744 } else if (nhits % 8 == 0) {
745 std::cout << "\n ";
746 }
747 ++nhits;
748 if (res1) {
749 std::cout <<
" U" << std::setw(4) <<
time;
750 } else {
751 std::cout <<
" " << std::setw(4) <<
time;
752 }
753 }
754 std::cout << std::endl;
755
756 break;
757 } else {
758
759 [[fallthrough]];
760 }
761 }
762
764 std::cout <<
"\nBeam TDC 0x" << std::setfill(
'0') << std::hex << std::setw(2) <<
id <<
setupDec <<
", " <<
size <<
" hits found";
765 prev = 0xFF;
766 for (c = 0;
c <
size; ++
c) {
772
773
774
775 if (prev != chan) {
776 std::cout <<
"\n ch" << std::setw(3) <<
chan <<
":";
777 nhits = 0;
779 } else if (nhits % 8 == 0) {
780 std::cout << "\n ";
781 }
782 ++nhits;
784 std::cout <<
" " << gb[
bad] <<
fr[edge] << std::setw(6) <<
time;
785 } else {
786 std::cout <<
" " <<
fr[edge] << std::setw(6) <<
time;
787 }
788 }
789 std::cout << std::endl;
790 break;
791
794 if ((type == 0x1) || (type == 0x2)) {
795 bool isLastChannelEOB = ((
data[
size - 1] >> 24) & 0x7) == 0x4;
796 std::cout <<
"\nBeam ADC, " << (isLastChannelEOB ?
size - 1 :
size) <<
" hits found";
797 prev = 0xFF;
798 for (c = 0;
c <
size; ++
c) {
800 unsigned short res1 = (
data[
c] >> 13) & 0x1;
801 chan = (
type == 0x1) ? (data[c] >> 17) & 0x3FF
802 : (
data[
c] >> 16) & 0x7FF;
803
804 if (chan > 31) {
805 int wordType = (
data[
c] >> 24) & 0x7;
806 if (wordType == 0x2) {
807 std::cout <<
"\n header, " << ((
data[
c] >> 8) & 0x3F) <<
" channels";
808 } else if (wordType == 0x4) {
809 std::cout <<
"\n end of block, event counter: " << (
data[
c] & 0xFFFFFF) << std::endl;
810 } else {
811 std::cout <<
"\n unknown word: 0x" << std::hex <<
data[
c] << std::dec << std::endl;
812 }
813 continue;
814 }
815 if (prev != chan) {
816 std::cout <<
"\n ch" << std::setw(3) <<
chan <<
":";
817 nhits = 0;
819 } else if (nhits % 8 == 0) {
820 std::cout << "\n ";
821 }
822 ++nhits;
823 if (res1) {
824 std::cout <<
" U" << std::setw(4) <<
time;
825 } else {
826 std::cout <<
" " << std::setw(4) <<
time;
827 }
828 }
829 std::cout << std::endl;
830 break;
831 } else {
832
833 [[fallthrough]];
834 }
835 }
836
839 std::cout <<
"\nTile Beam ADC, " <<
size <<
" channels found";
840 } else {
841 std::cout <<
"\nBeam ADC 0x" << std::hex << std::setfill(
'0') << std::setw(2) <<
id <<
setupDec <<
", " <<
size <<
" channels found";
842 }
843 for (c = 0;
c <
size; ++
c) {
844 if (c % 8 == 0) std::cout <<
setupMod <<
c / 8 <<
":";
845 std::cout << std::setw(9) <<
data[
c];
846 }
847 std::cout << std::endl;
848 break;
849
851 std::cout <<
"\nMuon ADC, " <<
size <<
" channels found";
852 for (c = 0;
c <
size; ++
c) {
853 if (c % 8 == 0) std::cout <<
setupMod <<
c / 8 <<
":";
854 std::cout << std::setw(9) <<
data[
c];
855 }
856 std::cout << std::endl;
857 break;
858
860 std::cout <<
"\nMuon2 ADC, " <<
size <<
" channels found";
861 for (c = 0;
c <
size; ++
c) {
862 if (c % 8 == 0) std::cout <<
setupMod <<
c / 8 <<
":";
863 std::cout << std::setw(9) <<
data[
c];
864 }
865 std::cout << std::endl;
866 break;
867
871 std::cout<<
"\nLaser Pattern Unit, " <<
size <<
" words found (hex)";
872 } else {
873 std::cout<<
"\nCommon Pattern Unit, " <<
size <<
" words found (hex)";
874 }
875 for (c = 0;
c <
size; ++
c) {
876 if (c % 8 == 0) std::cout <<
setupMod <<
c/8 <<
":";
878 }
879 std::cout << std::endl;
880 break;
881
883
885 std::cout<<
"\nLASTROD Laser Object, " <<
size <<
" words found (hex)";
886 for (c = 0;
c <
size; ++
c) {
887 if (c % 8 == 0) std::cout <<
setupMod <<
c/8 <<
":";
889 }
890 std::cout<<std::endl<<std::endl;
891
893 std::cout<<"CRITICAL ERROR! Unknown format!"<<std::endl;
894 } else {
895 const unsigned int *
p;
896 int Counter = 0;
897 int Filter = 0, ReqAmp = 0, MeasAmp = 0, Delay = 0, TDC1 = 0, TDC2 = 0;
901 std::cout << " Laser Counter: " << std::setw(5) << Counter << std::endl;
902
903 if ((*p & 0xFF000000) == 0x20000000) {
904 ReqAmp = *
p & 0xFFFF;
905 if (version > 1) {
906 Filter = (((*
p >> 16) & 7) ^ 7) + 2;
907 if (Filter > 8)
Filter -= 8;
908 std::cout <<
" Filter Wheel: " << std::setw(5) <<
Filter << std::endl;
909 }
910 std::cout << " Required Amp: " << std::setw(5) << ReqAmp << std::endl;
911 } else {
912 std::cout << "ERROR in Laser Fragment: decoding word 14." << std::endl;
913 }
915
916 if ((*p & 0xFF000000) == 0x21000000) {
917 Delay = (*
p >> 12) & 0xFFF;
918 MeasAmp = *
p & 0xFFF;
919 std::cout << " Measured Amp: " << std::setw(5) << MeasAmp << std::endl;
920 std::cout << " Delay: " << std::setw(5) << Delay << std::endl;
921 } else {
922 std::cout << "ERROR in Laser Fragment: decoding word 15." << std::endl;
923 }
925
926 bool TDCPrint = true;
927
928 if ((*p & 0xFF000000) == 0x22000000) {
929 if (version == 1) {
930 TDC1 = (*
p >> 16) & 0xF;
931 TDC2 = (*
p >> 20) & 0xF;
932 } else {
934 }
935 } else {
936 std::cout << "ERROR in Laser Fragment: decoding word 16." << std::endl;
937 TDCPrint = false;
938 }
940 if ((*p & 0xFF000000) == 0x23000000) {
941 if (version == 1) {
942 TDC1 = (TDC1 << 12) + (*p & 0xFFF);
943 TDC2 = (TDC2 << 12) + ((*p >> 12) & 0xFFF);
944 } else {
946 }
947 } else {
948 std::cout << "ERROR in Laser Fragment: decoding word 17." << std::endl;
949 TDCPrint = false;
950 }
952 if (TDCPrint) {
953 std::cout << " TDC1 data: " << std::setw(5) << TDC1 << std::endl;
954 std::cout << " TDC2 data: " << std::setw(5) << TDC2 << std::endl;
955 }
956
957 int chan0 = 0,
chan1 = 0, chan2 = 0, chan3 = 0, chan4 = 0, chan5 = 0, chan6 = 0, chan7 = 0;
958
959 if ((*p & 0xFF000000) == 0x44000000) {
960 chan0 = (*
p & 0xFFF) ^ 0xFFF;
961 chan1 = ((*
p >> 12) & 0xFFF) ^ 0xFFF;
962 } else {
963 std::cout << "ERROR in Laser Fragment: decoding word 18." << std::endl;
964 }
966
967 if ((*p & 0xFF000000) == 0x45000000) {
968 chan2 = (*
p & 0xFFF) ^ 0xFFF;
969 chan3 = ((*
p >> 12) & 0xFFF) ^ 0xFFF;
970 } else {
971 std::cout << "ERROR in Laser Fragment: decoding word 19." << std::endl;
972 }
974
975 if ((*p & 0xFF000000) == 0x46000000) {
976 chan4 = (*
p & 0xFFF) ^ 0xFFF;
977 chan5 = ((*
p >> 12) & 0xFFF) ^ 0xFFF;
978 } else {
979 std::cout << "ERROR in Laser Fragment: decoding word 20." << std::endl;
980 }
982
983 if ((*p & 0xFF000000) == 0x47000000) {
984 chan6 = (*
p & 0xFFF) ^ 0xFFF;
985 chan7 = ((*
p >> 12) & 0xFFF) ^ 0xFFF;
986 } else {
987 std::cout << "ERROR in Laser Fragment: decoding word 21." << std::endl;
988 }
990
991 int diode1_Ped = 0, diode1_PedRMS = 0
992 , diode2_Ped = 0, diode2_PedRMS = 0
993 , diode3_Ped = 0, diode3_PedRMS = 0
994 , diode4_Ped = 0, diode4_PedRMS = 0
995 , PMT1_Ped = 0, PMT1_PedRMS = 0
996 , PMT2_Ped = 0, PMT2_PedRMS = 0;
997
998 diode1_Ped = (*
p >> 16) & 0xFFFF;
999 diode1_PedRMS = *
p & 0xFFFF;
1001
1002 diode2_Ped = (*
p >> 16) & 0xFFFF;
1003 diode2_PedRMS = *
p & 0xFFFF;
1005
1006 diode3_Ped = (*
p >> 16) & 0xFFFF;
1007 diode3_PedRMS = *
p & 0xFFFF;
1009
1010 diode4_Ped = (*
p >> 16) & 0xFFFF;
1011 diode4_PedRMS = *
p & 0xFFFF;
1013
1014 PMT1_Ped = (*
p >> 16) & 0xFFFF;
1015 PMT1_PedRMS = *
p & 0xFFFF;
1017
1018 PMT2_Ped = (*
p >> 16) & 0xFFFF;
1019 PMT2_PedRMS = *
p & 0xFFFF;
1021
1022 time_t Ped_Last_Run = *
p;
1024
1025 int diode1_alpha = 0, diode1_alphaRMS = 0
1026 , diode2_alpha = 0, diode2_alphaRMS = 0
1027 , diode3_alpha = 0, diode3_alphaRMS = 0
1028 , diode4_alpha = 0, diode4_alphaRMS = 0;
1029
1030 diode1_alpha = (*
p >> 16) & 0xFFFF;
1031 diode1_alphaRMS = *
p & 0xFFFF;
1033
1034 diode2_alpha = (*
p >> 16) & 0xFFFF;
1035 diode2_alphaRMS = *
p & 0xFFFF;
1037
1038 diode3_alpha = (*
p >> 16) & 0xFFFF;
1039 diode3_alphaRMS = *
p & 0xFFFF;
1041
1042 diode4_alpha = (*
p >> 16) & 0xFFFF;
1043 diode4_alphaRMS = *
p & 0xFFFF;
1045
1046 time_t Alpha_Last_Run = *
p;
1048
1049 time_t PedAlpha_Last_Run(0);
1050
1051 int diode1_PedAlpha = 0, diode1_PedAlphaRMS = 0
1052 , diode2_PedAlpha = 0, diode2_PedAlphaRMS = 0
1053 , diode3_PedAlpha = 0, diode3_PedAlphaRMS = 0
1054 , diode4_PedAlpha = 0, diode4_PedAlphaRMS = 0;
1055
1056 if (version > 1) {
1057 diode1_PedAlpha = (*
p >> 16) & 0xFFFF;
1058 diode1_PedAlphaRMS = *
p & 0xFFFF;
1060
1061 diode2_PedAlpha = (*
p >> 16) & 0xFFFF;
1062 diode2_PedAlphaRMS = *
p & 0xFFFF;
1064
1065 diode3_PedAlpha = (*
p >> 16) & 0xFFFF;
1066 diode3_PedAlphaRMS = *
p & 0xFFFF;
1068
1069 diode4_PedAlpha = (*
p >> 16) & 0xFFFF;
1070 diode4_PedAlphaRMS = *
p & 0xFFFF;
1072
1073 PedAlpha_Last_Run = *
p;
1075 }
1076
1077 std::cout << std::endl << " | ADC | Pedestal(RMS) | Alpha (RMS) | PedAlpha(RMS) |" << std::endl;
1078 if (version == 1){
1079 std::cout <<
" Diode 1 | " << std::setw(5) << chan0 <<
" | " <<
setupPr1 << diode1_Ped / 10.0 <<
" (" <<
setupPr2 << diode1_PedRMS / 100.0 <<
") | " <<
setupPr1 << diode1_alpha / 10.0 <<
" (" <<
setupPr2 << diode1_alphaRMS / 100.0 <<
") |" << std::endl;
1080 std::cout <<
" Diode 2 | " << std::setw(5) <<
chan1 <<
" | " <<
setupPr1 << diode2_Ped / 10.0 <<
" (" <<
setupPr2 << diode2_PedRMS / 100.0 <<
") | " <<
setupPr1 << diode2_alpha / 10.0 <<
" (" <<
setupPr2 << diode2_alphaRMS / 100.0 <<
") |" << std::endl;
1081 std::cout <<
" Diode 3 | " << std::setw(5) << chan2 <<
" | " <<
setupPr1 << diode3_Ped / 10.0 <<
" (" <<
setupPr2 << diode3_PedRMS / 100.0 <<
") | " <<
setupPr1 << diode3_alpha / 10.0 <<
" (" <<
setupPr2 << diode3_alphaRMS / 100.0 <<
") |" << std::endl;
1082 std::cout <<
" Diode 4 | " << std::setw(5) << chan3 <<
" | " <<
setupPr1 << diode4_Ped / 10.0 <<
" (" <<
setupPr2 << diode4_PedRMS / 100.0 <<
") | " <<
setupPr1 << diode4_alpha / 10.0 <<
" (" <<
setupPr2 << diode4_alphaRMS / 100.0 <<
") |" << std::endl;
1083 } else {
1084 std::cout <<
" Diode 1 | " << std::setw(5) << chan0 <<
" | " <<
setupPr1 << diode1_Ped / 10.0 <<
" (" <<
setupPr2 << diode1_PedRMS / 100.0 <<
") | " <<
setupPr1 << diode1_alpha / 10.0 <<
" (" <<
setupPr2 << diode1_alphaRMS / 100.0 <<
") | " <<
setupPr1 << diode1_PedAlpha / 10.0 <<
" (" <<
setupPr2 << diode1_PedAlphaRMS / 100.0 <<
") |" << std::endl;
1085 std::cout <<
" Diode 2 | " << std::setw(5) <<
chan1 <<
" | " <<
setupPr1 << diode2_Ped / 10.0 <<
" (" <<
setupPr2 << diode2_PedRMS / 100.0 <<
") | " <<
setupPr1 << diode2_alpha / 10.0 <<
" (" <<
setupPr2 << diode2_alphaRMS / 100.0 <<
") | " <<
setupPr1 << diode2_PedAlpha / 10.0 <<
" (" <<
setupPr2 << diode2_PedAlphaRMS / 100.0 <<
") |" << std::endl;
1086 std::cout <<
" Diode 3 | " << std::setw(5) << chan2 <<
" | " <<
setupPr1 << diode3_Ped / 10.0 <<
" (" <<
setupPr2 << diode3_PedRMS / 100.0 <<
") | " <<
setupPr1 << diode3_alpha / 10.0 <<
" (" <<
setupPr2 << diode3_alphaRMS / 100.0 <<
") | " <<
setupPr1 << diode3_PedAlpha / 10.0 <<
" (" <<
setupPr2 << diode3_PedAlphaRMS / 100.0 <<
") |" << std::endl;
1087 std::cout <<
" Diode 4 | " << std::setw(5) << chan3 <<
" | " <<
setupPr1 << diode4_Ped / 10.0 <<
" (" <<
setupPr2 << diode4_PedRMS / 100.0 <<
") | " <<
setupPr1 << diode4_alpha / 10.0 <<
" (" <<
setupPr2 << diode4_alphaRMS / 100.0 <<
") | " <<
setupPr1 << diode4_PedAlpha / 10.0 <<
" (" <<
setupPr2 << diode4_PedAlphaRMS / 100.0 <<
") |" << std::endl;
1088 }
1089
1090 std::cout <<
" PMT 1 | " << std::setw(5) << chan4 <<
" | " <<
setupPr1 << PMT1_Ped / 10.0 <<
" (" <<
setupPr2 << PMT1_PedRMS / 100.0 <<
") | x | x |" << std::endl;
1091 std::cout <<
" PMT 2 | " << std::setw(5) << chan5 <<
" | " <<
setupPr1 << PMT2_Ped / 10.0 <<
" (" <<
setupPr2 << PMT2_PedRMS / 100.0 <<
") | x | x |" << std::endl;
1092 std::cout << " InjChrg | " << std::setw(5) << chan6 << " | x | x | x |" << std::endl;
1093 std::cout << " Spare | " << std::setw(5) << chan7 << " | x | x | x |" << std::endl;
1094
1095 std::cout << std::endl << " | Date & Time (GMT) | Date & Time (CERN)" << std::endl;
1096
1097 struct tm TimeInfo;
1099 gmtime_r(&Ped_Last_Run, &TimeInfo);
1100 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1101
1102 std::cout <<
" Pedestal | " <<
buf <<
" | " <<
cern_local_time(Ped_Last_Run) << std::endl;
1103
1104 gmtime_r(&Alpha_Last_Run, &TimeInfo);
1105 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1106
1107 std::cout <<
" Alpha | " <<
buf <<
" | " <<
cern_local_time(Alpha_Last_Run) << std::endl;
1108
1109 gmtime_r(&PedAlpha_Last_Run, &TimeInfo);
1110 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1111
1112 std::cout <<
" PedAlpha | " <<
buf <<
" | " <<
cern_local_time(PedAlpha_Last_Run) << std::endl;
1113
1114 int diodeTemp = 0, secsDiodeT = 0
1115 , boxTemp = 0, secsBoxT = 0
1116 , boxHum = 0, secsBoxH = 0
1117 , gasFlow = 0, secsGasF = 0;
1118
1119 diodeTemp = *
p & 0xFFF;
1120 secsDiodeT = (*
p >> 12) & 0xFFFFF;
1122 boxTemp = *
p & 0xFFF;
1123 secsBoxT = (*
p >> 12) & 0xFFFFF;
1125 boxHum = *
p & 0xFFF;
1126 secsBoxH = (*
p >> 12) & 0xFFFFF;
1128 gasFlow = *
p & 0xFFF;
1129 secsGasF = (*
p >> 12) & 0xFFFFF;
1131
1132 std::cout << std::endl << " | Time | Value |" << std::endl;
1133 std::cout <<
" Laser diode temp | " << std::setw(7) << secsDiodeT <<
" | " <<
setupPr3 << diodeTemp / 10.0 <<
" |" << std::endl;
1134 std::cout <<
" Laser box temp | " << std::setw(7) << secsBoxT <<
" | " <<
setupPr3 << boxTemp / 10.0 <<
" |" << std::endl;
1135 std::cout <<
" Laser box humidity | " << std::setw(7) << secsBoxH <<
" | " <<
setupPr3 << boxHum / 10.0 <<
" |" << std::endl;
1136 std::cout <<
" Laser box gas flow | " << std::setw(7) << secsGasF <<
" | " <<
setupPr3 << gasFlow / 10.0 <<
" |" << std::endl;
1137
1138 std::bitset<32> PLCstatus = *
p;
1139 int PLCtime = (*
p >> 12) & 0xFFFFF;
1141
1142 int Alpha0 = PLCstatus[0];
1143 int Alpha1 = PLCstatus[1];
1144 int Alpha2 = PLCstatus[2];
1145 int LV = PLCstatus[3];
1146 int HV1 = PLCstatus[4];
1147 int HV2 = PLCstatus[5];
1148 int ShOpen = PLCstatus[6];
1149 int ShClose = PLCstatus[7];
1150 int Ilock = PLCstatus[8];
1151 int Alarm = PLCstatus[9];
1152 int Err = PLCstatus[11];
1153
1154 const char *YesNo[2] = {" No","Yes"};
1155 const char *OnOff[2] = {"Off"," On"};
1156
1157 std::cout << std::endl << " Time | Err | Alarm | Ilock | ShClose | ShOpen | HV2 | HV1 | LV | Alpha2 | Alpha1 | Alpha0 |"
1158 << std::endl << " " << std::setw(7) << PLCtime
1159 << " | " << YesNo[Err] << " | " << OnOff[Alarm] << " | " << OnOff[Ilock] << " | " << YesNo[ShClose]
1160 <<
" | " << YesNo[ShOpen] <<
" | " << OnOff[HV2] <<
" | " << OnOff[HV1] <<
" | " << OnOff[
LV]
1161 << " | " << OnOff[Alpha2] << " | " << OnOff[Alpha1] << " | " << OnOff[Alpha0] << " |" << std::endl;
1162
1163 if (p != &data[
size]) {
1164 std::cout << "CRITICAL ERROR! Wrong size" << std::endl;
1165 }
1166 }
1167 break;
1168 }
1169
1170
1172
1173 {
1174 std::cout<<
"\nLASTROD New Laser Object, " <<
size <<
" words found" << std::endl;
1175
1176 bool first_half_present = (
size == 25 ||
size == 26 ||
size == 128 ||
size == 129);
1177 bool second_half_present = (
size == 99 ||
size == 100 ||
size == 128 ||
size == 129);
1178
1179 if ( ! (first_half_present || second_half_present) ) {
1180 std::cout << "CRITICAL ERROR! Unknown format!" << std::endl;
1181 } else {
1182
1183 const char *
name[17] = {
" PhotoDiode 0",
1184 " PhotoDiode 1",
1185 " PhotoDiode 2",
1186 " PhotoDiode 3",
1187 " PhotoDiode 4",
1188 " PhotoDiode 5",
1189 " PhotoDiode 6",
1190 " PhotoDiode 7",
1191 " PhotoDiode 8",
1192 " PhotoDiode 9",
1193 " External CIS 0",
1194 " Internal CIS",
1195 " Diode Phocal",
1196 " External CIS 1",
1197 " PMT 0",
1198 " PMT 1",
1199 " TDC 1 & 0"
1200 };
1201
1202 time_t tim;
1203 struct tm TimeInfo;
1205
1206 const unsigned int *
p =
data;
1207
1208 if (first_half_present) {
1209
1210
1211
1212
1213
1214
1215
1216 std::cout << std::endl <<
" DAQ type: " << std::setw(5) << (
data[0]%0xFF) << std::endl;
1217 std::cout <<
" Laser Counter: " << std::setw(5) <<
data[1] << std::endl;
1218 std::cout <<
" Required Amp: " << std::setw(5) << (
data[2]>>16) << std::endl;
1219 std::cout <<
" Measured Amp: " << std::setw(5) << (
data[2]&0xFFFF) << std::endl;
1220 std::cout <<
" Filter Wheel: " << std::setw(5) << (
data[3]>>16 & 0x000F) << std::endl;
1221 std::cout <<
" Delay: " << std::setw(5) << (
data[3]&0xFFFF) << std::endl;
1222 std::cout <<
" Linearity DAC: " << std::setw(5) << (
data[4]&0xFFFF) << std::endl;
1223 std::cout << std::endl;
1224
1226
1227 std::cout << " HG LG" << std::endl;
1228 for (
int n=0;
n<17; ++
n) {
1229
1230 std::cout <<
name[
n] <<
": " << std::setw(5) << ((*p)&0xFFFF) << std::setw(6) << ((*p)>>16) <<
" => " << std::setw(5) << (8500-((*p)&0xFFFF)) << std::setw(6) << (8500-((*p)>>16))<< std::endl;
1232 }
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251 std::bitset<32>
status = *(
p++);
1252 const char *YesNo[2] = {" No","Yes"};
1253 std::cout << std::endl;
1254 std::cout << "| Link| Link| Bad | Bad | TTC | TTC | PLL | PLL |Laser|Laser|Inter| Comb| Busy| Long|" << std::endl;
1255 std::cout << "| not | not | VME | TTC |doubl|singl| lock| lock| temp| diod| lock| run | | busy|" << std::endl;
1256 std::cout << "| full| down|clock|clock|error|error| VME | TTC |fault| off |close| fini| |>5sec|" << std::endl;
1257 std::cout << "|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|" << std::endl;
1258 std::cout <<
"| " << YesNo[
status[27]] <<
" | " << YesNo[
status[26]] <<
" | " << YesNo[
status[24]] <<
" | " << YesNo[
status[22]] <<
" | " << YesNo[
status[20]] <<
" | " << YesNo[
status[19]] <<
" | " << YesNo[
status[16]] <<
" | " << YesNo[
status[15]] <<
" | " << YesNo[
status[10]] <<
" | " << YesNo[
status[9]] <<
" | " << YesNo[
status[8]] <<
" | " << YesNo[
status[6]] <<
" | " << YesNo[
status[1]] <<
" | " << YesNo[
status[0]] <<
" |" << std::endl;
1259
1260 std::cout << std::endl << " FPGA Global Status: 0x" << std::hex
1261 <<
status.to_ulong() <<
" => " <<
status.to_string() << std::dec << std::endl;
1263 gmtime_r(&tim, &TimeInfo);
1264 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1265 std::cout <<
"DCS Time Stamp (GMT): " <<
buf <<
" => " <<
cern_local_time(tim) << std::endl;
1266 std::cout <<
" PhotoDiode Polarity: " << std::setw(5) << (*
p++) << std::endl;
1268 }
1269
1270 if (second_half_present) {
1271 std::cout <<
" Calibration Type: " << std::setw(5) << (*
p++) << std::endl;
1273 gmtime_r(&tim, &TimeInfo);
1274 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1275 std::cout <<
" Time Stamp (GMT): " <<
buf <<
" => " <<
cern_local_time(tim) << std::endl;
1276
1277 double nevt =
double(p[96]);
1278 if (p[96]==0 || (p[96]==3072 && (*p)<21504000)) {
1279 std::cout <<
" Number of events: " <<
p[96] <<
" => assuming 1024" << std::endl << std::endl;
1280 nevt=1024.;
1281 } else {
1282 std::cout <<
" Number of events: " << std::setw(5) <<
p[96] << std::endl << std::endl;
1283 }
1284 std::cout << " pedHG rmsHG pedLG rmsLG" << std::endl;
1285 for (
int n=0;
n<16; ++
n) {
1286
1289
1296
1297
1298 double ped0 =
double(sum0)/nevt;
1299 double ped1 =
double(sum1)/nevt;
1300
1301 double rms0 =
double(ssq0)/nevt - ped0*ped0;
1302 double rms1 =
double(ssq1)/nevt - ped1*ped1;
1303 if (rms0>0.0) rms0 = sqrt(rms0);
1304 if (rms1>0.0) rms1 = sqrt(rms1);
1305
1306 std::cout <<
name[
n] <<
":" << std::setw(11) << sum0 << std::setw(11) << sum1 << std::setw(11) << msb0 << std::setw(11) << lsb0 << std::setw(11) << msb1 << std::setw(11) << lsb1 <<
" => " << std::setw(7) << std::setprecision(1) << 8500.-ped0 <<
" +/- " << std::setw(7) << std::setprecision(1) << rms0 <<
" " << std::setw(7) << std::setprecision(1) << 8500.-ped1 <<
" +/- " << std::setw(7) << std::setprecision(1) << rms1 << std::endl;
1307 }
1308 }
1309 }
1310 break;
1311 }
1312
1314 std::cout <<
"\nLaser ADC, " <<
size <<
" channels found";
1315 for (c = 0;
c <
size; ++
c) {
1316 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1317 std::cout << std::setw(9) <<
data[
c];
1318 }
1319 std::cout << std::endl;
1320 break;
1321
1323 std::cout <<
"\nECAL ADC, " <<
size <<
" channels found";
1324 for (c = 0;
c <
size; ++
c) {
1325 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1326 std::cout << std::setw(9) <<
data[
c];
1327 }
1328 std::cout << std::endl;
1329 break;
1330
1332 std::cout <<
"\nDigi parameters, " <<
size <<
" words found";
1333 for (c = 0;
c <
size; ++
c) {
1334 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1335 std::cout << std::setw(11) <<
data[
c];
1336 }
1337 std::cout << std::endl;
1338
1340 const unsigned int *
p =
data;
1341 int Counter = 0,
Mode = 0, Samples = 0, Pipeline = 0, I3Delay = 0,
Event = 0, Phase = 0,
1342 DAC = 0, Capacity = 0, Card = 0,
RunType = 0, microsec = 0;
1343 time_t Time;
1344 bool DefFormat = true;
1345 if (
size == 4) DefFormat =
false;
1346 if (!DefFormat) {
1351 } else {
1368 }
1369 const char *RunTypeText;
1370 switch (RunType) {
1371 case 1: RunTypeText = "Physics"; break;
1372 case 2: RunTypeText = "Laser"; break;
1373 case 4: RunTypeText = "Pedestals"; break;
1374 case 8: RunTypeText = "CIS mono"; break;
1375 case 16: RunTypeText = "CIS scan"; break;
1376 default: RunTypeText = "Unknown"; break;
1377 }
1378
1379 std::cout << "\n CIS Counter: " << std::setw(3) << Counter<< std::endl;
1380 std::cout <<
"\n Run Type: " << std::setw(3) <<
RunType <<
" (" << RunTypeText <<
")";
1381 if (!DefFormat) {
1382 std::cout << "\n Samples: " << std::setw(3) << Samples;
1383 std::cout << "\n Pipeline: " << std::setw(3) << Pipeline << std::endl;
1384 } else {
1385 const char* ModeText;
1386 switch (Mode) {
1387 case 0:
1388 ModeText = "Normal";
1389 break;
1390 case 1: ModeText = "Calibration"; break;
1391 default: ModeText = "Unknown"; break;
1392 }
1393
1394 struct tm TimeInfo;
1396 gmtime_r(&Time, &TimeInfo);
1397 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1398 std::cout << std::endl;
1400 std::cout << " Microsec.: " << microsec << std::endl << std::endl;
1401 std::cout <<
" Mode: " << std::setw(3) <<
Mode <<
" (" << ModeText <<
")" << std::endl;
1402 std::cout << " Samples: " << std::setw(3) << Samples << std::endl;
1403 std::cout << " Pipeline: " << std::setw(3) << Pipeline << std::endl;
1404 std::cout << " I3Delay: " << std::setw(3) << I3Delay << std::endl;
1405 std::cout <<
" Event: " << std::setw(3) <<
Event << std::endl;
1406 std::cout << " Phase: " << std::setw(3) << Phase << std::endl;
1407 std::cout << " DAC: " << std::setw(3) << DAC << std::endl;
1408 std::cout << " Capacity: " << std::setw(3) << Capacity << " pF" << std::endl;
1409 std::cout << " Card: " << std::setw(3) << Card << std::endl;
1410
1412 int last =
size - 1;
1413 for (; last > 15; --last) {
1414 if (data[last] != 0) break;
1415 }
1416 if (last > 15) {
1417 std::cout << "\n Remaing " << last - 15 << " non-zero words (hex):";
1418 for (c = 16;
c <= last; ++
c) {
1419 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1420 std::cout << std::hex << std::setw(11) <<
data[
c] << std::dec;
1421 }
1422 std::cout << std:: endl;
1423 }
1424 }
1425 }
1426 } else {
1427 std::cout << "CRITICAL ERROR! Unknown format!" << std::endl;
1428 }
1429 break;
1430
1432 std::cout <<
"\nAdder FADC, " <<
size <<
" words found (hex)" ;
1433 for (c = 0;
c <
size; ++
c) {
1434 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1435 std::cout << std::hex << std::setw(9) <<
data[
c] << std::dec;
1436 }
1437 std::cout << std::endl;
1438 break;
1439
1448 std::cout <<
"\nCoincidence trigger frag " <<
id -
COIN_TRIG1_FRAG + 1 <<
", " <<
size <<
" words found (hex)";
1449 for (c = 0;
c <
size; ++
c) {
1450 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1451 std::cout << std::hex << std::setw(11) <<
data[
c] << std::dec;
1452 }
1453 std::cout << std::endl;
1454 break;
1455
1456 default:
1457 std::cout <<
"\nUnknown fragment [0x" << std::hex <<
id << std::dec <<
"], " <<
size <<
" words found" << std::endl;
1458 break;
1459 }
1460 } else {
1461
1464 fragType = (*itr).second;
1465 } else {
1466 fragType = (id >> 8);
1467 if (fragType > 4 || fragType < 1) fragType = 2;
1468 }
1469
1470
1472
1473 int DQstat;
1474
1475 switch (type) {
1476 case 0:
1478 std::cout <<
"\nDigitizer fragment 0x" << std::hex <<
id << std::dec <<
", " <<
size <<
" words found:"
1479 <<
"\t" <<
nchan / 3 <<
" chips, " << nsamp <<
"+2 samples" << std::endl;
1480
1481 if (ngain == 1) {
1483 } else if (ngain == 2) {
1485 } else {
1487 }
1488
1489 if (version == 0x1 || version == 0x2) {
1490 std::cout <<
"\nfirst data word:" << std::setw(12) <<
data[0] <<
" (0x"<<
setup0 <<
data[0] <<
setupDec <<
")";
1492 }
1493
1494 if (extra > 0) {
1495 std::cout <<
"\n" << std::setw(3) <<
extra <<
" extra words:";
1498 if ((c -
size + extra) % 2 == 1 && c!=
size-1) std::cout <<
"\n ";
1499 }
1500 std::cout << std::endl;
1501 }
1502
1503 std::cout << "\nPMT Ch | BCID M G";
1504 for (s = 0;
s < nsamp; ++
s) {
1505 std::cout << std::setw(4) <<
s <<
" ";
1506 }
1507
1508 std::cout << " Head/Data/CRC\n---|---|-------------------------";
1509 for (s = 0;
s < nsamp; ++
s) {
1510 std::cout << "-----";
1511 }
1512
1513 {
1514 bool OK = true;
1517 if (extra == 0 && pmt < 0)
pmt = -
pmt;
1518
1519 if (pmt > 0) {
1520 std::cout <<
"\n" << std::setw(3) <<
pmt << std::setw(3) <<
ch <<
" |";
1521 } else {
1522 std::cout <<
"\n -- " << std::setw(2) <<
ch <<
" |";
1523 }
1524
1525 if (ch % 3 == 0) {
1526 std::cout << std::setw(5) << (
channel[
ch].bcid) << std::setw(2) << ((
channel[
ch].flag >> 3) & 3);
1527 } else {
1528 std::cout << " ";
1529 }
1530
1531 std::cout << std::setw(2) << (
channel[
ch].gain);
1532
1533 for (s = 0;
s < nsamp; ++
s) {
1534 std::cout << std::setw(5) << (
channel[
ch].sample[
s]);
1535 }
1536
1537 if (ch % 3 == 0) {
1538 if (channel[ch].
head != 0) {
1540 } else {
1542 }
1543 }
1544
1545 if (ch % 3 == 1) {
1546 if (channel[ch].first != 0) {
1548 } else {
1550 }
1551 }
1552
1553 if (ch % 3 == 2) {
1554 if (channel[ch].crc != 0) {
1556 } else {
1558 }
1559 }
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575 if (isFrag5) {
1576 bool chOK = true;
1577 for (
int i = 0;
i < 7;
i++) {
1578 if (Frag5Data[ch].s[i] != channel[ch].sample[i]) chOK = false;
1579 }
1580 if (!chOK) {
1581 std::cout << " RawERR ";
1583 std::cout << " | ";
1584 for (
int i = 0;
i < 7;
i++) {
1585 std::cout << std::setw(5) << Frag5Data[
ch].
s[
i] ;
1586 }
1587 }
1588 }
1589 }
1590 if (!OK) std::cout << "\nOF weights: ERROR";
1591 }
1592
1593 if (isFrag5) {
1594 std::cout << std::endl;
1595 bool OK = true;
1596 for (
int ch = 0;
ch < 48;
ch++) {
1597 bool chOK = true;
1598 for (
int i = 0;
i < 7;
i++) {
1599 if (Frag5Data[ch].s[i] != channel[ch].sample[i]) chOK = false;
1600 }
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612 if (Frag5Data[ch].gain != (int) channel[ch].gain) chOK = false;
1613 if (!chOK) {
1614 OK = false;
1615 std::cout <<
" " <<
ch <<
",";
1616 }
1617 }
1618 std::cout << "\nCompare Raw <=> Frag5: ";
1619 if (OK) {
1620 std::cout << "OK" << std::endl;
1621 } else {
1622 std::cout << "ERROR" << std::endl;
1623 }
1624 isFrag5 = false;
1625 }
1626 break;
1627
1628 case 1:
1630 std::cout <<
"\nRaw data compressed fragment 0x" << std::hex <<
id << std::dec <<
", " <<
size <<
" words found" << std::endl;
1632 break;
1633 }
1634
1635 std::cout <<
"\nRaw data compressed fragment 0x" << std::hex <<
id << std::dec <<
", " <<
size <<
" words found:"
1636 <<
"\t" <<
ngain <<
" gain, " <<
nchan <<
" channels in total" << std::endl;
1637
1638 std::cout << "\nPMT Ch |";
1639 for (
int j = 1;
j <= ((nsamp / 2) + 1);
j++) {
1640 std::cout <<
" HexWord" <<
j <<
" ";
1641 }
1642
1643 std::cout << "| G";
1644 for (
int l = 1;
l <= nsamp;
l++) {
1645 std::cout <<
" Smp" <<
l;
1646 }
1647
1649 int ch = rawcomp[
i].chan;
1651 if (pmt > 0) {
1652 std::cout <<
"\n" << std::setw(3) <<
pmt << std::setw(3) <<
ch <<
" |";
1653 } else {
1654 std::cout <<
"\n -- " << std::setw(2) <<
ch <<
" |";
1655 }
1656 std::cout << std::hex << std::setfill('0');
1657 for (
int j = 0;
j < ((nsamp / 2) + 1);
j++) {
1658 std::cout <<
" " << std::setw(8) << rawcomp[
i].words[
j] <<
" ";
1659 }
1660 std::cout <<
setupDec <<
"| " << rawcomp[
i].gain;
1661 for (
int l = 0;
l < nsamp;
l++) {
1662 std::cout << std::setw(6) << rawcomp[
i].samples[
l];
1663 }
1664 if (!rawcomp[i].verif) std::cout << " Wrong Data";
1665 }
1666 break;
1667
1668 case 2:
1670
1671 std::cout <<
"\nReco non calibrated energy fragment 0x" << std::hex <<
id << std::dec <<
", " <<
size <<
" words found:"
1672 <<
"\t" <<
ngain <<
" gain, " <<
nchan <<
" channels in total" << std::endl
1673 << "\tATTENTION: HIGH gain amplitude is divided by 64" << std::endl;
1674
1675 std::cout << "\nPMT Ch | full word | G amp time q amp time qual";
1678 if (pmt > 0) {
1679 std::cout <<
"\n" << std::setw(3) <<
pmt << std::setw(3) <<
ch <<
" |";
1680 } else {
1681 std::cout <<
"\n -- " << std::setw(2) <<
ch <<
" |";
1682 }
1684 << std::setw(1) << recochan[
ch].gain << std::setw(6) << recochan[
ch].amp << std::setw(5) << recochan[
ch].time
1685 << std::setw(3) << recochan[
ch].quality << std::setw(10) << std::setprecision(1) <<
float (recochan[ch].gain ? recochan[ch].d_amp / 64. : recochan[ch].d_amp)
1686 << std::setw(11) << std::setprecision(4) << (
float) recochan[ch].d_time << std::setw(8) << std::setprecision(1) << (
float) recochan[ch].d_quality;
1687 }
1688
1689 break;
1690
1691 case 4:
1694 &nchan);
1695
1696 std::cout <<
"\nReco calibrated energy fragment 0x" << std::hex <<
id << std::dec <<
", " <<
size <<
" words found:"
1697 <<
"\t" << ((
nchan > 48 &&
nchan < 96) ? 1 :
ngain) <<
" gain, " << unitName[
unit] <<
" units, " << nchan <<
" channels in total" << std::endl;
1698
1699 if (pulse < 3) {
1700 std::cout <<
"Reco flags: 0x" << std::hex << std::setfill(
'0') << rflag <<
setupDec <<
" units: " << unitName[
unit] <<
" pulse_shape: " << shapeName[pulse] <<
" nsamples: " << 7 + 2 * nsmpl <<
" algorithm: " <<
algName[algor + 1] <<
" niterations: " << niter << std::endl;
1701 } else {
1702 std::cout <<
"Reco flags: 0x" << std::hex << std::setfill(
'0') << rflag <<
setupDec <<
" units: " << unitName[
unit] <<
" pulse_shape: " << shapeName[pulse] <<
" nsamples: " << 7 + 2 * nsmpl <<
" algorithm: " <<
algName[algor * 4 + niter] << std::endl;
1703 }
1704
1705 std::cout << "\nPMT Ch | full word | G amp time b q amp time qual";
1708 if (pmt > 0) {
1709 std::cout <<
"\n" << std::setw(3) <<
pmt << std::setw(3) <<
ch <<
" |";
1710 } else {
1711 std::cout <<
"\n -- " << std::setw(2) <<
ch <<
" |";
1712 }
1713
1714 if (ch >= 48 && nchan < 96) {
1716 } else {
1717 std::cout <<
" 0x" <<
setup0 << recocalib[
ch].word <<
setupDec <<
" | " << std::setw(1) << recocalib[
ch].gain << std::setw(6) << recocalib[
ch].amp << std::setw(5) << recocalib[
ch].time << std::setw(2) << recocalib[
ch].bad << std::setw(3) << recocalib[
ch].quality << std::setw(10) << std::setprecision(1) << recocalib[
ch].d_amp << std::setw(11) << std::setprecision(4) << recocalib[
ch].d_time << std::setw(8) << std::setprecision(1) << recocalib[
ch].d_quality;
1718
1719 if (recocalib[ch].
bad != 0) {
1720 std::cout << " Bad channel";
1721 }
1722 }
1723 }
1724
1725 break;
1726
1727 case 5:
1728 {
1729 isFrag5 = true;
1733 OFC.clear();
1734
1735 std::cout <<
"\nFrag5 Compressed fragment 0x" << std::hex <<
id << std::dec <<
", " <<
size <<
" words found:"
1736 <<
"\t" << 1 <<
" gain, " << unitName[
unit] <<
" units, " <<
nchan <<
" channels in total" << std::endl;
1737
1739
1740 {
1743
1744 bool of2 = true;
1745 std::vector<double>
a(7),
b(7),
c(7),
g(7),
dg(7);
1746
1748 for (
int gain = 0;
gain < 2; ++
gain) {
1750 TileOfcWeightsStruct weights;
1751 if (
m_tileCondToolOfcCool->getOfcWeights(drawerIdx, ch, gain, phase, of2, weights, ctx).isFailure())
1752 {
1754 continue;
1755 }
1756
1758
1760
1761 for (
int i = 0;
i < 7; ++
i) {
1765 g[
i] = weights.
g[
i];
1767 }
1768
1770 , 0
1771 , calib
1772 , OFC, false );
1773
1774 }
1775 }
1776
1777 }
1778 ofw = &(OFC[0]);
1779
1780 int size_L2 = (*((
const uint32_t*) data - 3 + 2) >> (32 - 2 - 3)) & 0x7;
1781 std::cout << "size_L2: " << size_L2 << " |";
1782 if (size_L2 == 3) {
1783 double SumEt =
m_rc2bytes5.getSumEt((
const uint32_t*) data - 3);
1784 double SumEz =
m_rc2bytes5.getSumEz((
const uint32_t*) data - 3);
1785 double SumE =
m_rc2bytes5.getSumE((
const uint32_t*) data - 3);
1786 std::cout << " SumEt: " << SumEt << ", SumEz: " << SumEz << ", SumE: " << SumE << std::endl;
1787 }
1788 std::cout << std::endl;
1789
1790 m_rc2bytes5.unpack(ofw, (uint32_t*) data - 3, Frag5Data);
1791
1792#define code_ped4 TileRawChannel2Bytes5::code_ped4
1793#define code_ped5 TileRawChannel2Bytes5::code_ped5
1794#define code_amp5 TileRawChannel2Bytes5::code_amp5
1795#define code_amp6 TileRawChannel2Bytes5::code_amp6
1796#define code_raws TileRawChannel2Bytes5::code_raws
1797#define code_rawf TileRawChannel2Bytes5::code_rawf
1798#define code_full TileRawChannel2Bytes5::code_full
1799#define code_dump TileRawChannel2Bytes5::code_dump
1800#define code_null TileRawChannel2Bytes5::code_null
1801
1802 int cnt_ped4, cnt_ped5, cnt_amp5, cnt_amp6, cnt_raws, cnt_rawf, cnt_full, cnt_dump, cnt_null;
1803 cnt_ped4 = cnt_ped5 = cnt_amp5 = cnt_amp6 = cnt_raws = cnt_rawf = cnt_full = cnt_dump = cnt_null = 0;
1804 std::cout << "PMT Ch | full word | Type G B ectrl ereco ebin ene time | s1 s2 s3 s4 s5 s6 s7";
1805
1806 const char *strcode_empty = "----";
1807 const char *strcode_ped4 = "ped4";
1808 const char *strcode_ped5 = "ped5";
1809 const char *strcode_amp5 = "amp5";
1810 const char *strcode_amp6 = "amp6";
1811 const char *strcode_raws = "raws";
1812 const char *strcode_rawf = "rawf";
1813 const char *strcode_full = "full";
1814 const char *strcode_dump = "dump";
1815 const char *strcode_null = "null";
1816 const char *strcode_error = "ERR ";
1817
1818 bool OK = true;
1821 if (pmt > 0) {
1822 std::cout <<
"\n" << std::setw(3) <<
pmt << std::setw(3) <<
ch <<
" |";
1823 } else {
1824 std::cout <<
"\n -- " << std::setw(2) <<
ch <<
" |";
1825 }
1826
1828 const char *scode = strcode_empty;
1833 float ene = Frag5Data[
ch].
ene;
1836 for (
int i = 0;
i < 7;
i++) {
1837 s[
i] = Frag5Data[
ch].
s[
i];
1838 }
1839
1840 switch (code) {
1841 case code_ped4: scode = strcode_ped4; cnt_ped4++;
break;
1842 case code_ped5: scode = strcode_ped5; cnt_ped5++;
break;
1843 case code_amp5: scode = strcode_amp5; cnt_amp5++;
break;
1844 case code_amp6: scode = strcode_amp6; cnt_amp6++;
break;
1845 case code_raws: scode = strcode_raws; cnt_raws++;
break;
1846 case code_rawf: scode = strcode_rawf; cnt_rawf++;
break;
1847 case code_full: scode = strcode_full; cnt_full++;
break;
1848 case code_dump: scode = strcode_dump; cnt_dump++;
break;
1849 case code_null: scode = strcode_null; cnt_null++;
break;
1850 default: scode = strcode_error; break;
1851 }
1852
1853 int ene_recobin = ene_bin + (
gain == 0 ? 512 : 2048);
1854 switch (code) {
1857 ene_bin += 256;
1858 break;
1863 ene_bin += (
gain == 0 ? 512 : 2048);
1864 break;
1865 }
1866
1868 if (ene_ctrl < 0) {
1869 ene_ctrl = 0;
1870 } else if (ene_ctrl > 0x7FFF) {
1871 ene_ctrl = 0x7FFF;
1872 }
1873
1875
1876 switch (code) {
1882 std::cout << std::setw(7) << ene_ctrl << std::setw(7) << ene_recobin << std::setw(6) << ene_bin << std::setw(10) << std::setprecision(4) << ene << " -- ";
1883 break;
1886 std::cout << std::setw(7) << ene_ctrl << std::setw(7) << ene_recobin << std::setw(6) << ene_bin << std::setw(10) << std::setprecision(4) << ene << std::setw(6) << std::setprecision(1) <<
time <<
" ";
1887 break;
1890 std::cout << " ----- ----- ---- --- -- ";
1891 break;
1892 default:;
1893 }
1894
1895 std::cout <<
"| " << std::setw(4) <<
s[0] << std::setw(5) <<
s[1] << std::setw(5) <<
s[2] << std::setw(5) <<
s[3] << std::setw(5) <<
s[4] << std::setw(5) <<
s[5] << std::setw(5) <<
s[6] <<
" " ;
1896 if (ene_ctrl != ene_recobin) {
1897 OK = false;
1898 std::cout << " ERR";
1899 }
1900 }
1901
1902 std::cout << "\n\nFrag5 Self-Consistency: ";
1903 if (OK) {
1904 std::cout << "OK" << std::endl;
1905 } else {
1906 std::cout << "ERROR" << std::endl;
1907 }
1908
1909 std::cout << "\nped4" << cnt_ped4 << ", ped5 " << cnt_ped5 << ", amp5 " << cnt_amp5 << ", amp6 " << cnt_amp6 << ", raws " << cnt_raws << ", rawf " << cnt_rawf << ", full " << cnt_full << ", dump " << cnt_dump << ", null " << cnt_null << std::endl;
1910
1911 break;
1912 }
1913
1914 case 6:
1915 {
1916 std::cout <<
"\nFELIX fragment 0x" << std::hex <<
id << std::dec <<
", " <<
size <<
" words found" << std::endl;
1918
1920 std::cout << std::hex << std::endl;
1921 bool phase2format = (
size>
head && correct_data[2] == 0x12345678 && correct_data[
size-1] == 0x87654321);
1922 if (phase2format) {
1923 int thisVersion = (((correct_data[3] >> 16) & 0xFFFF) == 0) ? 1 : 0;
1924 const char * namesV0[] = { "size_packet", "elink", "SOP", "runParam1", "runParam2", "runParam3", "runParam4", "BC_MD_ID", "L1ID" };
1925 const char * namesV1[] = { "size_packet", "elink", "SOP", "version", "MODULE_BC_MD", "L1ID", "BCR" , "runParam1", "runParam2", "runParam3"};
1926 const char **
names = (thisVersion) ? namesV1 : namesV0;
1927 if (thisVersion)
head = 10;
1928 for (
int i=0;
i<
head; ++
i) {
1929 std::cout << std::setw(13) <<
names[
i] << std::setw(10) << correct_data[
i] << std::endl;
1930 }
1931 } else {
1933 for (
int i=0;
i<
head; ++
i) {
1934 std::cout <<
" Word" << std::setw(3) <<
i << std::setw(10) << correct_data[
i] << std::endl;
1935 }
1936 }
1937 std::cout << std::dec << std::endl;
1938 FelixData_t digitsHighGain, digitsLowGain, digitsMetaData;
1939 unpack_frag6(correct_data.data(),
size, digitsHighGain, digitsLowGain, digitsMetaData);
1940
1941 std::cout << " MD1 MD2 MD3 MD4" << std::endl;
1942 std::cout << "-----------------------------------------------------";
1943 const char * metaNamesV0[] = { "BCID", "L1ID", "ModuleID", "RunType", "RunNumber", "PedHi", "PedLo", "ChargeInj", "TimeInj", "Capacitor", "ECR" };
1944 const char * metaNamesV1[] = { "BCID", "L1ID", "ModuleID", "RunType", "RunNumber", "PedHi", "PedLo", "ChargeInj", "TimeInj", "Capacitor", "ECR", "BCR", "Version", "FragID" };
1945 const char ** metaNames = (
version) ? metaNamesV1 : metaNamesV0;
1946 for (
size_t i = 0;
i < digitsMetaData.size(); ++
i) {
1947 std::cout << std::endl << std::setw(13) << metaNames[
i];
1948 for (
size_t j = 0;
j<digitsMetaData[
i].size(); ++
j) {
1949 std::cout << std::setw(10) << digitsMetaData[
i][
j];
1950 }
1951 }
1952 std::cout << std::endl << std::endl;
1953
1954 size_t nsamp = 7;
1955 if (digitsLowGain[0].
size()>0)
1956 nsamp = std::max(nsamp,digitsLowGain[0].
size());
1957 if (digitsHighGain[0].
size()>0)
1958 nsamp =std::max(nsamp,digitsHighGain[0].
size());
1959
1960 std::cout << " ch G ";
1961 for (
size_t s = 0;
s < nsamp; ++
s) {
1962 std::cout << std::setw(5) <<
s;
1963 }
1964 std::string
a(8+nsamp*5,
'-');
1965 std::cout << std::endl <<
a;
1966
1967 for (
size_t ch = 0;
ch < digitsHighGain.size() ; ++
ch) {
1968 std::cout << std::endl << std::setw(3) <<
ch <<
" HG ";
1969 for (
size_t s = 0;
s < digitsHighGain[
ch].size(); ++
s) {
1970 std::cout << std::setw(5) << (digitsHighGain[
ch][
s]);
1971 }
1972 }
1973
1974 for (
size_t ch = 0;
ch < digitsLowGain.size() ; ++
ch) {
1975 std::cout << std::endl << std::setw(3) <<
ch <<
" LG ";
1976 for (
size_t s = 0;
s < digitsLowGain[
ch].size(); ++
s) {
1977 std::cout << std::setw(5) << (digitsLowGain[
ch][
s]);
1978 }
1979 }
1980 std::cout << std::endl << std::endl;
1981
1982 break;
1983 }
1984
1985 case 0xA:
1987
1988 std::cout <<
"\nQuality fragment 0x" << std::hex <<
id <<
", " << std::dec <<
size <<
" words found:" << std::endl;
1989
1990 if (DQstat) {
1991 std::cout << " ATTENTION: Error bits found in the Data Quality fragment 0xA" << std::endl;
1992 }
1993
1994 std::cout << " --------------------------------------" << std::endl;
1995 std::cout << " | Quality Block | Word (16bit)" << std::endl;
1996 if (DQword.dspbcid >> 15) {
1997 std::cout << " | DSP BCID | " << std::dec << (DQword.dspbcid & 0x7FFF) << std::endl;
1998 } else {
1999 std::cout << " | DSP BCID | not filled (" << std::dec << DQword.dspbcid << ")" << std::endl;
2000 }
2001 std::cout << " | Global CRC | " << std::hex << "0x" << std::setw(1) << DQword.global_crc << std::setfill('0') << std::endl;
2002 std::cout <<
" | BCID checks | " <<
setup0x4 << DQword.bcid << std::endl;
2003 std::cout <<
" | Mem parity err | " <<
setup0x4 << DQword.memory << std::endl;
2004 std::cout <<
" | Single strobe err | " <<
setup0x4 << DQword.Sstrobe << std::endl;
2005 std::cout <<
" | Double strobe err | " <<
setup0x4 << DQword.Dstrobe << std::endl;
2006 std::cout <<
" | Head format err | " <<
setup0x4 << DQword.headformat << std::endl;
2007 std::cout <<
" | Head parity err | " <<
setup0x4 << DQword.headparity << std::endl;
2008 std::cout <<
" | Sample format err | " <<
setup0x4 << DQword.sampleformat << std::endl;
2009 std::cout <<
" | Sample parity err | " <<
setup0x4 << DQword.sampleparity << std::endl;
2010 std::cout <<
" | FE chip mask err | " <<
setup0x4 << DQword.fe_chip_mask << std::endl;
2011 std::cout <<
" | ROD chip mask err | " <<
setup0x4 << DQword.rod_chip_mask << std::endl;
2012 std::cout << " --------------------------------------" << std::setfill(' ') << std::dec << std::endl;
2013 break;
2014
2015 default:
2016 std::cout <<
"\nUnknown (type " <<
type <<
") fragment 0x" << std::hex <<
id <<
", " << std::dec <<
size <<
" words found" << std::endl;
2018 }
2019 std::cout << std::endl;
2020 } else {
2021 std::cout <<
"\nType " <<
type <<
" fragment 0x" << std::hex <<
id <<
", " << std::dec <<
size <<
" words found" << std::endl;
2022 std::cout << "\nEmpty Event" << std::endl;
2023 }
2024 }
2025 }
2026}
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
bool Format6(const std::vector< double > &a, const std::vector< double > &b, const std::vector< double > &c, const std::vector< double > &g, const std::vector< double > &h, unsigned int channel_index, int phase, double calibration, std::vector< unsigned int > &OFC, bool verbose)
Format6.
#define Frag5_unpack_bin2sum(unit, amp_bin)
unpack_bin2sum
std::string cern_local_time(time_t unix_time)
std::ostream & setupPr1(std::ostream &stream)
std::ostream & setup0(std::ostream &stream)
std::ostream & setupPr2(std::ostream &stream)
std::ostream & setup0x4(std::ostream &stream)
std::ostream & setupMod(std::ostream &stream)
std::ostream & setupDec(std::ostream &stream)
std::ostream & setupPr3(std::ostream &stream)
static unsigned int getDrawerIdxFromFragId(unsigned int fragId)
Returns a drawer hash from fragId This function assumes drawer context (i.e.
int tile_unpack_digi(const T_RodDataFrag *frag, T_TileDigiChannel *channel, int nchannel_max, unsigned int version, int verbosity, int *ngain, int *nchannel, int *nsample)
void find_frag(const uint32_t *rod, unsigned int size, unsigned int version, int verbosity, const T_RodDataFrag *frag[], int &nfrag)
int tile_unpack_raw_comp(const T_RodDataFrag *frag, T_TileRawComp *rawcomp, int nchannel_max, unsigned int version, int verbosity, int *ngain, int *nchannel, int *nsample)
int tile_unpack_quality(const T_RodDataFrag *frag, T_TileRecoQuality &DQword)
void unpack_frag6(const uint32_t *data, unsigned int size, FelixData_t &digitsHighGain, FelixData_t &digitsLowGain, FelixData_t &digitsMetaData) const
std::vector< uint32_t > get_correct_data(const uint32_t *p, unsigned int size) const
std::vector< std::vector< unsigned int > > FelixData_t
std::map< unsigned int, unsigned int, std::less< unsigned int > > m_drawerMap
int tile_unpack_reco(const T_RodDataFrag *frag, T_TileRecoChannel *channel, int nchannel_max, unsigned int version, int verbosity, int *ngain, int *nchannel)
std::map< unsignedint, unsignedint, std::less< unsignedint > >::iterator drawerMap_iterator
void dump_data(const uint32_t *data, unsigned int size, unsigned int version, int verbosity)
TileRawChannel2Bytes5 m_rc2bytes5
int tile_unpack_reco_calib(const T_RodDataFrag *frag, T_TileRecoCalib *recocalib, int nchannel_max, unsigned int version, unsigned int unit, int verbosity, int *ngain, int *nchannel)
std::string head(std::string s, const std::string &pattern)
head of a string
int count(std::string s, const std::string ®x)
count how many occurances of a regx are in a string
time(flags, cells_name, *args, **kw)
l
Printing final latex table to .tex output file.
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)
const std::string & algName(ID id)
Converts a JetAlgorithmType::ID into a string.
setEventNumber setTimeStamp bcid