Initial snark14m import
[snark14.git] / src / snark / foru.cpp
1 /*
2  ***********************************************************
3  $SNARK_Header: S N A R K  1 4 - A PICTURE RECONSTRUCTION PROGRAM $
4  $HeadURL: svn://dig.cs.gc.cuny.edu/snark/trunk/src/snark/foru.cpp $
5  $LastChangedRevision: 85 $
6  $Date: 2014-07-02 16:07:08 -0400 (Wed, 02 Jul 2014) $
7  $Author: agulati $
8  ***********************************************************
9
10
11  IMPLEMENTATION OF FOURIER RECONSTRUCTION METHOD
12  SEE, E.G., GORDON AND HERMAN, 1974, LUTZ, 1975 AND MERSEREAU,
13  1976)
14  THE METHOD HAS FOUR STAGES:
15  (1) FOURIER TRANSFORMING THE DATA
16  (2) FILTERING THE FOURIER TRANSFORM
17  (3) INTERPOLATING THE FOURIER TRANSFORM TO A SQUARE GRID
18  (4) TAKING THE INVERSE FOURIER TRANSFORM
19
20  TO EXECUTE THE ROUTINE SPECIFY EXEC FOURIER AND CHOOSE PARAMETERS
21  AS EXPLAINED BELOW:
22  FILTER : BAND  BANDLIMITING FILTER
23  SINC  SINC FILTER
24  COSI  COSINE FILTER
25  HAMM  HAMMING FILTER
26  CUTOFF : REAL MODIFIER
27  THIS SPECIFIES THE CUTOFF RADIUS AS CUTOFF/(2.0*RINC)
28  WHERE RINC IS THE MODIFIED PINC (SEE FRINIT)
29  CUTOFF IS SUPPOSED TO BE A NUMBER BETWEEN 0 AND 1
30  IF CUTOFF EQ 0  IT IS REASSIGED TO 1.0
31  IF CUTOFF LT 0  IT IS REASSIGNED TO 2.0*PRJNUM/(PI*NELEM
32  *PIXSIZ)
33  IF CUTOFF GT 1 IT IS REASSIGNED TO 1.0
34  INTERP : INTEGER MODIFIER
35  =1  NEAREST NEIGHBOR IN CARTESIAN SENSE
36  =2  NEAREST NEIGHBOR IN RADIAL SENSE
37  =3  LINEAR INTERPOLATION
38  =4  HARMONIC INTERPOLATION
39  SIZE1 : INTEGER MODIFIER
40  THE SIZE OF THE ARRAY TO BE USED FOR FOURIER TRANSFORM
41  IF OMITTED, IT WILL BE ASSIGNED NRAYS+1
42  IF LESS THEN USRAYS+1 IT WILL BE REASSIGNED USRAYS+1
43  SIZE2 : INTEGER MODIFIER
44  SIZE2*SIZE2 WILL BE THE SIZE OF THE ARRAY TO BE
45  BACKTRANSFORMED
46  IF OMITTED OR LESS THAN NELEM+1 IT WILL BE REASSIGNED
47  NELEM+1
48
49  MORE DETAILED PROCEDURE :
50  STEP1 READ 1ST PROJECTION INTO COMMON BLOCK STARTING AT NTEMP+1
51  STEP2 REARRANGE THE PROJECTION DATA SO THAT THE ORIGIN IS THE
52  FIRST ELEMENT IN THE ARRAY
53  PUT INTO COMMON BLOCK STARTING AT NPROJ1+1
54  PERFORM FILTERING & FOURIER TRANSFORM, THE TRANSFORM REPLACES THE
55  ORIGINAL DATA
56  STEP3 REPEAT UNTIL ALL PROJECTIONS ARE USED:
57  READ NEXT PROJECTION INTO NTEMP+1
58  REARRANGE THE DATA, PUT INTO COMMON BLOCK STARTING AT NPROJ2+1
59  OR NPROJ1+1 (LEAST RECENTLY USED)
60  PERFORM FILTERING & FOURIER TRANSFORM
61  PERFORM INTERPOLATION USING THE DATA IN NPROJ1 AND NPROJ2
62  STEP4 READ 1ST PROJECTION, REARRANGE, TRANSFORM, INTERPOLATE BRTWEEN
63  1ST & LAST PROJECTIONS
64  STEP5 INVERSE TRANSFORM THE INTERPOLATED VALUES
65  STEP6 REARRANGE THE INVERSE TRANSFORM AND PUT INTO RECON
66  */
67
68 #include <cstdio>
69
70 #include "blkdta.h"
71 #include "geom.h"
72 #include "fourie.h"
73
74 #include "foru.h"
75
76 BOOLEAN foru_class::Run(REAL* recon, INTEGER* list, REAL* weight, INTEGER iter)
77 {
78         if (iter > 1)
79                 return FALSE;
80
81         frinit();
82         if (Fourie.iflg == 1)
83                 return TRUE;
84
85         // Steps 1 - 4
86         forwrd();
87         if (Fourie.iflg == 1)
88                 return TRUE;
89
90         // Steps 5, 6
91         bckwrd(recon);
92
93         return FALSE;
94 }
95