159 if(status!=NULL) sprintf(status,
"invalid filename");
160 if(trafile==NULL || !trafile[0])
return(1);
161 if(blkfile==NULL || !blkfile[0])
return(1);
162 if(norfile==NULL || !blkfile[0])
return(1);
163 if(atnfile==NULL || !atnfile[0])
return(1);
169 FILE *fptra=NULL, *fpblk=NULL, *fpnor=NULL;
170 if(verbose>0) printf(
"opening %s\n", trafile);
171 if((fptra=fopen(trafile,
"rb")) == NULL) {
172 if(status!=NULL) sprintf(status,
"cannot open transmission sinogram");
175 if(verbose>0) printf(
"opening %s\n", blkfile);
176 if((fpblk=fopen(blkfile,
"rb")) == NULL) {
177 if(status!=NULL) sprintf(status,
"cannot open blank sinogram");
181 if(verbose>0) printf(
"opening %s\n", norfile);
182 if((fpnor=fopen(norfile,
"rb")) == NULL) {
183 if(status!=NULL) sprintf(status,
"cannot open normalization file");
184 fclose(fptra); fclose(fpblk);
191 if(verbose>1) printf(
"reading transmission main header\n");
194 if(status!=NULL) sprintf(status,
"cannot read transmission main header");
195 fclose(fptra); fclose(fpblk); fclose(fpnor);
199 if(verbose>4) printf(
"file_type := %d\n", tra_main_header.
file_type);
201 if(verbose>1) printf(
"reading blank main header\n");
204 if(status!=NULL) sprintf(status,
"cannot read blank main header");
205 fclose(fptra); fclose(fpblk); fclose(fpnor);
209 if(verbose>4) printf(
"file_type := %d\n", blk_main_header.
file_type);
211 if(verbose>1) printf(
"reading normalization main header\n");
214 if(status!=NULL) sprintf(status,
"cannot read blank main header");
215 fclose(fptra); fclose(fpblk); fclose(fpnor);
219 if(verbose>4) printf(
"file_type := %d\n", nor_main_header.
file_type);
225 if(status!=NULL) sprintf(status,
"file is not a sinogram");
226 fclose(fptra); fclose(fpblk); fclose(fpnor);
231 time_t tra_start, blk_start;
236 printf(
"Blank scan start time := %s\n",
ctime_r_int(&blk_start, buf));
237 printf(
"Transmission scan start time := %s\n",
ctime_r_int(&tra_start, buf));
239 if(decay!=0 && (tra_start==0 || blk_start==0)) {
240 if(status!=NULL) sprintf(status,
"missing scan start time");
241 fclose(fptra); fclose(fpblk); fclose(fpnor);
244 double start_time_diff=difftime(tra_start, blk_start);
245 if(verbose>1) {printf(
"scan start time difference := %g\n", start_time_diff);}
248 double halflife=-1.0;
251 if(verbose>1 && halflife>0.0) {printf(
"isotope halflife := %g\n", halflife);}
252 if(decay!=0 && halflife<=0.0) {
253 if(status!=NULL) sprintf(status,
"missing isotope halflife");
254 fclose(fptra); fclose(fpblk); fclose(fpnor);
263 if(verbose>1) printf(
"reading transmission matrix list\n");
267 if(status!=NULL) sprintf(status,
"cannot read sinogram matrix list");
268 fclose(fptra); fclose(fpblk); fclose(fpnor);
272 if(verbose>1) printf(
"reading blank matrix list\n");
276 if(status!=NULL) sprintf(status,
"cannot read blank matrix list");
278 fclose(fptra); fclose(fpblk); fclose(fpnor);
282 if(verbose>1) printf(
"reading normalization matrix list\n");
286 if(status!=NULL) sprintf(status,
"cannot read normalization matrix list");
288 fclose(fptra); fclose(fpblk); fclose(fpnor);
294 if(status!=NULL) sprintf(status,
"empty matrix list");
297 fclose(fptra); fclose(fpblk); fclose(fpnor);
303 if(status!=NULL) sprintf(status,
"invalid matrix list");
306 fclose(fptra); fclose(fpblk); fclose(fpnor);
310 printf(
"transmission_matrixNr := %d\n", tra_mlist.
matrixNr);
311 printf(
"blank_matrixNr := %d\n", blk_mlist.
matrixNr);
312 printf(
"normalization_matrixNr := %d\n", nor_mlist.
matrixNr);
319 if(status!=NULL) sprintf(status,
"different plane numbers");
322 fclose(fptra); fclose(fpblk); fclose(fpnor);
329 if(verbose>0) printf(
"writing main header in %s\n", atnfile);
339 if(status!=NULL) sprintf(status,
"cannot write attenuation file\n");
342 fclose(fptra); fclose(fpblk); fclose(fpnor);
347 if(imgfile!=NULL && imgfile[0]) {
348 if(verbose>0) printf(
"writing main header in %s\n", imgfile);
358 if(status!=NULL) sprintf(status,
"cannot write transmission image\n");
361 fclose(fptra); fclose(fpblk); fclose(fpnor);
371 if(verbose>0) printf(
"processing matrices...\n");
373 for(
int mi=0; mi<tra_mlist.
matrixNr; mi++) {
374 if(verbose==1) {fprintf(stdout,
"."); fflush(stdout);}
386 int dimx, dimy, scnpxlNr=0, imgpxlNr=0, matnum=0, ni=0, bi=0;
387 float *tramat, *blkmat, *normat, f;
394 if(verbose>1) printf(
"reading transmission matrix %d\n", 1+mi);
399 sprintf(status,
"cannot read transmission sinogram matrix %u", tra_mlist.
matdir[mi].
matnum);
404 printf(
"Matrix: plane %d frame %d gate %d bed %d\n",
408 }
else if(verbose>1 && mi==0) {
409 printf(
"Transmission sinogram dimensions := %d x %d\n",
411 printf(
"Transmission sinogram frame duration := %g\n",
413 printf(
"Transmission sinogram dead-time correction := %g\n",
419 if(imgDim<2) imgDim=dimx;
422 for(
int i=0; i<scnpxlNr; i++)
427 if(status!=NULL) sprintf(status,
"missing frame duration in transmission sinogram");
433 for(
int i=0; i<scnpxlNr; i++) tramat[i]*=f;
437 for(ni=0; ni<nor_mlist.
matrixNr; ni++)
442 sprintf(status,
"cannot find matrix %u in normalization sinogram",
449 if(verbose>1) printf(
"reading normalization matrix %d\n", 1+ni);
454 sprintf(status,
"cannot read blank sinogram matrix %u", nor_mlist.
matdir[ni].
matnum);
461 }
else if(verbose>1 && mi==0) {
462 printf(
"Normalization sinogram dimensions := %d x %d\n",
464 printf(
"Normalization sinogram frame duration := %g\n",
466 printf(
"Normalization sinogram dead-time correction := %g\n",
472 if(status!=NULL) sprintf(status,
"incompatible matrix dimensions");
473 free(tramat); free(normat);
479 for(
int i=0; i<scnpxlNr; i++) tramat[i]*=normat[i];
482 for(
int i=0; i<scnpxlNr; i++)
if(tramat[i]<0.0) tramat[i]=0.0;
487 for(bi=0; bi<blk_mlist.
matrixNr; bi++)
492 sprintf(status,
"cannot find matrix %u in blank sinogram", blk_mlist.
matdir[bi].
matnum);
493 free(tramat); free(normat);
498 if(verbose>1) printf(
"reading blank matrix %d\n", 1+bi);
503 sprintf(status,
"cannot read blank sinogram matrix %u", blk_mlist.
matdir[bi].
matnum);
504 free(tramat); free(normat);
510 }
else if(verbose>1 && mi==0) {
511 printf(
"Blank sinogram dimensions := %d x %d\n",
513 printf(
"Blank sinogram frame duration := %g\n",
515 printf(
"Blank sinogram dead-time correction := %g\n",
521 if(status!=NULL) sprintf(status,
"incompatible matrix dimensions");
522 free(tramat); free(normat); free(blkmat);
528 for(
int i=0; i<scnpxlNr; i++)
533 if(status!=NULL) sprintf(status,
"missing frame duration in blank sinogram");
534 free(tramat); free(normat); free(blkmat);
539 for(
int i=0; i<scnpxlNr; i++) blkmat[i]*=f;
542 for(
int i=0; i<scnpxlNr; i++) blkmat[i]*=normat[i];
544 if(keepNegat==0)
for(
int i=0; i<scnpxlNr; i++)
if(blkmat[i]<0.0) blkmat[i]=0.0;
556 double t=start_time_diff;
560 if(verbose>1 && mi==0) {
561 printf(
"frame start time difference := %g\n", t);
562 printf(
"decay correction factor := %g\n", dcf);
564 for(
int i=0; i<scnpxlNr; i++) tramat[i]*=dcf;
569 if(verbose>3) printf(
"setting attenuation sub-header\n");
588 if(lfpimg!=NULL && mi==0) {
589 if(verbose>6) printf(
"setting transmission image sub-header\n");
632 if(verbose>1) {printf(
"matrix reconstruction\n"); fflush(stdout);}
634 float imgmat[imgpxlNr];
635 ret=
trmrp(blkmat, tramat, dimx, imgmat, 120, 1,
636 dimx, dimy, maskDim, 1.0, beta,
641 if(status!=NULL) sprintf(status,
"cannot calculate attenuation correction factors");
642 if(verbose>1) printf(
"trmrp_return_value := %d\n", ret);
643 free(tramat); free(normat); free(blkmat);
648 for(
int i=0; i<imgpxlNr; i++)
649 if(!isfinite(imgmat[i])) {
650 printf(
" inf in the image!\n");
661 if(lfpimg!=NULL && imgDim==dimx && zoom==1.0 && shiftX==0.0 && shiftY==0.0 && rotation==0.0) {
662 if(verbose>1) printf(
"writing transmission image matrix\n");
666 if(status!=NULL) sprintf(status,
"cannot write transmission image matrix");
667 if(verbose>1) printf(
"ret := %d\n", ret);
668 free(tramat); free(normat); free(blkmat);
677 if(verbose>1) {printf(
"matrix reprojection\n"); fflush(stdout);}
678 float atnmat[scnpxlNr];
679 ret=
reprojection(imgmat, dimx, dimx, dimy, 1.0, atnmat, verbose-10);
681 if(status!=NULL) sprintf(status,
"cannot reproject attenuation correction data");
682 if(verbose>1) printf(
"trmrp_return_value := %d\n", ret);
683 free(tramat); free(normat); free(blkmat);
688 for(
int i=0; i<scnpxlNr; i++)
689 if(!isfinite(atnmat[i])) {
690 printf(
" inf in the log attenuation data!\n");
698 if(verbose>2) {printf(
"conversion from logarithms\n"); fflush(stdout);}
702 for(
int i=0; i<scnpxlNr; i++) atnmat[i]=expf(atnmat[i]*f);
704 for(
int i=0; i<scnpxlNr; i++) atnmat[i]=expf(atnmat[i]);
706 for(
int i=0; i<scnpxlNr; i++)
707 if(!isfinite(atnmat[i])) {
708 printf(
" inf in the attenuation data!\n");
712 for(
int i=0; i<scnpxlNr; i++)
if(!isfinite(atnmat[i])) atnmat[i]=1.0;
716 for(
int i=0; i<scnpxlNr; i++) {
717 if(!(atnmat[i]>=1.0)) atnmat[i]=1.0;
718 else if(atnmat[i]>ATN_HI_MAX) atnmat[i]=ATN_HI_MAX;
724 if(verbose>1) printf(
"writing attenuation matrix\n");
728 if(status!=NULL) sprintf(status,
"cannot write attenuation matrix");
729 if(verbose>1) printf(
"ret := %d\n", ret);
730 free(tramat); free(normat); free(blkmat);
741 if(lfpimg!=NULL && (imgDim!=dimx || zoom!=1.0 || shiftX!=0.0 || shiftY!=0.0 || rotation!=0.0)) {
742 if(verbose>1) {printf(
"transmission matrix reconstruction\n"); fflush(stdout);}
743 imgpxlNr=imgDim*imgDim;
744 float imgmat2[imgpxlNr];
745 ret=
trmrp(blkmat, tramat, imgDim, imgmat2, maxIterNr, osSetNr,
746 dimx, dimy, maskDim, zoom, beta,
748 skipPriorNr, 1, shiftX, shiftY, rotation,
751 if(status!=NULL) sprintf(status,
"cannot reconstruct transmission image");
752 if(verbose>1) printf(
"trmrp_return_value := %d\n", ret);
755 for(
int i=0; i<imgpxlNr; i++) imgmat2[i]*=f;
756 if(verbose>1) printf(
"writing transmission image matrix\n");
760 if(status!=NULL) sprintf(status,
"cannot write transmission image matrix");
761 if(verbose>1) printf(
"ret := %d\n", ret);
765 free(tramat); free(normat); free(blkmat);
771 free(tramat); free(normat); free(blkmat);
773 if(verbose==1) {fprintf(stdout,
"\n"); fflush(stdout);}
774 if(verbose>0) {fprintf(stdout,
"done.\n"); fflush(stdout);}
777 fclose(fpatn);
if(fpimg!=NULL) fclose(fpimg);
780 fclose(fptra); fclose(fpblk); fclose(fpnor);
781 if(cret) {remove(atnfile);
if(fpimg!=NULL) remove(imgfile);}