8#include "tpcclibConfig.h"
27static char *info[] = {
28 "Converts PET images from ECAT 6.3 or 7 to NIfTI-1 format.",
29 "Conversion can also be done using ImageConverter (.NET application).",
31 "Image byte order is determined by the computer where the program is run.",
32 "NIfTI image format does not contain information on the frame times.",
33 "Frame times can be retrieved from SIF file, which can be created optionally.",
34 "SIF can also be created later using other software.",
36 "Usage: @P [Options] ecatfile(s)",
40 " Data directory for NIfTI files, if other than the current working path.",
42 " Save the image in dual file format (the header and voxel data in",
43 " separate files *.hdr and *.img); single file format (*.nii)",
46 " SIF is saved with NIfTI; note that existing SIF will be overwritten.",
52 "See also: nii2ecat, nii_lhdr, ecat2ana, eframe, img2flat",
54 "Keywords: image, format conversion, ECAT, NIfTI",
73int main(
int argc,
char **argv)
75 int ai, help=0, version=0, verbose=1;
76 int ret, errorNr=0, fi=0, fileNr=0, ffi=0;
80 char ecatfile[FILENAME_MAX], dbname[FILENAME_MAX], *cptr;
81 char outputdir[FILENAME_MAX], dbdir[FILENAME_MAX];
85 int prev_fileformat=0;
91 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
92 outputdir[0]=ecatfile[0]=dbname[0]=dbdir[0]=(char)0;
95 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
96 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
98 if(strncasecmp(cptr,
"DUAL", 3)==0) {
100 }
else if(strncasecmp(cptr,
"O=", 2)==0) {
102 if(strlen(cptr)>0) strcpy(outputdir, cptr);
else strcpy(outputdir,
".");
104 }
else if(strcasecmp(cptr,
"SIF")==0) {
105 save_sif=1;
continue;
107 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
112 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
117 for(; ai<argc; ai++) {
119 if(access(argv[ai], 0) == -1) {
120 fprintf(stderr,
"Error: file %s does not exist\n", argv[ai]);
129 fprintf(stderr,
"Error: no ECAT files were specified.\n");
135 printf(
"program := %s\n", argv[0]);
136 if(fileformat==
IMG_NIFTI_1D) printf(
"fileformat := 1D\n");
137 else printf(
"fileformat := 1S\n");
138 printf(
"save_sif := %d\n", save_sif);
139 printf(
"outputdir := %s\n", outputdir);
140 printf(
"fileNr := %d\n", fileNr);
148 if(verbose>1) printf(
"processing...\n");
150 for(ai=ffi; ai<argc; ai++) {
152 strlcpy(ecatfile, argv[ai], FILENAME_MAX);
153 if(verbose>0) {fprintf(stdout,
"%s : \n", ecatfile); fflush(stdout);}
161 if(strlen(outputdir)<1) {
164 strlcpy(dbdir, outputdir, FILENAME_MAX);
167 if(dbdir[ret]==
'/' || dbdir[ret]==
'\\') dbdir[ret]=(char)0;
170 if(access(dbdir, 0) == -1) {
172 fprintf(stdout,
" Creating subdirectory %s\n", dbdir);
176 ret=mkdir(dbdir, 00775);
177#elif defined HAVE_MKDIR1
179#elif defined HAVE__MKDIR
185 fprintf(stderr,
" Error: cannot create subdirectory.\n");
186 fflush(stderr); errorNr++;
continue;
190 cptr=strrchr(ecatfile,
'/');
if(cptr==NULL) cptr=strrchr(ecatfile,
'\\');
191 if(cptr==NULL) cptr=ecatfile;
else cptr++;
193 snprintf(dbname, FILENAME_MAX,
"%s\\%s", dbdir, cptr);
195 snprintf(dbname, FILENAME_MAX,
"%s/%s", dbdir, cptr);
197 cptr=strrchr(dbname,
'.');
if(cptr!=NULL) cptr[0]=(char)0;
198 if(verbose>1) printf(
" NIfTI db_name: '%s'\n", dbname);
203 if(verbose>1) printf(
" checking if file exists\n");
204 char hdrfile[FILENAME_MAX], imgfile[FILENAME_MAX];
207 fprintf(stderr,
" Error: invalid NIfTI name %s\n", dbname);
208 fprintf(stdout,
" No conversion is done for %s\n", ecatfile);
209 fflush(stdout); fflush(stderr);
218 if(access(hdrfile, 0)!=-1) {
221 }
else if(access(imgfile, 0)!=-1) {
223 fprintf(stderr,
" Error: %s would be overwritten.\n", imgfile);
224 fprintf(stdout,
" No conversion is done for %s\n", ecatfile);
225 fflush(stdout); fflush(stderr);
235 if(verbose>1) fprintf(stdout,
" searching min and max in %s\n", ecatfile);
238 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
239 errorNr++; fflush(stderr);
continue;
242 printf(
" global_min := %g\n global_max := %g\n", fmin, fmax);
249 if(verbose>1) printf(
" reading header information\n");
252 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
253 errorNr++; fflush(stderr);
continue;
257 fprintf(stderr,
"Error: out of memory.\n");
258 errorNr++; fflush(stderr);
continue;
268 fprintf(stdout,
" processing %s\n", ecatfile); fflush(stdout);}
270 while((ret=
imgReadFrame(ecatfile, fi+1, &img, 0)) == 0) {
271 if(verbose>1) {printf(
" frame %d\n", fi+1); fflush(stdout);}
279 if(ret)
niftiRemove(dbname, fileformat, verbose-4);
282 if(verbose>2) fprintf(stderr,
"Error: %s.\n",
imgStatus(ret));
285 if(verbose>2) {printf(
" frame %d written.\n", fi+1); fflush(stdout);}
302 printf(
" about to read frame %d\n", fi+1); fflush(stdout);}
305 if(ret==STATUS_NOMATRIX) {
306 fprintf(stdout,
" %d frame(s) processed.\n", fi); fflush(stdout);
309 if(ret!=STATUS_OK && ret!=STATUS_NOMATRIX) {
310 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
312 errorNr++; fflush(stderr);
continue;
318 char temp[FILENAME_MAX+10];
319 sprintf(temp,
"%s.sif", dbname);
322 fprintf(stderr,
"Error: cannot write %s\n", temp);
323 errorNr++; fflush(stderr);
continue;
330 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]