8#include "tpcclibConfig.h"
23static char *info[] = {
24 "List the time frame information of an ECAT 6.3 or 7.x file.",
25 "The frame start times and lengths can be saved in SIF.",
27 "If an existing SIF is specified, the frame times are read from it and",
28 "written in the ECAT file; SIF and ECAT file must contain an equal number",
29 "of frames. If ECAT file does not contain isotope or scan start time,",
30 "they are copied from the SIF, too.",
32 "Warning! Make sure that SIF does not exist, unless you want to change",
33 "the frame times in ECAT file.",
35 "Usage: @P [-Options] ecatfile [SIF]",
39 " Frame file is written in interfile type format; currently",
40 " this format is not supported in changing the frame times.",
41 " Times are saved in min; use option -sec to save in sec.",
43 " Frame file is written with only frame start times and lengths.",
44 " Times are saved in min; use option -sec to save in sec.",
47 "See also: esetstrt, egetstrt, ecattime, tacframe, imghead, imgdelfr",
49 "Keywords: image, ECAT, time, SIF",
68int main(
int argc,
char **argv)
70 int ai, help=0, version=0, verbose=1;
71 int fi, ret, sec=0, frame_nr;
73 char ecatfile[FILENAME_MAX], datfile[FILENAME_MAX], tmp[512], *cptr;
74 float start=0., dur=0., end=0.;
84 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
85 ecatfile[0]=datfile[0]=tmp[0]=(char)0;
88 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
89 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
91 if(strcasecmp(cptr,
"IFT")==0) {
92 output_format=1;
continue;
93 }
else if(strcasecmp(cptr,
"SIF")==0) {
94 output_format=2;
continue;
95 }
else if(strcasecmp(cptr,
"PLAIN")==0) {
96 output_format=0;
continue;
97 }
else if(strncasecmp(cptr,
"SEC", 3)==0 || strcasecmp(cptr,
"S")==0) {
99 }
else if(strncasecmp(cptr,
"MIN", 3)==0 || strcasecmp(cptr,
"M")==0) {
102 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
108 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
113 if(ai<argc)
strlcpy(ecatfile, argv[ai++], FILENAME_MAX);
114 if(ai<argc)
strlcpy(datfile, argv[ai++], FILENAME_MAX);
115 if(ai<argc) {fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
return(1);}
119 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n", argv[0]);
125 printf(
"ecatfile := %s\n", ecatfile);
126 printf(
"datfile := %s\n", datfile);
127 printf(
"output_format := %d\n", output_format);
128 printf(
"sec := %d\n", sec);
140 if(access(datfile, 0) != -1) {
142 if(verbose>0) fprintf(stdout,
"Setting frame times from %s\n", datfile);
146 char *cptr=strrchr(datfile,
'.');
147 if(cptr!=NULL && strcasecmp(cptr,
".SIF")==0) output_format=2;
148 if(cptr!=NULL && strcasecmp(cptr,
".IFT")==0) output_format=1;
152 if(verbose>1) printf(
"mode := %d\n", mode);
159 if(verbose>1) printf(
"reading ECAT file\n");
162 fprintf(stderr,
"Error in reading %s: %s\n", ecatfile,
imgStatus(ret));
166 if(verbose>1) printf(
"frame_nr := %d\n", frame_nr);
168 ret=
sifSetmem(&esif, frame_nr);
if(ret!=0) {
169 fprintf(stderr,
"Error: out of memory.\n");
175 for(fi=0; fi<frame_nr; fi++) {
176 if(verbose>2) printf(
"\nframe %d\n", fi+1);
180 fprintf(stderr,
"\nError in reading %s: %s\n", ecatfile,
imgStatus(ret));
183 if(verbose>0 && frame_nr>2) {fprintf(stdout,
"."); fflush(stdout);}
195 if(verbose>0 && frame_nr>2) printf(
"\n");
198 if(mode==1 || (verbose>0 && (mode==0 || mode==2))) {
199 printf(
"Frame Start End Dur (sec) Start End Dur (min)\n");
201 for(fi=0; fi<esif.
frameNr; fi++) {
202 printf(
"%5d %6.1f %6.1f %6.1f %7.3f %7.3f %7.3f\n",
203 fi+1, esif.
x1[fi], esif.
x2[fi], esif.
x2[fi]-esif.
x1[fi],
204 esif.
x1[fi]/60., esif.
x2[fi]/60., (esif.
x2[fi]-esif.
x1[fi])/60. );
220 if(output_format==2) {
221 if(mode==1) strcpy(datfile,
"stdout");
224 fprintf(stderr,
"Error: cannot write frame times in %s\n", datfile);
227 if(verbose>0 && mode==2) {
228 if(sec) fprintf(stdout,
"Frame times (sec) written in %s\n", datfile);
229 else fprintf(stdout,
"Frame times (min) written in %s\n", datfile);
232 if(verbose>0 && mode==2) {
233 if(sec) fprintf(stdout,
"Frame times (sec) written in %s\n", datfile);
234 else fprintf(stdout,
"Frame times (min) written in %s\n", datfile);
242 fp=stdout; strcpy(datfile,
"stdout");
245 if((fp=fopen(datfile,
"w"))==NULL ) {
246 fprintf(stderr,
"Error: cannot write file %s\n", datfile);
250 if(output_format==0) {
251 for(
int fi=0; fi<esif.
frameNr; fi++) {
252 if(sec) ret=fprintf(fp,
"%g %g\n", esif.
x1[fi], (esif.
x2[fi]-esif.
x1[fi]) );
253 else ret=fprintf(fp,
"%g %g\n", esif.
x1[fi]/60.0, (esif.
x2[fi]-esif.
x1[fi])/60.0 );
255 fprintf(stderr,
"Error: cannot write frame times in %s.\n", datfile);
260 }
else if(output_format==1) {
261 fprintf(fp,
"filename := %s\n", ecatfile);
262 fprintf(fp,
"frame_nr := %d\n", esif.
frameNr);
263 if(sec) strcpy(tmp,
"sec");
else strcpy(tmp,
"min");
264 fprintf(fp,
"time_unit := %s\n", tmp);
265 for(
int fi=0; fi<esif.
frameNr; fi++) {
266 if(sec) sprintf(tmp,
"%g", esif.
x1[fi]);
else sprintf(tmp,
"%g", esif.
x1[fi]/60.0);
267 fprintf(fp,
"frame_start[%d] := %s\n", fi+1, tmp);
268 if(sec) sprintf(tmp,
"%g", esif.
x2[fi]-esif.
x1[fi]);
269 else sprintf(tmp,
"%g", (esif.
x2[fi]-esif.
x1[fi])/60.0);
270 ret=fprintf(fp,
"frame_duration[%d] := %s\n", fi+1, tmp);
272 fprintf(stderr,
"Error: cannot write frame times.\n");
278 if(mode==2) fclose(fp);
281 if(verbose>0 && mode==2) {
282 if(sec) fprintf(stdout,
"Frame times (sec) written in %s\n", datfile);
283 else fprintf(stdout,
"Frame times (min) written in %s\n", datfile);
298 fprintf(stderr,
"Error: different frame number in %s and %s\n", datfile, ecatfile);
302 if(verbose>2) printf(
"%s is not SIF\n", datfile);
304 if((fp=fopen(datfile,
"r")) == NULL) {
305 fprintf(stderr,
"Error in opening %s\n", datfile);
309 ret=
sifSetmem(&nsif, frame_nr);
if(ret!=0) {
310 fprintf(stderr,
"Error: out of memory.\n");
316 while(fgets(tmp, 256, fp)!=NULL) {
317 if(tmp[0]==
'#')
continue;
318 ret=sscanf(tmp,
"%f %f", &start, &dur);
if(ret<=0)
continue;
319 if(verbose>22) printf(
"'%s' -> n=%d, start=%g\n", tmp, ret, start);
320 if(fi==frame_nr) {fi=0;
break;}
322 nsif.
x1[fi]=end; nsif.
x2[fi]=nsif.
x1[fi]+start;
324 nsif.
x1[fi]=start; nsif.
x2[fi]=nsif.
x1[fi]+dur;
327 if(verbose>21) printf(
"fi=%d %g %g %g\n", fi, start, end, dur);
332 fprintf(stderr,
"Error: different frame number in %s and %s\n", datfile, ecatfile);
336 if(sec==0)
for(fi=0; fi<nsif.
frameNr; fi++) {nsif.
x1[fi]*=60.; nsif.
x2[fi]*=60.;}
338 if(verbose>0) fprintf(stdout,
"Frame times read from %s\n", datfile);
339 if(verbose>0) fflush(stdout);
347 if(access(ecatfile, 0) != -1) {
348 strcpy(tmp, ecatfile); strcat(tmp,
".bak");
349 if(access(tmp, 0) != -1) remove(tmp);
350 if(verbose>0) printf(
"Making backup %s -> %s\n", ecatfile, tmp);
351 rename(ecatfile, tmp);
352 if(access(ecatfile, 0) != -1) {
353 fprintf(stderr,
"Error: cannot overwrite %s\n", ecatfile);
357 if(verbose>0) printf(
"editing ECAT file\n");
359 for(
int fi=0; fi<frame_nr; fi++) {
360 if(verbose>1) printf(
"\nframe %d\n", fi+1);
366 fprintf(stderr,
"\nError in reading %s: %s\n", ecatfile,
imgStatus(ret));
377 if(verbose>0 && fi==0)
378 fprintf(stdout,
"\nnew halflife := %g [s]\n", 60.0*hl);
388 fprintf(stderr,
"\nError in writing %s: %s\n", ecatfile,
imgStatus(ret));
391 if(verbose>0 && frame_nr>2) {fprintf(stdout,
"."); fflush(stdout);}
393 if(verbose>0 && frame_nr>2) printf(
"\n");
400 printf(
"Modified frame times:\n");
401 printf(
"Frame Start End Dur (sec) Start End Dur (min)\n");
403 for(
int fi=0; fi<nsif.
frameNr; fi++) {
404 printf(
"%5d %5.0f %5.0f %5.0f %6.2f %6.2f %6.2f\n",
405 fi+1, nsif.
x1[fi], nsif.
x2[fi], nsif.
x2[fi]-nsif.
x1[fi],
406 nsif.
x1[fi]/60., nsif.
x2[fi]/60., (nsif.
x2[fi]-nsif.
x1[fi])/60. );
double hlFromIsotope(char *isocode)
char * imgStatus(int status_index)
void imgEmpty(IMG *image)
char * imgIsotope(IMG *img)
int imgWriteFrame(const char *fname, int frame_to_write, IMG *img, int frame_index)
int imgReadFrame(const char *fname, int frame_to_read, IMG *img, int frame_index)
int imgReadHeader(const char *fname, IMG *img, int format)
Header file for libtpcimgio.
int sifWrite(SIF *data, char *filename)
int sifSetmem(SIF *data, int frameNr)
int sifRead(char *filename, SIF *data)
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)
char studyNr[MAX_STUDYNR_LEN+1]
char studynr[MAX_STUDYNR_LEN+1]