9#include "tpcclibConfig.h"
22static char *info[] = {
23 "Calculate mean, median, and SD of parameter values.",
24 "By default, statstics are calculated over all regional results.",
26 "Usage: @P [options] filename [filename for statistics]",
30 " List of parameter numbers or names to use; all by default.",
32 " List of TAC numbers or names to use; all by default.",
36 "Calculate statistics from parameter numbers 1-3 into a file",
37 " @P -par=1-3 simresults.par simstat.par",
40 "Calculate statistics from regions with name 'GM' and print in stdout",
41 " @P -tac=GM simresults.par",
43 "See also: paradd, parcoll, parformat, parrenp, parai, rescoll",
45 "Keywords: simulation, parameter, average, standard deviation",
64int main(
int argc,
char **argv)
66 int ai, help=0, version=0, verbose=1;
67 char newfile[FILENAME_MAX], parfile[FILENAME_MAX];
68 char *pars=NULL, *tacs=NULL;
76 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
77 newfile[0]=parfile[0]=(char)0;
79 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
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) {
89 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
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);}
103 if(ai<argc) {
strlcpy(parfile, argv[ai], FILENAME_MAX); ai++;}
104 if(ai<argc) {
strlcpy(newfile, argv[ai], FILENAME_MAX); ai++;}
106 fprintf(stderr,
"Error: too many arguments: '%s'.\n", argv[ai]);
112 fprintf(stderr,
"Error: missing parameter filename.\n");
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);
131 if(verbose>1) printf(
"reading %s\n", parfile);
139 printf(
"parNr := %d\n", par.
parNr);
140 printf(
"tacNr := %d\n", par.
tacNr);
143 fprintf(stderr,
"Error: no data to calculate statistics.\n");
155 printf(
"\nRegion names in %s:\n", parfile);
156 for(
int i=0; i<par.
tacNr; i++) printf(
"%s\n", par.
r[i].
name);
158 printf(
"\nParameter names in %s:\n", parfile);
159 for(
int i=0; i<par.
parNr; i++) printf(
"%s\n", par.
n[i].
name);
167 int parNr=0, tacNr=0;
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);
183 fprintf(stderr,
"Error: no matching parameter(s) to use.\n");
184 parFree(&par); free(pars); free(tacs);
return(3);
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);
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);
206 fprintf(stderr,
"Error: no matching TAC(s) to use.\n");
207 parFree(&par); free(pars); free(tacs);
return(4);
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);
215 free(pars); free(tacs);
220 if(parNr!=par.
parNr) {
227 if(tacNr!=par.
tacNr) {
239 if(verbose>1) {printf(
"preparing the results\n"); fflush(stdout);}
242 fprintf(stderr,
"Error: cannot allocate memory.\n");
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");
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);}
270 for(
int ri=0; ri<par.
tacNr; ri++)
if(isfinite(par.
r[ri].
p[pi])) p[n++]=par.
r[ri].
p[pi];
284 if(newfile[0] && drymode==0) {
285 if(verbose>1) {printf(
" saving\n"); fflush(stdout);}
286 fp=fopen(newfile,
"w");
288 fprintf(stderr,
"Error: cannot open file for writing.\n");
294 if(newfile[0] && drymode) {printf(
" results would be saved in %s\n", newfile); fflush(stdout);}
297 if(newfile[0] && drymode==0) fclose(fp);
302 if(drymode==0 && newfile[0] && verbose>0) printf(
"written %s\n", newfile);
unsigned int doubleRange(double *a, const unsigned int n, double *amin, double *amax)
int statMeanSD(double *data, unsigned int n, double *mean, double *sd, unsigned int *vn)
int parDeletePar(PAR *par, int pi)
int parAllocate(PAR *par, int parNr, int tacNr)
int parDeleteTAC(PAR *par, int ti)
char * parFormattxt(parformat c)
int parWrite(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
int parRead(PAR *par, const char *fname, TPCSTATUS *status)
int parFormatFromExtension(const char *s)
int parSortByName(PAR *d, TPCSTATUS *status)
int parSelectTACs(PAR *d, const char *region_name, int reset, TPCSTATUS *status)
int parSelectParameters(PAR *d, const char *par_name, int reset, TPCSTATUS *status)
int parSelectedTACs(PAR *d)
int parSelectedParameters(PAR *d)
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
int tpcHtmlUsage(const char *program, char *text[], const char *path)
void tpcPrintBuild(const char *program, FILE *fp)
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
void statusInit(TPCSTATUS *s)
char * errorMsg(tpcerror e)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
int strTokenNr(const char *s1, const char *s2)
char * strdup(const char *s)
size_t strnlen(const char *s, size_t n)
int strTokenNCpy(const char *s1, const char *s2, int i, char *s3, int count)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
char name[MAX_PARNAME_LEN+1]
char name[MAX_TACNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for library libtpcextensions.
Header file for libtpcpar.
@ PAR_FORMAT_UNKNOWN
Unknown format.
@ PAR_FORMAT_TSV_UK
UK TSV (point as decimal separator).
Header file for libtpcstatist.