8#include "tpcclibConfig.h"
27 char *dbname,
char *ecatfile,
int scanner_type,
float zoom,
int verbose);
31static char *info[] = {
32 "Conversion of NIfTI-1 PET image database(s) to ECAT 7 image volume",
34 "Conversion can also be done using ImageConverter (.NET application).",
36 "Usage: @P [Options] database",
40 " Data directory for ECAT images; by default current working directory.",
43 "NIfTI database can be specified as a path, containing one or more databases,",
44 "or filename of one NIfTI database without extension.",
45 "NIfTI file(s) must be named as *.nii (single format) or *.hdr and *.img",
47 "Program reads time frame information from SIF, if SIF is located in",
48 "the database directory and if file is named with *.sif extension.",
51 "Conversion of all NIfTI images in directory S:\\temp\\neuro to ECAT 7",
52 "images in directory C:\\data in PC/Windows:",
55 " @P s:\\temp\\neuro",
57 "See also: ecat2nii, eframe, sif2ecat, e7emhdr, e7evhdr, flat2img, ana2ecat",
59 "Keywords: image, format conversion, ECAT, NIfTI",
78int main(
int argc,
char **argv)
80 int ai, help=0, version=0, verbose=1;
81 int ret, n, errorNr=0, niiNr=0;
84 char ecatdir[FILENAME_MAX], dbdir[FILENAME_MAX], ecatfile[FILENAME_MAX];
85 char temp[FILENAME_MAX], dbname[FILENAME_MAX], *cptr;
93 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
94 ecatdir[0]=dbdir[0]=(char)0;
96 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
97 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
99 if(strncasecmp(cptr,
"ZOOM=", 5)==0) {
100 cptr+=5; zoom=
atof_dpi(cptr);
if(zoom>0.0)
continue;
101 }
else if(strncasecmp(cptr,
"SCANNER=", 8)==0) {
105 if(strcasecmp(cptr,
"HRRT")==0) {
107 fprintf(stderr,
"Warning: HRRT not fully supported.\n");
110 if(strncasecmp(cptr,
"HR", 2)==0) {scanner_type=
SCANNER_HRPLUS;
continue;}
111 }
else if(strncasecmp(cptr,
"O=", 2)==0) {
113 if(strlen(cptr)>0) strcpy(ecatdir, cptr);
else strcpy(ecatdir,
".");
116 fprintf(stderr,
"Error: invalid option '%s'\n", argv[ai]);
122 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
127 for(; ai<argc; ai++) {
129 strcpy(dbdir, argv[ai]);
continue;
131 fprintf(stderr,
"Error: invalid argument '%s'\n", argv[ai]);
137 fprintf(stderr,
"Error: NIfTI image was not given.");
141 if(!ecatdir[0]) strcpy(ecatdir,
".");
145 printf(
"program := %s\n", argv[0]);
146 printf(
"zoom := %g\n", zoom);
147 printf(
"scanner_type := %d\n", scanner_type);
148 printf(
"ecatdir := %s\n", ecatdir);
157 if(access(ecatdir, 0) == -1) {
158 if(verbose>0) fprintf(stdout,
"Creating subdirectory %s\n", ecatdir);
162 ret=mkdir(ecatdir, 00775);
165 fprintf(stderr,
"Error: cannot created subdirectory.\n");
169 }
else strcpy(ecatdir,
".");
181 ret=
niftiExists(dbname, NULL, NULL, NULL, NULL, verbose-2, temp);
183 fprintf(stderr,
"Error: cannot open NIfTI image or directory %s (%s)\n",
187 fprintf(stderr,
"Warning: no SIF for %s; frame times not available.\n",
194 cptr=strrchr(dbname,
'/');
if(cptr==NULL) cptr=strrchr(dbname,
'\\');
195 if(cptr!=NULL) cptr++;
else cptr=dbname;
197 snprintf(ecatfile, FILENAME_MAX,
"%s\\%s", ecatdir, cptr);
199 snprintf(ecatfile, FILENAME_MAX,
"%s/%s", ecatdir, cptr);
201 strcat(ecatfile,
".v");
202 if(verbose>2) printf(
" ECAT filename: '%s'\n", ecatfile);
204 if(access(ecatfile, 0)!=-1 && remove(ecatfile)!=0) {
205 fprintf(stderr,
"Error: cannot overwrite %s\n", ecatfile);
206 errorNr++;
return(5);
213 if(verbose>0) fprintf(stdout,
"%s :\n", dbname);
215 if(verbose>0) printf(
" processing NIfTI image\n");
216 ret=
imgNiftiToEcat(dbname, ecatfile, scanner_type, zoom, verbose-1);
218 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
222 fprintf(stdout,
" Image saved in ECAT format in %s\n", ecatfile);
229 while((de=readdir(dp))!=NULL) {
230 if(verbose>6) printf(
"'%s'\n", de->d_name);
233 if(dbdir[ret]==
'/' || dbdir[ret]==
'\\') dbdir[ret]=(char)0;
240 n=strlen(de->d_name);
242 cptr=(de->d_name)+n-4;
243 if(strcasecmp(cptr,
".hdr")!=0 && strcasecmp(cptr,
".nii")!=0)
continue;
245 strcpy(temp, de->d_name); temp[n-4]=(char)0;
247 snprintf(dbname, FILENAME_MAX,
"%s\\%s", dbdir, temp);
249 snprintf(dbname, FILENAME_MAX,
"%s/%s", dbdir, temp);
252 ret=
niftiExists(dbname, NULL, NULL, NULL, NULL, verbose-2, NULL);
254 if(verbose>0) fprintf(stdout,
"%s :\n", dbname);
256 if(ret==2) fprintf(stderr,
" Warning: no SIF.\n");
257 fflush(stdout); fflush(stderr);
263 snprintf(ecatfile, FILENAME_MAX-2,
"%s\\%s", ecatdir, temp);
265 snprintf(ecatfile, FILENAME_MAX-2,
"%s/%s", ecatdir, temp);
267 strcat(ecatfile,
".v");
268 if(verbose>1) printf(
" ECAT filename: '%s'\n", ecatfile);
271 if(access(ecatfile, 0)!=-1 && remove(ecatfile)!=0) {
272 fprintf(stderr,
"Error: cannot overwrite %s\n", ecatfile);
279 if(verbose>0) printf(
" processing NIfTI image\n");
280 ret=
imgNiftiToEcat(dbname, ecatfile, scanner_type, zoom, verbose-1);
282 fprintf(stderr,
"Error: %s\n",
imgStatus(ret));
285 if(verbose>0) fprintf(stdout,
" Image saved in ECAT format in %s\n",
291 fprintf(stderr,
"Error: no NIfTI images were found in %s\n", dbdir);
318 int zi, fi, ret, file_format=0;
320 if(verbose>0) printf(
"\nimgNiftiToEcat(%s, %s)\n", dbname, ecatfile);
322 if(dbname==NULL || ecatfile==NULL)
return STATUS_FAULT;
326 if(verbose>1) printf(
" reading the first frame\n");
328 if(ret!=STATUS_OK) {
imgEmpty(&img);
return ret;}
332 if(verbose>1) printf(
" frame %d\n", fi);
337 if(zoom>0.0) img.
zoom=zoom;
343 if(ret!=STATUS_OK)
break;
344 if(verbose>1) printf(
" frame written.\n");
350 if(verbose>0 && ret==STATUS_NOMATRIX) {
351 fprintf(stdout,
" %d frame(s) processed.\n", fi);
353 if(ret!=STATUS_OK && ret!=STATUS_NOMATRIX) {
354 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)