27 float *fdata=NULL, *fptr;
29 char datfile[FILENAME_MAX], hdrfile[FILENAME_MAX], siffile[FILENAME_MAX];
30 int dimNr, dimx, dimy, dimz=1, dimt=1;
34 if(
IMG_TEST) printf(
"imgReadAnalyze(%s, *img)\n", dbname);
40 if(dbname==NULL || !dbname[0]) {
imgSetStatus(img, STATUS_FAULT);
return(1);}
44 if(ret==0) {
imgSetStatus(img, STATUS_NOHEADERFILE);
return(3);}
45 if(ret==1 &&
IMG_TEST>0) printf(
"no SIF found for %s\n", dbname);
58 if(
IMG_TEST) fprintf(stdout,
"reading image data %s\n", datfile);
59 if((fp=fopen(datfile,
"rb")) == NULL) {
65 if(dimNr<2) {fclose(fp);
imgSetStatus(img, STATUS_INVALIDHEADER);
return(4);}
67 if(dimNr>2) {dimz=dsr.
dime.
dim[3];
if(dimNr>3) dimt=dsr.
dime.
dim[4];}
68 long long pxlNr=dimx*dimy*dimz;
69 if(pxlNr<1) {fclose(fp);
imgSetStatus(img, STATUS_INVALIDHEADER);
return(4);}
72 if(ret) {fclose(fp);
imgSetStatus(img, STATUS_NOMEMORY);
return(11);}
85 for(
int pi=0; pi<dimz; pi++) img->
planeNumber[pi]=pi+1;
88 if(strstr(dsr.
hist.
descrip,
"Decay corrected.")!=NULL)
90 else if(strstr(dsr.
hist.
descrip,
"No decay correction.")!=NULL)
96 fdata=malloc(pxlNr*
sizeof(
float));
97 if(fdata==NULL) {fclose(fp);
imgSetStatus(img, STATUS_NOMEMORY);
return(12);}
100 for(
int fi=0; fi<dimt; fi++) {
104 free(fdata); fclose(fp);
imgSetStatus(img, STATUS_NOIMGDATA);
return(7);}
108 for(
int pi=0; pi<img->
dimz; pi++)
109 for(
int yi=dimy-1; yi>=0; yi--)
110 for(
int xi=dimx-1; xi>=0; xi--)
111 img->
m[pi][yi][xi][fi]=*fptr++;
113 for(
int pi=dimz-1; pi>=0; pi--)
114 for(
int yi=dimy-1; yi>=0; yi--)
115 for(
int xi=dimx-1; xi>=0; xi--)
116 img->
m[pi][yi][xi][fi]=*fptr++;
125 if(
IMG_TEST) printf(
"reading SIF file %s\n", siffile);
126 if(access(siffile, 0) == -1) {
127 if(
IMG_TEST) printf(
" No SIF file; therefore unknown frame times.\n");
133 if(ret) {
imgSetStatus(img, STATUS_NOSIFDATA);
return(21);}
138 if(ret!=0) {
imgSetStatus(img, STATUS_WRONGSIFDATA);
return(22);}
167 char datfile[FILENAME_MAX], hdrfile[FILENAME_MAX], siffile[FILENAME_MAX];
170 short int *sdata, *sptr, smin, smax;
174 if(
IMG_TEST) printf(
"imgWriteAnalyze(%s, *img)\n", dbname);
180 if(dbname==NULL || !dbname[0]) {
imgSetStatus(img, STATUS_FAULT);
return(1);}
183 strcpy(datfile, dbname); strcat(datfile,
".img");
184 strcpy(hdrfile, dbname); strcat(hdrfile,
".hdr");
185 strcpy(siffile, dbname); strcat(siffile,
".sif");
198 cptr=strrchr(dbname,
'/');
if(cptr==NULL) cptr=strrchr(dbname,
'\\');
199 if(cptr!=NULL) cptr++;
200 if(cptr==NULL) cptr=dbname;
241 if(
IMG_TEST) printf(
"scaling data to short ints\n");
247 if(isnan(g)) {
imgSetStatus(img, STATUS_FAULT);
return 3;}
248 if(g<1E-20) g=1.0;
else g=32767./g; dsr.
dime.
funused1=1.0/g;
253 sdata=malloc(pxlNr*
sizeof(
short int));
254 if(sdata==NULL) {
imgSetStatus(img, STATUS_NOMEMORY);
return 12;}
257 if((fp=fopen(datfile,
"wb")) == NULL) {
266 for(
int fi=0; fi<img->
dimt; fi++) {
269 for(
int pi=0; pi<img->
dimz; pi++)
270 for(
int yi=img->
dimy-1; yi>=0; yi--)
271 for(
int xi=img->
dimx-1; xi>=0; xi--) {
273 if(*sptr>smax) smax=*sptr;
else if(*sptr<smin) smin=*sptr;
277 for(
int pi=img->
dimz-1; pi>=0; pi--)
278 for(
int yi=img->
dimy-1; yi>=0; yi--)
279 for(
int xi=img->
dimx-1; xi>=0; xi--) {
281 if(*sptr>smax) smax=*sptr;
else if(*sptr<smin) smin=*sptr;
288 swabip(sdata, pxlNr*
sizeof(
short int));
290 if(fwrite(sdata, 2, pxlNr, fp) != pxlNr) {
292 free(sdata); fclose(fp);
300 if(
IMG_TEST) printf(
"smin=%d smax=%d\n", smin, smax);
332 if(
IMG_TEST>0) printf(
"SIF contents could not be filled.\n");
340 fprintf(stderr,
"Error: SIF could not be written (%d).\n", ret);
361 char hdrfile[FILENAME_MAX], siffile[FILENAME_MAX];
367 if(
IMG_TEST) printf(
"\nimgReadAnalyzeHeader(%s, *img)\n", dbname);
370 if(img==NULL)
return STATUS_FAULT;
373 if(dbname==NULL)
return STATUS_FAULT;
377 if(ret==0)
return STATUS_NOFILE;
382 if(
IMG_TEST>1) printf(
"anaReadHeader() return value := %d\n", ret);
383 if(ret==1)
return STATUS_FAULT;
384 else if(ret==2)
return STATUS_NOHEADERFILE;
385 else return STATUS_UNSUPPORTED;
386 return(STATUS_FAULT);
403 if(
sifRead(siffile, &sif)!=0)
return STATUS_OK;
429 int dimNr, dimx, dimy, dimz=1, dimt=1;
431 if(
IMG_TEST) printf(
"\nimgGetAnalyzeHeader(*img, *dsr)\n");
435 if(img==NULL)
return STATUS_FAULT;
439 if(h==NULL)
return STATUS_FAULT;
445 if(dimNr<2)
return STATUS_INVALIDHEADER;
447 if(dimNr>2) {dimz=h->
dime.
dim[3];
if(dimNr>3) dimt=h->
dime.
dim[4];}
448 long long pxlNr=dimx*dimy*dimz;
449 if(pxlNr<1)
return STATUS_INVALIDHEADER;
465 if(strstr(h->
hist.
descrip,
"Decay corrected.")!=NULL)
467 else if(strstr(h->
hist.
descrip,
"No decay correction.")!=NULL)
502 if(
IMG_TEST) printf(
"\nimgSetAnalyzeHeader(*img, %s, *dsr, %g, %g)\n",
506 if(img==NULL)
return STATUS_FAULT;
510 if(dsr==NULL)
return STATUS_FAULT;
520 cptr=strrchr(dbname,
'/');
if(cptr==NULL) cptr=strrchr(dbname,
'\\');
521 if(cptr!=NULL) cptr++;
522 if(cptr==NULL) cptr=(
char*)dbname;
565 else return STATUS_FAULT;
572 if(g<1E-20) g=1.0;
else g=32767./g; dsr->
dime.
funused1=1.0/g;
595 if(
IMG_TEST) printf(
"\nimgReadAnalyzeFirstFrame(%s, *img)\n", fname);
597 if(img==NULL)
return STATUS_FAULT;
600 if(fname==NULL)
return STATUS_FAULT;
609 if(ret)
return STATUS_NOMEMORY;
640 const char *fname,
int frame_to_read,
IMG *img,
int frame_index
644 float *fdata=NULL, *fptr;
646 char datfile[FILENAME_MAX], hdrfile[FILENAME_MAX], siffile[FILENAME_MAX];
650 if(
IMG_TEST) printf(
"\nimgReadAnalyzeFrame(%s, %d, *img, %d)\n",
651 fname, frame_to_read, frame_index);
654 if(img==NULL)
return STATUS_FAULT;
656 if(fname==NULL)
return STATUS_FAULT;
657 if(frame_index<0 || frame_index>img->
dimt-1)
return STATUS_FAULT;
658 if(frame_to_read<1)
return STATUS_FAULT;
663 if(ret==0)
return STATUS_NOFILE;
668 if(ret==1)
return STATUS_FAULT;
669 else if(ret==2)
return STATUS_NOHEADERFILE;
670 else return STATUS_UNSUPPORTED;
671 return(STATUS_FAULT);
675 if(
IMG_TEST>2) fprintf(stdout,
"reading image data %s\n", datfile);
676 if((fp=fopen(datfile,
"rb")) == NULL)
return STATUS_NOIMGDATA;
679 fdata=malloc((
size_t)img->
dimx*img->
dimy*img->
dimz*
sizeof(
float));
680 if(fdata==NULL) {fclose(fp);
return STATUS_NOMEMORY;}
686 if(ret==3) {free(fdata);
return STATUS_NOMATRIX;}
687 if(ret!=0) {free(fdata);
return STATUS_UNSUPPORTED;}
692 for(
int pi=0; pi<img->
dimz; pi++)
693 for(
int yi=img->
dimy-1; yi>=0; yi--)
694 for(
int xi=img->
dimx-1; xi>=0; xi--)
695 img->
m[pi][yi][xi][frame_index]=*fptr++;
697 for(
int pi=img->
dimz-1; pi>=0; pi--)
698 for(
int yi=img->
dimy-1; yi>=0; yi--)
699 for(
int xi=img->
dimx-1; xi>=0; xi--)
700 img->
m[pi][yi][xi][frame_index]=*fptr++;
713 if(
sifRead(siffile, &sif)!=0)
return STATUS_OK;
715 if(sif.
frameNr>=frame_to_read) {
716 img->
start[frame_index]=sif.
x1[frame_to_read-1];
717 img->
end[frame_index]=sif.
x2[frame_to_read-1];
718 img->
mid[frame_index]=0.5*(img->
start[frame_index]+img->
end[frame_index]);
752 const char *dbname,
int frame_to_write,
IMG *img,
int frame_index,
753 float fmin,
float fmax
758 short int *sdata=NULL, *sptr;
759 char datfile[FILENAME_MAX], hdrfile[FILENAME_MAX], siffile[FILENAME_MAX];
761 float scale_factor=1.0;
764 if(
IMG_TEST) printf(
"\nimgWriteAnalyzeFrame(%s, %d, *img, %d, %g, %g)\n",
765 dbname, frame_to_write, frame_index, fmin, fmax);
770 if(dbname==NULL)
return STATUS_FAULT;
771 if(img==NULL)
return STATUS_FAULT;
773 if(frame_to_write<0)
return STATUS_FAULT;
774 if(frame_index<0 || frame_index>=img->
dimt)
return STATUS_FAULT;
788 sprintf(hdrfile,
"%s.hdr", dbname);
789 sprintf(datfile,
"%s.img", dbname);
790 sprintf(siffile,
"%s.sif", dbname);
794 if(frame_to_write==0) frame_to_write=1;
795 dsr.
dime.
dim[4]=frame_to_write;
797 if(fabs(scale_factor)>1.0E-20) scale_factor=1.0/scale_factor;
801 if(ret &&
IMG_TEST) printf(
"anaWriteHeader() := %d\n", ret);
802 if(ret)
return STATUS_CANTWRITEHEADERFILE;
805 if(access(datfile, 0) != -1) remove(datfile);
811 if(ret!=0) {
imgEmpty(&test_img);
return ret;}
814 imgEmpty(&test_img);
return STATUS_WRONGFILETYPE;}
818 imgEmpty(&test_img);
return STATUS_VARMATSIZE;}
823 if((ret=
anaReadHeader(hdrfile, &dsr))!=0)
return STATUS_NOMAINHEADER;
825 if(frame_to_write==0) frame_to_write=dsr.
dime.
dim[4]+1;
826 if(dsr.
dime.
dim[4]<frame_to_write) {
827 if(dsr.
dime.
dim[4]+1<frame_to_write)
return STATUS_MISSINGMATRIX;
828 dsr.
dime.
dim[4]=frame_to_write;
830 if((ret=
anaWriteHeader(hdrfile, &dsr))!=0)
return STATUS_NOWRITEPERM;
833 printf(
"frame_to_write := %d\n", frame_to_write);
834 printf(
"hdrfile := %s\n", hdrfile);
835 printf(
"datfile := %s\n", datfile);
836 printf(
"siffile := %s\n", siffile);
841 sdata=(
short int*)malloc(pxlNr*
sizeof(
short int));
842 if(sdata==NULL)
return STATUS_NOMEMORY;
845 if(frame_to_write==1) fp=fopen(datfile,
"wb");
else fp=fopen(datfile,
"r+b");
846 if(fp==NULL) {free(sdata);
return STATUS_CANTWRITEIMGFILE;}
848 if(fseeko(fp, (frame_to_write-1)*pxlNr*img->
dimz*
sizeof(
short int),
850 free(sdata); fclose(fp);
return STATUS_MISSINGMATRIX;}
854 for(
int zi=0; zi<img->
dimz; zi++) {
857 for(
int yi=img->
dimy-1; yi>=0; yi--)
858 for(
int xi=img->
dimx-1; xi>=0; xi--) {
859 *sptr=
temp_roundf(scale_factor*img->
m[zi][yi][xi][frame_index]);
863 sptr=sdata;
if(little!=dsr.
little)
swabip(sptr, pxlNr*
sizeof(
short int));
866 if(fwrite(sptr,
sizeof(
short int), pxlNr, fp) != pxlNr) {
867 free(sdata); fclose(fp);
return STATUS_CANTWRITEIMGFILE;
871 for(
int zi=img->
dimz-1; zi>=0; zi--) {
873 for(
int yi=img->
dimy-1; yi>=0; yi--)
874 for(
int xi=img->
dimx-1; xi>=0; xi--) {
875 *sptr=
temp_roundf(scale_factor*img->
m[zi][yi][xi][frame_index]);
879 sptr=sdata;
if(little!=dsr.
little)
swabip(sptr, pxlNr*
sizeof(
short int));
882 if(fwrite(sptr,
sizeof(
short int), pxlNr, fp) != pxlNr) {
883 free(sdata); fclose(fp);
return STATUS_CANTWRITEIMGFILE;
int anaWriteHeader(char *filename, ANALYZE_DSR *h)
int anaExistsNew(const char *filename, char *hdrfile, char *imgfile, char *siffile)
int anaPrintHeader(ANALYZE_DSR *h, FILE *fp)
int anaDatabaseExists(const char *dbname, char *hdrfile, char *imgfile, char *siffile)
int anaReadHeader(char *filename, ANALYZE_DSR *h)
int anaReadImagedata(FILE *fp, ANALYZE_DSR *h, int frame, float *data)
struct tm * gmtime_r(const time_t *t, struct tm *tm)
Convert time_t to GMT struct tm.
double hlFromIsotope(char *isocode)
int imgAllocate(IMG *image, int planes, int rows, int columns, int frames)
void imgSetStatus(IMG *img, int status_index)
void imgEmpty(IMG *image)
int imgWriteAnalyze(const char *dbname, IMG *img)
int imgGetAnalyzeHeader(IMG *img, ANALYZE_DSR *h)
int imgReadAnalyzeFirstFrame(const char *fname, IMG *img)
int imgReadAnalyzeFrame(const char *fname, int frame_to_read, IMG *img, int frame_index)
int imgReadAnalyzeHeader(const char *dbname, IMG *img)
int imgSetAnalyzeHeader(IMG *img, const char *dbname, ANALYZE_DSR *dsr, float fmin, float fmax)
int imgWriteAnalyzeFrame(const char *dbname, int frame_to_write, IMG *img, int frame_index, float fmin, float fmax)
int imgReadAnalyze(const char *dbname, IMG *img)
int img2sif(IMG *img, SIF *sif, int copy_header, int copy_frames, int copy_counts, int verbose)
int sif2img(SIF *sif, IMG *img, int copy_header, int copy_frames, int copy_counts, int verbose)
int imgMinMax(IMG *img, float *minvalue, float *maxvalue)
Header file for libtpcimgio.
#define NIFTI_XFORM_UNKNOWN
int sifWrite(SIF *data, char *filename)
#define IMG_STATUS_OCCUPIED
#define ANALYZE_DT_SIGNED_SHORT
#define IMG_STATUS_INITIALIZED
#define IMG_DC_NONCORRECTED
#define NIFTI_XFORM_SCANNER_ANAT
int sifRead(char *filename, SIF *data)
void swabip(void *buf, long long int size)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
ANALYZE_HEADER_HISTORY hist
ANALYZE_HEADER_IMGDIM dime
char studyNr[MAX_STUDYNR_LEN+1]
char studynr[MAX_STUDYNR_LEN+1]