STIR 6.4.0
DiscretisedDensityOnCartesianGrid.inl
Go to the documentation of this file.
1//
2//
3/*
4 Copyright (C) 2000 PARAPET partners
5 Copyright (C) 2000- 2007, Hammersmith Imanet Ltd
6 Copyright (C) 2018, University College London
7 This file is part of STIR.
8
9 SPDX-License-Identifier: Apache-2.0 AND License-ref-PARAPET-license
10
11 See STIR/LICENSE.txt for details
12*/
25#include "stir/round.h"
26
27START_NAMESPACE_STIR
28
29template <int num_dimensions, typename elemT>
31 : DiscretisedDensity<num_dimensions, elemT>(),
32 grid_spacing()
33{
34 std::fill(grid_spacing.begin(), grid_spacing.end(), 0.F);
35}
36
37template <int num_dimensions, typename elemT>
39 const IndexRange<num_dimensions>& range_v,
40 const CartesianCoordinate3D<float>& origin_v,
41 const BasicCoordinate<num_dimensions, float>& grid_spacing_v)
42 : DiscretisedDensity<num_dimensions, elemT>(range_v, origin_v),
43 grid_spacing(grid_spacing_v)
44{}
45
46template <int num_dimensions, typename elemT>
48 const shared_ptr<const ExamInfo>& exam_info_sptr,
49 const IndexRange<num_dimensions>& range_v,
50 const CartesianCoordinate3D<float>& origin_v,
52 : DiscretisedDensity<num_dimensions, elemT>(exam_info_sptr, range_v, origin_v),
53 grid_spacing(grid_spacing_v)
54{}
55
56template <int num_dimensions, typename elemT>
60 return grid_spacing;
61}
62
63template <int num_dimensions, typename elemT>
64void
66 const BasicCoordinate<num_dimensions, float>& grid_spacing_v)
67{
68 grid_spacing = grid_spacing_v;
69}
70
71template <int num_dimensions, typename elemT>
72bool
74 DiscretisedDensity<num_dimensions, elemT> const& other_of_base_type, std::string& explanation) const
75{
76 if (!base_type::actual_has_same_characteristics(other_of_base_type, explanation))
77 return false;
78
80 = dynamic_cast<DiscretisedDensityOnCartesianGrid<num_dimensions, elemT> const&>(other_of_base_type);
81
82 // we can now check on grid_spacing
83 if (norm(other.get_grid_spacing() - this->get_grid_spacing()) > 1.E-4F * norm(this->get_grid_spacing()))
84 {
85 char tmp[2000];
86 snprintf(tmp,
87 2000,
88 "Not the same grid spacing: (%g,%g,%g) and (%g,%g,%g)",
89 other.get_grid_spacing()[1],
90 num_dimensions > 1 ? other.get_grid_spacing()[2] : 0.,
91 num_dimensions > 2 ? other.get_grid_spacing()[3] : 0.,
92 this->get_grid_spacing()[1],
93 num_dimensions > 1 ? this->get_grid_spacing()[2] : 0.,
94 num_dimensions > 2 ? this->get_grid_spacing()[3] : 0.);
95 explanation = tmp;
96 return false;
97 }
98
99 return true;
100}
101
102template <int num_dimensions, typename elemT>
103CartesianCoordinate3D<float>
105 const BasicCoordinate<num_dimensions, float>& indices) const
106{
107 const BasicCoordinate<num_dimensions, float> coord = this->get_grid_spacing() * indices;
108
109 return CartesianCoordinate3D<float>(num_dimensions > 2 ? coord[num_dimensions - 2] : 0,
110 num_dimensions > 1 ? coord[num_dimensions - 1] : 0,
111 coord[num_dimensions]);
112}
113
114template <int num_dimensions, typename elemT>
117 const CartesianCoordinate3D<float>& coords) const
118{
120 // make sure that float_indices[d] = coords[d3=d+inc], with
121 // with inc such that if d=num_dimensions, d+inc=3,
122 // so inc=3-num_dimensions and hence d3=d+3-num_dimensions
123 for (int d = 1, d3 = 4 - num_dimensions; d <= num_dimensions; ++d, ++d3)
124 {
125 float_indices[d] = d3 > 0 ? coords[d3] : 0;
126 }
127 return float_indices / this->get_grid_spacing();
128}
129
130END_NAMESPACE_STIR
class BasicCoordinate<int num_dimensions, typename coordT> defines num_dimensions -dimensional coordi...
Definition BasicCoordinate.h:57
a templated class for 3-dimensional coordinates.
Definition CartesianCoordinate3D.h:53
bool actual_has_same_characteristics(DiscretisedDensity< num_dimensions, elemT > const &, std::string &explanation) const override
Implementation used by has_same_characteristics.
Definition DiscretisedDensityOnCartesianGrid.inl:73
const BasicCoordinate< num_dimensions, float > & get_grid_spacing() const
Return the grid_spacing.
Definition DiscretisedDensityOnCartesianGrid.inl:58
CartesianCoordinate3D< float > actual_get_relative_coordinates_for_indices(const BasicCoordinate< num_dimensions, float > &indices) const override
Return the relative coordinates of the centre of the basis-function corresponding to indices.
Definition DiscretisedDensityOnCartesianGrid.inl:104
DiscretisedDensityOnCartesianGrid()
Construct an empty DiscretisedDensityOnCartesianGrid.
Definition DiscretisedDensityOnCartesianGrid.inl:30
void set_grid_spacing(const BasicCoordinate< num_dimensions, float > &grid_spacing_v)
Set the grid_spacing.
Definition DiscretisedDensityOnCartesianGrid.inl:65
BasicCoordinate< num_dimensions, float > actual_get_index_coordinates_for_relative_coordinates(const CartesianCoordinate3D< float > &coords) const override
Return the indices of the basis-function closest to the given point.
Definition DiscretisedDensityOnCartesianGrid.inl:116
DiscretisedDensity()
Construct an empty DiscretisedDensity.
Definition DiscretisedDensity.inl:36
virtual bool actual_has_same_characteristics(DiscretisedDensity< num_dimensions, elemT > const &, std::string &explanation) const
Implementation used by has_same_characteristics.
Definition DiscretisedDensity.inl:71
This class defines ranges which can be 'irregular'.
Definition IndexRange.h:69
double norm(const BasicCoordinate< num_dimensions, coordT > &p1)
compute sqrt(inner_product(p1,p1))
Definition BasicCoordinate.inl:426
Declaration of the stir::round functions.