8#include "tpcclibConfig.h"
27double *petmeas, *petsim;
30double fk1k2=-1.0, fk3k4=-1.0;
32double wss_wo_penalty=0.0;
35 CM_K1, CM_K1K2, CM_K3, CM_K3K4, CM_K5, CM_VB, CM_KI, CM_WSS, CM_AIC
39double func_sk5(
int parNr,
double *p,
void*);
40double func_pk5(
int parNr,
double *p,
void*);
41int resK1k2Median(
char *filename,
double *median,
double *
mean,
char *msg);
45static char *info[] = {
46 "Non-linear fitting of irreversible three-tissue compartment model to plasma",
47 "input, blood, and tissue time-activity curves (PTAC, BTAC, and TTAC) to",
48 "estimate parameters K1, K1/k2, k3, k3/k4, k5, and Vb.",
50 "Model with two of tissue compartments in parallel:",
52 " | | K1 | | k3 | | ",
53 " | Ca | ----> | | ----> | C2 | ",
54 " |_____| | | <---- |____| ",
55 " _____ | C1 | k4 ____ ",
57 " | Cv | <---- | | ----> | C3 | ",
58 " |_____| k2 |____| k5 |____| ",
60 "Model with compartments in series:",
61 " _____ ____ ____ ____ ",
62 " | | K1 | | k3 | | k5 | | ",
63 " | Ca | ----> | | ----> | C2 | ----> | C3 | ",
64 " |_____| | | <---- |____| |____| ",
68 " |_____| k2 |____| ",
70 "Sample times must be in minutes.",
72 "Usage: @P [Options] ptacfile btacfile ttacfile endtime resultfile",
76 " Specify the constraints for model parameters;",
77 " This file with default values can be created by giving this",
78 " option as the only command-line argument to this program.",
79 " Without file name the default values are printed on screen.",
81 " Standard deviations are estimated and saved in results (y),",
82 " or not calculated (N, default).",
83 " Program runs a lot faster if SD and CL are not calculated.",
85 " 95% Confidence limits are estimated and saved in results (y), or",
86 " not calculated (N, default).",
87 " -model=<parallel|series>",
88 " Specify the model that is fitted to data; compartments in parallel",
89 " (default) or in series.",
91 " Enter a fixed Vb; fitted by default.",
92 " -fk1k2=<<value> || <result filename>>",
93 " K1/k2 is constrained to the given value in all regions; if result",
94 " file name is entered, then K1/k2 is constrained to the median of",
95 " regional K1/k2 values in the result file.",
108 " Fitted regional TACs are written in DFT format.",
110 " Fitted and measured TACs are plotted in specified SVG file.",
113 "Example 1: estimate K1, K1/k2, k3, k3/k4, k5 and Vb",
114 " @P -svg=ua929fit.svg ua929ap.bld ua929ab.bld ua929.tac 90 ua929.res",
116 "Example 2: estimate K1, k3, k3/k4, and k5; Vb is constrained to 1.5%, and",
117 "K1/k2 is constrained to the regional median",
118 " @P -Vb=1.5 ua929ap.kbq ua929ab.kbq ua929.tac 90 tmp.res",
119 " @P -Vb=1.5 -fk1k2=tmp.res ua929ap.kbq ua929ab.kbq ua929.tac 90 ua929.res",
121 "See also: logan, fitk2, fitk3, fitk4, p2t_v3c, tacweigh, rescoll",
123 "Keywords: TAC, modelling, Ki, k5, irreversible uptake, 3TCM",
143int main(
int argc,
char *argv[])
145 int ai, help=0, version=0, verbose=1;
146 int ri, fi, pi, m, n, ret;
148 int ref=-1, refAdded=0, inputtype;
149 char dfile[FILENAME_MAX], pfile[FILENAME_MAX], bfile[FILENAME_MAX],
150 rfile[FILENAME_MAX], ffile[FILENAME_MAX], svgfile[FILENAME_MAX],
151 limfile[FILENAME_MAX];
152 char *cptr, tmp[FILENAME_MAX], refname[FILENAME_MAX];
153 double fitdur, K1, k2, k3, k4, k5, f;
156 int doBootstrap=0, doSD=0, doCL=0;
157 double *sd, *cl1, *cl2;
159 int tgoNr=0, neighNr=0, iterNr=0, fittedparNr=0;
160 double (*func)(int,
double*,
void*);
166 def_pmin[CM_K1]=0.0; def_pmax[CM_K1]=5.0;
167 def_pmin[CM_K1K2]=0.00001; def_pmax[CM_K1K2]=10.0;
168 def_pmin[CM_K3]=0.0; def_pmax[CM_K3]=2.0;
169 def_pmin[CM_K3K4]=0.00001; def_pmax[CM_K3K4]=2.0;
170 def_pmin[CM_K5]=0.0; def_pmax[CM_K5]=2.0;
171 def_pmin[CM_VB]=0.0; def_pmax[CM_VB]=0.50;
177 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
178 dfile[0]=pfile[0]=bfile[0]=rfile[0]=ffile[0]=refname[0]=svgfile[0]=(char)0;
184 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
185 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
187 if(strncasecmp(cptr,
"CL", 2)==0) {
188 if(strlen(cptr)==2) {doCL=1;
continue;}
189 cptr+=2;
if(*cptr==
'=') {
191 if(*cptr==
'Y' || *cptr==
'y') {doCL=1;
continue;}
192 if(*cptr==
'N' || *cptr==
'n') {doCL=0;
continue;}
194 }
else if(strncasecmp(cptr,
"SD", 2)==0) {
195 if(strlen(cptr)==2) {doSD=1;
continue;}
196 cptr+=2;
if(*cptr==
'=') {
198 if(*cptr==
'Y' || *cptr==
'y') {doSD=1;
continue;}
199 if(*cptr==
'N' || *cptr==
'n') {doSD=0;
continue;}
201 }
else if(strncasecmp(cptr,
"LIM=", 4)==0 && strlen(cptr)>4) {
202 strlcpy(limfile, cptr+4, FILENAME_MAX);
continue;
203 }
else if(strcasecmp(cptr,
"LIM")==0) {
204 strcpy(limfile,
"stdout");
continue;
205 }
else if(strncasecmp(cptr,
"R=", 2)==0 && strlen(cptr)>2) {
206 strlcpy(refname, cptr+2, FILENAME_MAX);
continue;
207 }
else if(strncasecmp(cptr,
"MODEL=", 6)==0) {
209 if(strncasecmp(cptr,
"PARALLEL", 1)==0) {model=1;
continue;}
210 if(strncasecmp(cptr,
"SERIES", 1)==0) {model=0;
continue;}
211 }
else if(strncasecmp(cptr,
"FK1K2=", 6)==0 && strlen(cptr)>6) {
213 fk1k2=
atof_dpi(cptr+6); def_pmin[CM_K1K2]=def_pmax[CM_K1K2]=fk1k2;
214 if(fk1k2>0.0)
continue;
217 if(resK1k2Median(cptr+6, &fk1k2, NULL, tmp)==0) {
218 def_pmin[CM_K1K2]=def_pmax[CM_K1K2]=fk1k2;
continue;
220 if(verbose>1) fprintf(stderr,
"Error: %s\n", tmp);
221 }
else if(strncasecmp(cptr,
"FK3K4=", 6)==0 && strlen(cptr)>6) {
223 fk3k4=
atof_dpi(cptr+6); def_pmin[CM_K3K4]=def_pmax[CM_K3K4]=fk3k4;
224 if(fk3k4>0.0)
continue;
225 }
else if(strncasecmp(cptr,
"Vb=", 3)==0 && strlen(cptr)>3) {
227 if(fVb>=0.0 && fVb<1.0) {
228 if(fVb<0.01) fprintf(stderr,
"Warning: Vb was set to %g%%\n", 100.*fVb);
229 def_pmin[CM_VB]=def_pmax[CM_VB]=fVb;
233 }
else if(strncasecmp(cptr,
"FIT=", 4)==0) {
234 strlcpy(ffile, cptr+4, FILENAME_MAX);
if(strlen(ffile)>0)
continue;
235 }
else if(strncasecmp(cptr,
"SVG=", 4)==0) {
236 strlcpy(svgfile, cptr+4, FILENAME_MAX);
if(strlen(svgfile)>0)
continue;
238 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
243 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
248 for(; ai<argc; ai++) {
250 strlcpy(pfile, argv[ai], FILENAME_MAX);
continue;
251 }
else if(!bfile[0]) {
252 strlcpy(bfile, argv[ai], FILENAME_MAX);
continue;
253 }
else if(!dfile[0]) {
254 strlcpy(dfile, argv[ai], FILENAME_MAX);
continue;
255 }
else if(fitdur<0) {
257 fprintf(stderr,
"Error: invalid fit time '%s'.\n", argv[ai]);
259 }
else if(!rfile[0]) {
260 strlcpy(rfile, argv[ai], FILENAME_MAX);
continue;
263 fprintf(stderr,
"Error: too many arguments: '%s'.\n", argv[ai]);
266 if(doSD || doCL) doBootstrap=1;
else doBootstrap=0;
270 printf(
"pfile := %s\n", pfile);
272 printf(
"dfile := %s\n", dfile);
273 printf(
"rfile := %s\n", rfile);
274 printf(
"ffile := %s\n", ffile);
275 printf(
"svgfile := %s\n", svgfile);
276 printf(
"limfile := %s\n", limfile);
277 printf(
"refname := %s\n", refname);
278 printf(
"model := %d\n", model);
279 printf(
"fitdur := %g\n", fitdur);
283 printf(
"doBootstrap := %d\n", doBootstrap);
284 printf(
"doSD := %d\n", doSD);
285 printf(
"doCL := %d\n", doCL);
291 if(limfile[0] && !pfile[0]) {
293 if(strcasecmp(limfile,
"stdout")!=0 && access(limfile, 0) != -1) {
294 fprintf(stderr,
"Error: parameter constraint file %s exists.\n", limfile);
297 if(verbose>1 && strcasecmp(limfile,
"stdout")!=0)
298 printf(
"writing parameter constraints file\n");
300 iftPutDouble(&ift,
"K1_lower", def_pmin[CM_K1], NULL, 0);
301 iftPutDouble(&ift,
"K1_upper", def_pmax[CM_K1], NULL, 0);
302 iftPutDouble(&ift,
"K1k2_lower", def_pmin[CM_K1K2], NULL, 0);
303 iftPutDouble(&ift,
"K1k2_upper", def_pmax[CM_K1K2], NULL, 0);
304 iftPutDouble(&ift,
"k3_lower", def_pmin[CM_K3], NULL, 0);
305 iftPutDouble(&ift,
"k3_upper", def_pmax[CM_K3], NULL, 0);
306 iftPutDouble(&ift,
"k3k4_lower", def_pmin[CM_K3K4], NULL, 0);
307 iftPutDouble(&ift,
"k3k4_upper", def_pmax[CM_K3K4], NULL, 0);
308 iftPutDouble(&ift,
"k5_lower", def_pmin[CM_K5], NULL, 0);
309 iftPutDouble(&ift,
"k5_upper", def_pmax[CM_K5], NULL, 0);
310 iftPutDouble(&ift,
"Vb_lower", def_pmin[CM_VB], NULL, 0);
311 iftPutDouble(&ift,
"Vb_upper", def_pmax[CM_VB], NULL, 0);
314 fprintf(stderr,
"Error in writing '%s': %s\n", limfile, ift.
status);
317 if(strcasecmp(limfile,
"stdout")!=0)
318 fprintf(stdout,
"Parameter file %s with initial values written.\n", limfile);
324 if(fitdur==0) fitdur=1.0E+100;
325 else if(fitdur<0) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
327 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
337 if(verbose>1) printf(
"reading %s\n", limfile);
338 ret=
iftRead(&ift, limfile, 1, 0);
340 fprintf(stderr,
"Error in reading '%s': %s\n", limfile, ift.
status);
343 if(verbose>2)
iftWrite(&ift,
"stdout", 0);
350 if(
iftGetDoubleValue(&ift, 0,
"K1k2_lower", &v, 0)>=0) {def_pmin[CM_K1K2]=v; n++;}
351 if(
iftGetDoubleValue(&ift, 0,
"K1k2_upper", &v, 0)>=0) {def_pmax[CM_K1K2]=v; n++;}
356 if(
iftGetDoubleValue(&ift, 0,
"k3k4_lower", &v, 0)>=0) {def_pmin[CM_K3K4]=v; n++;}
357 if(
iftGetDoubleValue(&ift, 0,
"k3k4_upper", &v, 0)>=0) {def_pmax[CM_K3K4]=v; n++;}
365 if(n==0) {fprintf(stderr,
"Error: invalid parameter file.\n");
return(9);}
368 for(pi=n=0, ret=0; pi<parNr; pi++) {
369 if(def_pmin[pi]<0.0) ret++;
370 if(def_pmax[pi]<def_pmin[pi]) ret++;
371 if(def_pmax[pi]>def_pmin[pi]) n++;
374 fprintf(stderr,
"Error: invalid parameter constraints.\n");
378 fprintf(stderr,
"Error: no model parameters left free for fitting.\n");
383 if(fVb>=0.0) def_pmin[CM_VB]=def_pmax[CM_VB]=fVb;
384 if(def_pmin[4]==def_pmax[CM_VB]) fVb=def_pmin[CM_VB];
385 if(fVb==0.0) strcpy(bfile,
"");
387 printf(
"bfile := %s\n", bfile);
388 if(fVb>=0.0) printf(
"fVb := %g\n", fVb);
391 if(fk1k2>0.0) def_pmin[CM_K1K2]=def_pmax[CM_K1K2]=fk1k2;
392 else if(def_pmin[CM_K1K2]==def_pmax[CM_K1K2]) fk1k2=def_pmin[CM_K1K2];
394 if(fk1k2>0.0) printf(
"fk1k2 := %g\n", fk1k2);
397 if(fk3k4>0.0) def_pmin[CM_K3K4]=def_pmax[CM_K3K4]=fk3k4;
398 else if(def_pmin[CM_K3K4]==def_pmax[CM_K3K4]) fk3k4=def_pmin[CM_K3K4];
400 if(fk3k4>0.0) printf(
"fk3k4 := %g\n", fk3k4);
407 if(verbose>1) printf(
"reading tissue and input data\n");
409 &fitframeNr, &dft, &input, stdout, verbose-2, tmp);
411 fprintf(stderr,
"Error: %s\n", tmp);
414 if(fitframeNr<6 || input.
frameNr<6) {
415 fprintf(stderr,
"Error: too few samples in specified fit duration.\n");
420 if(verbose>2) printf(
"setting blood tac to zero\n");
423 fprintf(stderr,
"Error: cannot allocate more memory.\n");
428 for(fi=0; fi<input.
frameNr; fi++) input.
voi[1].
y[fi]=0.0;
435 fprintf(stdout,
"common_data_weights := %g", dft.
w[0]);
436 for(fi=1; fi<dft.
frameNr; fi++) fprintf(stdout,
", %g", dft.
w[fi]);
437 fprintf(stdout,
"\n");
446 if(verbose>1) printf(
"no reference region data\n");
449 if(verbose>1) printf(
"reading reference region data\n");
450 if((n=
dftReadReference(&dft, refname, &inputtype, &ref, tmp, verbose-3))<1) {
451 fprintf(stderr,
"Error in reading '%s': %s\n", refname, tmp);
452 if(verbose>2) printf(
"dftReadReference()=%d\n", n);
457 fprintf(stderr,
"Warning: %s selected of %d reference regions.\n",
460 fprintf(stdout,
"selected reference region := %s\n", dft.
voi[ref].
name);
463 refAdded=0; strcpy(refname,
"");
468 if(verbose>1) printf(
"Reference region: %s\n", dft.
voi[ref].
name );
474 fprintf(stderr,
"Error: cannot allocate more memory.\n");
486 if(verbose>1) printf(
"initializing result data\n");
488 fprintf(stderr,
"Error: cannot setup memory for results.\n");
497 if(refname[0]) strcpy(res.
reffile, refname);
501 if(fVb>=0.0) res.
Vb=100.0*fVb;
510 pi=0; strcpy(res.
parname[pi],
"K1"); strcpy(res.
parunit[pi],
"ml/(min*ml)");
511 pi++; strcpy(res.
parname[pi],
"K1/k2"); strcpy(res.
parunit[pi],
"");
512 pi++; strcpy(res.
parname[pi],
"k3"); strcpy(res.
parunit[pi],
"1/min");
513 pi++; strcpy(res.
parname[pi],
"k3/k4"); strcpy(res.
parunit[pi],
"");
514 pi++; strcpy(res.
parname[pi],
"k5"); strcpy(res.
parunit[pi],
"1/min");
515 pi++; strcpy(res.
parname[pi],
"Vb"); strcpy(res.
parunit[pi],
"%");
516 pi++; strcpy(res.
parname[pi],
"Ki"); strcpy(res.
parunit[pi],
"ml/(min*ml)");
517 pi++; strcpy(res.
parname[pi],
"WSS"); strcpy(res.
parunit[pi],
"");
518 pi++; strcpy(res.
parname[pi],
"AIC"); strcpy(res.
parunit[pi],
"");
521 if(model==0) func=func_sk5;
else func=func_pk5;
527 if(ref>=0)
for(ri=0; ri<dft.
voiNr; ri++)
if(dft.
voi[ri].
sw>0) {
529 fprintf(stdout,
"fitting %s as reference region\n", dft.
voi[ri].
name);
531 petmeas=dft.
voi[ri].
y; petsim=dft.
voi[ri].
y2;
533 for(pi=0; pi<parNr; pi++) { pmin[pi]=def_pmin[pi]; pmax[pi]=def_pmax[pi]; }
534 for(pi=fittedparNr=0; pi<parNr; pi++)
if(pmax[pi]>pmin[pi]) fittedparNr++;
536 printf(
" ref_constraints :=");
537 for(pi=0; pi<parNr; pi++) printf(
" [%g,%g]", pmin[pi], pmax[pi]);
539 printf(
"fittedparNr := %d\n", fittedparNr);
545 tgoNr=50+30*fittedparNr;
546 neighNr=6*fittedparNr;
549 pmin, pmax, func, NULL, parNr, neighNr, &res.
voi[ri].
parameter[CM_WSS],
552 fprintf(stderr,
"Error in optimization (%d).\n", ret);
567 fprintf(stdout,
" K1/k2 := %g\n", res.
voi[ri].
parameter[CM_K1K2]);
571 printf(
"Original and fitted TACs:\n");
572 for(fi=0; fi<fitframeNr; fi++)
573 printf(
" %8.3f %9.3f %9.3f\n", dft.
x[fi], petmeas[fi], petsim[fi]);
574 printf(
"Original and fitted TACs:\n");
580 if(verbose>2) {fprintf(stdout,
" fixed K1/k2 := %g\n", fk1k2);}
584 if(verbose>2) printf(
" bootstrapping\n");
587 if(doSD) sd=res.
voi[ri].
sd;
else sd=NULL;
588 if(doCL) {cl1=res.
voi[ri].
cl1; cl2=res.
voi[ri].
cl2;}
else cl1=cl2=NULL;
598 parNr, dft.
w, func, tmp, verbose-4
601 fprintf(stderr,
"Error in bootstrap: %s\n", tmp);
602 for(pi=0; pi<parNr; pi++) {
603 if(doSD) sd[pi]=nan(
"");
604 if(doCL) cl1[pi]=cl2[pi]=nan(
"");
609 for(pi=n=0; pi<parNr; pi++)
if(pmax[pi]>pmin[pi]) n++;
610 if(verbose>2) printf(
"nr_of_fitted_parameters := %d\n", n);
611 for(fi=m=0; fi<fitframeNr; fi++)
if(dft.
w[fi]>0.0) m++;
612 if(verbose>2) printf(
"nr_of_fitted_samples := %d\n", m);
633 if(doSD) res.
voi[ri].
sd[CM_VB]*=100.;
634 if(doCL) {res.
voi[ri].
cl1[CM_VB]*=100.; res.
voi[ri].
cl2[CM_VB]*=100.;}
642 if(verbose>0) {fprintf(stdout,
"fitting regional TACs: "); fflush(stdout);}
643 if(verbose>1) printf(
"\n");
645 if(fk1k2>0.0) def_pmin[CM_K1K2]=def_pmax[CM_K1K2]=fk1k2;
647 for(ri=0; ri<dft.
voiNr; ri++)
if(dft.
voi[ri].
sw==0) {
648 if(verbose>2) printf(
"\n %d %s:\n", ri, dft.
voi[ri].
name);
651 petmeas=dft.
voi[ri].
y; petsim=dft.
voi[ri].
y2;
654 for(pi=0; pi<parNr; pi++) { pmin[pi]=def_pmin[pi]; pmax[pi]=def_pmax[pi]; }
655 for(pi=fittedparNr=0; pi<parNr; pi++)
if(pmax[pi]>pmin[pi]) fittedparNr++;
657 printf(
" constraints :=");
658 for(pi=0; pi<parNr; pi++) printf(
" [%g,%g]", pmin[pi], pmax[pi]);
660 printf(
"fittedparNr := %d\n", fittedparNr);
667 tgoNr=50+30*fittedparNr;
668 neighNr=6*fittedparNr;
671 pmin, pmax, func, NULL, parNr, neighNr, &res.
voi[ri].
parameter[CM_WSS],
674 fprintf(stderr,
"\nError in optimization (%d).\n", ret);
691 if(verbose>2) printf(
" bootstrapping\n");
694 if(doSD) sd=res.
voi[ri].
sd;
else sd=NULL;
695 if(doCL) {cl1=res.
voi[ri].
cl1; cl2=res.
voi[ri].
cl2;}
else cl1=cl2=NULL;
705 parNr, dft.
w, func, tmp, verbose-4
708 fprintf(stderr,
"Error in bootstrap: %s\n", tmp);
709 for(pi=0; pi<parNr; pi++) {
710 if(doSD) sd[pi]=nan(
"");
711 if(doCL) cl1[pi]=cl2[pi]=nan(
"");
733 for(pi=n=0; pi<parNr; pi++)
if(pmax[pi]>pmin[pi]) n++;
734 if(verbose>2) printf(
"nr_of_fitted_parameters := %d\n", n);
735 for(fi=m=0; fi<fitframeNr; fi++)
if(dft.
w[fi]>0.0) m++;
736 if(verbose>2) printf(
"nr_of_fitted_samples := %d\n", m);
741 if(doSD) res.
voi[ri].
sd[CM_VB]*=100.;
742 if(doCL) {res.
voi[ri].
cl1[CM_VB]*=100.; res.
voi[ri].
cl2[CM_VB]*=100.;}
745 if(dft.
voiNr>2 && verbose==1) {fprintf(stdout,
"."); fflush(stdout);}
748 if(verbose>0) {fprintf(stdout,
"\n"); fflush(stdout);}
754 if(verbose>0) {
resPrint(&res); fprintf(stdout,
"\n");}
760 if(verbose>1) printf(
"saving results\n");
761 ret=
resWrite(&res, rfile, verbose-3);
763 fprintf(stderr,
"Error in writing '%s': %s\n", rfile,
reserrmsg);
767 if(verbose>0) fprintf(stdout,
"Model parameters written in %s\n", rfile);
773 if(svgfile[0] || ffile[0]) {
780 fprintf(stderr,
"Error: cannot save fitted curves.\n");
784 for(ri=0; ri<dft.
voiNr; ri++)
for(fi=0; fi<fitframeNr; fi++)
790 if(verbose>1) printf(
"saving SVG plot\n");
791 sprintf(tmp,
"K1-k5 fit: ");
794 0.0, nan(
""), svgfile, verbose-8);
796 fprintf(stderr,
"Error (%d) in writing '%s'.\n", ret, svgfile);
800 if(verbose>0) printf(
"Plots written in %s\n", svgfile);
805 for(ri=dft2.
voiNr-1; ri>=0; ri--)
if(dft2.
voi[ri].
sw!=0)
811 if(verbose>1) printf(
"saving fitted curves\n");
813 sprintf(dft2.
comments,
"# program := %s\n", tmp);
815 fprintf(stderr,
"Error in writing '%s': %s\n", ffile,
dfterrmsg);
819 if(verbose>0) printf(
"Fitted TACs written in %s\n", ffile);
837double func_sk5(
int parNr,
double *p,
void *fdata)
840 double Vb, k2, k4, d, wss=0.0;
847 k2=pa[CM_K1]/pa[CM_K1K2];
848 k4=pa[CM_K3]/pa[CM_K3K4];
854 pa[CM_K1], k2, pa[CM_K3], k4, pa[CM_K5], 0.0, 0.0, Vb, 1.0,
855 input.
voi[0].
y2, NULL, NULL, NULL, NULL, NULL);
857 printf(
"error %d in simulation\n", ret);
865 dft.
x1, dft.
x2, petsim, NULL, NULL, fitframeNr);
869 dft.
x, petsim, NULL, NULL, fitframeNr);
871 printf(
"error %d in interpolation\n", ret);
876 for(fi=0, wss=0.0; fi<fitframeNr; fi++)
if(dft.
w[fi]>0.0) {
877 d=petmeas[fi]-petsim[fi];
888double func_pk5(
int parNr,
double *p,
void *fdata)
891 double Vb, k2, k4, d, wss=0.0;
899 k2=pa[CM_K1]/pa[CM_K1K2];
900 k4=pa[CM_K3]/pa[CM_K3K4];
906 pa[CM_K1], k2, pa[CM_K3], k4, pa[CM_K5], 0.0, 0.0, Vb, 1.0,
907 input.
voi[0].
y2, NULL, NULL, NULL, NULL, NULL);
909 printf(
"error %d in simulation\n", ret);
917 dft.
x1, dft.
x2, petsim, NULL, NULL, fitframeNr);
921 dft.
x, petsim, NULL, NULL, fitframeNr);
923 printf(
"error %d in interpolation\n", ret);
928 for(fi=0, wss=0.0; fi<fitframeNr; fi++)
if(dft.
w[fi]>0.0) {
929 d=petmeas[fi]-petsim[fi];
961 if(
resRead(filename, &res, 0)!=0) {
962 if(msg!=NULL) sprintf(msg,
"cannot read %s: %s", filename,
reserrmsg);
966 col=-1; ri=0; cptr=strtok(res.
titleline,
" \t");
967 while(cptr!=NULL && col<0) {
968 if(strcasecmp(cptr,
"K1/k2")==0) col=ri;
969 else if(strcasecmp(cptr,
"K1k2")==0) col=ri;
970 ri++; cptr=strtok(NULL,
" \t");
973 if(msg!=NULL) sprintf(msg,
"K1/k2 not found in %s", filename);
978 lista=(
double*)malloc(n*
sizeof(
double));
979 for(ri=0; ri<n; ri++) lista[ri]=res.
voi[ri].
parameter[col];
984 if(msg!=NULL) sprintf(msg,
"invalid K1/k2 mean in %s", filename);
985 free(lista);
return(6);
991 if(msg!=NULL) sprintf(msg,
"invalid K1/k2 median in %s", filename);
992 free(lista);
return(5);
double aicSS(double ss, const int n, const int k)
int bootstrap(int iterNr, double *cLim1, double *cLim2, double *SD, double *parameter, double *lowlim, double *uplim, int frameNr, double *origTac, double *fitTac, double *bsTac, int parNr, double *weight, double(*objf)(int, double *, void *), char *status, int verbose)
int modelCheckParameters(int par_nr, double *lower_p, double *upper_p, double *test_p, double *accept_p, double *penalty)
int atof_with_check(char *double_as_string, double *result_value)
double atof_dpi(char *str)
int dftdup(DFT *dft1, DFT *dft2)
int dftAddmem(DFT *dft, int voiNr)
int dftDelete(DFT *dft, int voi)
int dftWrite(DFT *data, char *filename)
int res_allocate_with_dft(RES *res, DFT *dft)
int iftPutDouble(IFT *ift, char *key, double value, char *cmt_type, int verbose)
int iftRead(IFT *ift, char *filename, int is_key_required, int verbose)
int iftWrite(IFT *ift, char *filename, int verbose)
int iftGetDoubleValue(IFT *ift, int si, const char *key, double *value, int verbose)
int interpolate(double *x, double *y, int nr, double *newx, double *newy, double *newyi, double *newyii, int newnr)
Linear interpolation and integration.
int interpolate4pet(double *x, double *y, int nr, double *newx1, double *newx2, double *newy, double *newyi, double *newyii, int newnr)
Interpolate and integrate TAC to PET frames.
Header file for libtpccurveio.
int resWrite(RES *res, char *filename, int verbose)
int resRead(char *filename, RES *res, int verbose)
#define DFT_TIME_STARTEND
Header file for libtpcmisc.
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
void tpcProgramName(const char *program, int version, int copyright, char *prname, int n)
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 simC3vp(double *t, double *ca, double *cb, int nr, double k1, double k2, double k3, double k4, double k5, double k6, double f, double vb, double fa, double *cpet, double *cta, double *ctb, double *ctc, double *ctab, double *ctvb)
int simC3vs(double *t, double *ca, double *cb, int nr, double k1, double k2, double k3, double k4, double k5, double k6, double f, double vb, double fa, double *cpet, double *cta, double *ctb, double *ctc, double *ctab, double *ctvb)
int tgo(double *lowlim, double *uplim, double(*objf)(int, double *, void *), void *objfData, int dim, int neighNr, double *fmin, double *gmin, int samNr, int tgoNr, int verbose)
double dmean(double *data, int n, double *sd)
double dmedian(double *data, int n)
int mean(double *x, double *y, int nr, double *xmean, double *xsd, double *ymean, double *ysd)
Header file for libtpcmodext.
int plot_fitrange_svg(DFT *dft1, DFT *dft2, char *main_title, double x1, double x2, double y1, double y2, char *fname, int verbose)
Header file for libtpcsvg.
char studynr[MAX_STUDYNR_LEN+1]
char comments[_DFT_COMMENT_LEN+1]
char parname[MAX_RESPARAMS][MAX_RESPARNAME_LEN+1]
char plasmafile[FILENAME_MAX]
char datafile[FILENAME_MAX]
char reffile[FILENAME_MAX]
char parunit[MAX_RESPARAMS][MAX_RESPARNAME_LEN+1]
char bloodfile[FILENAME_MAX]
double parameter[MAX_RESPARAMS]
double cl2[MAX_RESPARAMS]
double cl1[MAX_RESPARAMS]
char voiname[MAX_REGIONSUBNAME_LEN+1]
char name[MAX_REGIONNAME_LEN+1]