8#include "tpcclibConfig.h"
24static char *info[] = {
25 "Make XY plots of PET time-activity curves (TACs) in Scalable Vector Graphics",
26 "(SVG) 1.1. format; specification in https://www.w3.org/TR/SVG/",
27 "SVG files can be viewed with web browsers and processed further using for",
28 "example Inkscape, Batik, and Gimp.",
30 "Usage: @P [Options] svg_file [-L|-S|-B] tac_file1 [-L|-S|-B] tac_file2 ...",
33 " -L TACs that are given after this option are plotted with lines only,",
34 " -S TACs that are given after this option are plotted with symbols only,",
35 " -B TACs that are given after this option are plotted with lines and",
36 " symbols (default).",
37 " -x1=<start of x axis>",
38 " -x2=<end of x axis>",
39 " -y1=<start of y axis>",
40 " -y2=<end of y axis>",
42 " Do not show main title or x or y axis titles.",
43 " -mt=\"<main title>\"",
44 " User-specified string to override any default main title,",
45 " -xt=\"<x axis title>\"",
46 " User-specified string to override any default x axis title,",
47 " -yt=\"<y axis title>\"",
48 " User-specified string to override any default y axis title.",
49 " -legend=<yes|No|auto>",
50 " Show TAC legends (yes), do not show (no, default), or automatically",
51 " determine whether to show or not (auto).",
53 " Create plots with colors (default), or in black-and-white.",
58 "Normally, SVG graphics file should have extension .svg. Alternatively,",
59 "SVG graphics can be written inline in XHTML file by setting the extension",
63 " @P gj247.svg -s gj247.tac -l gj247_fitted.tac",
65 "See also: fit2dat, dftscale, dftmax, tac4frpl, tacformat, tacjoin, tac2xml",
67 "Keywords: simulation, modelling, plotting, tool, DFT, TAC, SVG, XML",
93int main(
int argc,
char **argv)
95 int ai, help=0, version=0, verbose=1;
96 int ti, ri, ret, fileNr=0, n, ns, nl, datarg=0;
97 char *cptr, errmsg[128], temp[128];
98 char svgfile[FILENAME_MAX], tacfile[FILENAME_MAX];
99 int do_XHTML=0, plot_fit=0;
100 int show_main_title=1;
103 char main_title[64], x_title[64], y_title[64], tac_id[32], tac_title[64];
109 double minx, maxx, miny, maxy, tx1, tx2, ty1, ty2;
110 double preset_minx, preset_maxx, preset_miny, preset_maxy;
111 int symbol_nr=0, color_nr=0, color_nr2=0, is_label=0;
112 int max_color_nr, max_symbol_nr;
122 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
123 svgfile[0]=tacfile[0]=(char)0;
124 main_title[0]=x_title[0]=y_title[0]=(char)0;
125 tac_id[0]=tac_title[0]=(char)0;
126 preset_minx=preset_maxx=preset_miny=preset_maxy=nan(
"");
128 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
129 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
132 if(strncasecmp(cptr,
"X1=", 3)==0) {
133 preset_minx=
atof_dpi(cptr+3);
continue;
134 }
else if(strncasecmp(cptr,
"X2=", 3)==0) {
135 preset_maxx=
atof_dpi(cptr+3);
continue;
136 }
else if(strncasecmp(cptr,
"Y1=", 3)==0) {
137 preset_miny=
atof_dpi(cptr+3);
continue;
138 }
else if(strncasecmp(cptr,
"Y2=", 3)==0) {
139 preset_maxy=
atof_dpi(cptr+3);
continue;
140 }
else if(strcasecmp(cptr,
"L")==0) {
142 }
else if(strcasecmp(cptr,
"S")==0) {
144 }
else if(strcasecmp(cptr,
"B")==0) {
146 }
else if(strcasecmp(cptr,
"XHTML")==0) {
147 do_XHTML=1;
continue;
148 }
else if(strcasecmp(cptr,
"NMT")==0) {
149 show_main_title=0;
continue;
150 }
else if(strcasecmp(cptr,
"NXT")==0) {
151 show_x_title=0;
continue;
152 }
else if(strcasecmp(cptr,
"NYT")==0) {
153 show_y_title=0;
continue;
154 }
else if(strncasecmp(cptr,
"MT=", 3)==0) {
156 if(ret==0) show_main_title=0;
else show_main_title=1;
158 }
else if(strncasecmp(cptr,
"XT=", 3)==0) {
160 if(ret==0) show_x_title=0;
else show_x_title=1;
162 }
else if(strncasecmp(cptr,
"YT=", 3)==0) {
164 if(ret==0) show_y_title=0;
else show_y_title=1;
166 }
else if(strncasecmp(cptr,
"LEGEND=", 7)==0) {
168 if(strncasecmp(cptr,
"YES", 1)==0) {is_label=1;
continue;}
169 if(strncasecmp(cptr,
"NO", 1)==0) {is_label=0;
continue;}
170 if(strncasecmp(cptr,
"AUTO", 1)==0) {is_label=2;
continue;}
171 }
else if(strcasecmp(cptr,
"COLOR")==0) {
172 color_scale=0;
continue;
173 }
else if(strncasecmp(cptr,
"GRAY", 2)==0) {
174 color_scale=1;
continue;
175 }
else if(strncasecmp(cptr,
"MONOCHROME", 2)==0 || strcasecmp(cptr,
"BW")==0) {
176 color_scale=2;
continue;
178 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
183 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
188 for(; ai<argc; ai++) {
190 if(!svgfile[0]) {strcpy(svgfile, argv[ai]); datarg=ai+1;
continue;}
191 else if(strcasecmp(argv[ai],
"-S")==0)
continue;
192 else if(strcasecmp(argv[ai],
"-B")==0)
continue;
193 else if(strcasecmp(argv[ai],
"-L")==0)
continue;
196 if(access(argv[ai], 0) == -1) {
197 fprintf(stderr,
"Error: %s does not exist.\n", argv[ai]);
206 if(!svgfile[0] || fileNr<1) {
207 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n", argv[0]);
212 cptr=strrchr(svgfile,
'.');
if(cptr!=NULL) {
214 if(strcasecmp(cptr,
"XHTML")==0) {
216 }
else if(strcasecmp(cptr,
"HTM")==0 || strcasecmp(cptr,
"HTML")==0) {
217 fprintf(stderr,
"Warning: file with HTM(L) extension will probably not open\n");
218 fprintf(stderr,
" correctly in web browsers; use .xhtml instead.\n");
220 }
else if(strcasecmp(cptr,
"SVG")!=0) {
223 if(access(svgfile, 0) != -1) {
224 fprintf(stderr,
"Error: output file extension is not .svg\n");
228 fprintf(stderr,
"Warning: filename with other than .svg extension may not\n");
229 fprintf(stderr,
" open correctly in other programs.\n");
236 printf(
"svgfile := %s\n", svgfile);
237 printf(
"fileNr := %d\n", fileNr);
238 printf(
"do_XHTML := %d\n", do_XHTML);
239 if(!isnan(preset_minx)) printf(
"preset_minx := %g\n", preset_minx);
240 if(!isnan(preset_maxx)) printf(
"preset_maxx := %g\n", preset_maxx);
241 if(!isnan(preset_miny)) printf(
"preset_miny := %g\n", preset_miny);
242 if(!isnan(preset_maxy)) printf(
"preset_maxy := %g\n", preset_maxy);
243 printf(
"show_main_title := %d\n", show_main_title);
244 printf(
"show_x_title := %d\n", show_x_title);
245 if(show_x_title) printf(
"requested_x_title := '%s'\n", x_title);
246 printf(
"show_y_title := %d\n", show_y_title);
247 if(show_y_title) printf(
"requested_y_title := '%s'\n", y_title);
248 printf(
"is_label := %d\n", is_label);
249 printf(
"color_scale := %d\n", color_scale);
257 dftl=(DFTLIST*)calloc(fileNr,
sizeof(DFTLIST));
259 fprintf(stderr,
"Error: out of memory.\n");
262 for(ti=0; ti<fileNr; ti++) {
267 for(ai=datarg; ai<argc; ai++) {
269 if(strcasecmp(argv[ai],
"-L")==0) dftl[ti].type=1;
270 else if(strcasecmp(argv[ai],
"-S")==0) dftl[ti].type=2;
271 else if(strcasecmp(argv[ai],
"-B")==0) dftl[ti].type=0;
273 strcpy(tacfile, argv[ai]);
274 if(ti>0 && dftl[ti].type<0) dftl[ti].type=dftl[ti-1].type;
275 if(dftl[ti].type<0) dftl[ti].type=0;
276 if(verbose>0) printf(
" reading %s\n", tacfile);
277 if(
dftRead(tacfile, &dftl[ti].dft)) {
278 fprintf(stderr,
"Error in reading '%s': %s\n", tacfile,
dfterrmsg);
279 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
290 for(ti=0; ti<fileNr; ti++) {
291 printf(
"voiNr[%d] := %d\n", ti+1, dftl[ti].dft.voiNr);
292 printf(
"frameNr[%d] := %d\n", ti+1, dftl[ti].dft.frameNr);
293 printf(
"type[%d] := %d\n", ti+1, dftl[ti].type);
294 printf(
"studynr[%d] := %s\n", ti+1, dftl[ti].dft.studynr);
302 if(show_main_title!=0 && !main_title[0]) {
303 for(ti=0; ti<fileNr; ti++) {
304 if(strlen(dftl[ti].dft.studynr)<1)
continue;
305 if(strcmp(dftl[ti].dft.studynr,
".")==0)
continue;
306 if(strlen(main_title)==0) {
307 strcpy(main_title, dftl[ti].dft.studynr);
continue;
310 if(strcasecmp(main_title, dftl[ti].dft.studynr)==0)
continue;
312 strcpy(main_title,
"");
break;
318 for(ti=0; ti<fileNr; ti++) {
319 n=dftUnitId(dftl[ti].dft.unit);
if(n!=CUNIT_UNKNOWN) {ret=n;
break;}
321 if(verbose>1) printf(
"common_cunit := %d\n", ret);
322 if(ret!=CUNIT_UNKNOWN && ret!=CUNIT_UNITLESS)
323 if(show_y_title!=0 && !y_title[0]) strcpy(y_title, dftUnit(ret));
325 if(ret!=CUNIT_UNKNOWN)
329 for(ti=0; ti<fileNr; ti++) {
330 if(dftl[ti].dft.timeunit!=TUNIT_UNKNOWN) {ret=dftl[ti].dft.timeunit;
break;}
332 if(verbose>1) printf(
"common_tunit := %d\n", ret);
333 if(show_x_title!=0 && !x_title[0]) {
334 if(ret==TUNIT_SEC || ret==TUNIT_MIN)
335 sprintf(x_title,
"Time (%s)",
petTunit(ret));
336 else if(ret==TUNIT_MM || ret==TUNIT_CM || ret==TUNIT_UM)
337 sprintf(x_title,
"Distance (%s)",
petTunit(ret));
338 else if(ret!=TUNIT_UNKNOWN && ret!=DFTUNIT_UNITLESS)
342 if(ret!=TUNIT_UNKNOWN) {
346 printf(
"main_title := '%s'\n", main_title);
347 printf(
"x_title := '%s'\n", x_title);
348 printf(
"y_title := '%s'\n", y_title);
353 minx=maxx=miny=maxy=0;
354 for(ti=0; ti<fileNr; ti++) {
355 ret=
dftMinMax(&dftl[ti].dft, &tx1, &tx2, &ty1, &ty2);
357 fprintf(stderr,
"Error: insufficient data.\n");
358 if(verbose>1)
dftPrint(&dftl[ti].dft);
359 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
364 minx=tx1; maxx=tx2; miny=ty1; maxy=ty2;
366 if(minx>tx1) minx=tx1;
367 if(maxx<tx2) maxx=tx2;
368 if(miny>ty1) miny=ty1;
369 if(maxy<ty2) maxy=ty2;
372 if(verbose>3) printf(
"minx:=%g\nmaxx:=%g\nminy:=%g\nmaxy:=%g\n", minx, maxx, miny, maxy);
374 if(!isnan(preset_minx)) tx1=preset_minx;
else tx1=minx;
375 if(!isnan(preset_maxx)) tx2=preset_maxx;
else tx2=maxx;
376 if(tx1<tx2) {minx=tx1; maxx=tx2;}
378 if(!isnan(preset_minx) || !isnan(preset_maxx)) {
380 for(ti=0; ti<fileNr; ti++) {
381 ret=
dftMaxY(&dftl[ti].dft, minx, maxx, &ty1, &ty2);
383 fprintf(stderr,
"Warning: insufficient data in the range.\n");
386 if(isnan(miny)) miny=ty1;
else if(miny>ty1) miny=ty1;
387 if(isnan(maxy)) maxy=ty2;
else if(maxy<ty2) maxy=ty2;
389 if(verbose>3) printf(
"in_range_miny:=%g\nin_range_maxy:=%g\n", miny, maxy);
390 if(isnan(miny) || isnan(maxy)) {
391 fprintf(stderr,
"Error: insufficient data in the range.\n");
392 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
399 if(!isnan(preset_miny)) ty1=preset_miny;
else ty1=miny;
400 if(!isnan(preset_maxy)) ty2=preset_maxy;
else ty2=maxy;
401 if(ty1<ty2) {miny=ty1; maxy=ty2;}
402 if(verbose>2) printf(
"minx:=%g\nmaxx:=%g\nminy:=%g\nmaxy:=%g\n", minx, maxx, miny, maxy);
405 viewports.x.min=minx; viewports.x.max=maxx;
406 if(preset_minx==minx) viewports.x.fixed_min=1;
else viewports.x.fixed_min=0;
407 if(preset_maxx==maxx) viewports.x.fixed_max=1;
else viewports.x.fixed_max=0;
408 viewports.y.min=miny; viewports.y.max=maxy;
409 if(preset_miny==miny) viewports.y.fixed_min=1;
else viewports.y.fixed_min=0;
410 if(preset_maxy==maxy) viewports.y.fixed_max=1;
else viewports.y.fixed_max=0;
413 fprintf(stderr,
"Error (%d) in setting axis scales.\n", ret);
414 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
419 printf(
"viewports.x.min := %g\n", viewports.x.min);
420 printf(
"viewports.x.max := %g\n", viewports.x.max);
421 printf(
"viewports.y.min := %g\n", viewports.y.min);
422 printf(
"viewports.y.max := %g\n", viewports.y.max);
427 for(ti=n=0; ti<fileNr; ti++, n++)
428 if(strlen(dftl[ti].dft.studynr)>0 && strcmp(dftl[ti].dft.studynr,
".")!=0)
break;
430 for(; ti<fileNr; ti++)
431 if(strlen(dftl[ti].dft.studynr)>0 && strcmp(dftl[ti].dft.studynr,
".")!=0)
432 if(strcasecmp(dftl[ti].dft.studynr, dftl[n].dft.studynr)!=0) {
434 printf(
" different studynr: '%s' vs '%s'\n", dftl[n].dft.studynr, dftl[ti].dft.studynr);
435 use_studynr=1;
break;
438 for(ti=0; ti<fileNr; ti++) {
439 if(ti==0) ri=1;
else ri=0;
440 for(; ri<dftl[ti].dft.voiNr; ri++)
441 if(strcasecmp(dftl[ti].dft.voi[ri].name, dftl[0].dft.voi[0].name)!=0) {use_tacname=1;
break;}
445 if(use_studynr==0 && use_tacname==0) {
446 use_tacname=1;
if(is_label==2) is_label=0;
448 if(is_label==2) is_label=1;
453 strlen(x_title), is_label, &viewports, verbose-9);
455 fprintf(stderr,
"Error (%d) in setting viewports.\n", ret);
456 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
465 fprintf(stderr,
"Error: %s.\n", errmsg);
466 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
474 if(verbose>1) printf(
" initiating graphics file %s\n", svgfile);
479 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
480 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
487 fprintf(stderr,
"Error in writing SVG in %s: %s\n", svgfile, errmsg);
488 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
494 fp_svg=
svg_initiate(svgfile, 0, 0, &viewports, errmsg, verbose-8);
496 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
497 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
506 if(verbose>1) printf(
"creating main title\n");
509 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
510 fclose(fp_svg); remove(svgfile);
511 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
519 if(verbose>1) printf(
"creating axis titles\n");
523 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
524 fclose(fp_svg); remove(svgfile);
525 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
532 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
533 fclose(fp_svg); remove(svgfile);
534 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
542 if(verbose>1) printf(
"starting plot viewport\n");
545 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
546 fclose(fp_svg); remove(svgfile);
547 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
555 if(verbose>1) printf(
"starting coordinate area viewport\n");
558 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
559 fclose(fp_svg); remove(svgfile);
560 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
566 if(verbose>1) printf(
"writing axes\n");
569 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
570 fclose(fp_svg); remove(svgfile);
571 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
579 if(verbose>1) printf(
"plotting the TACs\n");
583 max_color_nr=0;
while(
svgColorName(max_color_nr)!=NULL) max_color_nr++;
585 if(verbose>1) printf(
"max_color_nr := %d\n", max_color_nr);
586 max_symbol_nr=0;
while(
svgSymbolName(max_symbol_nr)!=NULL) max_symbol_nr++;
587 if(verbose>1) printf(
"max_symbol_nr := %d\n", max_symbol_nr);
589 if(color_scale==0) symbol_fill=1;
else symbol_fill=0;
593 for(ti=0, n=0; ti<fileNr; ti++)
for(ri=0; ri<dftl[ti].dft.voiNr; ri++) {
594 n++;
if(dftl[ti].type==1) nl++;
else if(dftl[ti].type==2) ns++;}
595 if(nl==ns && n==(nl+ns)) plot_fit=1;
596 if(verbose>1) printf(
"plot_fit := %d\n", plot_fit);
598 for(ti=0, n=0, color_nr=color_nr2=0, symbol_nr=0; ti<fileNr; ti++) {
599 if(verbose>8) printf(
"ti := %d\n", ti);
600 if(dftl[ti].dft.voiNr>1) color_nr=color_nr2=1;
601 if(verbose>5) printf(
"type := %d\n", dftl[ti].type);
602 for(ri=0; ri<dftl[ti].dft.voiNr; ri++) {
604 printf(
" ri := %d\n", ri);
605 printf(
" color1 := %d\n", color_nr%max_color_nr);
606 printf(
" color2 := %d\n", color_nr2%max_color_nr);
608 sprintf(tac_id,
"plot_%d", n);
609 if(use_studynr==0) strcpy(tac_title,
"");
610 else strcpy(tac_title, dftl[ti].dft.studynr);
611 if(use_studynr!=0 && use_tacname!=0) strcat(tac_title,
": ");
614 strcat(tac_title, temp);
617 if(plot_fit==0 || dftl[ti].type!=1) {
618 ret=
svg_write_tac(fp_svg, &viewports, dftl[ti].type, tac_id, tac_title,
619 dftl[ti].dft.x, dftl[ti].dft.voi[ri].y, dftl[ti].dft.frameNr,
620 svgColorName(color_nr%max_color_nr), symbol_nr%max_symbol_nr, symbol_fill,
623 ret=
svg_write_tac(fp_svg, &viewports, dftl[ti].type, tac_id, tac_title,
624 dftl[ti].dft.x, dftl[ti].dft.voi[ri].y, dftl[ti].dft.frameNr,
625 svgColorName(color_nr2%max_color_nr), symbol_nr%max_symbol_nr, symbol_fill,
629 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
630 fclose(fp_svg); remove(svgfile);
631 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
639 svg_legend_add(&legends, dftl[ti].type, symbol_nr%max_symbol_nr, symbol_fill,
640 color_nr%max_color_nr, tac_title);
641 else if(dftl[ti].type!=1)
643 color_nr%max_color_nr, tac_title);
651 if(dftl[ti].type!=1) {
660 if(color_scale==2 && symbol_nr==max_symbol_nr) {
661 if(symbol_fill==0) symbol_fill=1;
else symbol_fill=0;
665 if(color_scale==0 && color_nr==max_color_nr && symbol_nr==max_symbol_nr) {
666 if(symbol_fill==0) symbol_fill=1;
else symbol_fill=0;
667 color_nr=symbol_nr=0;
675 if(verbose>1) printf(
"closing coordinate area viewport\n");
678 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
679 fclose(fp_svg); remove(svgfile);
680 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
686 if(verbose>1) printf(
"writing axis ticks\n");
688 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
689 fclose(fp_svg); remove(svgfile);
690 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
695 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
696 fclose(fp_svg); remove(svgfile);
697 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
703 if(verbose>1) printf(
"closing plot viewport\n");
706 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
707 fclose(fp_svg); remove(svgfile);
708 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
716 if(viewports.label_area_viewport.is!=0) {
717 if(verbose>1) printf(
"creating plot legends\n");
720 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
721 fclose(fp_svg); remove(svgfile);
722 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
731 for(ti=0; ti<fileNr; ti++)
dftEmpty(&dftl[ti].dft);
736 if(verbose>1) printf(
"closing the file\n");
740 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
745 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
749 ret=
svg_close(fp_svg, errmsg, verbose-6);
751 fprintf(stderr,
"Error in creating %s: %s\n", svgfile, errmsg);
755 if(verbose>0) printf(
" %s written.\n", svgfile);
int backupExistingFile(char *filename, char *backup_ext, char *status)
double atof_dpi(char *str)
int dftMinMax(DFT *dft, double *minx, double *maxx, double *miny, double *maxy)
int dftMaxY(DFT *dft, double t1, double t2, double *miny, double *maxy)
int dftRead(char *filename, DFT *data)
int dftUnitConversion(DFT *dft, int dunit)
int dftTimeunitConversion(DFT *dft, int tunit)
Header file for libtpccurveio.
Header file for libtpcmisc.
int rnameRmDots(char *rname1, char *rname2)
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)
int studynr_from_fname(char *fname, char *studynr)
int strnCopyClean(char *str1, const char *str2, int maxlen)
void tpcPrintBuild(const char *program, FILE *fp)
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
Header file for libtpcmodel.
Header file for libtpcsvg.
void svg_legend_empty(SVG_LEGENDS *legends)
int svg_write_xticks(FILE *fp, struct svg_viewports *vp, char *errmsg, int verbose)
void svg_init_legends(SVG_LEGENDS *legends)
FILE * svg_xhtml_initiate(const char *filename, const char *XHTML_title, char *errmsg, int verbose)
int svg_xhtml_svg_open(FILE *fp, const double height, const double width, struct svg_viewports *vp, char *errmsg, int verbose)
int svg_create_xaxis_title(FILE *fp, const char *title_text, struct svg_viewports *vp, char *errmsg, int verbose)
char * svgColorName(const svgColor index)
int svg_create_main_title(FILE *fp, const char *main_title_text, const char *sub_title_text, struct svg_viewports *vp, char *errmsg, int verbose)
int svg_legend_add(SVG_LEGENDS *legends, const int plot_type, const int symbol_type, const svgSymbolFill symbol_fill, const int color, const char *text)
char * svgSymbolName(const svgSymbolType index)
int svg_xhtml_close(FILE *fp, char *errmsg, int verbose)
int svg_define_viewports(const int main_viewport_width, const int main_viewport_height, const int is_main_title, const int is_yaxis_title, const int is_xaxis_title, const int is_label_area, struct svg_viewports *vp, int verbose)
int svg_end_plot_viewport(FILE *fp, char *errmsg, int verbose)
int svg_start_coordinate_viewport(FILE *fp, struct svg_viewports *vp, char *errmsg, int verbose)
int svg_create_legends(FILE *fp, struct svg_viewports *vp, SVG_LEGENDS *legends, char *errmsg, int verbose)
void svg_init_viewports(struct svg_viewports *p)
FILE * svg_initiate(const char *filename, const double height, const double width, struct svg_viewports *vp, char *errmsg, int verbose)
int svg_calculate_axes(struct svg_viewports *vp, int verbose)
int svg_write_axes(FILE *fp, struct svg_viewports *vp, char *errmsg, int verbose)
int svg_end_coordinate_viewport(FILE *fp, char *errmsg, int verbose)
int svg_start_plot_viewport(FILE *fp, struct svg_viewports *vp, char *errmsg, int verbose)
int svg_create_yaxis_title(FILE *fp, const char *title_text, struct svg_viewports *vp, char *errmsg, int verbose)
int svg_write_yticks(FILE *fp, struct svg_viewports *vp, char *errmsg, int verbose)
int svg_write_tac(FILE *fp, struct svg_viewports *vp, const int plot_type, const char *tac_id, const char *tac_title, double *x, double *y, const int data_nr, const char *color, const svgSymbolType symbol_type, const svgSymbolFill symbol_fill, char *errmsg, int verbose)
int svg_xhtml_svg_close(FILE *fp, char *errmsg, int verbose)
int svg_close(FILE *fp, char *errmsg, int verbose)