31 if(
ECAT63_TEST) printf(
"ecat63WriteMainheader()\n");
38 tovax=1;
else tovax=0;
58 memcpy(buf+472, h->
fill2, 40);
77 memcpy(buf+14, h->
fill1, 14);
113 if(
ECAT63_TEST) printf(
"ecat63WriteImageheader(fp, %d, ih)\n", block);
118 if(fp==NULL || block<3 || h->data_type<1 || h->data_type>7)
return(1);
120 tovax=1;
else tovax=0;
139 memcpy(buf+460, h->
fill2, 52);
157 for(
int i=0; i<6; i++)
168 memcpy(buf+0, h->
fill1, 126);
173 if(ftello(fp)!=(block-1)*
MatBLKSIZE)
return(2);
196 if(
ECAT63_TEST) printf(
"ecat63WriteAttnheader(fp, %d, ah)\n", block);
201 if(fp==NULL || block<3 || h->data_type<1 || h->data_type>7)
return(1);
203 tovax=1;
else tovax=0;
225 if(ftello(fp)!=(block-1)*
MatBLKSIZE)
return(2);
249 if(
ECAT63_TEST) printf(
"ecat63WriteScanheader(fp, %d, ih)\n", block);
254 if(fp==NULL || block<3 || h->data_type<1 || h->data_type>7)
return(1);
256 tovax=1;
else tovax=0;
264 memcpy(buf+468, h->
fill2, 44);
272 for(
int i=0; i<16; i++) {
292 memcpy(buf+0, h->
fill1, 126);
296 if(ftello(fp)!=(block-1)*
MatBLKSIZE)
return(2);
319 if(
ECAT63_TEST) printf(
"ecat63WriteNormheader(fp, %d, nh)\n", block);
324 if(fp==NULL || block<3 || h->data_type<1 || h->data_type>7)
return(1);
326 tovax=1;
else tovax=0;
347 if(ftello(fp)!=(block-1)*
MatBLKSIZE)
return(2);
373 if(fname==NULL || h==NULL)
return(NULL);
376 if(access(fname, 0) != -1) {
377 char tmp[FILENAME_MAX];
379 if(access(tmp, 0) != -1) remove(tmp);
380 if(
ECAT63_TEST) printf(
"Renaming %s -> %s\n", fname, tmp);
385 fp=fopen(fname,
"wb+");
if(fp==NULL)
return(fp);
415 int nxtblk, blkNr, pxlSize, ret;
417 if(
ECAT63_TEST) printf(
"ecat63WriteImage(fp, %d, ih, data)\n", matnum);
418 if(fp==NULL || matnum<1 || h==NULL || data==NULL)
return(1);
436 long long data_size=pxlNr*pxlSize;
446 if(ret)
return(50+ret);
466 int nxtblk, blkNr, pxlSize, ret;
468 if(
ECAT63_TEST) printf(
"ecat63WriteScan(fp, %d, sh, data)\n", matnum);
469 if(fp==NULL || matnum<1 || h==NULL || data==NULL)
return(1);
487 long long data_size=pxlNr*pxlSize;
497 if(ret)
return(50+ret);
517 int nxtblk, blkNr, pxlSize, ret;
519 if(
ECAT63_TEST) printf(
"ecat63WriteNorm(fp, %d, nh, data)\n", matnum);
520 if(fp==NULL || matnum<1 || h==NULL || data==NULL)
return(1);
538 long long data_size=pxlNr*pxlSize;
548 if(ret)
return(50+ret);
568 int nxtblk, blkNr, pxlSize, ret;
570 if(
ECAT63_TEST) printf(
"ecat63WriteAttn(fp, %d, ah, data)\n", matnum);
571 if(fp==NULL || matnum<1 || h==NULL || data==NULL)
return(1);
589 long long data_size=pxlNr*pxlSize;
599 if(ret)
return(50+ret);
621 FILE *fp,
int strtblk,
char *data,
long long pxlNr,
int pxlSize
628 printf(
"ecat63WriteMatdata(fp, %d, data, %lld, %d)\n", strtblk, pxlNr, pxlSize);
629 if(fp==NULL || strtblk<1 || data==NULL || pxlNr<1 || pxlSize<1)
return(1);
631 long long dataSize=pxlNr*pxlSize;
if(dataSize<1)
return(1);
637 if(ftello(fp)!=(strtblk-1)*
MatBLKSIZE)
return(2);
640 for(
int i=0; i<blkNr && dataSize>0; i++) {
642 memcpy(buf, dptr, byteNr);
645 if(pxlSize==2)
swabip(buf, byteNr);
646 else if(pxlSize==4)
swawbip(buf, byteNr);
674 if(nr<1 || data==NULL)
return(0);
676 if(amax<0.9999)
return(1);
678 if(modf(amax, &d)>0.0001)
return(1);
680 for(
long long i=0; i<nr; i++)
if(modf(*data++, &d)>0.0001)
return(1);
702 int nxtblk, blkNr, ret;
703 float *fptr, fmin, fmax, g, f;
709 if(
ECAT63_TEST) printf(
"ecat63WriteImageMatrix(fp, %d, h, data)\n", matnum);
710 if(fp==NULL || matnum<1 || h==NULL || fdata==NULL) {
728 mdata=(
char*)calloc(blkNr,
MatBLKSIZE);
if(mdata==NULL) {
734 if(fabs(fmin)>fabs(fmax)) g=fabs(fmin);
else g=fabs(fmax);
735 if(g>0) f=32766./g;
else f=1.0;
741 sptr=(
short int*)mdata; fptr=fdata;
742 for(
long long i=0; i<pxlNr; i++, sptr++, fptr++)
749 sprintf(
ecat63errmsg,
"cannot determine matrix block (%d).\n", -nxtblk);
750 free(mdata);
return(8);
752 if(
ECAT63_TEST>2) printf(
" block=%d fmin=%g fmax=%g\n", nxtblk, fmin, fmax);
755 sprintf(
ecat63errmsg,
"cannot write subheader (%d).\n", ret);
756 free(mdata);
return(10);
763 sprintf(
ecat63errmsg,
"cannot write matrix data (%d).\n", ret);
786 int nxtblk, blkNr, ret;
787 float *fptr, fmin, fmax, g, f;
792 if(
ECAT63_TEST) printf(
"ecat63WriteScanMatrix(fp, %d, h, data)\n", matnum);
793 if(fp==NULL || matnum<1 || h==NULL || fdata==NULL) {
811 mdata=(
char*)calloc(blkNr,
MatBLKSIZE);
if(mdata==NULL) {
817 if(fabs(fmin)>fabs(fmax)) g=fabs(fmin);
else g=fabs(fmax);
818 if(g>0) f=32766./g;
else f=1.0;
824 sptr=(
short int*)mdata; fptr=fdata;
825 for(
long long i=0; i<pxlNr; i++, sptr++, fptr++)
832 sprintf(
ecat63errmsg,
"cannot determine matrix block (%d).\n", -nxtblk);
833 free(mdata);
return(8);
835 if(
ECAT63_TEST>2) printf(
" block=%d fmin=%g fmax=%g\n", nxtblk, fmin, fmax);
838 sprintf(
ecat63errmsg,
"cannot write subheader (%d).\n", ret);
839 free(mdata);
return(10);
846 sprintf(
ecat63errmsg,
"cannot write matrix data (%d).\n", ret);
863 float *bufi,
void *bufo,
int tovax,
int islittle
867 memcpy(&ul, bufi, 4);
if(ul==0) {memcpy(bufo, bufi, 4);
return;}
875 memcpy(bufo, &ul, 4);
886void ecat63wInt(
int *bufi,
void *bufo,
int tovax,
int islittle) {
891 memcpy(&i, bufi, 4);
if(!islittle)
swawbip(&i, 4);
908 if(tm==NULL || h==NULL)
return(NULL);
909 memset(tm, 0,
sizeof(
struct tm));
917 if(
timegm(tm)==-1)
return(NULL);
931 if(h==NULL)
return((time_t)-1);
time_t timegm(struct tm *tm)
Inverse of gmtime, converting struct tm to time_t.
int ecat63Matenter(FILE *fp, int matnum, int blkNr)
int ecat63pxlbytes(short int data_type)
int ecat63WriteScan(FILE *fp, int matnum, ECAT63_scanheader *h, void *data)
int ecat63_is_scaling_needed(float amax, float *data, long long nr)
int ecat63WriteImageheader(FILE *fp, int block, ECAT63_imageheader *h)
int ecat63WriteScanMatrix(FILE *fp, int matnum, ECAT63_scanheader *h, float *fdata)
int ecat63WriteMatdata(FILE *fp, int strtblk, char *data, long long pxlNr, int pxlSize)
int ecat63WriteAttnheader(FILE *fp, int block, ECAT63_attnheader *h)
void ecat63wFloat(float *bufi, void *bufo, int tovax, int islittle)
int ecat63WriteScanheader(FILE *fp, int block, ECAT63_scanheader *h)
int ecat63WriteAttn(FILE *fp, int matnum, ECAT63_attnheader *h, void *data)
int ecat63WriteNorm(FILE *fp, int matnum, ECAT63_normheader *h, void *data)
int ecat63WriteImageMatrix(FILE *fp, int matnum, ECAT63_imageheader *h, float *fdata)
int ecat63WriteNormheader(FILE *fp, int block, ECAT63_normheader *h)
int ecat63WriteImage(FILE *fp, int matnum, ECAT63_imageheader *h, void *data)
FILE * ecat63Create(const char *fname, ECAT63_mainheader *h)
void ecat63wInt(int *bufi, void *bufo, int tovax, int islittle)
struct tm * ecat63ScanstarttimeToTm(const ECAT63_mainheader *h, struct tm *tm)
Convert scan_start_time in ECAT 6.3 main header into a struct tm.
int ecat63WriteMainheader(FILE *fp, ECAT63_mainheader *h)
time_t ecat63Scanstarttime(const ECAT63_mainheader *h)
Get calendar time from ECAT 6.3 main header.
void fMinMaxFin(float *data, long long int n, float *fmin, float *fmax)
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)
char radiopharmaceutical[32]
short int scan_start_month
short int compression_code
short int scan_start_second
short int transaxial_samp_mode
short int rot_source_speed
short int acquisition_type
short int calibration_units
short int scan_start_year
char original_file_name[20]
char study_description[32]
short int transm_source_type
short int scan_start_minute
char user_process_code[10]
short int axial_samp_mode
short int scan_start_hour