8#include "tpcclibConfig.h"
30 char *dbname,
char *ecatfile,
int scanner_type,
float zoom,
int verbose);
34static char *info[] = {
35 "Conversion of NIfTI-1 PET image database(s) to ECAT 7 image volume",
37 "Conversion can also be done using ImageConverter (.NET application).",
39 "Usage: @P [Options] database",
43 " Data directory for ECAT images; by default current working directory.",
46 "NIfTI database can be specified as a path, containing one or more databases,",
47 "or filename of one NIfTI database without extension.",
48 "NIfTI file(s) must be named as *.nii (single format) or *.hdr and *.img",
50 "Program reads time frame information from SIF, if SIF is located in",
51 "the database directory and if file is named with *.sif extension.",
54 "Conversion of all NIfTI images in directory S:\\temp\\neuro to ECAT 7",
55 "images in directory C:\\data in PC/Windows:",
58 " @P s:\\temp\\neuro",
60 "See also: ecat2nii, eframe, sif2ecat, e7emhdr, e7evhdr, flat2img, ana2ecat",
62 "Keywords: image, format conversion, ECAT, NIfTI",
81int main(
int argc,
char **argv)
83 int ai, help=0, version=0, verbose=1;
84 int ret, n, errorNr=0, niiNr=0;
87 char ecatdir[FILENAME_MAX], dbdir[FILENAME_MAX], ecatfile[FILENAME_MAX];
88 char temp[FILENAME_MAX], dbname[FILENAME_MAX], *cptr;
96 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
97 ecatdir[0]=dbdir[0]=(char)0;
99 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
100 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
102 if(strncasecmp(cptr,
"ZOOM=", 5)==0) {
103 cptr+=5; zoom=
atof_dpi(cptr);
if(zoom>0.0)
continue;
104 }
else if(strncasecmp(cptr,
"SCANNER=", 8)==0) {
108 if(strcasecmp(cptr,
"HRRT")==0) {
110 fprintf(stderr,
"Warning: HRRT not fully supported.\n");
113 if(strncasecmp(cptr,
"HR", 2)==0) {scanner_type=
SCANNER_HRPLUS;
continue;}
114 }
else if(strncasecmp(cptr,
"O=", 2)==0) {
116 if(strlen(cptr)>0) strcpy(ecatdir, cptr);
else strcpy(ecatdir,
".");
119 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
125 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
130 for(; ai<argc; ai++) {
132 strcpy(dbdir, argv[ai]);
continue;
134 fprintf(stderr,
"Error: invalid argument '%s'\n", argv[ai]);
140 fprintf(stderr,
"Error: NIfTI image was not given.");
144 if(!ecatdir[0]) strcpy(ecatdir,
".");
148 printf(
"program := %s\n", argv[0]);
149 printf(
"zoom := %g\n", zoom);
150 printf(
"scanner_type := %d\n", scanner_type);
151 printf(
"ecatdir := %s\n", ecatdir);
160 if(access(ecatdir, 0) == -1) {
161 if(verbose>0) fprintf(stdout,
"Creating subdirectory %s\n", ecatdir);
163 ret=mkdir(ecatdir, 00775);
164#elif defined HAVE_MKDIR1
166#elif defined HAVE__MKDIR
172 fprintf(stderr,
"Error: cannot created subdirectory.\n");
176 }
else strcpy(ecatdir,
".");
188 ret=
niftiExists(dbname, NULL, NULL, NULL, NULL, verbose-2, temp);
190 fprintf(stderr,
"Error: cannot open NIfTI image or directory %s (%s)\n",
194 fprintf(stderr,
"Warning: no SIF for %s; frame times not available.\n",
201 cptr=strrchr(dbname,
'/');
if(cptr==NULL) cptr=strrchr(dbname,
'\\');
202 if(cptr!=NULL) cptr++;
else cptr=dbname;
204 snprintf(ecatfile, FILENAME_MAX,
"%s\\%s", ecatdir, cptr);
206 snprintf(ecatfile, FILENAME_MAX,
"%s/%s", ecatdir, cptr);
208 strcat(ecatfile,
".v");
209 if(verbose>2) printf(
" ECAT filename: '%s'\n", ecatfile);
211 if(access(ecatfile, 0)!=-1 && remove(ecatfile)!=0) {
212 fprintf(stderr,
"Error: cannot overwrite %s\n", ecatfile);
213 errorNr++;
return(5);
220 if(verbose>0) fprintf(stdout,
"%s :\n", dbname);
222 if(verbose>0) printf(
" processing NIfTI image\n");
223 ret=
imgNiftiToEcat(dbname, ecatfile, scanner_type, zoom, verbose-1);
225 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
229 fprintf(stdout,
" Image saved in ECAT format in %s\n", ecatfile);
236 while((de=readdir(dp))!=NULL) {
237 if(verbose>6) printf(
"'%s'\n", de->d_name);
240 if(dbdir[ret]==
'/' || dbdir[ret]==
'\\') dbdir[ret]=(char)0;
247 n=strlen(de->d_name);
249 cptr=(de->d_name)+n-4;
250 if(strcasecmp(cptr,
".hdr")!=0 && strcasecmp(cptr,
".nii")!=0)
continue;
252 strcpy(temp, de->d_name); temp[n-4]=(char)0;
254 snprintf(dbname, FILENAME_MAX,
"%s\\%s", dbdir, temp);
256 snprintf(dbname, FILENAME_MAX,
"%s/%s", dbdir, temp);
259 ret=
niftiExists(dbname, NULL, NULL, NULL, NULL, verbose-2, NULL);
261 if(verbose>0) fprintf(stdout,
"%s :\n", dbname);
263 if(ret==2) fprintf(stderr,
" Warning: no SIF.\n");
264 fflush(stdout); fflush(stderr);
270 snprintf(ecatfile, FILENAME_MAX-2,
"%s\\%s", ecatdir, temp);
272 snprintf(ecatfile, FILENAME_MAX-2,
"%s/%s", ecatdir, temp);
274 strcat(ecatfile,
".v");
275 if(verbose>1) printf(
" ECAT filename: '%s'\n", ecatfile);
278 if(access(ecatfile, 0)!=-1 && remove(ecatfile)!=0) {
279 fprintf(stderr,
"Error: cannot overwrite %s\n", ecatfile);
286 if(verbose>0) printf(
" processing NIfTI image\n");
287 ret=
imgNiftiToEcat(dbname, ecatfile, scanner_type, zoom, verbose-1);
289 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
292 if(verbose>0) fprintf(stdout,
" Image saved in ECAT format in %s\n",
298 fprintf(stderr,
"Error: no NIfTI images were found in %s\n", dbdir);
325 int zi, fi, ret, file_format=0;
327 if(verbose>0) printf(
"\nimgNiftiToEcat(%s, %s)\n", dbname, ecatfile);
329 if(dbname==NULL || ecatfile==NULL)
return STATUS_FAULT;
333 if(verbose>1) printf(
" reading the first frame\n");
335 if(ret!=STATUS_OK) {
imgEmpty(&img);
return ret;}
339 if(verbose>1) printf(
" frame %d\n", fi);
344 if(zoom>0.0) img.
zoom=zoom;
350 if(ret!=STATUS_OK)
break;
351 if(verbose>1) printf(
" frame written.\n");
357 if(verbose>0 && ret==STATUS_NOMATRIX) {
358 fprintf(stdout,
" %d frame(s) processed.\n", fi);
360 if(ret!=STATUS_OK && ret!=STATUS_NOMATRIX) {
361 remove(ecatfile);
return ret;
double atof_dpi(char *str)
char * imgStatus(int status_index)
void imgEmpty(IMG *image)
int imgReadNiftiFirstFrame(const char *filename, IMG *img, int verbose)
int imgReadNiftiFrame(const char *filename, int frame_to_read, IMG *img, int frame_index, int verbose)
int imgWriteFrame(const char *fname, int frame_to_write, IMG *img, int frame_index)
int imgSetScanner(IMG *img, int scanner_type)
Header file for libtpcimgio.
void niftiRemoveFNameExtension(char *fname)
int niftiExists(const char *dbname, char *hdrfile, char *imgile, char *siffile, NIFTI_DSR *header, int verbose, char *status)
Header file for libtpcimgp.
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)
int imgNiftiToEcat(char *dbname, char *ecatfile, int scanner_type, float zoom, int verbose)