46 float sample_distance,
60 if(verbose>0) printf(
"trmrp()\n");
62 if(bla==NULL || tra==NULL || image==NULL)
return(1);
63 if(rays<2 || views<2 || dim<2 || iter<1 || os_sets<1)
return(1);
64 if(maskdim!=3 && maskdim!=5)
return(1);
65 if(zoom<0.05)
return(1);
72 recrays=(int)((
float)dim*zoom);
73 bp_zoom=zoom*(float)dim/(
float)recrays;
74 scale=((float)recrays/(float)rays)*bp_zoom*bp_zoom/(
float)views;
76 printf(
" recrays := %d\n", recrays);
77 printf(
" bp_zoom := %g\n", bp_zoom);
78 printf(
" scale := %g\n", scale);
82 views_in_set=views/os_sets;
83 if(verbose>1) printf(
" views_in_set := %d\n", views_in_set);
89 for(
int i=0; i<os_sets; i++) printf(
" %d", seq[i]);
94 float recbla[recrays*views], rectra[recrays*views];
96 float blaset[rays*views], traset[rays*views];
98 for(
int s=0; s<os_sets; s++) {
99 for(
int j=0; j<views_in_set; j++) {
100 memcpy((
char*)(blaset + s*rays*views_in_set + j*rays),
101 (
char*)(bla + j*rays*os_sets + s*rays), rays*
sizeof(
float));
102 memcpy((
char*)(traset + s*rays*views_in_set + j*rays),
103 (
char*)(tra + j*rays*os_sets + s*rays), rays*
sizeof(
float));
113 float bsum=0.0, tsum=0.0;
114 for(
int i=0; i<recrays*views_in_set; i++) bsum+=recbla[i];
115 for(
int i=0; i<recrays*views_in_set; i++) tsum+=rectra[i];
117 printf(
" blank_sum := %g\n", bsum);
118 printf(
" transmission_sum := %g\n", tsum);
123 if(verbose>1) printf(
"creating initial %dx%d image\n", dim, dim);
125 float current_img[imgsize];
126 for(
int i=0; i<imgsize; i++) image[i]=0.0;
128 init=-logf(tsum/bsum)*sample_distance/axial_fov;
129 if(verbose>2) printf(
" init := %g\n", init);
131 for(
int k=0; k<imgsize; k++) current_img[k]=0.0;
134 for(j=dim/2-1; j>=-dim/2; j--) {
135 for(
int i=-dim/2; i<dim/2; i++) {
136 if((
int)hypot((
double)i, (
double)j) < dim/2-1) current_img[k]=init;
143 if(verbose>1) printf(
"computing sine table\n");
144 float sinB[3*views/2], sinBrot[3*views/2];
146 for(
int i=0; i<3*views/2; i++) sinB[i]/=bp_zoom;
147 for(
int i=0; i<3*views/2; i++) sinBrot[i]/=bp_zoom;
151 pixsize=sample_distance*(float)rays/(zoom*(
float)dim);
152 if(verbose>2) printf(
" pixsize := %g\n", pixsize);
159 if(verbose>1) {printf(
"iterations\n"); fflush(stdout);}
160 float muproj[recrays*views_in_set+1];
161 float atnproj[recrays*views_in_set];
162 float projdiff[recrays*views_in_set];
163 float numerator[imgsize], denominator[imgsize];
164 float med_img[imgsize], oslcoefs[imgsize];
167 if(verbose>3) {printf(
" iteration %d\n", itercount); fflush(stdout);}
172 printf(
" min=%g max=%g iter=%i\n", mi, ma, itercount);
173 for(
int i=0; i<imgsize; i++)
174 if(!isfinite(current_img[i])) {
175 printf(
" inf in current image! index=%d, iter=%d\n", i, itercount);
180 for(
int s=0; s<os_sets; s++) {
181 if(verbose>4) {printf(
" os_set %d; seq=%d\n", 1+s, seq[s]); fflush(stdout);}
183 for(
int i=0; i<recrays*views_in_set; i++) muproj[i]=0.0;
184#pragma omp parallel for
185 for(
int i=0; i<views_in_set; i++) {
186 int view=seq[s]+i*os_sets;
187 if(verbose>8 && (i==0 || i==views_in_set-1)) printf(
" reprojecting view %d\n", view);
189 views, recrays, sinB, sinBrot, shiftX, shiftY, bp_zoom);
194#pragma omp parallel for
195 for(
int i=0; i<recrays*views_in_set; i++) {
196 float mup=muproj[i]*scale;
197 float est_count=expf(-mup)*recbla[i];
198 atnproj[i]=est_count*mup;
199 projdiff[i]=est_count - rectra[i];
202 for(
int i=0; i<imgsize; i++) numerator[i]=0.0;
203 for(
int i=0; i<imgsize; i++) denominator[i]=0.0;
204#pragma omp parallel for
205 for(
int i=0; i<views_in_set; i++) {
206 int view=seq[s]+i*os_sets;
208 view, views, recrays, sinB, sinBrot, shiftX, shiftY, bp_zoom);
210 view, views, recrays, sinB, sinBrot, shiftX, shiftY, bp_zoom);
215 printf(
" numerator_range := %g - %g\n", mi, ma);
217 printf(
" denominator_range := %g - %g\n", mi, ma);
221 if(skip_prior<=0 && beta>0.0) {
222 if(verbose>3) {printf(
" applying prior\n"); fflush(stdout);}
225 fMinMaxFin(current_img, imgsize, NULL, &maxv);
226 do_prior(current_img, beta, oslcoefs, dim, 1.0E-08*maxv, maskdim, &maxm);
228 printf(
" max value in current image := %g\n", maxv);
229 printf(
" max median coefficient := %g\n", maxm);
234 iptr=current_img+dim+1;
236 for(
int i=2*(dim+1); i<imgsize; i++) *mptr++=
med9(iptr++, dim);
237 }
else if(maskdim==5) {
238 iptr=current_img+2*dim+2;
239 mptr=med_img+2*dim+2;
240 for(
int i=2*(2*dim+2); i<imgsize; i++) *mptr++=
med21(iptr++, dim);
242 for(
int i=0; i<imgsize; i++) numerator[i]*=med_img[i];
243 for(
int i=0; i<imgsize; i++) numerator[i]-=beta*(current_img[i]-med_img[i]);
244 for(
int i=0; i<imgsize; i++) denominator[i]*=med_img[i];
245 for(
int i=0; i<imgsize; i++) denominator[i]+=beta*current_img[i];
249 if(verbose>3) {printf(
" calculating next image\n"); fflush(stdout);}
250 if(osl && skip_prior<=0 && beta>0.0) {
251 if(verbose>4) printf(
" convex-OSL\n");
252 for(
int i=0; i<imgsize; i++) {
253 float f=fmaf(numerator[i], 1.0/denominator[i], 1.0);
256 if(isfinite(f)) current_img[i]=f;
259 if(verbose>4) printf(
" convex\n");
260 for(
int i=0; i<imgsize; i++) {
261 float f=fmaf(numerator[i], 1.0/denominator[i], 1.0);
263 if(isfinite(f)) current_img[i]=f;
266 if(verbose>4) {printf(
" -> next os_set maybe\n"); fflush(stdout);}
268 itercount++; skip_prior--;
269 if(verbose>3) {printf(
" -> next iteration maybe\n"); fflush(stdout);}
270 }
while(itercount<iter);
271 if(verbose>2) {printf(
" iterations done.\n"); fflush(stdout);}
273 for(
int i=0; i<imgsize; i++) image[i]=current_img[i]*=scale;
275 if(verbose>1) {printf(
"trmrp() done.\n"); fflush(stdout);}
int trmrp(float *bla, float *tra, int dim, float *image, int iter, int sets, int rays, int views, int maskdim, float zoom, float beta, float axial_fov, float sample_distance, int skip_prior, int osl, float shiftX, float shiftY, float rotation, int verbose)