23 char upetheader[FILENAME_MAX], upetimage[FILENAME_MAX];
25 int acquisition_mode, data_type;
29 if(verbose>1) printf(
"\n%s(%s, %s, %d)\n", __func__, upetname, ecatfile, verbose);
31 if(upetname==NULL || ecatfile==NULL)
return STATUS_FAULT;
32 ret=
upetExists(upetname, upetheader, upetimage, verbose-1);
33 if(ret!=2)
return STATUS_NOFILE;
39 if((fph=fopen(upetheader,
"r"))==NULL)
return(STATUS_NOHEADERFILE);
40 if((fpi=fopen(upetimage,
"rb"))==NULL) {fclose(fph);
return(STATUS_NOIMGDATA);}
47 if(verbose>1) printf(
"checking that image format is supported\n");
49 (void)sscanf(tmp,
"%d", &n);
50 if(verbose>2) printf(
"file_type := %d\n", n);
51 if(n!=5) {fclose(fph); fclose(fpi);
return(STATUS_UNSUPPORTED);}
54 (void)sscanf(tmp,
"%d", &acquisition_mode);
55 if(verbose>2) printf(
"acquisition_mode := %d\n", acquisition_mode);
56 if(acquisition_mode!=2 && acquisition_mode!=3 && acquisition_mode!=9) {
57 fclose(fph); fclose(fpi);
return(STATUS_UNSUPPORTED);}
60 (void)sscanf(tmp,
"%d", &data_type);
61 if(verbose>2) printf(
"data_type := %d\n", data_type);
62 if(data_type!=4 && data_type!=2) {
63 fclose(fph); fclose(fpi);
return(STATUS_UNSUPPORTED);}
68 if(acquisition_mode==2 || acquisition_mode==3) {
70 }
else if(acquisition_mode==9) {
73 ret=STATUS_UNSUPPORTED;
75 fclose(fph); fclose(fpi);
95 int n, zi, xi, yi, ti, ret;
98 if(verbose>1) printf(
"%s(*fph, *fpi, %s, %d)\n", __func__, ecatfile, verbose);
100 if(fph==NULL || fpi==NULL || ecatfile==NULL)
return STATUS_FAULT;
103 if(access(ecatfile, 0)!=-1 && remove(ecatfile)!=0) {
104 return(STATUS_CANNOTERASE);
110 int zdim, xdim, ydim, tdim;
112 if(ret) {
return(STATUS_INVALIDHEADER);}
114 printf(
"z_dim := %d\n", zdim);
115 printf(
"x_dim := %d\n", xdim);
116 printf(
"y_dim := %d\n", ydim);
117 printf(
"t_dim := %d\n", tdim);
126 if(ret) {
return(STATUS_NOMEMORY);}
128 float calibration_factor;
131 if(verbose>2) printf(
"ret := %d\n", ret);
132 imgEmpty(&img);
return(STATUS_INVALIDHEADER);
134 if(verbose>1) printf(
"calibration_factor := %g\n", calibration_factor);
140 long long int pxlnr=xdim*ydim*zdim;
142 mdata=(
char*)malloc(pxlnr*
sizeof(
float));
if(mdata==NULL) {
143 imgEmpty(&img);
return(STATUS_NOMEMORY);
147 for(ti=0; ti<tdim; ti++) {
148 if(verbose>3) {printf(
"ti=%d\n", ti); fflush(stdout);}
152 if(verbose==0) {fprintf(stdout,
"\n"); fflush(stdout);}
154 return(STATUS_INVALIDHEADER);
158 if((n=fread(mptr, 4, pxlnr, fpi)) < pxlnr) {
159 if(verbose==0) {fprintf(stdout,
"\n"); fflush(stdout);}
161 return(STATUS_NOMATRIX);
165 for(zi=0; zi<zdim; zi++)
166 for(yi=0; yi<ydim; yi++)
167 for(xi=0; xi<xdim; xi++) {
169 img.
m[zi][yi][xi][0]=(*fptr)*img.
weight[0]*calibration_factor;
174 if(ret!=STATUS_OK)
break;
175 if(verbose>1) {printf(
" frame written.\n"); fflush(stdout);}
176 else if(verbose==0) {fprintf(stdout,
"."); fflush(stdout);}
179 if(verbose==0) {fprintf(stdout,
"\n"); fflush(stdout);}
180 if(verbose==0 && ret==STATUS_NOMATRIX) {
181 fprintf(stdout,
" %d frame(s) processed.\n", ti);
183 if(ret!=STATUS_OK && ret!=STATUS_NOMATRIX) {
184 remove(ecatfile);
return ret;
207 int n, zi, xi, yi, zdim, xdim, ydim, ret;
214 if(verbose>1) printf(
"%s(*fph, *fpi, %s, %d)\n", __func__, ecatfile, verbose);
216 if(fph==NULL || fpi==NULL || ecatfile==NULL)
return STATUS_FAULT;
222 if(ret) {
return(STATUS_INVALIDHEADER);}
224 printf(
"z_dim := %d\n", zdim);
225 printf(
"x_dim := %d\n", xdim);
226 printf(
"y_dim := %d\n", ydim);
232 return(STATUS_INVALIDHEADER);}
233 scale_factor=-1; (void)sscanf(tmp,
"%f", &scale_factor);
234 if(scale_factor<=0)
return(STATUS_INVALIDHEADER);
236 printf(
"scale_factor := %g\n", scale_factor);
240 if(access(ecatfile, 0)!=-1 && remove(ecatfile)!=0) {
241 return(STATUS_CANNOTERASE);
250 if(ret) {
return(STATUS_NOMEMORY);}
254 if(verbose>1) printf(
"ret := %d\n", ret);
255 imgEmpty(&img);
return(STATUS_INVALIDHEADER);
262 long long pxlNr=xdim*ydim;
263 mdata=(
char*)malloc(pxlNr*
sizeof(
short int));
if(mdata==NULL) {
264 imgEmpty(&img);
return(STATUS_NOMEMORY);
267 for(zi=0; zi<zdim; zi++) {
269 if((n=fread(mptr, 2, pxlNr, fpi)) < pxlNr) {
270 if(verbose==0) {fprintf(stdout,
"\n"); fflush(stdout);}
272 return(STATUS_NOMATRIX);
276 for(yi=0; yi<ydim; yi++)
277 for(xi=0; xi<xdim; xi++) {
279 img.
m[zi][yi][xi][0]=(float)*si*scale_factor;
282 if(verbose>3) printf(
" plane %d\n", zi+1);
283 else if(verbose==0) {fprintf(stdout,
"."); fflush(stdout);}
286 if(verbose==0) {fprintf(stdout,
"\n"); fflush(stdout);}
289 if(ret!=0) {
imgEmpty(&img);
return(STATUS_CANNOTWRITE);}
306 float *calibration_factor,
315 if(verbose>0) printf(
"%s(*fp, *img, *f)\n", __func__);
316 if(fp==NULL)
return 1;
317 if(img==NULL)
return 2;
321 if(verbose>1) printf(
" reading 'model'\n");
323 n=-1; (void)sscanf(tmp,
"%d", &n);
if(n<0)
return 11;
328 if(verbose>1) printf(
" reading 'zoom'\n");
330 f=-1; (void)sscanf(tmp,
"%f", &f);
if(f<0)
return 11;
335 if(verbose>1) printf(
" reading 'pixel_size'\n");
337 f=-1; (void)sscanf(tmp,
"%f", &f);
339 if(verbose>2) printf(
" pixel_size := %g cm\n", f);
346 if(verbose>1) printf(
" reading 'pixel_size_x'\n");
348 f=-1; (void)sscanf(tmp,
"%f", &f);
if(f<0)
return 12;
349 if(verbose>2) printf(
" pixel_size_x := %g\n", f);
355 if(verbose>1) printf(
" reading 'pixel_size_y'\n");
357 f=-1; (void)sscanf(tmp,
"%f", &f);
if(f<0)
return 13;
358 if(verbose>2) printf(
" pixel_size_y := %g\n", f);
364 if(verbose>1) printf(
" reading 'pixel_size_z'\n");
366 f=-1; (void)sscanf(tmp,
"%f", &f);
if(f<0)
return 14;
367 if(verbose>2) printf(
" pixel_size_z := %g\n", f);
370 if(verbose>0) printf(
" cannot find 'pixel_size_z'\n");
372 if(verbose>1) printf(
" reading 'axial_plane_size'\n");
374 if(verbose>0) printf(
" cannot find 'axial_plane_size'\n");
377 f=-1; (void)sscanf(tmp,
"%f", &f);
if(f<0)
return 14;
378 if(verbose>2) printf(
" axial_pixel_size := %g cm\n", f);
384 if(verbose>1) printf(
" reading 'transaxial_bin_size'\n");
386 f=-1; (void)sscanf(tmp,
"%f", &f);
387 if(verbose>2) printf(
" transaxial_pixel_size := %g cm\n", f);
393 if(verbose>1) printf(
" reading 'isotope_half_life'\n");
395 f=-1; (void)sscanf(tmp,
"%f", &f);
if(f<0)
return 15;
401 if(verbose>1) printf(
" reading 'isotope_branching_fraction'\n");
403 f=-1; (void)sscanf(tmp,
"%f", &f);
if(f<0)
return 16;
409 if(verbose>1) printf(
" reading 'decay_correction_applied'\n");
411 n=-1; (void)sscanf(tmp,
"%d", &n);
if(n<0)
return 17;
418 if(verbose>1) printf(
" reading 'calibration_units'\n");
420 n=-1; (void)sscanf(tmp,
"%d", &n);
if(n<0)
return 18;
422 case 1: img->
unit=CUNIT_NCI_PER_ML;
break;
423 case 2: img->
unit=CUNIT_BQ_PER_ML;
break;
424 case 3: img->
unit=CUNIT_HU;
break;
426 default: img->
unit=CUNIT_UNKNOWN;
break;
432 if(verbose>1) printf(
" reading 'calibration_factor'\n");
433 if(calibration_factor!=NULL &&
436 f=-1; (void)sscanf(tmp,
"%f", &f);
if(f<=0.0)
return 19;
437 *calibration_factor=f;
443 if(verbose>1) printf(
" reading 'radial_fov'\n");
445 f=-1; (void)sscanf(tmp,
"%f", &f);
if(f<0)
return 20;
471 if(verbose>0) printf(
"%s(*fp, *img, %d)\n", __func__, frame_index);
472 if(fp==NULL)
return 1;
473 if(img==NULL)
return 2;
474 if(frame_index<0)
return 3;
480 sprintf(tmp,
"frame %d", frame_index);
481 if(verbose>1) printf(
" reading '%s'\n", tmp);
485 if(verbose>1) printf(
" reading 'frame_start'\n");
487 f=-1.0; (void)sscanf(tmp,
"%f", &f);
if(f<0.0)
return 11;
491 if(verbose>1) printf(
" reading 'frame_duration'\n");
493 f=-1.0; (void)sscanf(tmp,
"%f", &f);
if(f<0.0)
return 12;
498 if(verbose>1) printf(
" reading 'scale_factor'\n");
500 f=-1; (void)sscanf(tmp,
"%f", &f);
if(f<0)
return 13;
504 if(verbose>1) printf(
" reading 'decay_correction'\n");
506 f=-1; (void)sscanf(tmp,
"%f", &f);
if(f<0)
return 14;
527 if(fp==NULL)
return 1;
528 if(sif==NULL)
return 2;
534 n=-1; (void)sscanf(tmp,
"%d", &n);
if(n<1)
return 11;
537 ret=
sifSetmem(sif, n);
if(ret!=0)
return 4;
551 for(i=0; i<sif->
frameNr; i++) {
553 sprintf(tmp,
"frame %d", i);
557 n=-1; (void)sscanf(tmp,
"%d", &n);
if(n<0)
return 22;
561 n=-1; (void)sscanf(tmp,
"%d", &n);
if(n<0)
return 23;
562 sif->
x2[i]=sif->
x1[i]+n;
565 n=-1; (void)sscanf(tmp,
"%s %s %d", tmp2, tmp3, &n);
if(n<0)
return 24;
569 n=-1; (void)sscanf(tmp,
"%s %s %d", tmp2, tmp3, &n);
if(n<0)
return 25;
590#pragma clang diagnostic push
591#pragma clang diagnostic ignored "-Wmissing-field-initializers"
592 struct tm scanstart={0};
593#pragma clang diagnostic pop
598 if(img==NULL)
return STATUS_FAULT;
602 if(img->
ift.
keyNr<10)
return STATUS_FAULT;
608 if(i<0)
return STATUS_INVALIDHEADER;
609 if(n!=5) {
imgSetStatus(img, STATUS_UNSUPPORTED);
return STATUS_UNSUPPORTED;}
612 if(i<0)
return STATUS_INVALIDHEADER;
614 imgSetStatus(img, STATUS_UNSUPPORTED);
return STATUS_UNSUPPORTED;}
617 if(i<0)
return STATUS_INVALIDHEADER;
619 imgSetStatus(img, STATUS_UNSUPPORTED);
return STATUS_UNSUPPORTED;}
623 if(i<0)
return STATUS_INVALIDHEADER;
624 if(img->
scanner<0)
return STATUS_INVALIDHEADER;
628 if(i<0)
return STATUS_INVALIDHEADER;
629 img->
dimt=n;
if(img->
dimt<1)
return STATUS_INVALIDHEADER;
631 if(i<0)
return STATUS_INVALIDHEADER;
632 img->
dimx=n;
if(img->
dimx<1)
return STATUS_INVALIDHEADER;
634 if(i<0)
return STATUS_INVALIDHEADER;
635 img->
dimy=n;
if(img->
dimy<1)
return STATUS_INVALIDHEADER;
637 if(i<0)
return STATUS_INVALIDHEADER;
638 img->
dimz=n;
if(img->
dimz<1)
return STATUS_INVALIDHEADER;
642 if(i<0)
return STATUS_INVALIDHEADER;
643 if(img->
zoom<0.0)
return STATUS_INVALIDHEADER;
648 if(img->
sizex<0.0)
return STATUS_INVALIDHEADER;
651 if(i<0 || img->sizex<0.0)
return STATUS_INVALIDHEADER;
658 if(img->
sizey<0.0)
return STATUS_INVALIDHEADER;
661 if(i<0 || img->sizey<0.0)
return STATUS_INVALIDHEADER;
669 if(img->
sizez<0.0)
return STATUS_INVALIDHEADER;
672 if(i<0 || img->sizez<0.0)
return STATUS_INVALIDHEADER;
676 if(i>=0 && f>0.0) img->
sizez=10.0*f;
680 if(i<0 || img->isotopeHalflife<0.0)
return STATUS_INVALIDHEADER;
688 if(i<0 || n<0.0)
return STATUS_INVALIDHEADER;
694 if(i<0 || n<0.0)
return STATUS_INVALIDHEADER;
696 case 1: img->
unit=CUNIT_NCI_PER_ML;
break;
697 case 2: img->
unit=CUNIT_BQ_PER_ML;
break;
698 case 3: img->
unit=CUNIT_HU;
break;
700 default: img->
unit=CUNIT_UNKNOWN;
break;
705 if(i<0 || img->calibrationFactor<0.0)
return STATUS_INVALIDHEADER;
710 if(i<0)
return STATUS_INVALIDHEADER;
718 strcpy(key,
"study"); n=1;
722 strcpy(key,
"file_name");
726 if(n!=0 &&
MICROPET_TEST>1) printf(
"Valid studyNr could not be read.\n");
729 strcpy(key,
"scan_time");
730 if((i=
iftGet(&img->
ift, key, 0))<0)
return STATUS_INVALIDHEADER;
731 n=sscanf(img->
ift.
item[i].
value,
"%s %s %d %d:%d:%d %d",
732 tmp2, tmp3, &scanstart.tm_mday,
733 &scanstart.tm_hour, &scanstart.tm_min, &scanstart.tm_sec, &i);
735 scanstart.tm_year=i-1900;
736 if(strcasecmp(tmp3,
"Jan")==0) scanstart.tm_mon=0;
737 else if(strcasecmp(tmp3,
"Feb")==0) scanstart.tm_mon=1;
738 else if(strcasecmp(tmp3,
"Mar")==0) scanstart.tm_mon=2;
739 else if(strcasecmp(tmp3,
"Apr")==0) scanstart.tm_mon=3;
740 else if(strcasecmp(tmp3,
"May")==0) scanstart.tm_mon=4;
741 else if(strcasecmp(tmp3,
"Jun")==0) scanstart.tm_mon=5;
742 else if(strcasecmp(tmp3,
"Jul")==0) scanstart.tm_mon=6;
743 else if(strcasecmp(tmp3,
"Aug")==0) scanstart.tm_mon=7;
744 else if(strcasecmp(tmp3,
"Sep")==0) scanstart.tm_mon=8;
745 else if(strcasecmp(tmp3,
"Oct")==0) scanstart.tm_mon=9;
746 else if(strcasecmp(tmp3,
"Nov")==0) scanstart.tm_mon=10;
747 else if(strcasecmp(tmp3,
"Dec")==0) scanstart.tm_mon=11;
748 scanstart.tm_isdst=-1;
751 }
else return STATUS_INVALIDHEADER;
773 char hdrfile[FILENAME_MAX];
776 if(
IMG_TEST) printf(
"\n%s(%s, *img)\n", __func__, dbname);
779 if(img==NULL)
return STATUS_FAULT;
782 if(dbname==NULL)
return STATUS_FAULT;
786 if(ret==0)
return STATUS_NOFILE;
792 if(
IMG_TEST>1) printf(
"defRead() return value := %d\n", ret);
793 return(STATUS_FAULT);
831 int i, fi, ret, zi, xi, yi;
832 float *fdata=NULL, *fptr, f;
833 char datfile[FILENAME_MAX], hdrfile[FILENAME_MAX];
837 if(
IMG_TEST) printf(
"\n%s(%s, %d, *img, %d)\n", __func__, fname, frame_to_read, frame_index);
840 if(img==NULL)
return STATUS_FAULT;
842 if(fname==NULL)
return STATUS_FAULT;
843 if(frame_index<0 || frame_index>img->
dimt-1)
return STATUS_FAULT;
844 if(frame_to_read<1)
return STATUS_FAULT;
849 if(ret<2) {
imgSetStatus(img, STATUS_NOFILE);
return STATUS_NOFILE;}
857 if(
IMG_TEST>1) printf(
"defRead() return value := %d\n", ret);
858 return(STATUS_INVALIDHEADER);
864 strcpy(key,
"frame"); sprintf(value,
"%d", frame_to_read-1);
866 if(fi<0) {
imgSetStatus(img, STATUS_NOMATRIX);
return STATUS_NOMATRIX;}
868 if(i<0 || isnan(f)) {
return STATUS_INVALIDHEADER;}
869 img->
start[frame_index]=f;
871 if(i<0 || isnan(f) || f<0.0) {
return STATUS_INVALIDHEADER;}
872 img->
end[frame_index]=img->
start[frame_index]+f;
873 img->
mid[frame_index]=0.5*(img->
end[frame_index]+img->
start[frame_index]);
876 if(i<0 || isnan(f) || f<0.0) {
return STATUS_INVALIDHEADER;}
886 if(
IMG_TEST>2) fprintf(stdout,
"reading image data %s\n", datfile);
887 if((fp=fopen(datfile,
"rb"))==NULL) {
888 imgSetStatus(img, STATUS_NOIMGDATA);
return STATUS_NOIMGDATA;}
891 fdata=malloc((
size_t)img->
dimx*img->
dimy*img->
dimz*
sizeof(
float));
894 return STATUS_NOMEMORY;
900 if(ret!=0 &&
IMG_TEST) fprintf(stdout,
"upetReadImagedata() := %d\n", ret);
903 free(fdata);
imgSetStatus(img, STATUS_NOMATRIX);
return STATUS_NOMATRIX;}
905 free(fdata);
imgSetStatus(img, STATUS_UNSUPPORTED);
return STATUS_UNSUPPORTED;}
909 for(zi=0; zi<img->
dimz; zi++)
910 for(yi=0; yi<img->
dimy; yi++)
911 for(xi=0; xi<img->
dimx; xi++)
912 img->
m[zi][yi][xi][frame_index]=*fptr++;
934 if(
IMG_TEST) printf(
"\n%s(%s, *img)\n", __func__, fname);
936 if(img==NULL)
return STATUS_FAULT;
939 if(fname==NULL)
return STATUS_FAULT;
943 if(
IMG_TEST>1) printf(
"imgReadMicropetHeader() := %s\n", img->
statmsg);
950 if(ret)
return STATUS_NOMEMORY;
980 if(
IMG_TEST) printf(
"\n%s(%s, *img)\n", __func__, fname);
982 if(img==NULL)
return STATUS_FAULT;
985 if(fname==NULL)
return STATUS_FAULT;
989 if(
IMG_TEST>2) printf(
"reading frame %d\n", fi+1);
992 if(
IMG_TEST>0) printf(
"imgReadMicropetFirstFrame() := %s\n", img->
statmsg);
998 if(
IMG_TEST>2) printf(
"reading frame %d\n", fi+1);
1001 if(ret!=STATUS_OK && ret!=STATUS_NOMATRIX) {
1002 if(
IMG_TEST>0) printf(
"imgReadMicropetFrame() := %s\n", img->
statmsg);
1005 if(
IMG_TEST>1) printf(
"%d frame(s) were read.\n", fi);
float branchingFraction(int isotope)
time_t timegm(struct tm *tm)
Inverse of gmtime, converting struct tm to time_t.
int defRead(IFT *ift, char *filename, int verbose)
int iftGetFloatValue(IFT *ift, int si, const char *key, float *value, int verbose)
int iftGet(IFT *ift, char *key, int verbose)
int iftGetFullmatchFrom(IFT *ift, int si, const char *key, const char *value, int verbose)
int iftGetIntValue(IFT *ift, int si, const char *key, int *value, int verbose)
int imgAllocate(IMG *image, int planes, int rows, int columns, int frames)
void imgSetStatus(IMG *img, int status_index)
void imgEmpty(IMG *image)
int imgMicropetPETToEcat7(FILE *fph, FILE *fpi, char *ecatfile, int verbose)
int imgGetMicropetMainHeader(FILE *fp, IMG *img, float *calibration_factor, int verbose)
int imgGetMicropetHeader(IMG *img)
int imgGetMicropetFrameHeader(FILE *fp, IMG *img, int frame_index, int verbose)
int imgReadMicropetFirstFrame(const char *fname, IMG *img)
int imgMicropetCTToEcat7(FILE *fph, FILE *fpi, char *ecatfile, int verbose)
int imgReadMicropetFrame(const char *fname, int frame_to_read, IMG *img, int frame_index)
int imgMicropetToEcat7(char *upetname, char *ecatfile, int verbose)
int imgGetMicropetSIF(FILE *fp, SIF *sif)
int imgReadMicropetHeader(const char *dbname, IMG *img)
int imgReadMicropet(const char *fname, IMG *img)
int imgWriteFrame(const char *fname, int frame_to_write, IMG *img, int frame_index)
int imgWrite(const char *fname, IMG *img)
Header file for libtpcimgio.
#define IMG_STATUS_OCCUPIED
int upetScanStart(FILE *fp, time_t *scant)
#define IMG_STATUS_INITIALIZED
int upetGetImageDimensions(FILE *fp, int *z, int *x, int *y, int *f)
#define IMG_DC_NONCORRECTED
int upetHeaderReadParameter(FILE *fp, char *parameter, char *value)
int upetExists(const char *upetname, char *hdrfile, char *imgfile, int verbose)
int sifSetmem(SIF *data, int frameNr)
int upetReadImagedata(FILE *fp, IFT *ift, int frame, float *data)
#define MAX_MICROPET_LINE_LEN
int studynr_from_fname2(char *fname, char *studynr, int force)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
int studynr_from_fname(char *fname, char *studynr)
char studyNr[MAX_STUDYNR_LEN+1]