9#include "tpcclibConfig.h"
23static char *info[] = {
24 "Extract specified time frames and planes in ECAT 6.3 or 7.x matrix file",
26 "Note! The program interprets ECAT 7 files as if they had only one plane.",
28 "Usage: @P [Options] file frames planes outputfile ",
34 " @P a2345dy1.img 1-20 4,6,8,10 a2345dy1_part.img ",
36 "See also: lmlist, imgdelfr, imgdelpl, efixplnr, imgbox, imgslim, e63mreg",
38 "Keywords: image, ECAT, tool, cropping, modelling",
57int main(
int argc,
char **argv)
59 int ai, help=0, version=0, verbose=1;
60 int bi, m, fi, pi, ret;
61 int frameNr=0, planeNr=0, delNr=0, blkNr=0;
62 int ecat_version=7, nxtblk;
63 char ecatfile[FILENAME_MAX], outfile[FILENAME_MAX],
78 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
79 ecatfile[0]=outfile[0]=(char)0;
83 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
84 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
86 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
91 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
96 for(; ai<argc; ai++) {
99 if(access(argv[ai], 0) == -1) {
100 fprintf(stderr,
"Error: file '%s' does not exist.\n", argv[ai]);
103 strlcpy(ecatfile, argv[ai], FILENAME_MAX);
continue;
104 }
else if(framelist.
nr==0) {
106 }
else if(planelist.
nr==0) {
108 }
else if(!outfile[0]) {
109 strlcpy(outfile, argv[ai], FILENAME_MAX);
continue;
111 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
118 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n", argv[0]);
124 if(strcasecmp(ecatfile, outfile)==0) {
125 fprintf(stderr,
"Error: same name for input and output file.\n");
132 printf(
"ecatfile := %s\n", ecatfile);
133 printf(
"outputfile := %s\n", outfile);
135 for(fi=0; fi<framelist.
nr; fi++) printf(
" %d", framelist.
list[fi]);
138 for(pi=0; pi<planelist.
nr; pi++) printf(
" %d", planelist.
list[pi]);
146 if(verbose>1) {fprintf(stdout,
"reading %s\n", ecatfile); fflush(stdout);}
149 if((fp=fopen(ecatfile,
"rb")) == NULL) {
150 fprintf(stderr,
"Error: cannot read file %s\n", ecatfile);
158 fprintf(stderr,
"Error %d: cannot read main header.\n", ret);
160 fclose(fp);
return(2);
163 if(strncmp(mainheader7.
magic_number, ECAT7V_MAGICNR, 7)==0) {
169 fprintf(stderr,
"Error %d: cannot read main header.\n", ret);
171 fclose(fp);
return(2);
175 if(verbose>1) printf(
" Format := %d\n", ecat_version);
178 if(ecat_version==7) {
186 fprintf(stderr,
"Error %d: invalid matrix list.\n", ret);
188 fclose(fp);
return(4);
199 if(ecat_version==7) {
203 for(pi=0; pi<planelist.
nr; pi++)
if(planelist.
list[pi]==matval7.
plane) {ret++;
break;}
204 for(fi=0; fi<framelist.
nr; fi++)
if(framelist.
list[fi]==matval7.
frame) {ret++;
break;}
205 if(ret<2) {mlist7.
matdir[m].
status=-1; delNr++;
continue;}
206 if(matval7.
plane>planeNr) planeNr=matval7.
plane;
207 if(matval7.
frame>frameNr) frameNr=matval7.
frame;
216 for(pi=0; pi<planelist.
nr; pi++)
if(planelist.
list[pi]==matval63.
plane) {ret++;
break;}
217 for(fi=0; fi<framelist.
nr; fi++)
if(framelist.
list[fi]==matval63.
frame) {ret++;
break;}
219 if(matval63.
plane>planeNr) planeNr=matval63.
plane;
220 if(matval63.
frame>frameNr) frameNr=matval63.
frame;
227 fprintf(stderr,
"Error: none of the specified matrices were found.\n");
230 fclose(fp);
return(5);
232 if(verbose>0) fprintf(stdout,
" extracting %d matrices\n", ret);
234 printf(
"After checking for matches:\n");
247 if(ecat_version==7) {
251 fprintf(stderr,
"Error: cannot write ECAT file.\n");
253 fclose(fp);
return(11);
261 fprintf(stderr,
"Error: cannot write ECAT matrix.\n");
263 fclose(fp); fclose(fp2); remove(outfile);
return(13);
265 if(verbose>3) printf(
" m=%d blkNr=%d nxtblk=%d\n", m, blkNr, nxtblk);
271 fprintf(stderr,
"Error: cannot find matrix block %d.\n", bi);
273 fclose(fp); fclose(fp2); remove(outfile);
return(8);
276 fprintf(stderr,
"Error: cannot read matrix block %d.\n", bi);
278 fclose(fp); fclose(fp2); remove(outfile);
return(9);
283 fprintf(stderr,
"Error: cannot find matrix block %d for write.\n", nxtblk);
285 fclose(fp); fclose(fp2); remove(outfile);
return(15);
288 fprintf(stderr,
"Error: cannot write matrix block %d.\n", nxtblk);
290 fclose(fp); fclose(fp2); remove(outfile);
return(16);
299 fprintf(stderr,
"Error: cannot write ECAT file.\n");
301 fclose(fp);
return(11);
309 fprintf(stderr,
"Error: cannot write ECAT matrix.\n");
311 fclose(fp); fclose(fp2); remove(outfile);
return(13);
313 if(verbose>3) printf(
" m=%d blkNr=%d nxtblk=%d\n", m, blkNr, nxtblk);
319 fprintf(stderr,
"Error: cannot find matrix block %d.\n", bi);
321 fclose(fp); fclose(fp2); remove(outfile);
return(8);
324 fprintf(stderr,
"Error: cannot read matrix block %d.\n", bi);
326 fclose(fp); fclose(fp2); remove(outfile);
return(9);
331 fprintf(stderr,
"Error: cannot find matrix block %d for write.\n", nxtblk);
333 fclose(fp); fclose(fp2); remove(outfile);
return(15);
336 fprintf(stderr,
"Error: cannot write matrix block %d.\n", nxtblk);
338 fclose(fp); fclose(fp2); remove(outfile);
return(16);
346 fclose(fp); fclose(fp2);
349 if(verbose>0) fprintf(stdout,
"done.\n");
int backupExistingFile(char *filename, char *backup_ext, char *status)
int ecat63Matenter(FILE *fp, int matnum, int blkNr)
int ecat63ReadMatlist(FILE *fp, MATRIXLIST *ml, int verbose)
void ecat63InitMatlist(MATRIXLIST *mlist)
void ecat63EmptyMatlist(MATRIXLIST *mlist)
void ecat63PrintMatlist(MATRIXLIST *ml)
int ecat63CheckMatlist(MATRIXLIST *ml)
void mat_numdoc(int matnum, Matval *matval)
int ecat63ReadMainheader(FILE *fp, ECAT63_mainheader *h)
FILE * ecat63Create(const char *fname, ECAT63_mainheader *h)
void ecat7InitMatlist(ECAT7_MATRIXLIST *mlist)
void ecat7_id_to_val(int matrix_id, ECAT7_Matval *matval)
int ecat7ReadMatlist(FILE *fp, ECAT7_MATRIXLIST *ml, int verbose)
void ecat7EmptyMatlist(ECAT7_MATRIXLIST *mlist)
int ecat7EnterMatrix(FILE *fp, int matrix_id, int block_nr)
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 integerListEmpty(INTEGER_LIST *l)
int integerListInit(INTEGER_LIST *l)
int integerListExpandFromString(const char *s1, const char *s2, INTEGER_LIST *l, const int ifnew)
Header file for libtpcimgio.
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)