10#include "tpcclibConfig.h"
27static char *info[] = {
28 "Simulation of drug concentration in plasma using pharmacokinetic compartment",
30 "Available models, and model parameters:",
31 " O1CM; one-compartment model with first-order absorption and elimination;",
33 " O2CM; two-compartment model with first-order absorption and elimination;",
34 " ED/V1, ka, kd, kr, ke.",
36 "Usage: @P [options] parfile [simfile]",
39 " -model=<O1CM|O2CM>",
40 " Select the model used to simulate the plasma curve; by default the model",
41 " is read from the parameter file.",
48 "To create a template parameter file, do not enter filename for simulated",
49 "data, but give the model with option -model.",
50 "Simulated time range is determined based on the parameter file.",
52 "See also: paucinf, sim_3tcm, tacadd, interpol",
54 "Keywords: plasma, pharmacokinetics",
73int main(
int argc,
char **argv)
75 int ai, help=0, version=0, verbose=1;
76 char simfile[FILENAME_MAX], parfile[FILENAME_MAX];
78 unsigned int model=0, parNr=0;
79 double startTime=nan(
""), endTime=nan(
"");
86 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
87 simfile[0]=parfile[0]=(char)0;
89 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
91 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
92 if(strncasecmp(cptr,
"MODEL=", 6)==0 && strlen(cptr)>7) {
95 fprintf(stderr,
"Error: invalid model selection.\n");
return(1);
97 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
106 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
111 if(ai<argc) {
strlcpy(parfile, argv[ai++], FILENAME_MAX);}
112 if(ai<argc) {
strlcpy(simfile, argv[ai++], FILENAME_MAX);}
114 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
120 fprintf(stderr,
"Error: missing parameter file; use option --help\n");
126 if(model!=0) printf(
"model := %s\n",
modelCode(model));
127 printf(
"parfile := %s\n", parfile);
128 printf(
"simfile := %s\n", simfile);
139 if(model==0 || parNr==0) {
140 fprintf(stderr,
"Error: unknown simulation model; use option -model.\n");
146 fprintf(stderr,
"Error: cannot allocate memory for parameters.\n");
150 for(
int i=0; i<par.
tacNr; i++) {
151 sprintf(par.
r[i].
name,
"Cp%d", 1+i);
164 for(
int i=1; i<par.
tacNr; i++) {
165 par.
r[i].
p[0]=1.0*par.
r[i-1].
p[0];
166 par.
r[i].
p[1]=1.0*par.
r[i-1].
p[1];
167 par.
r[i].
p[2]=2.0*par.
r[i-1].
p[2];
169 }
else if(!strcmp(
modelCode(model),
"O2CM")) {
180 for(
int i=1; i<par.
tacNr; i++) {
181 par.
r[i].
p[0]=1.0*par.
r[i-1].
p[0];
182 par.
r[i].
p[1]=1.0*par.
r[i-1].
p[1];
183 par.
r[i].
p[2]=2.0*par.
r[i-1].
p[2];
184 par.
r[i].
p[3]=2.0*par.
r[i-1].
p[3];
185 par.
r[i].
p[4]=1.0*par.
r[i-1].
p[4];
188 fprintf(stderr,
"Error: incompatible simulation model.\n");
191 if(verbose>1) printf(
"writing %s\n", parfile);
192 FILE *fp; fp=fopen(parfile,
"w");
194 fprintf(stderr,
"Error: cannot open file for writing (%s)\n", parfile);
207 if(verbose>1) fprintf(stdout,
"reading %s\n", parfile);
209 if(
parRead(&par, parfile, &status)) {
210 fprintf(stderr,
"Error: %s (%s)\n",
errorMsg(status.
error), parfile);
216 if(model!=0)
for(
int i=0; i<par.
tacNr; i++) par.
r[i].
model=model;
218 for(
int i=0; i<par.
tacNr; i++) {
223 fprintf(stderr,
"Error: invalid parameters for selected model.\n");
237 fprintf(stderr,
"Error: invalid model for this simulation.\n");
242 fprintf(stderr,
"Error: required parameters not available.\n");
250 for(
int i=0; i<par.
tacNr; i++)
255 if(verbose>0) fprintf(stderr,
"Warning: unknown sample nr; set to %d.\n", sampleNr);
260 for(
int i=0; i<par.
tacNr; i++) {
261 if(isnan(startTime) || par.
r[i].
start<startTime) startTime=par.
r[i].
start;
262 if(isnan(endTime) || par.
r[i].
end>endTime) endTime=par.
r[i].
end;
264 startTime/=60.0; endTime/=60.0;
265 if(isnan(startTime)) startTime=0.0;
266 if(isnan(endTime) || endTime<=startTime) endTime=12.0+fabs(startTime);
269 printf(
"startTime[h] := %g\n", startTime);
270 printf(
"endTime[h] := %g\n", endTime);
284 for(
int i=0; i<par.
tacNr; i++)
285 if(par.
r[i].
p[pi]<ka) ka=par.
r[i].
p[pi];
290 isampleNr=(int)
simSamples(0.0001/ka, 0.01*endTime, endTime, 2, NULL);
292 printf(
"isampleNr := %u\n", isampleNr);
296 printf(
"allocating memory for %d samples and %d curves\n",
297 isampleNr, par.
tacNr);
322 simSamples(0.0001/ka, 0.01*endTime, endTime, 2, sim.
x);
329 double gi[isampleNr], bufi[isampleNr];
330 for(
int i=0; i<par.
tacNr; i++) {
331 if(verbose>2 && par.
tacNr>1) printf(
"\nSimulation %d\n", 1+i);
336 double k1, ka, kd, kr, ke;
343 if(isnan(k1) || isnan(ka) || isnan(ke)) {
344 fprintf(stderr,
"Error: required parameters not available.\n");
348 printf(
" ED/V1 := %g\n", k1);
349 printf(
" ka := %g\n", ka);
350 printf(
" ke := %g\n", ke);
351 printf(
" kd := %g\n", kd);
352 printf(
" kr := %g\n", kr);
355 for(
int j=0; j<isampleNr; j++)
356 gi[j]=(1.0-exp(-ka*sim.
x[j]))/ka;
359 double *cp=sim.
c[i].
y;
360 ret=
simC2_i(sim.
x, gi, isampleNr, k1, ke, kd, kr, bufi, cp, NULL);
362 fprintf(stderr,
"Error: cannot simulate.\n");
366 for(
int j=0; j<isampleNr; j++)
367 printf(
"\t%g\t%g\n", sim.
x[j], cp[j]);
374 if(verbose>1) printf(
"writing %s\n", simfile);
375 FILE *fp; fp=fopen(simfile,
"w");
377 fprintf(stderr,
"Error: cannot open file for writing (%s)\n", simfile);
384 fprintf(stderr,
"Error (%d): %s\n", ret,
errorMsg(status.
error));
387 if(verbose>=0) printf(
"%s saved.\n", simfile);
unsigned int simSamples(double initStep, double maxStep, double endTime, int mode, double *x)
char * modelCode(const unsigned int i)
unsigned int modelParNr(const unsigned int code)
unsigned int modelCodeIndex(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 parFindParameter(PAR *d, const char *par_name)
int tacAllocateWithPAR(TAC *tac, PAR *par, int sampleNr, TPCSTATUS *status)
Allocate TAC based on data in PAR.
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)
int simC2_i(double *t, double *cai, const int nr, const double k1, const double k2, const double k3, const double k4, double *ct, double *cta, double *ctb)
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]
char name[MAX_TACNAME_LEN+1]
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacWrite(TAC *tac, FILE *fp, tacformat format, int extra, TPCSTATUS *status)
Header file for libtpccm.
Header file for library libtpcextensions.
@ WEIGHTING_OFF
Not weighted or weights not available (weights for all included samples are 1.0).
Header file for library libtpcift.
Header file for libtpcli.
Header file for libtpcpar.
@ PAR_FORMAT_CSV_UK
UK CSV.
@ 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.