508 {
509
510 int s,
c,
f, nfrag,
ngain,
nchan, nsamp, size,
ch,
extra = 0,
pmt, fragType, nhits = 0;
511 int id,
type, rflag,
unit, pulse, nsmpl, algor, niter;
512 const unsigned int*
data;
514 char fr[2] = {
'F',
'R' };
515 char gb[2] = { 'G', 'B' };
516 std::string unitName[4] = { "ADC count", "pCb", "Cs pCb", "MeV" };
517 std::string shapeName[4] = { "Phys", "Laser", "CIS", "Simul" };
518 std::string
algName[8] = {
"Unknown",
"OF1",
"OF2",
"Fit",
"ManyAmps",
"Flat",
"Alg6",
"Alg7" };
519 boost::io::ios_base_all_saver coutsave(std::cout);
520
527
528 bool isFrag5 = false;
530 std::vector<unsigned int> OFC;
531
532 TileRawChannel2Bytes5::TileChanData Frag5Data[48];
533
534 bool beamROD = (subdet_id == 0x50 || subdet_id >= 0x60);
535 if (subdet_id >= 0x60) {
537
538 } else {
540 }
541
542 find_frag(roddata, rodsize, version, verbosity, frag.data(), nfrag);
543
544 if (verbosity > 9) return;
545
546 for (f = 0;
f < nfrag; ++
f) {
547
548 id = frag[
f]->id & 0xFFFF;
549 type = (frag[
f]->id >> 16) & 0xFF;
550 rflag = (frag[
f]->id) >> 24;
551 unit = (rflag & 0xC0) >> 6;
552 pulse = (rflag & 0x30) >> 4;
553 nsmpl = (rflag & 0x08) >> 3;
554 algor = (rflag & 0x04) >> 2;
555 niter = (rflag & 0x03);
557 data = frag[
f]->data;
558
559 if (type==0x40 || type==0x41 || type==0x42){
560
561 const unsigned char *
adc;
562 const unsigned short *
result;
563 int tmdb_ch1 = std::min(5U,((robsourceid)>>16)&0xF);
564 bool EB = (tmdb_ch1>2);
566 int tmdb_ch2 = (((robsourceid))&0xF)*nmod;
567 const char * dr56EB[10] = { "D5-L","D5-R","D6-L","D6-R","D4-L","D4-R","XX-X","XX-X","XX-X","XX-X" };
568 const char * dr56LB[10] = { "D0-x","D1-L","D1-R","D2-L","D2-R","D3-L","D3-R","B8-L","B8-R","XX-X" };
569 const char ** dr56rl = (
EB) ? dr56EB : dr56LB;
570 const char * ch11[6] = { "AUX","LBA","LBC","EBA","EBC","UNK" };
571 const char * ch12[6] = { "aux","lba","lbc","eba","ebc","unk" };
572 const char * dr56hlEB[4] = {" D6L "," D6H "," D56L"," D56H"};
573 const char * dr56hlLB[4] = {" DxL "," DxH "," DxxL"," DxxH"};
574
575 const char * dr56thEB[4] = {" D5 "," D6 "," D56 ", "BCID "};
576 const char * dr56thLB[4] = {" Dx "," Dy "," Dxy ", "BCID "};
577 const char ** dr56th = (
m_runPeriod < 3) ? (EB ? dr56hlEB : dr56hlLB)
578 : (
EB ? dr56thEB : dr56thLB);
579
580 const char *
tit[4] = {
"TMDB digits",
"TMDB energy",
"TMDB decision",
"Unknown"};
581
582 std::cout << std::hex << std::endl <<
tit[
type&3] <<
" fragment 0x" <<
type <<
" vers 0x"<<
id <<
", "
583 << std::dec << size << " words found"<< std::endl << std::endl;
584
585 int nchmod = 4;
586 int nsamp = 7;
587 int nch = 32;
588 int ntd = (
EB) ? 3 : 1;
589 int ntdl = (
EB) ? 9 : 5;
591 switch (type) {
592
593 case 0x40:
594
595 nch=4*size/nsamp;
597 std::cout << "ch cell ";
598 for (int ind=nsamp; ind>0; --ind) {
599 std::cout << " S"<<ind;
600 }
601 std::cout << std::endl;
602 adc =
reinterpret_cast<const unsigned char *
>(
data);
603 for (int pword=0;pword<nch;++pword) {
604 int pword1=pword%nchmod;
605 if (!EB && nchmod==8) {
607 if (pword1==0) pword1=9;
608 else pword1 -= 1;
609 } else {
610 if (pword1>6) pword1=9;
611 }
612 } else {
613 if (pword1>9) pword1=9;
614 }
615 std::cout << std::setw(2) << pword <<
" | " << ch11[tmdb_ch1] <<std::setfill(
'0')<<std::setw(2) <<tmdb_ch2+
count
616 << "-" <<std::setfill(' ')<<std::setw(4)<<dr56rl[pword1];
617 for (int ind=nsamp-1; ind>-1; --ind) {
618 std::cout <<
" | " << std::setw(3) << (
static_cast<unsigned>(
adc[pword+nch*ind]) );
619 }
620 std::cout << std::endl;
621 if ((pword+1)%nchmod==0)
count+=1;
622 }
623 break;
624
625 case 0x41:
626 nch = size;
628 std::cout << "ch cell energy" << std::endl;
629 for (int pword=0;pword<size;++pword) {
630 int pword1=pword%nchmod;
631 if (!EB && nchmod==8) {
633 if (pword1==0) pword1=9;
634 else pword1 -= 1;
635 } else {
636 if (pword1>6) pword1=9;
637 }
638 } else {
639 if (pword1>9) pword1=9;
640 }
641 std::cout << std::setw(2) << pword<<
" | " << ch11[tmdb_ch1] <<std::setfill(
'0')<<std::setw(2) <<tmdb_ch2+
count
642 << "-" <<std::setfill(' ')<<std::setw(4)<<dr56rl[pword1]
643 <<
" | "<< std::setw(6) <<
static_cast<int>(
data[pword])
644 << std::endl;
645 if ((pword+1)%nchmod==0)
count+=1;
646 }
647 break;
648
649 case 0x42:
650 {
651 std::cout << "nn name TMDB SL_Board SL_Trigger_Sector "
652 << dr56th[3] << dr56th[2] << dr56th[1] << dr56th[0] << std::endl;
653 result =
reinterpret_cast<const unsigned short *
>(
data);
654 if (size != 2) ntd = size * 2;
656 int tmdb = (tmdb_ch2) / 8 + 1;
657 int slb =
tmdb * 3 - 1;
658 std::string tmdb_name =
"TM0" + (
EB ? std::to_string(tmdb) :
"X");
659 for (int pword = 0; pword < ntd; ++pword) {
660 count = (
EB) ? pword * 3 : pword * 4 + 1;
661 unsigned short r =
result[pword];
663 int slts1 = slb * 2 - 2;
664 int slts2 = slts1 + 1;
665 std::string slt_sectors = " - ";
666 if (EB) {
667 std::stringstream slts12;
668 slts12 << std::setfill(' ') << std::setw(2) << slts1 << "-"
669 << std::setfill(' ') << std::setw(2) << std::left << slts2;
670 slt_sectors = slts12.str();
671 }
672 std::stringstream slb_name;
673 slb_name <<
"SL_E" << std::setfill(
'0') << std::setw(2) << (
EB ? std::to_string(slb) :
"XX");
674 for(int pqword = 0; pqword < 4; ++pqword){
675 std::cout << std::setw(2) << pqword + pword * 4 << " | "
676 << ((
count > 0 &&
count < ntdl) ? ch11[tmdb_ch1] : ch12[tmdb_ch1])
677 << std::setfill(
'0') << std::setw(2) << tmdb_ch2 +
count
678 << std::setfill(' ') << std::setw(6) << tmdb_name
679 << std::setfill(' ') << std::setw(10) << slb_name.str()
680 << std::setfill(' ') << std::setw(15) << slt_sectors
681 << std::setfill(
' ') << std::setw(11) << ((
m_runPeriod < 3) ? ((
r >> 3) & 1) :
bcid)
682 << std::setw(5) << ((
r >> 2) & 1) << std::setw(5) << ((
r >> 1) & 1) << std::setw(5) << (
r & 1) << std::endl;
685 }
686 ++slb;
687 if (slb > 24) slb = 1;
688 }
689 }
690 break;
691 default:
693 }
694
695 } else if (id < 0x100 || beamROD) {
696 id &= 0xFF;
697
698 switch (id) {
699
703 if ((type == 0x1) || (type == 0x2)) {
704 bool isLastChannelEOB = ((
data[size - 1] >> 24) & 0x7) == 0x4;
706 std::cout << "\nBeam ToF TDC, ";
707 } else {
708 std::cout <<
"\nBeam TDC 0x" << std::setfill(
'0') << std::hex << std::setw(2) <<
id <<
setupDec <<
", ";
709 }
710 std::cout << (isLastChannelEOB ? size - 1 : size) << " hits found";
711 prev = 0xFF;
712 for (c = 0;
c < size; ++
c) {
714 unsigned short res1 = (
data[
c] >> 13) & 0x1;
715
717 : (
data[
c] >> 16) & 0x7FF;
718
719 if (chan > 31) {
720 int wordType = (
data[
c] >> 24) & 0x7;
721 if (wordType == 0x2) {
722 std::cout <<
"\n header, " << ((
data[
c] >> 8) & 0x3F) <<
" channels";
723 } else if (wordType == 0x4) {
724 std::cout <<
"\n end of block, event counter: " << (
data[
c] & 0xFFFFFF) << std::endl;
725 } else {
726 std::cout <<
"\n unknown word: 0x" << std::hex <<
data[
c] << std::dec << std::endl;
727 }
728 continue;
729 }
730 if (prev != chan) {
731 std::cout <<
"\n ch" << std::setw(3) <<
chan <<
":";
732 nhits = 0;
734 } else if (nhits % 8 == 0) {
735 std::cout << "\n ";
736 }
737 ++nhits;
738 if (res1) {
739 std::cout <<
" U" << std::setw(4) <<
time;
740 } else {
741 std::cout <<
" " << std::setw(4) <<
time;
742 }
743 }
744 std::cout << std::endl;
745
746 break;
747 } else {
748
749 [[fallthrough]];
750 }
751 }
752
754 std::cout <<
"\nBeam TDC 0x" << std::setfill(
'0') << std::hex << std::setw(2) <<
id <<
setupDec <<
", " << size <<
" hits found";
755 prev = 0xFF;
756 for (c = 0;
c < size; ++
c) {
762
763
764
765 if (prev != chan) {
766 std::cout <<
"\n ch" << std::setw(3) <<
chan <<
":";
767 nhits = 0;
769 } else if (nhits % 8 == 0) {
770 std::cout << "\n ";
771 }
772 ++nhits;
774 std::cout <<
" " << gb[
bad] <<
fr[edge] << std::setw(6) <<
time;
775 } else {
776 std::cout <<
" " <<
fr[edge] << std::setw(6) <<
time;
777 }
778 }
779 std::cout << std::endl;
780 break;
781
784 if ((type == 0x1) || (type == 0x2)) {
785 bool isLastChannelEOB = ((
data[size - 1] >> 24) & 0x7) == 0x4;
786 std::cout << "\nBeam ADC, " << (isLastChannelEOB ? size - 1 : size) << " hits found";
787 prev = 0xFF;
788 for (c = 0;
c < size; ++
c) {
790 unsigned short res1 = (
data[
c] >> 13) & 0x1;
792 : (
data[
c] >> 16) & 0x7FF;
793
794 if (chan > 31) {
795 int wordType = (
data[
c] >> 24) & 0x7;
796 if (wordType == 0x2) {
797 std::cout <<
"\n header, " << ((
data[
c] >> 8) & 0x3F) <<
" channels";
798 } else if (wordType == 0x4) {
799 std::cout <<
"\n end of block, event counter: " << (
data[
c] & 0xFFFFFF) << std::endl;
800 } else {
801 std::cout <<
"\n unknown word: 0x" << std::hex <<
data[
c] << std::dec << std::endl;
802 }
803 continue;
804 }
805 if (prev != chan) {
806 std::cout <<
"\n ch" << std::setw(3) <<
chan <<
":";
807 nhits = 0;
809 } else if (nhits % 8 == 0) {
810 std::cout << "\n ";
811 }
812 ++nhits;
813 if (res1) {
814 std::cout <<
" U" << std::setw(4) <<
time;
815 } else {
816 std::cout <<
" " << std::setw(4) <<
time;
817 }
818 }
819 std::cout << std::endl;
820 break;
821 } else {
822
823 [[fallthrough]];
824 }
825 }
826
829 std::cout << "\nTile Beam ADC, " << size << " channels found";
830 } else {
831 std::cout <<
"\nBeam ADC 0x" << std::hex << std::setfill(
'0') << std::setw(2) <<
id <<
setupDec <<
", " << size <<
" channels found";
832 }
833 for (c = 0;
c < size; ++
c) {
834 if (c % 8 == 0) std::cout <<
setupMod <<
c / 8 <<
":";
835 std::cout << std::setw(9) <<
data[
c];
836 }
837 std::cout << std::endl;
838 break;
839
841 std::cout << "\nMuon ADC, " << size << " channels found";
842 for (c = 0;
c < size; ++
c) {
843 if (c % 8 == 0) std::cout <<
setupMod <<
c / 8 <<
":";
844 std::cout << std::setw(9) <<
data[
c];
845 }
846 std::cout << std::endl;
847 break;
848
850 std::cout << "\nMuon2 ADC, " << size << " channels found";
851 for (c = 0;
c < size; ++
c) {
852 if (c % 8 == 0) std::cout <<
setupMod <<
c / 8 <<
":";
853 std::cout << std::setw(9) <<
data[
c];
854 }
855 std::cout << std::endl;
856 break;
857
861 std::cout<<"\nLaser Pattern Unit, " << size << " words found (hex)";
862 } else {
863 std::cout<<"\nCommon Pattern Unit, " << size << " words found (hex)";
864 }
865 for (c = 0;
c < size; ++
c) {
866 if (c % 8 == 0) std::cout <<
setupMod <<
c/8 <<
":";
868 }
869 std::cout << std::endl;
870 break;
871
873
874 if (size !=25 && size != 26) {
875 std::cout<<"\nLASTROD Laser Object, " << size << " words found (hex)";
876 for (c = 0;
c < size; ++
c) {
877 if (c % 8 == 0) std::cout <<
setupMod <<
c/8 <<
":";
879 }
880 std::cout<<std::endl<<std::endl;
881
882 if (size != 31) {
883 std::cout<<"CRITICAL ERROR! Unknown format!"<<std::endl;
884 } else {
885 const unsigned int *
p;
886 int Counter = 0;
887 int Filter = 0, ReqAmp = 0, MeasAmp = 0, Delay = 0, TDC1 = 0, TDC2 = 0;
891 std::cout << " Laser Counter: " << std::setw(5) << Counter << std::endl;
892
893 if ((*p & 0xFF000000) == 0x20000000) {
894 ReqAmp = *
p & 0xFFFF;
895 if (version > 1) {
896 Filter = (((*
p >> 16) & 7) ^ 7) + 2;
897 if (Filter > 8)
Filter -= 8;
898 std::cout <<
" Filter Wheel: " << std::setw(5) <<
Filter << std::endl;
899 }
900 std::cout << " Required Amp: " << std::setw(5) << ReqAmp << std::endl;
901 } else {
902 std::cout << "ERROR in Laser Fragment: decoding word 14." << std::endl;
903 }
905
906 if ((*p & 0xFF000000) == 0x21000000) {
907 Delay = (*
p >> 12) & 0xFFF;
908 MeasAmp = *
p & 0xFFF;
909 std::cout << " Measured Amp: " << std::setw(5) << MeasAmp << std::endl;
910 std::cout << " Delay: " << std::setw(5) << Delay << std::endl;
911 } else {
912 std::cout << "ERROR in Laser Fragment: decoding word 15." << std::endl;
913 }
915
916 bool TDCPrint = true;
917
918 if ((*p & 0xFF000000) == 0x22000000) {
919 if (version == 1) {
920 TDC1 = (*
p >> 16) & 0xF;
921 TDC2 = (*
p >> 20) & 0xF;
922 } else {
924 }
925 } else {
926 std::cout << "ERROR in Laser Fragment: decoding word 16." << std::endl;
927 TDCPrint = false;
928 }
930 if ((*p & 0xFF000000) == 0x23000000) {
931 if (version == 1) {
932 TDC1 = (TDC1 << 12) + (*p & 0xFFF);
933 TDC2 = (TDC2 << 12) + ((*p >> 12) & 0xFFF);
934 } else {
936 }
937 } else {
938 std::cout << "ERROR in Laser Fragment: decoding word 17." << std::endl;
939 TDCPrint = false;
940 }
942 if (TDCPrint) {
943 std::cout << " TDC1 data: " << std::setw(5) << TDC1 << std::endl;
944 std::cout << " TDC2 data: " << std::setw(5) << TDC2 << std::endl;
945 }
946
947 int chan0 = 0,
chan1 = 0, chan2 = 0, chan3 = 0, chan4 = 0, chan5 = 0, chan6 = 0, chan7 = 0;
948
949 if ((*p & 0xFF000000) == 0x44000000) {
950 chan0 = (*
p & 0xFFF) ^ 0xFFF;
951 chan1 = ((*
p >> 12) & 0xFFF) ^ 0xFFF;
952 } else {
953 std::cout << "ERROR in Laser Fragment: decoding word 18." << std::endl;
954 }
956
957 if ((*p & 0xFF000000) == 0x45000000) {
958 chan2 = (*
p & 0xFFF) ^ 0xFFF;
959 chan3 = ((*
p >> 12) & 0xFFF) ^ 0xFFF;
960 } else {
961 std::cout << "ERROR in Laser Fragment: decoding word 19." << std::endl;
962 }
964
965 if ((*p & 0xFF000000) == 0x46000000) {
966 chan4 = (*
p & 0xFFF) ^ 0xFFF;
967 chan5 = ((*
p >> 12) & 0xFFF) ^ 0xFFF;
968 } else {
969 std::cout << "ERROR in Laser Fragment: decoding word 20." << std::endl;
970 }
972
973 if ((*p & 0xFF000000) == 0x47000000) {
974 chan6 = (*
p & 0xFFF) ^ 0xFFF;
975 chan7 = ((*
p >> 12) & 0xFFF) ^ 0xFFF;
976 } else {
977 std::cout << "ERROR in Laser Fragment: decoding word 21." << std::endl;
978 }
980
981 int diode1_Ped = 0, diode1_PedRMS = 0
982 , diode2_Ped = 0, diode2_PedRMS = 0
983 , diode3_Ped = 0, diode3_PedRMS = 0
984 , diode4_Ped = 0, diode4_PedRMS = 0
985 , PMT1_Ped = 0, PMT1_PedRMS = 0
986 , PMT2_Ped = 0, PMT2_PedRMS = 0;
987
988 diode1_Ped = (*
p >> 16) & 0xFFFF;
989 diode1_PedRMS = *
p & 0xFFFF;
991
992 diode2_Ped = (*
p >> 16) & 0xFFFF;
993 diode2_PedRMS = *
p & 0xFFFF;
995
996 diode3_Ped = (*
p >> 16) & 0xFFFF;
997 diode3_PedRMS = *
p & 0xFFFF;
999
1000 diode4_Ped = (*
p >> 16) & 0xFFFF;
1001 diode4_PedRMS = *
p & 0xFFFF;
1003
1004 PMT1_Ped = (*
p >> 16) & 0xFFFF;
1005 PMT1_PedRMS = *
p & 0xFFFF;
1007
1008 PMT2_Ped = (*
p >> 16) & 0xFFFF;
1009 PMT2_PedRMS = *
p & 0xFFFF;
1011
1012 time_t Ped_Last_Run = *
p;
1014
1015 int diode1_alpha = 0, diode1_alphaRMS = 0
1016 , diode2_alpha = 0, diode2_alphaRMS = 0
1017 , diode3_alpha = 0, diode3_alphaRMS = 0
1018 , diode4_alpha = 0, diode4_alphaRMS = 0;
1019
1020 diode1_alpha = (*
p >> 16) & 0xFFFF;
1021 diode1_alphaRMS = *
p & 0xFFFF;
1023
1024 diode2_alpha = (*
p >> 16) & 0xFFFF;
1025 diode2_alphaRMS = *
p & 0xFFFF;
1027
1028 diode3_alpha = (*
p >> 16) & 0xFFFF;
1029 diode3_alphaRMS = *
p & 0xFFFF;
1031
1032 diode4_alpha = (*
p >> 16) & 0xFFFF;
1033 diode4_alphaRMS = *
p & 0xFFFF;
1035
1036 time_t Alpha_Last_Run = *
p;
1038
1039 time_t PedAlpha_Last_Run(0);
1040
1041 int diode1_PedAlpha = 0, diode1_PedAlphaRMS = 0
1042 , diode2_PedAlpha = 0, diode2_PedAlphaRMS = 0
1043 , diode3_PedAlpha = 0, diode3_PedAlphaRMS = 0
1044 , diode4_PedAlpha = 0, diode4_PedAlphaRMS = 0;
1045
1046 if (version > 1) {
1047 diode1_PedAlpha = (*
p >> 16) & 0xFFFF;
1048 diode1_PedAlphaRMS = *
p & 0xFFFF;
1050
1051 diode2_PedAlpha = (*
p >> 16) & 0xFFFF;
1052 diode2_PedAlphaRMS = *
p & 0xFFFF;
1054
1055 diode3_PedAlpha = (*
p >> 16) & 0xFFFF;
1056 diode3_PedAlphaRMS = *
p & 0xFFFF;
1058
1059 diode4_PedAlpha = (*
p >> 16) & 0xFFFF;
1060 diode4_PedAlphaRMS = *
p & 0xFFFF;
1062
1063 PedAlpha_Last_Run = *
p;
1065 }
1066
1067 std::cout << std::endl << " | ADC | Pedestal(RMS) | Alpha (RMS) | PedAlpha(RMS) |" << std::endl;
1068 if (version == 1){
1069 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;
1070 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;
1071 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;
1072 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;
1073 } else {
1074 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;
1075 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;
1076 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;
1077 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;
1078 }
1079
1080 std::cout <<
" PMT 1 | " << std::setw(5) << chan4 <<
" | " <<
setupPr1 << PMT1_Ped / 10.0 <<
" (" <<
setupPr2 << PMT1_PedRMS / 100.0 <<
") | x | x |" << std::endl;
1081 std::cout <<
" PMT 2 | " << std::setw(5) << chan5 <<
" | " <<
setupPr1 << PMT2_Ped / 10.0 <<
" (" <<
setupPr2 << PMT2_PedRMS / 100.0 <<
") | x | x |" << std::endl;
1082 std::cout << " InjChrg | " << std::setw(5) << chan6 << " | x | x | x |" << std::endl;
1083 std::cout << " Spare | " << std::setw(5) << chan7 << " | x | x | x |" << std::endl;
1084
1085 std::cout << std::endl << " | Date & Time (GMT) | Date & Time (CERN)" << std::endl;
1086
1087 struct tm TimeInfo;
1089 gmtime_r(&Ped_Last_Run, &TimeInfo);
1090 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1091
1092 std::cout <<
" Pedestal | " <<
buf <<
" | " <<
cern_local_time(Ped_Last_Run) << std::endl;
1093
1094 gmtime_r(&Alpha_Last_Run, &TimeInfo);
1095 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1096
1097 std::cout <<
" Alpha | " <<
buf <<
" | " <<
cern_local_time(Alpha_Last_Run) << std::endl;
1098
1099 gmtime_r(&PedAlpha_Last_Run, &TimeInfo);
1100 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1101
1102 std::cout <<
" PedAlpha | " <<
buf <<
" | " <<
cern_local_time(PedAlpha_Last_Run) << std::endl;
1103
1104 int diodeTemp = 0, secsDiodeT = 0
1105 , boxTemp = 0, secsBoxT = 0
1106 , boxHum = 0, secsBoxH = 0
1107 , gasFlow = 0, secsGasF = 0;
1108
1109 diodeTemp = *
p & 0xFFF;
1110 secsDiodeT = (*
p >> 12) & 0xFFFFF;
1112 boxTemp = *
p & 0xFFF;
1113 secsBoxT = (*
p >> 12) & 0xFFFFF;
1115 boxHum = *
p & 0xFFF;
1116 secsBoxH = (*
p >> 12) & 0xFFFFF;
1118 gasFlow = *
p & 0xFFF;
1119 secsGasF = (*
p >> 12) & 0xFFFFF;
1121
1122 std::cout << std::endl << " | Time | Value |" << std::endl;
1123 std::cout <<
" Laser diode temp | " << std::setw(7) << secsDiodeT <<
" | " <<
setupPr3 << diodeTemp / 10.0 <<
" |" << std::endl;
1124 std::cout <<
" Laser box temp | " << std::setw(7) << secsBoxT <<
" | " <<
setupPr3 << boxTemp / 10.0 <<
" |" << std::endl;
1125 std::cout <<
" Laser box humidity | " << std::setw(7) << secsBoxH <<
" | " <<
setupPr3 << boxHum / 10.0 <<
" |" << std::endl;
1126 std::cout <<
" Laser box gas flow | " << std::setw(7) << secsGasF <<
" | " <<
setupPr3 << gasFlow / 10.0 <<
" |" << std::endl;
1127
1128 std::bitset<32> PLCstatus = *
p;
1129 int PLCtime = (*
p >> 12) & 0xFFFFF;
1131
1132 int Alpha0 = PLCstatus[0];
1133 int Alpha1 = PLCstatus[1];
1134 int Alpha2 = PLCstatus[2];
1135 int LV = PLCstatus[3];
1136 int HV1 = PLCstatus[4];
1137 int HV2 = PLCstatus[5];
1138 int ShOpen = PLCstatus[6];
1139 int ShClose = PLCstatus[7];
1140 int Ilock = PLCstatus[8];
1141 int Alarm = PLCstatus[9];
1142 int Err = PLCstatus[11];
1143
1144 const char *YesNo[2] = {" No","Yes"};
1145 const char *OnOff[2] = {"Off"," On"};
1146
1147 std::cout << std::endl << " Time | Err | Alarm | Ilock | ShClose | ShOpen | HV2 | HV1 | LV | Alpha2 | Alpha1 | Alpha0 |"
1148 << std::endl << " " << std::setw(7) << PLCtime
1149 << " | " << YesNo[Err] << " | " << OnOff[Alarm] << " | " << OnOff[Ilock] << " | " << YesNo[ShClose]
1150 <<
" | " << YesNo[ShOpen] <<
" | " << OnOff[HV2] <<
" | " << OnOff[HV1] <<
" | " << OnOff[
LV]
1151 << " | " << OnOff[Alpha2] << " | " << OnOff[Alpha1] << " | " << OnOff[Alpha0] << " |" << std::endl;
1152
1153 if (p != &
data[size]) {
1154 std::cout << "CRITICAL ERROR! Wrong size" << std::endl;
1155 }
1156 }
1157 break;
1158 }
1159
1160
1162
1163 {
1164 std::cout<<"\nLASTROD New Laser Object, " << size << " words found" << std::endl;
1165
1166 bool first_half_present = (size == 25 || size == 26 || size == 128 || size == 129);
1167 bool second_half_present = (size == 99 || size == 100 || size == 128 || size == 129);
1168
1169 if ( ! (first_half_present || second_half_present) ) {
1170 std::cout << "CRITICAL ERROR! Unknown format!" << std::endl;
1171 } else {
1172
1173 const char *
name[17] = {
" PhotoDiode 0",
1174 " PhotoDiode 1",
1175 " PhotoDiode 2",
1176 " PhotoDiode 3",
1177 " PhotoDiode 4",
1178 " PhotoDiode 5",
1179 " PhotoDiode 6",
1180 " PhotoDiode 7",
1181 " PhotoDiode 8",
1182 " PhotoDiode 9",
1183 " External CIS 0",
1184 " Internal CIS",
1185 " Diode Phocal",
1186 " External CIS 1",
1187 " PMT 0",
1188 " PMT 1",
1189 " TDC 1 & 0"
1190 };
1191
1192 time_t tim;
1193 struct tm TimeInfo;
1195
1196 const unsigned int *
p =
data;
1197
1198 if (first_half_present) {
1199
1200
1201
1202
1203
1204
1205
1206 std::cout << std::endl <<
" DAQ type: " << std::setw(5) << (
data[0]%0xFF) << std::endl;
1207 std::cout <<
" Laser Counter: " << std::setw(5) <<
data[1] << std::endl;
1208 std::cout <<
" Required Amp: " << std::setw(5) << (
data[2]>>16) << std::endl;
1209 std::cout <<
" Measured Amp: " << std::setw(5) << (
data[2]&0xFFFF) << std::endl;
1210 std::cout <<
" Filter Wheel: " << std::setw(5) << (
data[3]>>16 & 0x000F) << std::endl;
1211 std::cout <<
" Delay: " << std::setw(5) << (
data[3]&0xFFFF) << std::endl;
1212 std::cout <<
" Linearity DAC: " << std::setw(5) << (
data[4]&0xFFFF) << std::endl;
1213 std::cout << std::endl;
1214
1216
1217 std::cout << " HG LG" << std::endl;
1218 for (
int n=0;
n<17; ++
n) {
1219
1220 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;
1222 }
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241 std::bitset<32>
status = *(
p++);
1242 const char *YesNo[2] = {" No","Yes"};
1243 std::cout << std::endl;
1244 std::cout << "| Link| Link| Bad | Bad | TTC | TTC | PLL | PLL |Laser|Laser|Inter| Comb| Busy| Long|" << std::endl;
1245 std::cout << "| not | not | VME | TTC |doubl|singl| lock| lock| temp| diod| lock| run | | busy|" << std::endl;
1246 std::cout << "| full| down|clock|clock|error|error| VME | TTC |fault| off |close| fini| |>5sec|" << std::endl;
1247 std::cout << "|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|" << std::endl;
1248 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;
1249
1250 std::cout << std::endl << " FPGA Global Status: 0x" << std::hex
1251 <<
status.to_ulong() <<
" => " <<
status.to_string() << std::dec << std::endl;
1253 gmtime_r(&tim, &TimeInfo);
1254 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1255 std::cout <<
"DCS Time Stamp (GMT): " <<
buf <<
" => " <<
cern_local_time(tim) << std::endl;
1256 std::cout <<
" PhotoDiode Polarity: " << std::setw(5) << (*
p++) << std::endl;
1258 }
1259
1260 if (second_half_present) {
1261 std::cout <<
" Calibration Type: " << std::setw(5) << (*
p++) << std::endl;
1263 gmtime_r(&tim, &TimeInfo);
1264 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1265 std::cout <<
" Time Stamp (GMT): " <<
buf <<
" => " <<
cern_local_time(tim) << std::endl;
1266
1267 double nevt =
double(p[96]);
1268 if (p[96]==0 || (p[96]==3072 && (*p)<21504000)) {
1269 std::cout <<
" Number of events: " <<
p[96] <<
" => assuming 1024" << std::endl << std::endl;
1270 nevt=1024.;
1271 } else {
1272 std::cout <<
" Number of events: " << std::setw(5) <<
p[96] << std::endl << std::endl;
1273 }
1274 std::cout << " pedHG rmsHG pedLG rmsLG" << std::endl;
1275 for (
int n=0;
n<16; ++
n) {
1276
1279
1286
1287
1288 double ped0 =
double(sum0)/nevt;
1289 double ped1 =
double(sum1)/nevt;
1290
1291 double rms0 =
double(ssq0)/nevt - ped0*ped0;
1292 double rms1 =
double(ssq1)/nevt - ped1*ped1;
1293 if (rms0>0.0) rms0 = sqrt(rms0);
1294 if (rms1>0.0) rms1 = sqrt(rms1);
1295
1296 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;
1297 }
1298 }
1299 }
1300 break;
1301 }
1302
1304 std::cout << "\nLaser ADC, " << size << " channels found";
1305 for (c = 0;
c < size; ++
c) {
1306 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1307 std::cout << std::setw(9) <<
data[
c];
1308 }
1309 std::cout << std::endl;
1310 break;
1311
1313 std::cout << "\nECAL ADC, " << size << " channels found";
1314 for (c = 0;
c < size; ++
c) {
1315 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1316 std::cout << std::setw(9) <<
data[
c];
1317 }
1318 std::cout << std::endl;
1319 break;
1320
1322 std::cout << "\nDigi parameters, " << size << " words found";
1323 for (c = 0;
c < size; ++
c) {
1324 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1325 std::cout << std::setw(11) <<
data[
c];
1326 }
1327 std::cout << std::endl;
1328
1329 if (size == 4 || size == 16 || size == 110) {
1330 const unsigned int *
p =
data;
1331 int Counter = 0,
Mode = 0, Samples = 0, Pipeline = 0, I3Delay = 0,
Event = 0, Phase = 0,
1332 DAC = 0, Capacity = 0, Card = 0,
RunType = 0, microsec = 0;
1333 time_t Time;
1334 bool DefFormat = true;
1335 if (size == 4) DefFormat = false;
1336 if (!DefFormat) {
1341 } else {
1358 }
1359 const char *RunTypeText;
1360 switch (RunType) {
1361 case 1: RunTypeText = "Physics"; break;
1362 case 2: RunTypeText = "Laser"; break;
1363 case 4: RunTypeText = "Pedestals"; break;
1364 case 8: RunTypeText = "CIS mono"; break;
1365 case 16: RunTypeText = "CIS scan"; break;
1366 default: RunTypeText = "Unknown"; break;
1367 }
1368
1369 std::cout << "\n CIS Counter: " << std::setw(3) << Counter<< std::endl;
1370 std::cout <<
"\n Run Type: " << std::setw(3) <<
RunType <<
" (" << RunTypeText <<
")";
1371 if (!DefFormat) {
1372 std::cout << "\n Samples: " << std::setw(3) << Samples;
1373 std::cout << "\n Pipeline: " << std::setw(3) << Pipeline << std::endl;
1374 } else {
1375 const char* ModeText;
1376 switch (Mode) {
1377 case 0:
1378 ModeText = "Normal";
1379 break;
1380 case 1: ModeText = "Calibration"; break;
1381 default: ModeText = "Unknown"; break;
1382 }
1383
1384 struct tm TimeInfo;
1386 gmtime_r(&Time, &TimeInfo);
1387 strftime(buf, 80, "%d.%m.%Y %H:%M:%S", &TimeInfo);
1388 std::cout << std::endl;
1390 std::cout << " Microsec.: " << microsec << std::endl << std::endl;
1391 std::cout <<
" Mode: " << std::setw(3) <<
Mode <<
" (" << ModeText <<
")" << std::endl;
1392 std::cout << " Samples: " << std::setw(3) << Samples << std::endl;
1393 std::cout << " Pipeline: " << std::setw(3) << Pipeline << std::endl;
1394 std::cout << " I3Delay: " << std::setw(3) << I3Delay << std::endl;
1395 std::cout <<
" Event: " << std::setw(3) <<
Event << std::endl;
1396 std::cout << " Phase: " << std::setw(3) << Phase << std::endl;
1397 std::cout << " DAC: " << std::setw(3) << DAC << std::endl;
1398 std::cout << " Capacity: " << std::setw(3) << Capacity << " pF" << std::endl;
1399 std::cout << " Card: " << std::setw(3) << Card << std::endl;
1400
1401 if (size > 16) {
1402 int last = size - 1;
1403 for (; last > 15; --last) {
1404 if (
data[last] != 0)
break;
1405 }
1406 if (last > 15) {
1407 std::cout << "\n Remaing " << last - 15 << " non-zero words (hex):";
1408 for (c = 16;
c <= last; ++
c) {
1409 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1410 std::cout << std::hex << std::setw(11) <<
data[
c] << std::dec;
1411 }
1412 std::cout << std:: endl;
1413 }
1414 }
1415 }
1416 } else {
1417 std::cout << "CRITICAL ERROR! Unknown format!" << std::endl;
1418 }
1419 break;
1420
1422 std::cout << "\nAdder FADC, " << size << " words found (hex)" ;
1423 for (c = 0;
c < size; ++
c) {
1424 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1425 std::cout << std::hex << std::setw(9) <<
data[
c] << std::dec;
1426 }
1427 std::cout << std::endl;
1428 break;
1429
1438 std::cout <<
"\nCoincidence trigger frag " <<
id -
COIN_TRIG1_FRAG + 1 <<
", " << size <<
" words found (hex)";
1439 for (c = 0;
c < size; ++
c) {
1440 if (c % 8 == 0) std::cout <<
setupMod <<
c/8<<
":";
1441 std::cout << std::hex << std::setw(11) <<
data[
c] << std::dec;
1442 }
1443 std::cout << std::endl;
1444 break;
1445
1446 default:
1447 std::cout << "\nUnknown fragment [0x" << std::hex << id << std::dec << "], " << size << " words found" << std::endl;
1448 break;
1449 }
1450 } else {
1451
1454 fragType = (*itr).second;
1455 } else {
1456 fragType = (id >> 8);
1457 if (fragType > 4 || fragType < 1) fragType = 2;
1458 }
1459
1460
1461 if (size > 0) {
1462
1463 int DQstat;
1464
1465 switch (type) {
1466 case 0:
1468 std::cout << "\nDigitizer fragment 0x" << std::hex << id << std::dec << ", " << size << " words found:"
1469 <<
"\t" <<
nchan / 3 <<
" chips, " << nsamp <<
"+2 samples" << std::endl;
1470
1471 if (ngain == 1) {
1473 } else if (ngain == 2) {
1474 extra = size -
nchan / 2 * (2 * nsamp + 3) / 3;
1475 } else {
1477 }
1478
1479 if (version == 0x1 || version == 0x2) {
1480 std::cout <<
"\nfirst data word:" << std::setw(12) <<
data[0] <<
" (0x"<<
setup0 <<
data[0] <<
setupDec <<
")";
1482 }
1483
1484 if (extra > 0) {
1485 std::cout <<
"\n" << std::setw(3) <<
extra <<
" extra words:";
1486 for (c = size - extra;
c < size; ++
c) {
1488 if ((c - size + extra) % 2 == 1 && c!=size-1) std::cout << "\n ";
1489 }
1490 std::cout << std::endl;
1491 }
1492
1493 std::cout << "\nPMT Ch | BCID M G";
1494 for (s = 0;
s < nsamp; ++
s) {
1495 std::cout << std::setw(4) <<
s <<
" ";
1496 }
1497
1498 std::cout << " Head/Data/CRC\n---|---|-------------------------";
1499 for (s = 0;
s < nsamp; ++
s) {
1500 std::cout << "-----";
1501 }
1502
1503 {
1504 bool OK = true;
1507 if (extra == 0 && pmt < 0)
pmt = -
pmt;
1508
1509 if (pmt > 0) {
1510 std::cout <<
"\n" << std::setw(3) <<
pmt << std::setw(3) <<
ch <<
" |";
1511 } else {
1512 std::cout <<
"\n -- " << std::setw(2) <<
ch <<
" |";
1513 }
1514
1515 if (ch % 3 == 0) {
1516 std::cout << std::setw(5) << (
channel[
ch].bcid) << std::setw(2) << ((
channel[
ch].flag >> 3) & 3);
1517 } else {
1518 std::cout << " ";
1519 }
1520
1521 std::cout << std::setw(2) << (
channel[
ch].gain);
1522
1523 for (s = 0;
s < nsamp; ++
s) {
1524 std::cout << std::setw(5) << (
channel[
ch].sample[
s]);
1525 }
1526
1527 if (ch % 3 == 0) {
1528 if (channel[ch].
head != 0) {
1530 } else {
1532 }
1533 }
1534
1535 if (ch % 3 == 1) {
1536 if (channel[ch].first != 0) {
1538 } else {
1540 }
1541 }
1542
1543 if (ch % 3 == 2) {
1544 if (channel[ch].crc != 0) {
1546 } else {
1548 }
1549 }
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565 if (isFrag5) {
1566 bool chOK = true;
1567 for (
int i = 0;
i < 7;
i++) {
1568 if (Frag5Data[ch].s[i] != channel[ch].sample[i]) chOK = false;
1569 }
1570 if (!chOK) {
1571 std::cout << " RawERR ";
1573 std::cout << " | ";
1574 for (
int i = 0;
i < 7;
i++) {
1575 std::cout << std::setw(5) << Frag5Data[
ch].
s[
i] ;
1576 }
1577 }
1578 }
1579 }
1580 if (!OK) std::cout << "\nOF weights: ERROR";
1581 }
1582
1583 if (isFrag5) {
1584 std::cout << std::endl;
1585 bool OK = true;
1586 for (
int ch = 0;
ch < 48;
ch++) {
1587 bool chOK = true;
1588 for (
int i = 0;
i < 7;
i++) {
1589 if (Frag5Data[ch].s[i] != channel[ch].sample[i]) chOK = false;
1590 }
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602 if (Frag5Data[ch].gain != (int) channel[ch].gain) chOK = false;
1603 if (!chOK) {
1604 OK = false;
1605 std::cout <<
" " <<
ch <<
",";
1606 }
1607 }
1608 std::cout << "\nCompare Raw <=> Frag5: ";
1609 if (OK) {
1610 std::cout << "OK" << std::endl;
1611 } else {
1612 std::cout << "ERROR" << std::endl;
1613 }
1614 isFrag5 = false;
1615 }
1616 break;
1617
1618 case 1:
1620 std::cout << "\nRaw data compressed fragment 0x" << std::hex << id << std::dec << ", " << size << " words found" << std::endl;
1622 break;
1623 }
1624
1625 std::cout << "\nRaw data compressed fragment 0x" << std::hex << id << std::dec << ", " << size << " words found:"
1626 <<
"\t" <<
ngain <<
" gain, " <<
nchan <<
" channels in total" << std::endl;
1627
1628 std::cout << "\nPMT Ch |";
1629 for (int j = 1; j <= ((nsamp / 2) + 1); j++) {
1630 std::cout << " HexWord" << j << " ";
1631 }
1632
1633 std::cout << "| G";
1634 for (
int l = 1;
l <= nsamp;
l++) {
1635 std::cout <<
" Smp" <<
l;
1636 }
1637
1639 int ch = rawcomp[
i].chan;
1641 if (pmt > 0) {
1642 std::cout <<
"\n" << std::setw(3) <<
pmt << std::setw(3) <<
ch <<
" |";
1643 } else {
1644 std::cout <<
"\n -- " << std::setw(2) <<
ch <<
" |";
1645 }
1646 std::cout << std::hex << std::setfill('0');
1647 for (int j = 0; j < ((nsamp / 2) + 1); j++) {
1648 std::cout <<
" " << std::setw(8) << rawcomp[
i].words[j] <<
" ";
1649 }
1650 std::cout <<
setupDec <<
"| " << rawcomp[
i].gain;
1651 for (
int l = 0;
l < nsamp;
l++) {
1652 std::cout << std::setw(6) << rawcomp[
i].samples[
l];
1653 }
1654 if (!rawcomp[i].verif) std::cout << " Wrong Data";
1655 }
1656 break;
1657
1658 case 2:
1660
1661 std::cout << "\nReco non calibrated energy fragment 0x" << std::hex << id << std::dec << ", " << size << " words found:"
1662 <<
"\t" <<
ngain <<
" gain, " <<
nchan <<
" channels in total" << std::endl
1663 << "\tATTENTION: HIGH gain amplitude is divided by 64" << std::endl;
1664
1665 std::cout << "\nPMT Ch | full word | G amp time q amp time qual";
1668 if (pmt > 0) {
1669 std::cout <<
"\n" << std::setw(3) <<
pmt << std::setw(3) <<
ch <<
" |";
1670 } else {
1671 std::cout <<
"\n -- " << std::setw(2) <<
ch <<
" |";
1672 }
1674 << std::setw(1) << recochan[
ch].gain << std::setw(6) << recochan[
ch].amp << std::setw(5) << recochan[
ch].time
1675 << 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)
1676 << std::setw(11) << std::setprecision(4) << (
float) recochan[ch].d_time << std::setw(8) << std::setprecision(1) << (
float) recochan[ch].d_quality;
1677 }
1678
1679 break;
1680
1681 case 4:
1684 &nchan);
1685
1686 std::cout << "\nReco calibrated energy fragment 0x" << std::hex << id << std::dec << ", " << size << " words found:"
1687 <<
"\t" << ((
nchan > 48 &&
nchan < 96) ? 1 :
ngain) <<
" gain, " << unitName[
unit].c_str() <<
" units, " <<
nchan <<
" channels in total" << std::endl;
1688
1689 if (pulse < 3) {
1690 std::cout <<
"Reco flags: 0x" << std::hex << std::setfill(
'0') << rflag <<
setupDec <<
" units: " << unitName[
unit].c_str() <<
" pulse_shape: " << shapeName[pulse].c_str() <<
" nsamples: " << 7 + 2 * nsmpl <<
" algorithm: " <<
algName[algor + 1].c_str() <<
" niterations: " << niter << std::endl;
1691 } else {
1692 std::cout <<
"Reco flags: 0x" << std::hex << std::setfill(
'0') << rflag <<
setupDec <<
" units: " << unitName[
unit].c_str() <<
" pulse_shape: " << shapeName[pulse].c_str() <<
" nsamples: " << 7 + 2 * nsmpl <<
" algorithm: " <<
algName[algor * 4 + niter].c_str() << std::endl;
1693 }
1694
1695 std::cout << "\nPMT Ch | full word | G amp time b q amp time qual";
1698 if (pmt > 0) {
1699 std::cout <<
"\n" << std::setw(3) <<
pmt << std::setw(3) <<
ch <<
" |";
1700 } else {
1701 std::cout <<
"\n -- " << std::setw(2) <<
ch <<
" |";
1702 }
1703
1704 if (ch >= 48 && nchan < 96) {
1706 } else {
1707 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;
1708
1709 if (recocalib[ch].
bad != 0) {
1710 std::cout << " Bad channel";
1711 }
1712 }
1713 }
1714
1715 break;
1716
1717 case 5:
1718 {
1719 isFrag5 = true;
1723 OFC.clear();
1724
1725 std::cout << "\nFrag5 Compressed fragment 0x" << std::hex << id << std::dec << ", " << size << " words found:"
1726 <<
"\t" << 1 <<
" gain, " << unitName[
unit].c_str() <<
" units, " <<
nchan <<
" channels in total" << std::endl;
1727
1729
1730 {
1733
1734 bool of2 = true;
1735 std::vector<double>
a(7),
b(7),
c(7),
g(7),
dg(7);
1736
1738 for (
int gain = 0;
gain < 2; ++
gain) {
1740 TileOfcWeightsStruct weights;
1741 if (
m_tileCondToolOfcCool->getOfcWeights(drawerIdx, ch, gain, phase, of2, weights, ctx).isFailure())
1742 {
1744 continue;
1745 }
1746
1748
1750
1751 for (
int i = 0;
i < 7; ++
i) {
1755 g[
i] = weights.
g[
i];
1757 }
1758
1760 , 0
1761 , calib
1762 , OFC, false );
1763
1764 }
1765 }
1766
1767 }
1768 ofw = &(OFC[0]);
1769
1770 int size_L2 = (*((
const uint32_t*)
data - 3 + 2) >> (32 - 2 - 3)) & 0x7;
1771 std::cout << "size_L2: " << size_L2 << " |";
1772 if (size_L2 == 3) {
1776 std::cout << " SumEt: " << SumEt << ", SumEz: " << SumEz << ", SumE: " << SumE << std::endl;
1777 }
1778 std::cout << std::endl;
1779
1781
1782#define code_ped4 TileRawChannel2Bytes5::code_ped4
1783#define code_ped5 TileRawChannel2Bytes5::code_ped5
1784#define code_amp5 TileRawChannel2Bytes5::code_amp5
1785#define code_amp6 TileRawChannel2Bytes5::code_amp6
1786#define code_raws TileRawChannel2Bytes5::code_raws
1787#define code_rawf TileRawChannel2Bytes5::code_rawf
1788#define code_full TileRawChannel2Bytes5::code_full
1789#define code_dump TileRawChannel2Bytes5::code_dump
1790#define code_null TileRawChannel2Bytes5::code_null
1791
1792 int cnt_ped4, cnt_ped5, cnt_amp5, cnt_amp6, cnt_raws, cnt_rawf, cnt_full, cnt_dump, cnt_null;
1793 cnt_ped4 = cnt_ped5 = cnt_amp5 = cnt_amp6 = cnt_raws = cnt_rawf = cnt_full = cnt_dump = cnt_null = 0;
1794 std::cout << "PMT Ch | full word | Type G B ectrl ereco ebin ene time | s1 s2 s3 s4 s5 s6 s7";
1795
1796 const char *strcode_empty = "----";
1797 const char *strcode_ped4 = "ped4";
1798 const char *strcode_ped5 = "ped5";
1799 const char *strcode_amp5 = "amp5";
1800 const char *strcode_amp6 = "amp6";
1801 const char *strcode_raws = "raws";
1802 const char *strcode_rawf = "rawf";
1803 const char *strcode_full = "full";
1804 const char *strcode_dump = "dump";
1805 const char *strcode_null = "null";
1806 const char *strcode_error = "ERR ";
1807
1808 bool OK = true;
1811 if (pmt > 0) {
1812 std::cout <<
"\n" << std::setw(3) <<
pmt << std::setw(3) <<
ch <<
" |";
1813 } else {
1814 std::cout <<
"\n -- " << std::setw(2) <<
ch <<
" |";
1815 }
1816
1818 const char *scode = strcode_empty;
1823 float ene = Frag5Data[
ch].
ene;
1826 for (
int i = 0;
i < 7;
i++) {
1827 s[
i] = Frag5Data[
ch].
s[
i];
1828 }
1829
1830 switch (code) {
1831 case code_ped4: scode = strcode_ped4; cnt_ped4++;
break;
1832 case code_ped5: scode = strcode_ped5; cnt_ped5++;
break;
1833 case code_amp5: scode = strcode_amp5; cnt_amp5++;
break;
1834 case code_amp6: scode = strcode_amp6; cnt_amp6++;
break;
1835 case code_raws: scode = strcode_raws; cnt_raws++;
break;
1836 case code_rawf: scode = strcode_rawf; cnt_rawf++;
break;
1837 case code_full: scode = strcode_full; cnt_full++;
break;
1838 case code_dump: scode = strcode_dump; cnt_dump++;
break;
1839 case code_null: scode = strcode_null; cnt_null++;
break;
1840 default: scode = strcode_error; break;
1841 }
1842
1843 int ene_recobin = ene_bin + (
gain == 0 ? 512 : 2048);
1844 switch (code) {
1847 ene_bin += 256;
1848 break;
1853 ene_bin += (
gain == 0 ? 512 : 2048);
1854 break;
1855 }
1856
1858 if (ene_ctrl < 0) {
1859 ene_ctrl = 0;
1860 } else if (ene_ctrl > 0x7FFF) {
1861 ene_ctrl = 0x7FFF;
1862 }
1863
1865
1866 switch (code) {
1872 std::cout << std::setw(7) << ene_ctrl << std::setw(7) << ene_recobin << std::setw(6) << ene_bin << std::setw(10) << std::setprecision(4) << ene << " -- ";
1873 break;
1876 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 <<
" ";
1877 break;
1880 std::cout << " ----- ----- ---- --- -- ";
1881 break;
1882 default:;
1883 }
1884
1885 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] <<
" " ;
1886 if (ene_ctrl != ene_recobin) {
1887 OK = false;
1888 std::cout << " ERR";
1889 }
1890 }
1891
1892 std::cout << "\n\nFrag5 Self-Consistency: ";
1893 if (OK) {
1894 std::cout << "OK" << std::endl;
1895 } else {
1896 std::cout << "ERROR" << std::endl;
1897 }
1898
1899 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;
1900
1901 break;
1902 }
1903
1904 case 6:
1905 {
1906 std::cout << "\nFELIX fragment 0x" << std::hex << id << std::dec << ", " << size << " words found" << std::endl;
1908
1910 std::cout << std::hex << std::endl;
1911 bool phase2format = (size>
head && correct_data[2] == 0x12345678 && correct_data[size-1] == 0x87654321);
1912 if (phase2format) {
1913 int thisVersion = (((correct_data[3] >> 16) & 0xFFFF) == 0) ? 1 : 0;
1914 const char * namesV0[] = { "size_packet", "elink", "SOP", "runParam1", "runParam2", "runParam3", "runParam4", "BC_MD_ID", "L1ID" };
1915 const char * namesV1[] = { "size_packet", "elink", "SOP", "version", "MODULE_BC_MD", "L1ID", "BCR" , "runParam1", "runParam2", "runParam3"};
1916 const char **
names = (thisVersion) ? namesV1 : namesV0;
1917 if (thisVersion)
head = 10;
1918 for (
int i=0;
i<
head; ++
i) {
1919 std::cout << std::setw(13) <<
names[
i] << std::setw(10) << correct_data[
i] << std::endl;
1920 }
1921 } else {
1923 for (
int i=0;
i<
head; ++
i) {
1924 std::cout <<
" Word" << std::setw(3) <<
i << std::setw(10) << correct_data[
i] << std::endl;
1925 }
1926 }
1927 std::cout << std::dec << std::endl;
1928 FelixData_t digitsHighGain, digitsLowGain, digitsMetaData;
1929 unpack_frag6(correct_data.data(), size, digitsHighGain, digitsLowGain, digitsMetaData);
1930
1931 std::cout << " MD1 MD2 MD3 MD4" << std::endl;
1932 std::cout << "-----------------------------------------------------";
1933 const char * metaNamesV0[] = { "BCID", "L1ID", "ModuleID", "RunType", "RunNumber", "PedHi", "PedLo", "ChargeInj", "TimeInj", "Capacitor", "ECR" };
1934 const char * metaNamesV1[] = { "BCID", "L1ID", "ModuleID", "RunType", "RunNumber", "PedHi", "PedLo", "ChargeInj", "TimeInj", "Capacitor", "ECR", "BCR", "Version", "FragID" };
1935 const char ** metaNames = (
version) ? metaNamesV1 : metaNamesV0;
1936 for (
size_t i = 0;
i < digitsMetaData.size(); ++
i) {
1937 std::cout << std::endl << std::setw(13) << metaNames[
i];
1938 for (
size_t j = 0; j<digitsMetaData[
i].size(); ++j) {
1939 std::cout << std::setw(10) << digitsMetaData[
i][j];
1940 }
1941 }
1942 std::cout << std::endl << std::endl;
1943
1944 size_t nsamp = 7;
1945 if (digitsLowGain[0].size()>0)
1946 nsamp = std::max(nsamp,digitsLowGain[0].size());
1947 if (digitsHighGain[0].size()>0)
1948 nsamp =std::max(nsamp,digitsHighGain[0].size());
1949
1950 std::cout << " ch G ";
1951 for (
size_t s = 0;
s < nsamp; ++
s) {
1952 std::cout << std::setw(5) <<
s;
1953 }
1954 std::string
a(8+nsamp*5,
'-');
1955 std::cout << std::endl <<
a;
1956
1957 for (
size_t ch = 0;
ch < digitsHighGain.size() ; ++
ch) {
1958 std::cout << std::endl << std::setw(3) <<
ch <<
" HG ";
1959 for (
size_t s = 0;
s < digitsHighGain[
ch].size(); ++
s) {
1960 std::cout << std::setw(5) << (digitsHighGain[
ch][
s]);
1961 }
1962 }
1963
1964 for (
size_t ch = 0;
ch < digitsLowGain.size() ; ++
ch) {
1965 std::cout << std::endl << std::setw(3) <<
ch <<
" LG ";
1966 for (
size_t s = 0;
s < digitsLowGain[
ch].size(); ++
s) {
1967 std::cout << std::setw(5) << (digitsLowGain[
ch][
s]);
1968 }
1969 }
1970 std::cout << std::endl << std::endl;
1971
1972 break;
1973 }
1974
1975 case 0xA:
1977
1978 std::cout << "\nQuality fragment 0x" << std::hex << id << ", " << std::dec << size << " words found:" << std::endl;
1979
1980 if (DQstat) {
1981 std::cout << " ATTENTION: Error bits found in the Data Quality fragment 0xA" << std::endl;
1982 }
1983
1984 std::cout << " --------------------------------------" << std::endl;
1985 std::cout << " | Quality Block | Word (16bit)" << std::endl;
1986 if (DQword.dspbcid >> 15) {
1987 std::cout << " | DSP BCID | " << std::dec << (DQword.dspbcid & 0x7FFF) << std::endl;
1988 } else {
1989 std::cout << " | DSP BCID | not filled (" << std::dec << DQword.dspbcid << ")" << std::endl;
1990 }
1991 std::cout << " | Global CRC | " << std::hex << "0x" << std::setw(1) << DQword.global_crc << std::setfill('0') << std::endl;
1992 std::cout <<
" | BCID checks | " <<
setup0x4 << DQword.bcid << std::endl;
1993 std::cout <<
" | Mem parity err | " <<
setup0x4 << DQword.memory << std::endl;
1994 std::cout <<
" | Single strobe err | " <<
setup0x4 << DQword.Sstrobe << std::endl;
1995 std::cout <<
" | Double strobe err | " <<
setup0x4 << DQword.Dstrobe << std::endl;
1996 std::cout <<
" | Head format err | " <<
setup0x4 << DQword.headformat << std::endl;
1997 std::cout <<
" | Head parity err | " <<
setup0x4 << DQword.headparity << std::endl;
1998 std::cout <<
" | Sample format err | " <<
setup0x4 << DQword.sampleformat << std::endl;
1999 std::cout <<
" | Sample parity err | " <<
setup0x4 << DQword.sampleparity << std::endl;
2000 std::cout <<
" | FE chip mask err | " <<
setup0x4 << DQword.fe_chip_mask << std::endl;
2001 std::cout <<
" | ROD chip mask err | " <<
setup0x4 << DQword.rod_chip_mask << std::endl;
2002 std::cout << " --------------------------------------" << std::setfill(' ') << std::dec << std::endl;
2003 break;
2004
2005 default:
2006 std::cout <<
"\nUnknown (type " <<
type <<
") fragment 0x" << std::hex <<
id <<
", " << std::dec << size <<
" words found" << std::endl;
2008 }
2009 std::cout << std::endl;
2010 } else {
2011 std::cout <<
"\nType " <<
type <<
" fragment 0x" << std::hex <<
id <<
", " << std::dec << size <<
" words found" << std::endl;
2012 std::cout << "\nEmpty Event" << std::endl;
2013 }
2014 }
2015 }
2016}
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.
const std::string & algName(ID id)
Converts a JetAlgorithmType::ID into a string.
setEventNumber setTimeStamp bcid