r574: no 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-2001 Kevin Rosenberg
11 **
12 **  $Id: backprojectors.h,v 1.23 2001/02/23 02:06:01 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 #ifndef __BACKPROJECTORS_H
30 #define __BACKPROJECTORS_H
31
32 #undef HAVE_BSPLINE_INTERP
33
34 #include "imagefile.h"
35
36
37 class Backproject;
38 class ImageFile;
39 class Projections;
40
41 class Backprojector
42 {
43  public:
44   static const int BPROJ_INVALID;
45   static const int BPROJ_TRIG;
46   static const int BPROJ_TABLE;
47   static const int BPROJ_DIFF;
48   static const int BPROJ_IDIFF;
49
50   static const int INTERP_INVALID;
51   static const int INTERP_NEAREST;
52   static const int INTERP_LINEAR;
53   static const int INTERP_CUBIC;
54   static const int INTERP_FREQ_PREINTERPOLATION;
55 #if HAVE_BSPLINE_INTERP
56   static const int INTERP_BSPLINE;
57   static const int INTERP_1BSPLINE;
58   static const int INTERP_2BSPLINE;
59   static const int INTERP_3BSPLINE;
60 #endif
61
62   Backprojector (const Projections& proj, ImageFile& im, const char* const backprojName, const char* const interpName, const int interpFactor);
63
64   ~Backprojector ();
65                  
66   void BackprojectView (const double* const viewData, const double viewAngle);
67   void PostProcessing();
68
69   bool fail() const {return m_fail;}
70   const std::string& failMessage() const {return m_failMessage;}
71
72   static const int getBackprojectCount() {return s_iBackprojectCount;}
73   static const char* const* getBackprojectNameArray() {return s_aszBackprojectName;}
74   static const char* const* getBackprojectTitleArray() {return s_aszBackprojectTitle;}
75   static int convertBackprojectNameToID (const char* const bprojName);
76   static const char* convertBackprojectIDToName (const int bprojID);
77   static const char* convertBackprojectIDToTitle (const int bprojID);
78
79   static const int getInterpCount() {return s_iInterpCount;}
80   static const char* const * getInterpNameArray() {return s_aszInterpName;}
81   static const char* const * getInterpTitleArray() {return s_aszInterpTitle;}
82   static int convertInterpNameToID (const char* const interpName);
83   static const char* convertInterpIDToName (const int interpID);
84   static const char* convertInterpIDToTitle (const int interpID);
85
86
87  private:
88   std::string m_nameBackproject;
89   std::string m_nameInterpolation;
90   int m_idBackproject;
91   int m_idInterpolation;
92   Backproject* m_pBackprojectImplem;
93   bool m_fail;
94   std::string m_failMessage;
95
96   static const char* const s_aszBackprojectName[];
97   static const char* const s_aszBackprojectTitle[];
98   static const int s_iBackprojectCount;
99
100   static const char* const s_aszInterpName[];
101   static const char* const s_aszInterpTitle[];
102   static const int s_iInterpCount;
103
104   bool initBackprojector (const Projections& proj, ImageFile& im, const char* const backprojName, const char* const interpName, const int interpFactor);
105 };
106
107
108 class Backproject
109 {
110  public:
111     Backproject (const Projections& proj, ImageFile& im, int interpID, const int interpFactor);
112
113     virtual ~Backproject ();
114
115     virtual void BackprojectView (const double* const viewData, const double viewAngle) = 0;
116     virtual void PostProcessing (); // call after backprojecting all views
117
118  protected:
119     void ScaleImageByRotIncrement ();
120     void Backproject::errorIndexOutsideDetector (int ix, int iy, double theta, double r, double phi, double L, int ni);
121     void Backproject::errorIndexOutsideDetector (int ix, int iy, double theta, double L, int ni);
122     const Projections& proj;
123     ImageFile& im;
124     int interpType;
125     ImageFileArray v;
126     kint32 nx;
127     kint32 ny;
128     double detInc;
129     double rotScale;
130     int iDetCenter;             // index refering to L=0 projection 
131     int nDet;
132     double xMin, xMax, yMin, yMax;     // Retangular coords of phantom
133     double xInc, yInc;  // size of cells
134     int m_interpFactor;
135     double m_dFocalLength;
136     bool m_bPostProcessingDone;
137
138  private:
139     Backproject (const Backproject& rhs);
140     Backproject& operator= (const Backproject& rhs);
141 };
142
143
144 class BackprojectTrig : public Backproject
145 {
146  public:
147   BackprojectTrig (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
148       : Backproject (proj, im, interpID, interpFactor)
149       {}
150
151   void BackprojectView (const double* const t, const double view_angle);
152 };
153
154
155 class BackprojectTable : public Backproject
156 {
157  public:
158   BackprojectTable (const Projections& proj, ImageFile& im, int interpID, const int interpFactor);
159   virtual ~BackprojectTable ();
160
161   virtual void BackprojectView (const double* const t, const double view_angle);
162   virtual void PostProcessing (); // call after backprojecting all views
163
164  protected:
165   Array2d<kfloat64> arrayR;
166   Array2d<kfloat64> arrayPhi;
167   kfloat64** r;
168   kfloat64** phi;
169 };
170
171
172 class BackprojectDiff : public Backproject
173 {
174  public:
175   BackprojectDiff (const Projections& proj, ImageFile& im, int interpID, const int interpFactor);
176   ~BackprojectDiff ();
177
178   virtual void BackprojectView (const double* const t, const double view_angle);
179   virtual void PostProcessing (); // call after backprojecting all views
180
181  protected:
182   double start_r;
183   double start_phi;
184   double im_xinc, im_yinc;
185 };
186
187
188 class BackprojectIntDiff : public BackprojectDiff
189 {
190  public:
191   BackprojectIntDiff (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
192     :  BackprojectDiff (proj, im, interpID, interpFactor)
193     {}
194   
195   void BackprojectView (const double* const t, const double view_angle);
196 };
197
198 class BackprojectEquilinear : public BackprojectTable
199 {
200  public:
201   BackprojectEquilinear (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
202       : BackprojectTable (proj, im, interpID, interpFactor)
203       {}
204
205   void BackprojectView (const double* const t, const double view_angle);
206
207   virtual ~BackprojectEquilinear()
208       {}
209 };
210
211 class BackprojectEquiangular : public BackprojectTable
212 {
213  public:
214   BackprojectEquiangular (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
215       : BackprojectTable (proj, im, interpID, interpFactor)
216       {}
217
218   void BackprojectView (const double* const t, const double view_angle);
219
220   virtual ~BackprojectEquiangular()
221       {}
222 };
223
224
225 #endif