STIR 6.4.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
31START_NAMESPACE_STIR
32
33template <typename elemT>
34class Viewgram;
35template <typename elemT>
36class RelatedViewgrams;
37template <typename elemT>
38class VoxelsOnCartesianGrid;
39class ProjDataInfo;
40class ProjDataInfoCylindricalArcCorr;
41class DataSymmetriesForBins_PET_CartesianGrid;
56
57class JacobianForIntBP
58{
59private:
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
73public:
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{
129public:
131 static const char* const registered_name;
132
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
163 void use_exact_Jacobian(const bool use_exact_Jacobian);
164
170
171 BackProjectorByBinUsingInterpolation* clone() const override;
172
173private:
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
194struct 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 /*
319static 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
332END_NAMESPACE_STIR
333
334#endif // __BackProjectorByBinUsingInterpolation_h_
forward declaration of stir::Array class for multi-dimensional (numeric) arrays
Declares class stir::BackProjectorByBin.
Declaration of class stir::RegisteredParsingObject.
This class defines multi-dimensional (numeric) arrays.
Definition Array.h:78
const DataSymmetriesForViewSegmentNumbers * get_symmetries_used() const override
Gets the symmetries used by this backprojector.
Definition BackProjectorByBinUsingInterpolation.cxx:90
void set_up(const shared_ptr< const ProjDataInfo > &proj_data_info_ptr, const shared_ptr< const DiscretisedDensity< 3, float > > &density_info_ptr) override
Stores all necessary geometric info.
Definition BackProjectorByBinUsingInterpolation.cxx:118
void use_piecewise_linear_interpolation(const bool use_piecewise_linear_interpolation)
Use this to switch between ordinary linear interpolation and piece-wise linear interpolation in the a...
Definition BackProjectorByBinUsingInterpolation.cxx:179
void use_exact_Jacobian(const bool use_exact_Jacobian)
Use this to switch between the exact Jacobian and an approximate Jacobian (valid for s << R).
Definition BackProjectorByBinUsingInterpolation.cxx:167
static const char *const registered_name
Name which will be used when parsing a BackProjectorByBin object.
Definition BackProjectorByBinUsingInterpolation.h:131
BackProjectorByBinUsingInterpolation(const bool use_piecewise_linear_interpolation=true, const bool use_exact_Jacobian=true)
The constructor defaults to using piecewise linear interpolation and the exact Jacobian.
Definition BackProjectorByBinUsingInterpolation.cxx:97
A class for storing coordinates and value of a single projection bin.
Definition Bin.h:49
A class for encoding/finding symmetries. Works only on ViewSegmentNumbers (instead of Bin).
Definition DataSymmetriesForViewSegmentNumbers.h:50
This abstract class is the basis for all image representations.
Definition DiscretisedDensity.h:99
Parent class for all leaves in a RegisteredObject hierarchy that do parsing of parameter files.
Definition RegisteredParsingObject.h:78
A class for storing viewgrams which are related by symmetry.
Definition RelatedViewgrams.h:41
A class for 2d projection data.
Definition Viewgram.h:49
This class is used to represent voxelised densities on a cuboid grid (3D).
Definition VoxelsOnCartesianGrid.h:46
Import of std::shared_ptr, std::dynamic_pointer_cast and std::static_pointer_cast into the stir names...