STIR  6.3.0
BackProjectorByBinUsingInterpolation.h
Go to the documentation of this file.
1 //
2 //
14 /*
15  Copyright (C) 2000 PARAPET partners
16  Copyright (C) 2000- 2008, Hammersmith Imanet Ltd
17  This file is part of STIR.
18 
19  SPDX-License-Identifier: Apache-2.0 AND License-ref-PARAPET-license
20 
21  See STIR/LICENSE.txt for details
22 */
23 #ifndef __BackProjectorByBinUsingInterpolation_h_
24 #define __BackProjectorByBinUsingInterpolation_h_
25 
28 #include "stir/shared_ptr.h"
29 #include "stir/ArrayFwd.h"
30 
31 START_NAMESPACE_STIR
32 
33 template <typename elemT>
34 class Viewgram;
35 template <typename elemT>
36 class RelatedViewgrams;
37 template <typename elemT>
38 class VoxelsOnCartesianGrid;
39 class ProjDataInfo;
40 class ProjDataInfoCylindricalArcCorr;
41 class DataSymmetriesForBins_PET_CartesianGrid;
58 {
59 private:
60  // store some scanner related data to avoid recomputation
61  const float R2;
62  const float dxy2;
63  const float ring_spacing2;
64  // total normalisation of backprojection, 3 factors:
65  // (_Pi/scanner.num_views) for discretisation of integral over phi
66  // scanner.ring_spacing for discretisation of integral over delta
67  // normalisation of projection space integral: 1/(2 Pi)
68 
69  const float backprojection_normalisation;
70 
71  const bool use_exact_Jacobian_now;
72 
73 public:
74  explicit JacobianForIntBP(const shared_ptr<const ProjDataInfoCylindricalArcCorr> proj_data_info_sptr, bool exact);
75 
76  float operator()(const float delta, const float s) const
77  {
78  float tmp;
79  if (use_exact_Jacobian_now)
80  tmp = 4 * (R2 - dxy2 * s * s);
81  else
82  tmp = 4 * R2;
83  return tmp / pow(tmp + ring_spacing2 * delta * delta, 1.5F) * backprojection_normalisation;
84  }
85 };
86 
126  : public RegisteredParsingObject<BackProjectorByBinUsingInterpolation, BackProjectorByBin>
127 
128 {
129 public:
131  static const char* const registered_name;
132 
134  explicit BackProjectorByBinUsingInterpolation(const bool use_piecewise_linear_interpolation = true,
135  const bool use_exact_Jacobian = true);
136 
138 
139  BackProjectorByBinUsingInterpolation(shared_ptr<const ProjDataInfo> const&,
140  shared_ptr<const DiscretisedDensity<3, float>> const& image_info_ptr,
141  const bool use_piecewise_linear_interpolation = true,
142  const bool use_exact_Jacobian = true);
143 
145 
147  void set_up(const shared_ptr<const ProjDataInfo>& proj_data_info_ptr,
148  const shared_ptr<const DiscretisedDensity<3, float>>& density_info_ptr // TODO should be Info only
149  ) override;
150 
158  const DataSymmetriesForViewSegmentNumbers* get_symmetries_used() const override;
163  void use_exact_Jacobian(const bool use_exact_Jacobian);
164 
169  void use_piecewise_linear_interpolation(const bool use_piecewise_linear_interpolation);
170 
171  BackProjectorByBinUsingInterpolation* clone() const override;
172 
173 private:
174  // KT 20/06/2001 changed type to enable use of more methods
175  shared_ptr<DataSymmetriesForBins_PET_CartesianGrid> symmetries_ptr;
176  // const DataSymmetriesForViewSegmentNumbers * symmetries_ptr;
177 
178  bool use_piecewise_linear_interpolation_now;
179 
180  bool use_exact_Jacobian_now;
181 
183 
185  bool do_symmetry_90degrees_min_phi;
186  bool do_symmetry_180degrees_min_phi;
187  bool do_symmetry_swap_segment;
188  bool do_symmetry_swap_s;
189  bool do_symmetry_shift_z;
191 
192 #if 0
193  // not used yet
194 struct ProjDataForIntBP
195 {
196  float view__pos_s;
197  float view__pos_sp1;
198  float view__neg_s;
199  float view__neg_sp1;
200  float min90__pos_s;
201  float min90__pos_sp1;
202  float min90__neg_s;
203  float min90__neg_sp1;
204  float plus90__pos_s;
205  float plus90__pos_sp1;
206  float plus90__neg_s;
207  float plus90__neg_sp1;
208  float min180__pos_s;
209  float min180__pos_sp1;
210  float min180__neg_s;
211  float min180__neg_sp1;
212 };
213 #endif
214 
215  void actual_back_project(DiscretisedDensity<3, float>&,
217  const int min_axial_pos_num,
218  const int max_axial_pos_num,
219  const int min_tangential_pos_num,
220  const int max_tangential_pos_num) override;
221 
222  void actual_back_project(DiscretisedDensity<3, float>&, const Bin&);
223 
224  virtual void back_project_all_symmetries(VoxelsOnCartesianGrid<float>& image,
225  const Viewgram<float>& pos_view,
226  const Viewgram<float>& neg_view,
227  const Viewgram<float>& pos_plus90,
228  const Viewgram<float>& neg_plus90,
229  const Viewgram<float>& pos_min180,
230  const Viewgram<float>& neg_min180,
231  const Viewgram<float>& pos_min90,
232  const Viewgram<float>& neg_min90,
233  const int min_axial_pos_num,
234  const int max_axial_pos_num,
235  const int min_tangential_pos_num,
236  const int max_tangential_pos_num);
237 
238  /*
239  This function projects 4 viewgrams related by symmetry.
240  It will be used for view=0 or 45 degrees
241  (or all others if the above version is not implemented in
242  the derived class)
243  Here 0<=view < num_views/2 (= 90 degrees)
244  */
245 
246  virtual void back_project_view_plus_90_and_delta(VoxelsOnCartesianGrid<float>& image,
247  const Viewgram<float>& pos_view,
248  const Viewgram<float>& neg_view,
249  const Viewgram<float>& pos_plus90,
250  const Viewgram<float>& neg_plus90,
251  const int min_axial_pos_num,
252  const int max_axial_pos_num,
253  const int min_tangential_pos_num,
254  const int max_tangential_pos_num);
255  /*
256  void back_project_2D_view_plus_90(const PETSinogram<float> &sino, PETPlane &image, int view,
257  const int min_bin_num, const intmax_tangential_pos_num);
258  void back_project_2D_all_symmetries(const PETSinogram<float> &sino, PETPlane &image, int view,
259  const int min_bin_num, const intmax_tangential_pos_num);
260 */
261 
262  /*
263 
264  These functions use a 3D version of Cho's algorithm for backprojecting incrementally.
265  See M. Egger's thesis for details.
266  In addition to the symmetries mentioned above, they also use s,-s symmetry
267  (while being careful when s=0 to avoid self-symmetric cases)
268  */
269 
270  static void piecewise_linear_interpolation_backproj3D_Cho_view_viewplus90(
271  Array<4, float> const& Projptr,
273  const shared_ptr<const ProjDataInfoCylindricalArcCorr> proj_data_info_sptr,
274  float delta,
275  const double cphi,
276  const double sphi,
277  int s,
278  int ax_pos0,
279  const int num_planes_per_axial_pos,
280  const float axial_pos_to_z_offset);
281 
282  static void piecewise_linear_interpolation_backproj3D_Cho_view_viewplus90_180minview_90minview(
283  Array<4, float> const& Projptr,
285  const shared_ptr<const ProjDataInfoCylindricalArcCorr> proj_data_info_sptr,
286  float delta,
287  const double cphi,
288  const double sphi,
289  int s,
290  int ax_pos0,
291  const int num_planes_per_axial_pos,
292  const float axial_pos_to_z_offset);
293 
294  static void
295  linear_interpolation_backproj3D_Cho_view_viewplus90(Array<4, float> const& Projptr,
297  const shared_ptr<const ProjDataInfoCylindricalArcCorr> proj_data_info_sptr,
298  float delta,
299  const double cphi,
300  const double sphi,
301  int s,
302  int ax_pos0,
303  const int num_planes_per_axial_pos,
304  const float axial_pos_to_z_offset);
305 
306  static void linear_interpolation_backproj3D_Cho_view_viewplus90_180minview_90minview(
307  Array<4, float> const& Projptr,
309  const shared_ptr<const ProjDataInfoCylindricalArcCorr> proj_data_info_sptr,
310  float delta,
311  const double cphi,
312  const double sphi,
313  int s,
314  int ax_pos0,
315  const int num_planes_per_axial_pos,
316  const float axial_pos_to_z_offset);
317 
318  /*
319 static void backproj2D_Cho_view_viewplus90( PETPlane & image,
320  const ProjDataForIntBP &projs,
321  const double cphi, const double sphi, int s);
322 
323  static void backproj2D_Cho_view_viewplus90_180minview_90minview( PETPlane & image,
324  const ProjDataForIntBP &projs,
325  const double cphi, const double sphi, int s);
326 
327 */
328  void set_defaults() override;
329  void initialise_keymap() override;
330 };
331 
332 END_NAMESPACE_STIR
333 
334 #endif // __BackProjectorByBinUsingInterpolation_h_
This class is used to represent voxelised densities on a cuboid grid (3D).
Definition: FBP3DRPReconstruction.h:43
forward declaration of stir::Array class for multi-dimensional (numeric) arrays
Import of std::shared_ptr, std::dynamic_pointer_cast and std::static_pointer_cast into the stir names...
does backprojection by interpolating between the bins.
Definition: BackProjectorByBinUsingInterpolation.h:125
A class for encoding/finding symmetries. Works only on ViewSegmentNumbers (instead of Bin)...
Definition: DataSymmetriesForViewSegmentNumbers.h:49
The next class is used in BackProjectorByBinUsingInterpolation to take geometric things into account...
Definition: BackProjectorByBinUsingInterpolation.h:57
A class for storing coordinates and value of a single projection bin.
Definition: Bin.h:48
Parent class for all leaves in a RegisteredObject hierarchy that do parsing of parameter files...
Definition: RegisteredParsingObject.h:77
static const char *const registered_name
Name which will be used when parsing a BackProjectorByBin object.
Definition: BackProjectorByBinUsingInterpolation.h:131
Declares class stir::BackProjectorByBin.
Declaration of class stir::RegisteredParsingObject.