AlcapDAQ  1
mzdump.c
Go to the documentation of this file.
1 /********************************************************************\
2 Name: mzdump.c
3 Created by: Vladimir Tishchenko (vladimir.tishenko@gmail.com)
4  from file mdump.c
5  Created by: Pierre-Andre Amaudruz
6 
7 Contents: Dump event on screen with MIDAS or YBOS data format
8 
9 $Log: mzdump.c,v $
10 Revision 1.1 2010-12-07 01:39:51 mmurray6
11 MM : Added mzdump taken from dolphin at ~/mulan/DAQ/utils. Compilation doesn't work out of the box, but binary is compiled and included.
12 
13 Revision 1.1.1.1 2004/10/20 18:48:07 admin
14 Trying again to import midas-1.9.5. There are NT executables, but I'm importing them as well (w/o -kb switch so watch out!)
15 
16 Revision 1.24 2004/01/08 08:40:11 midas
17 Implemented standard indentation
18 
19 Revision 1.23 2003/05/09 07:40:05 midas
20 Added extra parameter to cm_get_environment
21 
22 Revision 1.22 2003/04/25 04:48:26 pierre
23 Fixed compiler warning
24 
25 Revision 1.21 2003/04/23 23:08:46 pierre
26 Fixed compiler warning
27 
28 Revision 1.20 2002/09/28 00:42:55 pierre
29 enable DSP_UNK format display
30 
31 Revision 1.19 2002/05/22 17:32:56 pierre
32 Fixed bug with wrong size
33 
34 Revision 1.18 2002/05/15 00:23:26 pierre
35 string length for Format
36 
37 Revision 1.17 2002/05/08 19:54:41 midas
38 Added extra parameter to function db_get_value()
39 
40 Revision 1.16 2002/01/28 20:52:07 pierre
41 add /EBuilder path for ID search
42 
43 Revision 1.15 2000/11/01 17:17:54 pierre
44 -fix duplicate ID for different fmt.
45 
46 Revision 1.14 2000/10/31 23:08:51 pierre
47 - Fix Duplicate ID/msk/fmt
48 - Fix db_get_value error on "Frontend name" due to Analyzer writing as [256]
49 
50 Revision 1.13 1999/11/23 21:14:38 pierre
51 - Added option -j (online) -w j (replay) for bank list display only
52 
53 Revision 1.12 1999/11/23 15:35:41 midas
54 Check for BM_CREATED when opening buffer
55 
56 Revision 1.11 1999/09/30 22:53:21 pierre
57 - fix return of yb_any_swap
58 
59 Revision 1.10 1999/09/29 20:36:24 pierre
60 - fix yb_any_bank_display
61 
62 Revision 1.9 1999/07/23 07:04:54 midas
63 Fixed compiler warnings
64 
65 Revision 1.8 1999/07/22 19:25:00 pierre
66 - Fix duplicate EVID complain
67 - Added support for FIXED event in raw format
68 
69 Revision 1.7 1999/02/05 23:49:20 pierre
70 - Fix blank lines for compiler.
71 
72 Revision 1.6 1999/01/19 20:58:32 pierre
73 - Fix minor display and ybos call for argument list.
74 
75 Revision 1.5 1999/01/18 18:11:30 pierre
76 - Correct for new ybos prototype functions.
77 - Added more switches for online and replay.
78 - Correct main loop for new keyboard handling.
79 
80 Revision 1.4 1998/11/20 14:54:23 pierre
81 added support for MIDAS fmt for : -x (replay file)
82 
83 FE file fragmentation (feodb_file_dump(...))
84 
85 Revision 1.3 1998/10/23 14:21:51 midas
86 - Modified version scheme from 1.06 to 1.6.0
87 - cm_get_version() now returns versino as string
88 
89 Revision 1.2 1998/10/12 12:19:03 midas
90 Added Log tag in header
91 
92 
93 Previous revision history
94 ------------------------------------------------------------------
95 date by modification
96 -------- --- ------------------------------------------------
97 11-OCT-96 PAA created
98 20-NoV-97 PAA add the Midas format
99 13-Mar-06 VT add decompression of FExZ banks
100 25-Aug-06 VT decompress events with event_id=1 only
101 17-Apr-07 VT Align banks in decompressor
102 
103 \********************************************************************/
104 
105 /* ZLIB include */
106 #include <zlib.h>
107 
108 /* MD5 include */
109 #include <md5global.h>
110 #include <md5.h>
111 
112 #include <midas.h>
113 #include <msystem.h>
114 #include <ybos.h>
115 #include <mrpc.h>
116 
117 #define REP_HEADER 1
118 #define REP_RECORD 2
119 #define REP_LENGTH 3
120 #define REP_EVENT 4
121 #define REP_BANKLIST 5
122 
123 char bank_name[4], sbank_name[4], svpath[128];
125 INT save_dsp = 1, evt_display = 0;
126 INT speed = 0, dsp_time = 0, dsp_fmt = 0, dsp_mode = 0, file_mode, bl = -1;
130 KEY key;
131 HNDLE hSubkey;
133 typedef struct {
137  char Fmt[8];
138  char Eqname[256];
139 } FMT_ID;
140 
141 FMT_ID eq[32];
142 
143 /*-- event decompression -----------------------------*/
144 #define MD5_DIGEST_LEN 16
145 static unsigned char *zbuf;
146 static z_stream zstrm;
147 static void decompress(void *pmyevt);
148 
149 void decompress(void *pmyevt)
150 {
151  int i;
152  char bkName[8];
153  INT bank_size;
154  int zret;
155 
156  char md5_digest[MD5_DIGEST_LEN];
157 
158  unsigned int size_aux;
159 
160  unsigned char *zdata;
161  unsigned char *pdata;
162 
163  EVENT_HEADER *pheader = (EVENT_HEADER*) pmyevt;
164  unsigned char *pevent = (unsigned char*)(pheader+1);
165 
166  //if ( pheader->event_id < 1 )
167  if ( pheader->event_id != 1 )
168  {
169  printf("decompressor: skip event with id = %d\n",pheader->event_id);
170  return;
171  }
172 
173  printf("Event size: %d\n",pheader->data_size);
174 
175  for (i=1; i<=9; i++)
176  {
177  sprintf(bkName,"FE%1dZ",i);
178  bank_size = bk_locate(pevent, bkName, &zdata);
179 
180  if ( !bank_size ) continue;
181 
182  inflateReset(&zstrm);
183 
184  /*** MD5 digest ***/
185  memcpy(md5_digest,zdata,MD5_DIGEST_LEN);
186 
187  /*** decompress ***/
188  zstrm.avail_in = bank_size-MD5_DIGEST_LEN; /*** compressed banks are of BYTE type, therefore
189  the number of elements == bank_size ***/
190 
191  zstrm.next_in = zdata + MD5_DIGEST_LEN;
192  zstrm.next_out = zbuf;
193  zstrm.avail_out = MAX_EVENT_SIZE;
194  zstrm.avail_in = bank_size-MD5_DIGEST_LEN;
195 
196  zret = inflate(&zstrm, Z_NO_FLUSH);
197 
198  switch (zret)
199  {
200  case Z_NEED_DICT:
201  zret = Z_DATA_ERROR; /* and fall through */
202  case Z_DATA_ERROR:
203  case Z_MEM_ERROR:
204  printf("***ERROR! decompression fail!\n");
205  continue;
206  }
207 
208  if ( zstrm.avail_out == 0 )
209  {
210  printf("***ERROR! Decompressing fail!\n");
211  continue;
212  }
213 
214  BANK_HEADER *bank_header_aux = (BANK_HEADER*) zbuf;
215 
216 
217  /*** calculate MD5 sum of the decompressed event ***/
218  MD5_CTX mdContext;
219  char md5_digest_new[MD5_DIGEST_LEN];
220 
221  MD5Init ( &mdContext );
222  MD5Update( &mdContext, zbuf, bank_header_aux->data_size + sizeof(BANK_HEADER) );
223  MD5Final ( md5_digest_new, &mdContext);
224 
225  if ( strncmp(md5_digest,md5_digest_new,MD5_DIGEST_LEN) )
226  {
227  printf("MD5 checksums do not match: [%s] [%s]!\n", md5_digest,md5_digest_new);
228  continue;
229  }
230 
231  /*** print info about bank size ***/
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);
235 
236  /*** delete compressed bank from the event as we don't need it anymore ***/
237  bk_delete(pevent,bkName);
238 
239  /*** loop over decompressed event and add banks to the MIDAS event ***/
240  size_aux = 0;
241  while ( size_aux < bank_header_aux->data_size )
242  {
243 
244  BANK32 *bank = (BANK32*)( zbuf + sizeof(BANK_HEADER) + size_aux );
245  BYTE *bank_data = (BYTE*)(bank+1);
246 
247  //printf("uncompressed bank name: [%s], size: %d\n",bank->name,bank->data_size);
248 
249  bank_size = bk_locate(pevent, bank->name, &pdata);
250 
251  if ( bank_size == 0 )
252  {
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);
257  //printf("bank [%s] added to event\n",bank->name);
258  }
259 
260 
261  /* modified by VT on 17-Apr-2007:
262  it looks bank has to be align on WORD (or DWORD???)
263  this is work around to align the bank.
264  */
265 
266  //int size_i = sizeof(BANK32) + bank->data_size;
267  int size_i = bank->data_size;
268  if (size_i%8)
269  //size_i += (size_i/4+1)*4 - (size_i/4)*4 - size_i%4;
270  size_i += (size_i/8+1)*8 - (size_i/8)*8 - size_i%8;
271  //size_i += 4;
272  size_i += sizeof(BANK32);
273  //printf("size_i: %d\n", size_i);
274 
275  size_aux += size_i;
276  //size_aux += sizeof(BANK32) + bank->data_size;
277 
278  }
279 
280  }
281 
282  pheader->data_size = bk_size(pevent);
283 
284  //printf("new event size: %d\n",((BANK_HEADER*)pevent)->data_size);
285 
286  return;
287 
288 }
289 
290 
291 
292 /*-------- Check data format ------------*/
293 DWORD data_format_check(EVENT_HEADER * pevent, INT * i)
294 {
295 
296  INT jj, ii;
297  BOOL dupflag = FALSE;
298 
299  /* check in the active FE list for duplicate event ID */
300  ii = 0;
301  while (eq[ii].fmt) {
302  jj = ii + 1;
303  /* problem occur when duplicate ID with different data format */
304  while (eq[jj].fmt) {
305  if ((eq[jj].fmt != eq[ii].fmt)
306  && (eq[jj].id == eq[ii].id)
307  && (eq[jj].msk == eq[ii].msk)
308  && eq[ii].id != 0) {
309  printf("Duplicate eventID[%d] between Eq:%s & %s ", eq[jj].id, eq[jj].Eqname,
310  eq[ii].Eqname);
311  printf("Dumping event in raw format\n");
312  dupflag = TRUE;
313  }
314  jj++;
315  }
316  ii++;
317  }
318  if (data_fmt != 0) {
319  *i = 0;
320  strcpy(eq[*i].Fmt, "GIVEN");
321  return data_fmt;
322  } else {
323  *i = 0;
324  if (dupflag)
325  strcpy(eq[*i].Fmt, "DUPLICATE");
326  else {
327  do {
328  if (pevent->event_id == eq[*i].id)
329  return eq[*i].fmt;
330  (*i)++;
331  } while (eq[*i].fmt);
332  }
333  }
334  return 0;
335 }
336 
337 /*----- Replog function ----------------------------------------*/
338 int replog(int data_fmt, char *rep_file, int bl, int action)
339 {
340  char banklist[YB_STRING_BANKLIST_MAX];
341  short int msk, id;
342  BOOL bank_found = FALSE;
343  INT status = 0, i;
344  DWORD physize, evtlen;
345  void *physrec;
346  char *pmyevt;
347  EVENT_HEADER *pme;
348  BANK_HEADER *pmbkh;
349  YBOS_BANK_HEADER *pybk;
350  DWORD *pdata;
351  DWORD bklen, bktyp;
352 
353  /* open data file */
354  if (yb_any_file_ropen(rep_file, data_fmt) != SS_SUCCESS)
355  return (-1);
356 
357  switch (action) {
358  case REP_HEADER:
359  case REP_RECORD:
360  /* get only physical record header */
361  if (yb_any_physrec_skip(data_fmt, bl) != YB_SUCCESS)
362  return (-1);
363  do {
364  if (action == REP_HEADER)
365  status = yb_any_all_info_display(D_HEADER);
366  else if (action == REP_RECORD)
367  status = yb_any_physrec_display(data_fmt);
368  if ((status == YB_DONE) || (bl != -1))
369  break;
370  }
371  while (yb_any_physrec_get(data_fmt, &physrec, &physize) == YB_SUCCESS);
372  break;
373 
374  case REP_LENGTH:
375  case REP_EVENT:
376  case REP_BANKLIST:
377  /* skip will read atleast on record */
378  if (yb_any_physrec_skip(data_fmt, bl) != YB_SUCCESS)
379  return (-1);
380  i = 0;
381  while (yb_any_event_get(data_fmt, (void **) &pmyevt, &evtlen) == YB_SUCCESS) {
382  status = yb_any_event_swap(data_fmt, pmyevt);
383  if (file_mode != YB_NO_RECOVER)
384  if ((status =
385  yb_file_recompose(pmyevt, data_fmt, svpath, file_mode)) != YB_SUCCESS)
386  printf("mdump recompose error %i\n", status);
387 
388  /*** decompress events from WFD frontends ***/
389  if (data_fmt == FORMAT_MIDAS)
390  {
391  //if (i>0)
392  decompress(pmyevt);
393  }
394 
395  if (action == REP_LENGTH)
396  status = yb_any_all_info_display(D_EVTLEN);
397  if (action == REP_BANKLIST) {
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)
404  continue;
405  printf
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);
411  }
412  printf("#banks:%i Bank list:-%s-\n", status, banklist);
413  } else if ((action == REP_EVENT) && (event_id == EVENTID_ALL) && (event_msk == TRIGGER_ALL) && (sbank_name[0] == 0)) { /* a quick by-pass to prevent bank search if not necessary */
414  printf
415  ("------------------------ Event# %i --------------------------------\n",
416  i++);
417  yb_any_event_display(pmyevt, data_fmt, dsp_mode, dsp_fmt);
418  } else if (action == REP_EVENT) {
419  id = EVENTID_ALL;
420  msk = TRIGGER_ALL;
421  if (data_fmt == FORMAT_MIDAS) {
422  pme = (EVENT_HEADER *) pmyevt;
423  id = pme->event_id;
424  msk = pme->trigger_mask;
425  /* Search bank if necessary */
426  if (sbank_name[0] != 0) { /* bank name given through argument list */
427  bank_found = FALSE;
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) { /* given bank found in list */
431  status = bk_list(pmbkh, banklist);
432  bank_found = TRUE;
433  }
434  }
435  }
436  } else if (data_fmt == FORMAT_YBOS) {
437  /* check id EVID found in event for id and msk selection */
438  if ((status =
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));
444  }
445  /* Search bank if necessary */
446  if (sbank_name[0] != 0) { /* bank name given through argument list */
447  bank_found = FALSE;
448  if ((status = ybk_find((DWORD *) pmyevt, sbank_name, &bklen, &bktyp, (void *) &pybk)) == YB_SUCCESS) { /* given bank found in list */
449  status = ybk_list((DWORD *) pmyevt, banklist);
450  bank_found = TRUE;
451  }
452  }
453  }
454  /* check user request through switch setting (id, msk ,bank) */
455  if ((event_msk != TRIGGER_ALL) || (event_id != EVENTID_ALL) || (sbank_name[0] != 0)) { /* check request or skip event if not satisfied */
456  if (((event_id != EVENTID_ALL) && (id != event_id)) || /* id check ==> skip */
457  ((event_msk != TRIGGER_ALL) && (msk != event_msk)) || /* msk check ==> skip */
458  ((sbank_name[0] != 0) && !bank_found)) { /* bk check ==> skip *//* skip event */
459  printf("Searching for Bank -%s- Skiping event...%i\r", sbank_name, i++);
460  fflush(stdout);
461  } else { /* request match ==> display any event */
462  printf
463  ("------------------------ Event# %i --------------------------------\n",
464  i++);
465  yb_any_event_display(pmyevt, data_fmt, dsp_mode, dsp_fmt);
466  }
467  } else { /* no user request ==> display any event */
468  printf
469  ("------------------------ Event# %i --------------------------------\n",
470  i++);
471  yb_any_event_display(pmyevt, data_fmt, dsp_mode, dsp_fmt);
472  }
473  }
474  }
475  break;
476  } /* switch */
477 
478  /* close data file */
479  yb_any_file_rclose(data_fmt);
480  return 0;
481 }
482 
483 /*----- receive_event ----------------------------------------------*/
484 void process_event(HNDLE hBuf, HNDLE request_id, EVENT_HEADER * pheader, void *pevent)
485 {
486  static char bars[] = "|/-\\";
487  static int i_bar;
488  static EVENT_HEADER pevh;
489  INT internal_data_fmt, status, index, size;
490  DWORD *plrl, *pybk, bklen, bktyp;
491  char banklist[YB_STRING_BANKLIST_MAX];
492  BANK *pmbk;
493  BANK_HEADER *pmbh;
494 
495  //if (pheader->serial_number > 0)
496  decompress(pheader);
497 
498  if (speed == 1) {
499  /* accumulate received event size */
500  size = pheader->data_size + sizeof(EVENT_HEADER);
501  count += size;
502  return;
503  }
504  if (consistency == 1) {
505  if (pheader->serial_number != pevh.serial_number + 1) {
506  /* event header */
507  printf
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);
511  printf
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);
515  } else {
516  printf("Consistency check: %c - %li\r", bars[i_bar++ % 4],
517  pheader->serial_number);
518  fflush(stdout);
519  }
520  memcpy((char *) &pevh, (char *) pheader, sizeof(EVENT_HEADER));
521  return;
522  }
523  if (evt_display > 0) {
524  evt_display--;
525 
526  internal_data_fmt = data_format_check(pheader, &index);
527 
528  /* pointer to data section */
529  plrl = (DWORD *) pevent;
530  pmbh = (BANK_HEADER *) pevent;
531 
532  /* display header comes ALWAYS from MIDAS header */
533  printf("------------------------ Event# %i ------------------------\n",
535  /* selection based on data format */
536  if ((internal_data_fmt == FORMAT_YBOS) && (yb_any_event_swap(FORMAT_YBOS, plrl) >= YB_SUCCESS)) { /* ---- YBOS FMT ---- */
537  if (file_mode != YB_NO_RECOVER)
538  if ((status =
539  yb_file_recompose(pevent, internal_data_fmt, svpath,
540  file_mode)) != YB_SUCCESS)
541  printf("mdump recompose error %i\n", status);
542  if (sbank_name[0] != 0) { /* bank name given through argument list */
543  if ((status = ybk_find(plrl, sbank_name, &bklen, &bktyp, (void *) &pybk)) == YB_SUCCESS) { /* given bank found in list */
544  status = ybk_list(plrl, banklist);
545  printf("#banks:%i Bank list:-%s-\n", status, banklist);
546  printf("Bank:%s - Length (I*4):%li - Type:%li - pBk:%p\n", sbank_name,
547  bklen, bktyp, pybk);
548  yb_any_bank_display(NULL, pybk, FORMAT_YBOS, dsp_mode, dsp_fmt);
549  } else {
550  status = ybk_list(plrl, banklist);
551  printf("Bank -%s- not found (%i) in ", sbank_name, status);
552  printf("#banks:%i Bank list:-%s-\n", status, banklist);
553  }
554  } else { /* Full event */
555  /* event header */
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);
559 
560  if (disp_bank_list) {
561  status = ybk_list(plrl, banklist);
562  printf("#banks:%i Bank list:-%s-\n", status, banklist);
563  } else
564  yb_any_event_display(plrl, FORMAT_YBOS, dsp_mode, dsp_fmt);
565  }
566  } else if ((internal_data_fmt == FORMAT_MIDAS) && (yb_any_event_swap(FORMAT_MIDAS, pheader) >= YB_SUCCESS)) { /* ---- MIDAS FMT ---- */
567  if (file_mode != YB_NO_RECOVER)
568  status = yb_file_recompose(pheader, internal_data_fmt, svpath, file_mode);
569  if (sbank_name[0] != 0) {
570  if (bk_find(pmbh, sbank_name, &bklen, &bktyp, (void *) &pmbk) == SS_SUCCESS) { /* bank name given through argument list */
571  status = bk_list(pmbh, banklist);
572  printf("#banks:%i Bank list:-%s-", status, banklist);
573  yb_any_bank_display(pmbh, pmbk, FORMAT_MIDAS, dsp_mode, dsp_fmt);
574  } else {
575  status = bk_list(pmbh, banklist);
576  printf("Bank -%s- not found (%i) in ", sbank_name, status);
577  printf("#banks:%i Bank list:-%s-\n", status, banklist);
578  }
579  } else { /* Full event or bank list only */
580  if (disp_bank_list) {
581  /* event header */
582  printf
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);
588  } else
589  yb_any_event_display(pheader, FORMAT_MIDAS, dsp_mode, dsp_fmt);
590  }
591  } else { /* unknown format just dump midas event */
592  printf("Data format not supported: %s\n", eq[index].Fmt);
593  yb_any_event_display(pheader, FORMAT_MIDAS, DSP_RAW, dsp_fmt);
594  }
595  if (evt_display == 0) {
596  cm_disconnect_experiment();
597  exit(0);
598  }
599  if (dsp_time != 0)
600  ss_sleep(dsp_time);
601  }
602  return;
603 }
604 
605 /*------------------------------------------------------------------*/
606 int main(int argc, char **argv)
607 {
608  HNDLE hDB, hKey;
609  char host_name[HOST_NAME_LENGTH], expt_name[NAME_LENGTH], str[80];
610  char buf_name[32] = EVENT_BUFFER_NAME, rep_file[128];
611  double rate;
612  unsigned int status, start_time, stop_time;
613  BOOL debug = FALSE, rep_flag;
614  INT ch, request_id, size, get_flag, action, i;
615  BUFFER_HEADER buffer_header;
616 
617  /* set default */
618  host_name[0] = 0;
619  expt_name[0] = 0;
620  sbank_name[0] = 0;
621  svpath[0] = 0;
622  rep_file[0] = 0;
623  event_id = EVENTID_ALL;
624  event_msk = TRIGGER_ALL;
625  evt_display = 1;
626  get_flag = GET_SOME;
627  dsp_fmt = DSP_UNK;
628  dsp_mode = DSP_BANK;
629  file_mode = YB_NO_RECOVER;
630  via_callback = TRUE;
631  rep_flag = FALSE;
632  dsp_time = 0;
633  speed = 0;
634  consistency = 0;
635  action = REP_EVENT;
636 
637  /* Get if existing the pre-defined experiment */
638  cm_get_environment(host_name, sizeof(host_name), expt_name, sizeof(expt_name));
639 
640  /* scan arg list for -x which specify the replog configuration */
641  for (i = 1; i < argc; i++) {
642  if (strncmp(argv[i], "-x", 2) == 0) {
643  if (i + 1 == argc)
644  goto repusage;
645  if (strncmp(argv[++i], "online", 6) != 0) {
646  rep_flag = TRUE;
647  break;
648  }
649  }
650  }
651  if (rep_flag) {
652  /* get Replay argument list */
653  data_fmt = 0;
654  for (i = 1; i < argc; i++) {
655  if (argv[i][0] == '-' && argv[i][1] == 'd')
656  debug = TRUE;
657  else if (argv[i][0] == '-') {
658  if (i + 1 >= argc || argv[i + 1][0] == '-')
659  goto repusage;
660  if (strncmp(argv[i], "-t", 2) == 0) {
661  sprintf(str, argv[++i]);
662  if (strncmp(str, "m", 1) == 0)
663  data_fmt = FORMAT_MIDAS;
664  if (strncmp(str, "y", 1) == 0)
665  data_fmt = FORMAT_YBOS;
666  } else if (strncmp(argv[i], "-b", 2) == 0)
667  strncpy(sbank_name, argv[++i], 4);
668  else if (strncmp(argv[i], "-i", 2) == 0)
669  event_id = atoi(argv[++i]);
670  else if (strncmp(argv[i], "-k", 2) == 0)
671  event_msk = atoi(argv[++i]);
672  else if (strncmp(argv[i], "-m", 2) == 0) {
673  sprintf(str, argv[++i]);
674  if (strncmp(str, "r", 1) == 0)
675  dsp_mode = DSP_RAW;
676  if (strncmp(str, "b", 1) == 0)
677  dsp_mode = DSP_BANK;
678  } else if (strncmp(argv[i], "-w", 2) == 0) {
679  sprintf(str, argv[++i]);
680  if (strncmp(str, "h", 1) == 0)
681  action = REP_HEADER;
682  else if (strncmp(str, "r", 1) == 0)
683  action = REP_RECORD;
684  else if (strncmp(str, "l", 1) == 0)
685  action = REP_LENGTH;
686  else if (strncmp(str, "e", 1) == 0)
687  action = REP_EVENT;
688  else if (strncmp(str, "j", 1) == 0)
689  action = REP_BANKLIST;
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)
695  file_mode = YB_NO_RUN;
696  if (strncmp(str, "a", 1) == 0 || strncmp(str, "A", 1) == 0)
697  file_mode = YB_ADD_RUN;
698  } else if (strncmp(argv[i], "-f", 2) == 0) {
699  sprintf(str, argv[++i]);
700  if (strncmp(str, "d", 1) == 0)
701  dsp_fmt = DSP_DEC;
702  if (strncmp(str, "x", 1) == 0)
703  dsp_fmt = DSP_HEX;
704  if (strncmp(str, "a", 1) == 0)
705  dsp_fmt = DSP_ASC;
706  } else if (strncmp(argv[i], "-r", 2) == 0)
707  bl = atoi(argv[++i]);
708  else if (strncmp(argv[i], "-x", 2) == 0) {
709  if (i + 1 == argc)
710  goto repusage;
711  strcpy(rep_file, argv[++i]);
712  } else {
713  repusage:
714  printf("mdump for replay -x file name : file to inspect\n");
715  printf
716  (" -m mode : Display mode either Bank or raw\n");
717  printf
718  (" -b bank name : search for bank name (case sensitive)\n");
719  printf(" -i evt_id (any) : event id from the FE\n");
720  printf
721  (" -k mask (any) : trigger_mask from FE setting\n");
722  printf
723  (">>> -i and -k are valid for YBOS ONLY if EVID bank is present in the event\n");
724  printf
725  (" -w what : Header, Record, Length, Event, Jbank_list\n");
726  printf
727  (">>> Header & Record are not supported for MIDAS as no physical record structure\n");
728  printf
729  (" -f format (auto): data representation (x/d/ascii) def:bank header content\n");
730  printf
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");
734  printf
735  (" -c compose : retrieve file from event (Addrun#/Norun#)\n");
736  printf
737  (" -r # : skip record(YBOS) or event(MIDAS) to #\n");
738  return 0;
739  }
740  }
741  }
742  } else {
743  /* get parameters for online */
744  for (i = 1; i < argc; i++) {
745  if (argv[i][0] == '-' && argv[i][1] == 'd')
746  debug = TRUE;
747  else if (strncmp(argv[i], "-s", 2) == 0)
748  speed = 1;
749  else if (strncmp(argv[i], "-y", 2) == 0)
750  consistency = 1;
751  else if (strncmp(argv[i], "-j", 2) == 0)
752  disp_bank_list = 1;
753  else if (argv[i][0] == '-') {
754  if (i + 1 >= argc || argv[i + 1][0] == '-')
755  goto usage;
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)
759  strncpy(sbank_name, argv[++i], 4);
760  else if (strncmp(argv[i], "-l", 2) == 0)
761  save_dsp = evt_display = atoi(argv[++i]);
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) {
765  sprintf(str, argv[++i]);
766  if (strncmp(str, "r", 1) == 0)
767  dsp_mode = DSP_RAW;
768  if (strncmp(str, "y", 1) == 0)
769  dsp_mode = DSP_BANK;
770  } else if (strncmp(argv[i], "-g", 2) == 0) {
771  sprintf(str, argv[++i]);
772  if (strncmp(str, "s", 1) == 0)
773  get_flag = GET_SOME;
774  if (strncmp(str, "a", 1) == 0)
775  get_flag = GET_ALL;
776  } else if (strncmp(argv[i], "-f", 2) == 0) {
777  sprintf(str, argv[++i]);
778  if (strncmp(str, "d", 1) == 0)
779  dsp_fmt = DSP_DEC;
780  if (strncmp(str, "x", 1) == 0)
781  dsp_fmt = DSP_HEX;
782  if (strncmp(str, "a", 1) == 0)
783  dsp_fmt = DSP_ASC;
784  } else if (strncmp(argv[i], "-i", 2) == 0)
785  event_id = atoi(argv[++i]);
786  else if (strncmp(argv[i], "-k", 2) == 0)
787  event_msk = atoi(argv[++i]);
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) {
793  sprintf(str, argv[++i]);
794  if (strncmp(str, "m", 1) == 0)
795  data_fmt = FORMAT_MIDAS;
796  if (strncmp(str, "y", 1) == 0)
797  data_fmt = FORMAT_YBOS;
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)
801  file_mode = YB_NO_RUN;
802  if (strncmp(str, "a", 1) == 0 || strncmp(str, "A", 1) == 0)
803  file_mode = YB_ADD_RUN;
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]);
808  else {
809  usage:
810  printf("mdump for online -l # : display # events (look 1)\n");
811  printf
812  (" -f format (auto): data representation (x/d/ascii) def:bank header content\n");
813  printf
814  (" -p path (null) : path for file composition (see -c)\n");
815  printf(" -t type (auto) : Bank format (Midas/Ybos)\n");
816  printf
817  (" -c compose : retrieve file from event (Addrun#/Norun#)\n");
818  printf
819  (" -w time : insert wait in [sec] between each display\n");
820  printf
821  (" -m mode : Display mode either Bank or raw\n");
822  printf
823  (" -j : Display # of banks and bank name list only\n");
824  printf
825  (" -b bank name : search for bank name (case sensitive)\n");
826  printf(" -i evt_id (any) : event id from the FE\n");
827  printf
828  (" -k mask (any) : trigger_mask from FE setting\n");
829  printf
830  (">>> -i and -k are valid for YBOS ONLY if EVID bank is present in the event\n");
831  printf
832  (" -g type : sampling mode either SOME or all)\n");
833  printf(">>> in case of -c it is recommented to used -g all\n");
834  printf
835  (" -s : speed test for connection test\n");
836  printf
837  (" -x Source : Data source selection def:online (see -x -h)\n");
838  printf
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");
843  return 0;
844  }
845  }
846  }
847  }
848 
849 
850  /*-- decompression initialization ----------------------------------------*/
851  zstrm.zalloc = Z_NULL;
852  zstrm.zfree = Z_NULL;
853  zstrm.opaque = Z_NULL;
854  zstrm.avail_in = 0;
855  zstrm.next_in = Z_NULL;
856 
857  if ( inflateInit(&zstrm) != Z_OK)
858  {
859  printf("***ERROR! decompressing initialization fail!\n");
860  return 1;
861  }
862 
863  zbuf = (unsigned char*) malloc( MAX_EVENT_SIZE );
864 
865  if ( !zbuf )
866  {
867  printf("***ERROR! Can't allocate memory for aux. decompression buffer!\n");
868  return 1;
869  }
870 
871 
872  if (rep_flag && data_fmt == 0) {
873  char *pext;
874  if ((pext = strrchr(rep_file, '.')) != 0) {
875  if (equal_ustring(pext + 1, "mid"))
876  data_fmt = FORMAT_MIDAS;
877  else if (equal_ustring(pext + 1, "ybs"))
878  data_fmt = FORMAT_YBOS;
879  else if (equal_ustring(pext + 1, "gz")) {
880  if ((pext = strchr(rep_file, '.')) != 0) {
881  if (strstr(pext + 1, "mid"))
882  data_fmt = FORMAT_MIDAS;
883  else if (strstr(pext + 1, "ybs"))
884  data_fmt = FORMAT_YBOS;
885  } else {
886  printf
887  ("\n>>> data type (-t) should be set by hand in -x mode for tape <<< \n\n");
888  goto usage;
889  }
890  } else {
891  printf
892  ("\n>>> data type (-t) should be set by hand in -x mode for tape <<< \n\n");
893  goto usage;
894  }
895  }
896  }
897  /* steer to replog function */
898  if (rep_flag) {
899  replog(data_fmt, rep_file, bl, action);
900  return 0;
901  } else
902  /* check parameters */
903  if (evt_display < 1 && evt_display > 1000) {
904  printf("mdump-F- <-display arg> out of range (1:1000)\n");
905  return -1;
906  }
907  if (dsp_time < 0 && dsp_time > 100) {
908  printf("mdump-F- <-delay arg> out of range (1:100)\n");
909  return -1;
910  }
911 
912  /* connect to experiment */
913 
914  status = cm_connect_experiment(host_name, expt_name, "mdump", 0);
915  if (status != CM_SUCCESS)
916  return 1;
917 
918 #ifdef _DEBUG
919  cm_set_watchdog_params(TRUE, 0);
920 #endif
921 
922  /* open the "system" buffer, 1M size */
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");
926  goto error;
927  }
928  /* set the buffer cache size if requested */
929  bm_set_cache_size(hBufEvent, 100000, 0);
930 
931  /* place a request for a specific event id */
932  bm_request_event(hBufEvent, (WORD) event_id, (WORD) event_msk,
933  get_flag, &request_id, process_event);
934 
935  start_time = 0;
936  if (speed == 1)
937  printf("-%s -- Enter <!> to Exit ------- Midas Dump in Speed test mode ---\n",
938  cm_get_version());
939  else
940  printf("-%s -- Enter <!> to Exit ------- Midas Dump ---\n", cm_get_version());
941 
942  /* connect to the database */
943  cm_get_experiment_database(&hDB, &hKey);
944 
945  { /* ID block */
946  INT l = 0;
947  memset((char *) eq, 0, 32 * sizeof(FMT_ID));
948  /* check if dir exists */
949  if (db_find_key(hDB, 0, "/equipment", &hKey) == DB_SUCCESS) {
950  char strtmp[256], equclient[32];
951  for (i = 0;; i++) {
952  db_enum_key(hDB, hKey, i, &hSubkey);
953  if (!hSubkey)
954  break;
955  db_get_key(hDB, hSubkey, &key);
956  sprintf(eq[l].Eqname, key.name);
957  /* check if client running this equipment is present */
958  /* extract client name from equipment */
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);
962 
963  /* search client name under /system/clients/xxx/name */
964  /* Outcommented 22 Dec 1997 SR because of problem when
965  mdump is started before frontend
966  if (status = cm_exist(equclient,FALSE) != CM_SUCCESS)
967  continue;
968  */
969  size = sizeof(WORD);
970  sprintf(strtmp, "/equipment/%s/common/event ID", key.name);
971  db_get_value(hDB, 0, strtmp, &(eq[l]).id, &size, TID_WORD, TRUE);
972 
973  size = sizeof(WORD);
974  sprintf(strtmp, "/equipment/%s/common/Trigger mask", key.name);
975  db_get_value(hDB, 0, strtmp, &(eq[l]).msk, &size, TID_WORD, TRUE);
976 
977  size = sizeof(str);
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");
998  }
999  l++;
1000  }
1001  }
1002 
1003  /* for equipment */
1004  /* check for EBuilder */
1005  if (db_find_key(hDB, 0, "/EBuilder/Settings", &hKey) == DB_SUCCESS) {
1006  sprintf(eq[l].Eqname, "EBuilder");
1007  /* check if client running this equipment is present */
1008  /* search client name under /system/clients/xxx/name */
1009  /* Outcommented 22 Dec 1997 SR because of problem when
1010  mdump is started before frontend
1011  if (status = cm_exist(equclient,FALSE) != CM_SUCCESS)
1012  continue;
1013  */
1014  size = sizeof(WORD);
1015  db_get_value(hDB, hKey, "Event ID", &(eq[l]).id, &size, TID_WORD, TRUE);
1016 
1017  size = sizeof(WORD);
1018  db_get_value(hDB, hKey, "Trigger mask", &(eq[l]).msk, &size, TID_WORD, TRUE);
1019 
1020  size = sizeof(str);
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");
1028  } else {
1029  printf("Format unknown for Event Builder (%s)\n", str);
1030  goto error;
1031  }
1032  l++;
1033  }
1034  /* Debug */
1035  if (debug) {
1036  i = 0;
1037  printf("ID\tMask\tFormat\tEq_name\n");
1038  while (eq[i].fmt) {
1039  printf("%d\t%d\t%s\t%s\n", eq[i].id, eq[i].msk, eq[i].Fmt, eq[i].Eqname);
1040  i++;
1041  }
1042  }
1043  } /* ID block */
1044 
1045  do {
1046  if (via_callback)
1047  status = cm_yield(1000);
1048  if (speed == 1) {
1049  /* calculate rates each second */
1050  if (ss_millitime() - start_time > 1000) {
1051  stop_time = ss_millitime();
1052  rate = count / 1024.0 / 1024.0 / ((stop_time - start_time) / 1000.0);
1053 
1054  /* get information about filling level of the buffer */
1055  bm_get_buffer_info(hBufEvent, &buffer_header);
1056  size = buffer_header.read_pointer - buffer_header.write_pointer;
1057  if (size <= 0)
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);
1061 
1062  start_time = stop_time;
1063  count = 0;
1064  }
1065  }
1066 
1067  /* speed */
1068  /* check keyboard */
1069  ch = 0;
1070  if (ss_kbhit()) {
1071  ch = ss_getchar(0);
1072  if (ch == -1)
1073  ch = getchar();
1074  if ((char) ch == '!')
1075  break;
1076  }
1077  } while (status != RPC_SHUTDOWN && status != SS_ABORT);
1078 
1079  error:
1080  cm_disconnect_experiment();
1081 
1082  free( zbuf );
1083  (void)inflateEnd(&zstrm);
1084 
1085  return 1;
1086 }