8#include "tpcclibConfig.h"
22static char *info[] = {
23 "Regularize ECAT 6.3 image with missing matrices by adding planes/frames",
24 "with zero pixel values.",
26 "Usage: @P [Options] imgfile outputfile ",
32 " @P a2345dy1.img a2345dy1_fixed.img ",
34 "See also: esplit, imgdelfr, lmlist, eframe, efixplnr, e63mdel",
36 "Keywords: ECAT, matrixlist, header, tool",
55int main(
int argc,
char **argv)
57 int ai, help=0, version=0, verbose=1;
59 char ecatfile[FILENAME_MAX], outfile[FILENAME_MAX];
67 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
68 ecatfile[0]=outfile[0]=(char)0;
71 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
74 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
79 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
84 if(ai<argc) {
strlcpy(ecatfile, argv[ai++], FILENAME_MAX);}
85 if(ai<argc) {
strlcpy(outfile, argv[ai++], FILENAME_MAX);}
87 fprintf(stderr,
"Error: extra argument '%s'.\n", argv[ai]);
93 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n", argv[0]);
98 if(strcasecmp(ecatfile, outfile)==0) {
99 fprintf(stderr,
"Error: same name for input and output file.\n");
105 printf(
"ecatfile := %s\n", ecatfile);
106 printf(
"outputfile := %s\n", outfile);
114 if(verbose>1) {fprintf(stdout,
"reading %s\n", ecatfile); fflush(stdout);}
118 if((fp=fopen(ecatfile,
"rb")) == NULL) {
119 fprintf(stderr,
"Error: cannot read file %s\n", ecatfile);
124 if(verbose>2) {fprintf(stdout,
"reading main header\n"); fflush(stdout);}
127 fprintf(stderr,
"Error: cannot read main header.\n");
128 if(verbose>1) printf(
" ret := %d\n", ret);
129 fclose(fp);
return(2);
136 fprintf(stderr,
"Error: cannot read matrix list.\n");
137 if(verbose>1) printf(
" ret := %d\n", ret);
138 fclose(fp);
return(2);
141 fprintf(stderr,
"Error: matrix list is empty.\n");
142 fclose(fp);
return(2);
144 if(verbose>1) {printf(
"matrixNr := %d\n", mlist63.
matrixNr); fflush(stdout);}
147 fprintf(stderr,
"Warning: matrix list fails testing (%d).\n", ret); fflush(stderr);
155 if(verbose>1 && del_nr>0)
156 printf(
" %d entries in matrix list will not be used.\n", del_nr);
164 fprintf(stderr,
"Error: cannot allocate memory for matrix values.\n");
172 for(
int i=0; i<mlist63.
matrixNr; i++) {
178 printf(
" cannot read subheader for matrix %d: %s\n", mlist63.
matdir[i].
matnum, errmsg);
187 if(verbose>1) {printf(
"validMatrixNr := %d\n", validMatrixNr); fflush(stdout);}
188 if(validMatrixNr<4) {
189 if(validMatrixNr==0) fprintf(stderr,
"Error: no valid content in any matrix.\n");
190 else fprintf(stderr,
"Error: valid content in only %d matrices; not processed.\n", validMatrixNr);
196 int gate, bed, matdata;
198 if(verbose>2) {fprintf(stdout,
"checking for gates and bed positions\n"); fflush(stdout);}
200 for(
int i=1; i<validMatrixNr; i++)
201 if(matval[i].gate!=gate) {
202 fprintf(stderr,
"Error: more than one gate.\n");
207 for(
int i=1; i<validMatrixNr; i++)
208 if(matval[i].bed!=bed) {
209 fprintf(stderr,
"Error: more than one bed position.\n");
213 matdata=matval[0].
data;
214 for(
int i=1; i<validMatrixNr; i++)
215 if(matval[i].data!=matdata) {
216 fprintf(stderr,
"Error: more than one data.\n");
224 for(
int i=0; i<validMatrixNr; i++)
integerListAdd(&planes, matval[i].plane, 1);
226 if(verbose>3 && planes.
nr>0) {
227 printf(
"planes: %d", planes.
list[0]);
228 for(
int i=1; i<planes.
nr; i++) printf(
", %d", planes.
list[i]);
229 printf(
"\n"); fflush(stdout);
232 fprintf(stderr,
"Error: invalid plane numbers.\n");
238 if(verbose>2) {fprintf(stdout,
"listing each plane for its frames\n"); fflush(stdout);}
241 fprintf(stderr,
"Error: cannot allocate memory for frame numbers.\n");
246 for(
int pi=0; pi<planes.
nr; pi++) {
247 for(
int mi=0; mi<validMatrixNr; mi++) {
248 if(matval[mi].plane!=planes.
list[pi])
continue;
254 printf(
"\nPlane\tFrames\n");
255 for(
int pi=0; pi<planes.
nr; pi++) {
256 printf(
"%d:", planes.
list[pi]);
257 for(
int fi=0; fi<plframes[pi].
nr; fi++)
258 printf(
" %d", plframes[pi].list[fi]);
265 int maxfrnr=0, fullestplanei=0;
269 for(
int pi=0; pi<planes.
nr; pi++) {
270 fnr+=plframes[pi].
nr;
271 if(plframes[pi].nr>maxfrnr) {maxfrnr=plframes[pi].
nr; fullestplanei=pi;}
274 if(verbose>2) printf(
"%d frames in each plane on average.\n", fnr);
275 for(
int pi=0; pi<planes.
nr; pi++)
276 if(plframes[pi].nr>2*fnr/3)
279 printf(
"keeping planes:");
280 for(
int i=0; i<keepplanes.
nr; i++) printf(
" %d", keepplanes.
list[i]);
281 printf(
"\n"); fflush(stdout);
288 for(
int fi=0; fi<plframes[fullestplanei].
nr; fi++) {
289 f=plframes[fullestplanei].
list[fi];
292 for(
int pi=0; pi<planes.
nr; pi++) {
293 for(
int fj=0; fj<plframes[pi].
nr; fj++)
294 if(f==plframes[pi].list[fi]) {fnr++;
break;}
296 if(fnr>3*planes.
nr/4)
300 printf(
"keeping frames:");
301 for(
int i=0; i<keepframes.
nr; i++) printf(
" %d", keepframes.
list[i]);
302 printf(
"\n"); fflush(stdout);
315 if(verbose>1) {fprintf(stdout,
"writing %s\n", outfile); fflush(stdout);}
319 for(i=0; i<keepplanes.
nr; i++)
if(keepplanes.
list[i]>m) m=keepplanes.
list[i];
322 for(i=0; i<keepframes.
nr; i++)
if(keepframes.
list[i]>m) m=keepframes.
list[i];
329 fprintf(stderr,
"Error: cannot write ECAT file.\n");
335 for(
int fi=0; fi<keepframes.
nr; fi++) {
336 int frame=keepframes.
list[fi];
337 for(
int pi=0; pi<keepplanes.
nr; pi++) {
338 int plane=keepplanes.
list[pi];
340 int matnum=
mat_numcod(frame, plane, gate, matdata, bed);
341 if(verbose>4) printf(
"frame %d plane %d -> matnum %d\n", frame, plane, matnum);
344 for(
int mi=0; mi<mlist63.
matrixNr; mi++)
351 if(verbose>5) printf(
"copying matrix\n");
359 if(verbose>5) printf(
"creating zero contents\n");
362 int fmatnum=0, pmatnum=0;
363 for(
int mi=0; mi<validMatrixNr; mi++)
364 if(matval[mi].plane!=plane) {
365 pmatnum=
mat_numcod(matval[mi].frame, plane, gate, matdata, bed);
break;}
366 for(
int mi=0; mi<validMatrixNr; mi++)
367 if(matval[mi].frame!=frame) {
368 fmatnum=
mat_numcod(frame, matval[mi].plane, gate, matdata, bed);
break;}
371 for(
int mi=0; mi<mlist63.
matrixNr; mi++)
372 if(mlist63.
matdir[mi].
matstat==1 && matnum==fmatnum) {fmi=mi;
break;}
373 for(
int mi=0; mi<mlist63.
matrixNr; mi++)
374 if(mlist63.
matdir[mi].
matstat==1 && matnum==pmatnum) {pmi=mi;
break;}
385 float *fdata=malloc(pxlNr*
sizeof(
float));
386 for(
int i=0; i<pxlNr; i++) fdata[i]=0.0;
387 if(verbose>5) printf(
"writing matrix\n");
391 fprintf(stderr,
"Error: cannot write image matrix.\n");
404 fclose(fp); fclose(fp2);
408 if(verbose>0) fprintf(stdout,
"done.\n");
int ecat63ReadMatlist(FILE *fp, MATRIXLIST *ml, int verbose)
void ecat63InitMatlist(MATRIXLIST *mlist)
void ecat63EmptyMatlist(MATRIXLIST *mlist)
int mat_numcod(int frame, int plane, int gate, int data, int bed)
int ecat63DeleteLateFrames(MATRIXLIST *ml, int frame_nr)
void ecat63PrintMatlist(MATRIXLIST *ml)
int ecat63CheckMatlist(MATRIXLIST *ml)
void mat_numdoc(int matnum, Matval *matval)
int ecat63ReadImageMatrix(FILE *fp, int first_block, int last_block, ECAT63_imageheader *h, float **fdata)
int ecat63ReadImageheader(FILE *fp, int blk, ECAT63_imageheader *h, int verbose, char *errmsg)
int ecat63ReadMainheader(FILE *fp, ECAT63_mainheader *h)
int ecat63WriteImageMatrix(FILE *fp, int matnum, ECAT63_imageheader *h, float *fdata)
FILE * ecat63Create(const char *fname, ECAT63_mainheader *h)
int integerListEmpty(INTEGER_LIST *l)
int integerListInit(INTEGER_LIST *l)
int integerListSort(INTEGER_LIST *l)
int integerListAdd(INTEGER_LIST *l, int v, 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)