9#include "tpcclibConfig.h"
23static char *info[] = {
24 "Converting PET sinogram or image volume file in ECAT 7.x format to ECAT 6.3",
27 "Usage: @P [Options] ECAT7_file [ECAT6_file]",
31 " Image calibration unit is changed from Bq/mL or MBq/mL to",
32 " kBq/mL (k, default), or the original unit is preserved (o).",
36 "1. Convert one image, let program give name to ECAT6 file",
38 "2. Convert one image, give a specific name to the ECAT6 file",
39 " e7to63 is02345.v is2345dy1.img",
40 "3. Convert all images in current working directory in Windows command shell",
41 " for %g in (*.v) do e7to63 %g",
43 "See also: e63to7, lmlist, ecat2ana, img2flat, imgadd, esplit",
45 "Keywords: image, ECAT, format conversion",
64int main(
int argc,
char **argv)
66 int ai, help=0, version=0, verbose=1;
68 char infile[FILENAME_MAX], outfile[FILENAME_MAX], *cptr;
69 FILE *fp1=NULL, *fp2=NULL;
84 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
85 infile[0]=outfile[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;
92 if(strncasecmp(cptr,
"C=", 2)==0) {
94 if(*cptr==
'o' || *cptr==
'O') {tokBq=0;
continue;}
95 else if(*cptr==
'k' || *cptr==
'K') {tokBq=1;
continue;}
97 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
102 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
107 for(; ai<argc; ai++) {
109 strcpy(infile, argv[ai]);
continue;
110 }
else if(!outfile[0]) {
111 strcpy(outfile, argv[ai]);
continue;
113 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
119 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n",
126 printf(
"infile := %s\n", infile);
127 printf(
"outfile := %s\n", outfile);
128 printf(
"tokBq := %d\n", tokBq);
132 if(verbose==1) printf(
"reading %s\n", infile);
137 if(verbose>1) printf(
"opening %s\n", infile);
138 if((fp1=fopen(infile,
"rb")) == NULL) {
139 fprintf(stderr,
"Error: cannot open file %s\n", infile);
146 if(verbose>1) printf(
"reading mainheader in %s\n", infile);
148 fprintf(stderr,
"Error (%d): cannot read main header.\n", ret);
149 fclose(fp1);
return(3);
154 if(strncmp(main_header1.
magic_number, ECAT7V_MAGICNR, 7)!=0) {
155 fprintf(stderr,
"Error: %s is not an ECAT 7.x file.\n", infile);
156 fclose(fp1);
return(3);
167 fprintf(stderr,
"Error: currently images and sinograms can be processed.\n");
168 fclose(fp1);
return(3);
172 strcpy(outfile, infile); cptr=strrchr(outfile,
'.');
173 if(cptr!=NULL) cptr++;
179 strcat(outfile,
"scn");
else strcat(outfile,
"img");
181 if(strcmp(infile, outfile)==0) {
182 fprintf(stderr,
"Error: input and output files have the same name!\n");
183 fclose(fp1);
return(1);
189 if(verbose>1) printf(
"reading matrix list\n");
192 fprintf(stderr,
"Error (%d): cannot read matrix list.\n", ret);
193 fclose(fp1);
return(4);
196 fprintf(stderr,
"Error: matrix list is empty.\n");
205 if(verbose>1) printf(
"creating mainheader\n");
209 fprintf(stderr,
"Error: matrix filetype %d is not yet supported.\n",
218 fprintf(stderr,
"Error: cannot create %s.\n", outfile);
226 if(verbose>0 && mlist1.
matrixNr>1) {
227 fprintf(stdout,
"Converting %d matrices", mlist1.
matrixNr);
230 int mi, di, pxlNr=0, planeNr=0, max_frame=0;
232 for(mi=0; mi<mlist1.
matrixNr; mi++) {
233 if(verbose>2) printf(
"\nmatrix %d\n", mi+1);
237 if(matval1.
frame>max_frame) max_frame=matval1.
frame;
249 if(strcasecmp(main_header1.
data_units,
"MBq/cc")==0) {
252 for(di=0, fptr=fdata; di<pxlNr; di++, fptr++) *fptr *= 1000.0;
253 }
else if(strcasecmp(main_header1.
data_units,
"Bq/cc")==0) {
256 for(di=0, fptr=fdata; di<pxlNr*planeNr; di++, fptr++) *fptr *= 0.001;
269 if(strcasecmp(main_header1.
data_units,
"MBq/cc")==0) {
272 for(di=0, fptr=fdata; di<pxlNr; di++, fptr++) *fptr *= 1000.0;
273 }
else if(strcasecmp(main_header1.
data_units,
"Bq/cc")==0) {
276 for(di=0, fptr=fdata; di<pxlNr*planeNr; di++, fptr++) *fptr *= 0.001;
300 for(i=planeNr=0; i<64; i++) planeNr+=scan3d_header1.
num_z_elements[i];
303 fprintf(stderr,
"\nError: matrix filetype %d is not yet supported.\n",
308 if(ret>0) fprintf(stderr,
"\nError: cannot read subheader %d.\n", mi+1);
310 remove(outfile);
return(22);
345 fprintf(stderr,
"\nError: cannot copy subheader.\n");
347 remove(outfile);
return(23);
350 for(
int i=0; i<planeNr; i++) {
356 fptr=fdata+(i*pxlNr);
373 fprintf(stderr,
"\nError in writing matrix: %s\n",
ecat63errmsg);
375 remove(outfile);
return(24);
380 if(mlist1.
matrixNr>1 && verbose>=0) {
381 fprintf(stdout,
"."); fflush(stdout);}
383 if(mlist1.
matrixNr>1 && verbose>=0) {
384 fprintf(stdout,
"done\n"); fflush(stdout);}
389 if(verbose>1) printf(
"rewriting main header in %s\n", outfile);
393 fprintf(stderr,
"Warning: main header frame nr was changed %d -> %d.\n",
400 fprintf(stderr,
"Error (%d): cannot write main header.\n", ret);
402 remove(outfile);
return(25);
409 fclose(fp1); fclose(fp2);
410 if(verbose>=0) fprintf(stdout,
"%s written.\n", outfile);
int mat_numcod(int frame, int plane, int gate, int data, int bed)
int ecat63WriteScanMatrix(FILE *fp, int matnum, ECAT63_scanheader *h, float *fdata)
int ecat63WriteImageMatrix(FILE *fp, int matnum, ECAT63_imageheader *h, float *fdata)
FILE * ecat63Create(const char *fname, ECAT63_mainheader *h)
int ecat63WriteMainheader(FILE *fp, 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)
void ecat7PrintMatlist(ECAT7_MATRIXLIST *ml)
void ecat7PrintImageheader(ECAT7_imageheader *h, FILE *fp)
void ecat7Print2DScanheader(ECAT7_2Dscanheader *h, FILE *fp)
void ecat7PrintMainheader(ECAT7_mainheader *h, FILE *fp)
void ecat7PrintScanheader(ECAT7_scanheader *h, FILE *fp)
int ecat7Read2DScanMatrix(FILE *fp, int first_block, int last_block, ECAT7_2Dscanheader *h, float **fdata)
int ecat7ReadMainheader(FILE *fp, ECAT7_mainheader *h)
int ecat7ReadImageMatrix(FILE *fp, int first_block, int last_block, ECAT7_imageheader *h, float **fdata)
int ecat7ReadScanMatrix(FILE *fp, int first_block, int last_block, ECAT7_scanheader *h, float **fdata)
int ecatCopy7_2D_to63scanheader(ECAT7_2Dscanheader *h1, ECAT63_scanheader *h2)
int ecatCopy7to63scanheader(ECAT7_scanheader *h1, ECAT63_scanheader *h2)
int ecatCopy7to63imageheader(ECAT7_imageheader *h1, ECAT63_imageheader *h2)
int ecatCopy7to63mainheader(ECAT7_mainheader *h1, ECAT63_mainheader *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
short int calibration_units