. Then Ng = 2npV'max + 1 = NINT (2np<\/> max In terms of the number of samples in p, Equation 4.60 can be written, Mb = (2np + 1)[NINT (7rn p)] 2 NINT (2np<\/>max + 1) \u2022 ws. (4.65) 4.1.2 Histogram Procedure Assume that the coincidence data is presented in list mode by the four parameters lx, ly, ipT, and 8r. An individual event in this list is processed as follows: 1. The projection direction given by ( , Qt) (4.80) t' hence the filter must be sampled prior to performing the convolution. The act of sampling the object space filter at the interval A p replicates the Fourier Transform at intervals in frequency of 1\/Ap. The replicated Fourier Transform is not exactly that of Equation 4.68 because the filter must also be windowed in object space, ie. the filter length must be finite. Using the window U(p\/(njAp) to truncate the object space filter, results in convolution in the Fourier domain with the function sinc(irvnfAp). As rij increases the sine function approaches a delta function, and the Transform is unmodified by the convolution. For small nf, Fourier domain ringing and smoothing of the replicated tranform will occur. The filter length Nj = 2nj + 1, must be chosen to be large enough to minimize these effects while keeping the filter length as small as possible to minimize filtering time. The radial part of the filter ar,, for vc = vN, given by Equation 4.77, is shown in Figure 4.8 as a(p). The degree to which these ideal curves represent the true filter func-2 A discrete correlation may also be used replacing p, \u2014 p,i by p, + p,\/, as the filter is even. Chapter 4. Implementation 56 O b j e c t s p a c e f i l t e r s 4 6 8 P (Ap) 10 Figure 4.8: Object space filters for R T and X R T inversion. Chapter 4. Implementation 57 tion depends on the interpolating function. A linear interpolator produces a piecewise linear curve between the discete samples taken where pjAp is integer[51]. For comparison the filter of Chelser et. al.[10], which is the Hanning windowed form of the v filter needed to invert the backprojected X-ray Transform image for a spherical detector (73^(x), of Equation 2.12, is also shown in Figure 4.8 as b(p). It is given by the inverse transform of B(u)=l-^U(^-)W'(u). (4.81) If the smoothing window W'(u) is given by Equation 4.73, the one dimensional Fourier Transform of the radial profile of Equation 4.81 has the form where b'(p) has the form b'(p) = s\\n{2\u2122cp) + \u2014 ^ ( c o s ^ T r i \/ e p ) - 1). (4.83) The filter a(p) is more compact, in object space, than its X-ray Transform counterpart, b(p), as shown by the position of the zero-crossing in Figure 4.8. This occurs because the transform of a(p) contains higher frequency components, due to its v2 component, than the transform of b(p), with its factor u, as seen in Figure 4.7. It is a property of the Fourier Transform that widths, which for these filters may be measured as the second moment of the filters, in the two domains are reciprocally related[2]. The three dimensional object space filter is even more compact than its one dimensional profile for a given radial frequency space window. This is due to the additional factor v2 that arises in the Jacobian of the inverse three dimensional Fourier Transform in its spherical polar form (ie. if a three dimensional filter is specified by its radial profile, the weight of the filter increases as v2 with increasing frequency). Chiu et. al. have Chapter 4. Implementation 58 demonstrated this for the case of the one and three dimensional bandlimited filters of This compactness confers a speed advantage in the one dimensional filtering of the FBP implementation of the Radon Transform inversion, and also in the three di-mensional filtering of the backprojected image in the space of the object. The three dimensional filtering will be discussed in Chapter 5.2.1. The frequency space filters discussed above are shown in Figure 4.7. As noted, the filter A(u) is shifted to higher frequencies than the filter B(u). However, the two inversion techniques, for the Radon Transform and the X-ray Transform have the same theoretical noise performance. This is true as it the nature of the backprojection process to produce an backprojected image of the form *) ~ Nv3Nf3 multiplications. For large Nf, MJ(ZD) becomes prohibitively large. This is one of the reasons for using FBP in analytic reconstruction algorithms as convolution filtering of the lesser dimension projections is usually faster. In the Radon Transform inversion the filter length Nf is smaller than with the X-ray Transform filters. While FFT methods can be used to speed the three dimensional convolution, it is also possible to simplify the convolution in image space by the appropriate choice of apodising window, W'(u), in Equation 4.68. Taking a lesson from two dimensional image processing, the edge detection operator of Marr and Hildreth[36] employs the two dimensional Gaussian to regularize the noise enhancing differentiation of the Laplacian operator. The unique features of the Gaussian, which is its own Fourier Transform, are that it is the function that is most compact in both the Fourier and image domains, that it is rotationally symmetric and that it can be written as a sum of separable functions. Separability allows a saving in the number of multiplications used in the discrete convolution. Both the Gaussian and the Laplacian are linear operators and may be applied in any order to the image or combined for use as a single operator. These properties also apply to the three dimensional Gaussian, a fact that has been exploited by Bowmans et. al.[52] in their work on three dimensional image segmentation in MRI. The three dimensional convolution can be reduced to 8 separate one dimensional convolutions (applied simultaneously to the Nv2 elements of the projection of the Nv3 image positions in the x, y, and z directions), reducing the number of multiplications required to MfQ ~ 8Nv3Nf. (Or by approximating the Laplacian of the Gaussian by the difference of Gaussians, just 6 one dimensional convolutions need be performed). Chapter 5. Results and Conclusions 88 This represents the same order of multiplications for the filtering of the h(pt, (pk, Qi) enumerated in Equation 4.85, and about Nj times that required for the filtering of the three parameter Radon Transform of Equation 4.86. The advantage of using the three dimensional post-backprojection filtering of the image when comparing the effects of filter cut-off frequency on the image quality is that the computationally expensive backprojection need only be performed once. The backprojected image can be quickly filtered with various filters having different uc and without any additional loss of accuracy that would occur using image processing techniques to modify a previously filtered image. 5.2.2 Non-iterative Reconstruction Using All Detected Events The interpretation of the Radon Transform in P V I , that of counting events not as samples of line integrals of the object but as the partial statistical samples of plane integrals (which can be described as line integrals in ST), is distinct from the X-ray Transform where events are localized to a point, in the plane ST, and from the Fourier Transform where a point in the transform plane has a contribution from every point in ST. This property allows a distinct feature in Radon Transform inversion, that of including all measured event lines in the reconstruction regardless of their orientation with respect to the limiting angle V'max required for spatial invariance. All events can be histogrammed so as to increase the statistical accuracy of a set of plane integrals prior to inversion. Any event, regardless of its orientation, belongs to a subset of planes of \/(p, n) that are entirely contained within the detector. The events in these planes can be histogrammed with a weight of 1\/ir which reflects the statistical averaging over a unit semi-circle as described for the spherical detector in section 3.2. As such, it is possible to decrease the statistical noise of the reconstructed image by inverting a Radon Transform which contains all events. Chapter 5. Results and Conclusions 89 The interpretation of the Orlov L function in Equation 4.84 as the detector efficiency for measuring a given plane integral of the object allows the straightforward extension of the definition of L to include the completely measured line integrals h(p, \u00a3; r) in the X-ray Transform planes ST that do not meet the spatial invariance criterion of Equation 3.39. L2D now becomes a function of the spatial variable p. Modifying L2D such that L(p, en)-x = - i i \\ 8 n \\ < V>det and p < P m a x ( 9 n ) (5.90) where pmax(dn) is the limiting value of p for planes with normals having polar angle 6 n that are entirely contained within the detector (Figure 5.22). From the figure, p m a x ( 8 n ) is given by PmaxiQn) \u2014 \\HcOfidn - RD | SHI 8 n \\ \\. (5.91) Otherwise, L2D~X has the form L(P,en)-1 = < 2arcs in S , i n .^ m \u00a5 1 sin 8, n | if \\8T - | | < i \/> m a x (5.92) 0 otherwise. In the above expressions for the spatially varying L function, the polar angle 8 n of the plane orientation vector n can be related to the angles in the E T plane by cos 8 n = sin \u00a3 sin r and sint?n = yjl \u2014 (sin\u00a3 sin#T)2 in order to express the modified detector efficiency function as L(p,\u00a3,8T). With the above detector efficiency function, essentially all the events are histogrammed into the set of plane integrals that is entirely contained within the detector. This allows the inclusion of all detected events into the reconstructed image without the need for Chapter 5. Results and Conclusions 90 Figure 5.22: The determination of the limiting value for p, pmax, for any plane ori-entation such that it is entirely contained within the detector. The large rectangle represents the cross-section of a cylindrical detector. Intersecting the detector at its rim is a plane, seen edge-on, with normal vector ii. Chapter 5. Results and Conclusions 91 the iteration. The same method can be used for the inversion of extended objects with LID and the inversion of the three parameter Radon Transform. After backprojecting the h(p, \u00a3 ; T ) weighted by the modified L function, the image can be inverting using the three dimensional filtering of the image described in the last section (5.2.1). Note that the number of plane integrals of f(p, ii) with enhanced statistics depends on the detector acceptance angle ipfet. The statistical improvement in the reconstructed image will increase as the detector ring acceptance increases, even if an extended object with m^ax = 0 is being imaged. A similar method was employed by Clack et al.[14] following Cho et al.[13]. In the method of Clack, a weighted two dimensional reconstruction of planes entirely contained within the detector was performed. The set of plane integrals that were reconstructed was a limited set of the Restricted Radon Transform[29]. The Restricted Radon Transform is that set of plane integrals derived from the X-ray Transform by taking line integrals parallel to 1 .^ Clack et al. use only two directons 1), Radon Transform with respect to the distance variable p is the n-dimensional Fourier Transform of the function. Then FID Kp, i; f) = T2D g(xT; f). (A.98) And ?2Dfif*(xT;f) = T ( \" c . g(xT;f) (A.99) The function v\/L is the Colsher Fourier space filter. The angular component of the filter is seen to be the detector efficiency function for measuring a given plane integral of the Radon Transform. Appendix B Program Listings The FORTRAN code for the reconstruction algorithm is presented in this appendix. The version presented is the one which iterates the low statistics image to produce a final image which uses all detected events in forming the image according to Equation 3.41. The code used to produce the low-statistics image from either Equation 3.53, if V'max = 0, or Equation 3.41, otherwise, can be obtained from the given code by modifying the L function and removing the call to the projection routine. 103 Appendix B. Program Listings 104 program recon_3D C The main c a l l i n g routine l o r the reconstruction. I t sets up the array space C and c a l l s the reconloop subroutine, and then writes the f i n a l image. impl i c t integer*4 (a-z) l o g i c a l exists integer np,nxi,ntheta,nphi,nix,nly,nc,nop,nx,nz,nf,m\/4\/, + tmax,rtmax,t sr\/1\/,Hi,Ri,RFi,Npiby2, + dsize,daddr,spe_dsize,spe_daddr, + 1s i z e,laddr,caddr,cs i z e,pdaddr,pds i z e, + l s _ i s ize,ls_iaddr,isize,iaddr,th_size,cth_addr,sth_addr, + xi_size,cxi_addr,sxi.addr,ph_size,cph_addr,sph_addr, + status,wordsize\/4\/,int_wordsize\/2\/,lunl\/l\/, + lib$get_vm,lib$free_vm,lib$init_timer,lib$show_timer + lib$free_timer,timer_addr\/0\/ integer f ile_origin,max_sn,spe_number,spe_length,spe_type, + spe_word_size,spe_origin r e a l psi_det,filter,fc,L,image_sum, + delta_p_inv,ratio_pv\/l.0\/,ratio_vs\/l.0\/, + H\/5.4\/.R\/38.0\/.RF character*50 spe_datafile,ls_imagefile.imagefile include 'cspectra.edi' common fi l t e r ( - 3 0 : 3 0 ) \/det_parms\/H,Hi,Ri,RFi + \/ratios\/delta_p_inv,ratio_pv,ratio_vs write(*,*) ' data.spe f i l e : ' read(*.'(A50)') spe_datafile inquire(file=spe_datafile,exist=exists) i f ( . n o t . e x i s t s ) c a l l quit('No data f i l e ' ) write(*,*) ' l s _ i m a g e f i l e : ' read(*,'(A50)') l s _ i m a g e f i l e inquire(file=ls_imagefile,exist=exists) i f ( . n o t . e x i s t s ) c a l l quit('No image f i l e ' ) write(*,*) ' number of t r a n s a x i a l events detected:' read(*,*) Npiby2 write(*,*) ' d i s c r e t e sum of Is image:' read(*,*) image_sum write(*,*) ' new image f i l e : ' read(*,'(A50)') imagefile C These routines are not l i s t e d here. They read the dimensions of the C histogram which was generated i n another program (also not included, see C the routine project_data f o r the histogramming code). c a l l open_spectrum(spe_datafile.file_origin,max_sn) spe_number = 2 ! the radon array i s stored i n SN #2 c a l l read_spe_description(spe_number,file_origin,spe_length, + spe_type,spe_word_size,spe_origin) np = (spxdim(2)-l)\/2 delta_p_inv = spxscale(2) nxi = spydim(2) nphi = spzdim(2) ntheta = spadim(2) psi_det = atan(H\/R) write(*,*) ' f c : ' read(*,*) f c nf = 11 nc = np + nf-1 ncp = nc + 4 Appendix B. Program Listings 105 Hi = int(H*delta_p_inv+float(m)) ! RF = sqrt(float(nc*nc-Hi*Hi)) ! nly = int(Hi*cos(psi_det)+RF*sin(psi_det))+2 Hi = int(Hi) RFi = int(RF) nix = RFi+2 ! to allow f o r i n t e r p o l a t i o n beyond plane edge Ri = R*delta_p_inv nz = int(Hi*ratio_pv) ! delta_p\/delta_v nx = int(RFi*ratio_pv) write(*,*) ' np,nc,nlx,nly,nx,nz:',np,nc,nlx,nly,nx,nz tmax = (ntheta-l)\/2 rtmax = tmax-tsr i s i z e = wordsize*(2*nz+l)*(2*nx+l)**2 status = lib$get_vm(isize,iaddr) i f (.not. status) c a l l lib$signal ( \/ C v a l(status)) c a l l zeroimage(nx,nz ,%val(iaddr)) write(*,*) ' i s i z e : ' , isize\/512.0, ' blocks' l s _ i s i z e = wordsize*(2*nz+l)*(2*nx+l)**2 status = lib$get_vm(ls_isize,ls_iaddr) i f (.not. status) c a l l lib$signal('\/,val(status)) write(*,*) ' l s _ i s i z e : ' , ls_isize\/512.0, ' blocks' spe_dsize = ((2*np+l)*nxi)*int_wordsize status = lib$get_vm(spe_dsize,spe_daddr) i f ( . n o t . s t a t u s ) c a l l lib$signal('\/,val(status)) write(*,*) ' spe_dsize:', spe_dsize\/512.0, ' blocks' dsize = ((2*nc+l)*nxi)*wordsize status = lib$get_vm(dsize,daddr) i f ( .not. status) c a l l lib$signal('\/,val(status)) write(*,*) ' dsize:', dsize\/512.0, ' blocks' pdsize = ((2*(nc+nf-l)+l)*nxi)*wordsize status = lib$get_vm(pdsize,pdaddr) i f (.not. status) c a l l lib$signal('\/,val(status)) write(*,*) ' pdsize:', pdsize\/512.0, ' blocks' c s i z e = (2*ncp+l)*nxi*wordsize status = lib$get_vm(csize,caddr) i f ( .not.status) c a l l lib$signal('\/,val(status) ) write(*,*) ' c s i z e : ' , csize\/512.0, ' blocks' I s i z e = nxi*(rtmax+i)*(2*nf+i)*wordsize status = lib$get_vm(lsize,Iaddr) i f ( .not. status) c a l l lib$signal('\/,val(status)) x i _ s i z e = nxi*wordsize status = lib$get_vm(xi_size,cxi_addr) i f ( .not.status) c a l l lib$signal('\/.val(status)) status = lib$get_vm(xi_size,sxi_addr) i f ( .not.status) c a l l lib$signal('\/,val(status)) ph_size = nphi*wordsize status = lib$get_vm(ph_size,cph_addr) i f ( .not. status) c a l l lib$signal('\/,val(status)) status = lib$get_vm(ph_size,sph_addr) i f ( .not. status) c a l l lib$signal('\/,val(status)) t h _ s i z e = ntheta*wordsize status = lib$get_vm(th_size,cth_addr) i f (.not. status) c a l l lib$signal('\/,val(status) ) status = lib$get_vm(th_size,sth_addr) i f ( .not. status) c a l l lib$signal('\/,val(status)) Appendix B. Program Listings 106 open(lunl,file=ls_imagefile,status='old', + form='unformatted') c a l l read_image(nx,nz,'\/,val(ls_iaddr),lunl) c l o s e ( l u n l ) st atus =1ib$ i n i t _ t imer(timer_addr) i f ( . n o t . s t a t u s ) c a l l lib$signal('\/,val(status)) c a l l f i l t e r g e n ( n f , f c ) c a l l reconloop_3D(nx,nz,np,nxi,nphi,ntheta,nix,nly,nf,nc,ncp, + psi_det,delta_p_inv,tmax,tsr,spe_origin, + '\/.val(daddr) ,'\/,val(spe_daddr) ,'\/,val(ls_iaddr), + '\/.val(laddr) ,'\/.val(caddr) ,*\/.val(pdaddr) , + '\/,val(cxi_addr) ,'\/,val(sxi_addr) ,y.val(cph_addr) ,%val(sph_addr) , + V.val (cth_addr) , 'Aval (sth_addr) , Npiby2, image_sum,*\/,val (iaddr) ) type '(a)',' Program s t a t i s t i c s ' status=lib$show_timer(timer_addr) i f ( .not. status) c a l l lib$signal('\/.val(status)) status=lib$free_timer(timer_addr) i f (.not. status) c a l l lib$signal('\/,val(status) ) open(lunl,file=imagefile,status='new', + form='unformatted') c a l l copy_image(nx,nz,'\/,val(iaddr) ,lunl) c l o s e ( l u n l ) status = l i b $ f r e e _ v m ( l s _ i s i z e , l s _ i a d d r ) i f ( .not. status) c a l l lib$signal('\/,val(status)) status = lib$free_vm(isize,iaddr) i f ( .not. status) c a l l lib$signal('\/,val(status)) end subroutine quit(outstring) i m p l i c i t none character*(*) outstring type '(2x,a)', outstring c a l l e x i t end subroutine zeroimage(nx,nz,array) i m p l i c i t none integer nx,nz,i,j,k r e a l array(-nx:nx,-nx:nx,-nz:nz) do k= -nz, nz do j= -nx, nx do i= -nx, nx array(i,j,k)=0.0 enddo enddo enddo end subroutine read_image(nx,nz,array,lun) i m p l i c i t none integer lun.nx.nz,i,j,k r e a l array(-nx:nx,-nx:nx,-nz:nz) read(lun) array return end subroutine copy_image(nx,nz,array,lun) i m p l i c i t none integer lun.nx.nz,i,j,k Appendix B. Program Listings 107 real array(-nx:nx,-nx:nx,-nz:nz) write(lun) array return end Appendix B. Program Listings 108 subroutine f i l t e r g e n ( n f , f c ) C This routine generates the r a d i a l part of the f i l t e r . r e a l r n , p i , f c , k , f i l t e r , i n t e g r a l integer nf,n common f i l t e r ( - 3 0 : 3 0 ) pi=acos(-l.0) i n t e g r a l =0.0 do n = 1-nf, nf-1 rn = f l o a t ( n ) f i l t e r ( n ) = -2.0*(pi**2)*(k(rn,fc) + +(k(rn-1.0\/(2.0*fc),fc) + + k(rn+1.0\/(2.0*fc),fc))\/2.0) i n t e g r a l = i n t e g r a l + f i l t e r ( n ) end do return end r e a l function k(rn,fc) r e a l r n . f c . p i p i = acos(-l.O) i f (rn .eq. 0.0) then k = 2.\/3.*fc**3 else k = fc\/(pi*rn)**2*C0S(2*pi*fc*rn)+ + (fc**2*2*(pi*rn)**2-l)*SIN(2*pi*fc*rn) + \/(2*pi**3*(rn)**3) end i f return end Appendix B. Program Listings 109 subroutine reconloop_3D(nx,nz,np,nxi,nphi,ntheta,nix,nly,nf,nc, + ncp,psi_det,delta_p_inv,tmax,tsr,spe_origin, + data,spe_data,ls_image,L,conv,pdata, + csxi,snxi,csphi,snphi,csth,snth, + Npiby2,image_sum,image) C This routine loops through the XRT projections processing a C 2D section of the data at a time. F i r s t the l i m i t s of the C l i n e i n t e g r a l s are determined i n the unmeasured e l l i p s e s . C The 2D data set i s then completed by projection. C The f i l t e r i n g and backprojection routines routines are c a l l e d and C the f i n a l image i s then passed back to recon_3d. i m p l i c i t none integer nx,nz,np,nxi,nphi.ntheta,nix,nly,nf,nc,ncp,tmax,rtmax,tsr, + spe_origin,twod_len,twod_origin, + pps ize,ppaddr,status,pindex,t index, + sl_addr,s_size,done,totpj,pcount,Npiby2, + 1ib$get_vm,int _words ize\/2\/,words ize\/4\/ integer*2 spe_data(-np:np,0:(nxi-1)) r e a l data(-nc:nc,0:(nxi-i)), + pdata(-(nc+nf-l):(nc+nf-l),0:(nxi-i)), + ls_image(-nx:nx,-nx:nx,-nz:nz),conv(-ncp:ncp,0:(nxi-1)), + L(-nf:nf,0:(nxi-1),0:tmax),filter,image(-nx:nx,-nx:nx,-nz:nz), + csxi(0:(nxi-1)),snxi(0:(nxi-1)), + csth(-(tmax-tsr):(tmax-tsr)),snth(-(tmax-tsr):(tmax-tsr)), + csphi(0:(nphi-1)),snphi(0:(nphi-1)), + delta_phi,delta_theta,delta_xi,delta_p_inv,sum, + psi_det,psi_max,C,pi,scale,image_sum,f,ratio_pv common fi l t e r ( - 3 0 : 3 0 ) \/ r a t i o s \/ r a t i o _ p v p i = acos(-l.O) rtmax = tmax-tsr ppsize = (2*nlx+l)*(2*nly+l)*wordsize status = lib$get_vm(ppsize,ppaddr) i f (.not. status) c a l l lib$signal( ,\/,val(status) ) s_size = 2*(nlx+l)*(nly+l)*rtmax*wordsize status = lib$get_vm(s_size,sl_addr) i f ( .not.status) c a l l lib$signal('\/val(status)) delta_theta = psi_det\/float(tmax) C = -(2*psi_det*delta_p_inv**2)\/float(4*nphi*nxi*(ntheta-l)) image_sum = image_sum*nphi\/ratio_pv**2 scale = Npiby2\/image_sum c a l l trigarray(nxi,nphi,rtmax,delta_theta, + csxi,snxi,csphi,snphi,csth,snth) psi_max = psi_det*(ntheta-l-2*tsr)\/(ntheta-l) c a l l lfncn(nf,nxi,rtmax,snxi,snth,psi_max,L) twod_len = (2*np+l)*nxi*int_wordsize twod_origin = spe_origin + tsr*nphi*twod_len do tindex = 1, rtmax c a l l proj _limits(nix,nly,rtmax,tindex,snth(tindex), + csth(tindex) ,'\/,val(sl_addr) .pcount) type ' ( a , i 4 , a , i 4 ) ' , ' pcount = ', pcount, + ' at tindex = ', tindex end do totpj = (2*rtmax+l)*nphi type '(a,i4,a)',' There are ' , t o t p j , ' projections to do' done = 1 type ' ( a , i 4 ) ' , ' doing projection '.done do tindex = -rtmax, rtmax Appendix B. Program Listings do pindex = 0, nphi-1 type '(a,i4)','+ doing projection '.done done = done + 1 c a l l read_spectrum(twod_origin,twod_len,spe_data) c a l l zerodata(nc,nxi,data) c a l l float_data(np,nc,nxi,spe_data,data) i f ( t index.ne.0)then c a l l proj ect_data(nc,nxi,nlx,nly,nx,nz,rtraax,tindex, + '\/,val(sl_addr),scale,csxi,snxi,csphi(pindex) , + snphi(pindex).csth(tindex).snth(tindex),ls_image,data,sum) end i f c a l l zerodata(ncp,nxi,conv) c a l l zerodata(nc+nf-l,nxi,pdata) c a l l f ilterdata(nf,np,nxi,nc,ncp,data,conv,pdata,rtmax, + tindex,L) c a l l zeropparray (nix, nly,V.val (ppaddr) ) c a l l integrate(nxi, nix,nly,nc,ncp, conv, '\/.val (ppaddr) , c s x i , snxi) c a l l backproj ect (nix, nly ,'\/,val (ppaddr) ,C,nx,nz, image, + csphi(pindex),snphi(pindex), + csth(tindex),snth(tindex)) enddo enddo type '(a)','+ Finished ' w r i t e ( * , * ) ' Sum of projections = ', sum end subroutine zeropparray(nl,n2,array) i m p l i c i t none integer n l , n 2 , i , j r e a l array(-ni:ni,-n2:n2) do j=-n2,n2 do i= - n l , n l array(i,j)=0.0 enddo enddo end subroutine zerodata(nl,n2,array) i m p l i c i t none integer n l , n 2 , i , j r e a l array(-nl:nl,0:(n2-l)) do j=0,n2-l do i=-nl,nl array(i,j)=0.0 enddo enddo end subroutine float_data(np,nc,nxi,spe_data,data) i m p l i c i t none integer np,nc,nxi,i,j integer*2 spe_data(-np:np,0:(nxi-i)) r e a l data(-nc:nc,0:(nxi-1)) do j =0, nxi-1 do i = -np, np d a t a ( i . j ) = f l o a t ( s p e _ d a t a ( i , j ) ) end do end do return end Appendix B. Program Listings 111 subroutine trigarray(nxi,nphi,tmax,delta_theta, + csxi,snxi,csphi,snphi,csth,snth) i m p l i c i t none integer nxi,nphi,tmax,i r e a l delta_phi,delta_theta,delta_xi,pi,theta, + csxi(0:nxi-l),snxi(0:nxi-1), + csphi(0:nphi-l),snphi(0:nphi-l), + csth(-tmax:tmax),snth(-tmax:tmax) p i = acos(-l.O) d e l t a _ x i = p i \/ f l o a t ( n x i ) do i = 0, nxi-1 c s x i ( i ) = c o s ( f l o a t ( i ) * d e l t a _ x i ) s n x i ( i ) = s i n ( f l o a t ( i ) * d e l t a _ x i ) end do delta_phi = p i \/ f l o a t ( n p h i ) do i = 0, nphi-1 cs p h i ( i ) = c o s ( f l o a t ( i ) * d e l t a _ p h i ) snphi(i) = s i n ( f l o a t ( i ) * d e l t a _ p h i ) end do do i = -tmax, tmax theta = p i \/ 2 . 0 - f l o a t ( i ) * d e l t a _ t h e t a c s t h ( i ) = cos(theta) snth(i) = sin(theta) end do return end Appendix B. Program Listings 112 r e a l function lfncn(nf,nxi,tmax,snxi,snth,psi,L) C This routine returns (1\/L)*a_p, L as defined by Orlov. i m p l i c i t none integer nf,fi,nxi,tmax,xi,tindex r e a l L(-nf:nf,0:(nxi-1),0:tmax), + L0(0:(nxi-1),0:tmax), + f i l t e r ( - n f : n f ) , + p s i , p i , r a t i o , c s p s i . s n p s i , + snxi(0:(nxi-1)),snth(-tmax:tmax) common f i l t e r p i = acos(-l.O) cs p s i = cos(psi) snpsi = s i n ( p s i ) do tindex = 0, tmax r a t i o = cspsi\/snth(tindex) do x i = 0, nxi-1 i f ( a b s ( s n x i ( x i ) ) . I t . r a t i o ) then L0(xi,tindex)=1.0\/(2*asin(snpsi)\/ + sqrt(1.0-(snxi(xi)*snth(tindex))**2)) else L0(xi,tindex) = 1.0\/pi end i f end do end do do tindex = 0, tmax do x i = 0, nxi-1 do f i = -nf, nf L ( f i , x i , t i n d e x ) = f i l t e r ( f i ) * L 0 ( x i , t i n d e x ) end do end do end do return end Appendix B. Program Listings subroutine proj_limits(nlx,nly,rtmax,tindex,snth,csth,s_limits, + pcount) C This routine f i n d s the l i m i t s of the l i n e integrals through C a c y l i n d r i c a l f i e l d of view. i m p l i c i t none in t eger nix,nly,rtmax,t index,pcount,lx,ly,Hi,RD i , R F i , i r e a l csth,snth,s_limits(2,0:nix,0:nly,rtmax),RDsq,RFsq,H, + HsRF,HsRD,sqrRF,csqrRF,rly,A,B,rlxsq,rat io_pv,ratio_vs, + delta_p_inv,ratio,rRFi.rHi common \/det_parms\/H,Hi,RDi,RFi + \/ratios\/delta_p_inv,ratio_pv,ratio_vs pcount = 0 r a t i o = ratio_pv*ratio_vs rRFi = float(RFi)-1.0 r H i = f l o a t ( H i ) - . 5 RDsq = float(RDi*RDi) RFsq = rRFi*rRFi HsRD = H*snth*delta_p_inv HsRF = rHi*snth do l y = 0, nly-2 r l y = f l o a t ( l y ) do l x = 0, int( r R F i ) r l x s q = f l o a t ( l x * l x ) i f (rly.gt.(HsRD-csth*sqrt(RDsq-rlxsq))) then sqrRF = sqrt(RFsq-rlxsq) csqrRF = csth*sqrRF i f (rly.lt.(HsRF+csqrRF)) then A = r a t i o * r l y * c s t h \/ s n t h B = ratio*sqrRF\/snth s _ l i m i t s ( l , l x , l y , t i n d e x ) = A-B i f (rly.lt.(HsRF-csqrRF)) then s_ l i m i t s ( 2 , l x . l y , t i n d e x ) = A+B else s . l i m i t s ( 2 , l x . l y , t i n d e x ) = r a t i o * + (rHi-rly*snth)\/csth end i f pcount = pcount+1 end i f end i f end do end do return end Appendix B. Program Listings 114 subroutine proj ect_data(nc,nxi,nix,nly,nx,nz,rtmax,tindex,s_limits, + scale,csxi,snxi,csphi,snphi,csth,snth,image,data,sum) C This routine computes the line integrals of the Is image on a C regular grid in the XT plane. implicit none int eger nc,nxi,nix,nly,nx,nz,rtmax,nlxp,nlyp,alx,lx,aly,ly, + xi,giltp,tindex,atindex,i,j real data(-nc:nc,0:(nxi-1)), + image(-nx:nx,-nx:nx,-nz:nz), + s_liraits(2,0:nix,0:nly,rtmax),s1,s2, + csxi(0:(nxi-1)),snxi(0:(nxi-l)), + csphi,snphi,csth,snth,xl,yl,zl,p, + event,integral,scale,sum,dp,tau_x,tau_y,tau_z, + ratio_pv,duml,dum2, + pplane(-29:29,-18:18) common \/ratios\/duml,ratio_pv,dum2 nlxp = nlx-2 nlyp = nly-2 tau_x = snth*csphi tau_y = snth*snphi tau_z = csth atindex = abs(tindex) do ly = -nlyp, nlyp aly = abs(ly) do lx = -nlxp, nlxp alx = abs(lx) i f (ly*tindex.ge.O) then si = s_limits(l,alx,aly,atindex) s2 = s_limits(2,alx,aly.atindex) else si = -s_limits(2,alx,aly,atindex) s2 = -s_limits(l,alx,aly,atindex) end i f C Compute the line integrals in the e l l i p t i c a l regions i f (sl.lt.s2) then xl = -(lx*snphi+ly*csphi*csth)*ratio_pv y l = (lx*csphi-ly*csth*snphi)*ratio_pv z l = ly*snth*ratio_pv event = scale*snth*integral(xl,yl,zl,tau_x,tau_y,tau_z, + nx.nz,image,sl,s2) C Add the scaled line integral into the incomplete C plane integrals using linear interpolation, do xi = 0, nxi-1 p = lx*csxi(xi)+ly*snxi(xi) if(abs(p).le.(nc-1)) then if(p.lt.O.O) then giltp = int(p)-l else giltp = int(p) end i f dp = p-giltp data(giltp,xi) = data(giltp,xi)+event*(l-dp) data(giltp+l,xi) = data(giltp+l,xi)+event*dp end i f end do ! xi end i f end do end do return end Appendix B. Program Listings 115 r e a l function integralCxl,yl,zl,tau_x,tau_y,tau_z,nx,nz,image, + sl,s2) C This function computes the l i n e i n t e g r a l by t r i - l i n e a r i n t e r p o l a t i o n C i n the image volume i m p l i c i t none integer nx,nz r e a l image(-nx:nx,-nx:nx,-nz:nz), + sl,s2,s,ds\/1.0\/,dsx,dsy,dsz, + x l , y l , z l , x , y , z , g i l t x , g i l t y , g i l t z , d x , d y , d z , + t au_x,t au_y,t au_z i n t e g r a l = 0.0 s \u2014 s i dsx = ds*tau_y dsy = ds*tau_z dsz = ds*tau_x x = xl+s*tau_x y = xl+s*tau_y z = xl+s*tau_z do while (s.le.s2) if(x.lt.O.O) then g i l t x = i n t ( x ) - l else g i l t x = int(x) end i f if(y . l t . 0 . 0 ) then g i l t y = i n t ( y ) - l else g i l t y = int(y) end i f i f ( z . l t . 0 . 0 ) then g i l t z = i n t C z ) - l else g i l t z = intCz) end i f dx = x - g i l t x d y = y - g i i t y dz = z - g i l t z i n t e g r a l = i n t e g r a l + +Ci\u20220-dx)* C1\u20220-dy)* C1.0-dz)*image C g i l t x , g i l t y , g i l t z ) + +dx*Cl.0-dy)*Cl.0-dz)*iraageCgiltx+l,gilty,giltz) + + C1.0-dx)*dy* C1\u20220-dz)*imageCgiltx,gilty+1,giltz) + +dx*dy*Ci.0-dz)*imageCgiltx+l,gilty+1,giltz) + +Cl.0-dx)*Cl.0-dy)*dz*imageCgiltx,gilty,giltz+1) + +dx* C1.0-dy)*dz*image Cgiltx+1,gilty,giltz+1) + + C1.0-dx)*dy*dz*imageCgiltx,gilty+1,giltz+1) + +dx*dy*dz*imageCgiltx+l,gilty+1,giltz+1) x = x+dsx y = y+dsy z = z+dsz end do end Appendix B. Program Listings 116 subroutine f ilterdata(nf,np,nxi,nc,ncp,data,conv,pdata,tmax, + tindex,L) C This routine performs the convolution f i l t e r i n g i m p l i c i t none integer nf,np,nxi,nc,ncp,tmax,tindex,p,xi.fi,i,j r e a l data(-nc:nc , 0 :(nxi - 1 ) ) , + pdata(-(nc+nf-l):(nc+nf -1) ,0:(nxi -1)) r e a l L(-nf:nf , 0 :(nxi - 1 ) , 0:tmax),conv(-ncp:ncp,0 :(nxi - 1 ) ).filter do x i = 0, nxi - 1 do p = -nc, nc pdata(p,xi)=data(p,xi) end do end do do x i = 0, nxi - 1 do p = -nc , nc do f i = 1-nf, nf -1 conv(p.xi) = conv(p.xi) + + pdata(p+fi,xi)*L(fi.xi.abs(tindex)) end do ! f i end do ! p end do ! x i return end Appendix B. Program Listings 117 subroutine integrate(nxi,nix,nly,nc,ncp,conv,pplane, + csxi,snxi) C This routine performs the integration i n x i on a regular g r i d C i n the XRT plane using a ID l i n e a r i n t e r p o l a t i o n i m p l i c i t none integer n x i , x i , n l x , n l y , n c , n c p , i , j , k , g i l t p r e a l p,pi,delta_xi,dp, + conv(-ncp:ncp,0 :(nxi-i)), + pplane(-nix:nix,-nly:nly), + csxi ( 0:nxi-l),snxi ( 0:nxi-l) p i = acos(-l.O) do j = -nly,nly do i = -nix,nix do x i = 0, nxi-1 p = f l o a t ( i ) * c s x i ( x i ) + f l o a t ( j ) * s n x i ( x i ) i f (abs(p).le.nc) then i f (p.lt . 0 . 0 ) then g i l t p = int(p) - 1 else g i l t p = int(p) end i f dp = p - g i l t p pplane(i.j) = pplane(i,j) + (l-dp)*conv(giltp,xi) + + dp*conv(giltp+l,xi) end i f end do ! x i end do end do return end Appendix B. Program Listings subroutine backproj ect(nix,nly.pplane,C,nx,nz,image, + csphi,snphi,csth,snth) C This routine backprojects the f i l t e r e d XRT plane using a b i - l i n e a r C i n t e r p o l a t i o n . i m p l i c i t none integer n l x , n l y , n x , n z , n x s q , g i l t l x , g i l t l y , i , j , k r e a l pplane(-nix:nix,-nly:nly), + image(-nx:nx,-nx:nx,-nz:nz), + C,lx,ly,dx,dy,csphi,snphi,csth,snth, + ratio_vp ratio_vp = 1.0 nxsq = nx*nx do k = -nz, nz do j = -nx, nx do i= -nx, nx i f ( ( i * i + j * j ) . l e . n x s q ) then l x = ratio_vp*(j*csphi-i*snphi) l y = ratio_vp*(-i*csth*csphi-j*csth*snphi+k*snth) i f ( l x . l t . 0 . 0 ) then g i l t l x = i n t ( l x ) - l else g i l t l x = i n t ( l x ) end i f i f ( l y . l t . 0 . 0 ) then g i l t l y = i n t ( l y ) - l else g i l t l y = i n t ( l y ) end i f dx = l x - g i l t l x dy = l y - g i l t l y image(i,j,k) = image(i,j,k) + + ( ( 1 . 0 - d x ) * ( 1 . 0 - d y ) * p p l a n e ( g i l t l x , g i l t l y ) + + ( d x ) * ( l . 0 - d y ) * p p l a n e ( g i l t l x + l , g i l t l y ) + + ( 1 . 0 - d x ) * ( d y ) * p p l a n e ( g i l t l x , g i l t l y + l ) + + (dx ) * ( d y ) * p p l a n e ( g i l t l x + l , g i l t l y + l ) ) * C end i f enddo enddo enddo return end Publications Toward the Design of a Positron Volume Imaging (PVI) Camera, J.G. Rogers, M. Stazyk, R. Harrop, C.J. Dykstra, J.S. Barney, M.S. Atkins, P. E. Kinahan, IEEE Transcations on Nuclear Science, A p r i l 90, Vol. 37, No. 2. Design of a Volume-Imaging Positron Emission Tomograph, J.G Rogers, R. Harrop, G.H. Coombes, N.A. Wilkinson, M.S. Atkins, B.D. Pate, K.S. Morrison, M. Stazyk, C.J. Dykstra, J.S. Barney, P.W. Doherty, D.P. Saylor, IEEE Transactions on Nuclear Science, Feb 89, Vol. 36, No. 1. Reactive Ion Etching Damage to n-type GaAs, S. Dzioba, T. Lester, M. Stazyk, C. Miner, Presented May 1986, State-of-the-Art Program on Compound Semiconductors. S l i p - f r e e , Capless Rapid Thermal Annealing of S i Implanted GaAS, T. Lester, M. Stazyk, R. Streater, Presented June 1986, Electronic Materials Conference, University of Massachusetts, Amherst, Mass. A Simple Diagnostic Technique for Detecting Fine Lock-up Patterns i n E l e c t r o s t a t i c a l l y Scanned Ion Implanters, T. Lester, M. Stazyk, JVSTb5(2), March\/April 1987. Awards 1978 McMaster University Alumni Scholarship 4 Year Entrance Scholarship 1979 Association of Professional Engineers of Ontario Entrance Scholarship (Declined) 1979 L. Squire Scholarship 1980 Association of Professional Engineers of Ontario Scholarship 1980 McMaster University Scholarship 1981 McMaster University Scholarship 1989 NSERC PGS-2 1989 U. B. C. University Graduate Fellowship (Declined) 1989 Science Council of B. C. G.R.E.A.T. Award 1990 NSERC PGS-3 1990 U. B. C. University Graduate Fellowship (Declined) 1990 Science Council of B. C. G.R.E.A.T. Award ","type":"literal","lang":"en"}],"http:\/\/www.europeana.eu\/schemas\/edm\/hasType":[{"value":"Thesis\/Dissertation","type":"literal","lang":"en"}],"http:\/\/www.europeana.eu\/schemas\/edm\/isShownAt":[{"value":"10.14288\/1.0085047","type":"literal","lang":"en"}],"http:\/\/purl.org\/dc\/terms\/language":[{"value":"eng","type":"literal","lang":"en"}],"https:\/\/open.library.ubc.ca\/terms#degreeDiscipline":[{"value":"Physics","type":"literal","lang":"en"}],"http:\/\/www.europeana.eu\/schemas\/edm\/provider":[{"value":"Vancouver : University of British Columbia Library","type":"literal","lang":"en"}],"http:\/\/purl.org\/dc\/terms\/publisher":[{"value":"University of British Columbia","type":"literal","lang":"en"}],"http:\/\/purl.org\/dc\/terms\/rights":[{"value":"For non-commercial purposes only, such as research, private study and education. Additional conditions apply, see Terms of Use https:\/\/open.library.ubc.ca\/terms_of_use.","type":"literal","lang":"en"}],"https:\/\/open.library.ubc.ca\/terms#scholarLevel":[{"value":"Graduate","type":"literal","lang":"en"}],"http:\/\/purl.org\/dc\/terms\/subject":[{"value":"Imaging systems","type":"literal","lang":"en"},{"value":"Radon transforms","type":"literal","lang":"en"}],"http:\/\/purl.org\/dc\/terms\/title":[{"value":"Radon Transform in three dimensional image reconstruction from projections","type":"literal","lang":"en"}],"http:\/\/purl.org\/dc\/terms\/type":[{"value":"Text","type":"literal","lang":"en"}],"https:\/\/open.library.ubc.ca\/terms#identifierURI":[{"value":"http:\/\/hdl.handle.net\/2429\/28726","type":"literal","lang":"en"}]}}*