10#include "tpcclibConfig.h"
30static char *info[] = {
31 "Verifies that peak is not missed in an input TAC file.",
32 "Return code is zero, if no problems were encountered.",
33 "This may be used in scripts for a rough test if venous plasma TAC can",
34 "be used as input in Patlak analysis, but it must not replace visual",
37 "Usage: @P [Options] <TAC file(s)>",
41 " Minor problems are corrected; always check the result before use.",
44 "Example 1: check that specified data files are suitable as input TACs",
47 "See also: tacframe, tactime, avgbolus, taccat, interpol",
49 "Keywords: TAC, input, plasma, peak, zero",
68int main(
int argc,
char **argv)
70 int ai, help=0, version=0, verbose=1;
71 int ri, fileNr=0, ffi=0, ret, errorCount=0, doFix=0, fixed, checked=0;
72 char *cptr, tmp[256], dftfile[FILENAME_MAX];
79 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
83 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
85 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
86 if(strcasecmp(cptr,
"FIX")==0) {
89 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
94 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
99 for(; ai<argc; ai++) {
106 fprintf(stderr,
"Error: missing file name for input data.\n");
112 printf(
"fileNr := %d\n", fileNr);
113 printf(
"doFix := %d\n", doFix);
120 for(ai=ffi; ai<argc; ai++) {
122 strlcpy(dftfile, argv[ai], FILENAME_MAX);
123 if(verbose>0 && fileNr>1) fprintf(stdout,
"%s:\n", dftfile);
126 if(verbose>3) printf(
"reading %s\n", dftfile);
129 fprintf(stderr,
"Error in reading '%s': %s\n", dftfile,
dfterrmsg);
138 if(verbose>0) printf(
" missing sample(s).\n");
139 if(doFix==0) {
dftEmpty(&dft); errorCount++;
continue;}
141 if(verbose>1) printf(
" trying to fix...\n");
144 if(verbose>1) printf(
" corrected.\n");
148 "Error: missing samples can not be corrected automatically.\n");
158 if(verbose>0) printf(
" ok\n");
161 fprintf(stderr,
"Error: program can not verify the peak.\n");
162 if(verbose>0) fprintf(stderr,
"Error: %s\n", tmp);
167 if(verbose<=0) fprintf(stdout,
"%s:\n", dftfile);
168 printf(
" TAC may have minor problems\n");
170 if(verbose>0) printf(
" TAC may have minor problems\n");
176 if(verbose<=0) fprintf(stdout,
"%s:\n", dftfile);
177 printf(
" Error: TAC must be corrected before using as input\n");
180 printf(
" TAC must be corrected before using as input\n");
185 if(verbose>1) printf(
" trying to fix...\n");
188 if(verbose>0) printf(
" corrected.\n");
189 fixed++; errorCount--;
191 if(verbose<=0) fprintf(stdout,
"%s:\n", dftfile);
192 printf(
" Error: peak can not be corrected automatically.\n");
193 printf(
" Correct the input TAC manually!\n");
198 int localErrorCount=0;
199 for(ri=0; ri<dft.
voiNr; ri++) {
200 if(verbose>0) fprintf(stdout,
" TAC %s:\n", dft.
voi[ri].
name);
204 if(verbose>0) printf(
" ok\n");
206 fprintf(stderr,
"Error: program can not verify the peak.\n");
207 if(verbose>0) fprintf(stderr,
"Error: %s\n", tmp);
210 if(verbose>0) printf(
" TAC may have minor problems\n");
214 printf(
" TAC must be corrected before using as input\n");
218 if(localErrorCount>0 && doFix) {
219 if(verbose>1) printf(
" trying to fix...\n");
222 if(verbose>0) printf(
" corrected.\n");
223 fixed++; localErrorCount=0;
225 printf(
" peaks can not be corrected automatically.\n");
228 errorCount+=localErrorCount;
233 if(verbose>2) printf(
" writing corrected data...\n");
236 fprintf(stderr,
"Error in writing '%s': %s\n", dftfile,
dfterrmsg);
240 if(verbose>1) printf(
" corrected TAC written in file.\n");
247 if(verbose>0 && checked>1) {
249 printf(
"All files appear as suitable to be used as model input.\n");
251 printf(
"%d possibly severe problem(s) encountered.\n", errorCount);
272 int ri, ret, mini, maxi, n, warn=0, fixnr=0;
273 double minx, maxx, miny, maxy, dif, d, slope, ic;
276 if(verbose>0) printf(
"dftFixPeak(dft, %d)\n", verbose);
278 if(dft==NULL || dft->
frameNr<1 || dft->
voiNr<1)
return 1;
285 if(verbose>1) printf(
"TAC does not need to be corrected\n");
290 if(dft->
x[0]<=0.001) {
291 if(verbose>1) printf(
"TAC already has zero sample\n");
296 double zx, zy[dft->
voiNr];
300 for(ri=0; ri<dft->
voiNr; ri++) {
302 if(verbose>1 && dft->
voiNr>1)
303 printf(
"checking region %d: %s\n", 1+ri, dft->
voi[ri].
name);
309 ret=
dftMinMaxTAC(dft, ri, &minx, &maxx, &miny, &maxy, NULL, NULL,
312 if(verbose>0) printf(
"Error %d in dftMinMaxTAC()\n", ret);
319 if(verbose>0) printf(
"TAC does not have a clear peak.\n");
323 if(verbose>1) printf(
"TAC does not have a clear peak.\n");
330 if(verbose>1) printf(
"peak at the first sample.\n");
332 dif=dft->
x1[maxi]/(dft->
x2[maxi]-dft->
x1[maxi]);
334 dif=dft->
x[maxi]/(dft->
x[maxi+1]-dft->
x[maxi]);
336 if(verbose>2) printf(
"dif := %g\n", dif);
339 printf(
"peak at the first sample, which is too late.\n");
341 }
else if(dif>1.0 && maxy<=10.*miny) {
343 printf(
"peak at the first sample and bad peak/tail ratio.\n");
346 if(verbose>1) printf(
"zero sample added.\n");
353 if(dft->
x[0]>0.75*maxx) {
354 if(dft->
voi[ri].
y[0]>0.50*maxy) {
355 if(verbose>1) printf(
"The first sample is relatively late and high.\n");
361 n=maxi+1;
if(n>6) n/=2;
else if(n>3) n--;
363 &slope, &ic, &d, NULL);
364 if(ret!=0 || d>=maxx) {
365 if(verbose>0) printf(
"ascending part of TAC not available.\n");
366 if(verbose>1) printf(
"ret=%d\n", ret);
370 printf(
"based on ascending part:\n");
371 printf(
" slope: %g\n", slope);
372 printf(
" ic: %g\n", ic);
373 printf(
" new x intercept: %g\n", d);
378 if(zy[ri]>0.5*dft->
voi[ri].
y[0]) zy[ri]=0.5*dft->
voi[ri].
y[0];
379 else if(zy[ri]<0.0) zy[ri]=0.0;
380 }
else if(dft->
voiNr>1) {
383 if(zy[ri]>0.5*dft->
voi[ri].
y[0]) zy[ri]=0.5*dft->
voi[ri].
y[0];
384 else if(zy[ri]<0.0) zy[ri]=0.0;
388 if(ic<0.5*dft->voi[ri].y[0]) d=0.5*dft->
x[0];
else d=0.0;
390 if(d>=dft->
x[0]) d=0.5*dft->
x[0];
401 for(ri=0; ri<dft->
voiNr; ri++) {
402 dft->
voi[ri].
y[0]=zy[ri];
403 if(verbose>1) printf(
"zero sample added at (%g,%g).\n", zx, zy[ri]);
410 if(verbose>2) printf(
"dftVerifyPeak()=%d\n", ret);
411 if(verbose>1) fprintf(stderr,
"Note: %s\n", tmp);
412 if(ret>1) printf(
"correction was not successful\n");
int dftMinMaxTAC(DFT *dft, int tacindex, double *minx, double *maxx, double *miny, double *maxy, int *mini, int *maxi, int *mins, int *maxs)
int dftSortByFrame(DFT *dft)
int dftFillInitialGap(DFT *dft)
int dft_nr_of_NA(DFT *dft)
int dftRead(char *filename, DFT *data)
int dftWrite(DFT *data, char *filename)
int dftFixPeak(DFT *dft, int verbose)
Header file for libtpccurveio.
#define DFT_TIME_STARTEND
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 highest_slope(double *x, double *y, int n, int slope_n, double *m, double *c, double *xi, double *xh)
Header file for libtpcmodext.
char name[MAX_REGIONNAME_LEN+1]