9#include "tpcclibConfig.h"
26static char *info[] = {
27 "Extract the TACs of specified pixel(s) in PET image.",
28 "Pixels can be specified as mask images, volume range definition files, or",
29 "as file containing list of pixel coordinates.",
31 "Usage: @P [Options] imgfile tacfile pixel(s)",
35 " Only those pixel TACs which have values over zero are extracted.",
38 "Volume range definition (vrd) file is an ASCII text file, which contains",
39 "pixel coordinates (x y z; 1..dimension) of the two opposite corners of",
40 "the extracted image volume, for example:",
41 " corner1 := 63 57 26",
42 " corner2 := 84 71 44",
43 "One or more pixel coordinates (x y z; 1..dimension) can be listed in file,",
48 "See also: imgthrs, mask2pxl, imgbox, imgmask, imghead, img2dft, imgmaxp",
50 "Keywords: image, pixel, TAC, software testing",
69int main(
int argc,
char **argv)
71 int ai, help=0, version=0, verbose=1;
72 int ret, fileNr=0, firstfile=0;
73 char petfile[FILENAME_MAX], tacfile[FILENAME_MAX];
74 char *cptr, tmp[128], pxlfile[FILENAME_MAX];
82 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
83 petfile[0]=tacfile[0]=pxlfile[0]=(char)0;
85 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
86 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
88 if(strncasecmp(cptr,
"POSITIVES", 3)==0) {
89 positives=1;
continue;
92 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
97 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
102 if(ai<argc) {
strlcpy(petfile, argv[ai], FILENAME_MAX); ai++;}
103 if(ai<argc) {
strlcpy(tacfile, argv[ai], FILENAME_MAX); ai++;}
104 for(; ai<argc; ai++) {
105 if(firstfile==0) firstfile=ai;
110 if(!tacfile[0] || fileNr<1) {
111 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
117 printf(
"petfile := %s\n", petfile);
118 printf(
"tacfile := %s\n", tacfile);
119 printf(
"fileNr := %d\n", fileNr);
120 printf(
"positives := %d\n", positives);
129 if(verbose>0) printf(
"reading %s\n", petfile);
132 fprintf(stderr,
"Error: %s\n", img.
statmsg);
133 if(verbose>1) printf(
"ret=%d\n", ret);
137 printf(
"pet_dimx := %d\n", img.
dimx);
138 printf(
"pet_dimy := %d\n", img.
dimy);
139 printf(
"pet_dimz := %d\n", img.
dimz);
140 printf(
"pet_dimt := %d\n", img.
dimt);
144 if(verbose>0) fprintf(stdout,
"correcting sinogram data for decay\n");
147 fprintf(stderr,
"Error %d: cannot decay correct dynamic sinogram.\n", ret);
148 if(ret==1) fprintf(stderr,
" Sinogram contains no isotope.\n");
149 if(ret==2) fprintf(stderr,
" Sinogram is already decay corrected.\n");
156 if(verbose>0) fprintf(stdout,
"correcting sinogram data for frame lengths\n");
159 fprintf(stderr,
"Error: cannot correct sinogram counts.\n");
160 if(verbose>1) printf(
"ret=%d\n", ret);
170 if(verbose==1) printf(
"reading pixel positions\n");
173 for(ai=firstfile; ai<argc; ai++) {
174 strlcpy(pxlfile, argv[ai], FILENAME_MAX);
175 if(verbose>1) printf(
"reading %s\n", pxlfile);
177 if((ret=
pxlRead(&pxl, pxlfile, tmp))==0) {
179 }
else if(verbose>1) {
180 printf(
"could not read as pixel list: %s\n", tmp);
181 if(verbose>2) printf(
"ret := %d\n", ret);
186 if((ret=
vrdRead(pxlfile, &vol_range, tmp))==0) {
189 printf(
"vol_range.x := %d - %d\n", vol_range.
x1, vol_range.
x2);
190 printf(
"vol_range.y := %d - %d\n", vol_range.
y1, vol_range.
y2);
191 printf(
"vol_range.z := %d - %d\n", vol_range.
z1, vol_range.
z2);
196 fprintf(stderr,
"Warning: no pixels defined in %s\n", pxlfile);
199 fprintf(stderr,
"Error: out of memory.\n");
202 for(p.
z=vol_range.
z1; p.
z<=vol_range.
z2; p.
z++)
203 for(p.
x=vol_range.
x1; p.
x<=vol_range.
x2; p.
x++)
204 for(p.
y=vol_range.
y1; p.
y<=vol_range.
y2; p.
y++)
208 }
else if(verbose>1) {
209 printf(
"could not read as vrd file: %s\n", tmp);
210 if(verbose>2) printf(
"ret := %d\n", ret);
213 if(verbose>1) printf(
"reading mask image %s\n", pxlfile);
217 fprintf(stderr,
"Error: %s\n", mask.
statmsg);
218 if(verbose>1) printf(
"ret := %d\n", ret);
223 fprintf(stderr,
"Error: different image dimensions.\n");
225 printf(
"image := %d x %d x %d\n", img.
dimx, img.
dimy, img.
dimz);
226 printf(
"mask := %d x %d x %d\n", mask.
dimx, mask.
dimy, mask.
dimz);
231 fprintf(stderr,
"Warning: no pixels defined in mask %s\n", pxlfile);
237 fprintf(stderr,
"Error: no pixels to extract.\n");
241 printf(
"list of pixels to extract:\n");
246 if(ret>0 && verbose>0) {
247 printf(
"%d pixel duplicates removed.\n", ret);
250 printf(
"list of pixels to extract:\n");
256 for(
long long int i=0; i<pxl.
pxlNr; i++) {
257 if(pxl.
p[i].
z<1 || pxl.
p[i].
z>img.
dimz) {
258 fprintf(stderr,
"Error: pixel outside image z dimension.\n");
261 if(pxl.
p[i].
x<1 || pxl.
p[i].
x>img.
dimx) {
262 fprintf(stderr,
"Error: pixel outside image x dimension.\n");
265 if(pxl.
p[i].
y<1 || pxl.
p[i].
y>img.
dimy) {
266 fprintf(stderr,
"Error: pixel outside image x dimension.\n");
278 if(verbose>0) printf(
"reading %llu pixel TACs.\n", pxl.
pxlNr);
283 fprintf(stderr,
"Error: cannot allocate memory for TACs.\n");
289 printf(
" _voidataNr := %d\n", dft._voidataNr);
290 printf(
" _dataSize := %d\n", dft._dataSize);
291 printf(
" voiNr := %d\n", dft.
voiNr);
292 printf(
" frameNr := %d\n", dft.
frameNr);
298 char *p; p=strrchr(tacfile,
'.');
307 if(verbose>1) printf(
"studynr := %s\n", dft.
studynr);
313 if(verbose>10) printf(
" isotope := %s\n",
imgIsotope(&img));
317 if(verbose>2) printf(
"filling TAC data\n");
319 for(
long long i=0; i<pxl.
pxlNr; i++) {
320 if(verbose>11) {printf(
" tac %llu\n", 1+i); fflush(stdout);}
321 for(
int j=0; j<img.
dimt; j++) {
323 printf(
"j=%d n=%d z=%d y=%d x=%d\n", j, n,
324 pxl.
p[i].
z-1, pxl.
p[i].
y-1, pxl.
p[i].
x-1);
326 dft.
voi[n].
y[j]=img.
m[pxl.
p[i].
z-1][pxl.
p[i].
y-1][pxl.
p[i].
x-1][j];
331 for(j=0; j<img.
dimt; j++)
if(dft.
voi[n].
y[j]>1.0E-08)
break;
332 if(j==img.
dimt)
continue;
335 if(verbose>20) {printf(
" setting ROI name\n"); fflush(stdout);}
338 sprintf(dft.
voi[n].
place,
"z%04d", pxl.
p[i].
z);
339 sprintf(dft.
voi[n].
name,
"%s_%s_%s",
341 if(verbose>10) printf(
" %s\n", dft.
voi[n].
voiname);
348 fprintf(stderr,
"Error: no pixels extracted.\n");
358 if(verbose>1) fprintf(stdout,
"writing TACs in %s\n", tacfile);
359 if(verbose>3) printf(
"dft._type := %d\n", dft.
_type);
362 fprintf(stderr,
"Error in writing '%s': %s\n", tacfile,
dfterrmsg);
365 if(verbose>0) fprintf(stdout,
"Pixel TACs written in %s\n", tacfile);
char * ctime_r_int(const time_t *t, char *buf)
Convert calendard time t into a null-terminated string of the form YYYY-MM-DD hh:mm:ss,...
int dftWrite(DFT *data, char *filename)
void dftSec2min(DFT *dft)
void imgEmpty(IMG *image)
int imgRawCountsPerTime(IMG *img, int operation)
char * imgIsotope(IMG *img)
int imgDecayCorrection(IMG *image, int mode)
int imgRead(const char *fname, IMG *img)
Header file for libtpccurveio.
#define DFT_FORMAT_CSV_UK
#define DFT_FORMAT_STANDARD
Header file for libtpcimgio.
void pxlFree(IMG_PIXELS *pxl)
int vrdReorder(VOL_RANGE *vol_range)
int pxlAllocateMore(IMG_PIXELS *pxl, long long int pxlNr)
int vrdVxlNr(VOL_RANGE *vol_range)
int pxlAdd(IMG_PIXELS *list, IMG_PIXEL *pxl)
int pxlWrite(IMG_PIXELS *pxl, FILE *fp, char *status)
int pxlRead(IMG_PIXELS *pxl, const char *fname, char *status)
long long int pxlRmDuplicates(IMG_PIXELS *list)
int vrdRead(char *vdffile, VOL_RANGE *vol_range, char *status)
void pxlInit(IMG_PIXELS *pxl)
long long int pxlAddFromMask(IMG_PIXELS *list, IMG *img)
Header file for libtpcimgp.
Header file for libtpcmisc.
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
int studynr_from_fname2(char *fname, char *studynr, int force)
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 libtpcmodext.
int dftAllocateWithIMG(DFT *dft, int tacNr, IMG *img)
char studynr[MAX_STUDYNR_LEN+1]
char radiopharmaceutical[32]
char radiopharmaceutical[32]
char voiname[MAX_REGIONSUBNAME_LEN+1]
char name[MAX_REGIONNAME_LEN+1]
char hemisphere[MAX_REGIONSUBNAME_LEN+1]
char place[MAX_REGIONSUBNAME_LEN+1]