9#include "tpcclibConfig.h"
23static char *info[] = {
24 "Input for liver models consists of two parts: portal vein and hepatic artery.",
25 "This program calculates a weighted average of TACs of portal vein and",
28 "Usage: @P [Options] portalfile arteryfile portal_fraction outputfile",
34 " @P ue65pv.blo ue65ha.blo 0.90 ue65hi.blo",
36 "See also: liverpv, taccalc, interpol, taccat, tacformat, b2plasma",
38 "Keywords: input, blood, TAC, modelling, simulation, liver",
57int main(
int argc,
char **argv)
59 int ai, help=0, version=0, verbose=1;
60 int fi, ret, dataNr=0;
61 char pfile[FILENAME_MAX], afile[FILENAME_MAX], wfile[FILENAME_MAX];
69 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
70 pfile[0]=afile[0]=wfile[0]=(char)0;
73 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
75 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
84 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
89 for(; ai<argc; ai++) {
91 strlcpy(pfile, argv[ai], FILENAME_MAX);
continue;
92 }
else if(!afile[0]) {
93 strlcpy(afile, argv[ai], FILENAME_MAX);
continue;
94 }
else if(portalf<0.0) {
96 if(portalf>1.0) portalf/=100.0;
97 if(portalf>=0.0 && portalf<=1.0)
continue;
99 fprintf(stderr,
"Error: invalid proportion of portal vein input.\n");
101 }
else if(!wfile[0]) {
102 strlcpy(wfile, argv[ai], FILENAME_MAX);
continue;
104 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
110 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
117 for(ai=0; ai<argc; ai++) printf(
"%s ", argv[ai]);
119 printf(
"pfile := %s\n", pfile);
120 printf(
"afile := %s\n", afile);
121 printf(
"wfile := %s\n", wfile);
122 printf(
"portalf := %g\n", portalf);
131 if(verbose>0) printf(
"reading %s\n", pfile);
132 ret=
tacRead(&pdata, pfile, &status);
134 fprintf(stderr,
"Error (%d): %s\n", ret,
errorMsg(status.
error));
139 printf(
"tacNr := %d\n", pdata.
tacNr);
140 printf(
"sampleNr := %d\n", pdata.
sampleNr);
145 fprintf(stderr,
"Warning: only first TAC in portal data is used.\n");
150 if(verbose>0) printf(
"reading %s\n", afile);
151 ret=
tacRead(&adata, afile, &status);
153 fprintf(stderr,
"Error (%d): %s\n", ret,
errorMsg(status.
error));
158 printf(
"tacNr := %d\n", adata.
tacNr);
159 printf(
"sampleNr := %d\n", adata.
sampleNr);
164 fprintf(stderr,
"Warning: only first TAC in hepatic arterial data is used.\n");
175 fprintf(stderr,
"Warning: different or unknown time units.\n");
179 fprintf(stderr,
"Warning: different or unknown concentration units.\n");
185 ret=
tacYRange(&pdata, 0, NULL, &pmax, NULL, NULL, NULL, NULL);
186 if(ret==0) ret=
tacYRange(&adata, 0, NULL, &amax, NULL, NULL, NULL, NULL);
188 fprintf(stderr,
"Error: invalid data.\n");
192 fprintf(stderr,
"Warning: unexpectedly portal vein has higher peak than hepatic artery.\n");
200 pdata.
x, pdata.
c[1].
y, NULL, NULL, pdata.
sampleNr, 4, 1, verbose-2);
202 fprintf(stderr,
"Error: cannot interpolate plasma TAC.\n");
210 if(verbose>1) printf(
"calculating weighted average TAC\n");
211 for(fi=0, dataNr=0; fi<pdata.
sampleNr; fi++) {
212 if(isnan(pdata.
c[0].
y[fi]) || isnan(pdata.
c[1].
y[fi])) {
213 pdata.
c[0].
y[fi]=nan(
"");
continue;
215 if(pdata.
x[fi]<=(1.1*adata.
x[adata.
sampleNr-1])) {
216 pdata.
c[0].
y[fi]= portalf*pdata.
c[0].
y[fi] + (1.0-portalf)*pdata.
c[1].
y[fi];
221 fprintf(stderr,
"Error: check the TAC sample times.\n");
227 "Warning: last %d samples are taken from hepatic vein alone.\n",
236 if(verbose>1) printf(
"writing %s\n", wfile);
240 iftPut(&pdata.
h,
"program", tmp, 1, NULL);
242 iftPut(&pdata.
h,
"portal_vein_file", pfile, 1, NULL);
244 iftPut(&pdata.
h,
"hepatic_artery_file", afile, 1, NULL);
245 sprintf(tmp,
"%g", portalf);
246 iftPut(&pdata.
h,
"portal_vein_fraction", tmp, 1, NULL);
249 FILE *fp; fp=fopen(wfile,
"w");
251 fprintf(stderr,
"Error: cannot open file for writing (%s)\n", wfile);
257 fprintf(stderr,
"Error (%d): %s\n", ret,
errorMsg(status.
error));
260 if(verbose>0) printf(
"Liver input TAC written in %s\n", wfile);
int atofCheck(const char *s, double *v)
void filenameRmPath(char *s)
int iftPut(IFT *ift, const char *key, const char *value, char comment, TPCSTATUS *status)
int liInterpolate(double *x, double *y, const int nr, double *newx, double *newy, double *newyi, double *newyii, const int newnr, const int se, const int ee, const int verbose)
Linear interpolation and/or integration with trapezoidal method.
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
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)
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)
IFT h
Optional (but often useful) header information.
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
int tacAllocateMore(TAC *tac, int tacNr)
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 tacSortByTime(TAC *d, TPCSTATUS *status)
int tacYUnitConvert(TAC *tac, const int u, TPCSTATUS *status)
int tacXUnitConvert(TAC *tac, const int u, TPCSTATUS *status)
int tacYRange(TAC *d, int i, double *ymin, double *ymax, int *smin, int *smax, int *imin, int *imax)
Get the range of y values (concentrations) in TAC struct.
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.