50 float sample_distance,
64 if(verbose>0) printf(
"trmrp()\n");
66 if(bla==NULL || tra==NULL || image==NULL)
return(1);
67 if(rays<2 || views<2 || dim<2 || iter<1 || os_sets<1)
return(1);
68 if(maskdim!=3 && maskdim!=5)
return(1);
69 if(zoom<0.05)
return(1);
76 recrays=(int)((
float)dim*zoom);
77 bp_zoom=zoom*(float)dim/(
float)recrays;
78 scale=((float)recrays/(float)rays)*bp_zoom*bp_zoom/(
float)views;
80 printf(
" recrays := %d\n", recrays);
81 printf(
" bp_zoom := %g\n", bp_zoom);
82 printf(
" scale := %g\n", scale);
86 views_in_set=views/os_sets;
87 if(verbose>1) printf(
" views_in_set := %d\n", views_in_set);
93 for(
int i=0; i<os_sets; i++) printf(
" %d", seq[i]);
98 float recbla[recrays*views], rectra[recrays*views];
100 float blaset[rays*views], traset[rays*views];
102 for(
int s=0; s<os_sets; s++) {
103 for(
int j=0; j<views_in_set; j++) {
104 memcpy((
char*)(blaset + s*rays*views_in_set + j*rays),
105 (
char*)(bla + j*rays*os_sets + s*rays), rays*
sizeof(
float));
106 memcpy((
char*)(traset + s*rays*views_in_set + j*rays),
107 (
char*)(tra + j*rays*os_sets + s*rays), rays*
sizeof(
float));
117 float bsum=0.0, tsum=0.0;
118 for(
int i=0; i<recrays*views_in_set; i++) bsum+=recbla[i];
119 for(
int i=0; i<recrays*views_in_set; i++) tsum+=rectra[i];
121 printf(
" blank_sum := %g\n", bsum);
122 printf(
" transmission_sum := %g\n", tsum);
127 if(verbose>1) printf(
"creating initial %dx%d image\n", dim, dim);
129 float current_img[imgsize];
130 for(
int i=0; i<imgsize; i++) image[i]=0.0;
132 init=-logf(tsum/bsum)*sample_distance/axial_fov;
133 if(verbose>2) printf(
" init := %g\n", init);
135 for(
int k=0; k<imgsize; k++) current_img[k]=0.0;
138 for(j=dim/2-1; j>=-dim/2; j--) {
139 for(
int i=-dim/2; i<dim/2; i++) {
140 if((
int)hypot((
double)i, (
double)j) < dim/2-1) current_img[k]=init;
147 if(verbose>1) printf(
"computing sine table\n");
148 float sinB[3*views/2], sinBrot[3*views/2];
150 for(
int i=0; i<3*views/2; i++) sinB[i]/=bp_zoom;
151 for(
int i=0; i<3*views/2; i++) sinBrot[i]/=bp_zoom;
155 pixsize=sample_distance*(float)rays/(zoom*(
float)dim);
156 if(verbose>2) printf(
" pixsize := %g\n", pixsize);
163 if(verbose>1) {printf(
"iterations\n"); fflush(stdout);}
164 float muproj[recrays*views_in_set+1];
165 float atnproj[recrays*views_in_set];
166 float projdiff[recrays*views_in_set];
167 float numerator[imgsize], denominator[imgsize];
168 float med_img[imgsize], oslcoefs[imgsize];
171 if(verbose>3) {printf(
" iteration %d\n", itercount); fflush(stdout);}
176 printf(
" min=%g max=%g iter=%i\n", mi, ma, itercount);
177 for(
int i=0; i<imgsize; i++)
178 if(!isfinite(current_img[i])) {
179 printf(
" inf in current image! index=%d, iter=%d\n", i, itercount);
184 for(
int s=0; s<os_sets; s++) {
185 if(verbose>4) {printf(
" os_set %d; seq=%d\n", 1+s, seq[s]); fflush(stdout);}
187 for(
int i=0; i<recrays*views_in_set; i++) muproj[i]=0.0;
188#pragma omp parallel for
189 for(
int i=0; i<views_in_set; i++) {
190 int view=seq[s]+i*os_sets;
191 if(verbose>8 && (i==0 || i==views_in_set-1)) printf(
" reprojecting view %d\n", view);
193 views, recrays, sinB, sinBrot, shiftX, shiftY, bp_zoom);
198#pragma omp parallel for
199 for(
int i=0; i<recrays*views_in_set; i++) {
200 float mup=muproj[i]*scale;
201 float est_count=expf(-mup)*recbla[i];
202 atnproj[i]=est_count*mup;
203 projdiff[i]=est_count - rectra[i];
206 for(
int i=0; i<imgsize; i++) numerator[i]=0.0;
207 for(
int i=0; i<imgsize; i++) denominator[i]=0.0;
208#pragma omp parallel for
209 for(
int i=0; i<views_in_set; i++) {
210 int view=seq[s]+i*os_sets;
212 view, views, recrays, sinB, sinBrot, shiftX, shiftY, bp_zoom);
214 view, views, recrays, sinB, sinBrot, shiftX, shiftY, bp_zoom);
219 printf(
" numerator_range := %g - %g\n", mi, ma);
221 printf(
" denominator_range := %g - %g\n", mi, ma);
225 if(skip_prior<=0 && beta>0.0) {
226 if(verbose>3) {printf(
" applying prior\n"); fflush(stdout);}
229 fMinMaxFin(current_img, imgsize, NULL, &maxv);
230 do_prior(current_img, beta, oslcoefs, dim, 1.0E-08*maxv, maskdim, &maxm);
232 printf(
" max value in current image := %g\n", maxv);
233 printf(
" max median coefficient := %g\n", maxm);
238 iptr=current_img+dim+1;
240 for(
int i=2*(dim+1); i<imgsize; i++) *mptr++=
med9(iptr++, dim);
241 }
else if(maskdim==5) {
242 iptr=current_img+2*dim+2;
243 mptr=med_img+2*dim+2;
244 for(
int i=2*(2*dim+2); i<imgsize; i++) *mptr++=
med21(iptr++, dim);
246 for(
int i=0; i<imgsize; i++) numerator[i]*=med_img[i];
247 for(
int i=0; i<imgsize; i++) numerator[i]-=beta*(current_img[i]-med_img[i]);
248 for(
int i=0; i<imgsize; i++) denominator[i]*=med_img[i];
249 for(
int i=0; i<imgsize; i++) denominator[i]+=beta*current_img[i];
253 if(verbose>3) {printf(
" calculating next image\n"); fflush(stdout);}
254 if(osl && skip_prior<=0 && beta>0.0) {
255 if(verbose>4) printf(
" convex-OSL\n");
256 for(
int i=0; i<imgsize; i++) {
257 float f=fmaf(numerator[i], 1.0/denominator[i], 1.0);
260 if(isfinite(f)) current_img[i]=f;
263 if(verbose>4) printf(
" convex\n");
264 for(
int i=0; i<imgsize; i++) {
265 float f=fmaf(numerator[i], 1.0/denominator[i], 1.0);
267 if(isfinite(f)) current_img[i]=f;
270 if(verbose>4) {printf(
" -> next os_set maybe\n"); fflush(stdout);}
272 itercount++; skip_prior--;
273 if(verbose>3) {printf(
" -> next iteration maybe\n"); fflush(stdout);}
274 }
while(itercount<iter);
275 if(verbose>2) {printf(
" iterations done.\n"); fflush(stdout);}
277 for(
int i=0; i<imgsize; i++) image[i]=current_img[i]*=scale;
279 if(verbose>1) {printf(
"trmrp() done.\n"); fflush(stdout);}
int trmrp(float *bla, float *tra, int dim, float *image, int iter, int os_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)