25 if(
ECAT7_TEST) printf(
"ecat7ReadMainheader()\n");
26 if(fp==NULL || h==NULL)
return(1);
30 fseek(fp, 0, SEEK_SET);
if(ftell(fp)!=0)
return(2);
37 if(little)
swabip(buf+46, 2);
39 if(little)
swabip(buf+48, 2);
41 if(little)
swabip(buf+50, 2);
59 if(little)
swabip(buf+126, 2);
61 if(little)
swabip(buf+128, 2);
67 if(little)
swabip(buf+138, 2);
69 if(little)
swabip(buf+140, 2);
71 if(little)
swabip(buf+142, 2);
75 if(little)
swabip(buf+148, 2);
77 if(little)
swabip(buf+150, 2);
79 if(little)
swabip(buf+152, 2);
97 if(little)
swabip(buf+328, 2);
99 if(little)
swabip(buf+330, 2);
102 if(little)
swabip(buf+352, 2);
104 if(little)
swabip(buf+354, 2);
106 if(little)
swabip(buf+356, 2);
108 if(little)
swabip(buf+358, 2);
110 if(little)
swawbip(buf+360, 4);
112 if(little)
swawbip(buf+364, 15*4);
114 if(little)
swawbip(buf+424, 4);
116 if(little)
swabip(buf+428, 2);
118 if(little)
swabip(buf+430, 2);
122 if(little)
swabip(buf+444, 2);
124 if(little)
swawbip(buf+446, 4);
126 if(little)
swawbip(buf+450, 4);
128 if(little)
swawbip(buf+454, 4);
130 if(little)
swawbip(buf+458, 4);
131 memcpy(&h->
dosage, buf+458, 4);
132 if(little)
swawbip(buf+462, 4);
135 if(little)
swabip(buf+498, 2);
166 if(
ECAT7_TEST) printf(
"ecat7ReadImageheader()\n");
167 if(fp==NULL || h==NULL)
return(1);
172 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(2);
174 if(fread(buf,
MatBLKSIZE, 1, fp)<1)
return(3);
177 if(little)
swabip(buf+0, 2);
179 if(little)
swabip(buf+2, 2);
181 if(little)
swabip(buf+4, 2);
183 if(little)
swabip(buf+6, 2);
185 if(little)
swabip(buf+8, 2);
197 if(little)
swabip(buf+30, 2);
199 if(little)
swabip(buf+32, 2);
211 if(little)
swabip(buf+54, 2);
235 if(little)
swawbip(buf+100, 4);
237 if(little)
swawbip(buf+104, 4);
239 if(little)
swawbip(buf+108, 4);
241 if(little)
swabip(buf+112, 2);
243 if(little)
swawbip(buf+114, 4);
245 if(little)
swawbip(buf+118, 4);
248 if(little)
swawbip(buf+162, 4);
249 memcpy(&h->
mt_1_1, buf+162, 4);
250 if(little)
swawbip(buf+166, 4);
251 memcpy(&h->
mt_1_2, buf+166, 4);
252 if(little)
swawbip(buf+170, 4);
253 memcpy(&h->
mt_1_3, buf+170, 4);
254 if(little)
swawbip(buf+174, 4);
255 memcpy(&h->
mt_2_1, buf+174, 4);
256 if(little)
swawbip(buf+178, 4);
257 memcpy(&h->
mt_2_2, buf+178, 4);
258 if(little)
swawbip(buf+182, 4);
259 memcpy(&h->
mt_2_3, buf+182, 4);
260 if(little)
swawbip(buf+186, 4);
261 memcpy(&h->
mt_3_1, buf+186, 4);
262 if(little)
swawbip(buf+190, 4);
263 memcpy(&h->
mt_3_2, buf+190, 4);
264 if(little)
swawbip(buf+194, 4);
265 memcpy(&h->
mt_3_3, buf+194, 4);
266 if(little)
swawbip(buf+198, 4);
268 if(little)
swawbip(buf+202, 4);
270 if(little)
swabip(buf+206, 2);
272 if(little)
swabip(buf+208, 2);
274 if(little)
swawbip(buf+210, 4);
276 if(little)
swawbip(buf+214, 4);
278 if(little)
swabip(buf+218, 2);
280 if(little)
swabip(buf+220, 2);
282 if(little)
swawbip(buf+222, 4);
283 memcpy(&h->
mt_1_4, buf+222, 4);
284 if(little)
swawbip(buf+226, 4);
285 memcpy(&h->
mt_2_4, buf+226, 4);
286 if(little)
swawbip(buf+230, 4);
287 memcpy(&h->
mt_3_4, buf+230, 4);
288 if(little)
swabip(buf+234, 2);
290 if(little)
swabip(buf+236, 2);
292 if(little)
swabip(buf+238, 2);
315 if(
ECAT7_TEST) printf(
"ecat7ReadAttenheader()\n");
316 if(fp==NULL || h==NULL)
return(1);
321 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(2);
323 if(fread(buf,
MatBLKSIZE, 1, fp)<1)
return(3);
325 if(little)
swabip(buf+0, 2);
327 if(little)
swabip(buf+2, 2);
329 if(little)
swabip(buf+4, 2);
331 if(little)
swabip(buf+6, 2);
333 if(little)
swabip(buf+8, 2);
335 if(little)
swabip(buf+10, 2);
337 if(little)
swabip(buf+12, 2);
367 if(little)
swabip(buf+70, 2);
369 if(little)
swawbip(buf+72, 8*4);
371 if(little)
swawbip(buf+104, 4);
373 if(little)
swabip(buf+108, 2);
375 if(little)
swabip(buf+110, 2);
376 memcpy(&h->
span, buf+110, 2);
377 if(little)
swabip(buf+112, 64*2);
379 if(little)
swabip(buf+240, 86*2);
381 if(little)
swabip(buf+412, 50*2);
401 if(
ECAT7_TEST) printf(
"ecat7ReadPolarmapheader()\n");
402 if(fp==NULL || h==NULL)
return(1);
407 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(2);
409 if(fread(buf,
MatBLKSIZE, 1, fp)<1)
return(3);
411 if(little)
swabip(buf+0, 2);
413 if(little)
swabip(buf+2, 2);
415 if(little)
swabip(buf+4, 2);
417 if(little)
swabip(buf+6, 32*2);
419 if(little)
swawbip(buf+70, 32*4);
421 if(little)
swabip(buf+198, 32*2);
423 if(little)
swabip(buf+262, 2);
425 if(little)
swabip(buf+264, 3*2);
427 if(little)
swabip(buf+270, 3*2);
429 if(little)
swabip(buf+276, 2);
431 if(little)
swabip(buf+278, 2);
433 if(little)
swabip(buf+280, 2);
435 if(little)
swawbip(buf+282, 4);
437 if(little)
swawbip(buf+286, 4);
439 if(little)
swawbip(buf+290, 4);
441 if(little)
swawbip(buf+294, 4);
443 if(little)
swabip(buf+298, 2);
445 if(little)
swabip(buf+300, 2);
448 if(little)
swawbip(buf+342, 4);
450 if(little)
swawbip(buf+346, 4);
452 if(little)
swawbip(buf+350, 4);
456 if(little)
swabip(buf+404, 27*2);
476 if(
ECAT7_TEST) printf(
"ecat7ReadNormheader()\n");
477 if(fp==NULL || h==NULL)
return(1);
482 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(2);
484 if(fread(buf,
MatBLKSIZE, 1, fp)<1)
return(3);
486 if(little)
swabip(buf+0, 2);
488 if(little)
swabip(buf+2, 2);
490 if(little)
swabip(buf+4, 2);
492 if(little)
swabip(buf+6, 2);
494 if(little)
swabip(buf+8, 2);
496 if(little)
swabip(buf+10, 2);
498 if(little)
swabip(buf+12, 2);
499 memcpy(&h->
uld, buf+12, 2);
500 if(little)
swabip(buf+14, 2);
501 memcpy(&h->
lld, buf+14, 2);
502 if(little)
swabip(buf+16, 2);
506 if(little)
swabip(buf+22, 2);
508 if(little)
swawbip(buf+24, 32*4);
510 if(little)
swawbip(buf+152, 32*4);
512 if(little)
swawbip(buf+280, 8*4);
514 if(little)
swabip(buf+312, 2);
515 memcpy(&h->
span, buf+312, 2);
516 if(little)
swabip(buf+314, 2);
518 if(little)
swabip(buf+316, 48*2);
520 if(little)
swabip(buf+412, 50*2);
540 if(
ECAT7_TEST) printf(
"ecat7ReadScanheader()\n");
541 if(fp==NULL || h==NULL)
return(1);
546 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(2);
548 if(fread(buf,
MatBLKSIZE, 2, fp)<1)
return(3);
551 if(little)
swabip(buf+0, 2);
553 if(little)
swabip(buf+2, 2);
555 if(little)
swabip(buf+4, 2);
557 if(little)
swabip(buf+6, 2);
559 if(little)
swabip(buf+8, 2);
561 if(little)
swabip(buf+10, 64*2);
563 if(little)
swabip(buf+138, 2);
565 if(little)
swabip(buf+140, 2);
567 if(little)
swabip(buf+142, 2);
569 if(little)
swawbip(buf+144, 4);
571 if(little)
swawbip(buf+148, 4);
573 if(little)
swawbip(buf+152, 4);
575 if(little)
swawbip(buf+156, 4);
577 if(little)
swabip(buf+160, 6*2);
579 if(little)
swawbip(buf+172, 4);
581 if(little)
swawbip(buf+176, 4);
583 if(little)
swawbip(buf+180, 4);
585 if(little)
swawbip(buf+184, 4);
587 if(little)
swabip(buf+188, 2);
589 if(little)
swabip(buf+190, 2);
591 if(little)
swawbip(buf+192, 4);
592 memcpy(&h->
prompts, buf+192, 4);
593 if(little)
swawbip(buf+196, 4);
594 memcpy(&h->
delayed, buf+196, 4);
595 if(little)
swawbip(buf+200, 4);
597 if(little)
swawbip(buf+204, 4);
599 if(little)
swawbip(buf+208, 4);
601 if(little)
swawbip(buf+212, 4);
603 if(little)
swawbip(buf+216, 4);
605 if(little)
swawbip(buf+220, 4);
607 if(little)
swawbip(buf+224, 4);
609 if(little)
swawbip(buf+228, 4);
611 if(little)
swabip(buf+232, 90*2);
613 if(little)
swabip(buf+412, 50*2);
615 if(little)
swawbip(buf+512, 128*4);
635 if(
ECAT7_TEST) printf(
"ecat7Read2DScanheader()\n");
636 if(fp==NULL || h==NULL)
return(1);
641 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(2);
643 if(fread(buf,
MatBLKSIZE, 1, fp)<1)
return(3);
645 if(little)
swabip(buf+0, 2);
647 if(little)
swabip(buf+2, 2);
649 if(little)
swabip(buf+4, 2);
651 if(little)
swabip(buf+6, 2);
653 if(little)
swabip(buf+8, 2);
655 if(little)
swabip(buf+10, 2);
657 if(little)
swabip(buf+12, 2);
667 if(little)
swabip(buf+30, 6*2);
677 if(little)
swabip(buf+58, 2);
679 if(little)
swabip(buf+60, 2);
682 memcpy(&h->
prompts, buf+62, 4);
684 memcpy(&h->
delayed, buf+66, 4);
689 if(little)
swawbip(buf+78, 16*4);
691 if(little)
swawbip(buf+142, 16*4);
693 if(little)
swawbip(buf+206, 4);
695 if(little)
swawbip(buf+210, 4);
697 if(little)
swawbip(buf+214, 4);
699 if(little)
swawbip(buf+218, 4);
701 if(little)
swawbip(buf+222, 4);
703 if(little)
swawbip(buf+226, 4);
705 if(little)
swabip(buf+230, 8*2);
707 if(little)
swabip(buf+246, 83*2);
709 if(little)
swabip(buf+412, 50*2);
729 if(
ECAT7_TEST) printf(
"ecat7Read2Dnormheader()\n");
730 if(fp==NULL || h==NULL)
return(1);
735 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(2);
737 if(fread(buf,
MatBLKSIZE, 1, fp)<1)
return(3);
739 if(little)
swabip(buf+0, 2);
741 if(little)
swabip(buf+2, 2);
743 if(little)
swabip(buf+4, 2);
745 if(little)
swabip(buf+6, 2);
747 if(little)
swabip(buf+8, 2);
749 if(little)
swabip(buf+10, 2);
761 if(little)
swabip(buf+32, 2);
763 if(little)
swabip(buf+34, 2);
765 if(little)
swabip(buf+36, 2);
766 memcpy(&h->
span, buf+36, 2);
767 if(little)
swabip(buf+38, 64*2);
769 if(little)
swabip(buf+166, 123*2);
770 memcpy(h->
fill_cti, buf+166, 123*2);
771 if(little)
swabip(buf+412, 50*2);
792 FILE *fp,
int start_block,
int block_nr,
char *data,
int dtype
794 int i, n, little, err=0;
798 if(
ECAT7_TEST) printf(
"ecat7ReadMatrixdata(fp, %d, %d, data, %d)\n",
799 start_block, block_nr, dtype);
801 if(block_nr<=0 || start_block<1 || data==NULL)
return(1);
803 long long pos=(start_block-1)*(
long long)
MatBLKSIZE;
804 fseeko(fp, pos, SEEK_SET);
if(ftello(fp)!=pos)
return(9);
806 if(fread(data,
MatBLKSIZE, block_nr, fp) < (
unsigned int)block_nr)
return(2);
816 for(i=0, cptr=data; i<block_nr*
MatBLKSIZE; i+=4, cptr+=4) {
817 n=
ecat7rInt(cptr, 1, little); memcpy(cptr, &n, 4);
821 for(i=0, cptr=data; i<block_nr*
MatBLKSIZE; i+=4, cptr+=4) {
822 f=
ecat7rFloat(cptr, 1, little); memcpy(cptr, &f, 4);
862 long long i, blockNr, pxlNr;
864 float *_fdata, *fptr;
869 if(
ECAT7_TEST) printf(
"ecat7ReadImageMatrix(fp, %d, %d, hdr, fdata)\n",
870 first_block, last_block);
872 sprintf(
ecat7errmsg,
"invalid function parameter.\n");
880 sprintf(
ecat7errmsg,
"cannot read subheader (%d).\n", ret);
887 sprintf(
ecat7errmsg,
"invalid matrix dimension.\n");
892 blockNr=last_block-first_block;
if(blockNr<1)
return(0);
893 mdata=(
char*)malloc((
size_t)blockNr*
MatBLKSIZE);
900 if(ret || mdata==NULL) {
901 sprintf(
ecat7errmsg,
"cannot read matrix data (%d).\n", ret);
902 free(mdata);
return(9);
906 _fdata=(
float*)malloc(pxlNr*
sizeof(
float));
909 free(mdata);
return(11);
913 fptr=_fdata; mptr=mdata;
915 for(i=0; i<pxlNr; i++, mptr++, fptr++)
918 for(i=0; i<pxlNr; i++, mptr+=2, fptr++) {
919 sptr=(
short int*)mptr;
921 if(!(*fptr>-1.0E+22 && *fptr<1.0E+22)) *fptr=0.0;
924 for(i=0; i<pxlNr; i++, mptr+=4, fptr++) {
927 if(!(*fptr>-1.0E+22 && *fptr<1.0E+22)) *fptr=0.0;
930 memcpy(fptr, mptr, pxlNr*4);
931 for(i=0; i<pxlNr; i++, fptr++) {
933 if(!(*fptr>-1.0E+22 && *fptr<1.0E+22)) *fptr=0.0;
962 long long i, blockNr, pxlNr;
964 float *_fdata, *fptr;
969 if(
ECAT7_TEST) printf(
"ecat7Read2DScanMatrix(fp, %d, %d, hdr, fdata)\n",
970 first_block, last_block);
972 sprintf(
ecat7errmsg,
"invalid function parameter.\n");
980 sprintf(
ecat7errmsg,
"cannot read subheader (%d).\n", ret);
987 sprintf(
ecat7errmsg,
"invalid matrix dimension.\n");
992 blockNr=last_block-first_block;
if(blockNr<1)
return(0);
993 mdata=(
char*)malloc((
size_t)blockNr*
MatBLKSIZE);
1000 if(ret || mdata==NULL) {
1001 sprintf(
ecat7errmsg,
"cannot read matrix data (%d).\n", ret);
1002 free(mdata);
return(9);
1006 _fdata=(
float*)malloc(pxlNr*
sizeof(
float));
1008 sprintf(
ecat7errmsg,
"cannot allocate memory.\n");
1009 free(mdata);
return(11);
1013 fptr=_fdata; mptr=mdata;
1015 for(i=0; i<pxlNr; i++, mptr++, fptr++)
1018 for(i=0; i<pxlNr; i++, mptr+=2, fptr++) {
1019 sptr=(
short int*)mptr;
1023 for(i=0; i<pxlNr; i++, mptr+=4, fptr++) {
1028 memcpy(fptr, mptr, pxlNr*4);
1029 for(i=0; i<pxlNr; i++, fptr++) *fptr *= h->
scale_factor;
1056 FILE *fp,
int first_block,
int last_block,
ECAT7_scanheader *h,
float **fdata
1059 long long i, blockNr, trueblockNr, pxlNr, dimz;
1061 float *_fdata, *fptr;
1066 if(
ECAT7_TEST) printf(
"ecat7ReadScanMatrix(fp, %d, %d, hdr, fdata)\n",
1067 first_block, last_block);
1069 sprintf(
ecat7errmsg,
"invalid function parameter.\n");
1072 *fdata=(
float*)NULL;
1077 sprintf(
ecat7errmsg,
"cannot read subheader (%d).\n", ret);
1085 sprintf(
ecat7errmsg,
"invalid matrix dimension.\n");
1092 blockNr=last_block-first_block-1;
if(blockNr<1)
return(0);
1093 if(blockNr<trueblockNr) trueblockNr=blockNr;
1094 mdata=(
char*)malloc((
size_t)blockNr*
MatBLKSIZE);
1096 sprintf(
ecat7errmsg,
"cannot allocate memory.\n");
1101 if(ret || mdata==NULL) {
1102 sprintf(
ecat7errmsg,
"cannot read matrix data (%d).\n", ret);
1103 free(mdata);
return(9);
1107 _fdata=(
float*)malloc(pxlNr*
sizeof(
float));
1109 sprintf(
ecat7errmsg,
"cannot allocate memory.\n");
1110 free(mdata);
return(11);
1114 fptr=_fdata; mptr=mdata;
1116 for(i=0; i<pxlNr; i++, mptr++, fptr++)
1119 for(i=0; i<pxlNr; i++, mptr+=2, fptr++) {
1120 sptr=(
short int*)mptr;
1124 for(i=0; i<pxlNr; i++, mptr+=4, fptr++) {
1129 memcpy(fptr, mptr, pxlNr*4);
1130 for(i=0; i<pxlNr; i++, fptr++) *fptr *= h->
scale_factor;
1158 long long i, blockNr, pxlNr;
1160 float *_fdata, *fptr;
1165 if(
ECAT7_TEST) printf(
"ecat7ReadPolarmapMatrix(fp, %d, %d, hdr, fdata)\n",
1166 first_block, last_block);
1168 *fdata=(
float*)NULL;
1173 sprintf(
ecat7errmsg,
"cannot read subheader (%d).\n", ret);
1178 if(pxlNr<=0)
return 3;
1181 blockNr=last_block-first_block;
if(blockNr<1)
return 0;
1182 mdata=(
char*)malloc((
size_t)blockNr*
MatBLKSIZE);
1183 if(mdata==NULL)
return 4;
1186 if(ret || mdata==NULL) {
1187 if(mdata!=NULL) free(mdata);
1192 _fdata=(
float*)malloc(pxlNr*
sizeof(
float));
1194 sprintf(
ecat7errmsg,
"cannot allocate memory.\n");
1195 free(mdata);
return 4;
1199 fptr=_fdata; mptr=mdata;
1201 for(i=0; i<pxlNr; i++, mptr++, fptr++)
1204 for(i=0; i<pxlNr; i++, mptr+=2, fptr++) {
1205 sptr=(
short int*)mptr;
1209 for(i=0; i<pxlNr; i++, mptr+=4, fptr++) {
1214 memcpy(fptr, mptr, pxlNr*4);
1215 for(i=0; i<pxlNr; i++, fptr++) *fptr *= h->
scale_factor;
1234 union {
unsigned int ul;
float f;} t;
1236 memcpy(&t.ul, bufi, 4);
if(t.ul==0) {
return(0.0);}
1242 if(!islittle)
swawbip(&t.ul, 4);
1261 memcpy(&i, bufi, 4);
if(!islittle)
swawbip(&i, 4);
int isdate4(int dateint, int *year, int *month, int *day)
struct tm * gmtime_r(const time_t *t, struct tm *tm)
Convert time_t to GMT struct tm.
void ecat7PrintImageheader(ECAT7_imageheader *h, FILE *fp)
void ecat7PrintPolmapheader(ECAT7_polmapheader *h, FILE *fp)
void ecat7Print2DScanheader(ECAT7_2Dscanheader *h, FILE *fp)
void ecat7PrintScanheader(ECAT7_scanheader *h, FILE *fp)
int ecat7pxlbytes(short int data_type)
int ecat7Read2DScanMatrix(FILE *fp, int first_block, int last_block, ECAT7_2Dscanheader *h, float **fdata)
int ecat7ReadScanheader(FILE *fp, int blk, ECAT7_scanheader *h)
float ecat7rFloat(void *bufi, int isvax, int islittle)
int ecat7ReadPolmapheader(FILE *fp, int blk, ECAT7_polmapheader *h)
int ecat7ReadMatrixdata(FILE *fp, int start_block, int block_nr, char *data, int dtype)
int ecat7ReadNormheader(FILE *fp, int blk, ECAT7_normheader *h)
int ecat7ReadAttenheader(FILE *fp, int blk, ECAT7_attenheader *h)
int ecat7rInt(void *bufi, int isvax, int islittle)
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 ecat7Read2DNormheader(FILE *fp, int blk, ECAT7_2Dnormheader *h)
int ecat7ReadScanMatrix(FILE *fp, int first_block, int last_block, ECAT7_scanheader *h, float **fdata)
Header file for libtpcimgio.
void swawip(void *buf, long long int size)
void swabip(void *buf, long long int size)
void swawbip(void *buf, long long int size)
short int compression_code
float well_counter_corr_factor
char user_process_code[10]
short int angular_compression
short int calibration_units
short int acquisition_mode
short int calibration_units_label
float ecat_calibration_factor
short int transm_source_type
short int acquisition_type
char study_description[32]
short int axial_samp_mode
char radiopharmaceutical[32]
short int patient_orientation
char original_file_name[32]