8#include "tpcclibConfig.h"
22static char *info[] = {
23 "Plot histogram from data given in TAC format.",
25 "Usage: @P [options] datafile svgfile",
29 " The dataset in file to use, in case there are several; by default 1.",
30 " -x1=<start of x axis>",
31 " -x2=<end of x axis>",
32 " -y1=<start of y axis>",
33 " -y2=<end of y axis>",
34 " -mt=\"<main title>\"",
35 " User-specified string to set as main title.",
38 "See also: tac2svg, imghist",
40 "Keywords: TAC, tool",
59int main(
int argc,
char **argv)
61 int ai, help=0, version=0, verbose=1;
62 char tacfile[FILENAME_MAX], svgfile[FILENAME_MAX];
64 double preset_xmin, preset_xmax, preset_ymin, preset_ymax;
71 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
72 tacfile[0]=svgfile[0]=(char)0;
73 main_title[0]=(char)0;
74 preset_xmin=preset_xmax=preset_ymin=preset_ymax=nan(
"");
76 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
78 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
79 if(strncasecmp(cptr,
"MT=", 3)==0) {
81 }
else if(strncasecmp(cptr,
"X1=", 3)==0) {
82 if(
atofCheck(cptr+3, &preset_xmin)==0)
continue;
83 }
else if(strncasecmp(cptr,
"X2=", 3)==0) {
84 if(
atofCheck(cptr+3, &preset_xmax)==0)
continue;
85 }
else if(strncasecmp(cptr,
"Y1=", 3)==0) {
86 if(
atofCheck(cptr+3, &preset_ymin)==0)
continue;
87 }
else if(strncasecmp(cptr,
"Y2=", 3)==0) {
88 if(
atofCheck(cptr+3, &preset_ymax)==0)
continue;
89 }
else if(strncasecmp(cptr,
"C=", 2)==0) {
90 if(
atoiCheck(cptr+2, &ci)==0 && ci>0) {ci--;
continue;}
92 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
101 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
106 if(ai<argc) {
strlcpy(tacfile, argv[ai], FILENAME_MAX); ai++;}
107 if(ai<argc) {
strlcpy(svgfile, argv[ai], FILENAME_MAX); ai++;}
108 else {fprintf(stderr,
"Error: missing filename.\n");
return(1);}
109 if(ai<argc) {fprintf(stderr,
"Error: extra command-line argument.\n");
return(1);}
111 if(preset_xmin>=preset_xmax || preset_ymin>=preset_ymax) {
112 fprintf(stderr,
"Error: invalid axis range settings.\n");
return(1);}
116 printf(
"tacfile := %s\n", tacfile);
117 printf(
"svgfile := %s\n", svgfile);
118 if(main_title[0]) printf(
"main_title := %s\n", main_title);
119 if(isfinite(preset_xmin)) printf(
"preset_xmin := %g\n", preset_xmin);
120 if(isfinite(preset_xmax)) printf(
"preset_xmax := %g\n", preset_xmax);
121 if(isfinite(preset_ymin)) printf(
"preset_ymin := %g\n", preset_ymin);
122 if(isfinite(preset_ymax)) printf(
"preset_ymax := %g\n", preset_ymax);
126 if(verbose>1) printf(
"reading %s\n", tacfile);
128 tacRead(&tac, tacfile, &status);
135 printf(
"tacNr := %d\n", tac.
tacNr);
136 printf(
"sampleNr := %d\n", tac.
sampleNr);
137 printf(
"frames := %d\n", tac.
isframe);
138 if(tac.
tacNr>1) printf(
"tac := %s\n", tac.
c[ci].
name);
142 fprintf(stderr,
"Error: data file does not contain data set %d.\n", 1+ci);
147 for(
int i=0; i<tac.
tacNr; i++)
if(i==ci) tac.
c[i].
sw=0;
else tac.
c[i].
sw=1;
151 fprintf(stderr,
"Error: invalid data file.\n");
159 double xmin=nan(
""), xmax=nan(
""), ymin=nan(
""), ymax=nan(
"");
161 fprintf(stderr,
"Error: invalid data x range.\n");
164 if(verbose>3) printf(
"data_xrange := %g %g\n", xmin, xmax);
165 if((isfinite(preset_xmin) && preset_xmin>=xmax) || (isfinite(preset_xmax) && preset_xmax<=xmin)) {
166 fprintf(stderr,
"Error: invalid x axis range settings.\n");
169 if(isfinite(preset_xmin)) xmin=preset_xmin;
170 if(isfinite(preset_xmax)) xmax=preset_xmax;
172 if(
tacYRangeInXRange(&tac, 0, xmin, xmax, &ymin, &ymax, NULL, NULL, NULL, NULL)) {
173 fprintf(stderr,
"Error: invalid data y range.\n");
176 if(verbose>3) printf(
"data_yrange := %g %g\n", ymin, ymax);
177 if((isfinite(preset_ymin) && preset_ymin>=ymax) || (isfinite(preset_ymax) && preset_ymax<=ymin)) {
178 fprintf(stderr,
"Error: invalid y axis range settings.\n");
181 if(ymin>0.0) ymin=0.0;
182 else if(ymax<0.0) ymax=0.0;
183 if(isfinite(preset_ymin)) ymin=preset_ymin;
184 if(isfinite(preset_ymax)) ymax=preset_ymax;
186 printf(
"plotted_xrange := %g %g\n", xmin, xmax);
187 printf(
"plotted_yrange := %g %g\n", ymin, ymax);
int atofCheck(const char *s, double *v)
int tacPlotHistogramSVG(TAC *d, const char *main_title, const double x1, const double x2, const double y1, const double y2, const char *fname, TPCSTATUS *status)
int atoiCheck(const char *s, int *v)
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)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
int strncpyClean(char *s1, const char *s2, int maxlen)
char name[MAX_TACNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacRead(TAC *d, const char *fname, TPCSTATUS *status)
char * tacFormattxt(tacformat c)
int tacDeleteTACC(TAC *d, int i)
int tacSetX(TAC *d, TPCSTATUS *status)
Set TAC x values based on x1 and x2 values, or guess x1 and x2 values based on x values.
int tacXRange(TAC *d, double *xmin, double *xmax)
Get the range of x values (times) in TAC structure.
int tacYRangeInXRange(TAC *d, int i, const double xmin, const double xmax, double *ymin, double *ymax, int *smin, int *smax, int *imin, int *imax)
Get the range of y values (concentrations) in TAC struct, including only samples with x (times) insid...
Header file for library libtpcextensions.
Header file for library libtpcift.
Header file for library libtpctac.
Header file for libtpctacmod.