8#include "tpcclibConfig.h"
28static char *info[] = {
29 "Create a 3D PET image file in NIfTI 1S format, with pixels values of 1",
30 "inside of a general ellipsoid and 0 outside of it,",
31 "for simple simulations and SW testing.",
32 "Matrix size and ellipsoid diameters must be given in pixels.",
34 "Usage: @P [Options] xdim ydim zdim xdiam ydiam zdiam imagefile",
37 " -cx=<pixels> || -cy=<pixels> || -cz=<pixels>",
38 " Move the centre of ellipsoid from the image centre",
41 "See also: dft2img, tac2nii, flat2img, img2tif, img2dft, simboxes, pxl2mask",
43 "Keywords: image, NIfTI, simulation, software testing",
63int main(
int argc,
char **argv)
65 int ai, help=0, version=0, verbose=1;
66 char dbname[FILENAME_MAX];
67 int dimx=0, dimy=0, dimz=0;
68 double diamx=0.0, diamy=0.0, diamz=0.0;
69 double cx=0.0, cy=0.0, cz=0.0;
75 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
78 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
80 char *cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
81 if(strncasecmp(cptr,
"CX=", 3)==0) {
83 }
else if(strncasecmp(cptr,
"CY=", 3)==0) {
85 }
else if(strncasecmp(cptr,
"CZ=", 3)==0) {
88 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
97 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
103 if(ai<argc) {
if(
atoiCheck(argv[ai++], &dimx)) ret++;}
104 if(ai<argc) {
if(
atoiCheck(argv[ai++], &dimy)) ret++;}
105 if(ai<argc) {
if(
atoiCheck(argv[ai++], &dimz)) ret++;}
106 if(ret || dimx<1 || dimy<1 || dimz<1) {fprintf(stderr,
"Error: invalid dimension.\n");
return(1);}
110 if(isnan(diamx) || isnan(diamy) || isnan(diamz)) {
111 fprintf(stderr,
"Error: invalid diameter.\n");
return(1);}
112 if(ai<argc) {
strlcpy(dbname, argv[ai], FILENAME_MAX); ai++;}
113 if(ai<argc) {fprintf(stderr,
"Error: too many arguments.\n");
return(1);}
117 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
123 printf(
"dbname := %s\n", dbname);
124 printf(
"dimx := %d\n", dimx);
125 printf(
"dimy := %d\n", dimy);
126 printf(
"dimz := %d\n", dimz);
127 printf(
"diamx := %g\n", diamx);
128 printf(
"diamy := %g\n", diamy);
129 printf(
"diamz := %g\n", diamz);
130 printf(
"cx := %g\n", cx);
131 printf(
"cy := %g\n", cy);
132 printf(
"cz := %g\n", cz);
137 cx+=0.5*(double)dimx+0.5;
138 cy+=0.5*(double)dimy+0.5;
139 cz+=0.5*(double)dimz+0.5;
145 if(verbose>1) printf(
"Allocate memory for xyz matrix\n");
146 size_t pxlNr=(size_t)dimz*dimy*dimx;
148 idata=(
int*)calloc(pxlNr,
sizeof(
int));
149 if(idata==NULL) {fprintf(stderr,
"Error: out of memory.\n");
return(4);}
150 if(verbose>1) printf(
"Fill the template\n");
151 for(
int z=0; z<dimz; z++)
for(
int y=0; y<dimy; y++)
for(
int x=0; x<dimx; x++) {
152 size_t pos=((size_t)dimy*dimx)*z + dimx*y + x;
153 double dz=(2.0*((double)z-cz)/diamz);
154 double dy=(2.0*((double)y-cy)/diamy);
155 double dx=(2.0*((double)x-cx)/diamx);
156 if(dz*dz+dy*dy+dx*dx<=1.0) idata[pos]=1;
else idata[pos]=0;
163 if(verbose>1) printf(
"Fill NIfTI header\n");
179 for(
int i=0; i<8; i++) dsr.
h1.
dim[i]=1;
192 for(
int i=0; i<8; i++) dsr.
h1.
pixdim[i]=0.0;
220 for(
int i=0; i<4; i++) dsr.
h1.
srow_x[i]=0;
221 for(
int i=0; i<4; i++) dsr.
h1.
srow_y[i]=0;
222 for(
int i=0; i<4; i++) dsr.
h1.
srow_z[i]=0;
231 if(verbose>1) printf(
"Make NIfTI file names\n");
232 char hdrfile[FILENAME_MAX], imgfile[FILENAME_MAX];
234 fprintf(stderr,
" Error: invalid NIfTI name %s\n", dbname);
235 free(idata);
return(11);
238 if(verbose>1) printf(
"Writing NIfTI header\n");
244 fprintf(stderr,
"Error: cannot write template header.\n");
249 if(verbose>1) printf(
"Writing NIfTI image data\n");
250 FILE *fp=fopen(imgfile,
"r+b");
252 fprintf(stderr,
"Error: cannot open %s for write.\n", imgfile);
259 if(fseeko(fp, (
size_t)dsr.
h1.
vox_offset, SEEK_SET)!=0) {
260 fprintf(stderr,
"Error: invalid file write position.\n");
261 fclose(fp); free(idata);
267 if(fwrite(idata,
sizeof(
int), pxlNr, fp) != pxlNr) {
268 fprintf(stderr,
"Error: cannot write template matrix.\n");
269 fclose(fp); free(idata);
274 fclose(fp); free(idata);
275 if(verbose>0) printf(
"written %s\n", imgfile);
double atofVerified(const char *s)
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 library libtpccsv.
Header file for libtpcdcm.
Header file for libtpcecat.
Header file for library libtpcextensions.
Header file for library libtpcift.
Header file for libtpcimage.
@ IMG_FORMAT_NIFTI_1S
NIfTI-1 single-file format.
Header file for libtpcnifti.
#define NIFTI_DT_SIGNED_INT
#define NIFTI1_HEADER_SIZE
#define NIFTI_INTENT_NONE
Header file for library libtpctac.