9#include "tpcclibConfig.h"
23static char *info[] = {
24 "Converting PET image or sinogram in ECAT 6.3 format to ECAT 7 format.",
26 "Usage: @P [Options] ECAT6_file [ECAT7_file]",
30 " Image calibration unit is changed from kBq/mL to Bq/mL (B, default)",
31 " or MBq/mL (M), or the original unit is not changed (o).",
35 "1. Convert one image, let program give name to the ECAT7 file",
36 " e63to7 is02345dy1.img",
37 "2. Convert one image, give a specific name to the ECAT7 file",
38 " e63to7 is02345dy1.img is2345.v",
39 "3. Convert all images in current working directory in Windows command shell",
40 " for %g in (*.img) do e63to7 %g",
42 "See also: e7to63, lmlist, ecat2ana, img2flat, imgadd, esplit",
44 "Keywords: image, ECAT, format conversion",
63int main(
int argc,
char **argv)
65 int ai, help=0, version=0, verbose=1;
66 int ret, toMBq=0, toBq=1;
67 char infile[FILENAME_MAX], outfile[FILENAME_MAX], *cptr;
68 FILE *fp1=NULL, *fp2=NULL;
82 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
83 infile[0]=outfile[0]=(char)0;
85 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
86 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
89 if(strncasecmp(cptr,
"C=", 2)==0) {
91 if(*cptr==
'o' || *cptr==
'O') {toMBq=toBq=0;
continue;}
92 else if(*cptr==
'm' || *cptr==
'M') {toMBq=1; toBq=0;
continue;}
93 else if(*cptr==
'b' || *cptr==
'B') {toBq=1; toMBq=0;
continue;}
95 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
100 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
105 for(; ai<argc; ai++) {
107 strcpy(infile, argv[ai]);
continue;
108 }
else if(!outfile[0]) {
109 strcpy(outfile, argv[ai]);
continue;
111 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
117 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n",
124 printf(
"infile := %s\n", infile);
125 printf(
"outfile := %s\n", outfile);
126 printf(
"toMBq := %d\n", toMBq);
127 printf(
"toBq := %d\n", toBq);
131 if(verbose==1) printf(
"reading %s\n", infile);
136 if(verbose>1) printf(
"opening %s\n", infile);
137 if((fp1=fopen(infile,
"rb")) == NULL) {
138 fprintf(stderr,
"Error: cannot open file %s\n", infile);
145 if(verbose>1) printf(
"reading main header\n");
147 fprintf(stderr,
"Error (%d): cannot read main header.\n", ret);
148 fclose(fp1);
return(3);
155 "Error: currently only image and scan files can be processed.\n");
156 fclose(fp1);
return(3);
161 strcpy(outfile, infile); cptr=strrchr(outfile,
'.');
162 if(cptr!=NULL) cptr++;
165 strcat(outfile,
"s");
else strcat(outfile,
"v");
167 if(strcasecmp(infile, outfile)==0) {
168 fprintf(stderr,
"Error: input and output files have the same name!\n");
169 fclose(fp1);
return(1);
175 if(verbose>1) printf(
"reading matrix list\n");
179 fprintf(stderr,
"Error (%d): cannot read matrix list.\n", ret);
180 fclose(fp1);
return(4);
183 fprintf(stderr,
"Error: matrix list is empty.\n");
184 fclose(fp1);
return(4);
187 fprintf(stderr,
"Error: check the matrix list.\n");
194 if(delNr>0 && verbose>=0)
195 printf(
" %d entries in matrix list will not be used.\n", delNr);
200 int planeNr, frameNr;
202 if(ret==STATUS_MISSINGMATRIX) {
203 fprintf(stderr,
"Error: missing matrix/matrices.\n");
214 if(verbose>1) printf(
"creating mainheader\n");
218 fprintf(stderr,
"Error: matrix filetype %d is not supported.\n",
224 if(verbose>1) printf(
"creating file %s\n", outfile);
227 fprintf(stderr,
"Error: cannot create %s.\n", outfile);
236 printf(
"processing %d matrices\n", mlist1.
matrixNr);
242 int mi=0, mj=0, planeNr, pxlNr=0, matrixId;
243 float *fdata=NULL, *voldata=NULL, *volptr, *fptr, f;
250 if(matval1b.
frame==matval1.
frame) planeNr++;
else break;
252 if(verbose>2) printf(
"Frame %d: planeNr=%d\n", matval1.
frame, planeNr);
254 for(
int pi=0; pi<planeNr; pi++) {
268 for(di=0, fptr=fdata; di<pxlNr; di++, fptr++) *fptr *= f;
279 for(di=0, fptr=fdata; di<pxlNr; di++, fptr++) *fptr *= 0.001;
290 for(di=0, fptr=fdata; di<pxlNr; di++, fptr++) *fptr *= 1000.;
299 fprintf(stderr,
"Error in reading matrix: %s\n",
ecat63errmsg);
301 remove(outfile);
return(13);
305 voldata=(
float*)malloc(pxlNr*planeNr*
sizeof(
float));
307 fprintf(stderr,
"Error: out of memory.\n");
309 remove(outfile);
return(15);
313 memcpy(voldata+(pi*pxlNr), fdata, pxlNr*4);
333 fprintf(stderr,
"Error: cannot convert subheader.\n");
335 free(voldata); remove(outfile);
return(24);
349 fprintf(stderr,
"Error in writing matrix: %s\n",
ecat7errmsg);
351 remove(outfile);
return(23);
353 if(verbose>=0) fprintf(stdout,
"written %d planes on frame %d\n",
354 planeNr, matval1.
frame);
363 if(verbose>1) printf(
"adding information into main headerin %s\n", outfile);
371 cptr=strrchr(infile,
'/');
if(cptr==NULL) cptr=strrchr(infile,
'\\');
372 if(cptr==NULL) cptr=infile;
else cptr++;
379 fprintf(stderr,
"Error in writing main header (%d).\n", ret);
381 remove(outfile);
return(36);
387 fclose(fp1); fclose(fp2);
388 if(verbose>=0) fprintf(stdout,
"%s written.\n", outfile);
int ecat63ReadMatlist(FILE *fp, MATRIXLIST *ml, int verbose)
int ecat63GetPlaneAndFrameNr(MATRIXLIST *mlist, ECAT63_mainheader *h, int *plane_nr, int *frame_nr)
void ecat63InitMatlist(MATRIXLIST *mlist)
void ecat63EmptyMatlist(MATRIXLIST *mlist)
int ecat63DeleteLateFrames(MATRIXLIST *ml, int frame_nr)
void ecat63PrintMatlist(MATRIXLIST *ml)
int ecat63CheckMatlist(MATRIXLIST *ml)
void mat_numdoc(int matnum, Matval *matval)
void ecat63SortMatlistByFrame(MATRIXLIST *ml)
void ecat63PrintMainheader(ECAT63_mainheader *h, FILE *fp)
int ecat63ReadImageMatrix(FILE *fp, int first_block, int last_block, ECAT63_imageheader *h, float **fdata)
int ecat63ReadScanMatrix(FILE *fp, int first_block, int last_block, ECAT63_scanheader *h, float **fdata)
int ecat63ReadMainheader(FILE *fp, ECAT63_mainheader *h)
int ecat7_val_to_id(int frame, int plane, int gate, int data, int bed)
int ecat7WriteImageMatrix(FILE *fp, int matrix_id, ECAT7_imageheader *h, float *fdata)
int ecat7WriteScanMatrix(FILE *fp, int matrix_id, ECAT7_scanheader *h, float *fdata)
FILE * ecat7Create(const char *fname, ECAT7_mainheader *h)
int ecat7WriteMainheader(FILE *fp, ECAT7_mainheader *h)
int ecatCopy63to7imageheader(ECAT63_imageheader *h1, ECAT7_imageheader *h2)
int ecatCopy63to7mainheader(ECAT63_mainheader *h1, ECAT7_mainheader *h2)
int ecatCopy63to7scanheader(ECAT63_scanheader *h1, ECAT7_scanheader *h2)
Header file for ehdrconv.c.
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)
short int calibration_units
char original_file_name[32]