r140: *** empty log message ***
[ctsim.git] / include / backprojectors.h
1 /*****************************************************************************
2 ** FILE IDENTIFICATION
3 **
4 **      Name:         backproject.h
5 **      Purpose:      Backprojection classes
6 **      Programmer:   Kevin Rosenberg
7 **      Date Started: June 2000
8 **
9 **  This is part of the CTSim program
10 **  Copyright (C) 1983-2000 Kevin Rosenberg
11 **
12 **  $Id: backprojectors.h,v 1.7 2000/07/09 08:16:17 kevin Exp $
13 **
14 **  This program is free software; you can redistribute it and/or modify
15 **  it under the terms of the GNU General Public License (version 2) as
16 **  published by the Free Software Foundation.
17 **
18 **  This program is distributed in the hope that it will be useful,
19 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 **  GNU General Public License for more details.
22 **
23 **  You should have received a copy of the GNU General Public License
24 **  along with this program; if not, write to the Free Software
25 **  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 ******************************************************************************/
27
28
29 #undef HAVE_BSPLINE_INTERP
30
31 class Backproject;
32
33 class Backprojector
34 {
35  public:
36   typedef  enum {
37     BPROJ_INVALID,
38     BPROJ_TRIG,
39     BPROJ_TABLE,
40     BPROJ_DIFF,
41     BPROJ_DIFF2,
42     BPROJ_IDIFF2,
43     BPROJ_IDIFF3
44 } BackprojectID;
45
46   typedef enum {
47     INTERP_INVALID,
48     INTERP_NEAREST,      // Nearest neighbor
49 #if HAVE_BSPLINE_INTERP
50     I_BSPLINE,
51     I_1BSPLINE,      // 1st order B-Spline 
52     I_2BSPLINE,
53     I_3BSPLINE,
54 #endif
55     INTERP_LINEAR,        // Linear interpolation 
56     INTERP_FREQ_PREINTERPOLATE,
57   } InterpolationID;
58
59   static const char BPROJ_TRIG_STR[]=     "trig";
60   static const char BPROJ_TABLE_STR[]=    "table";
61   static const char BPROJ_DIFF_STR[]=     "diff";
62   static const char BPROJ_DIFF2_STR[]=    "diff2";
63   static const char BPROJ_IDIFF2_STR[]=   "idiff2";
64   static const char BPROJ_IDIFF3_STR[]=   "idiff3";
65  
66   static const char INTERP_NEAREST_STR[]=  "nearest";
67   static const char INTERP_LINEAR_STR[]=   "linear";
68   static const char INTERP_BSPLINE_STR[]=  "bspline";
69   static const char INTERP_FREQ_PREINTERPOLATE_STR[]= "freq_preinterpolate";
70
71   Backprojector (const Projections& proj, ImageFile& im, const char* const backprojName, const char* const interpName);
72
73   ~Backprojector (void);
74                  
75   void BackprojectView (const double* const viewData, const double viewAngle);
76
77   bool fail(void) const {return m_fail;}
78   const string& failMessage(void) const {return m_failMessage;}
79
80  private:
81   string m_nameBackproject;
82   string m_nameInterpolation;
83   BackprojectID m_idBackproject;
84   InterpolationID m_idInterpolation;
85   Backproject* m_pBackprojectImplem;
86   bool m_fail;
87   string m_failMessage;
88
89   static const InterpolationID convertInterpolationNameToID (const char* const interpName);
90   static const char* convertInterpolationIDToName (const InterpolationID interpID);
91   static const BackprojectID convertBackprojectNameToID (const char* const bprojName);
92   static const char* convertBackprojectIDToName (const BackprojectID bprojID);
93
94   bool initBackprojector (const Projections& proj, ImageFile& im, const char* const backprojName, const char* const interpName);
95 };
96
97
98 class Backproject
99 {
100  public:
101     Backproject (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType);
102
103     virtual ~Backproject ();
104
105     virtual void BackprojectView (const double* const viewData, const double viewAngle) {};
106
107  protected:
108     void ScaleImageByRotIncrement (void);
109     void Backproject::errorIndexOutsideDetector (int ix, int iy, double theta, double r, double phi, double L, int ni);
110     void Backproject::errorIndexOutsideDetector (int ix, int iy, double theta, double L, int ni);
111
112     Backprojector::InterpolationID interpType;
113     const Projections& proj;
114     ImageFile& im;
115     ImageFileArray v;
116     kuint32 nx;
117     kuint32 ny;
118     double detInc;
119     double rotInc;
120     int iDetCenter;             // index refering to L=0 projection 
121     int nDet;
122     double xMin, xMax, yMin, yMax;     // Retangular coords of phantom
123     double xInc, yInc;  // size of cells
124
125  private:
126     Backproject (const Backproject& rhs);
127     Backproject& operator= (const Backproject& rhs);
128 };
129
130
131 class BackprojectTrig : public Backproject
132 {
133  public:
134   BackprojectTrig (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
135       : Backproject::Backproject (proj, im, interpType)
136       {}
137
138   void BackprojectView (const double* const t, double view_angle);
139 };
140
141
142 class BackprojectTable : public Backproject
143 {
144  public:
145   BackprojectTable (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType);
146   ~BackprojectTable ();
147
148   void BackprojectView (const double* const t, double view_angle);
149
150  private:
151   Array2d<kfloat64> arrayR;
152   Array2d<kfloat64> arrayPhi;
153   kfloat64** r;
154   kfloat64** phi;
155 };
156
157
158 class BackprojectDiff : public Backproject
159 {
160  public:
161   BackprojectDiff (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType);
162   ~BackprojectDiff ();
163
164   void BackprojectView (const double* const t, double view_angle);
165
166  protected:
167   double start_r;
168   double start_phi;
169   double im_xinc, im_yinc;
170 };
171
172 class BackprojectDiff2 : public BackprojectDiff
173 {
174  public:
175   BackprojectDiff2 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
176     :  BackprojectDiff::BackprojectDiff (proj, im, interpType)
177     {}
178
179   void BackprojectView (const double* const t, double view_angle);
180 };
181
182 class BackprojectIntDiff2 : public BackprojectDiff
183 {
184  public:
185   BackprojectIntDiff2 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
186     :  BackprojectDiff::BackprojectDiff (proj, im, interpType)
187     {}
188   
189   void BackprojectView (const double* const t, double view_angle);
190 };
191
192
193 class BackprojectIntDiff3 : public BackprojectDiff
194 {
195  public:
196   BackprojectIntDiff3 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
197     :  BackprojectDiff::BackprojectDiff (proj, im, interpType)
198     {}
199   
200   void BackprojectView (const double* const t, double view_angle);
201 };
202
203