8#include "tpcclibConfig.h"
24static char *info[] = {
25 "Simulation of input function time lag using n-compartmental transit-time",
26 "model (one-way catenary compartmental model):",
27 " ____ ____ ____ ____ ",
28 " | | k | | k | | k | | k ",
29 " | Ca | ---> | C1 | ---> | C2 | --->...--> | Cn | ---> ",
30 " |____| |____| |____| |____| ",
33 "Usage: @P [Options] tacfile n k [outputfile] ",
38 "If file name for output is not given, then the TAC file is modified.",
39 "The units of k must correspond the time units of the TAC.",
40 "For accurate results, input TAC should have very short sample intervals.",
41 "Frame durations are not used, even if available in the TAC file.",
43 "See also: simdisp, convexpf, fit2dat, simframe, sim_av, tacunit",
45 "Keywords: TAC, input, simulation, dispersion, time delay",
64int main(
int argc,
char **argv)
66 int ai, help=0, version=0, verbose=1;
67 char tacfile[FILENAME_MAX], simfile[FILENAME_MAX];
75 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
76 tacfile[0]=simfile[0]=(char)0;
78 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
80 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
81 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
90 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
95 if(ai<argc) {
strlcpy(tacfile, argv[ai++], FILENAME_MAX);}
99 fprintf(stderr,
"Error: invalid n '%s'.\n", argv[ai]);
return(1);}
104 if(!(k>0.0)) {fprintf(stderr,
"Error: invalid k '%s'.\n", argv[ai]);
return(1);}
107 if(ai<argc) {
strlcpy(simfile, argv[ai++], FILENAME_MAX);}
109 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
115 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
118 if(!simfile[0]) strcpy(simfile, tacfile);
122 printf(
"tacfile := %s\n", tacfile);
123 printf(
"simfile := %s\n", simfile);
124 printf(
"n := %u\n", n);
125 printf(
"k := %g\n", k);
133 if(verbose>1) {fprintf(stdout,
"reading %s\n", tacfile); fflush(stdout);}
136 fprintf(stderr,
"Error: %s (%s)\n",
errorMsg(status.
error), tacfile);
141 printf(
"tacNr := %d\n", tac.
tacNr);
142 printf(
"sampleNr := %d\n", tac.
sampleNr);
150 fprintf(stderr,
"Error: missing frame times.\n");
155 fprintf(stderr,
"Error: missing concentrations.\n");
159 fprintf(stderr,
"Error: too few samples in input data.\n");
162 if(tac.
tacNr>1 && verbose>0) {
163 fprintf(stderr,
"Warning: TAC contains %d TACs\n", tac.
tacNr);
167 fprintf(stderr,
"Error: invalid sample times.\n");
170 if(tac.
isframe!=0 && verbose>0) {
172 fprintf(stderr,
"Error: invalid sample times.\n");
175 fprintf(stderr,
"Warning: frame durations are ignored.\n");
183 if(verbose>1) {fprintf(stdout,
"simulating\n"); fflush(stdout);}
184 for(
int ci=0; ci<tac.
tacNr; ci++) {
187 fprintf(stderr,
"Error: invalid data for simulation.\n");
190 for(
int i=0; i<tac.
sampleNr; i++) tac.
c[ci].
y[i]=sim[i];
198 if(verbose>1) printf(
"writing simulated data in %s\n", simfile);
199 FILE *fp; fp=fopen(simfile,
"w");
201 fprintf(stderr,
"Error: cannot open file for writing.\n");
210 if(verbose>=0) printf(
"Simulated data saved in %s\n", simfile);
double atofVerified(const char *s)
int atoiCheck(const char *s, int *v)
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 simTTM(double *t, double *c0, const int n, const double k, const int cn, double *cout)
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)
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacRead(TAC *d, const char *fname, TPCSTATUS *status)
char * tacFormattxt(tacformat c)
int tacWrite(TAC *tac, FILE *fp, tacformat format, int extra, TPCSTATUS *status)
int tacYNaNs(TAC *tac, const int i)
int tacSortByTime(TAC *d, TPCSTATUS *status)
int tacIsWeighted(TAC *tac)
int tacSetX(TAC *d, TPCSTATUS *status)
Set TAC x values based on x1 and x2 values, or guess x1 and x2 values based on x values.
Header file for libtpccm.
Header file for library libtpcextensions.
char * unitName(int unit_code)
Header file for library libtpcift.
Header file for libtpcli.
Header file for library libtpctac.
@ TAC_FORMAT_UNKNOWN
Unknown format.
Header file for libtpctacmod.