TPCCLIB
Loading...
Searching...
No Matches
parmean.c
Go to the documentation of this file.
1
8/*****************************************************************************/
9#include "tpcclibConfig.h"
10/*****************************************************************************/
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14#include <math.h>
15/*****************************************************************************/
16#include "tpcextensions.h"
17#include "tpcstatist.h"
18#include "tpcpar.h"
19/*****************************************************************************/
20
21/*****************************************************************************/
22static char *info[] = {
23 "Calculate mean, median, and SD of parameter values.",
24 "By default, statstics are calculated over all regional results.",
25 " ",
26 "Usage: @P [options] filename [filename for statistics]",
27 " ",
28 "Options:",
29 " -par=<list>",
30 " List of parameter numbers or names to use; all by default.",
31 " -tac=<list>",
32 " List of TAC numbers or names to use; all by default.",
33 " -stdoptions", // List standard options like --help, -v, etc
34 " ",
35 "Example 1:",
36 "Calculate statistics from parameter numbers 1-3 into a file",
37 " @P -par=1-3 simresults.par simstat.par",
38 " ",
39 "Example 2:",
40 "Calculate statistics from regions with name 'GM' and print in stdout",
41 " @P -tac=GM simresults.par",
42 " ",
43 "See also: paradd, parcoll, parformat, parrenp, parai, rescoll",
44 " ",
45 "Keywords: simulation, parameter, average, standard deviation",
46 0};
47/*****************************************************************************/
48
49/*****************************************************************************/
50/* Turn on the globbing of the command line, since it is disabled by default in
51 mingw-w64 (_dowildcard=0); in MinGW32 define _CRT_glob instead, if necessary;
52 In Unix&Linux wildcard command line processing is enabled by default. */
53/*
54#undef _CRT_glob
55#define _CRT_glob -1
56*/
57int _dowildcard = -1;
58/*****************************************************************************/
59
60/*****************************************************************************/
64int main(int argc, char **argv)
65{
66 int ai, help=0, version=0, verbose=1;
67 char newfile[FILENAME_MAX], parfile[FILENAME_MAX];
68 char *pars=NULL, *tacs=NULL; // remember to free allocated memory before exit
69 int drymode=0; // 1=no files are actually edited or created
70
71
72
73 /*
74 * Get arguments
75 */
76 if(argc==1) {tpcPrintUsage(argv[0], info, stderr); return(1);}
77 newfile[0]=parfile[0]=(char)0;
78 /* Options */
79 for(ai=1; ai<argc; ai++) if(*argv[ai]=='-') {
80 if(tpcProcessStdOptions(argv[ai], &help, &version, &verbose)==0) continue;
81 char *cptr=argv[ai]+1; if(*cptr=='-') cptr++; if(!*cptr) continue;
82 if(strncasecmp(cptr, "PAR=", 4)==0 && strnlen(cptr, 5)>4) {
83 pars=strdup(cptr+4); continue;
84 } else if(strncasecmp(cptr, "TAC=", 4)==0 && strnlen(cptr, 5)>4) {
85 tacs=strdup(cptr+4); continue;
86 } else if(strncasecmp(cptr, "DRY", 2)==0) {
87 drymode=1; continue;
88 }
89 fprintf(stderr, "Error: invalid option '%s'.\n", argv[ai]);
90 return(1);
91 } else break; // tac name argument may start with '-'
92
93 /* Print help or version? */
94 if(help==2) {tpcHtmlUsage(argv[0], info, ""); free(pars); free(tacs); return(0);}
95 if(help) {tpcPrintUsage(argv[0], info, stdout); free(pars); free(tacs); return(0);}
96 if(version) {tpcPrintBuild(argv[0], stdout); free(pars); free(tacs); return(0);}
97
98 TPCSTATUS status; statusInit(&status);
99 statusSet(&status, __func__, __FILE__, __LINE__, TPCERROR_OK);
100 status.verbose=verbose-3;
101
102 /* Process other arguments, starting from the first non-option */
103 if(ai<argc) {strlcpy(parfile, argv[ai], FILENAME_MAX); ai++;}
104 if(ai<argc) {strlcpy(newfile, argv[ai], FILENAME_MAX); ai++;}
105 if(ai<argc) {
106 fprintf(stderr, "Error: too many arguments: '%s'.\n", argv[ai]);
107 return(1);
108 }
109
110 /* Did we get all the information that we need? */
111 if(!parfile[0]) {
112 fprintf(stderr, "Error: missing parameter filename.\n");
113 return(1);
114 }
115
116
117 /* In verbose mode print arguments and options */
118 if(verbose>1) {
119 printf("parfile := %s\n", parfile);
120 if(newfile[0]) printf("newfile := %s\n", newfile);
121 if(pars!=NULL) printf("pars := '%s'\n", pars);
122 if(tacs!=NULL) printf("tacs := '%s'\n", tacs);
123 printf("drymode := %d\n", drymode);
124 }
125
126
127
128 /*
129 * Read the file
130 */
131 if(verbose>1) printf("reading %s\n", parfile);
132 PAR par; parInit(&par);
133 if(parRead(&par, parfile, &status)!=TPCERROR_OK) {
134 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
135 parFree(&par); return(2);
136 }
137 if(verbose>2) {
138 printf("fileformat := %s\n", parFormattxt(par.format));
139 printf("parNr := %d\n", par.parNr);
140 printf("tacNr := %d\n", par.tacNr);
141 }
142 if(par.tacNr<2 || par.parNr<1) {
143 fprintf(stderr, "Error: no data to calculate statistics.\n");
144 parFree(&par); return(2);
145 }
146 /* Sort regions by name */
147 if(parSortByName(&par, &status)!=TPCERROR_OK) {
148 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
149 parFree(&par); return(2);
150 }
151
152 /* List the region and parameter names */
153 if(verbose>10) {
154 fflush(stdout);
155 printf("\nRegion names in %s:\n", parfile);
156 for(int i=0; i<par.tacNr; i++) printf("%s\n", par.r[i].name);
157 fflush(stdout);
158 printf("\nParameter names in %s:\n", parfile);
159 for(int i=0; i<par.parNr; i++) printf("%s\n", par.n[i].name);
160 fflush(stdout);
161 }
162
163
164 /*
165 * Select the data to be used
166 */
167 int parNr=0, tacNr=0;
168
169 if(pars==NULL) {
170 /* No parameters specified: select all */
171 parSelectParameters(&par, NULL, 0, &status);
172 } else {
173 char buf[512];
174 for(int i=0; i<strTokenNr(pars, ",;"); i++) {
175 if(strTokenNCpy(pars, ",;", i+1, buf, 512)<1) continue;
176 int n=parSelectParameters(&par, buf, 0, &status);
177 if(n==0) fprintf(stderr, "Warning: no parameter(s) match '%s'\n", buf);
178 else if(verbose>2) printf("%d parameter(s) match '%s'\n", n, buf);
179 }
180 }
181 parNr=parSelectedParameters(&par);
182 if(parNr==0) {
183 fprintf(stderr, "Error: no matching parameter(s) to use.\n");
184 parFree(&par); free(pars); free(tacs); return(3);
185 }
186 if(verbose>2 || drymode) {
187 for(int i=0; i<par.parNr; i++)
188 if(par.n[i].sw) printf("selected_parameter: %s\n", par.n[i].name);
189 fflush(stdout);
190 }
191
192 if(tacs==NULL) {
193 /* No TACs specified: select all */
194 parSelectTACs(&par, NULL, 0, &status);
195 } else {
196 char buf[512];
197 for(int i=0; i<strTokenNr(tacs, ",;"); i++) {
198 if(strTokenNCpy(tacs, ",;", i+1, buf, 512)<1) continue;
199 int n=parSelectTACs(&par, buf, 0, &status);
200 if(n==0) fprintf(stderr, "Warning: no TAC(s) match '%s'\n", buf);
201 else if(verbose>2) printf("%d TAC(s) match '%s'\n", n, buf);
202 }
203 }
204 tacNr=parSelectedTACs(&par);
205 if(tacNr==0) {
206 fprintf(stderr, "Error: no matching TAC(s) to use.\n");
207 parFree(&par); free(pars); free(tacs); return(4);
208 }
209 if(verbose>2 || drymode) {
210 for(int i=0; i<par.tacNr; i++)
211 if(par.r[i].sw) printf("selected_tac: %s\n", par.r[i].name);
212 fflush(stdout);
213 }
214 /* par and tac strings are not needed later */
215 free(pars); free(tacs);
216
217 /*
218 * Delete parameters and TACs that were not selected.
219 */
220 if(parNr!=par.parNr) {
221 int i=par.parNr-1;
222 while(i>=0) {
223 if(par.n[i].sw==0) parDeletePar(&par, i);
224 i--;
225 }
226 }
227 if(tacNr!=par.tacNr) {
228 int i=par.tacNr-1;
229 while(i>=0) {
230 if(par.r[i].sw==0) parDeleteTAC(&par, i);
231 i--;
232 }
233 }
234
235
236 /*
237 * Allocate space for the statistics
238 */
239 if(verbose>1) {printf("preparing the results\n"); fflush(stdout);}
240 PAR out; parInit(&out);
241 if(parAllocate(&out, par.parNr, 6)!=TPCERROR_OK) {
242 fprintf(stderr, "Error: cannot allocate memory.\n");
243 parFree(&par); return(5);
244 }
245 out.parNr=par.parNr; out.tacNr=6;
246 /* Set the file format */
247 if(newfile[0]) {
248 out.format=parFormatFromExtension(newfile);
249 if(out.format==PAR_FORMAT_UNKNOWN) out.format=par.format;
250 } else out.format=par.format;
252 /* Set parameter names */
253 for(int i=0; i<out.parNr; i++) strcpy(out.n[i].name, par.n[i].name);
254 /* Set 'tac' names */
255 strcpy(out.r[0].name, "Mean");
256 strcpy(out.r[1].name, "Median");
257 strcpy(out.r[2].name, "STDEV");
258 strcpy(out.r[3].name, "Min");
259 strcpy(out.r[4].name, "Max");
260 strcpy(out.r[5].name, "N");
261
262
263 /*
264 * Calculate the means etc
265 */
266 for(int pi=0; pi<par.parNr; pi++) {
267 if(verbose>2) {printf("computing statistics for %s\n", par.n[pi].name); fflush(stdout);}
268 int n=0;
269 double p[par.tacNr];
270 for(int ri=0; ri<par.tacNr; ri++) if(isfinite(par.r[ri].p[pi])) p[n++]=par.r[ri].p[pi];
271 statMeanSD(p, n, &out.r[0].p[pi], &out.r[2].p[pi], NULL);
272 out.r[1].p[pi]=statMedian(p, n);
273 doubleRange(p, n, &out.r[3].p[pi], &out.r[4].p[pi]);
274 out.r[5].p[pi]=n;
275 }
276 parFree(&par);
277
278
279 /*
280 * Write the results
281 */
282 {
283 FILE *fp=NULL;
284 if(newfile[0] && drymode==0) {
285 if(verbose>1) {printf(" saving\n"); fflush(stdout);}
286 fp=fopen(newfile, "w");
287 if(fp==NULL) {
288 fprintf(stderr, "Error: cannot open file for writing.\n");
289 parFree(&out); return(11);
290 }
291 } else {
292 fp=stdout;
293 }
294 if(newfile[0] && drymode) {printf(" results would be saved in %s\n", newfile); fflush(stdout);}
295 int ret=parWrite(&out, fp, PAR_FORMAT_UNKNOWN, 1, &status);
296 parFree(&out);
297 if(newfile[0] && drymode==0) fclose(fp);
298 if(ret!=TPCERROR_OK) {
299 fprintf(stderr, "Error: %s\n", errorMsg(status.error));
300 return(12);
301 }
302 if(drymode==0 && newfile[0] && verbose>0) printf("written %s\n", newfile);
303 }
304
305 return(0);
306}
307/*****************************************************************************/
308
309/*****************************************************************************/
unsigned int doubleRange(double *a, const unsigned int n, double *amin, double *amax)
Definition doubleutil.c:174
int statMeanSD(double *data, unsigned int n, double *mean, double *sd, unsigned int *vn)
Definition mean.c:25
double statMedian(double *a, const int n)
Definition median.c:25
int parDeletePar(PAR *par, int pi)
Definition par.c:478
void parFree(PAR *par)
Definition par.c:75
int parAllocate(PAR *par, int parNr, int tacNr)
Definition par.c:108
void parInit(PAR *par)
Definition par.c:25
int parDeleteTAC(PAR *par, int ti)
Definition par.c:519
char * parFormattxt(parformat c)
Definition pario.c:59
int parWrite(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
Definition pario.c:148
int parRead(PAR *par, const char *fname, TPCSTATUS *status)
Definition pario.c:232
int parFormatFromExtension(const char *s)
Definition pario.c:102
int parSortByName(PAR *d, TPCSTATUS *status)
Definition parorder.c:30
int parSelectTACs(PAR *d, const char *region_name, int reset, TPCSTATUS *status)
Definition parselect.c:24
int parSelectParameters(PAR *d, const char *par_name, int reset, TPCSTATUS *status)
Definition parselect.c:120
int parSelectedTACs(PAR *d)
Definition parselect.c:100
int parSelectedParameters(PAR *d)
Definition parselect.c:199
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
Definition proginfo.c:47
int tpcHtmlUsage(const char *program, char *text[], const char *path)
Definition proginfo.c:169
void tpcPrintBuild(const char *program, FILE *fp)
Definition proginfo.c:339
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
Definition proginfo.c:114
void statusInit(TPCSTATUS *s)
Definition statusmsg.c:104
char * errorMsg(tpcerror e)
Definition statusmsg.c:68
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
Definition statusmsg.c:142
int strTokenNr(const char *s1, const char *s2)
Definition stringext.c:25
char * strdup(const char *s)
Definition stringext.c:185
size_t strnlen(const char *s, size_t n)
Definition stringext.c:566
int strTokenNCpy(const char *s1, const char *s2, int i, char *s3, int count)
Definition stringext.c:53
size_t strlcpy(char *dst, const char *src, size_t dstsize)
Definition stringext.c:632
Definition tpcpar.h:100
int format
Definition tpcpar.h:102
int parNr
Definition tpcpar.h:108
int tacNr
Definition tpcpar.h:104
PARR * r
Definition tpcpar.h:114
PARN * n
Definition tpcpar.h:112
char sw
Definition tpcpar.h:94
char name[MAX_PARNAME_LEN+1]
Definition tpcpar.h:82
char name[MAX_TACNAME_LEN+1]
Definition tpcpar.h:50
char sw
Definition tpcpar.h:74
double * p
Definition tpcpar.h:64
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpcextensions.
@ TPCERROR_OK
No error.
Header file for libtpcpar.
@ PAR_FORMAT_UNKNOWN
Unknown format.
Definition tpcpar.h:28
@ PAR_FORMAT_TSV_UK
UK TSV (point as decimal separator).
Definition tpcpar.h:35
Header file for libtpcstatist.