8#include "tpcclibConfig.h"
24static char *info[] = {
25 "Converts PET images from ECAT 6.3 or 7 to NIfTI-1 format.",
26 "Conversion can also be done using ImageConverter (.NET application).",
28 "Image byte order is determined by the computer where the program is run.",
29 "NIfTI image format does not contain information on the frame times.",
30 "Frame times can be retrieved from SIF file, which can be created optionally.",
31 "SIF can also be created later using other software.",
33 "Usage: @P [Options] ecatfile(s)",
37 " Data directory for NIfTI files, if other than the current working path.",
39 " Save the image in dual file format (the header and voxel data in",
40 " separate files *.hdr and *.img); single file format (*.nii)",
43 " SIF is saved with NIfTI; note that existing SIF will be overwritten.",
49 "See also: nii2ecat, nii_lhdr, ecat2ana, eframe, img2flat",
51 "Keywords: image, format conversion, ECAT, NIfTI",
70int main(
int argc,
char **argv)
72 int ai, help=0, version=0, verbose=1;
73 int ret, errorNr=0, fi=0, fileNr=0, ffi=0;
77 char ecatfile[FILENAME_MAX], dbname[FILENAME_MAX], *cptr;
78 char outputdir[FILENAME_MAX], dbdir[FILENAME_MAX];
82 int prev_fileformat=0;
88 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
89 outputdir[0]=ecatfile[0]=dbname[0]=dbdir[0]=(char)0;
92 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
93 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
95 if(strncasecmp(cptr,
"DUAL", 3)==0) {
97 }
else if(strncasecmp(cptr,
"O=", 2)==0) {
99 if(strlen(cptr)>0) strcpy(outputdir, cptr);
else strcpy(outputdir,
".");
101 }
else if(strcasecmp(cptr,
"SIF")==0) {
102 save_sif=1;
continue;
104 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
109 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
114 for(; ai<argc; ai++) {
116 if(access(argv[ai], 0) == -1) {
117 fprintf(stderr,
"Error: file %s does not exist\n", argv[ai]);
126 fprintf(stderr,
"Error: no ECAT files were specified.\n");
132 printf(
"program := %s\n", argv[0]);
133 if(fileformat==
IMG_NIFTI_1D) printf(
"fileformat := 1D\n");
134 else printf(
"fileformat := 1S\n");
135 printf(
"save_sif := %d\n", save_sif);
136 printf(
"outputdir := %s\n", outputdir);
137 printf(
"fileNr := %d\n", fileNr);
145 if(verbose>1) printf(
"processing...\n");
147 for(ai=ffi; ai<argc; ai++) {
149 strlcpy(ecatfile, argv[ai], FILENAME_MAX);
150 if(verbose>0) {fprintf(stdout,
"%s : \n", ecatfile); fflush(stdout);}
158 if(strlen(outputdir)<1) {
161 strlcpy(dbdir, outputdir, FILENAME_MAX);
164 if(dbdir[ret]==
'/' || dbdir[ret]==
'\\') dbdir[ret]=(char)0;
167 if(access(dbdir, 0) == -1) {
169 fprintf(stdout,
" Creating subdirectory %s\n", dbdir);
175 ret=mkdir(dbdir, 00775);
178 fprintf(stderr,
" Error: cannot create subdirectory.\n");
179 fflush(stderr); errorNr++;
continue;
183 cptr=strrchr(ecatfile,
'/');
if(cptr==NULL) cptr=strrchr(ecatfile,
'\\');
184 if(cptr==NULL) cptr=ecatfile;
else cptr++;
186 snprintf(dbname, FILENAME_MAX,
"%s\\%s", dbdir, cptr);
188 snprintf(dbname, FILENAME_MAX,
"%s/%s", dbdir, cptr);
190 cptr=strrchr(dbname,
'.');
if(cptr!=NULL) cptr[0]=(char)0;
191 if(verbose>1) printf(
" NIfTI db_name: '%s'\n", dbname);
196 if(verbose>1) printf(
" checking if file exists\n");
197 char hdrfile[FILENAME_MAX], imgfile[FILENAME_MAX];
200 fprintf(stderr,
" Error: invalid NIfTI name %s\n", dbname);
201 fprintf(stdout,
" No conversion is done for %s\n", ecatfile);
202 fflush(stdout); fflush(stderr);
211 if(access(hdrfile, 0)!=-1) {
214 }
else if(access(imgfile, 0)!=-1) {
216 fprintf(stderr,
" Error: %s would be overwritten.\n", imgfile);
217 fprintf(stdout,
" No conversion is done for %s\n", ecatfile);
218 fflush(stdout); fflush(stderr);
228 if(verbose>1) fprintf(stdout,
" searching min and max in %s\n", ecatfile);
231 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
232 errorNr++; fflush(stderr);
continue;
235 printf(
" global_min := %g\n global_max := %g\n", fmin, fmax);
242 if(verbose>1) printf(
" reading header information\n");
245 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
246 errorNr++; fflush(stderr);
continue;
250 fprintf(stderr,
"Error: out of memory.\n");
251 errorNr++; fflush(stderr);
continue;
261 fprintf(stdout,
" processing %s\n", ecatfile); fflush(stdout);}
263 while((ret=
imgReadFrame(ecatfile, fi+1, &img, 0)) == 0) {
264 if(verbose>1) {printf(
" frame %d\n", fi+1); fflush(stdout);}
272 if(ret)
niftiRemove(dbname, fileformat, verbose-4);
275 if(verbose>2) fprintf(stderr,
"Error: %s.\n",
imgStatus(ret));
278 if(verbose>2) {printf(
" frame %d written.\n", fi+1); fflush(stdout);}
295 printf(
" about to read frame %d\n", fi+1); fflush(stdout);}
298 if(ret==STATUS_NOMATRIX) {
299 fprintf(stdout,
" %d frame(s) processed.\n", fi); fflush(stdout);
302 if(ret!=STATUS_OK && ret!=STATUS_NOMATRIX) {
303 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
305 errorNr++; fflush(stderr);
continue;
311 char temp[FILENAME_MAX+10];
312 sprintf(temp,
"%s.sif", dbname);
315 fprintf(stderr,
"Error: cannot write %s\n", temp);
316 errorNr++; fflush(stderr);
continue;
323 if(errorNr>0)
return(errorNr+10);
char * imgStatus(int status_index)
void imgEmpty(IMG *image)
int imgWriteNiftiFrame(const char *dbname, int frame_to_write, IMG *img, int frame_index, float fmin, float fmax, int verbose)
char * imgIsotope(IMG *img)
int imgReadFrame(const char *fname, int frame_to_read, IMG *img, int frame_index)
int imgReadHeader(const char *fname, IMG *img, int format)
int imgReadMinMax(const char *fname, float *fmin, float *fmax)
Header file for libtpcimgio.
int sifWrite(SIF *data, char *filename)
int niftiCreateFNames(const char *filename, char *hdrfile, char *imgfile, char *siffile, int fileformat)
int sifSetmem(SIF *data, int frameNr)
int niftiRemove(const char *dbname, int fileformat, int verbose)
Header file for libtpcimgp.
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)
char studyNr[MAX_STUDYNR_LEN+1]
char studynr[MAX_STUDYNR_LEN+1]