Line data Source code
1 : /********************************************************************\
2 :
3 : Name: odbhist.c
4 : Created by: Stefan Ritt, Ilia Chachkhunashvili
5 :
6 : Contents: MIDAS history display utility
7 :
8 : $Id$
9 :
10 : \********************************************************************/
11 :
12 : #include <stdio.h>
13 : #include <string.h>
14 : #include <stdlib.h>
15 : #include <ctype.h>
16 : #include <fcntl.h>
17 :
18 : #ifdef _MSC_VER
19 : #include <io.h>
20 : #else
21 : #include <unistd.h>
22 : #endif
23 :
24 : /*------------------------------------------------------------------*/
25 :
26 : #define SUCCESS 1
27 : #define TRUE 1
28 : #define FALSE 0
29 :
30 : typedef unsigned int DWORD;
31 : typedef int INT;
32 : typedef int BOOL;
33 : typedef char str[256];
34 :
35 : /*------------------------------------------------------------------*/
36 :
37 : str var_params[100]; /* varables to print 100 each of 256 char lenth */
38 :
39 : DWORD status, start_run, end_run, run;
40 : INT i, quiet, add, j, k, eoln, boln;
41 : char file_name[256], var_name[256], mid_name[256];
42 : double total[100], value[100];
43 :
44 : /*------------------------------------------------------------------*/
45 :
46 0 : BOOL equal_ustring(char *str1, char *str2)
47 : {
48 0 : if (str1 == NULL && str2 != NULL)
49 0 : return FALSE;
50 0 : if (str1 != NULL && str2 == NULL)
51 0 : return FALSE;
52 0 : if (str1 == NULL && str2 == NULL)
53 0 : return TRUE;
54 :
55 0 : while (*str1)
56 0 : if (toupper(*str1++) != toupper(*str2++))
57 0 : return FALSE;
58 :
59 0 : if (*str2)
60 0 : return FALSE;
61 :
62 0 : return TRUE;
63 : }
64 :
65 : /*------------------------------------------------------------------*/
66 :
67 0 : int odb_hist(char *file_name, int run_number, char *var_name, int quiet,
68 : double *value, int eoln, int boln, int print)
69 : /********************************************************************\
70 :
71 : Routine: odb_hist
72 :
73 : Purpose: Print ODB variable for a single .odb file
74 :
75 : Input:
76 : char *file_name Name of ODB file
77 : INT run_number Run number for ODB file
78 : char *var_name Name of variable to print
79 : int quiet If set, don't print run number
80 : int eoln end of line used to detemine when to print "\n"
81 : int boln begin of line used to determin when to print
82 : run number if it's needed
83 : int print used to print or not the value of variable.
84 : This it's used for "Emils' function", so it
85 : will take and return the value of variable
86 : without printing it.
87 :
88 : Note:
89 : There are two variables eoln and boln because there can be begin
90 : and end of line together when we have just one variable.
91 :
92 : Output:
93 : double *value ODB value in double format
94 :
95 : Function value:
96 : SUCCESS Successful completion
97 :
98 : \********************************************************************/
99 : {
100 : FILE *f;
101 : char str[256], path[256], key_name[256], line[256];
102 : int i, index, a, k;
103 :
104 : /* assemble file name */
105 0 : snprintf(str, sizeof(str), file_name, run_number);
106 :
107 : /* split var_name into path and key with index */
108 0 : strcpy(path, "");
109 0 : for (i = strlen(var_name) - 1; i >= 0 && var_name[i] != '/'; i--);
110 0 : if (var_name[i] == '/') {
111 0 : strcpy(path, "[");
112 0 : strcat(path, var_name);
113 0 : path[i + 1] = 0;
114 0 : strcat(path, "]\n");
115 0 : strcpy(key_name, var_name + i + 1);
116 : }
117 0 : if (strchr(key_name, '[')) {
118 0 : index = atoi(strchr(key_name, '[') + 1);
119 0 : *strchr(key_name, '[') = 0;
120 : } else
121 0 : index = -1;
122 :
123 0 : f = fopen(str, "r");
124 0 : if (f == NULL)
125 0 : return 0;
126 :
127 0 : if ((!quiet) && boln && print)
128 0 : printf("%5d: ", run_number);
129 :
130 : /* search path */
131 : do {
132 : char* s;
133 0 : s = fgets(line, sizeof(line), f);
134 0 : if (s == NULL)
135 0 : break;
136 0 : if (line[0] == '[')
137 0 : if (equal_ustring(line, path)) {
138 : /* look for key */
139 : do {
140 0 : s = fgets(line, sizeof(line), f);
141 0 : if (s == NULL)
142 0 : break;
143 0 : if (strchr(line, '=') != NULL) {
144 0 : strcpy(str, line);
145 0 : *(strchr(str, '=') - 1) = 0;
146 :
147 : /* check if key name matches */
148 0 : if (equal_ustring(str, key_name)) {
149 0 : if (index == -1) {
150 : /* non-arrays */
151 0 : strcpy(str, strchr(line, '=') + 2);
152 0 : if (strchr(str, ':') != NULL) {
153 0 : strcpy(str, strchr(str, ':') + 2);
154 0 : if (strchr(str, '\n') != NULL)
155 0 : *strchr(str, '\n') = 0;
156 0 : if (str[0] == '[' && strchr(str, ']') != NULL)
157 0 : strcpy(str, strchr(str, ']') + 2);
158 0 : if (print)
159 0 : printf("%s", str);
160 0 : *value = strtod(str, NULL);
161 0 : goto finish;
162 : }
163 : } else {
164 : /* arrays */
165 0 : for (i = 0; i <= index; i++) {
166 0 : s = fgets(line, sizeof(line), f);
167 0 : if (s == NULL)
168 0 : break;
169 : }
170 0 : if (line[0] == '[' && atoi(line + 1) == index) {
171 0 : strcpy(str, strchr(line, ']') + 2);
172 0 : if (strchr(str, '\n') != NULL)
173 0 : *strchr(str, '\n') = 0;
174 0 : if (print)
175 0 : printf("%s", str);
176 0 : *value = strtod(str, NULL);
177 : }
178 0 : goto finish;
179 : }
180 :
181 : }
182 : }
183 :
184 0 : } while (line[0] != '[' || line[1] != '/');
185 :
186 : }
187 0 : } while (!feof(f));
188 :
189 0 : finish:
190 0 : if (print) {
191 0 : if (eoln)
192 0 : printf("\n");
193 : else {
194 0 : a = 0;
195 0 : while (str[a] != '\0')
196 0 : a++;
197 0 : k = a;
198 0 : while ((str[k] != '.') && (k >= 0))
199 0 : k--;
200 0 : for (i = 0; i < (10 - (a - k)); i++)
201 0 : printf(" ");
202 0 : printf("\t");
203 : }
204 0 : fclose(f);
205 : }
206 :
207 0 : return SUCCESS;
208 : }
209 :
210 : /*------------------------------------------------------------------*/
211 :
212 0 : int load_pars_from_file(char filename[256])
213 : /********************************************************************\
214 :
215 : Routine: load_pars_from_file
216 :
217 : Purpose: Load parameters for odbhist from file
218 :
219 : Input:
220 : char *filename Name of configuration file
221 :
222 : Output:
223 : <implicit through global variables>
224 :
225 : Function value:
226 : 1 Successful completion
227 : 0 Error
228 :
229 : \********************************************************************/
230 : {
231 : FILE *f1;
232 : char line[256];
233 : int result;
234 : int getstr;
235 :
236 0 : getstr = 1;
237 :
238 0 : f1 = fopen(filename, "r");
239 0 : if (f1 != NULL) {
240 0 : result = 1;
241 0 : while (result != 0) {
242 0 : if (getstr) {
243 0 : if (fgets(line, sizeof(line), f1) == NULL)
244 0 : break;
245 : } else
246 0 : getstr = 1;
247 :
248 0 : if (line[0] == '[') {
249 0 : switch (line[1]) {
250 0 : case 'a':
251 0 : if (fgets(line, sizeof(line), f1) != NULL) {
252 0 : switch (line[0]) {
253 0 : case '1':
254 0 : add = TRUE;
255 0 : break;
256 0 : case '0':
257 0 : add = FALSE;
258 0 : break;
259 0 : default:
260 0 : result = 0;
261 : }
262 : } else
263 0 : result = 0;
264 0 : break;
265 :
266 0 : case 'q':
267 0 : if (fgets(line, sizeof(line), f1) != NULL) {
268 0 : switch (line[0]) {
269 0 : case '1':
270 0 : quiet = TRUE;
271 0 : break;
272 0 : case '0':
273 0 : quiet = FALSE;
274 0 : break;
275 0 : default:
276 0 : result = 0;
277 : }
278 : } else
279 0 : result = 0;
280 0 : break;
281 :
282 0 : case 'f':
283 0 : if ((fgets(line, sizeof(line), f1) != NULL) && (line[0] != '['))
284 0 : strcpy(file_name, line);
285 : else
286 0 : result = 0;
287 0 : break;
288 :
289 0 : case 'v':
290 0 : j = -1;
291 0 : while (fgets(line, sizeof(line), f1) != NULL && line[0] != '[') {
292 0 : if (line[0] != '\n')
293 0 : strcpy(var_params[++j], line);
294 : }
295 0 : if (j == -1)
296 0 : result = 0;
297 : else
298 0 : getstr = 0;
299 :
300 : /* to get correct number of variables in "j" global variable */
301 0 : if (line[0] != '[')
302 0 : j--;
303 0 : break;
304 :
305 0 : case 'r':
306 0 : if ((fgets(line, sizeof(line), f1) != NULL) && (line[0] != '['))
307 0 : start_run = atoi(line);
308 : else {
309 0 : result = 0;
310 0 : break;
311 : }
312 0 : if ((fgets(line, sizeof(line), f1) != NULL) && (line[0] != '['))
313 0 : end_run = atoi(line);
314 : else {
315 0 : result = 0;
316 0 : break;
317 : }
318 :
319 0 : break;
320 :
321 0 : default:
322 0 : result = 0;
323 : }
324 : }
325 : } /* while */
326 : } /* if */
327 : else {
328 0 : result = 0;
329 0 : printf("\n ERROR:\nCan't open file %s\n", filename);
330 : }
331 0 : if (result != 0)
332 0 : if (fclose(f1))
333 0 : result = 0;
334 :
335 0 : return result;
336 : }
337 :
338 : /*------------------------------------------------------------------*/
339 :
340 : typedef struct {
341 : short int event_id; /**< event ID starting from one */
342 : short int trigger_mask; /**< hardware trigger mask */
343 : DWORD serial_number; /**< serial number starting from one */
344 : DWORD time_stamp; /**< time of production of event */
345 : DWORD data_size; /**< size of event in bytes w/o header */
346 : } EVENT_HEADER;
347 :
348 : #define EVENTID_BOR ((short int) 0x8000) /**< Begin-of-run */
349 : #define EVENTID_EOR ((short int) 0x8001) /**< End-of-run */
350 : #define EVENTID_MESSAGE ((short int) 0x8002) /**< Message events */
351 :
352 0 : int extract(char *mid_file, char *odb_file)
353 : /********************************************************************\
354 :
355 : Routine: extract
356 :
357 : Purpose: Extract ODB file from MID file
358 :
359 : Input:
360 : char *mid_file Midas file name, usually runxxxxx.mid
361 : char *odb_file ODB file name, usually runxxxxx.odb
362 :
363 : Function value:
364 : 1 Successful completion
365 : 0 Error
366 :
367 : \********************************************************************/
368 : {
369 : int fhm, fho, run_number;
370 : unsigned int n;
371 : EVENT_HEADER header;
372 : char *buffer, *p, odb_name[256];
373 :
374 0 : fhm = open(mid_file, O_RDONLY, 0644);
375 0 : if (fhm < 0) {
376 0 : printf("Cannot open file \"%s\"\n", mid_file);
377 0 : return 0;
378 : }
379 :
380 0 : if (strchr(odb_file, '%')) {
381 0 : p = mid_file;
382 0 : while (*p && !isdigit(*p))
383 0 : p++;
384 0 : run_number = atoi(p);
385 0 : snprintf(odb_name, sizeof(odb_name), odb_file, run_number);
386 : } else
387 0 : strcpy(odb_name, odb_file);
388 :
389 0 : fho = open(odb_name, O_WRONLY | O_CREAT | O_APPEND, 0644);
390 0 : if (fho < 0) {
391 0 : printf("Cannot open file \"%s\"\n", odb_name);
392 0 : return 0;
393 : }
394 :
395 0 : n = read(fhm, &header, sizeof(header));
396 0 : if (n != sizeof(header)) {
397 0 : printf("Cannot read event header from file \"%s\"\n", mid_file);
398 0 : return 0;
399 : }
400 :
401 0 : if (header.event_id != EVENTID_BOR) {
402 0 : printf("First event in \"%s\" is not a BOR event\n", mid_file);
403 0 : return 0;
404 : }
405 :
406 0 : buffer = (char*)malloc(header.data_size);
407 :
408 0 : n = read(fhm, buffer, header.data_size);
409 0 : if (n < header.data_size) {
410 0 : printf("Cannot read %d bytes from \"%s\"\n", header.data_size, mid_file);
411 0 : return 0;
412 : }
413 :
414 0 : n = write(fho, buffer, header.data_size);
415 0 : if (n < header.data_size) {
416 0 : printf("Cannot write %d bytes to \"%s\"\n", header.data_size, odb_name);
417 0 : return 0;
418 : }
419 :
420 0 : close(fhm);
421 0 : close(fho);
422 0 : free(buffer);
423 :
424 0 : printf("\"%s\" successfully created\n", odb_name);
425 0 : return 1;
426 : }
427 :
428 : /*------------------------------------------------------------------*/
429 :
430 0 : int main(int argc, char *argv[])
431 : {
432 : int cfg, print, n_files;
433 :
434 0 : strcpy(var_name, "/Runinfo/Run number");
435 0 : strcpy(file_name, "run%05d.odb");
436 0 : start_run = end_run = 0;
437 0 : quiet = FALSE;
438 0 : add = FALSE;
439 0 : print = 1; /* print = 1 means that variable will be printed */
440 :
441 0 : k = 0;
442 0 : cfg = 0;
443 0 : j = -1;
444 0 : n_files = 0;
445 0 : mid_name[0] = 0;
446 :
447 : /* parse command line parameters */
448 :
449 0 : for (i = 1; i < argc; i++) {
450 0 : if (argv[i][0] == '-')
451 0 : if (argv[i][1] == 'c') {
452 0 : printf("%s", argv[i + 1]);
453 0 : printf("\n");
454 0 : if (!(load_pars_from_file(argv[i + 1])))
455 0 : goto usage;
456 : else
457 0 : cfg = 1;
458 : }
459 : }
460 :
461 0 : if (argc <= 1)
462 0 : goto usage;
463 :
464 0 : for (i = 1; i < argc; i++) {
465 0 : if (argv[i][0] == '-') {
466 0 : if (argv[i][1] == 'q')
467 0 : quiet = TRUE;
468 0 : else if (argv[i][1] == 'a')
469 0 : add = TRUE;
470 : else {
471 0 : if (i + 1 >= argc || argv[i + 1][0] == '-')
472 0 : goto usage;
473 0 : if (argv[i][1] == 'r') {
474 0 : start_run = atoi(argv[++i]);
475 0 : end_run = atoi(argv[++i]);
476 0 : } else if (argv[i][1] == 'v') {
477 0 : j = -1;
478 0 : while (i + 1 < argc && argv[i + 1][0] != '-')
479 0 : if (argv[i + 1][0] != '-') {
480 0 : i++;
481 0 : j++;
482 0 : if (argv[i][0] != '-')
483 0 : strcpy(var_params[j], argv[i]);
484 : }
485 0 : } else if (argv[i][1] == 'f')
486 0 : strcpy(file_name, argv[++i]);
487 0 : else if (argv[i][1] == 'e')
488 0 : strcpy(mid_name, argv[++i]);
489 : else
490 0 : goto usage;
491 : }
492 0 : } else if (!cfg) {
493 :
494 0 : usage:
495 0 : printf("\nusage: odbhist -r <run1> <run2> -v <varname>[index]\n");
496 0 : printf(" [-f <filename>] [-q] [-a] [-c <file>] [-e <file>]\n");
497 0 : printf(" <run1> <run2> Range of run numbers (inclusive)\n");
498 : printf
499 0 : (" <varname> ODB variable name like \"/Runinfo/Run number\"\n");
500 0 : printf(" [index] Index if <varname> is an array\n");
501 0 : printf(" <filename> run%%05d.odb by default\n");
502 0 : printf(" -e <file> Extract ODB file from MID file\n");
503 0 : printf(" -q Don't display run number\n");
504 0 : printf(" -a Add numbers for all runs\n");
505 0 : printf(" -c load configuration from file\n");
506 0 : printf(" (parameters loaded from cfg file will be\n");
507 0 : printf(" overwriten by parameters from command line)\n");
508 0 : return 0;
509 :
510 : }
511 : }
512 :
513 0 : if (mid_name[0]) {
514 0 : extract(mid_name, file_name);
515 0 : return 1;
516 : }
517 :
518 0 : if (end_run < start_run) {
519 0 : printf("Second run is %d and must be larger or equal than first run %d\n",
520 : end_run, start_run);
521 0 : return 0;
522 : }
523 :
524 0 : if (j == -1)
525 0 : goto usage;
526 :
527 : /* printing of header is needed here */
528 0 : for (run = start_run; run <= end_run; run++) {
529 0 : for (k = 0; k <= j; k++) {
530 0 : if (k == j)
531 0 : eoln = 1;
532 : else
533 0 : eoln = 0;
534 :
535 0 : if (k == 0)
536 0 : boln = 1;
537 : else
538 0 : boln = 0;
539 :
540 0 : strcpy(var_name, var_params[k]);
541 0 : value[k] = 0;
542 :
543 0 : status = odb_hist(file_name, run, var_name, quiet, &value[k], eoln, boln, print);
544 0 : if (status != SUCCESS)
545 0 : break;
546 :
547 0 : total[k] += value[k];
548 0 : n_files++;
549 : } /*for k */
550 : } /* for run */
551 :
552 0 : if (add) {
553 0 : printf("\nTotal: ");
554 0 : if (quiet)
555 0 : printf("\n");
556 0 : for (k = 0; k <= j; k++)
557 0 : printf("%lf\t", total[k]);
558 0 : printf("\n");
559 : }
560 :
561 0 : if (n_files == 0) {
562 0 : printf("No files found in selected range\n");
563 : }
564 :
565 0 : return 1;
566 : }
|