78 int i, j, m, ret, blkNr=0, dim_x=0, dim_y=0, pxlNr=0;
79 int frameNr, planeNr, del_nr=0;
80 int frame, plane, prev_frame, prev_plane, seqplane;
92 char *mdata=NULL, *mptr;
97 if(
IMG_TEST) printf(
"ecat63ReadAllToImg(%s, *img)\n", fname);
105 if((fp=fopen(fname,
"rb")) == NULL) {
131 tmpMatdir=mlist.
matdir[i];
136 printf(
"matrix list after sorting:\n");
144 printf(
" %d entries in matrix list will not be used.\n", del_nr);
149 prev_plane=plane=-1; prev_frame=frame=-1; frameNr=planeNr=0; ret=0;
155 else frame=matval.
gate;
156 if(
IMG_TEST>2) printf(
"frame=%d plane=%d\n", frame, plane);
158 if(plane!=prev_plane) {
159 frameNr=1; planeNr++;
163 if(prev_frame>0 && frame!=prev_frame+1) {ret=1;
break;}
165 prev_plane=plane; prev_frame=frame;
173 if(
IMG_TEST) printf(
"frameNr=%d planeNr=%d\n", frameNr, planeNr);
174 if(ret==1 || (frameNr*planeNr != mlist.
matrixNr-del_nr)) {
204 if(
IMG_TEST>1) printf(
"allocating memory for %d blocks\n", blkNr);
205 mdata=(
char*)malloc(blkNr*
MatBLKSIZE);
if(mdata==NULL) {
210 ret=
imgAllocate(img, planeNr, dim_y, dim_x, frameNr);
221 memset(&scanStart, 0,
sizeof(
struct tm));
224 scanStart.tm_mday=main_header.
scan_start_day; scanStart.tm_yday=0;
228 scanStart.tm_isdst=-1;
265 prev_plane=plane=-1; seqplane=-1;
271 if(plane!=prev_plane) {seqplane++; frame=1;}
else frame++;
286 img->
mid[frame-1]=0.5*(img->
start[frame-1]+img->
end[frame-1]);
297 img->
mid[frame-1]=0.5*(img->
start[frame-1]+img->
end[frame-1]);
327 for(i=0, mptr=mdata; i<dim_y; i++)
for(j=0; j<dim_x; j++, mptr++) {
328 img->
m[seqplane][i][j][frame-1]=scale*(float)(*mptr);
331 for(i=0, mptr=mdata; i<dim_y; i++)
for(j=0; j<dim_x; j++, mptr+=2) {
332 sptr=(
short int*)mptr;
333 img->
m[seqplane][i][j][frame-1]=scale*(float)(*sptr);
336 for(i=0, mptr=mdata; i<dim_y; i++)
for(j=0; j<dim_x; j++, mptr+=4) {
338 img->
m[seqplane][i][j][frame-1]=1.0;
341 for(i=0, mptr=mdata; i<dim_y; i++)
for(j=0; j<dim_x; j++, mptr+=4) {
342 memcpy(&img->
m[seqplane][i][j][frame-1], mptr, 4);
343 img->
m[seqplane][i][j][frame-1]*=scale;
375 int frame, plane, n, i, j, m, ret=0;
376 float f, fmax, fmin, g, scale;
377 short int *sdata, *sptr, smin, smax;
382 struct tm *scanStart;
385 if(
IMG_TEST) printf(
"ecat63WriteAllImg(%s, *img)\n", fname);
387 if(fname==NULL) {strcpy(
ecat63errmsg,
"invalid ECAT filename");
return(1);}
389 strcpy(
ecat63errmsg,
"image data is empty");
return(2);}
415 if(scanStart!=NULL) {
440 sdata=(
short int*)malloc(img->
dimx*img->
dimy*
sizeof(
short int));
441 if(sdata==NULL) {strcpy(
ecat63errmsg,
"out of memory");
return(4);}
445 if(fp==NULL) {strcpy(
ecat63errmsg,
"cannot write ECAT file");
return(3);}
483 for(plane=1; plane<=img->
dimz; plane++)
for(frame=1; frame<=img->
dimt; frame++) {
486 fmin=fmax=f=img->
m[plane-1][0][0][frame-1];
487 for(i=0; i<img->
dimy; i++)
for(j=0; j<img->
dimx; j++) {
488 f=img->
m[plane-1][i][j][frame-1];
489 if(f>fmax) fmax=f;
else if(f<fmin) fmin=f;
492 if(fabs(fmin)>fabs(fmax)) g=fabs(fmin);
else g=fabs(fmax);
493 if(g!=0) scale=32766./g;
else scale=1.0;
497 for(i=0; i<img->
dimy; i++)
for(j=0; j<img->
dimx; j++) {
498 *sptr=(
short int)temp_roundf(scale*img->
m[plane-1][i][j][frame-1]);
502 smin=(
short int)temp_roundf(scale*fmin); smax=(
short int)temp_roundf(scale*fmax);
508 (int)temp_roundf(1000.*(img->
end[frame-1]-img->
start[frame-1]));
517 (int)temp_roundf(1000.*(img->
end[frame-1]-img->
start[frame-1]));
526 if(
IMG_TEST) printf(
" writing matnum=%d\n", m);
535 sprintf(
ecat63errmsg,
"cannot write data on pl%02d fr%02d (%d).",
537 fclose(fp); remove(fname); free(sdata);
542 if(
IMG_TEST) printf(
" %d matrices written in %s\n", n, fname);
545 fclose(fp); free(sdata);
569 int i, j, m, ret, blkNr=0, dim_x=0, dim_y=0, pxlNr=0, del_nr=0;
570 int frameNr, planeNr, datatype=0, firstm=0, isFirst=0;
571 int frame, plane, prev_frame, prev_plane, prev_frameNr=0;
583 char *mdata=NULL, *mptr;
588 if(
IMG_TEST) printf(
"ecat63ReadPlaneToImg(%s, *img)\n", fname);
590 if(fname==NULL) {strcpy(
ecat63errmsg,
"invalid ECAT filename");
return(2);}
592 strcpy(
ecat63errmsg,
"image data not initialized");
return(2);}
595 if((fp=fopen(fname,
"rb")) == NULL) {
596 strcpy(
ecat63errmsg,
"cannot open ECAT file");
return(3);}
600 sprintf(
ecat63errmsg,
"cannot read main header (%d)", ret);
601 fclose(fp);
return(4);
609 sprintf(
ecat63errmsg,
"cannot read matrix list (%d)", ret);
610 fclose(fp);
return(5);
613 strcpy(
ecat63errmsg,
"matrix list is empty"); fclose(fp);
return(5);}
617 tmpMatdir=mlist.
matdir[i];
625 printf(
" %d entries in matrix list will not be used.\n", del_nr);
631 isFirst=0; prev_frameNr=img->
dimt;
644 if(matval.
plane>prev_plane) {plane=matval.
plane;
break;}
650 sprintf(
ecat63errmsg,
"ECAT file contains no matrices");
653 sprintf(
ecat63errmsg,
"ECAT file contains no more planes");
658 if(
IMG_TEST) printf(
"Next plane to read: %d\n", plane);
663 prev_frame=frame=-1; frameNr=0; ret=0; planeNr=1;
667 if(matval.
plane<plane)
continue;
else if(matval.
plane>plane)
break;
669 else frame=matval.
gate;
672 if(prev_frame>0 && frame!=prev_frame+1) {ret=1;
break;}
692 if(!isFirst && frameNr!=prev_frameNr) {
693 strcpy(
ecat63errmsg,
"different frame nr in different planes");
718 if(
IMG_TEST) printf(
"allocating memory for %d blocks\n", blkNr);
719 mdata=(
char*)malloc(blkNr*
MatBLKSIZE);
if(mdata==NULL) {
724 ret=
imgAllocate(img, planeNr, dim_y, dim_x, frameNr);
735 memset(&scanStart, 0,
sizeof(
struct tm));
738 scanStart.tm_mday=main_header.
scan_start_day; scanStart.tm_yday=0;
742 scanStart.tm_isdst=-1;
782 if(matval.
plane>plane)
break;
795 img->
mid[frame-1]=0.5*(img->
start[frame-1]+img->
end[frame-1]);
806 img->
mid[frame-1]=0.5*(img->
start[frame-1]+img->
end[frame-1]);
826 if(
IMG_TEST>2) printf(
"scale=%e datatype=%d\n", scale, datatype);
836 for(i=0, mptr=mdata; i<dim_y; i++)
for(j=0; j<dim_x; j++, mptr++) {
837 img->
m[0][i][j][frame-1]=scale*(float)(*mptr);
840 for(i=0, mptr=mdata; i<dim_y; i++)
for(j=0; j<dim_x; j++, mptr+=2) {
841 sptr=(
short int*)mptr;
842 img->
m[0][i][j][frame-1]=scale*(float)(*sptr);
845 for(i=0, mptr=mdata; i<dim_y; i++)
for(j=0; j<dim_x; j++, mptr+=4) {
847 img->
m[0][i][j][frame-1]=scale*(float)(*iptr);
850 for(i=0, mptr=mdata; i<dim_y; i++)
for(j=0; j<dim_x; j++, mptr+=4) {
851 memcpy(&img->
m[0][i][j][frame-1], mptr, 4);
852 img->
m[0][i][j][frame-1]*=scale;
887 int n, i, j, m, ret=0, add=0;
888 int frameNr, planeNr;
889 int frame, plane, prev_frame, prev_plane;
890 float f, fmax, fmin, g, scale;
891 short int *sdata, *sptr, smin, smax;
899 struct tm *scanStart;
902 if(
IMG_TEST) printf(
"ecat63AddImg(%s, *img)\n", fname);
905 if(fname==NULL) {strcpy(
ecat63errmsg,
"invalid ECAT filename");
return(1);}
907 strcpy(
ecat63errmsg,
"image data is empty");
return(2);}
933 if(scanStart!=NULL) {
957 if(access(fname, 0) != -1) {
958 if(
IMG_TEST) printf(
"Opening existing ECAT file.\n");
961 if((fp=fopen(fname,
"rb+")) == NULL) {
962 strcpy(
ecat63errmsg,
"cannot create ECAT file");
return(3);}
965 sprintf(
ecat63errmsg,
"cannot read main header (%d)", ret);
966 fclose(fp);
return(3);
975 fclose(fp);
return(3);
978 if(
IMG_TEST) printf(
"ECAT file does not exist.\n");
982 if(fp==NULL) {strcpy(
ecat63errmsg,
"cannot create ECAT file");
return(3);}
987 sdata=(
short int*)malloc(img->
dimx*img->
dimy*
sizeof(
short int));
988 if(sdata==NULL) {strcpy(
ecat63errmsg,
"out of memory");
return(4);}
1027 for(plane=1; plane<=img->
dimz; plane++)
for(frame=1; frame<=img->
dimt; frame++) {
1030 fmin=fmax=f=img->
m[plane-1][0][0][frame-1];
1031 for(i=0; i<img->
dimy; i++)
for(j=0; j<img->
dimx; j++) {
1032 f=img->
m[plane-1][i][j][frame-1];
1033 if(f>fmax) fmax=f;
else if(f<fmin) fmin=f;
1036 if(fabs(fmin)>fabs(fmax)) g=fabs(fmin);
else g=fabs(fmax);
1037 if(g!=0) scale=32766./g;
else scale=1.0;
1041 for(i=0; i<img->
dimy; i++)
for(j=0; j<img->
dimx; j++) {
1042 *sptr=(
short int)temp_roundf(scale*img->
m[plane-1][i][j][frame-1]);
1046 smin=(
short int)temp_roundf(scale*fmin); smax=(
short int)temp_roundf(scale*fmax);
1052 (int)temp_roundf(1000.*(img->
end[frame-1]-img->
start[frame-1]));
1060 (int)temp_roundf(1000.*(img->
end[frame-1]-img->
start[frame-1]));
1068 if(
IMG_TEST) printf(
" writing matnum=%d\n", m);
1077 sprintf(
ecat63errmsg,
"cannot write data on pl%02d fr%02d (%d).",
1079 fclose(fp); remove(fname); free(sdata);
1084 if(
IMG_TEST) printf(
" %d matrices written in %s\n", n, fname);
1096 sprintf(
ecat63errmsg,
"cannot read matrix list (%d)", ret);
1097 fclose(fp);
return(21);
1100 strcpy(
ecat63errmsg,
"matrix list is empty"); fclose(fp);
return(21);}
1104 tmpMatdir=mlist.
matdir[i];
1109 prev_plane=plane=-1; prev_frame=frame=-1; frameNr=planeNr=0;
1113 if(plane!=prev_plane) {frameNr=1; planeNr++;}
else {frameNr++;}
1114 prev_plane=plane; prev_frame=frame;
1121 sprintf(
ecat63errmsg,
"cannot write mainheader (%d)", ret);
1122 fclose(fp);
return(22);
1141 if(h==NULL)
return(0);
1158 struct tm scanStart;
1167 memset(&scanStart, 0,
sizeof(
struct tm));
1174 scanStart.tm_isdst=-1;
1209 struct tm *scanStart;
1228 if(scanStart!=NULL) {
1290 int m, blkNr=0, ret=0;
1291 int frameNr, planeNr, del_nr=0;
1301 if(
IMG_TEST) printf(
"\nimgReadEcat63Header(%s, *img)\n", fname);
1425 if(
IMG_TEST) printf(
"\nimgReadEcat63FirstFrame(%s, *img)\n", fname);
1465 int m, ret=0, blkNr=0, frame, plane, seqplane=-1, xi, yi;
1466 int local_data_type=0;
1477 char *mdata=NULL, *mptr;
1481 if(
IMG_TEST) printf(
"\nimgReadEcat63Frame(%s, %d, *img, %d)\n",
1482 fname, frame_to_read, frame_index);
1513 if(
IMG_TEST>6) printf(
"allocating memory for %d blocks\n", blkNr);
1524 else frame=matval.
gate;
1525 if(frame!=frame_to_read)
continue;
1535 if(
IMG_TEST>4) printf(
"reading subheader for matrix %d,%d\n", frame, plane);
1545 img->
mid[frame_index]=0.5*(img->
start[frame_index]+img->
end[frame_index]);
1555 img->
mid[frame_index]=0.5*(img->
start[frame_index]+img->
end[frame_index]);
1576 if(
IMG_TEST>4) printf(
"reading matrix data\n");
1579 mdata, local_data_type);
1584 if(
IMG_TEST>4) printf(
"converting matrix data to floats\n");
1586 for(yi=0, mptr=mdata; yi<img->
dimy; yi++)
1587 for(xi=0; xi<img->
dimx; xi++, mptr++) {
1588 img->
m[seqplane][yi][xi][frame_index]=scale*(float)(*mptr);
1590 }
else if(local_data_type==
VAX_I2 || local_data_type==
SUN_I2) {
1591 for(yi=0, mptr=mdata; yi<img->
dimy; yi++)
1592 for(xi=0; xi<img->
dimx; xi++, mptr+=2) {
1593 sptr=(
short int*)mptr;
1594 img->
m[seqplane][yi][xi][frame_index]=scale*(float)(*sptr);
1596 }
else if(local_data_type==
VAX_I4 || local_data_type==
SUN_I4) {
1597 for(yi=0, mptr=mdata; yi<img->
dimy; yi++)
1598 for(xi=0; xi<img->
dimx; xi++, mptr+=4) {
1600 img->
m[seqplane][yi][xi][frame_index]=1.0;
1602 }
else if(local_data_type==
VAX_R4 || local_data_type==
IEEE_R4) {
1603 for(yi=0, mptr=mdata; yi<img->
dimy; yi++)
1604 for(xi=0; xi<img->
dimx; xi++, mptr+=4) {
1605 memcpy(&img->
m[seqplane][yi][xi][frame_index], mptr, 4);
1606 img->
m[seqplane][yi][xi][frame_index]*=scale;
1610 if(
IMG_TEST>3) printf(
"end of matrices.\n");
1617 if(
IMG_TEST>4) printf(
"last_seqplane := %d.\n", seqplane);
1621 if(seqplane+1 != img->
dimz) {
1658 int ret=0, pxlNr, zi, xi, yi, matrixId;
1662 void *sub_header=NULL;
1664 float *fdata=NULL, *fptr;
1667 if(
IMG_TEST) printf(
"\nimgWriteEcat63Frame(%s, %d, *img, %d)\n",
1668 fname, frame_to_write, frame_index);
1694 if(access(fname, 0) == -1) {
1701 if(frame_to_write==0) frame_to_write=1;
1725 if(frame_to_write==0) frame_to_write=main_header.
num_frames+1;
1732 printf(
"frame_to_write := %d\n", frame_to_write);
1737 fdata=(
float*)malloc(pxlNr*
sizeof(
float));
1748 for(zi=0; zi<img->
dimz; zi++)
1749 for(yi=0; yi<img->
dimy; yi++)
for(xi=0; xi<img->
dimx; xi++)
1750 *fptr++=img->
m[zi][yi][xi][frame_index];
1754 for(zi=0; zi<img->dimz; zi++, fptr+=img->
dimx*img->
dimy) {
1759 (int)temp_roundf(1000.*img->
start[frame_index]);
1761 (int)temp_roundf(1000.*(img->
end[frame_index]-img->
start[frame_index]));
1767 (int)temp_roundf(1000.*img->
start[frame_index]);
1769 (int)temp_roundf(1000.*(img->
end[frame_index]-img->
start[frame_index]));
1776 free(fdata); fclose(fp);
#define ECAT63_SYSTEM_TYPE_DEFAULT
int ecat63GetPlaneAndFrameNr(MATRIXLIST *mlist, ECAT63_mainheader *h, int *plane_nr, int *frame_nr)
void ecat63InitMatlist(MATRIXLIST *mlist)
void ecat63EmptyMatlist(MATRIXLIST *mlist)
int ecat63GatherMatlist(MATRIXLIST *ml, short int do_planes, short int do_frames, short int do_gates, short int do_beds)
int ecat63ReadMatlist(FILE *fp, MATRIXLIST *ml)
int mat_numcod(int frame, int plane, int gate, int data, int bed)
int ecat63GetMatrixBlockSize(MATRIXLIST *mlist, int *blk_nr)
int ecat63DeleteLateFrames(MATRIXLIST *ml, int frame_nr)
void ecat63SortMatlistByPlane(MATRIXLIST *ml)
void ecat63PrintMatlist(MATRIXLIST *ml)
void mat_numdoc(int matnum, Matval *matval)
void ecat63SortMatlistByFrame(MATRIXLIST *ml)
void ecat63PrintMainheader(ECAT63_mainheader *h, FILE *fp)
void ecat63PrintImageheader(ECAT63_imageheader *h, FILE *fp)
void ecat63PrintScanheader(ECAT63_scanheader *h, FILE *fp)
int ecat63ReadNormheader(FILE *fp, int blk, ECAT63_normheader *h)
int ecat63ReadMatdata(FILE *fp, int strtblk, int blkNr, char *data, int dtype)
int ecat63ReadScanheader(FILE *fp, int blk, ECAT63_scanheader *h)
int ecat63ReadAttnheader(FILE *fp, int blk, ECAT63_attnheader *h)
int ecat63ReadImageheader(FILE *fp, int blk, ECAT63_imageheader *h)
int ecat63ReadMainheader(FILE *fp, ECAT63_mainheader *h)
int ecat63WriteScan(FILE *fp, int matnum, ECAT63_scanheader *h, void *data)
int ecat63WriteScanMatrix(FILE *fp, int matnum, ECAT63_scanheader *h, float *fdata)
int ecat63WriteImageMatrix(FILE *fp, int matnum, ECAT63_imageheader *h, float *fdata)
FILE * ecat63Create(const char *fname, ECAT63_mainheader *h)
int ecat63WriteImage(FILE *fp, int matnum, ECAT63_imageheader *h, void *data)
int ecat63WriteMainheader(FILE *fp, ECAT63_mainheader *h)
int imgAllocate(IMG *image, int planes, int rows, int columns, int frames)
void imgSetStatus(IMG *img, int status_index)
void imgEmpty(IMG *image)
#define IMG_STATUS_OCCUPIED
#define IMG_STATUS_INITIALIZED
#define IMG_STATUS_UNINITIALIZED
int ecat63ReadPlaneToImg(const char *fname, IMG *img)
int imgGetEcat63Fileformat(ECAT63_mainheader *h)
int imgEcat63Supported(ECAT63_mainheader *h)
int ecat63WriteAllImg(const char *fname, IMG *img)
void imgSetEcat63SHeader(IMG *img, void *h)
int imgWriteEcat63Frame(const char *fname, int frame_to_write, IMG *img, int frame_index)
int imgReadEcat63FirstFrame(const char *fname, IMG *img)
int ecat63AddImg(const char *fname, IMG *img)
void imgGetEcat63MHeader(IMG *img, ECAT63_mainheader *h)
int imgReadEcat63Header(const char *fname, IMG *img)
void imgSetEcat63MHeader(IMG *img, ECAT63_mainheader *h)
int imgReadEcat63Frame(const char *fname, int frame_to_read, IMG *img, int frame_index)
int ecat63ReadAllToImg(const char *fname, IMG *img)
char * imgIsotope(IMG *img)
int imgUnitToEcat6(IMG *img)
void imgUnitFromEcat(IMG *img, int ecat_unit)
char studyDescription[32]
char radiopharmaceutical[32]
char studyNr[MAX_STUDYNR_LEN+1]
short int scan_start_minute
short int scan_start_hour
char radiopharmaceutical[32]
char study_description[32]
short int scan_start_year
short int scan_start_month
short int calibration_units
short int scan_start_second
char user_process_code[10]