163 if(status!=NULL) sprintf(status,
"invalid filename");
164 if(trafile==NULL || !trafile[0])
return(1);
165 if(blkfile==NULL || !blkfile[0])
return(1);
166 if(norfile==NULL || !blkfile[0])
return(1);
167 if(atnfile==NULL || !atnfile[0])
return(1);
173 FILE *fptra=NULL, *fpblk=NULL, *fpnor=NULL;
174 if(verbose>0) printf(
"opening %s\n", trafile);
175 if((fptra=fopen(trafile,
"rb")) == NULL) {
176 if(status!=NULL) sprintf(status,
"cannot open transmission sinogram");
179 if(verbose>0) printf(
"opening %s\n", blkfile);
180 if((fpblk=fopen(blkfile,
"rb")) == NULL) {
181 if(status!=NULL) sprintf(status,
"cannot open blank sinogram");
185 if(verbose>0) printf(
"opening %s\n", norfile);
186 if((fpnor=fopen(norfile,
"rb")) == NULL) {
187 if(status!=NULL) sprintf(status,
"cannot open normalization file");
188 fclose(fptra); fclose(fpblk);
195 if(verbose>1) printf(
"reading transmission main header\n");
198 if(status!=NULL) sprintf(status,
"cannot read transmission main header");
199 fclose(fptra); fclose(fpblk); fclose(fpnor);
203 if(verbose>4) printf(
"file_type := %d\n", tra_main_header.
file_type);
205 if(verbose>1) printf(
"reading blank main header\n");
208 if(status!=NULL) sprintf(status,
"cannot read blank main header");
209 fclose(fptra); fclose(fpblk); fclose(fpnor);
213 if(verbose>4) printf(
"file_type := %d\n", blk_main_header.
file_type);
215 if(verbose>1) printf(
"reading normalization main header\n");
218 if(status!=NULL) sprintf(status,
"cannot read blank main header");
219 fclose(fptra); fclose(fpblk); fclose(fpnor);
223 if(verbose>4) printf(
"file_type := %d\n", nor_main_header.
file_type);
229 if(status!=NULL) sprintf(status,
"file is not a sinogram");
230 fclose(fptra); fclose(fpblk); fclose(fpnor);
235 time_t tra_start, blk_start;
240 printf(
"Blank scan start time := %s\n",
ctime_r_int(&blk_start, buf));
241 printf(
"Transmission scan start time := %s\n",
ctime_r_int(&tra_start, buf));
243 if(decay!=0 && (tra_start==0 || blk_start==0)) {
244 if(status!=NULL) sprintf(status,
"missing scan start time");
245 fclose(fptra); fclose(fpblk); fclose(fpnor);
248 double start_time_diff=difftime(tra_start, blk_start);
249 if(verbose>1) {printf(
"scan start time difference := %g\n", start_time_diff);}
252 double halflife=-1.0;
255 if(verbose>1 && halflife>0.0) {printf(
"isotope halflife := %g\n", halflife);}
256 if(decay!=0 && halflife<=0.0) {
257 if(status!=NULL) sprintf(status,
"missing isotope halflife");
258 fclose(fptra); fclose(fpblk); fclose(fpnor);
267 if(verbose>1) printf(
"reading transmission matrix list\n");
271 if(status!=NULL) sprintf(status,
"cannot read sinogram matrix list");
272 fclose(fptra); fclose(fpblk); fclose(fpnor);
276 if(verbose>1) printf(
"reading blank matrix list\n");
280 if(status!=NULL) sprintf(status,
"cannot read blank matrix list");
282 fclose(fptra); fclose(fpblk); fclose(fpnor);
286 if(verbose>1) printf(
"reading normalization matrix list\n");
290 if(status!=NULL) sprintf(status,
"cannot read normalization matrix list");
292 fclose(fptra); fclose(fpblk); fclose(fpnor);
298 if(status!=NULL) sprintf(status,
"empty matrix list");
301 fclose(fptra); fclose(fpblk); fclose(fpnor);
307 if(status!=NULL) sprintf(status,
"invalid matrix list");
310 fclose(fptra); fclose(fpblk); fclose(fpnor);
314 printf(
"transmission_matrixNr := %d\n", tra_mlist.
matrixNr);
315 printf(
"blank_matrixNr := %d\n", blk_mlist.
matrixNr);
316 printf(
"normalization_matrixNr := %d\n", nor_mlist.
matrixNr);
323 if(status!=NULL) sprintf(status,
"different plane numbers");
326 fclose(fptra); fclose(fpblk); fclose(fpnor);
333 if(verbose>0) printf(
"writing main header in %s\n", atnfile);
343 if(status!=NULL) sprintf(status,
"cannot write attenuation file\n");
346 fclose(fptra); fclose(fpblk); fclose(fpnor);
351 if(imgfile!=NULL && imgfile[0]) {
352 if(verbose>0) printf(
"writing main header in %s\n", imgfile);
362 if(status!=NULL) sprintf(status,
"cannot write transmission image\n");
365 fclose(fptra); fclose(fpblk); fclose(fpnor);
375 if(verbose>0) printf(
"processing matrices...\n");
377 for(
int mi=0; mi<tra_mlist.
matrixNr; mi++) {
378 if(verbose==1) {fprintf(stdout,
"."); fflush(stdout);}
390 int dimx, dimy, scnpxlNr=0, imgpxlNr=0, matnum=0, ni=0, bi=0;
391 float *tramat, *blkmat, *normat, f;
398 if(verbose>1) printf(
"reading transmission matrix %d\n", 1+mi);
403 sprintf(status,
"cannot read transmission sinogram matrix %u", tra_mlist.
matdir[mi].
matnum);
408 printf(
"Matrix: plane %d frame %d gate %d bed %d\n",
412 }
else if(verbose>1 && mi==0) {
413 printf(
"Transmission sinogram dimensions := %d x %d\n",
415 printf(
"Transmission sinogram frame duration := %g\n",
417 printf(
"Transmission sinogram dead-time correction := %g\n",
423 if(imgDim<2) imgDim=dimx;
426 for(
int i=0; i<scnpxlNr; i++)
431 if(status!=NULL) sprintf(status,
"missing frame duration in transmission sinogram");
437 for(
int i=0; i<scnpxlNr; i++) tramat[i]*=f;
441 for(ni=0; ni<nor_mlist.
matrixNr; ni++)
446 sprintf(status,
"cannot find matrix %u in normalization sinogram",
453 if(verbose>1) printf(
"reading normalization matrix %d\n", 1+ni);
458 sprintf(status,
"cannot read blank sinogram matrix %u", nor_mlist.
matdir[ni].
matnum);
465 }
else if(verbose>1 && mi==0) {
466 printf(
"Normalization sinogram dimensions := %d x %d\n",
468 printf(
"Normalization sinogram frame duration := %g\n",
470 printf(
"Normalization sinogram dead-time correction := %g\n",
476 if(status!=NULL) sprintf(status,
"incompatible matrix dimensions");
477 free(tramat); free(normat);
483 for(
int i=0; i<scnpxlNr; i++) tramat[i]*=normat[i];
486 for(
int i=0; i<scnpxlNr; i++)
if(tramat[i]<0.0) tramat[i]=0.0;
491 for(bi=0; bi<blk_mlist.
matrixNr; bi++)
496 sprintf(status,
"cannot find matrix %u in blank sinogram", blk_mlist.
matdir[bi].
matnum);
497 free(tramat); free(normat);
502 if(verbose>1) printf(
"reading blank matrix %d\n", 1+bi);
507 sprintf(status,
"cannot read blank sinogram matrix %u", blk_mlist.
matdir[bi].
matnum);
508 free(tramat); free(normat);
514 }
else if(verbose>1 && mi==0) {
515 printf(
"Blank sinogram dimensions := %d x %d\n",
517 printf(
"Blank sinogram frame duration := %g\n",
519 printf(
"Blank sinogram dead-time correction := %g\n",
525 if(status!=NULL) sprintf(status,
"incompatible matrix dimensions");
526 free(tramat); free(normat); free(blkmat);
532 for(
int i=0; i<scnpxlNr; i++)
537 if(status!=NULL) sprintf(status,
"missing frame duration in blank sinogram");
538 free(tramat); free(normat); free(blkmat);
543 for(
int i=0; i<scnpxlNr; i++) blkmat[i]*=f;
546 for(
int i=0; i<scnpxlNr; i++) blkmat[i]*=normat[i];
548 if(keepNegat==0)
for(
int i=0; i<scnpxlNr; i++)
if(blkmat[i]<0.0) blkmat[i]=0.0;
560 double t=start_time_diff;
564 if(verbose>1 && mi==0) {
565 printf(
"frame start time difference := %g\n", t);
566 printf(
"decay correction factor := %g\n", dcf);
568 for(
int i=0; i<scnpxlNr; i++) tramat[i]*=dcf;
573 if(verbose>3) printf(
"setting attenuation sub-header\n");
592 if(lfpimg!=NULL && mi==0) {
593 if(verbose>6) printf(
"setting transmission image sub-header\n");
636 if(verbose>1) {printf(
"matrix reconstruction\n"); fflush(stdout);}
638 float imgmat[imgpxlNr];
639 ret=
trmrp(blkmat, tramat, dimx, imgmat, 120, 1,
640 dimx, dimy, maskDim, 1.0, beta,
645 if(status!=NULL) sprintf(status,
"cannot calculate attenuation correction factors");
646 if(verbose>1) printf(
"trmrp_return_value := %d\n", ret);
647 free(tramat); free(normat); free(blkmat);
652 for(
int i=0; i<imgpxlNr; i++)
653 if(!isfinite(imgmat[i])) {
654 printf(
" inf in the image!\n");
665 if(lfpimg!=NULL && imgDim==dimx && zoom==1.0 && shiftX==0.0 && shiftY==0.0 && rotation==0.0) {
666 if(verbose>1) printf(
"writing transmission image matrix\n");
670 if(status!=NULL) sprintf(status,
"cannot write transmission image matrix");
671 if(verbose>1) printf(
"ret := %d\n", ret);
672 free(tramat); free(normat); free(blkmat);
681 if(verbose>1) {printf(
"matrix reprojection\n"); fflush(stdout);}
682 float atnmat[scnpxlNr];
683 ret=
reprojection(imgmat, dimx, dimx, dimy, 1.0, atnmat, verbose-10);
685 if(status!=NULL) sprintf(status,
"cannot reproject attenuation correction data");
686 if(verbose>1) printf(
"trmrp_return_value := %d\n", ret);
687 free(tramat); free(normat); free(blkmat);
692 for(
int i=0; i<scnpxlNr; i++)
693 if(!isfinite(atnmat[i])) {
694 printf(
" inf in the log attenuation data!\n");
702 if(verbose>2) {printf(
"conversion from logarithms\n"); fflush(stdout);}
706 for(
int i=0; i<scnpxlNr; i++) atnmat[i]=expf(atnmat[i]*f);
708 for(
int i=0; i<scnpxlNr; i++) atnmat[i]=expf(atnmat[i]);
710 for(
int i=0; i<scnpxlNr; i++)
711 if(!isfinite(atnmat[i])) {
712 printf(
" inf in the attenuation data!\n");
716 for(
int i=0; i<scnpxlNr; i++)
if(!isfinite(atnmat[i])) atnmat[i]=1.0;
720 for(
int i=0; i<scnpxlNr; i++) {
721 if(!(atnmat[i]>=1.0)) atnmat[i]=1.0;
722 else if(atnmat[i]>ATN_HI_MAX) atnmat[i]=ATN_HI_MAX;
728 if(verbose>1) printf(
"writing attenuation matrix\n");
732 if(status!=NULL) sprintf(status,
"cannot write attenuation matrix");
733 if(verbose>1) printf(
"ret := %d\n", ret);
734 free(tramat); free(normat); free(blkmat);
745 if(lfpimg!=NULL && (imgDim!=dimx || zoom!=1.0 || shiftX!=0.0 || shiftY!=0.0 || rotation!=0.0)) {
746 if(verbose>1) {printf(
"transmission matrix reconstruction\n"); fflush(stdout);}
747 imgpxlNr=imgDim*imgDim;
748 float imgmat2[imgpxlNr];
749 ret=
trmrp(blkmat, tramat, imgDim, imgmat2, maxIterNr, osSetNr,
750 dimx, dimy, maskDim, zoom, beta,
752 skipPriorNr, 1, shiftX, shiftY, rotation,
755 if(status!=NULL) sprintf(status,
"cannot reconstruct transmission image");
756 if(verbose>1) printf(
"trmrp_return_value := %d\n", ret);
759 for(
int i=0; i<imgpxlNr; i++) imgmat2[i]*=f;
760 if(verbose>1) printf(
"writing transmission image matrix\n");
764 if(status!=NULL) sprintf(status,
"cannot write transmission image matrix");
765 if(verbose>1) printf(
"ret := %d\n", ret);
769 free(tramat); free(normat); free(blkmat);
775 free(tramat); free(normat); free(blkmat);
777 if(verbose==1) {fprintf(stdout,
"\n"); fflush(stdout);}
778 if(verbose>0) {fprintf(stdout,
"done.\n"); fflush(stdout);}
781 fclose(fpatn);
if(fpimg!=NULL) fclose(fpimg);
784 fclose(fptra); fclose(fpblk); fclose(fpnor);
785 if(cret) {remove(atnfile);
if(fpimg!=NULL) remove(imgfile);}