r591: Added Center-Detector length to scanning and reconstruction
[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.24 2001/03/01 07:30:49 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     double m_dSourceDetectorLength;
137     bool m_bPostProcessingDone;
138
139  private:
140     Backproject (const Backproject& rhs);
141     Backproject& operator= (const Backproject& rhs);
142 };
143
144
145 class BackprojectTrig : public Backproject
146 {
147  public:
148   BackprojectTrig (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
149       : Backproject (proj, im, interpID, interpFactor)
150       {}
151
152   void BackprojectView (const double* const t, const double view_angle);
153 };
154
155
156 class BackprojectTable : public Backproject
157 {
158  public:
159   BackprojectTable (const Projections& proj, ImageFile& im, int interpID, const int interpFactor);
160   virtual ~BackprojectTable ();
161
162   virtual void BackprojectView (const double* const t, const double view_angle);
163   virtual void PostProcessing (); // call after backprojecting all views
164
165  protected:
166   Array2d<kfloat64> arrayR;
167   Array2d<kfloat64> arrayPhi;
168   kfloat64** r;
169   kfloat64** phi;
170 };
171
172
173 class BackprojectDiff : public Backproject
174 {
175  public:
176   BackprojectDiff (const Projections& proj, ImageFile& im, int interpID, const int interpFactor);
177   ~BackprojectDiff ();
178
179   virtual void BackprojectView (const double* const t, const double view_angle);
180   virtual void PostProcessing (); // call after backprojecting all views
181
182  protected:
183   double start_r;
184   double start_phi;
185   double im_xinc, im_yinc;
186 };
187
188
189 class BackprojectIntDiff : public BackprojectDiff
190 {
191  public:
192   BackprojectIntDiff (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
193     :  BackprojectDiff (proj, im, interpID, interpFactor)
194     {}
195   
196   void BackprojectView (const double* const t, const double view_angle);
197 };
198
199 class BackprojectEquilinear : public BackprojectTable
200 {
201  public:
202   BackprojectEquilinear (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
203       : BackprojectTable (proj, im, interpID, interpFactor)
204       {}
205
206   void BackprojectView (const double* const t, const double view_angle);
207
208   virtual ~BackprojectEquilinear()
209       {}
210 };
211
212 class BackprojectEquiangular : public BackprojectTable
213 {
214  public:
215   BackprojectEquiangular (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
216       : BackprojectTable (proj, im, interpID, interpFactor)
217       {}
218
219   void BackprojectView (const double* const t, const double view_angle);
220
221   virtual ~BackprojectEquiangular()
222       {}
223 };
224
225
226 #endif