123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- #include "defs.h"
- extern char errstr[200];
- int terma_dose_masks(FLOAT_GRID *terma_mask, FLOAT_GRID *dose_mask, BEAM *bm)
- {
-
- int i,j,k,m;
- int ius,jus,kus;
- int M,N,Q;
- float dx,dy,dz;
- float xp,yp,SAD;
- float xsub,ysub,zsub;
- float del_xp,del_yp;
- float Rmax,Rcurr,Rcyl,Rvox,Rcyl_sqr,Rproj;
- float eta,gamma,delta;
-
- float *x,*y,*z;
- float *dxus,*dyus,*dzus;
- float *y_vec,*ip,*jp,*kp,*d_hat;
-
- float **c;
-
-
- if (Mus < 1 || Nus < 1 || Qus < 1)
- {
- sprintf(errstr,"Upsample factors must all be greater than zero.");
- return(FAILURE);
- }
-
- M = terma_mask->x_count;
- N = terma_mask->y_count;
- Q = terma_mask->z_count;
- if (M != dose_mask->x_count || N != dose_mask->y_count
- || Q != dose_mask->z_count)
- {
- sprintf(errstr,"dose_mask and terma_mask dimensions are incompatible.");
- return(FAILURE);
- }
- dx = terma_mask->inc.x;
- dy = terma_mask->inc.y;
- dz = terma_mask->inc.z;
-
-
- x = fvector(0,M-1);
- y = fvector(0,N-1);
- z = fvector(0,Q-1);
- dxus = fvector(0,Mus-1);
- dyus = fvector(0,Nus-1);
- dzus = fvector(0,Qus-1);
- y_vec = fvector(0,2);
- ip = fvector(0,2);
- jp = fvector(0,2);
- kp = fvector(0,2);
- d_hat = fvector(0,2);
-
- c = fmatrix(0,7,0,2);
-
- for (i=0;i<M;i++) x[i] = terma_mask->start.x + (float)i*dx;
- for (j=0;j<N;j++) y[j] = terma_mask->start.y + (float)j*dy;
- for (k=0;k<Q;k++) z[k] = terma_mask->start.z + (float)k*dz;
-
-
-
- dxus[0] = -0.5*dx*(1-1/Mus);
- for (ius=1;ius<Mus;ius++) dxus[ius] = dxus[ius-1] + dx/Mus;
- dyus[0] = -0.5*dy*(1-1/Nus);
- for (jus=1;jus<Nus;jus++) dyus[jus] = dyus[jus-1] + dy/Nus;
- dzus[0] = -0.5*dz*(1-1/Qus);
- for (kus=1;kus<Qus;kus++) dzus[kus] = dzus[kus-1] + dz/Qus;
-
- y_vec[0] = bm->y_vec[0];
- y_vec[1] = bm->y_vec[1];
- y_vec[2] = bm->y_vec[2];
-
- for (j=0;j<3;j++) ip[j] = bm->ip[j];
- for (j=0;j<3;j++) jp[j] = bm->jp[j];
- for (j=0;j<3;j++) kp[j] = bm->kp[j];
-
- xp = bm->xp;
- yp = bm->yp;
-
- del_xp = bm->del_xp;
- del_yp = bm->del_yp;
-
- SAD = bm->SAD;
-
- Rmax = 0.0;
-
-
- for (i=0;i<=1;i++)
- for (j=0;j<=1;j++)
- for (k=0;k<=1;k++)
- {
-
- c[i+j*2+k*4][0] = (1-(float)i)*(x[0]-dx/2.0) + (float)i*(x[M-1]+dx/2.0);
- c[i+j*2+k*4][1] = (1-(float)j)*(y[0]-dy/2.0) + (float)j*(y[N-1]+dy/2.0);
- c[i+j*2+k*4][2] = (1-(float)k)*(z[0]-dz/2.0) + (float)k*(z[Q-1]+dz/2.0);
- }
-
- for (m=0;m<=7;m++)
- {
- Rcurr = sqrt(pow(y_vec[0] - c[m][0],2.0f)
- + pow(y_vec[1] - c[m][1],2.0f)
- + pow(y_vec[2] - c[m][2],2.0f));
- if (Rcurr > Rmax)
- Rmax = Rcurr;
- }
-
-
-
- Rcyl = sqrt(del_xp*del_xp + del_yp*del_yp)*Rmax/SAD;
- Rcyl_sqr = Rcyl*Rcyl + RSAFE*RSAFE;
-
-
- d_hat[0] = xp*ip[0] + yp*jp[0] + SAD*kp[0];
- d_hat[1] = xp*ip[1] + yp*jp[1] + SAD*kp[1];
- d_hat[2] = xp*ip[2] + yp*jp[2] + SAD*kp[2];
-
- delta = sqrt(d_hat[0]*d_hat[0] + d_hat[1]*d_hat[1] + d_hat[2]*d_hat[2]);
- d_hat[0] = d_hat[0]/delta;
- d_hat[1] = d_hat[1]/delta;
- d_hat[2] = d_hat[2]/delta;
- for (k=0;k<Q;k++)
- for (j=0;j<N;j++)
- for (i=0;i<M;i++)
- {
-
- eta = (x[i] - y_vec[0])*(x[i] - y_vec[0])
- + (y[j] - y_vec[1])*(y[j] - y_vec[1])
- + (z[k] - y_vec[2])*(z[k] - y_vec[2]);
-
-
- gamma = pow((x[i] - y_vec[0])*d_hat[0]
- + (y[j] - y_vec[1])*d_hat[1]
- + (z[k] - y_vec[2])*d_hat[2],2.0f);
-
-
- delta = eta - gamma;
-
-
- if (delta <= Rcyl_sqr)
- GRID_VALUE(dose_mask,i,j,k) = 1.0;
- else
- GRID_VALUE(dose_mask,i,j,k) = 0.0;
- }
-
-
- Rvox = 0.5*sqrt(dx*dx + dy*dy + dz*dz);
- for (i=0;i<M;i++)
- for (j=0;j<N;j++)
- for (k=0;k<Q;k++)
-
- if (GRID_VALUE(dose_mask,i,j,k) > 0.0)
- {
-
- delta = kp[0]*(x[i] - y_vec[0])
- + kp[1]*(y[j] - y_vec[1])
- + kp[2]*(z[k] - y_vec[2]);
-
- eta = (SAD/delta)*( ip[0]*(x[i] - y_vec[0])
- + ip[1]*(y[j] - y_vec[1])
- + ip[2]*(z[k] - y_vec[2])) - xp;
-
- gamma = (SAD/delta)*( jp[0]*(x[i] - y_vec[0])
- + jp[1]*(y[j] - y_vec[1])
- + jp[2]*(z[k] - y_vec[2])) - yp;
-
- eta = fabs(eta);
- gamma = fabs(gamma);
- Rproj = Rvox*SAD/delta;
-
- if (eta <= 0.5*del_xp+Rproj && gamma <= 0.5*del_yp+Rproj)
-
- if (eta >= 0.5*del_xp-Rproj || gamma >= 0.5*del_yp-Rproj)
-
-
- {
-
-
- m = 0;
-
- for (ius=0;ius<Mus;ius++)
- for (jus=0;jus<Nus;jus++)
- for (kus=0;kus<Qus;kus++)
- {
-
- xsub = x[i] + dxus[ius];
- ysub = y[j] + dyus[jus];
- zsub = z[k] + dzus[kus];
-
-
- delta = kp[0]*(xsub - y_vec[0])
- + kp[1]*(ysub - y_vec[1])
- + kp[2]*(zsub - y_vec[2]);
-
- eta = (SAD/delta)*( ip[0]*(xsub - y_vec[0])
- + ip[1]*(ysub - y_vec[1])
- + ip[2]*(zsub - y_vec[2])) - xp;
-
- gamma = (SAD/delta)*( jp[0]*(xsub - y_vec[0])
- + jp[1]*(ysub - y_vec[1])
- + jp[2]*(zsub - y_vec[2])) - yp;
- eta = fabs(eta);
- gamma = fabs(gamma);
-
- if (eta <= 0.5*del_xp && gamma <= 0.5*del_yp)
- m++;
- }
-
- GRID_VALUE(terma_mask,i,j,k) = (float)m/(float)(Mus*Nus*Qus);
- }
- else
-
- GRID_VALUE(terma_mask,i,j,k) = 1.0;
- else
-
- GRID_VALUE(terma_mask,i,j,k) = 0.0;
- }
-
- free_fvector(x,0,M-1);
- free_fvector(y,0,N-1);
- free_fvector(z,0,Q-1);
- free_fvector(dxus,0,Mus-1);
- free_fvector(dyus,0,Nus-1);
- free_fvector(dzus,0,Qus-1);
- free_fvector(y_vec,0,2);
- free_fvector(ip,0,2);
- free_fvector(jp,0,2);
- free_fvector(kp,0,2);
- free_fvector(d_hat,0,2);
-
- free_fmatrix(c,0,7,0,2);
- return(SUCCESS);
- }
|