TPCCLIB
Loading...
Searching...
No Matches
dftmax.c
Go to the documentation of this file.
1
7/*****************************************************************************/
8#include "tpcclibConfig.h"
9/*****************************************************************************/
10#include <stdio.h>
11#include <stdlib.h>
12#include <unistd.h>
13#include <math.h>
14#include <string.h>
15/*****************************************************************************/
16#include "libtpcmisc.h"
17#include "libtpccurveio.h"
18#include "libtpcmodel.h"
19#include "libtpcmodext.h"
20/*****************************************************************************/
21
22/*****************************************************************************/
23static char *info[] = {
24 "Finds the maximum (or minimum) value and its time in TAC file(s).",
25 " ",
26 "Usage: @P [Options] tacfile(s)",
27 " ",
28 "Options:",
29 " -min",
30 " Find the minimum value, instead of maximum.",
31 " -c[lean]",
32 " Only the maximum or minimum value of ALL specified files is printed.",
33 " -x[=<y|N>]",
34 " Time of maximum is printed (y) or not (n, default).",
35 " -f[=<y|N>]",
36 " Time frame (1..sampleNr) of maximum is printed (y) or not (n, default).",
37 " -y[=<Y|n>]",
38 " Maximum value is printed (y, default) or not (n).",
39 " -robust",
40 " Search is limited to the longest range above and below median",
41 " -stdoptions", // List standard options like --help, -v, etc
42 " ",
43 "Example 1: Get maximum of all TACs into DOS variable 'MAXVAL':",
44 " @P -clean *.tac > max.txt",
45 " set /p MAXVAL=<max.txt",
46 " ",
47 "See also: tacpeak, tacunit, tacframe, tacrange, imgmax",
48 " ",
49 "Keywords: TAC, peak, max, min",
50 0};
51/*****************************************************************************/
52
53/*****************************************************************************/
54/* Turn on the globbing of the command line, since it is disabled by default in
55 mingw-w64 (_dowildcard=0); in MinGW32 define _CRT_glob instead, if necessary;
56 In Unix&Linux wildcard command line processing is enabled by default. */
57/*
58#undef _CRT_glob
59#define _CRT_glob -1
60*/
61int _dowildcard = -1;
62/*****************************************************************************/
63
64/*****************************************************************************/
68int main(int argc, char **argv)
69{
70 int ai, help=0, version=0, verbose=1;
71 int ret, fileNr=0, firstfile=0;
72 int cleanOutput=0;
73 int robust_mode=0; // 0=normal, 1=robust
74 int mode=0; // 0=max, 1=min
75 int print_time=0;
76 int print_frame=0;
77 int print_value=1;
78 int mini, maxi;
79 int mins, maxs, allmins=-1, allmaxs=-1;
80 char dfile[FILENAME_MAX], *cptr=NULL, dftunit[128], dfttunit[128];
81 DFT dft;
82 double tacmax=-1.0E22, allmax=-1.0E22;
83 double tacmin=+1.0E22, allmin=+1.0E22;
84 double xmin, xmax, allxmin=+1.0E22, allxmax=-1.0E22;
85
86
87 /*
88 * Get arguments
89 */
90 if(argc==1) {tpcPrintUsage(argv[0], info, stderr); return(1);}
91 dftInit(&dft);
92 dfile[0]=(char)0;
93 /* Options */
94 for(ai=1; ai<argc; ai++) if(*argv[ai]=='-') {
95 cptr=argv[ai]+1; if(*cptr=='-') cptr++; if(cptr==NULL) continue;
96 if(tpcProcessStdOptions(argv[ai], &help, &version, &verbose)==0) continue;
97 cptr=argv[ai]+1;
98 if(strncasecmp(cptr, "CLEAN", 1)==0) {
99 cleanOutput=1; continue;
100 } else if(strncasecmp(cptr, "ROBUST", 3)==0) {
101 robust_mode=1; continue;
102 } else if(strcasecmp(cptr, "MIN")==0) {
103 mode=1; continue;
104 } else if(strcasecmp(cptr, "MAX")==0) {
105 mode=0; continue;
106 } else if(strncasecmp(cptr, "TIME", 4)==0) {
107 if(strlen(cptr)==4) {print_time=1; continue;}
108 cptr+=4; if(*cptr=='=') {
109 cptr++;
110 if(*cptr=='Y' || *cptr=='y') {print_time=1; continue;}
111 if(*cptr=='N' || *cptr=='n') {print_time=0; continue;}
112 }
113 } else if(strncasecmp(cptr, "X", 1)==0) {
114 if(strlen(cptr)==1) {print_time=1; continue;}
115 cptr+=1; if(*cptr=='=') {
116 cptr++;
117 if(*cptr=='Y' || *cptr=='y') {print_time=1; continue;}
118 if(*cptr=='N' || *cptr=='n') {print_time=0; continue;}
119 }
120 } else if(strncasecmp(cptr, "F", 1)==0) {
121 if(strlen(cptr)==1) {print_frame=1; continue;}
122 cptr+=1; if(*cptr=='=') {
123 cptr++;
124 if(*cptr=='Y' || *cptr=='y') {print_frame=1; continue;}
125 if(*cptr=='N' || *cptr=='n') {print_frame=0; continue;}
126 }
127 } else if(strncasecmp(cptr, "Y", 1)==0) {
128 if(strlen(cptr)==1) {print_value=1; continue;}
129 cptr+=1; if(*cptr=='=') {
130 cptr++;
131 if(*cptr=='Y' || *cptr=='y') {print_value=1; continue;}
132 if(*cptr=='N' || *cptr=='n') {print_value=0; continue;}
133 }
134 }
135 fprintf(stderr, "Error: invalid option '%s'.\n", argv[ai]);
136 return(1);
137 } else break;
138
139 /* Print help or version? */
140 if(help==2) {tpcHtmlUsage(argv[0], info, ""); return(0);}
141 if(help) {tpcPrintUsage(argv[0], info, stdout); return(0);}
142 if(version) {tpcPrintBuild(argv[0], stdout); return(0);}
143
144 /* Process other arguments, starting from the first non-option */
145 for(; ai<argc; ai++) {
146 if(firstfile==0) firstfile=ai;
147 fileNr++;
148 }
149 /* Did we get all the information that we need? */
150 if(fileNr==0) {tpcPrintUsage(argv[0], info, stderr); return(1);}
151 /* All x, frame, and y printing must not be turned off */
152 if(!print_time && !print_frame && !print_value) {
153 fprintf(stderr, "Error: user turned off both printings.\n");
154 return(1);
155 }
156
157 /* In verbose mode print options */
158 if(verbose>1) {
159 printf("mode := %d\n", mode);
160 printf("robust_mode := %d\n", robust_mode);
161 printf("print_time := %d\n", print_time);
162 printf("print_frame := %d\n", print_frame);
163 printf("print_value := %d\n", print_value);
164 printf("fileNr := %d\n", fileNr);
165 }
166
167
168 /*
169 * Process each file
170 */
171 fileNr=0;
172 for(ai=firstfile; ai<argc; ai++) {
173 strcpy(dfile, argv[ai]);
174 tacmax=-1.0E22; tacmin=+1.0E22;
175 /* Read TAC file */
176 ret=dftRead(dfile, &dft);
177 if(ret) {
178 if(verbose>1) printf("dfile := %s\n", dfile);
179 if(verbose>1) printf("ret := %d\n", ret);
180 if(fileNr>1) {fprintf(stderr, "Warning: %s\n", dfterrmsg); continue;}
181 else {fprintf(stderr, "Error: %s\n", dfterrmsg); return(2);}
182 }
183 if(verbose>2) printf("frameNr:=%d\nvoiNr:=%d\n", dft.frameNr, dft.voiNr);
184 /* Get maximum pixel value */
185 if(robust_mode==0)
186 ret=dftMinMaxTAC(&dft, -1, &xmin, &xmax, &tacmin, &tacmax, &mini, &maxi,
187 &mins, &maxs);
188 else
189 ret=dftRobustMinMaxTAC(&dft, -1, &xmin, &xmax, &tacmin, &tacmax,
190 &mini, &maxi, &mins, &maxs, verbose-3);
191 if(ret!=0) {
192 fprintf(stderr, "Warning: cannot find min/max in %s\n", dfile);
193 if(verbose>1) printf("ret := %d\n", ret);
194 continue;
195 }
196 strcpy(dftunit, dft.unit);
197 strcpy(dfttunit, petTunit(dft.timeunit));
198 if(tacmax>allmax) {allmax=tacmax; allxmax=xmax; allmaxs=maxs;}
199 if(tacmin<allmin) {allmin=tacmin; allxmin=xmin; allmins=mins;}
200 dftEmpty(&dft); fileNr++;
201 if(cleanOutput) continue; // not printing individual max or min
202
203 if((print_time+print_frame+print_value)==1) {
204 /* Print the requested result on the same line with filename */
205 fprintf(stdout, "%s : ", dfile); fflush(stdout);
206 if(print_value) {
207 if(mode==0) fprintf(stdout, "%g %s\n", tacmax, dftunit );
208 else fprintf(stdout, "%g %s\n", tacmin, dftunit );
209 } else if(print_time) {
210 if(mode==0) fprintf(stdout, "%g %s\n", xmax, dfttunit );
211 else fprintf(stdout, "%g %s\n", xmin, dfttunit );
212 } else {
213 if(mode==0) fprintf(stdout, "%d\n", 1+maxs );
214 else fprintf(stdout, "%d\n", 1+mins );
215 }
216 } else {
217 /* Print first file name on its own line, and then the requested results */
218 fprintf(stdout, "%s : \n", dfile);
219 if(mode==0) {
220 if(print_value) fprintf(stdout, "max_value := %g %s\n", tacmax, dftunit);
221 if(print_time) fprintf(stdout, "max_time := %g %s\n", xmax, dfttunit);
222 if(print_frame) fprintf(stdout, "max_frame := %d\n", 1+maxs);
223 fprintf(stdout, "tac := %d\n", maxi+1);
224 } else {
225 if(print_value) fprintf(stdout, "min_value := %g %s\n", tacmin, dftunit);
226 if(print_time) fprintf(stdout, "min_time := %g %s\n", xmin, dfttunit);
227 if(print_frame) fprintf(stdout, "min_frame := %d\n", 1+mins);
228 fprintf(stdout, "tac := %d\n", mini+1);
229 }
230 }
231 } /* next file */
232
233
234 /*
235 * Print the max or min of all files
236 */
237 if(cleanOutput) {
238 if((print_time+print_frame+print_value)==1) {
239 if(print_value) {
240 if(mode==0) fprintf(stdout, "%g\n", allmax);
241 else fprintf(stdout, "%g\n", allmin);
242 } else if(print_time) {
243 if(mode==0) fprintf(stdout, "%g\n", allxmax);
244 else fprintf(stdout, "%g\n", allxmin);
245 } else if(print_frame) {
246 if(mode==0) fprintf(stdout, "%d\n", 1+allmaxs);
247 else fprintf(stdout, "%d\n", 1+allmins);
248 }
249 } else {
250 if(mode==0) {
251 if(print_value) fprintf(stdout, "max_value := %g\n", allmax);
252 if(print_time) fprintf(stdout, "max_time := %g\n", allxmax);
253 if(print_frame) fprintf(stdout, "max_frame := %d\n", 1+allmaxs);
254 } else {
255 if(print_value) fprintf(stdout, "min_value := %g\n", allmin);
256 if(print_time) fprintf(stdout, "min_time := %g\n", allxmin);
257 if(print_frame) fprintf(stdout, "min_frame := %d\n", 1+mins);
258 }
259 }
260 return(0);
261 }
262
263 /* Individual values were printed before, thus no reason to print
264 max or min of all, if only one TAC was given */
265 if(fileNr<1) return(0);
266 if((print_time+print_frame+print_value)==1) {
267 if(print_value) {
268 if(mode==0) fprintf(stdout, "Maximum of all files : %g %s\n", allmax, dftunit );
269 else fprintf(stdout, "Minimum of all files : %g %s\n", allmin, dftunit );
270 } else if(print_time) {
271 if(mode==0) fprintf(stdout, "Time at maximum of all files : %g %s\n", allxmax, dfttunit );
272 else fprintf(stdout, "Time at minimum of all files : %g %s\n", allxmin, dfttunit );
273 } else if(print_frame) {
274 if(mode==0) fprintf(stdout, "Frame of maximum of all files : %d\n", 1+allmaxs);
275 else fprintf(stdout, "Frame of minimum of all files : %d\n", 1+allmins);
276 }
277 } else {
278 if(mode==0) {
279 if(print_value) fprintf(stdout, "overall_max_value := %g\n", allmax);
280 if(print_time) fprintf(stdout, "overall_max_time := %g\n", allxmax);
281 if(print_frame) fprintf(stdout, "overall_max_frame := %d\n", 1+allmaxs);
282 } else {
283 if(print_value) fprintf(stdout, "overall_min_value := %g\n", allmin);
284 if(print_time) fprintf(stdout, "overall_min_time := %g\n", allxmin);
285 if(print_frame) fprintf(stdout, "overall_min_frame := %d\n", 1+mins);
286 }
287 }
288
289 return(0);
290}
291/*****************************************************************************/
292
293/*****************************************************************************/
void dftInit(DFT *data)
Definition dft.c:38
int dftMinMaxTAC(DFT *dft, int tacindex, double *minx, double *maxx, double *miny, double *maxy, int *mini, int *maxi, int *mins, int *maxs)
Definition dft.c:1024
char dfterrmsg[64]
Definition dft.c:6
void dftEmpty(DFT *data)
Definition dft.c:20
int dftRobustMinMaxTAC(DFT *dft, int tacindex, double *minx, double *maxx, double *miny, double *maxy, int *mini, int *maxi, int *mins, int *maxs, int verbose)
Definition dftinput.c:608
int dftRead(char *filename, DFT *data)
Definition dftio.c:22
Header file for libtpccurveio.
Header file for libtpcmisc.
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
Definition proginfo.c:40
char * petTunit(int tunit)
Definition petunits.c:226
int tpcHtmlUsage(const char *program, char *text[], const char *path)
Definition proginfo.c:213
void tpcPrintBuild(const char *program, FILE *fp)
Definition proginfo.c:383
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
Definition proginfo.c:158
Header file for libtpcmodel.
Header file for libtpcmodext.
int timeunit
int voiNr
int frameNr
char unit[MAX_UNITS_LEN+1]