LCOV - code coverage report
Current view: top level - progs - odbhist.cxx (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 288 0
Test Date: 2025-11-11 10:26:08 Functions: 0.0 % 5 0

            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              : }
        

Generated by: LCOV version 2.0-1