8#include "tpcclibConfig.h"
24static char *info[] = {
25 "Fits line to PET tissue time-activity curves (TACs).",
26 "Data may contain missing values. Data is not weighted in the fit.",
28 "Usage: @P [Options] tacfile starttime endtime resultfile",
32 " Fitted and measured TACs are plotted in specified SVG file.",
35 "Program writes the slope, y axis intercept, Pearson's correlation",
36 "coefficient, and standard deviations to the result file, or,",
37 "intercept and slope into FIT format file if given with extension .fit.",
39 "See also: fit_exp, tacln, tacinv, rescoll, fit2dat, tac2svg",
41 "Keywords: curve fitting, TAC, correlation, clearance, extrapolation",
60int main(
int argc,
char **argv)
62 int ai, help=0, version=0, verbose=1;
63 int fi, pi, ri, type=MF_LINE, ret, dataNr;
64 char *cptr, datfile[FILENAME_MAX], outfile[FILENAME_MAX],
65 svgfile[FILENAME_MAX];
68 double tstart, tstop, minx, maxx, miny, maxy;
74 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
75 datfile[0]=outfile[0]=svgfile[0]=(char)0;
79 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
81 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
82 if(strncasecmp(cptr,
"SVG=", 4)==0 && strlen(cptr)>4) {
83 strcpy(svgfile, cptr+4);
if(strlen(svgfile)>0)
continue;
85 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
90 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
95 for(; ai<argc; ai++) {
96 if(!datfile[0]) {strcpy(datfile, argv[ai]);
continue;}
97 else if(isnan(tstart)) {
if(
atof_with_check(argv[ai], &tstart)==0)
continue;}
98 else if(isnan(tstop)) {
if(
atof_with_check(argv[ai], &tstop)==0)
continue;}
99 else if(!outfile[0]) {strcpy(outfile, argv[ai]);
continue;}
100 fprintf(stderr,
"Error: invalid argument '%s'\n", argv[ai]);
106 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
109 if(tstop<tstart || (tstart!=0.0 && tstart==tstop)) {
110 fprintf(stderr,
"Error: invalid time range.\n");
116 printf(
"datfile := %s\n", datfile);
117 printf(
"outfile := %s\n", outfile);
118 printf(
"svgfile := %s\n", svgfile);
119 printf(
"required_tstart := %g\n", tstart);
120 printf(
"required_tstop := %g\n", tstop);
127 if(verbose>1) printf(
"reading %s\n", datfile);
129 fprintf(stderr,
"Error in reading '%s': %s\n", datfile,
dfterrmsg);
133 fprintf(stderr,
"Error: not enough samples for line fitting.\n");
142 ret=
dftMinMax(&dft, &minx, &maxx, &miny, &maxy);
143 if(ret!=0 || isnan(minx) || isnan(miny)) {
144 fprintf(stderr,
"Error: invalid contents in %s\n", datfile);
148 printf(
"xrange := %g - %g\n", minx, maxx);
149 printf(
"yrange := %g - %g\n", miny, maxy);
152 fprintf(stderr,
"Error: invalid data for line fitting.\n");
157 tstart=minx; tstop=maxx;
159 if(tstart>=maxx || tstop<=minx) {
160 fprintf(stderr,
"Error: invalid time range for the data.\n");
165 printf(
"tstart := %g\n", tstart);
166 printf(
"tstop := %g\n", tstop);
171 fprintf(stderr,
"Error: invalid time range for the data.\n");
174 if(verbose>1) printf(
"dataNr := %d\n", dataNr);
179 if(verbose>1) printf(
"allocating memory for results.\n");
181 fprintf(stderr,
"Error: cannot setup memory for results.\n");
186 strncpy(res.
datafile, datfile, FILENAME_MAX);
201 if(verbose>1) printf(
"fitting\n");
203 for(ri=ret=0; ri<dft.
voiNr; ri++) {
204 if(verbose>1 && dft.
voiNr>1) printf(
"%s\n", dft.
voi[ri].
name);
212 fprintf(stderr,
"Error: cannot fit line to TAC %d\n", 1+ri);
230 if(verbose>1) printf(
"saving results\n");
231 cptr=strrchr(outfile,
'.');
232 if(cptr!=NULL && strcasecmp(cptr,
".FIT")==0) {
233 if(verbose>2) printf(
"... in FIT format\n");
237 fprintf(stderr,
"Error: cannot allocate space for fits.\n");
245 for(ri=0; ri<dft.
voiNr; ri++) {
254 fprintf(stderr,
"Error in writing '%s': %s\n", outfile,
fiterrmsg);
259 if(verbose>2) printf(
"... in RES format\n");
260 ret=
resWrite(&res, outfile, verbose-3);
262 fprintf(stderr,
"Error in writing '%s': %s\n", outfile,
reserrmsg);
267 if(verbose>0) printf(
"line fits written in %s\n", outfile);
274 if(verbose>1) printf(
"saving SVG plot\n");
281 fprintf(stderr,
"Error: cannot plot fitted curves.\n");
287 dft2.
x[0]=tstart; dft2.
x[1]=tstop;
288 for(ri=0; ri<dft.
voiNr; ri++)
for(fi=0; fi<dft.
frameNr; fi++) {
297 fprintf(stderr,
"Error (%d) in writing '%s'.\n", ret, svgfile);
301 if(verbose>0) printf(
"Plots written in %s\n", svgfile);
int atof_with_check(char *double_as_string, double *result_value)
int dftdup(DFT *dft1, DFT *dft2)
int dftSortByFrame(DFT *dft)
int dftMinMax(DFT *dft, double *minx, double *maxx, double *miny, double *maxy)
int dftValidNr(DFT *dft, double tstart, double tstop, int index)
int dftRead(char *filename, DFT *data)
int res_allocate_with_dft(RES *res, DFT *dft)
int fit_allocate_with_dft(FIT *fit, DFT *dft)
Header file for libtpccurveio.
int fitWrite(FIT *fit, char *filename)
int resWrite(RES *res, char *filename, int verbose)
Header file for libtpcmisc.
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
char * petCunit(int cunit)
void tpcProgramName(const char *program, int version, int copyright, char *prname, int n)
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.
int pearson4(double *x, double *y, int nr, double start, double end, double *k, double *kSD, double *b, double *bSD, double *r, double *ySD)
Calculate slope and intercept of a line and Pearson's correlation coefficient.
Header file for libtpcmodext.
int plot_fit_svg(DFT *dft1, DFT *dft2, char *main_title, char *fname, int verbose)
Header file for libtpcsvg.
char studynr[MAX_STUDYNR_LEN+1]
char unit[MAX_UNITS_LEN+1]
char datafile[FILENAME_MAX]
char unit[MAX_UNITS_LEN+1]
char parname[MAX_RESPARAMS][MAX_RESPARNAME_LEN+1]
char datafile[FILENAME_MAX]
char parunit[MAX_RESPARAMS][MAX_RESPARNAME_LEN+1]
double parameter[MAX_RESPARAMS]
char name[MAX_REGIONNAME_LEN+1]