8#include "tpcclibConfig.h"
25static char *info[] = {
26 "Creating a PET image file in ECAT 6 or 7 format, with contents from",
27 "the user-specified TAC file. Extension of output image filename (.img or .v)",
28 "determines whether ECAT 6 or 7 format is used.",
29 "Image area is divided into equally sized rectangles, containing as pixel",
30 "values the regional TAC values.",
31 "Only one image plane is written to image (z dimension will be 1).",
32 "Frame times are written as specified in the TAC file.",
34 "Usage: @P [Options] tacfile imagefile [roifile]",
36 "If roifile is given, the rectangular regions are saved in it.",
37 "Not effective with option -tpl.",
40 " -scanner=<Advance|931|HR+|HRRT>",
41 " Scanner, by default GE Advance.",
43 " Reconstruction zoom factor, minimum and default is 1.41421356.",
45 " Image area is not divided into rectangles, but instead the template",
46 " image containing pixel values [1,TAC nr] is used; ROIs are not saved",
48 " -dim=<image dimension>",
49 " Image x,y-size in pixels; default 256; not effective with template.",
51 " If TAC data is not corrected for decay, use this option; otherwise",
52 " image headers will tell that image is corrected for decay.",
55 "See also: flat2img, imgadd, img2tif, img2dft, tac2nii, pxl2mask, simframe",
57 "Keywords: image, ECAT, simulation, software testing",
77int main(
int argc,
char **argv)
79 int ai, help=0, version=0, verbose=1;
80 int fi, ri, zi, rowNr, colNr, w, h, row, col;
82 char dfile[FILENAME_MAX], ifile[FILENAME_MAX], rfile[FILENAME_MAX],
83 tfile[FILENAME_MAX], *cptr;
85 int image_dimx=256, image_dimy=256, image_dimz=1;
87 float zoom=1.41421356;
95 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
96 dfile[0]=ifile[0]=rfile[0]=tfile[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,
"SCANNER=", 8)==0) {
106 if(strcasecmp(cptr,
"HRRT")==0) {scanner_type=
SCANNER_HRRT;
continue;}
107 if(strncmp(cptr,
"HR", 2)==0 || strncmp(cptr,
"hr", 2)==0) {
109 }
else if(strncasecmp(cptr,
"DIM=", 4)==0) {
110 cptr+=4; image_dimx=image_dimy=atoi(cptr);
if(image_dimx>1)
continue;
111 }
else if(strncasecmp(cptr,
"ZOOM=", 5)==0) {
112 cptr+=5; zoom=
atof_dpi(cptr);
if(zoom>1.41421356)
continue;
113 }
else if(strncasecmp(cptr,
"NODECAY", 1)==0) {
115 }
else if(strncasecmp(cptr,
"TPL=", 4)==0) {
116 cptr+=4;
strlcpy(tfile, cptr, FILENAME_MAX);
if(strlen(tfile)>0)
continue;
118 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
123 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
128 if(ai<argc) {
strlcpy(dfile, argv[ai], FILENAME_MAX); ai++;}
129 if(ai<argc) {
strlcpy(ifile, argv[ai], FILENAME_MAX); ai++;}
130 if(ai<argc) {
strlcpy(rfile, argv[ai], FILENAME_MAX); ai++;}
131 if(ai<argc) {fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
return(1);}
136 fprintf(stderr,
"Error: missing command-line argument; try %s --help\n", argv[0]);
142 printf(
"dfile := %s\n", dfile);
143 printf(
"ifile := %s\n", ifile);
144 printf(
"rfile := %s\n", rfile);
145 printf(
"tfile := %s\n", tfile);
146 printf(
"scanner_type := %d\n", scanner_type);
148 printf(
"image_dimx := %d\n", image_dimx);
149 printf(
"image_dimy := %d\n", image_dimy);
150 printf(
"image_dimz := %d\n", image_dimz);
152 printf(
"zoom := %g\n", zoom);
153 printf(
"decay := %d\n", decay);
161 if(verbose>1) printf(
"Reading TAC file %s\n", dfile);
163 fprintf(stderr,
"Error in reading '%s': %s\n", dfile,
dfterrmsg);
166 if(verbose>2) printf(
"roiNr := %d\nframeNr := %d\n", dft.
voiNr, dft.
frameNr);
174 if(verbose>1) fprintf(stdout,
"reading header from template %s\n", tfile);
177 fprintf(stderr,
"Error: %s\n", timg.
statmsg);
183 image_dimx=timg.
dimx;
184 image_dimy=timg.
dimy;
185 image_dimz=timg.
dimz;
189 printf(
"image_dimx := %d\n", image_dimx);
190 printf(
"image_dimy := %d\n", image_dimy);
191 printf(
"image_dimz := %d\n", image_dimz);
200 if(verbose>1) printf(
"allocating memory for image data\n");
202 fprintf(stderr,
"Error in memory allocation.\n");
206 if(verbose>1) printf(
"setting image headers\n");
215 for(fi=0; fi<dft.
frameNr; fi++) {
218 img.
start[fi]*=60.; img.
end[fi]*=60.; img.
mid[fi]*=60.;}
242 if(verbose>1) printf(
"Setting ROIs\n");
245 fprintf(stderr,
"Error in memory allocation.\n");
248 for(ri=0; ri<dft.
voiNr; ri++) {
255 for(ri=0; ri<dft.
voiNr; ri++) {
266 colNr=ceil(sqrt((
double)dft.
voiNr));
267 rowNr=ceil((
double)dft.
voiNr/(
double)colNr);
269 w=image_dimx/colNr; h=image_dimy/rowNr;
if(w<2 || h<2) {
270 fprintf(stderr,
"Error: too many TACs.\n");
274 printf(
"setting %dx%d ROIs of width %d and height %d pixels with %d frames\n",
275 colNr, rowNr, w, h, dft.
frameNr);
277 for(ri=col=row=0; ri<dft.
voiNr; ri++) {
278 if(verbose>1) printf(
"Setting ROI (%d,%d) %s:\n", col, row, roilist.
roi[ri].
roiname);
280 roilist.
roi[ri].
x[0]=roilist.
roi[ri].
y[0]=0;
281 roilist.
roi[ri].
x[1]=w-1; roilist.
roi[ri].
y[1]=0;
282 roilist.
roi[ri].
x[2]=w-1; roilist.
roi[ri].
y[2]=h-1;
283 roilist.
roi[ri].
x[3]=0; roilist.
roi[ri].
y[3]=h-1;
284 roilist.
roi[ri].
x[4]=0; roilist.
roi[ri].
y[4]=0;
285 col++;
if(col==colNr) {col=0; row++;}
290 if(verbose>=0) printf(
"Writing ROI file %s\n", rfile);
292 fprintf(stderr,
"Error in writing ROI file.\n");
297 if(verbose>1) printf(
"setting image data contents\n");
298 for(ri=0; ri<dft.
voiNr; ri++) {
299 if(verbose>2) printf(
" roi=%d\n", ri);
304 for(fi=0; fi<dft.
frameNr; fi++) {
305 if(verbose>30) printf(
" m[%d][%d][%d][%d]=%g\n", 0, row, col, fi, dft.
voi[ri].
y[fi]);
306 for(zi=0; zi<img.
dimz; zi++)
307 img.
m[zi][row][col][fi]=dft.
voi[ri].
y[fi];
315 int xi, yi, zi, notset;
320 if(verbose>1) fprintf(stdout,
"reading template %s\n", tfile);
322 fprintf(stderr,
"Error: %s\n", timg.
statmsg);
331 fprintf(stderr,
"Error: template contains more than one frame.\n");
336 fprintf(stderr,
"Error: wrong template dimensions.\n");
354 for(zi=0; zi<img.
dimz; zi++) {
355 for(yi=0; yi<img.
dimy; yi++) {
356 for(xi=0; xi<img.
dimx; xi++) {
358 if(ri<0 || ri>=dft.
voiNr) {
359 for(fi=0; fi<dft.
frameNr; fi++) img.
m[zi][yi][xi][fi]=0.0;
362 for(fi=0; fi<dft.
frameNr; fi++)
363 img.
m[zi][yi][xi][fi]=dft.
voi[ri].
y[fi];
369 printf(
"%d pixels were not assigned value from TAC.\n", notset);
370 for(ri=0; ri<dft.
voiNr; ri++) {
371 printf(
"TAC %d was written in %d pixels.\n", 1+ri, (
int)
temp_roundf(dft.
voi[ri].
size));
384 if(verbose>1) printf(
"Writing image file %s ...\n", ifile);
386 fprintf(stderr,
"Error: %s\n", img.
statmsg);
389 if(verbose>=0) printf(
"%s written\n", ifile);
int get_datetime(char *str, struct tm *date, int verbose)
time_t timegm(struct tm *tm)
Inverse of gmtime, converting struct tm to time_t.
double atof_dpi(char *str)
int dftRead(char *filename, DFT *data)
int mat_numcod(int frame, int plane, int gate, int data, int bed)
int roiSave(const char *fname, ROI_list *rl)
int imgAllocate(IMG *image, int planes, int rows, int columns, int frames)
void imgEmpty(IMG *image)
int imgRead(const char *fname, IMG *img)
int imgWrite(const char *fname, IMG *img)
int imgReadHeader(const char *fname, IMG *img, int format)
int imgSetScanner(IMG *img, int scanner_type)
int imgSetUnit(IMG *img, char *unit)
Header file for libtpccurveio.
Header file for libtpcimgio.
#define IMG_DC_NONCORRECTED
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)
Header file for libtpcroi.
char studynr[MAX_STUDYNR_LEN+1]
char unit[MAX_UNITS_LEN+1]
char studyNr[MAX_STUDYNR_LEN+1]
char imgfile[FILENAME_MAX]
char voiname[MAX_REGIONSUBNAME_LEN+1]
char hemisphere[MAX_REGIONSUBNAME_LEN+1]