109 #include <md5global.h>
121 #define REP_BANKLIST 5
144 #define MD5_DIGEST_LEN 16
158 unsigned int size_aux;
160 unsigned char *zdata;
161 unsigned char *pdata;
163 EVENT_HEADER *pheader = (EVENT_HEADER*) pmyevt;
164 unsigned char *pevent = (
unsigned char*)(pheader+1);
167 if ( pheader->event_id != 1 )
169 printf(
"decompressor: skip event with id = %d\n",pheader->event_id);
173 printf(
"Event size: %d\n",pheader->data_size);
178 bank_size = bk_locate(pevent, bkName, &zdata);
180 if ( !bank_size )
continue;
182 inflateReset(&
zstrm);
193 zstrm.avail_out = MAX_EVENT_SIZE;
196 zret = inflate(&
zstrm, Z_NO_FLUSH);
204 printf(
"***ERROR! decompression fail!\n");
208 if (
zstrm.avail_out == 0 )
210 printf(
"***ERROR! Decompressing fail!\n");
214 BANK_HEADER *bank_header_aux = (BANK_HEADER*)
zbuf;
222 MD5Update( &mdContext,
zbuf, bank_header_aux->data_size +
sizeof(BANK_HEADER) );
223 MD5Final ( md5_digest_new, &mdContext);
225 if ( strncmp(md5_digest,md5_digest_new,MD5_DIGEST_LEN) )
227 printf(
"MD5 checksums do not match: [%s] [%s]!\n", md5_digest,md5_digest_new);
232 int size_decomp = MAX_EVENT_SIZE -
zstrm.avail_out;
233 float z = (float)(size_decomp-bank_size)/(float)(size_decomp)*100.0;
234 printf(
"bank [%s]: size: %d bytes -> %d bytes => compression: %0.1f\%\n",bkName,bank_size,size_decomp,z);
237 bk_delete(pevent,bkName);
241 while ( size_aux < bank_header_aux->
data_size )
244 BANK32 *bank = (BANK32*)(
zbuf +
sizeof(BANK_HEADER) + size_aux );
245 BYTE *bank_data = (BYTE*)(bank+1);
249 bank_size = bk_locate(pevent, bank->name, &pdata);
251 if ( bank_size == 0 )
253 bk_create(pevent, bank->name, bank->type, &pdata);
254 memcpy(pdata, bank_data, bank->data_size);
255 pdata += bank->data_size;
256 bk_close(pevent,pdata);
267 int size_i = bank->data_size;
270 size_i += (size_i/8+1)*8 - (size_i/8)*8 - size_i%8;
272 size_i +=
sizeof(BANK32);
282 pheader->data_size = bk_size(pevent);
297 BOOL dupflag =
FALSE;
305 if ((eq[jj].fmt != eq[ii].fmt)
306 && (eq[jj].
id == eq[ii].
id)
307 && (eq[jj].msk == eq[ii].msk)
309 printf(
"Duplicate eventID[%d] between Eq:%s & %s ", eq[jj].
id, eq[jj].Eqname,
311 printf(
"Dumping event in raw format\n");
320 strcpy(eq[*i].Fmt,
"GIVEN");
325 strcpy(eq[*i].Fmt,
"DUPLICATE");
328 if (pevent->event_id == eq[*i].
id)
331 }
while (eq[*i].fmt);
340 char banklist[YB_STRING_BANKLIST_MAX];
342 BOOL bank_found =
FALSE;
344 DWORD physize, evtlen;
349 YBOS_BANK_HEADER *pybk;
354 if (yb_any_file_ropen(rep_file, data_fmt) != SS_SUCCESS)
361 if (yb_any_physrec_skip(data_fmt, bl) != YB_SUCCESS)
365 status = yb_any_all_info_display(D_HEADER);
367 status = yb_any_physrec_display(data_fmt);
368 if ((status == YB_DONE) || (bl != -1))
371 while (yb_any_physrec_get(data_fmt, &physrec, &physize) == YB_SUCCESS);
378 if (yb_any_physrec_skip(data_fmt, bl) != YB_SUCCESS)
381 while (yb_any_event_get(data_fmt, (
void **) &pmyevt, &evtlen) == YB_SUCCESS) {
382 status = yb_any_event_swap(data_fmt, pmyevt);
386 printf(
"mdump recompose error %i\n", status);
389 if (data_fmt == FORMAT_MIDAS)
396 status = yb_any_all_info_display(D_EVTLEN);
398 if (data_fmt == FORMAT_YBOS)
399 status = ybk_list((
DWORD *) pmyevt, banklist);
400 else if (data_fmt == FORMAT_MIDAS) {
401 pme = (EVENT_HEADER *) pmyevt;
402 if (pme->event_id == EVENTID_BOR ||
403 pme->event_id == EVENTID_EOR || pme->event_id == EVENTID_MESSAGE)
406 (
"Evid:%4.4hx- Mask:%4.4hx- Serial:%ld- Time:0x%lx- Dsize:%ld/0x%lx\n",
407 pme->event_id, pme->trigger_mask, pme->serial_number, pme->time_stamp,
408 pme->data_size, pme->data_size);
409 pmbkh = (BANK_HEADER *) (((EVENT_HEADER *) pmyevt) + 1);
410 status = bk_list(pmbkh, banklist);
412 printf(
"#banks:%i Bank list:-%s-\n", status, banklist);
415 (
"------------------------ Event# %i --------------------------------\n",
421 if (data_fmt == FORMAT_MIDAS) {
422 pme = (EVENT_HEADER *) pmyevt;
424 msk = pme->trigger_mask;
428 pmbkh = (BANK_HEADER *) (((EVENT_HEADER *) pmyevt) + 1);
429 if ((pmbkh->data_size + 8) == ((EVENT_HEADER *) pmyevt)->data_size) {
430 if ((status = bk_find(pmbkh,
sbank_name, &bklen, &bktyp, (
void *) &pybk)) == SS_SUCCESS) {
431 status = bk_list(pmbkh, banklist);
436 }
else if (data_fmt == FORMAT_YBOS) {
439 ybk_find((
DWORD *) pmyevt,
"EVID", &bklen, &bktyp,
440 (
void *) &pybk)) == YB_SUCCESS) {
441 pdata = (
DWORD *) ((YBOS_BANK_HEADER *) pybk + 1);
442 id = (
short int) (YBOS_EVID_EVENT_ID(pdata));
443 msk = (
short int) (YBOS_EVID_TRIGGER_MASK(pdata));
448 if ((status = ybk_find((
DWORD *) pmyevt,
sbank_name, &bklen, &bktyp, (
void *) &pybk)) == YB_SUCCESS) {
449 status = ybk_list((
DWORD *) pmyevt, banklist);
463 (
"------------------------ Event# %i --------------------------------\n",
469 (
"------------------------ Event# %i --------------------------------\n",
479 yb_any_file_rclose(data_fmt);
484 void process_event(HNDLE hBuf, HNDLE request_id, EVENT_HEADER * pheader,
void *pevent)
486 static char bars[] =
"|/-\\";
488 static EVENT_HEADER pevh;
490 DWORD *plrl, *pybk, bklen, bktyp;
491 char banklist[YB_STRING_BANKLIST_MAX];
500 size = pheader->data_size +
sizeof(EVENT_HEADER);
505 if (pheader->serial_number != pevh.serial_number + 1) {
508 (
"\nLast - Evid:%4.4hx- Mask:%4.4hx- Serial:%li- Time:0x%lx- Dsize:%li/0x%lx\n",
509 pevh.event_id, pevh.trigger_mask, pevh.serial_number, pevh.time_stamp,
510 pevh.data_size, pevh.data_size);
512 (
"Now - Evid:%4.4hx- Mask:%4.4hx- Serial:%li- Time:0x%lx- Dsize:%li/0x%lx\n",
513 pheader->event_id, pheader->trigger_mask, pheader->serial_number,
514 pheader->time_stamp, pheader->data_size, pheader->data_size);
516 printf(
"Consistency check: %c - %li\r", bars[i_bar++ % 4],
517 pheader->serial_number);
520 memcpy((
char *) &pevh, (
char *) pheader,
sizeof(EVENT_HEADER));
529 plrl = (
DWORD *) pevent;
530 pmbh = (BANK_HEADER *) pevent;
533 printf(
"------------------------ Event# %i ------------------------\n",
536 if ((internal_data_fmt == FORMAT_YBOS) && (yb_any_event_swap(FORMAT_YBOS, plrl) >= YB_SUCCESS)) {
539 yb_file_recompose(pevent, internal_data_fmt,
svpath,
541 printf(
"mdump recompose error %i\n", status);
543 if ((status = ybk_find(plrl,
sbank_name, &bklen, &bktyp, (
void *) &pybk)) == YB_SUCCESS) {
544 status = ybk_list(plrl, banklist);
545 printf(
"#banks:%i Bank list:-%s-\n", status, banklist);
550 status = ybk_list(plrl, banklist);
552 printf(
"#banks:%i Bank list:-%s-\n", status, banklist);
556 printf(
"Evid:%4.4hx- Mask:%4.4hx- Serial:%ld- Time:0x%lx- Dsize:%ld/0x%lx\n",
557 pheader->event_id, pheader->trigger_mask, pheader->serial_number,
558 pheader->time_stamp, pheader->data_size, pheader->data_size);
561 status = ybk_list(plrl, banklist);
562 printf(
"#banks:%i Bank list:-%s-\n", status, banklist);
566 }
else if ((internal_data_fmt == FORMAT_MIDAS) && (yb_any_event_swap(FORMAT_MIDAS, pheader) >= YB_SUCCESS)) {
568 status = yb_file_recompose(pheader, internal_data_fmt,
svpath,
file_mode);
570 if (bk_find(pmbh,
sbank_name, &bklen, &bktyp, (
void *) &pmbk) == SS_SUCCESS) {
571 status = bk_list(pmbh, banklist);
572 printf(
"#banks:%i Bank list:-%s-", status, banklist);
575 status = bk_list(pmbh, banklist);
577 printf(
"#banks:%i Bank list:-%s-\n", status, banklist);
583 (
"Evid:%4.4hx- Mask:%4.4hx- Serial:%ld- Time:0x%lx- Dsize:%ld/0x%lx\n",
584 pheader->event_id, pheader->trigger_mask, pheader->serial_number,
585 pheader->time_stamp, pheader->data_size, pheader->data_size);
586 status = bk_list(pmbh, banklist);
587 printf(
"#banks:%i Bank list:-%s-\n", status, banklist);
592 printf(
"Data format not supported: %s\n", eq[index].Fmt);
593 yb_any_event_display(pheader, FORMAT_MIDAS, DSP_RAW,
dsp_fmt);
596 cm_disconnect_experiment();
606 int main(
int argc,
char **argv)
610 char buf_name[32] = EVENT_BUFFER_NAME, rep_file[128];
614 INT ch, request_id,
size, get_flag, action,
i;
615 BUFFER_HEADER buffer_header;
641 for (i = 1; i < argc; i++) {
642 if (strncmp(argv[i],
"-x", 2) == 0) {
645 if (strncmp(argv[++i],
"online", 6) != 0) {
654 for (i = 1; i < argc; i++) {
655 if (argv[i][0] ==
'-' && argv[i][1] ==
'd')
657 else if (argv[i][0] ==
'-') {
658 if (i + 1 >= argc || argv[i + 1][0] ==
'-')
660 if (strncmp(argv[i],
"-t", 2) == 0) {
662 if (strncmp(str,
"m", 1) == 0)
664 if (strncmp(str,
"y", 1) == 0)
666 }
else if (strncmp(argv[i],
"-b", 2) == 0)
668 else if (strncmp(argv[i],
"-i", 2) == 0)
670 else if (strncmp(argv[i],
"-k", 2) == 0)
672 else if (strncmp(argv[i],
"-m", 2) == 0) {
674 if (strncmp(str,
"r", 1) == 0)
676 if (strncmp(str,
"b", 1) == 0)
678 }
else if (strncmp(argv[i],
"-w", 2) == 0) {
680 if (strncmp(str,
"h", 1) == 0)
682 else if (strncmp(str,
"r", 1) == 0)
684 else if (strncmp(str,
"l", 1) == 0)
686 else if (strncmp(str,
"e", 1) == 0)
688 else if (strncmp(str,
"j", 1) == 0)
690 }
else if (strncmp(argv[i],
"-p", 2) == 0)
691 strcpy(
svpath, argv[++i]);
692 else if (strncmp(argv[i],
"-c", 2) == 0) {
693 strcpy(str, argv[++i]);
694 if (strncmp(str,
"n", 1) == 0 || strncmp(str,
"N", 1) == 0)
696 if (strncmp(str,
"a", 1) == 0 || strncmp(str,
"A", 1) == 0)
698 }
else if (strncmp(argv[i],
"-f", 2) == 0) {
700 if (strncmp(str,
"d", 1) == 0)
702 if (strncmp(str,
"x", 1) == 0)
704 if (strncmp(str,
"a", 1) == 0)
706 }
else if (strncmp(argv[i],
"-r", 2) == 0)
707 bl = atoi(argv[++i]);
708 else if (strncmp(argv[i],
"-x", 2) == 0) {
711 strcpy(rep_file, argv[++i]);
714 printf(
"mdump for replay -x file name : file to inspect\n");
716 (
" -m mode : Display mode either Bank or raw\n");
718 (
" -b bank name : search for bank name (case sensitive)\n");
719 printf(
" -i evt_id (any) : event id from the FE\n");
721 (
" -k mask (any) : trigger_mask from FE setting\n");
723 (
">>> -i and -k are valid for YBOS ONLY if EVID bank is present in the event\n");
725 (
" -w what : Header, Record, Length, Event, Jbank_list\n");
727 (
">>> Header & Record are not supported for MIDAS as no physical record structure\n");
729 (
" -f format (auto): data representation (x/d/ascii) def:bank header content\n");
731 (
" -p path (null) : path for file composition (see -c)\n");
732 printf(
" -t type (auto) : Bank format (Midas/Ybos)\n");
733 printf(
">>> if -x is a /dev/xxx, -t has to be specified\n");
735 (
" -c compose : retrieve file from event (Addrun#/Norun#)\n");
737 (
" -r # : skip record(YBOS) or event(MIDAS) to #\n");
744 for (i = 1; i < argc; i++) {
745 if (argv[i][0] ==
'-' && argv[i][1] ==
'd')
747 else if (strncmp(argv[i],
"-s", 2) == 0)
749 else if (strncmp(argv[i],
"-y", 2) == 0)
751 else if (strncmp(argv[i],
"-j", 2) == 0)
753 else if (argv[i][0] ==
'-') {
754 if (i + 1 >= argc || argv[i + 1][0] ==
'-')
756 else if (strncmp(argv[i],
"-x", 2) == 0)
757 strncpy(rep_file, argv[++i], 4);
758 else if (strncmp(argv[i],
"-b", 2) == 0)
760 else if (strncmp(argv[i],
"-l", 2) == 0)
762 else if (strncmp(argv[i],
"-w", 2) == 0)
763 dsp_time = 1000 * (atoi(argv[++i]));
764 else if (strncmp(argv[i],
"-m", 2) == 0) {
766 if (strncmp(str,
"r", 1) == 0)
768 if (strncmp(str,
"y", 1) == 0)
770 }
else if (strncmp(argv[i],
"-g", 2) == 0) {
772 if (strncmp(str,
"s", 1) == 0)
774 if (strncmp(str,
"a", 1) == 0)
776 }
else if (strncmp(argv[i],
"-f", 2) == 0) {
778 if (strncmp(str,
"d", 1) == 0)
780 if (strncmp(str,
"x", 1) == 0)
782 if (strncmp(str,
"a", 1) == 0)
784 }
else if (strncmp(argv[i],
"-i", 2) == 0)
786 else if (strncmp(argv[i],
"-k", 2) == 0)
788 else if (strncmp(argv[i],
"-p", 2) == 0)
789 strcpy(
svpath, argv[++i]);
790 else if (strncmp(argv[i],
"-z", 2) == 0)
791 strcpy(buf_name, argv[++i]);
792 else if (strncmp(argv[i],
"-t", 2) == 0) {
794 if (strncmp(str,
"m", 1) == 0)
796 if (strncmp(str,
"y", 1) == 0)
798 }
else if (strncmp(argv[i],
"-c", 2) == 0) {
799 strcpy(str, argv[++i]);
800 if (strncmp(str,
"n", 1) == 0 || strncmp(str,
"N", 1) == 0)
802 if (strncmp(str,
"a", 1) == 0 || strncmp(str,
"A", 1) == 0)
804 }
else if (strncmp(argv[i],
"-h", 2) == 0)
805 strcpy(host_name, argv[++i]);
806 else if (strncmp(argv[i],
"-e", 2) == 0)
807 strcpy(expt_name, argv[++i]);
810 printf(
"mdump for online -l # : display # events (look 1)\n");
812 (
" -f format (auto): data representation (x/d/ascii) def:bank header content\n");
814 (
" -p path (null) : path for file composition (see -c)\n");
815 printf(
" -t type (auto) : Bank format (Midas/Ybos)\n");
817 (
" -c compose : retrieve file from event (Addrun#/Norun#)\n");
819 (
" -w time : insert wait in [sec] between each display\n");
821 (
" -m mode : Display mode either Bank or raw\n");
823 (
" -j : Display # of banks and bank name list only\n");
825 (
" -b bank name : search for bank name (case sensitive)\n");
826 printf(
" -i evt_id (any) : event id from the FE\n");
828 (
" -k mask (any) : trigger_mask from FE setting\n");
830 (
">>> -i and -k are valid for YBOS ONLY if EVID bank is present in the event\n");
832 (
" -g type : sampling mode either SOME or all)\n");
833 printf(
">>> in case of -c it is recommented to used -g all\n");
835 (
" -s : speed test for connection test\n");
837 (
" -x Source : Data source selection def:online (see -x -h)\n");
839 (
" -y : Serial number consistency check\n");
840 printf(
">>> in case of -y it is recommented to used -g all\n");
841 printf(
" -z buffer name : Midas buffer name(SYSTEM)\n");
842 printf(
" [-h Hostname] [-e Experiment]\n\n");
851 zstrm.zalloc = Z_NULL;
852 zstrm.zfree = Z_NULL;
853 zstrm.opaque = Z_NULL;
855 zstrm.next_in = Z_NULL;
857 if ( inflateInit(&
zstrm) != Z_OK)
859 printf(
"***ERROR! decompressing initialization fail!\n");
863 zbuf = (
unsigned char*) malloc( MAX_EVENT_SIZE );
867 printf(
"***ERROR! Can't allocate memory for aux. decompression buffer!\n");
874 if ((pext = strrchr(rep_file,
'.')) != 0) {
875 if (equal_ustring(pext + 1,
"mid"))
877 else if (equal_ustring(pext + 1,
"ybs"))
879 else if (equal_ustring(pext + 1,
"gz")) {
880 if ((pext = strchr(rep_file,
'.')) != 0) {
881 if (strstr(pext + 1,
"mid"))
883 else if (strstr(pext + 1,
"ybs"))
887 (
"\n>>> data type (-t) should be set by hand in -x mode for tape <<< \n\n");
892 (
"\n>>> data type (-t) should be set by hand in -x mode for tape <<< \n\n");
903 if (evt_display < 1 && evt_display > 1000) {
904 printf(
"mdump-F- <-display arg> out of range (1:1000)\n");
907 if (dsp_time < 0 && dsp_time > 100) {
908 printf(
"mdump-F- <-delay arg> out of range (1:100)\n");
914 status = cm_connect_experiment(host_name, expt_name,
"mdump", 0);
915 if (status != CM_SUCCESS)
919 cm_set_watchdog_params(
TRUE, 0);
923 status = bm_open_buffer(buf_name, EVENT_BUFFER_SIZE, &
hBufEvent);
924 if (status != BM_SUCCESS && status != BM_CREATED) {
925 cm_msg(MERROR,
"mdump",
"bm_open_buffer, unknown buffer");
937 printf(
"-%s -- Enter <!> to Exit ------- Midas Dump in Speed test mode ---\n",
940 printf(
"-%s -- Enter <!> to Exit ------- Midas Dump ---\n", cm_get_version());
943 cm_get_experiment_database(&hDB, &hKey);
947 memset((
char *) eq, 0, 32 *
sizeof(
FMT_ID));
949 if (db_find_key(hDB, 0,
"/equipment", &hKey) == DB_SUCCESS) {
950 char strtmp[256], equclient[32];
952 db_enum_key(hDB, hKey, i, &
hSubkey);
959 size =
sizeof(strtmp);
960 sprintf(strtmp,
"/equipment/%s/common/Frontend name",
key.name);
961 db_get_value(hDB, 0, strtmp, equclient, &size, TID_STRING,
TRUE);
970 sprintf(strtmp,
"/equipment/%s/common/event ID",
key.name);
971 db_get_value(hDB, 0, strtmp, &(eq[l]).
id, &size, TID_WORD,
TRUE);
974 sprintf(strtmp,
"/equipment/%s/common/Trigger mask",
key.name);
975 db_get_value(hDB, 0, strtmp, &(eq[l]).msk, &size, TID_WORD,
TRUE);
978 sprintf(strtmp,
"/equipment/%s/common/Format",
key.name);
979 db_get_value(hDB, 0, strtmp, str, &size, TID_STRING,
TRUE);
980 if (equal_ustring(str,
"YBOS")) {
981 eq[l].
fmt = FORMAT_YBOS;
982 strcpy(eq[l].Fmt,
"YBOS");
983 }
else if (equal_ustring(str,
"MIDAS")) {
984 eq[l].
fmt = FORMAT_MIDAS;
985 strcpy(eq[l].Fmt,
"MIDAS");
986 }
else if (equal_ustring(str,
"DUMP")) {
987 eq[l].
fmt = FORMAT_MIDAS;
988 strcpy(eq[l].Fmt,
"DUMP");
989 }
else if (equal_ustring(str,
"ASCII")) {
990 eq[l].
fmt = FORMAT_MIDAS;
991 strcpy(eq[l].Fmt,
"ASCII");
992 }
else if (equal_ustring(str,
"HBOOK")) {
993 eq[l].
fmt = FORMAT_MIDAS;
994 strcpy(eq[l].Fmt,
"HBOOK");
995 }
else if (equal_ustring(str,
"FIXED")) {
996 eq[l].
fmt = FORMAT_MIDAS;
997 strcpy(eq[l].Fmt,
"FIXED");
1005 if (db_find_key(hDB, 0,
"/EBuilder/Settings", &hKey) == DB_SUCCESS) {
1006 sprintf(eq[l].Eqname,
"EBuilder");
1014 size =
sizeof(
WORD);
1015 db_get_value(hDB, hKey,
"Event ID", &(eq[l]).
id, &size, TID_WORD,
TRUE);
1017 size =
sizeof(
WORD);
1018 db_get_value(hDB, hKey,
"Trigger mask", &(eq[l]).msk, &size, TID_WORD,
TRUE);
1021 db_get_value(hDB, hKey,
"Format", str, &size, TID_STRING,
TRUE);
1022 if (equal_ustring(str,
"YBOS")) {
1023 eq[l].
fmt = FORMAT_YBOS;
1024 strcpy(eq[l].Fmt,
"YBOS");
1025 }
else if (equal_ustring(str,
"MIDAS")) {
1026 eq[l].
fmt = FORMAT_MIDAS;
1027 strcpy(eq[l].Fmt,
"MIDAS");
1029 printf(
"Format unknown for Event Builder (%s)\n", str);
1037 printf(
"ID\tMask\tFormat\tEq_name\n");
1039 printf(
"%d\t%d\t%s\t%s\n", eq[i].
id, eq[i].msk, eq[i].Fmt, eq[i].Eqname);
1047 status = cm_yield(1000);
1050 if (ss_millitime() - start_time > 1000) {
1051 stop_time = ss_millitime();
1055 bm_get_buffer_info(
hBufEvent, &buffer_header);
1056 size = buffer_header.read_pointer - buffer_header.write_pointer;
1058 size += buffer_header.size;
1059 printf(
"Level: %4.3f %%, ", 100 - 100.0 * size / buffer_header.size);
1060 printf(
"Rate: %1.3f MB/sec\n", rate);
1074 if ((
char) ch ==
'!')
1077 }
while (status != RPC_SHUTDOWN && status != SS_ABORT);
1080 cm_disconnect_experiment();
1083 (void)inflateEnd(&
zstrm);