8#include "tpcclibConfig.h"
23static char *info[] = {
24 "Finds the maximum (or minimum) value and its time in TAC file(s).",
26 "Usage: @P [Options] tacfile(s)",
30 " Find the minimum value, instead of maximum.",
32 " Only the maximum or minimum value of ALL specified files is printed.",
34 " Time of maximum is printed (y) or not (n, default).",
36 " Time frame (1..sampleNr) of maximum is printed (y) or not (n, default).",
38 " Maximum value is printed (y, default) or not (n).",
40 " Search is limited to the longest range above and below median",
43 "Example 1: Get maximum of all TACs into DOS variable 'MAXVAL':",
44 " @P -clean *.tac > max.txt",
45 " set /p MAXVAL=<max.txt",
47 "See also: tacpeak, tacunit, tacframe, tacrange, imgmax",
49 "Keywords: TAC, peak, max, min",
68int main(
int argc,
char **argv)
70 int ai, help=0, version=0, verbose=1;
71 int ret, fileNr=0, firstfile=0;
79 int mins, maxs, allmins=-1, allmaxs=-1;
80 char dfile[FILENAME_MAX], *cptr=NULL, dftunit[128], dfttunit[128];
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;
90 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
94 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
95 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
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) {
104 }
else if(strcasecmp(cptr,
"MAX")==0) {
106 }
else if(strncasecmp(cptr,
"TIME", 4)==0) {
107 if(strlen(cptr)==4) {print_time=1;
continue;}
108 cptr+=4;
if(*cptr==
'=') {
110 if(*cptr==
'Y' || *cptr==
'y') {print_time=1;
continue;}
111 if(*cptr==
'N' || *cptr==
'n') {print_time=0;
continue;}
113 }
else if(strncasecmp(cptr,
"X", 1)==0) {
114 if(strlen(cptr)==1) {print_time=1;
continue;}
115 cptr+=1;
if(*cptr==
'=') {
117 if(*cptr==
'Y' || *cptr==
'y') {print_time=1;
continue;}
118 if(*cptr==
'N' || *cptr==
'n') {print_time=0;
continue;}
120 }
else if(strncasecmp(cptr,
"F", 1)==0) {
121 if(strlen(cptr)==1) {print_frame=1;
continue;}
122 cptr+=1;
if(*cptr==
'=') {
124 if(*cptr==
'Y' || *cptr==
'y') {print_frame=1;
continue;}
125 if(*cptr==
'N' || *cptr==
'n') {print_frame=0;
continue;}
127 }
else if(strncasecmp(cptr,
"Y", 1)==0) {
128 if(strlen(cptr)==1) {print_value=1;
continue;}
129 cptr+=1;
if(*cptr==
'=') {
131 if(*cptr==
'Y' || *cptr==
'y') {print_value=1;
continue;}
132 if(*cptr==
'N' || *cptr==
'n') {print_value=0;
continue;}
135 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
140 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
145 for(; ai<argc; ai++) {
146 if(firstfile==0) firstfile=ai;
150 if(fileNr==0) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
152 if(!print_time && !print_frame && !print_value) {
153 fprintf(stderr,
"Error: user turned off both printings.\n");
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);
172 for(ai=firstfile; ai<argc; ai++) {
173 strcpy(dfile, argv[ai]);
174 tacmax=-1.0E22; tacmin=+1.0E22;
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);}
183 if(verbose>2) printf(
"frameNr:=%d\nvoiNr:=%d\n", dft.
frameNr, dft.
voiNr);
186 ret=
dftMinMaxTAC(&dft, -1, &xmin, &xmax, &tacmin, &tacmax, &mini, &maxi,
190 &mini, &maxi, &mins, &maxs, verbose-3);
192 fprintf(stderr,
"Warning: cannot find min/max in %s\n", dfile);
193 if(verbose>1) printf(
"ret := %d\n", ret);
196 strcpy(dftunit, dft.
unit);
198 if(tacmax>allmax) {allmax=tacmax; allxmax=xmax; allmaxs=maxs;}
199 if(tacmin<allmin) {allmin=tacmin; allxmin=xmin; allmins=mins;}
201 if(cleanOutput)
continue;
203 if((print_time+print_frame+print_value)==1) {
205 fprintf(stdout,
"%s : ", dfile); fflush(stdout);
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 );
213 if(mode==0) fprintf(stdout,
"%d\n", 1+maxs );
214 else fprintf(stdout,
"%d\n", 1+mins );
218 fprintf(stdout,
"%s : \n", dfile);
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);
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);
238 if((print_time+print_frame+print_value)==1) {
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);
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);
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);
265 if(fileNr<1)
return(0);
266 if((print_time+print_frame+print_value)==1) {
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);
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);
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);
int dftMinMaxTAC(DFT *dft, int tacindex, double *minx, double *maxx, double *miny, double *maxy, int *mini, int *maxi, int *mins, int *maxs)
int dftRead(char *filename, DFT *data)
Header file for libtpccurveio.
Header file for libtpcmisc.
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
char * petTunit(int tunit)
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)
Header file for libtpcmodel.
Header file for libtpcmodext.
char unit[MAX_UNITS_LEN+1]