10#include "tpcclibConfig.h"
23static char *info[] = {
24 "Convert ECAT 6.3 or 7.x matrix numbers (planes, frames, gates, and/or beds)",
25 "into continuous sequence, for instance, plane numbers 8,10,12 to 1,2,3.",
27 "Usage: @P [Options] ecatfile(s)",
31 " Plane numbers are changed to be continuous and start from 1 (Y, default)",
32 " or not changed (n).",
34 " Frame numbers are changed to be continuous and start from 1 (y)",
35 " or not changed (N, default).",
37 " Gate numbers are changed to be continuous and start from 1 (y)",
38 " or not changed (N, default).",
40 " Bed numbers are changed to be continuous and start from 0 (y)",
41 " or not changed (N, default).",
44 "See also: esplit, lmlist, e7vplavg, e63mreg, img2flat, ecat2ana",
46 "Keywords: ECAT, matrixlist, image, sinogram, plane, frame, tool",
80 int m, blkNr, nxtblk, bi;
84 if(mh==NULL || ml==NULL || fp==NULL || resfile==NULL)
return STATUS_FAULT;
86 fp2=
ecat63Create(resfile, mh);
if(fp2==NULL)
return STATUS_NOWRITEPERM;
92 if(nxtblk<1) {fclose(fp2); remove(resfile);
return STATUS_INVALIDMATLIST;}
94 for(bi=ml->
matdir[m].
strtblk; bi<=ml->matdir[m].endblk; bi++) {
98 fclose(fp2); remove(resfile);
return STATUS_NOMATRIX;}
100 fclose(fp2); remove(resfile);
return STATUS_NOMATRIX;}
104 fclose(fp2); remove(resfile);
return STATUS_INVALIDMATLIST;}
106 fclose(fp2); remove(resfile);
return STATUS_DISKFULL;}
132 int m, blkNr, nxtblk, bi;
136 if(mh==NULL || ml==NULL || fp==NULL || resfile==NULL)
return STATUS_FAULT;
138 fp2=
ecat7Create(resfile, mh);
if(fp2==NULL)
return STATUS_NOWRITEPERM;
144 if(nxtblk<1) {fclose(fp2); remove(resfile);
return STATUS_INVALIDMATLIST;}
146 for(bi=ml->
matdir[m].
strtblk; bi<=ml->matdir[m].endblk; bi++) {
150 fclose(fp2); remove(resfile);
return STATUS_NOMATRIX;}
152 fclose(fp2); remove(resfile);
return STATUS_NOMATRIX;}
156 fclose(fp2); remove(resfile);
return STATUS_INVALIDMATLIST;}
158 fclose(fp2); remove(resfile);
return STATUS_DISKFULL;}
188 char outfile[FILENAME_MAX];
199 if(verbose>1) printf(
" opening %s in binary format\n", ecatfile);
200 if((fp=fopen(ecatfile,
"rb")) == NULL) {
201 fprintf(stderr,
"Error: cannot read file %s\n", ecatfile);
209 if(verbose>2) printf(
" reading main header\n");
214 fprintf(stderr,
"Error: unsupported file format %s\n", ecatfile);
215 fclose(fp);
return(3);
218 if(strncmp(ecat7_main_header.
magic_number, ECAT7V_MAGICNR, 7)==0) {
222 if(ret==0) ecat_format=6;
224 if(verbose>2) printf(
" ecat_format := %d\n", ecat_format);
229 if(verbose>1) printf(
" reading matrix list\n");
235 }
else if(ecat_format==6) {
239 fprintf(stderr,
"Error: unsupported file format %s\n", ecatfile);
240 fclose(fp);
return(3);
243 fprintf(stderr,
"Error %d: invalid matrix list.\n", ret);
244 fclose(fp);
return(4);
250 if(verbose>1) printf(
" fixing matrix list\n");
267 if(verbose>1) printf(
" writing fixed data in temporary file\n");
269 strcpy(outfile, ecatfile); strcat(outfile,
"_efixplnr");
270 if(verbose>3) printf(
" tempfile := %s\n", outfile);
289 if(ret) {fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
return(11);}
291 if(verbose>1) printf(
" removing %s\n", ecatfile);
292 ret=remove(ecatfile);
if(ret) {
293 fprintf(stderr,
"Error: cannot overwrite file %s\n", ecatfile);
297 if(verbose>1) printf(
" renaming %s to %s\n", outfile, ecatfile);
298 ret=rename(outfile, ecatfile);
if(ret) {
299 fprintf(stderr,
"Error: could not rename %s to %s\n", outfile, ecatfile);
312int main(
int argc,
char **argv)
314 int ai, help=0, version=0, verbose=1;
315 int ret, ffi=0, fileNr=0, okNr=0;
316 short int do_planes=1, do_frames=0, do_gates=0, do_beds=0;
318 char ecatfile[FILENAME_MAX];
324 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
327 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
328 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
330 if(strncasecmp(cptr,
"PLANES=", 7)==0) {
332 if(strncasecmp(cptr,
"YES", 1)==0 || strcasecmp(cptr,
"ON")==0) {
333 do_planes=1;
continue;}
334 if(strncasecmp(cptr,
"NO", 1)==0 || strcasecmp(cptr,
"OFF")==0) {
335 do_planes=0;
continue;}
336 }
else if(strncasecmp(cptr,
"FRAMES=", 7)==0) {
338 if(strncasecmp(cptr,
"YES", 1)==0 || strcasecmp(cptr,
"ON")==0) {
339 do_frames=1;
continue;}
340 if(strncasecmp(cptr,
"NO", 1)==0 || strcasecmp(cptr,
"OFF")==0) {
341 do_frames=0;
continue;}
342 }
else if(strncasecmp(cptr,
"GATES=", 6)==0) {
344 if(strncasecmp(cptr,
"YES", 1)==0 || strcasecmp(cptr,
"ON")==0) {
345 do_gates=1;
continue;}
346 if(strncasecmp(cptr,
"NO", 1)==0 || strcasecmp(cptr,
"OFF")==0) {
347 do_gates=0;
continue;}
348 }
else if(strncasecmp(cptr,
"BEDS=", 5)==0) {
350 if(strncasecmp(cptr,
"YES", 1)==0 || strcasecmp(cptr,
"ON")==0) {
351 do_beds=1;
continue;}
352 if(strncasecmp(cptr,
"NO", 1)==0 || strcasecmp(cptr,
"OFF")==0) {
353 do_beds=0;
continue;}
355 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
360 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
365 for(; ai<argc; ai++) {
372 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
378 printf(
"do_planes := %d\n", do_planes);
379 printf(
"do_frames := %d\n", do_frames);
380 printf(
"do_gates := %d\n", do_gates);
381 printf(
"do_beds := %d\n", do_beds);
382 printf(
"fileNr := %d\n", fileNr);
386 if(do_planes==0 && do_frames==0 && do_gates==0 && do_beds==0)
return(0);
389 for(ai=ffi; ai<argc; ai++) {
390 strcpy(ecatfile, argv[ai]);
391 if(verbose>0 && fileNr>1) printf(
"fixing %s\n", ecatfile);
395 if(verbose>1) fprintf(stdout,
" ok.\n");
398 if(verbose>0) fprintf(stdout,
" failed (%d).\n", ret);
402 fprintf(stderr,
"Error: %d out of %d files failed.\n", fileNr-okNr, fileNr);
405 if(verbose>0) fprintf(stdout,
"%d file(s) fixed.\n", okNr);
int ecat63Matenter(FILE *fp, int matnum, int blkNr)
int ecat63ReadMatlist(FILE *fp, MATRIXLIST *ml, int verbose)
void ecat63InitMatlist(MATRIXLIST *mlist)
int ecat63GatherMatlist(MATRIXLIST *ml, short int do_planes, short int do_frames, short int do_gates, short int do_beds)
int ecat63GetNums(MATRIXLIST *ml, short int *num_planes, short int *num_frames, short int *num_gates, short int *num_bed_pos)
void ecat63PrintMatlist(MATRIXLIST *ml)
int ecat63CheckMatlist(MATRIXLIST *ml)
int ecat63ReadMainheader(FILE *fp, ECAT63_mainheader *h)
FILE * ecat63Create(const char *fname, ECAT63_mainheader *h)
void ecat7InitMatlist(ECAT7_MATRIXLIST *mlist)
int ecat7GetNums(ECAT7_MATRIXLIST *ml, ECAT7_mainheader *mh, FILE *fp, short int *num_planes, short int *num_frames, short int *num_gates, short int *num_bed_pos)
int ecat7ReadMatlist(FILE *fp, ECAT7_MATRIXLIST *ml, int verbose)
int ecat7EnterMatrix(FILE *fp, int matrix_id, int block_nr)
int ecat7GatherMatlist(ECAT7_MATRIXLIST *ml, short int do_planes, short int do_frames, short int do_gates, short int do_beds)
void ecat7PrintMatlist(ECAT7_MATRIXLIST *ml)
int ecat7CheckMatlist(ECAT7_MATRIXLIST *ml)
int ecat7ReadMainheader(FILE *fp, ECAT7_mainheader *h)
FILE * ecat7Create(const char *fname, ECAT7_mainheader *h)
int ecat7CopyFile(ECAT7_mainheader *mh, ECAT7_MATRIXLIST *ml, FILE *fp, char *resfile)
int ecatFixMatrixlist(char *ecatfile, int do_planes, int do_frames, int do_gates, int do_beds, int verbose)
int ecat63CopyFile(ECAT63_mainheader *mh, MATRIXLIST *ml, FILE *fp, char *resfile)
char * imgStatus(int status_index)
Header file for libtpcimgio.
Header file for libtpcmisc.
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)