33 float *fdata=NULL, *fptr;
37 if(
IMG_TEST) printf(
"imgReadEcat7(%s, *img)\n", fname);
39 if(fname==NULL)
return(1);
45 if((fp=fopen(fname,
"rb"))==NULL) {
imgSetStatus(img,STATUS_NOFILE);
return(3);}
49 if(ret) {fclose(fp);
imgSetStatus(img, STATUS_UNKNOWNFORMAT);
return(4);}
51 if(strncmp(main_header.
magic_number, ECAT7V_MAGICNR, 7)!=0) {
52 fclose(fp);
imgSetStatus(img, STATUS_UNKNOWNFORMAT);
return(4);
57 fclose(fp);
imgSetStatus(img, STATUS_UNSUPPORTED);
return(5);
65 fclose(fp);
imgSetStatus(img, STATUS_INVALIDMATLIST);
return(6);}
72 int frame, plane, prev_frame, prev_plane, planeNr, frameNr;
73 prev_plane=plane=-1; prev_frame=frame=-1; frameNr=planeNr=0; ret=0;
74 for(
int m=0; m<mlist.
matrixNr; m++) {
77 else frame=matval.
gate;
78 if(plane!=prev_plane) {frameNr=1; planeNr++;}
79 else {frameNr++;
if(prev_frame>0 && frame!=prev_frame+1) {ret=1;
break;}}
80 prev_plane=plane; prev_frame=frame;
88 if(
IMG_TEST>2) printf(
"frameNr=%d planeNr=%d\n", frameNr, planeNr);
89 if(ret==1 || (frameNr*planeNr != mlist.
matrixNr)) {
99 int m=0, dimx, dimy, dimz=1;
134 planeNr=dimz=dimy=1; dimx=0;
135 for(
int i=0; i<polmap_header.
num_rings; i++)
138 default: dimx=dimy=dimz=planeNr=0; ret=-1;
140 long long pxlNr=dimx*dimy;
141 if(ret || pxlNr<1 || planeNr<1) {
146 ret=
imgAllocate(img, planeNr, dimy, dimx, frameNr);
176 for(
int m=0; m<mlist.
matrixNr; m++) {
186 if(ret || fdata==NULL) {
246 for(
long long i=0; i<dimz*pxlNr; i++, fptr++)
253 for(
int pi=0; pi<dimz; pi++) {
255 for(
int yi=0; yi<dimy; yi++)
256 for(
int xi=0; xi<dimx; xi++)
257 img->
m[pi][yi][xi][fi]= *fptr++;
262 for(
int pi=0; pi<dimz; pi++) img->
planeNumber[pi]=pi+1;
265 prev_plane=plane=-1; prev_frame=frame=-1;
267 for(
int m=0; m<mlist.
matrixNr; m++) {
270 else frame=matval.
gate;
271 if(plane!=prev_plane) {fi=0; pi++;}
else fi++;
282 if(ret || fdata==NULL) {
342 for(
long long i=0; i<pxlNr; i++, fptr++)
350 for(
int yi=0; yi<dimy; yi++)
for(
int xi=0; xi<dimx; xi++)
351 img->
m[pi][yi][xi][fi]= *fptr++;
354 prev_plane=plane; prev_frame=frame;
361 for(
int pi=0; pi<img->
dimz; pi++)
362 for(
int yi=0; yi<img->
dimy; yi++)
for(
int xi=0; xi<img->
dimx; xi++)
363 for(
int fi=0; fi<img->
dimt; fi++)
391 if(
IMG_TEST) printf(
"imgWriteEcat7(%s, *img)\n", fname);
394 if(fname==NULL)
return(1);
415 fdata=(
float*)malloc(pxlNr*
sizeof(
float));
416 if(fdata==NULL) {
imgSetStatus(img, STATUS_NOMEMORY);
return(3);}
420 if(fp==NULL) {free(fdata);
imgSetStatus(img, STATUS_NOWRITEPERM);
return(6);}
468 for(
int fi=0; fi<img->
dimt; fi++) {
475 for(
int pi=0; pi<img->
dimz; pi++)
476 for(
int yi=0; yi<img->
dimy; yi++)
477 for(
int xi=0; xi<img->
dimx; xi++)
478 if(isfinite(img->
m[pi][yi][xi][fi])) *fptr++=img->
m[pi][yi][xi][fi];
else *fptr++=0.0;
500 free(fdata); fclose(fp);
imgSetStatus(img, STATUS_UNSUPPORTED);
return(8);
503 if(
IMG_TEST) {printf(
"matrixId=%d ret=%d\n", matrixId, ret);}
504 free(fdata); fclose(fp);
imgSetStatus(img, STATUS_DISKFULL);
return(7);
508 free(fdata); fclose(fp);
535 if(
IMG_TEST) printf(
"imgWrite2DEcat7(%s, *img)\n", fname);
538 if(fname==NULL) {
return(1);}
559 long long pxlNr=img->
dimx*img->
dimy;
560 fdata=(
float*)malloc(pxlNr*
sizeof(
float));
561 if(fdata==NULL) {
imgSetStatus(img, STATUS_NOMEMORY);
return(3);}
565 if(fp==NULL) {free(fdata);
imgSetStatus(img, STATUS_NOWRITEPERM);
return(6);}
605 for(
int fi=0; fi<img->
dimt; fi++)
for(
int pi=0; pi<img->
dimz; pi++) {
612 for(
int yi=0; yi<img->
dimy; yi++)
613 for(
int xi=0; xi<img->
dimx; xi++)
614 if(isfinite(img->
m[pi][yi][xi][fi])) *fptr++=img->
m[pi][yi][xi][fi];
else *fptr++=0.0;
635 free(fdata); fclose(fp);
imgSetStatus(img, STATUS_UNSUPPORTED);
return(8);
638 if(
IMG_TEST) {printf(
"matrixId=%d ret=%d\n", matrixId, ret);}
639 free(fdata); fclose(fp);
imgSetStatus(img, STATUS_DISKFULL);
return(7);
643 free(fdata); fclose(fp);
669 if(
IMG_TEST) printf(
"imgWritePolarmap(%s, *img)\n", fname);
672 if(fname==NULL)
return(1);
692 fdata=(
float*)malloc(pxlNr*
sizeof(
float));
693 if(fdata==NULL) {
imgSetStatus(img, STATUS_NOMEMORY);
return(3);}
697 if(fp==NULL) {free(fdata);
imgSetStatus(img, STATUS_NOWRITEPERM);
return(6);}
703 for(
int fi=0; fi<img->
dimt; fi++) {
710 for(
int pi=0; pi<img->
dimz; pi++)
711 for(
int yi=0; yi<img->
dimy; yi++)
712 for(
int xi=0; xi<img->
dimx; xi++)
713 if(isfinite(img->
m[pi][yi][xi][fi])) *fptr++=img->
m[pi][yi][xi][fi];
else *fptr++=0.0;
723 if(
IMG_TEST) {printf(
"matrixId=%d ret=%d\n", matrixId, ret);}
724 free(fdata); fclose(fp);
imgSetStatus(img, STATUS_DISKFULL);
return(7);
728 free(fdata); fclose(fp);
863 int planeNr, frameNr, blkNr=0;
872 if(
IMG_TEST) printf(
"\nimgReadEcat7Header(%s, *img)\n", fname);
875 if(img==NULL)
return STATUS_FAULT;
878 if(fname==NULL)
return STATUS_FAULT;
881 if((fp=fopen(fname,
"rb")) == NULL)
return STATUS_NOFILE;
885 if(ret) {fclose(fp);
return STATUS_NOMAINHEADER;}
887 if(strncmp(main_header.
magic_number, ECAT7V_MAGICNR, 7)!=0) {
888 fclose(fp);
return STATUS_UNKNOWNFORMAT;}
902 fclose(fp);
return STATUS_INVALIDMATLIST;}
940 if(ret)
return STATUS_NOSUBHEADER;
1009 return STATUS_INVALIDPOLARMAP;
1037 if(h==NULL)
return(0);
1063 if(
IMG_TEST) printf(
"\nimgReadEcat7FirstFrame(%s, *img)\n", fname);
1065 if(img==NULL)
return STATUS_FAULT;
1068 if(fname==NULL)
return STATUS_FAULT;
1077 if(ret)
return STATUS_NOMEMORY;
1104 const char *fname,
int frame_to_read,
IMG *img,
int frame_index
1107 int ret, frame, plane, seqplane;
1116 float *fdata=NULL, *fptr;
1119 if(
IMG_TEST) printf(
"\nimgReadEcat7Frame(%s, %d, *img, %d)\n",
1120 fname, frame_to_read, frame_index);
1123 if(img==NULL)
return STATUS_FAULT;
1125 if(fname==NULL)
return STATUS_FAULT;
1126 if(frame_index<0 || frame_index>img->
dimt-1)
return STATUS_FAULT;
1127 if(frame_to_read<1)
return STATUS_FAULT;
1130 if((fp=fopen(fname,
"rb")) == NULL)
return STATUS_NOFILE;
1134 if(ret) {fclose(fp);
return STATUS_NOMAINHEADER;}
1136 if(strncmp(main_header.
magic_number, ECAT7V_MAGICNR, 7)!=0) {
1137 fclose(fp);
return STATUS_UNKNOWNFORMAT;}
1140 fclose(fp);
return STATUS_UNSUPPORTED;}
1144 if(ret) {fclose(fp);
return STATUS_NOMATLIST;}
1157 long long pxlNr=img->
dimx*img->
dimy;
1158 for(
int m=0; m<mlist.
matrixNr; m++) {
1162 else frame=matval.
gate;
1163 if(frame!=frame_to_read)
continue;
1168 if(
IMG_TEST>4) printf(
"reading matrix %d,%d\n", frame, plane);
1175 }
else if(img->
dimz>1) {
1182 if(ret || fdata==NULL) {
1188 img->
end[frame_index]=
1190 img->
mid[frame_index]=0.5*(img->
start[frame_index]+img->
end[frame_index]);
1200 img->
end[frame_index]=
1202 img->
mid[frame_index]=0.5*(img->
start[frame_index]+img->
end[frame_index]);
1203 }
else if(img->
dimz>1) {
1205 img->
end[frame_index]=
1207 img->
mid[frame_index]=0.5*(img->
start[frame_index]+img->
end[frame_index]);
1211 for(
long long i=0; i<img->
dimz*pxlNr; i++, fptr++)
1218 img->
end[frame_index]=
1220 img->
mid[frame_index]=0.5*(img->
start[frame_index]+img->
end[frame_index]);
1224 for(
long long i=0; i<pxlNr; i++, fptr++)
1233 for(
int pi=0; pi<img->
dimz; pi++) {
1235 printf(
" putting data into m[%d][][][%d]\n", pi, frame_index);
1236 fptr=fdata+pi*pxlNr;
1237 for(
int yi=0; yi<img->
dimy; yi++)
1238 for(
int xi=0; xi<img->
dimx; xi++)
1239 img->
m[pi][yi][xi][frame_index]= *fptr++;
1243 printf(
" putting data into m[%d][][][%d]\n", seqplane, frame_index);
1245 for(
int yi=0; yi<img->
dimy; yi++)
1246 for(
int xi=0; xi<img->
dimx; xi++)
1247 img->
m[seqplane][yi][xi][frame_index]= *fptr++;
1253 for(
int pi=0; pi<img->
dimz; pi++)
1254 for(
int yi=0; yi<img->
dimy; yi++)
for(
int xi=0; xi<img->
dimx; xi++)
1257 if(
IMG_TEST>3) printf(
"end of matrices.\n");
1262 if(
IMG_TEST>4) printf(
"last_seqplane := %d.\n", seqplane);
1263 if(seqplane<0)
return STATUS_NOMATRIX;
1266 if(seqplane>0 && (seqplane+1 != img->
dimz))
return STATUS_MISSINGMATRIX;
1296 const char *fname,
int frame_to_write,
IMG *img,
int frame_index
1299 int ret=0, matrixId;
1305 void *sub_header=NULL;
1307 float *fdata=NULL, *fptr;
1310 if(
IMG_TEST) printf(
"\nimgWriteEcat7Frame(%s, %d, *img, %d)\n",
1311 fname, frame_to_write, frame_index);
1316 if(fname==NULL)
return STATUS_FAULT;
1317 if(img==NULL)
return STATUS_FAULT;
1319 if(frame_to_write<0)
return STATUS_FAULT;
1320 if(frame_index<0 || frame_index>=img->
dimt)
return STATUS_FAULT;
1327 return STATUS_INVALIDHEADER;
1344 if(access(fname, 0) == -1) {
1349 if(frame_to_write==0) frame_to_write=1;
1353 fp=
ecat7Create(fname, &main_header);
if(fp==NULL)
return STATUS_NOWRITEPERM;
1361 return STATUS_WRONGFILETYPE;
1365 return STATUS_VARMATSIZE;
1369 if((fp=fopen(fname,
"r+b"))==NULL)
return STATUS_NOWRITEPERM;
1373 return STATUS_NOMAINHEADER;
1374 if(frame_to_write==0) frame_to_write=main_header.
num_frames+1;
1378 return STATUS_NOWRITEPERM;
1382 printf(
"frame_to_write := %d\n", frame_to_write);
1387 fdata=(
float*)malloc(pxlNr*
sizeof(
float));
1388 if(fdata==NULL) {fclose(fp);
return STATUS_NOMEMORY;}
1393 else sub_header=&image_header;
1396 else sub_header=(
void*)&image_header;
1398 sub_header=(
void*)&polmap_header;
1399 }
else {fclose(fp);
return STATUS_FAULT;}
1404 for(
int zi=0; zi<img->
dimz; zi++)
1405 for(
int yi=0; yi<img->
dimy; yi++)
1406 for(
int xi=0; xi<img->
dimx; xi++)
1407 if(isfinite(img->
m[zi][yi][xi][frame_index])) *fptr++=img->
m[zi][yi][xi][frame_index];
else *fptr++=0.0;
1435 for(
int zi=0; zi<img->
dimz; zi++, fptr+=img->
dimx*img->
dimy) {
1468 free(fdata); fclose(fp);
1469 if(ret)
return STATUS_DISKFULL;
1493 for(
int i=0; i<polmap_header->
num_rings; i++) {
1513 if(img->
dimz==239) {
1556 for(
int i=0; i<49; i++) image_header->
fill_user[i]=0;
void ecat7InitMatlist(ECAT7_MATRIXLIST *mlist)
void ecat7SortMatlistByFrame(ECAT7_MATRIXLIST *ml)
int ecat7GetPlaneAndFrameNr(ECAT7_MATRIXLIST *mlist, ECAT7_mainheader *h, int *plane_nr, int *frame_nr)
int ecat7GetMatrixBlockSize(ECAT7_MATRIXLIST *mlist, int *blk_nr)
void ecat7SortMatlistByPlane(ECAT7_MATRIXLIST *ml)
void ecat7_id_to_val(int matrix_id, ECAT7_Matval *matval)
int ecat7ReadMatlist(FILE *fp, ECAT7_MATRIXLIST *ml, int verbose)
void ecat7EmptyMatlist(ECAT7_MATRIXLIST *mlist)
int ecat7_val_to_id(int frame, int plane, int gate, int data, int bed)
int ecat7GatherMatlist(ECAT7_MATRIXLIST *ml, short int do_planes, short int do_frames, short int do_gates, short int do_beds)
void ecat7PrintMatlist(ECAT7_MATRIXLIST *ml)
int ecat7CheckMatlist(ECAT7_MATRIXLIST *ml)
int ecat7Read2DScanMatrix(FILE *fp, int first_block, int last_block, ECAT7_2Dscanheader *h, float **fdata)
int ecat7ReadScanheader(FILE *fp, int blk, ECAT7_scanheader *h)
int ecat7ReadPolmapheader(FILE *fp, int blk, ECAT7_polmapheader *h)
int ecat7ReadMainheader(FILE *fp, ECAT7_mainheader *h)
int ecat7ReadPolarmapMatrix(FILE *fp, int first_block, int last_block, ECAT7_polmapheader *h, float **fdata)
int ecat7Read2DScanheader(FILE *fp, int blk, ECAT7_2Dscanheader *h)
int ecat7ReadImageMatrix(FILE *fp, int first_block, int last_block, ECAT7_imageheader *h, float **fdata)
int ecat7ReadImageheader(FILE *fp, int blk, ECAT7_imageheader *h)
int ecat7ReadScanMatrix(FILE *fp, int first_block, int last_block, ECAT7_scanheader *h, float **fdata)
int ecat7WriteImageMatrix(FILE *fp, int matrix_id, ECAT7_imageheader *h, float *fdata)
int ecat7WriteScanMatrix(FILE *fp, int matrix_id, ECAT7_scanheader *h, float *fdata)
int ecat7WritePolarmapMatrix(FILE *fp, int matrix_id, ECAT7_polmapheader *h, float *fdata)
int ecat7Write2DScanMatrix(FILE *fp, int matrix_id, ECAT7_2Dscanheader *h, float *fdata)
FILE * ecat7Create(const char *fname, ECAT7_mainheader *h)
int ecat7WriteMainheader(FILE *fp, ECAT7_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)
int imgWrite2DEcat7(const char *fname, IMG *img)
void imgGetEcat7MHeader(IMG *img, ECAT7_mainheader *h)
int imgWriteEcat7(const char *fname, IMG *img)
int imgReadEcat7Frame(const char *fname, int frame_to_read, IMG *img, int frame_index)
int imgEcat7Supported(ECAT7_mainheader *h)
int imgReadEcat7FirstFrame(const char *fname, IMG *img)
int imgReadEcat7(const char *fname, IMG *img)
int imgReadEcat7Header(const char *fname, IMG *img)
int imgGetEcat7Fileformat(ECAT7_mainheader *h)
int imgWriteEcat7Frame(const char *fname, int frame_to_write, IMG *img, int frame_index)
int imgWritePolarmap(const char *fname, IMG *img)
void imgSetEcat7MHeader(IMG *img, ECAT7_mainheader *h)
void imgSetEcat7SHeader(IMG *img, void *h)
char * imgIsotope(IMG *img)
void imgUnitToEcat7(IMG *img, ECAT7_mainheader *h)
void imgUnitFromEcat7(IMG *img, ECAT7_mainheader *h)
Header file for libtpcimgio.
#define NIFTI_XFORM_UNKNOWN
#define IMG_STATUS_OCCUPIED
#define IMG_TYPE_POLARMAP
#define IMG_STATUS_INITIALIZED
#define NIFTI_XFORM_SCANNER_ANAT
#define MAX_POLARMAP_NUM_RINGS
size_t strlcpy(char *dst, const char *src, size_t dstsize)
int studynr_validity_check(char *studynr)
char user_process_code[10]
float ecat_calibration_factor
char study_description[32]
char radiopharmaceutical[32]
short int patient_orientation
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]