15 "fault in calling routine",
29 memset(vol, 0,
sizeof(
VOL));
35 vol->
v=(
float***)NULL;
36 vol->
voxel=(
float*)NULL;
38 vol->
row=(
float**)NULL;
39 vol->
plane=(
float***)NULL;
52 if(svol==NULL)
return;
53 memset(svol, 0,
sizeof(
SVOL));
60 svol->
v=(
short int***)NULL;
61 svol->
voxel=(
short int*)NULL;
62 svol->
column=(
short int*)NULL;
63 svol->
row=(
short int**)NULL;
64 svol->
plane=(
short int***)NULL;
78 if(vol->_vxl!=NULL) free(vol->_vxl);
80 if(vol->_row!=NULL) free(vol->_row);
81 if(vol->_pln!=NULL) free(vol->_pln);
87 vol->
v=(
float***)NULL;
88 vol->
voxel=(
float*)NULL;
90 vol->
row=(
float**)NULL;
91 vol->
plane=(
float***)NULL;
104 if(
VOL_TEST) printf(
"svolEmpty()\n");
107 if(svol->_vxl!=NULL) free(svol->_vxl);
109 if(svol->_row!=NULL) free(svol->_row);
110 if(svol->_pln!=NULL) free(svol->_pln);
117 svol->
v=(
short int***)NULL;
118 svol->
voxel=(
short int*)NULL;
119 svol->
column=(
short int*)NULL;
120 svol->
row=(
short int**)NULL;
121 svol->
plane=(
short int***)NULL;
140 unsigned short int zi, ri;
144 if(
VOL_TEST) printf(
"voiAllocate(*vol, %d, %d, %d)\n", planes, rows, columns);
148 if(planes<1 || rows<1 || columns<1)
return(2);
149 vxlNr=planes*rows*columns;
153 if(planes==vol->
dimz && rows==vol->
dimy && columns==vol->
dimx) {
154 for(vi=0; vi<vxlNr; vi++) vol->_vxl[vi]=0;
161 vol->_pln=(
float***)malloc((
size_t)planes*
sizeof(
float**));
162 if(vol->_pln==NULL) {
164 vol->_row=(
float**)malloc((
size_t)planes*rows*
sizeof(
float*));
165 if(vol->_row==NULL) {
166 free(vol->_pln);
return(6);}
167 vol->_col=vol->_vxl=(
float*)calloc((
size_t)planes*rows*columns,
sizeof(
float));
168 if(vol->_vxl==NULL) {
169 free(vol->_pln); free(vol->_row);
return(8);
172 rptr=vol->_row; cptr=vol->_col;
173 for(zi=0; zi<planes; zi++) {
175 for(ri=0; ri<rows; ri++) {
176 *rptr++=cptr; cptr+=columns;
180 vol->
plane=vol->_pln;
183 vol->
voxel=vol->_vxl;
205 unsigned short int zi, ri;
207 short int **rptr, *cptr;
209 if(
VOL_TEST) printf(
"svoiAllocate(*svol, %d, %d, %d)\n", planes, rows, columns);
213 if(planes<1 || rows<1 || columns<1)
return(2);
214 vxlNr=planes*rows*columns;
218 if(planes==svol->
dimz && rows==svol->
dimy && columns==svol->
dimx) {
219 for(vi=0; vi<vxlNr; vi++) svol->_vxl[vi]=0;
226 svol->_pln=(
short int***)malloc((
size_t)planes*
sizeof(
short int**));
227 if(svol->_pln==NULL) {
229 svol->_row=(
short int**)malloc((
size_t)planes*rows*
sizeof(
short int*));
230 if(svol->_row==NULL) {
231 free(svol->_pln);
return(6);}
232 svol->_col=svol->_vxl=(
short int*)calloc((
size_t)planes*rows*columns,
sizeof(
short int));
233 if(svol->_vxl==NULL) {
234 free(svol->_pln); free(svol->_row);
return(8);
237 rptr=svol->_row; cptr=svol->_col;
238 for(zi=0; zi<planes; zi++) {
240 for(ri=0; ri<rows; ri++) {
241 *rptr++=cptr; cptr+=columns;
245 svol->
plane=svol->_pln;
247 svol->
row=svol->_row;
248 svol->
voxel=svol->_vxl;
269 unsigned short int zi, yi, xi, fi;
271 if(
VOL_TEST) printf(
"img2vol(img, %d, vol)\n", frame);
273 if(vol==NULL)
return(1);
276 if(frame<1 || img->dimt<frame)
return(2);
287 for(zi=0; zi<vol->
dimz; zi++)
288 for(yi=0; yi<vol->
dimy; yi++)
289 for(xi=0; xi<vol->
dimx; xi++)
290 vol->
v[zi][yi][xi]=img->
m[zi][yi][xi][fi];
307 unsigned short int zi, yi, xi, fi;
310 if(
VOL_TEST) printf(
"img2svol(img, %d, svol)\n", frame);
312 if(svol==NULL)
return(1);
315 if(frame<1 || img->dimt<frame)
return(2);
326 ret=
imgFrameMinMax(img, frame, &fmin, &fmax);
if(ret)
return(10+ret);
327 if(fabs(fmin)>fabs(fmax)) g=fabs(fmin);
else g=fabs(fmax);
328 if(g!=0) g=32766./g;
else g=1.0;
329 for(zi=0; zi<svol->
dimz; zi++)
330 for(yi=0; yi<svol->
dimy; yi++)
331 for(xi=0; xi<svol->
dimx; xi++)
332 svol->
v[zi][yi][xi]=(
short int)
temp_roundf(g*img->
m[zi][yi][xi][fi]);
352 unsigned short int zi, yi, xi, fi;
354 if(
VOL_TEST) printf(
"vol2img(vol, img, %d)\n", frame);
359 if(frame<1 || img->dimt<frame)
return(2);
365 for(zi=0; zi<vol->
dimz; zi++)
366 for(yi=0; yi<vol->
dimy; yi++)
367 for(xi=0; xi<vol->
dimx; xi++)
368 img->
m[zi][yi][xi][fi]=vol->
v[zi][yi][xi];
386 unsigned short int zi, yi, xi, fi;
388 if(
VOL_TEST) printf(
"svol2img(svol, img, %d)\n", frame);
393 if(frame<1 || img->dimt<frame)
return(2);
395 if(img->
dimz!=svol->
dimz)
return(4);
399 for(zi=0; zi<svol->
dimz; zi++)
400 for(yi=0; yi<svol->
dimy; yi++)
401 for(xi=0; xi<svol->
dimx; xi++)
402 img->
m[zi][yi][xi][fi]=(svol->
scale_factor)*(float)svol->
v[zi][yi][xi];
418 fprintf(fp,
"Volume data is not initialized.\n");
return;}
420 fprintf(fp,
"Volume data is initialized but empty.\n");
return;}
422 fprintf(fp,
"Volume status: %s\n", vol->
statmsg);
423 fprintf(fp,
"Patient orientation: %d\n", vol->
orientation);
424 fprintf(fp,
"Voxel sizes (x, y, z): %g %g %g mm\n",
426 fprintf(fp,
"Dimensions (x, y, z): %d %d %d\n",
440 if(
VOL_TEST) printf(
"svolInfo()\n");
442 fprintf(fp,
"Volume data is not initialized.\n");
return;}
444 fprintf(fp,
"Volume data is initialized but empty.\n");
return;}
446 fprintf(fp,
"Volume status: %s\n", svol->
statmsg);
447 fprintf(fp,
"Patient orientation: %d\n", svol->
orientation);
448 fprintf(fp,
"Voxel sizes (x, y, z): %g %g %g mm\n",
450 fprintf(fp,
"Dimensions (x, y, z): %d %d %d\n",
468 if(r.
z1<1 || r.
y1<1 || r.
x1<1)
return;
472 for(zi=r.
z1-1; zi<r.
z2; zi++) {
473 fprintf(fp,
"pl=%03d ", zi+1);
474 for(xi=r.
x1-1; xi<r.
x2; xi++) fprintf(fp,
" x=%05d", xi+1);
476 for(yi=r.
y1-1; yi<r.
y2; yi++) {
477 fprintf(fp,
"y=%05d", yi+1);
478 for(xi=r.
x1-1; xi<r.
x2; xi++)
479 fprintf(fp,
" %7.3f", vol->
v[zi][yi][xi]);
512 if(r->
z1<1 || r->
y1<1 || r->
x1<1)
return(2);
513 if(r->
z2<r->
z1 || r->
y2<r->
y1 || r->
x2<r->
x1)
return(3);
516 zi=r->
z1-1; yi=r->
y1-1; xi=r->
x1-1; lmax=lmin=vol->
v[zi][yi][xi];
517 if(maxp!=NULL) {maxp->
z=zi+1; maxp->
y=yi+1; maxp->
x=xi+1;}
518 if(minp!=NULL) {minp->
z=zi+1; minp->
y=yi+1; minp->
x=xi+1;}
519 for(zi=r->
z1-1; zi<r->z2; zi++) {
520 for(yi=r->
y1-1; yi<r->y2; yi++) {
521 for(xi=r->
x1-1; xi<r->x2; xi++) {
522 if(lmax<vol->v[zi][yi][xi]) {
523 lmax=vol->
v[zi][yi][xi];
524 if(maxp!=NULL) {maxp->
z=zi+1; maxp->
y=yi+1; maxp->
x=xi+1;}
525 }
else if(lmin>vol->
v[zi][yi][xi]) {
526 lmin=vol->
v[zi][yi][xi];
527 if(minp!=NULL) {minp->
z=zi+1; minp->
y=yi+1; minp->
x=xi+1;}
533 zi=yi=xi=0; lmax=lmin=vol->
v[zi][yi][xi];
534 if(maxp!=NULL) {maxp->
z=zi+1; maxp->
y=yi+1; maxp->
x=xi+1;}
535 if(minp!=NULL) {minp->
z=zi+1; minp->
y=yi+1; minp->
x=xi+1;}
536 for(zi=0; zi<vol->
dimz; zi++) {
537 for(yi=0; yi<vol->
dimy; yi++) {
538 for(xi=0; xi<vol->
dimx; xi++) {
539 if(lmax<vol->v[zi][yi][xi]) {
540 lmax=vol->
v[zi][yi][xi];
541 if(maxp!=NULL) {maxp->
z=zi+1; maxp->
y=yi+1; maxp->
x=xi+1;}
542 }
else if(lmin>vol->
v[zi][yi][xi]) {
543 lmin=vol->
v[zi][yi][xi];
544 if(minp!=NULL) {minp->
z=zi+1; minp->
y=yi+1; minp->
x=xi+1;}
550 if(maxv!=NULL) *maxv=lmax;
551 if(minv!=NULL) *minv=lmin;
574 if(r->
z1<1 || r->
y1<1 || r->
x1<1)
return(2);
575 if(r->
z2<r->
z1 || r->
y2<r->
y1 || r->
x2<r->
x1)
return(3);
581 for(zi=r->
z1-1; zi<r->z2; zi++) {
582 for(yi=r->
y1-1; yi<r->y2; yi++) {
583 for(xi=r->
x1-1; xi<r->x2; xi++) {
584 *avg+=vol->
v[zi][yi][xi]; n++;
589 for(zi=0; zi<vol->
dimz; zi++) {
590 for(yi=0; yi<vol->
dimy; yi++) {
591 for(xi=0; xi<vol->
dimx; xi++) {
592 *avg+=vol->
v[zi][yi][xi]; n++;
597 if(n>0) *avg/=(float)n;
614 if(vol_range==NULL)
return 1;
616 if(vol_range->
x1<0 || vol_range->
x2<0)
return 2;
617 if(vol_range->
x2<vol_range->
x1) {
618 i=vol_range->
x1; vol_range->
x1=vol_range->
x2; vol_range->
x2=i;}
619 if(vol_range->
y1<0 || vol_range->
y2<0)
return 3;
620 if(vol_range->
y2<vol_range->
y1) {
621 i=vol_range->
y1; vol_range->
y1=vol_range->
y2; vol_range->
y2=i;}
622 if(vol_range->
z1<0 || vol_range->
z2<0)
return 4;
623 if(vol_range->
z2<vol_range->
z1) {
624 i=vol_range->
z1; vol_range->
z1=vol_range->
z2; vol_range->
z2=i;}
640 if(vol_range==NULL)
return(0);
641 z=1+vol_range->
z2-vol_range->
z1;
642 x=1+vol_range->
x2-vol_range->
x1;
643 y=1+vol_range->
y2-vol_range->
y1;
663 char *cptr, tmp[256];
665 strncpy(tmp, str, 255); tmp[255]=(char)0;
666 cptr=strtok(tmp,
" ,;:()|-");
if(cptr==NULL)
return 1;
667 *x=atoi(cptr);
if(*x<1)
return 1;
668 cptr=strtok(NULL,
" ,;:()|-");
if(cptr==NULL)
return 2;
669 *y=atoi(cptr);
if(*y<1)
return 1;
670 cptr=strtok(NULL,
" ,;:()|-");
if(cptr==NULL)
return 3;
671 *z=atoi(cptr);
if(*z<1)
return 1;
697 if(status!=NULL) strcpy(status,
"invalid VOL struct");
701 if(r->
z1<1 || r->
y1<1 || r->
x1<1 ||
704 if(status!=NULL) strcpy(status,
"invalid volume range");
707 if(isnan(in) && isnan(out)) {
708 if(status!=NULL) strcpy(status,
"new values not given");
714 for(zi=r->
z1-1; zi<r->z2; zi++)
715 for(yi=r->
y1-1; yi<r->y2; yi++)
716 for(xi=r->
x1-1; xi<r->x2; xi++)
717 vol->
v[zi][yi][xi]=in;
721 for(zi=1; zi<=vol->
dimz; zi++)
722 for(yi=1; yi<=vol->
dimy; yi++)
723 for(xi=1; xi<=vol->
dimx; xi++) {
724 if(zi>=r->
z1 && zi<=r->z2 &&
725 yi>=r->
y1 && yi<=r->y2 &&
726 xi>=r->
x1 && xi<=r->x2)
728 vol->
v[zi-1][yi-1][xi-1]=out;
732 if(status!=NULL) strcpy(status,
"ok");
752 int ret, ii, x, y, z;
757 if(vrdfile==NULL || strlen(vrdfile)<1 || vol_range==NULL) {
758 if(status!=NULL) strcpy(status,
"program error");
763 if(status!=NULL) strcpy(status, ift.
status);
767 strcpy(key,
"corner1"); ii=
iftGet(&ift, key, 0);
771 vol_range->
x1=x; vol_range->
y1=y; vol_range->
z1=z;
772 strcpy(key,
"corner2"); ii=
iftGet(&ift, key, 0);
775 vol_range->
x2=x; vol_range->
y2=y; vol_range->
z2=z;
778 if(status!=NULL) strcpy(status,
"ok");
786 for(ii=0, ret=0; ii<ift.
keyNr; ii++) {
789 vol_range->
x1=x; vol_range->
y1=y; vol_range->
z1=z;
794 vol_range->
x2=x; vol_range->
y2=y; vol_range->
z2=z;
799 if(status!=NULL) strcpy(status,
"volume definitions not found");
804 if(status!=NULL) strcpy(status,
"ok");
int iftRead(IFT *ift, char *filename, int is_key_required, int verbose)
int iftGet(IFT *ift, char *key, int verbose)
int imgFrameMinMax(IMG *img, int frame, float *minvalue, float *maxvalue)
Header file for libtpcimgio.
#define IMG_STATUS_OCCUPIED
#define IMG_STATUS_INITIALIZED
#define IMG_STATUS_UNINITIALIZED
char * _volStatusMessage[]
int string_to_xyz(char *str, int *x, int *y, int *z)
void svolInit(SVOL *svol)
void volContents(VOL *vol, VOL_RANGE r, FILE *fp)
int vrdReorder(VOL_RANGE *vol_range)
int svolAllocate(SVOL *svol, int planes, int rows, int columns)
void svolEmpty(SVOL *svol)
int volMax(VOL *vol, VOL_RANGE *r, VOL_PIXEL *maxp, float *maxv, VOL_PIXEL *minp, float *minv)
int svol2img(SVOL *svol, IMG *img, int frame)
int volAllocate(VOL *vol, int planes, int rows, int columns)
void volInfo(VOL *vol, FILE *fp)
int vrdVxlNr(VOL_RANGE *vol_range)
void svolInfo(SVOL *svol, FILE *fp)
int img2vol(IMG *img, VOL *vol, int frame)
int img2svol(IMG *img, SVOL *svol, int frame)
int vrdRead(char *vrdfile, VOL_RANGE *vol_range, char *status)
int volAvg(VOL *vol, VOL_RANGE *r, float *avg)
int vrd2vol(VOL_RANGE *r, VOL *vol, float in, float out, char *status)
int vol2img(VOL *vol, IMG *img, int frame)