8#include "tpcclibConfig.h"
26static char *info[] = {
27 "Calculates a difference image from late and early time frames of a dynamic",
28 "PET image in ECAT 6.3, 7.x, NIfTI-1, or Analyze 7.5 format.",
29 "Analyze and NIfTI image must have SIF in the same folder for frame time",
32 "Usage: @P [Options] image earlytime latetime diffimage",
34 "For each image pixel, program will calculate the average concentration",
35 "from time zero to the early time (min), and the average from late time (min)",
36 "to the end of PET, and subtract the early average from the late average",
37 "(or optionally vice versa).",
41 " Late average is subtracted from early average to reveal arterial pools.",
43 " Frame numbers are given instead of times.",
45 " Negative differences are set to zero.",
47 " Absolute differences are calculated.",
49 " Write early average image in given file.",
51 " Write late average image in given file.",
54 "See also: imginteg, imgsuv, imgcalc, imgthrs, imgfrdyn, imgcutof",
56 "Keywords: image, dynamics, input, mask, time",
75int main(
int argc,
char **argv)
77 int ai, help=0, version=0, verbose=1;
82 char petfile[FILENAME_MAX], diffile[FILENAME_MAX];
83 char earlyfile[FILENAME_MAX], latefile[FILENAME_MAX];
91 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
92 petfile[0]=diffile[0]=earlyfile[0]=latefile[0]=(char)0;
95 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
97 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
98 if(strncasecmp(cptr,
"FRAMES", 5)==0) {
99 useFrames=1;
continue;
100 }
else if(strncasecmp(cptr,
"NONEGATIVES", 5)==0) {
101 workNegatives=1;
continue;
102 }
else if(strncasecmp(cptr,
"ABSOLUTE", 3)==0) {
103 workNegatives=2;
continue;
104 }
else if(strcasecmp(cptr,
"EL")==0) {
106 }
else if(strcasecmp(cptr,
"LE")==0) {
108 }
else if(strncasecmp(cptr,
"EFILE=", 6)==0) {
109 strlcpy(earlyfile, cptr+6, FILENAME_MAX);
continue;
110 }
else if(strncasecmp(cptr,
"LFILE=", 6)==0) {
111 strlcpy(latefile, cptr+6, FILENAME_MAX);
continue;
113 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
118 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
123 if(ai<argc) {
strlcpy(petfile, argv[ai], FILENAME_MAX); ai++;}
127 if(!useFrames) fprintf(stderr,
"Error: invalid early time '%s'.\n", argv[ai]);
128 else fprintf(stderr,
"Error: invalid early frame '%s'.\n", argv[ai]);
136 if(!useFrames) fprintf(stderr,
"Error: invalid late time '%s'.\n", argv[ai]);
137 else fprintf(stderr,
"Error: invalid late frame '%s'.\n", argv[ai]);
142 if(ai<argc) {
strlcpy(diffile, argv[ai], FILENAME_MAX); ai++;}
143 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
148 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
152 if(!useFrames) {tearly*=60.0; tlate*=60.0;}
157 printf(
"petfile := %s\n", petfile);
158 printf(
"diffile := %s\n", diffile);
159 printf(
"useFrames := %d\n", useFrames);
161 printf(
"earlytime := %g s\n", tearly);
162 printf(
"latetime := %g s\n", tlate);
164 printf(
"earlyframe := %d\n", (
int)roundf(tearly));
165 printf(
"lateframe := %d\n", (
int)roundf(tlate));
167 printf(
"difType := %d\n", difType);
168 printf(
"workNegatives := %d\n", workNegatives);
169 if(earlyfile[0]) printf(
"earlyfile := %s\n", earlyfile);
170 if(latefile[0]) printf(
"latefile := %s\n", latefile);
179 if(verbose>0) {fprintf(stdout,
"reading image %s\n", petfile); fflush(stdout);}
183 fprintf(stderr,
"Error: %s\n", img.
statmsg);
if(verbose>1)
imgInfo(&img);
188 fprintf(stderr,
"Error: %s is not an image.\n", petfile);
192 fprintf(stderr,
"Error: %s is static image.\n", petfile);
196 if(verbose>0) fprintf(stderr,
"Warning: missing pixel values.\n");
197 if(verbose>0 && !useFrames) {
198 printf(
"image time range: %g - %g s\n", img.
start[0], img.
end[img.
dimt-1]);
204 fprintf(stderr,
"Error: image does not contain frame times.\n"); fflush(stderr);
210 if(verbose>1) {fprintf(stdout,
"checking frame overlap in %s\n", petfile); fflush(stdout);}
213 fprintf(stderr,
"Error: image %s has overlapping frame times.\n", petfile);
220 int i=(int)roundf(tearly);
222 fprintf(stderr,
"Error: invalid early frame.\n");
228 i=(int)roundf(tlate);
229 if(i<1 || i>img.
dimt) {
230 fprintf(stderr,
"Error: invalid late frame.\n");
233 tlate=img.
start[i-1];
236 printf(
"earlytime := %g s\n", tearly);
237 printf(
"latetime := %g s\n", tlate);
243 if(tearly<=img.
start[0] || tearly>img.
end[img.
dimt-1]) {
244 fprintf(stderr,
"Error: invalid early time.\n");
248 fprintf(stderr,
"Error: invalid late time.\n");
256 if(verbose>1) {fprintf(stdout,
"calculating the first average image\n"); fflush(stdout);}
259 fprintf(stderr,
"Error: %s.\n", tmp);
262 if(verbose>1) {fprintf(stdout,
"%s.\n", tmp); fflush(stdout);}
266 fprintf(stderr,
"Error: %s\n", img1.
statmsg);
269 if(verbose>0) {fprintf(stdout,
"early average image written in %s\n", earlyfile); fflush(stdout);}
274 if(verbose>1) {fprintf(stdout,
"calculating the second average image\n"); fflush(stdout);}
277 fprintf(stderr,
"Error: %s.\n", tmp);
280 if(verbose>1) {fprintf(stdout,
"%s.\n", tmp); fflush(stdout);}
284 fprintf(stderr,
"Error: %s\n", img2.
statmsg);
287 if(verbose>0) {fprintf(stdout,
"late average image written in %s\n", latefile); fflush(stdout);}
297 if(verbose>1) {fprintf(stdout,
"calculating the difference\n"); fflush(stdout);}
298 ret=
imgArithm(&img1, &img2,
'-', -1.0, verbose-6);
300 if(verbose>1) fprintf(stderr,
"imgArithm()=%d\n", ret);
301 fprintf(stderr,
"Error: cannot calculate difference image.\n");
310 if(verbose>1) fprintf(stderr,
"imgArithmConst()=%d\n", ret);
311 fprintf(stderr,
"Error: cannot calculate difference image.\n");
317 if(workNegatives==2) {
320 if(verbose>1) fprintf(stderr,
"imgAbs()=%d\n", ret);
321 fprintf(stderr,
"Error: cannot calculate absolute differences.\n");
327 if(workNegatives==1)
imgCutoff(&img1, 0.0, 1);
333 if(verbose>1) {fprintf(stdout,
"writing difference image\n"); fflush(stdout);}
336 fprintf(stderr,
"Error: %s\n", img1.
statmsg);
339 if(verbose>0) {fprintf(stdout,
"difference image written in %s\n", diffile); fflush(stdout);}
int atof_with_check(char *double_as_string, double *result_value)
int imgExistentTimes(IMG *img)
unsigned long long imgNaNs(IMG *img, int fix)
void imgEmpty(IMG *image)
int imgArithm(IMG *img1, IMG *img2, char operation, float ulimit, int verbose)
int imgArithmConst(IMG *img, float operand, char operation, float ulimit, int verbose)
int imgRead(const char *fname, IMG *img)
int imgWrite(const char *fname, IMG *img)
int imgDeleteFrameOverlap(IMG *img)
void imgCutoff(IMG *image, float cutoff, int mode)
Header file for libtpccurveio.
Header file for libtpcimgio.
Header file for libtpcimgp.
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.
Header file for libtpcmodext.
int imgTimeIntegral(IMG *img, float t1, float t2, IMG *iimg, int calc_mode, char *status, int verbose)