1 | #include <stdio.h>
|
---|
2 | #include <string.h>
|
---|
3 | #include <stdlib.h>
|
---|
4 | #include <math.h>
|
---|
5 | #include "version.h"
|
---|
6 | #include "diag.h"
|
---|
7 | #include "init.h"
|
---|
8 |
|
---|
9 | /* extern declarations */
|
---|
10 | FILE *filelist = NULL, /* filelist ptr */
|
---|
11 | *rflname = NULL; /* reflector (out)file */
|
---|
12 | char cername[LINE_MAX_LENGTH]; /* current cername */
|
---|
13 | long first_Event = 0, /* first proc. event */
|
---|
14 | last_Event = 1000000, /* last proc. event */
|
---|
15 | max_Events = 50000; /* max proc. events */
|
---|
16 | float low_Ecut = 0.0f, /* lower Ecut (GeV) */
|
---|
17 | high_Ecut = 100000.0f; /* upper Ecut (GeV) */
|
---|
18 |
|
---|
19 | int is_Fixed_Target = FALSE; /* fixed target? */
|
---|
20 | float fixed_Theta, /* zenith angle (rad) */
|
---|
21 | fixed_Phi; /* azi (0N->90E) (rad) */
|
---|
22 |
|
---|
23 | float Telescope_x = 0.;
|
---|
24 | float Telescope_y = 0.; /* Telescope coordinates (cm) */
|
---|
25 |
|
---|
26 | int wobble_position = 0;
|
---|
27 |
|
---|
28 | int is_Random_Pointing=FALSE; /* random pointing? */
|
---|
29 | float Random_Pointing_MaxDist; /* in metres */
|
---|
30 | int nRepeat_Random = 1; /* nr of times a sh. is reused */
|
---|
31 |
|
---|
32 | long Seeds[2] = {3141592L, 2718182L};
|
---|
33 |
|
---|
34 | /* Other declarations */
|
---|
35 | char whites[] = " \v\t\n\r"; /* White chars def */
|
---|
36 | char line[LINE_MAX_LENGTH]; /* parsing buffer */
|
---|
37 |
|
---|
38 | /* Prototypes */
|
---|
39 | static void CheckSignature(char *line);
|
---|
40 | int ParseLine(FILE *parfile, /* FILE with parms */
|
---|
41 | const char *token_list[], /* array w/tokens */
|
---|
42 | int tokens, /* nr of tokens */
|
---|
43 | char **value_ptr); /* ptr to parm val. */
|
---|
44 |
|
---|
45 | /* Checks signature.
|
---|
46 | * It separates tokens and compare the first
|
---|
47 | * token with PROGRAM and the second with VERSION.
|
---|
48 | * Both values are stored in "version.h".
|
---|
49 | * Return value is set to true if check fails. */
|
---|
50 |
|
---|
51 | static void CheckSignature(char *line)
|
---|
52 | { char *cp; /* To parse signature */
|
---|
53 |
|
---|
54 | if ((cp=strtok(line, whites)) == NULL || strcmp(cp, QUOTE(PROGRAM)) ||
|
---|
55 | (cp=strtok(NULL, whites)) == NULL || strcmp(cp, QUOTE(VERSION)))
|
---|
56 | FatalError(SIGN_ERROR_FTL, QUOTE(PROGRAM), QUOTE(VERSION));
|
---|
57 | } /* end of CheckSignature */
|
---|
58 |
|
---|
59 | int ParseLine(FILE *parfile, /* FILE with parms */
|
---|
60 | const char *token_list[], /* array w/tokens */
|
---|
61 | int tokens, /* nr of tokens */
|
---|
62 | char **value_ptr) /* ptr to parm val. */
|
---|
63 | { int item = tokens;
|
---|
64 | char *cp;
|
---|
65 |
|
---|
66 | do
|
---|
67 | { if (fgets(line, LINE_MAX_LENGTH, parfile) == NULL)
|
---|
68 | break;
|
---|
69 | else if (line[0] == '#'); /* skip comments (start with '#') */
|
---|
70 | else if (line[0] == '>') /* show user comments (start with '>') */
|
---|
71 | { if ((cp=strchr(line, '\n')) != NULL) *cp = 0;
|
---|
72 | puts(line); }
|
---|
73 | else if ((cp = strtok(line, whites)) != NULL)
|
---|
74 | { /* check which param it is */
|
---|
75 | for (item=0; item<tokens; item++)
|
---|
76 | if (strcmp(cp, token_list[item])==0)
|
---|
77 | break;
|
---|
78 | if (item < tokens)
|
---|
79 | *value_ptr = strtok(NULL, whites);
|
---|
80 | else Message(SKIP_TOKEN_MSG, cp); }}
|
---|
81 | while (item >= tokens);
|
---|
82 |
|
---|
83 | return item;
|
---|
84 | } /* end of ParseLine */
|
---|
85 |
|
---|
86 | FILE *geofile = NULL; /* geometry file */
|
---|
87 |
|
---|
88 | void init(char *filename)
|
---|
89 | { FILE *parfile = NULL; /* parms file */
|
---|
90 | extern void ParmsSwitch(FILE *parfile); /* std parsing fn */
|
---|
91 | extern void GeometrySwitch(FILE *geofile); /* geometry parsing fn */
|
---|
92 |
|
---|
93 | /* Open file or read from stdin */
|
---|
94 | if (filename) parfile = fopen("filename", "r");
|
---|
95 | if (parfile == NULL) parfile = stdin;
|
---|
96 | fgets(line, LINE_MAX_LENGTH, parfile);
|
---|
97 |
|
---|
98 | /* Check signature */
|
---|
99 | CheckSignature(line);
|
---|
100 |
|
---|
101 | ParmsSwitch(parfile);
|
---|
102 | if (geofile) GeometrySwitch(geofile);
|
---|
103 | else FatalError(GEOM_NSPEC_FTL);
|
---|
104 |
|
---|
105 | /* Alloc memory for CPhotons */
|
---|
106 | if ((CPhotons =
|
---|
107 | (cphoton *) malloc(NR_OF_CPHOTONS * sizeof(cphoton))) == NULL)
|
---|
108 | FatalError(CPHS_ALLOC_FTL, NR_OF_CPHOTONS);
|
---|
109 | else Log(CPHS_ALLOC_LOG, NR_OF_CPHOTONS);
|
---|
110 |
|
---|
111 | /* Write signature and START_OF_RUN at the beginning of rflfile */
|
---|
112 | /* '\0' for backward compatibility */
|
---|
113 | fseek(rflfile, 0L, SEEK_SET);
|
---|
114 | fprintf(rflfile, "%s %s", QUOTE(PROGRAM), QUOTE(VERSION));
|
---|
115 | fputc(0, rflfile);
|
---|
116 | fwrite(FLAG_START_OF_RUN, SIZE_OF_FLAGS, 1, rflfile);
|
---|
117 |
|
---|
118 | /* "Splashscreen" */
|
---|
119 | Message(RFL__START_MSG, QUOTE(PROGRAM), QUOTE(VERSION));
|
---|
120 | } /* end of init */
|
---|