9#include "tpcclibConfig.h"
22static char *info[] = {
23 "Deprecated, use sim_3tcm instead.",
25 "Simulation of PET tissue time-radioactivity concentration curve (TAC)",
26 "from arterial plasma (Ca) TAC based on three-tissue compartmental model,",
27 "where the compartments are in series (default):"
29 " ____ K1 ____ k3 ____ k5 ____ ",
30 " | Ca | ----> | C1 | ----> | C2 | ----> | C3 | ",
31 " |____| <---- |____| <---- |____| <---- |____| ",
34 " dC1(t)/dt = K1*Ca(T) - (k2+k3)*C1(T) + k4*C2(T) ",
35 " dC2(t)/dt = k3*C1(T) - (k4+k5)*C2(T) + k6*C3(T) ",
36 " dC3(t)/dt = k5*C2(T) - k6*C3(T) ",
37 " Ct(T) = C1(T) + C2(T) + C3(T) ",
39 ", or, optionally, three-tissue compartmental model, where the 2nd and 3rd",
40 "tissue compartments are parallel, often used to represent specific and",
41 "non-specific binding:",
43 " ____ K1 ____ k3 ____ ",
44 " | Ca | ----> | C1 | ----> | C2 | ",
45 " |____| <---- |____| <---- |____| ",
54 " dC1(t)/dt = K1*Ca(T) - (k2+k3+k5)*C1(T) + k4*C2(T) + k6*C3(T) ",
55 " dC2(t)/dt = k3*C1(T) - k4*C2(T) ",
56 " dC3(t)/dt = k5*C1(T) - k6*C3(T) ",
57 " Ct(T) = C1(T) + C2(T) + C3(T) ",
59 "Usage: @P [options] plasmafile K1 k2 k3 k4 k5 k6 simfile",
63 " Model with parallel compartments C2 and C3 is applied.",
65 " Model with compartments C1, C2, and C3 in series is applied (default).",
67 " TACs of sub-compartments (C1, C2 and C3) are written (-sub, default)",
68 " or not written (-nosub) into the simfile.",
72 " @P -nosub plasma.dat 0.3 0.2 0.1 0.2 0 0 sim.dat",
74 "See also: sim_3tcm, p2t_v3c, p2t_di, tacadd, tacren, simframe, dft2img",
76 "Keywords: TAC, simulation, modelling, compartmental model",
95int main(
int argc,
char **argv)
97 int ai, help=0, version=0, verbose=1;
100 int save_only_total=0;
103 double k1, k2, k3, k4, k5, k6, *t, *ca, *ct, *ct1, *ct2, *ct3;
104 char pfile[FILENAME_MAX], sfile[FILENAME_MAX], *cptr;
105 char tmp[FILENAME_MAX+128];
112 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
114 pfile[0]=sfile[0]=(char)0;
115 k1=k2=k3=k4=k5=k6=-1.0;
117 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
119 cptr=argv[ai]+1;
if(!*cptr)
continue;
120 if(strncasecmp(cptr,
"NOSUB", 5)==0) {
121 save_only_total=1;
continue;
122 }
else if(strncasecmp(cptr,
"SUB", 3)==0) {
123 save_only_total=0;
continue;
124 }
else if(strncasecmp(cptr,
"PARALLEL", 5)==0) {
125 parallel=1;
continue;
126 }
else if(strncasecmp(cptr,
"SERIES", 3)==0) {
127 parallel=0;
continue;
129 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
134 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
139 for(; ai<argc; ai++) {
141 strlcpy(pfile, argv[ai], FILENAME_MAX);
continue;
143 k1=
atof_dpi(argv[ai]);
if(k1>=0.0)
continue;
145 k2=
atof_dpi(argv[ai]);
if(k2>=0.0)
continue;
147 k3=
atof_dpi(argv[ai]);
if(k3>=0.0)
continue;
149 k4=
atof_dpi(argv[ai]);
if(k4>=0.0)
continue;
151 k5=
atof_dpi(argv[ai]);
if(k5>=0.0)
continue;
153 k6=
atof_dpi(argv[ai]);
if(k6>=0.0)
continue;
154 }
else if(!sfile[0]) {
155 strlcpy(sfile, argv[ai], FILENAME_MAX);
continue;
157 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
163 if(!sfile[0]) {
tpcPrintUsage(argv[0], info, stdout);
return(1);}
164 if(k1<=0.0) {fprintf(stderr,
"Error: k1 must be > 0.\n");
return(1);}
165 if(k1>1.0E+08 || k2>1.0E+08 || k3>1.0E+08 || k4>1.0E+08 ||
166 k5>1.0E+08 || k6>1.0E+08) {
167 fprintf(stderr,
"Error: too high rate constant.\n");
return(1);
172 printf(
"pfile := %s\n", pfile);
173 printf(
"sfile := %s\n", sfile);
174 printf(
"parameters := %g %g %g %g %g %g\n", k1, k2, k3, k4, k5, k6);
175 printf(
"save_only_total := %d\n", save_only_total);
176 printf(
"parallel := %d\n", parallel);
183 if(verbose>1) printf(
"reading %s\n", pfile);
185 fprintf(stderr,
"Error in reading '%s': %s\n", pfile,
dfterrmsg);
190 fprintf(stderr,
"Error: too few samples in plasma data.\n");
194 fprintf(stderr,
"Error: plasma data contains more than one curve.\n");
201 if(verbose>1) printf(
"allocating memory\n");
206 "Error (%d): cannot allocate memory for simulated TACs.\n", ret);
212 for(fi=0; fi<sim.
frameNr; fi++) {
213 sim.
x[fi]=plasma.
x[fi];
214 sim.
x1[fi]=plasma.
x1[fi]; sim.
x2[fi]=plasma.
x2[fi];
217 for(ri=0; ri<sim.
voiNr; ri++) {
220 case 0: strcpy(sim.
voi[ri].
voiname,
"Ct");
break;
221 case 1: strcpy(sim.
voi[ri].
voiname,
"C1");
break;
222 case 2: strcpy(sim.
voi[ri].
voiname,
"C2");
break;
223 case 3: strcpy(sim.
voi[ri].
voiname,
"C3");
break;
233 if(verbose>1) printf(
"simulating\n");
234 t=sim.
x; ca=plasma.
voi[0].
y; ct=sim.
voi[0].
y;
237 ret=
simC3s(t, ca, sim.
frameNr, k1, k2, k3, k4, k5, k6, ct, ct1, ct2, ct3);
239 ret=
simC3p(t, ca, sim.
frameNr, k1, k2, k3, k4, k5, k6, ct, ct1, ct2, ct3);
242 fprintf(stderr,
"Error (%d) in simulation.\n", ret);
250 if(verbose>1) printf(
"saving PET curves\n");
252 if(save_only_total) sim.
voiNr=1;
255 sprintf(tmp,
"# plasmafile := %s\n", pfile); strcat(sim.
comments, tmp);
256 strcpy(tmp,
"# model := ");
257 if(parallel==0) strcat(tmp,
"C3S\n");
else strcat(tmp,
"C3P\n");
259 sprintf(tmp,
"# K1 := %g\n", k1); strcat(sim.
comments, tmp);
260 sprintf(tmp,
"# k2 := %g\n", k2); strcat(sim.
comments, tmp);
261 sprintf(tmp,
"# k3 := %g\n", k3); strcat(sim.
comments, tmp);
262 sprintf(tmp,
"# k4 := %g\n", k4); strcat(sim.
comments, tmp);
263 sprintf(tmp,
"# k5 := %g\n", k5); strcat(sim.
comments, tmp);
264 sprintf(tmp,
"# k6 := %g\n", k6); strcat(sim.
comments, tmp);
273 fprintf(stderr,
"Error in writing '%s': %s\n", sfile,
dfterrmsg);
276 if(verbose>0) fprintf(stdout,
"simulated TAC(s) written in %s\n", sfile);
double atof_dpi(char *str)
void dftSetComments(DFT *dft)
int dftSetmem(DFT *data, int frameNr, int voiNr)
int dftCopymainhdr(DFT *dft1, DFT *dft2)
int dftRead(char *filename, DFT *data)
int dftWrite(DFT *data, char *filename)
char * filenameGetExtension(char *s)
Get the last extension of a filename.
Header file for libtpccurveio.
#define DFT_FORMAT_STANDARD
#define DFT_FORMAT_UNKNOWN
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)
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 simC3p(double *t, double *ca, int nr, double k1, double k2, double k3, double k4, double k5, double k6, double *ct, double *cta, double *ctb, double *ctc)
int simC3s(double *t, double *ca, int nr, double k1, double k2, double k3, double k4, double k5, double k6, double *ct, double *cta, double *ctb, double *ctc)
char comments[_DFT_COMMENT_LEN+1]
char voiname[MAX_REGIONSUBNAME_LEN+1]
char name[MAX_REGIONNAME_LEN+1]
char hemisphere[MAX_REGIONSUBNAME_LEN+1]
char place[MAX_REGIONSUBNAME_LEN+1]