8#include "tpcclibConfig.h"
28static char *info[] = {
29 "Create a 4D PET image file in NIfTI 1S format, with contents from",
30 "the 32-bit float values in flat binary file.",
31 "Flat file must contain the pixel values in order t>z>y>x.",
33 "Usage: @P [Options] flatfile xdim ydim zdim tdim imagefile",
37 " Pixel sizes in x, y, and z dimensions in mm; by default 1 mm each.",
41 " @P -pxlsize=2.5,2.5,3.0 data.bin 128 128 63 25 output",
43 "See also: img2flat, tac2nii, nii_ehdr, img2tif, simboxes, simcirc, pxl2mask",
45 "Keywords: image, NIfTI, simulation, software testing",
65int main(
int argc,
char **argv)
67 int ai, help=0, version=0, verbose=1;
68 char flatfile[FILENAME_MAX], dbname[FILENAME_MAX];
69 int dimx=0, dimy=0, dimz=0, dimt=0;
70 double pxlsize[3]={1.0,1.0,1.0};
77 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
78 flatfile[0]=dbname[0]=(char)0;
81 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
82 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
83 if(strncasecmp(cptr,
"PXLSIZE=", 8)==0) {
84 if(
atofList(cptr+8,
",", pxlsize, 3)<3)
85 {fprintf(stderr,
"Error: invalid pixel sizes.\n");
return(1);}
86 if(!(pxlsize[0]>0.0) || !(pxlsize[1]>0.0) || !(pxlsize[2]>0.0))
87 {fprintf(stderr,
"Error: invalid pixel sizes.\n");
return(1);}
91 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
100 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
106 if(ai<argc) {
strlcpy(flatfile, argv[ai], FILENAME_MAX); ai++;}
107 if(ai<argc) {
if(
atoiCheck(argv[ai++], &dimx)) ret++;}
108 if(ai<argc) {
if(
atoiCheck(argv[ai++], &dimy)) ret++;}
109 if(ai<argc) {
if(
atoiCheck(argv[ai++], &dimz)) ret++;}
110 if(ai<argc) {
if(
atoiCheck(argv[ai++], &dimt)) ret++;}
111 if(ret || dimx<1 || dimy<1 || dimz<1 || dimt<0) {
112 fprintf(stderr,
"Error: invalid dimension.\n");
115 if(ai<argc) {
strlcpy(dbname, argv[ai], FILENAME_MAX); ai++;}
116 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
120 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
126 printf(
"flatfile := %s\n", flatfile);
127 printf(
"dbname := %s\n", dbname);
128 printf(
"dimx := %d\n", dimx);
129 printf(
"dimy := %d\n", dimy);
130 printf(
"dimz := %d\n", dimz);
131 printf(
"dimt := %d\n", dimt);
132 printf(
"sizex := %g\n", pxlsize[0]);
133 printf(
"sizey := %g\n", pxlsize[1]);
134 printf(
"sizez := %g\n", pxlsize[2]);
139 if(verbose>1) printf(
"Make NIfTI file names\n");
140 char hdrfile[FILENAME_MAX], imgfile[FILENAME_MAX], siffile[FILENAME_MAX];
142 fprintf(stderr,
" Error: invalid NIfTI name %s\n", dbname);
148 if(verbose>1) printf(
"Allocate memory for flat data\n");
149 size_t pxlNr=(size_t)dimz*dimy*dimx*dimt;
151 fdata=(
float*)calloc(pxlNr,
sizeof(
float));
153 fprintf(stderr,
"Error: out of memory.\n");
162 if(verbose>1) printf(
"Opening input datafile %s\n", flatfile);
163 if((fp=fopen(flatfile,
"rb")) == NULL) {
164 fprintf(stderr,
"Error: cannot open file %s\n", flatfile);
165 free(fdata);
return(3);
168 size_t rnr=fread((
char*)fptr, 4, pxlNr, fp);
170 fprintf(stderr,
"Error: cannot read file %s\n", flatfile);
171 fclose(fp); free(fdata);
return(3);
174 fprintf(stderr,
"Error: binary file does not contain data for all pixels.\n");
175 fclose(fp); free(fdata);
return(3);
179 rnr=fread(buf, 4, 1, fp);
181 fprintf(stderr,
"Error: mismatching matrix size and binary data.\n");
182 fclose(fp); free(fdata);
return(3);
188 float pxlmin, pxlmax; pxlmin=pxlmax=nanf(
"");
189 for(
size_t i=0; i<pxlNr; i++)
if(!isfinite(pxlmin) || fdata[i]<pxlmin) pxlmin=fdata[i];
190 for(
size_t i=0; i<pxlNr; i++)
if(!isfinite(pxlmax) || fdata[i]>pxlmax) pxlmax=fdata[i];
192 printf(
" pxlmin := %g\n", pxlmin);
193 printf(
" pxlmax := %g\n", pxlmax);
200 if(verbose>1) printf(
"Fill NIfTI header\n");
216 for(
int i=0; i<8; i++) dsr.
h1.
dim[i]=1;
229 for(
int i=0; i<8; i++) dsr.
h1.
pixdim[i]=0.0;
257 for(
int i=0; i<4; i++) dsr.
h1.
srow_x[i]=0;
258 for(
int i=0; i<4; i++) dsr.
h1.
srow_y[i]=0;
259 for(
int i=0; i<4; i++) dsr.
h1.
srow_z[i]=0;
268 if(verbose>1) printf(
"Writing NIfTI header\n");
276 fprintf(stderr,
"Error: cannot write header.\n");
284 if(verbose>1) printf(
"Writing NIfTI image data\n");
285 FILE *fp=fopen(imgfile,
"r+b");
287 fprintf(stderr,
"Error: cannot open %s for write.\n", imgfile);
294 if(fseeko(fp, (
size_t)dsr.
h1.
vox_offset, SEEK_SET)!=0) {
295 fprintf(stderr,
"Error: invalid file write position.\n");
296 fclose(fp); free(fdata);
302 if(fwrite(fdata,
sizeof(
float), pxlNr, fp) != pxlNr) {
303 fprintf(stderr,
"Error: cannot write image matrix.\n");
304 fclose(fp); free(fdata);
309 fclose(fp); free(fdata);
310 if(verbose>0) printf(
"written %s\n", imgfile);
int atofList(const char *s1, const char *s2, double *x, int maxn)
int fileExist(const char *filename)
int niftiCreateFNames(const char *filename, char *hdrfile, char *imgfile, char *siffile, int fileformat)
int atoiCheck(const char *s, int *v)
int niftiWriteHeader(const char *filename, NIFTI_DSR *dsr, int verbose)
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)
void statusInit(TPCSTATUS *s)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
int verbose
Verbose level, used by statusPrint() etc.
Header file for libtpcdcm.
Header file for libtpcecat.
Header file for library libtpcextensions.
Header file for libtpcimage.
@ IMG_FORMAT_NIFTI_1S
NIfTI-1 single-file format.
Header file for libtpcnifti.
#define NIFTI1_HEADER_SIZE
#define NIFTI_INTENT_NONE