8#include "tpcclibConfig.h"
26static char *info[] = {
27 "Make histogram of the voxel values in PET image.",
28 "PET image file must be in ECAT, NIfTI, or Analyze format.",
29 "Resulting histogram file contains the bin as the two first columns,",
30 "and the proportion (0-1) of values in the bin in the next column.",
31 "In case of dynamic PET data a separate histogram is made from each frame",
32 "and saved as its own column in the histogram file.",
34 "Usage: @P [Options] petfile [histogram]",
37 " -bin=<Binsize as absolute value> or -per=<Binsize as percentage>",
38 " Set the bin size using these options; by default, bin size is 10%",
39 " of maximum-minimum voxel value in the whole image.",
41 " Nr of voxels in each bin is written in histogram file; proportion",
42 " of them is written by default.",
44 " Include only voxels with value > 0.",
46 " Histogram is plotted in specified SVG file.",
49 "See also: imginteg, imgmax, imgposv, imglkup, hist4dat, imgqntls, imgthrs",
51 "Keywords: image, histogram, threshold",
70int main(
int argc,
char **argv)
72 int ai, help=0, version=0, verbose=1;
73 char petfile[FILENAME_MAX], svgfile[FILENAME_MAX], hisfile[FILENAME_MAX];
76 int report_proportions=1;
78 double bin_size=-1.0, bin_perc=-1.0;
84 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
85 petfile[0]=hisfile[0]=svgfile[0]=(char)0;
87 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
89 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(cptr==NULL)
continue;
90 if(strncasecmp(cptr,
"SVG=", 4)==0) {
91 if(
strlcpy(svgfile, cptr+4, FILENAME_MAX)>1)
continue;
92 }
else if(strncasecmp(cptr,
"BIN=", 4)==0) {
94 if(ret==0 && bin_size>0.0)
continue;
95 }
else if(strncasecmp(cptr,
"PER=", 4)==0) {
97 if(ret==0 && bin_perc>0.0)
continue;
98 }
else if(strcasecmp(cptr,
"NR")==0) {
99 report_proportions=0;
continue;
100 }
else if(strncasecmp(cptr,
"POSITIVES", 3)==0) {
101 positives=1;
continue;
103 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
108 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
113 if(ai<argc)
strlcpy(petfile, argv[ai++], FILENAME_MAX);
114 if(ai<argc)
strlcpy(hisfile, argv[ai++], FILENAME_MAX);
116 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
121 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
124 if(bin_size>0.0 && bin_perc>0.0) {
125 fprintf(stderr,
"Error: options -bin and -per cannot be used together.\n");
128 if(bin_size<=0.0 && bin_perc<=0.0) bin_perc=10.0;
132 printf(
"petfile := %s\n", petfile);
133 if(hisfile[0]) printf(
"hisfile := %s\n", hisfile);
134 if(svgfile[0]) printf(
"svgfile := %s\n", svgfile);
135 if(bin_size>0.0) printf(
"bin_size := %g\n", bin_size);
136 if(bin_perc>0.0) printf(
"bin_percentage := %g\n", bin_perc);
137 printf(
"positives_only := %d\n", positives);
145 if(verbose>0) fprintf(stdout,
"reading %s\n", petfile);
149 fprintf(stderr,
"Error: %s\n", img.
statmsg);
150 if(verbose>1) printf(
"ret=%d\n", ret);
154 printf(
"image_size := %d x %d x %d\n", img.
dimx, img.
dimy, img.
dimz);
155 if(img.
dimt>1) printf(
"frame_nr := %d\n", img.
dimt);
158 if(verbose>0) fprintf(stderr,
"Warning: missing pixel values.\n");
163 if(verbose>1) printf(
"min := %g\nmax := %g\n", minv, maxv);
166 if(minv<0.0) minv=0.0;
169 if(minv>0.0 && minv<0.05*maxv)
172 if(verbose>1) printf(
"refined_min := %g\n", minv);
174 double rangev=(double)maxv-(
double)minv;
175 if(verbose>2) printf(
"max-min := %g\n", rangev);
179 bin_size=0.01*bin_perc*rangev;
180 if(verbose>1) printf(
"bin_size := %g\n", bin_size);
182 if(bin_size<1.0E-020) {
183 fprintf(stderr,
"Error: invalid bin size.\n");
188 int bin_nr=(int)ceil(rangev/bin_size);
189 if(verbose>1) printf(
"estimated_bin_nr := %d\n", bin_nr);
191 fprintf(stderr,
"Error: invalid number of bins.\n");
193 }
else if(bin_nr>10000) {
194 fprintf(stderr,
"Error: too many bins.\n");
202 fprintf(stderr,
"Error: cannot allocate memory for the histogram.\n");
215 if(minv<0.0) {
while(x>minv) x-=bin_size;}
216 else if(minv>0.0) {
while(x+bin_size<minv) x+=bin_size;}
218 hist.
x1[n]=x; hist.
x2[n]=hist.
x1[n]+bin_size;
220 while(x<=maxv && n<hist.
frameNr) {
222 hist.
x1[n]=x; hist.
x2[n]=hist.
x1[n]+bin_size;
228 for(
int i=0; i<hist.
frameNr; i++) hist.
x[i]=0.5*(hist.
x1[i]+hist.
x2[i]);
232 strcpy(hist.
voi[0].
name,
"static");
234 for(
int i=0; i<hist.
voiNr; i++) sprintf(hist.
voi[i].
name,
"fr%d", 1+i);
241 if(verbose>1) printf(
"computing histogram...\n");
243 int zi, yi, xi, ti, bi;
244 for(zi=0; zi<img.
dimz; zi++)
245 for(yi=0; yi<img.
dimy; yi++)
246 for(xi=0; xi<img.
dimx; xi++)
247 for(ti=0; ti<img.
dimt; ti++) {
248 if(positives && img.
m[zi][yi][xi][ti]<1.0E-010)
continue;
250 for(bi=bin_nr-1; bi>0; bi--) {
251 if(img.
m[zi][yi][xi][ti]>hist.
x1[bi]) {
252 hist.
voi[ti].
y[bi]+=1.0;
break;
255 if(bi==0) hist.
voi[ti].
y[0]+=1.0;
257 if(verbose>1) printf(
"included_pixel_nr := %lld\n", voxNr);
259 fprintf(stderr,
"Error: no positive voxel values.\n");
264 if(report_proportions) {
265 double c=1.0/(double)voxNr;
266 for(ti=0; ti<hist.
voiNr; ti++)
267 for(bi=0; bi<hist.
frameNr; bi++)
268 hist.
voi[ti].
y[bi]*=c;
278 if(!hisfile[0] && !svgfile[0]) {
279 printf(
"\nHistogram:\n"); fflush(stdout);
284 if(verbose>1) printf(
"writing %s\n", hisfile);
286 fprintf(stderr,
"Error in writing '%s': %s\n", hisfile,
dfterrmsg);
289 if(verbose>0) printf(
"Histogram written in %s\n", hisfile);
296 if(verbose>1) printf(
"saving SVG plot\n");
301 fprintf(stderr,
"Error: cannot plot histogram.\n");
307 ret=
plot_fit_svg(&hist, &hist2,
"", svgfile, verbose-8);
309 fprintf(stderr,
"Error: cannot plot the histogram.\n");
313 if(verbose>0) printf(
"Histogram plotted in %s\n", svgfile);
int atof_with_check(char *double_as_string, double *result_value)
int dftdup(DFT *dft1, DFT *dft2)
int dftSetmem(DFT *data, int frameNr, int voiNr)
int dftWrite(DFT *data, char *filename)
unsigned long long imgNaNs(IMG *img, int fix)
void imgEmpty(IMG *image)
int imgRead(const char *fname, IMG *img)
int imgMinMax(IMG *img, float *minvalue, float *maxvalue)
Header file for libtpccurveio.
#define DFT_TIME_STARTEND
Header file for libtpcimgio.
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 libtpcmodext.
int plot_fit_svg(DFT *dft1, DFT *dft2, char *main_title, char *fname, int verbose)
Header file for libtpcsvg.
char name[MAX_REGIONNAME_LEN+1]