8#include "tpcclibConfig.h"
25static char *info[] = {
28 "Usage: @P [options] PTAC TTAC results",
32 " Fitted and measured TACs are plotted in specified SVG file.",
34 " Fitted regional TTACs are written in specified file.",
36 " Parameters of linear model are saved in specified file.",
60int main(
int argc,
char **argv)
62 int ai, help=0, version=0, verbose=1;
63 char ptacfile[FILENAME_MAX], ttacfile[FILENAME_MAX], resfile[FILENAME_MAX],
64 fitfile[FILENAME_MAX], svgfile[FILENAME_MAX], lpfile[FILENAME_MAX];
69 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
70 ptacfile[0]=ttacfile[0]=resfile[0]=fitfile[0]=svgfile[0]=lpfile[0]=(char)0;
72 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
74 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
75 if(strncasecmp(cptr,
"SVG=", 4)==0) {
76 strlcpy(svgfile, cptr+4, FILENAME_MAX);
if(strlen(svgfile)>0)
continue;
77 }
else if(strncasecmp(cptr,
"FIT=", 4)==0) {
78 strlcpy(fitfile, cptr+4, FILENAME_MAX);
if(strlen(fitfile)>0)
continue;
79 }
else if(strncasecmp(cptr,
"LP=", 3)==0) {
80 strlcpy(lpfile, cptr+3, FILENAME_MAX);
if(strlen(lpfile)>0)
continue;
82 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
91 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
96 if(ai<argc)
strlcpy(ptacfile, argv[ai++], FILENAME_MAX);
97 if(ai<argc)
strlcpy(ttacfile, argv[ai++], FILENAME_MAX);
98 if(ai<argc)
strlcpy(resfile, argv[ai++], FILENAME_MAX);
100 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
105 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
112 printf(
"ptacfile := %s\n", ptacfile);
113 printf(
"ttacfile := %s\n", ttacfile);
114 printf(
"resfile := %s\n", resfile);
115 printf(
"fitfile := %s\n", fitfile);
116 printf(
"svgfile := %s\n", svgfile);
117 printf(
"lpfile := %s\n", lpfile);
124 if(verbose>1) printf(
"reading tissue and input data\n");
127 double fitdur=1.0E+10;
135 printf(
"tacNr := %d\n", ttac0.
tacNr);
136 printf(
"ttac.sampleNr := %d\n", ttac0.
sampleNr);
137 printf(
"ptac.sampleNr := %d\n", ptac.
sampleNr);
142 fprintf(stderr,
"Error: TTAC file does not contain frame times.\n");
150 if(verbose>1) printf(
"interpolating PTAC\n");
162 if(verbose>1) printf(
"integrating PTAC\n");
166 fprintf(stderr,
"Error: cannot integrate PTAC.\n");
177 if(verbose>1) printf(
"integrating TTAC\n");
180 for(
int i=0; i<ttac0.
tacNr; i++) {
182 fprintf(stderr,
"Error: cannot integrate PTAC.\n");
193 if(verbose>1) printf(
"allocating memory for NNLS\n");
196 double *llsq_mat=(
double*)malloc((llsq_n*llsq_m)*
sizeof(
double));
198 fprintf(stderr,
"Error: cannot allocate memory for NNLS.\n");
203 double **llsq_a=(
double**)malloc(llsq_n*
sizeof(
double*));
205 fprintf(stderr,
"Error: cannot allocate memory for NNLS.\n");
211 for(
int ni=0; ni<llsq_n; ni++) llsq_a[ni]=llsq_mat+ni*llsq_m;
212 double r2, llsq_b[llsq_m], llsq_x[llsq_n], llsq_wp[llsq_n], llsq_zz[llsq_m];
219 for(
int ti=0; ti<ttac0.
tacNr; ti++) {
221 if(verbose>1 && ttac0.
tacNr>1) {
222 printf(
"Region %d %s\n", 1+ti, ttac0.
c[ti].
name); fflush(stdout);}
225 for(
int mi=0; mi<llsq_m; mi++)
226 llsq_b[mi]=ttac0.
c[ti].
y[mi];
227 for(
int mi=0; mi<llsq_m; mi++) {
228 llsq_mat[mi]=input0.
c[0].
y[mi];
230 llsq_mat[mi+llsq_m]=0.5*(input1.
c[0].
y[mi]+input1.
c[0].
y[mi-1]);
232 llsq_mat[mi+llsq_m]=0.5*(input1.
c[0].
y[mi]+0.0);
234 llsq_mat[mi+2*llsq_m]=-0.5*(ttac1.
c[0].
y[mi]+ttac1.
c[0].
y[mi-1]);
236 llsq_mat[mi+2*llsq_m]=-0.5*(ttac1.
c[0].
y[mi]+0.0);
239 printf(
"Matrix A and vector B:\n");
240 for(
int mi=0; mi<llsq_m; mi++) {
241 printf(
"%.2e", llsq_a[0][mi]);
242 for(
int ni=1; ni<llsq_n; ni++) printf(
", %.2e", llsq_a[ni][mi]);
243 printf(
"; %.3e\n", llsq_b[mi]);
248 if(verbose>3) printf(
"starting NNLS...\n");
249 int ret=
nnls(llsq_a, llsq_m, llsq_n, llsq_b, llsq_x, &r2, llsq_wp, llsq_zz, indexp);
250 if(verbose>3) printf(
" ... done.\n");
252 fprintf(stderr,
"Warning: no NNLS solution for %s\n", ttac0.
c[ti].
name);
253 for(
int ni=0; ni<llsq_n; ni++) llsq_x[ni]=0.0;
256 fprintf(stderr,
"Warning: NNLS iteration max exceeded for %s\n", ttac0.
c[ti].
name);
259 printf(
"solution_vector: %g", llsq_wp[0]);
260 for(
int ni=1; ni<llsq_n; ni++) printf(
", %g", llsq_wp[ni]);
264 printf(
"parameter_vector: %g", llsq_x[0]);
265 for(
int ni=1; ni<llsq_n; ni++) printf(
", %g", llsq_x[ni]);
272 free(llsq_a); free(llsq_mat);
int liIntegrateFE(double *x1, double *x2, double *y, int nr, double *ie, double *iie, const int verbose)
Linear integration of PET TAC to frame end times.
int tacInterpolate(TAC *inp, TAC *xinp, TAC *tac, TAC *itac, TAC *iitac, TPCSTATUS *status)
Interpolate and/or integrate TACs from one TAC structure into a new TAC structure,...
int nnls(double **a, int m, int n, double *b, double *x, double *rnorm, double *wp, double *zzp, int *indexp)
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)
char name[MAX_TACNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacDuplicate(TAC *tac1, TAC *tac2)
Make a duplicate of TAC structure.
char * tacFormattxt(tacformat c)
Header file for library libtpcextensions.
char * unitName(int unit_code)
Header file for library libtpcift.
Header file for libtpcli.
Header file for libtpclinopt.
Header file for libtpcpar.
Header file for library libtpctac.
Header file for libtpctacmod.