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);
369 char tmp[FILENAME_MAX];
374 if(fname==NULL || h==NULL)
return(NULL);
376 if(access(fname, 0) != -1) {
378 if(access(tmp, 0) != -1) remove(tmp);
379 if(
ECAT63_TEST) printf(
"Renaming %s -> %s\n", fname, tmp);
383 fp=fopen(fname,
"wb+");
if(fp==NULL)
return(fp);
413 int nxtblk, blkNr, pxlSize, ret;
415 if(
ECAT63_TEST) printf(
"ecat63WriteImage(fp, %d, ih, data)\n", matnum);
416 if(fp==NULL || matnum<1 || h==NULL || data==NULL)
return(1);
434 long long data_size=pxlNr*pxlSize;
444 if(ret)
return(50+ret);
464 int nxtblk, blkNr, pxlSize, ret;
466 if(
ECAT63_TEST) printf(
"ecat63WriteScan(fp, %d, sh, data)\n", matnum);
467 if(fp==NULL || matnum<1 || h==NULL || data==NULL)
return(1);
485 long long data_size=pxlNr*pxlSize;
495 if(ret)
return(50+ret);
515 int nxtblk, blkNr, pxlSize, ret;
517 if(
ECAT63_TEST) printf(
"ecat63WriteNorm(fp, %d, nh, data)\n", matnum);
518 if(fp==NULL || matnum<1 || h==NULL || data==NULL)
return(1);
536 long long data_size=pxlNr*pxlSize;
546 if(ret)
return(50+ret);
566 int nxtblk, blkNr, pxlSize, ret;
568 if(
ECAT63_TEST) printf(
"ecat63WriteAttn(fp, %d, ah, data)\n", matnum);
569 if(fp==NULL || matnum<1 || h==NULL || data==NULL)
return(1);
587 long long data_size=pxlNr*pxlSize;
597 if(ret)
return(50+ret);
619 FILE *fp,
int strtblk,
char *data,
long long pxlNr,
int pxlSize
626 printf(
"ecat63WriteMatdata(fp, %d, data, %lld, %d)\n", strtblk, pxlNr, pxlSize);
627 if(fp==NULL || strtblk<1 || data==NULL || pxlNr<1 || pxlSize<1)
return(1);
629 long long dataSize=pxlNr*pxlSize;
if(dataSize<1)
return(1);
635 if(ftello(fp)!=(strtblk-1)*
MatBLKSIZE)
return(2);
638 for(
int i=0; i<blkNr && dataSize>0; i++) {
640 memcpy(buf, dptr, byteNr);
643 if(pxlSize==2)
swabip(buf, byteNr);
644 else if(pxlSize==4)
swawbip(buf, byteNr);
672 if(nr<1 || data==NULL)
return(0);
674 if(amax<0.9999)
return(1);
676 if(modf(amax, &d)>0.0001)
return(1);
678 for(
long long i=0; i<nr; i++)
if(modf(*data++, &d)>0.0001)
return(1);
700 int nxtblk, blkNr, ret;
701 float *fptr, fmin, fmax, g, f;
707 if(
ECAT63_TEST) printf(
"ecat63WriteImageMatrix(fp, %d, h, data)\n", matnum);
708 if(fp==NULL || matnum<1 || h==NULL || fdata==NULL) {
726 mdata=(
char*)calloc(blkNr,
MatBLKSIZE);
if(mdata==NULL) {
732 if(fabs(fmin)>fabs(fmax)) g=fabs(fmin);
else g=fabs(fmax);
733 if(g>0) f=32766./g;
else f=1.0;
739 sptr=(
short int*)mdata; fptr=fdata;
740 for(
long long i=0; i<pxlNr; i++, sptr++, fptr++)
747 sprintf(
ecat63errmsg,
"cannot determine matrix block (%d).\n", -nxtblk);
748 free(mdata);
return(8);
750 if(
ECAT63_TEST>2) printf(
" block=%d fmin=%g fmax=%g\n", nxtblk, fmin, fmax);
753 sprintf(
ecat63errmsg,
"cannot write subheader (%d).\n", ret);
754 free(mdata);
return(10);
761 sprintf(
ecat63errmsg,
"cannot write matrix data (%d).\n", ret);
784 int nxtblk, blkNr, ret;
785 float *fptr, fmin, fmax, g, f;
790 if(
ECAT63_TEST) printf(
"ecat63WriteScanMatrix(fp, %d, h, data)\n", matnum);
791 if(fp==NULL || matnum<1 || h==NULL || fdata==NULL) {
809 mdata=(
char*)calloc(blkNr,
MatBLKSIZE);
if(mdata==NULL) {
815 if(fabs(fmin)>fabs(fmax)) g=fabs(fmin);
else g=fabs(fmax);
816 if(g>0) f=32766./g;
else f=1.0;
822 sptr=(
short int*)mdata; fptr=fdata;
823 for(
long long i=0; i<pxlNr; i++, sptr++, fptr++)
830 sprintf(
ecat63errmsg,
"cannot determine matrix block (%d).\n", -nxtblk);
831 free(mdata);
return(8);
833 if(
ECAT63_TEST>2) printf(
" block=%d fmin=%g fmax=%g\n", nxtblk, fmin, fmax);
836 sprintf(
ecat63errmsg,
"cannot write subheader (%d).\n", ret);
837 free(mdata);
return(10);
844 sprintf(
ecat63errmsg,
"cannot write matrix data (%d).\n", ret);
861 float *bufi,
void *bufo,
int tovax,
int islittle
865 memcpy(&ul, bufi, 4);
if(ul==0) {memcpy(bufo, bufi, 4);
return;}
873 memcpy(bufo, &ul, 4);
884void ecat63wInt(
int *bufi,
void *bufo,
int tovax,
int islittle) {
889 memcpy(&i, bufi, 4);
if(!islittle)
swawbip(&i, 4);
906 if(tm==NULL || h==NULL)
return(NULL);
907 memset(tm, 0,
sizeof(
struct tm));
915 if(
timegm(tm)==-1)
return(NULL);
929 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