11static const char *imgmsg[] = {
13 "fault in calling routine",
16 "unknown file format",
17 "unsupported file type",
18 "missing matrix/matrices",
19 "no permission to write",
21 "cannot read matrix list",
22 "invalid matrix list",
23 "variable matrix size",
24 "cannot read mainheader",
25 "cannot read subheader",
27 "axial compression is not supported",
28 "image datafile does not exist",
29 "header file does not exist",
30 "invalid header contents",
31 "cannot read image data",
32 "cannot read sif data",
34 "cannot write image datafile",
35 "cannot write header file",
40 "polar map is not supported",
46static const char *_imgStatusMessage[] =
49 "fault in calling routine",
65 if(image==NULL)
return;
66 memset(image, 0,
sizeof(
IMG));
89 for(
int i=0; i<18; i++) image->
quatern[i]=0.0;
90 for(
int i=0; i<12; i++) image->
mt[i]=0.0;
102 image->
m=(
float****)NULL;
103 image->_header=(
float*)NULL;
104 image->
pixel=(
float*)NULL;
105 image->
column=(
float**)NULL;
106 image->
row=(
float***)NULL;
107 image->
plane=(
float****)NULL;
125 if(
IMG_TEST) printf(
"imgEmpty()\n");
128 if(image->_pxl!=NULL) free(image->_pxl);
129 if(image->_col!=NULL) free(image->_col);
130 if(image->_row!=NULL) free(image->_row);
131 if(image->_pln!=NULL) free(image->_pln);
133 if(image->
dimt>0) free(image->_header);
158 for(
int i=0; i<18; i++) image->
quatern[i]=0.0;
159 for(
int i=0; i<12; i++) image->
mt[i]=0.0;
169 image->
m=(
float****)NULL;
170 image->_header=(
float*)NULL;
171 image->
pixel=(
float*)NULL;
172 image->
column=(
float**)NULL;
173 image->
row=(
float***)NULL;
174 image->
plane=(
float****)NULL;
178 image->
weight=image->
sd=(
float*)NULL;
206 if(
IMG_TEST) printf(
"imgAllocate(*image, %d, %d, %d, %d)\n", planes, rows, columns, frames);
208 if(image==NULL)
return(1);
211 if(planes<1 || rows<1 || columns<1 || frames<1)
return(2);
215 image->_header=(
float*)calloc(8*frames,
sizeof(
float));
216 if(image->_header==NULL)
return(3);
217 image->
planeNumber=(
int*)calloc(planes,
sizeof(
int));
218 if(image->
planeNumber==NULL) {free(image->_header);
return(4);}
220 image->_pln=(
float****)calloc((
size_t)planes,
sizeof(
float***));
221 if(image->_pln==NULL) {
225 image->_row=(
float***)calloc((
size_t)planes*rows,
sizeof(
float**));
226 if(image->_row==NULL) {
228 free(image->_pln);
return(6);
230 image->_col=(
float**)calloc((
size_t)planes*rows*columns,
sizeof(
float*));
231 if(image->_col==NULL) {
233 free(image->_pln); free(image->_row);
return(7);
235 image->_pxl=(
float*)calloc((
size_t)planes*rows*columns*frames,
sizeof(
float));
236 if(image->_pxl==NULL) {
238 free(image->_pln); free(image->_row); free(image->_col);
return(8);
241 float ***rptr, **cptr, *pptr;
242 rptr=image->_row; cptr=image->_col; pptr=image->_pxl;
243 for(
unsigned short int zi=0; zi<planes; zi++) {
244 image->_pln[zi]=rptr;
245 for(
unsigned short int ri=0; ri<rows; ri++) {
247 for(
unsigned short int ci=0; ci<columns; ci++) {
248 *cptr++=pptr; pptr+=frames;
252 image->
m=image->_pln;
253 image->
plane=image->_pln;
254 image->
column=image->_col;
255 image->
row=image->_row;
256 image->
pixel=image->_pxl;
258 image->
start= image->_header+0*frames;
259 image->
end= image->_header+1*frames;
260 image->
mid= image->_header+2*frames;
261 image->
weight= image->_header+3*frames;
262 image->
sd= image->_header+4*frames;
263 image->
prompts= image->_header+5*frames;
264 image->
randoms= image->_header+6*frames;
267 image->
dimz=planes; image->
dimy=rows; image->
dimx=columns; image->
dimt=frames;
294 ret=
imgAllocate(image, planes, rows, columns, frames);
if(ret)
return ret;
295 ret=
imgCopyhdr(image_from, image);
return ret;
310 if(img1==NULL || img2==NULL)
return(1);
315 if(ret!=0)
return(10+ret);
318 for(
unsigned long long int i=0; i<n; i++) img2->
pixel[i]=img1->
pixel[i];
332 while(imgmsg[n]!=0) n++;
333 if(status_index<0 || status_index>n-1)
return((
char*)imgmsg[STATUS_FAULT]);
334 else return((
char*)imgmsg[status_index]);
348 if(img==NULL)
return;
349 while(imgmsg[n]!=0) n++;
350 if(status_index<0 || status_index>n-1) img->
errstatus=STATUS_FAULT;
367 fprintf(stdout,
"image := NULL\n");
return;
369 fprintf(stdout,
"image_status := not initialized\n");
return;
371 fprintf(stdout,
"image_status := initialized but empty\n");
373 fprintf(stdout,
"image_status := error\n");
375 fprintf(stdout,
"image_error_status := %s\n", image->
statmsg);
376 fprintf(stdout,
"image_type := %d\n", image->
type);
377 fprintf(stdout,
"saved_data_type := %d\n", image->
_dataType);
378 fprintf(stdout,
"file_format := %d\n", image->
_fileFormat);
379 fprintf(stdout,
"scanner := %d\n", image->
scanner);
380 fprintf(stdout,
"modality := %d\n", image->
modality);
382 fprintf(stdout,
"qform := %d\n", image->
xform[0]);
383 fprintf(stdout,
"sform := %d\n", image->
xform[1]);
384 fprintf(stdout,
"quatern_b := %g\n", image->
quatern[0]);
385 fprintf(stdout,
"quatern_c := %g\n", image->
quatern[1]);
386 fprintf(stdout,
"quatern_d := %g\n", image->
quatern[2]);
387 fprintf(stdout,
"quatern_x_shift := %g\n", image->
quatern[3]);
388 fprintf(stdout,
"quatern_y_shift := %g\n", image->
quatern[4]);
389 fprintf(stdout,
"quatern_z_shift := %g\n", image->
quatern[5]);
390 for(
int i=0; i<4; i++)
391 fprintf(stdout,
"srow_x[%d] := %g\n", 1+i, image->
quatern[6+i]);
392 for(
int i=0; i<4; i++)
393 fprintf(stdout,
"srow_y[%d] := %g\n", 1+i, image->
quatern[10+i]);
394 for(
int i=0; i<4; i++)
395 fprintf(stdout,
"srow_z[%d] := %g\n", 1+i, image->
quatern[14+i]);
396 for(
int i=0; i<12; i++)
397 fprintf(stdout,
"matrix_transformation[%d] := %g\n", 1+i, image->
mt[i]);
399 fprintf(stdout,
"ift.keyNr := %d\n", image->
ift.
keyNr);
400 fprintf(stdout,
"identification_code := %.*s\n",
402 fprintf(stdout,
"data_unit := %s\n",
imgUnit((
int)image->
unit));
403 fprintf(stdout,
"image_zoom := %g\n", image->
zoom);
405 fprintf(stdout,
"isotope_halflife := %e [sec]\n", image->
isotopeHalflife);
409 fprintf(stdout,
"scan_start_time := %s\n", buf);
410 fprintf(stdout,
"patient_name := %s\n", image->
patientName);
411 fprintf(stdout,
"patient_id := %s\n", image->
patientID);
412 fprintf(stdout,
"patient_orientation := %d\n", image->
orientation);
413 fprintf(stdout,
"FOV_axial := %g [mm]\n", image->
axialFOV);
414 fprintf(stdout,
"FOV_transaxial := %g [mm]\n", image->
transaxialFOV);
415 fprintf(stdout,
"sample_distance := %g [mm]\n", image->
sampleDistance);
416 fprintf(stdout,
"pixel_size_x := %g [mm]\n", image->
sizex);
417 fprintf(stdout,
"pixel_size_y := %g [mm]\n", image->
sizey);
418 fprintf(stdout,
"pixel_size_z := %g [mm]\n", image->
sizez);
419 fprintf(stdout,
"dimension_x := %d\n", image->
dimx);
420 fprintf(stdout,
"dimension_y := %d\n", image->
dimy);
421 fprintf(stdout,
"dimension_z := %d\n", image->
dimz);
422 fprintf(stdout,
"dimension_t := %d\n", image->
dimt);
426 fprintf(stdout,
"polarmap_sectors_per_ring :=");
429 fprintf(stdout,
"\n");
430 fprintf(stdout,
"polarmap_ring_position :=");
433 fprintf(stdout,
"\n");
434 fprintf(stdout,
"polarmap_ring_angle :=");
437 fprintf(stdout,
"\n");
443 fprintf(stdout,
"actual_plane_numbers := %d", image->
planeNumber[0]);
444 for(
int i=1; i<image->
dimz; i++) fprintf(stdout,
" %d", image->
planeNumber[i]);
445 fprintf(stdout,
"\n");
446 fprintf(stdout,
"Frame times (sec):\n");
447 for(
int i=0; i<image->
dimt; i++) fprintf(stdout,
" %e %e %e\n",
449 if(image->
isWeight) fprintf(stdout,
"Frames are weighted.\n");
450 else fprintf(stdout,
"Frames are not weighted.\n");
452 fprintf(stdout,
"Decay correction factors for each frame:\n");
453 for(
int i=0; i<image->
dimt; i++)
456 fprintf(stdout,
"Image is not decay corrected.\n");
477 if(
IMG_TEST) printf(
"imgCopyhdr()\n");
479 if(image1==NULL || image2==NULL)
return(1);
480 if(image1==image2)
return(2);
513 for(
int i=0; i<2; i++) image2->
xform[i]=image1->
xform[i];
515 for(
int i=0; i<12; i++) image2->
mt[i]=image1->
mt[i];
524 if(image1->
dimz==image2->
dimz)
for(
int i=0; i<image1->
dimz; i++) {
527 if(image1->
dimt==image2->
dimt)
for(
int i=0; i<image1->
dimt; i++) {
529 image2->
mid[i]=image1->
mid[i];
556 int zi, yi, xi, fi, zj, yj, xj, fj;
559 printf(
"imgExtractRange(*img1, r, *img2)\n");
560 printf(
" z=[%d,%d] y=[%d,%d] x=[%d,%d] f=[%d,%d]\n",
564 if(img2==NULL)
return(1);
else imgSetStatus(img2, STATUS_FAULT);
579 if(
imgAllocate(img2, zi, yi, xi, fi)!=0)
return(2);
584 for(fi=r.
f1-1, fj=0; fi<r.
f2; fi++, fj++) {
586 img2->
end[fj]=img1->
end[fi];
587 img2->
mid[fj]=img1->
mid[fi];
589 img2->
sd[fj]=img1->
sd[fi];
594 for(zi=r.
z1-1, zj=0; zi<r.
z2; zi++, zj++) {
597 for(zi=r.
z1-1, zj=0; zi<r.
z2; zi++, zj++)
598 for(yi=r.
y1-1, yj=0; yi<r.
y2; yi++, yj++)
599 for(xi=r.
x1-1, xj=0; xi<r.
x2; xi++, xj++)
600 for(fi=r.
f1-1, fj=0; fi<r.
f2; fi++, fj++)
601 img2->
m[zj][yj][xj][fj]=img1->
m[zi][yi][xi][fi];
618 for(
int fi=0; fi<img->
dimt; fi++)
if(img->
end[fi]>0.00000001)
return 1;
639 if(img->
prompts[0]>0.00000001) p=1;
640 if(img->
randoms[0]>0.00000001) r=2;
644 for(
int fi=1; fi<img->
dimt; fi++) {
664 if(img==NULL)
return(0);
665 unsigned long long n=0;
666 for(
int zi=0; zi<img->
dimz; zi++) {
667 for(
int yi=0; yi<img->
dimy; yi++) {
668 for(
int xi=0; xi<img->
dimx; xi++) {
669 for(
int ti=0; ti<img->
dimt; ti++) {
670 if(!isfinite(img->
m[zi][yi][xi][ti])) {
672 if(fix!=0) img->
m[zi][yi][xi][ti]=0.0;
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 iftdup(IFT *ift1, IFT *ift2, int verbose)
int imgExistentTimes(IMG *img)
unsigned long long imgNaNs(IMG *img, int fix)
int imgExtractRange(IMG *img1, IMG_RANGE r, IMG *img2)
int imgExistentCounts(IMG *img)
char * imgStatus(int status_index)
int imgAllocate(IMG *image, int planes, int rows, int columns, int frames)
int imgCopyhdr(IMG *image1, IMG *image2)
int imgAllocateWithHeader(IMG *image, int planes, int rows, int columns, int frames, IMG *image_from)
void imgSetStatus(IMG *img, int status_index)
int imgDup(IMG *img1, IMG *img2)
void imgEmpty(IMG *image)
char * imgUnit(int dunit)
Header file for libtpcimgio.
#define NIFTI_XFORM_UNKNOWN
#define IMG_STATUS_OCCUPIED
#define IMG_STATUS_INITIALIZED
#define IMG_STATUS_UNINITIALIZED
#define MAX_POLARMAP_NUM_RINGS
char studyDescription[32]
short int polarmap_start_angle
int polarmap_sectors_per_ring[MAX_POLARMAP_NUM_RINGS]
char radiopharmaceutical[32]
short int polarmap_ring_angle[MAX_POLARMAP_NUM_RINGS]
char studyNr[MAX_STUDYNR_LEN+1]
float polarmap_ring_position[MAX_POLARMAP_NUM_RINGS]