9#include "tpcclibConfig.h"
26static char *info[] = {
27 "Compartmental model simulation of input function.",
30 "Usage: @P [Options] parfile [outputfile] ",
34 " Sample time interval; too long interval as compared to rate constants",
35 " leads to bias; by default 1 s.",
36 " -end=<End time (s)",
37 " Duration of simulation; by default 3600 s.",
40 "To create a template parameter file, do not enter names for other files.",
41 "If parameter file does not contain units, then per sec and per mL units",
44 "Example 1: creating template parameter file",
46 "Example 2: simulating input TAC using parameter file",
47 " @P -i=1 -end=3600 input.par simulated.tac",
49 "See also: sim_pkcp, sim_av, sim_3tcm, simframe",
51 "Keywords: input, simulation",
79 if(d==NULL || par==NULL)
return(1);
80 if(verbose>0) printf(
"%s()\n", __func__);
114 if(cp==NULL)
return 2;
118 double t_last=0.0;
if(t[0]<t_last) t_last=t[0];
122 double cai=0.0, cai_last=0.0;
123 double cvi=0.0, cvi_last=0.0;
124 double ct1i=0.0, ct1i_last=0.0;
128 for(
int i=0; i<nr; i++) {
130 double dt2=0.5*(t[i]-t_last);
136 double ii;
if(t[i]<=0.0) ii=0.0;
else if(t[i]<Ti) ii=t[i];
else ii=Ti;
138 double bca=cai_last+dt2*ca_last;
139 double bcv=cvi_last+dt2*cv_last;
140 double bct1=ct1i_last+dt2*ct1_last;
142 cv[i]=(ii-(kav-k11*k12*kav*dt2*dt2/((1.0+(k11+ku)*dt2)*(1.0+k12*dt2)))*bcv
143 + k11*k12*dt2*bca/((1.0+(k11+ku)*dt2)*(1.0+k12*dt2))
144 + k12*bct1/(1.0+k12*dt2)
145 ) / (1.0 + dt2*(kav - (k11*k12*kav*dt2*dt2)/((1.0+(k11+ku)*dt2)*(1.0+k12*dt2))));
146 cvi+=dt2*(cv[i]+cv_last);
147 cp[i]=(kav*cvi - (k11+ku)*bca) / (1 + dt2*(k11+ku));
148 cai+=dt2*(cp[i]+ca_last);
149 ct1=(k11*cai - k12*bct1) / (1 + k12*dt2);
150 ct1i+=dt2*(ct1+ct1_last);
172int main(
int argc,
char **argv)
174 int ai, help=0, version=0, verbose=1;
175 char simfile[FILENAME_MAX], parfile[FILENAME_MAX];
176 double interval=1.0, duration=3600.0;
182 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
183 parfile[0]=simfile[0]=(char)0;
185 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
187 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
188 if(strncasecmp(cptr,
"I=", 2)==0) {
189 interval=
atofVerified(cptr+2);
if(interval>0.0)
continue;
190 }
else if(strncasecmp(cptr,
"END=", 4)==0) {
191 duration=
atofVerified(cptr+4);
if(duration>0.0)
continue;
193 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
202 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
207 if(ai<argc)
strlcpy(parfile, argv[ai++], FILENAME_MAX);
208 if(ai<argc) {
strlcpy(simfile, argv[ai++], FILENAME_MAX);}
210 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
216 fprintf(stderr,
"Error: missing parameter file name; use option --help\n");
222 printf(
"parfile := %s\n", parfile);
223 if(simfile[0]) printf(
"simfile := %s\n", simfile);
224 printf(
"duration := %g\n", duration);
225 printf(
"interval := %g\n", interval);
236 fprintf(stderr,
"Error: cannot allocate memory for parameters.\n");
251 sprintf(par.
r[ti].
name,
"tac%d", 1+ti);
303 sprintf(par.
r[ti].
name,
"tac%d", 1+ti);
306 pi=0; par.
r[ti].
p[pi]=15.0;
307 pi++; par.
r[ti].
p[pi]=0.2;
308 pi++; par.
r[ti].
p[pi]=0.05;
309 pi++; par.
r[ti].
p[pi]=0.01;
310 pi++; par.
r[ti].
p[pi]=0.02;
313 if(verbose>1) printf(
"writing %s\n", parfile);
314 FILE *fp; fp=fopen(parfile,
"w");
316 fprintf(stderr,
"Error: cannot open file for writing (%s)\n", parfile);
321 if(ret!=
TPCERROR_OK) {fprintf(stderr,
"Error: cannot write %s\n", parfile);
return(11);}
329 if(verbose>1) fprintf(stdout,
"reading %s\n", parfile);
331 if(
parRead(&par, parfile, &status)) {
332 fprintf(stderr,
"Error: %s (%s)\n",
errorMsg(status.
error), parfile);
338 fprintf(stderr,
"Error: simulation of only one TAC is currently supported.\n");
347 if(!(sp.
Ti>=0.0)) {fprintf(stderr,
"Error: invalid/missing Ti for parent.\n"); ret++;}
350 if(!(sp.
Tdur>0.0)) {fprintf(stderr,
"Error: invalid/missing Tdur for parent.\n"); ret++;}
353 if(!(sp.
Irate>0.0)) {fprintf(stderr,
"Error: invalid/missing Irate for parent.\n"); ret++;}
357 if(f>0.0) sp.
Irate*=f;
360 if(!(sp.
k_BV_BA>0.0)) {fprintf(stderr,
"Error: invalid/missing pVA for parent.\n"); ret++;}
372 if(pi<0) {fprintf(stderr,
"Error: missing Ti.\n");
parFree(&par);
return(3);}
373 punit=par.
n[pi].
unit;
379 if(pi<0) {fprintf(stderr,
"Error: missing Kav.\n");
parFree(&par);
return(3);}
380 punit=par.
n[pi].
unit;
386 if(pi<0) {fprintf(stderr,
"Error: missing K11.\n");
parFree(&par);
return(3);}
387 punit=par.
n[pi].
unit;
393 if(pi<0) {fprintf(stderr,
"Error: missing K12.\n");
parFree(&par);
return(3);}
394 punit=par.
n[pi].
unit;
400 if(pi<0) {fprintf(stderr,
"Error: missing Ku.\n");
parFree(&par);
return(3);}
401 punit=par.
n[pi].
unit;
416 fprintf(stderr,
"Error: cannot allocate memory for simulated data.\n");
425 sim.
x1[i]=interval*(double)(i);
426 sim.
x2[i]=interval*(double)(i+1);
427 sim.
x[i]=0.5*interval*(double)(2*i+1);
429 if(sim.
x[i]>=duration)
break;
431 if(verbose>2) printf(
"sampleNr := %d\n", sim.
sampleNr);
437 for(
int ti=0; ti<par.
tacNr; ti++) {
443 if(simPTAC(sim.
x, sim.
sampleNr, Ti, kav, k11, k12, ku, sim.
c[ti].
y)!=0) {
444 fprintf(stderr,
"Error: cannot simulate.\n");
454 if(verbose>1) printf(
"writing simulated data in %s\n", simfile);
455 FILE *fp; fp=fopen(simfile,
"w");
457 fprintf(stderr,
"Error: cannot open file for writing (%s)\n", simfile);
466 if(verbose>=0) printf(
"Simulated TAC saved in %s\n", simfile);
double atofVerified(const char *s)
int parAllocate(PAR *par, int parNr, int tacNr)
int parWrite(PAR *par, FILE *fp, parformat format, int extra, TPCSTATUS *status)
int parRead(PAR *par, const char *fname, TPCSTATUS *status)
double parGetParameter(PAR *d, const char *par_name, const int ti)
int parGetParameterUnit(PAR *d, const char *par_name)
int parFindParameter(PAR *d, const char *par_name)
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 icmparcFree(ICMPARC *d)
void icmparcInit(ICMPARC *d)
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_PARNAME_LEN+1]
char name[MAX_TACNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacAllocate(TAC *tac, int sampleNr, int tacNr)
int tacWrite(TAC *tac, FILE *fp, tacformat format, int extra, TPCSTATUS *status)
Header file for libtpccm.
Header file for library libtpcextensions.
@ UNIT_SEC_KBQ_PER_ML
s*kBq/mL
double unitConversionFactor(const int u1, const int u2)
Header file for library libtpcift.
Header file for libtpcli.
Header file for libtpcpar.
@ PAR_FORMAT_TSV_UK
UK TSV (point as decimal separator).
Header file for library libtpctac.
@ TAC_FORMAT_UNKNOWN
Unknown format.
@ TAC_FORMAT_PMOD
PMOD TAC format.
Header file for libtpctacmod.