STIR 6.4.0
DiscretisedDensity.inl
Go to the documentation of this file.
1//
2//
3/*
4 Copyright (C) 2000 PARAPET partners
5 Copyright (C) 2000- 2009-07-08, Hammersmith Imanet Ltd
6 Copyright (C) 2011-07-01 - 2011, Kris Thielemans
7 Copyright (C) 2018, 2023, University College London
8 Copyright (C) 2018, CSIRO
9 This file is part of STIR.
10
11 SPDX-License-Identifier: Apache-2.0 AND License-ref-PARAPET-license
12
13 See STIR/LICENSE.txt for details
14*/
28#include "stir/round.h"
29#include <string>
30#include <typeinfo>
31#include <stdio.h> // for snprintf
32
33START_NAMESPACE_STIR
34
35template <int num_dimensions, typename elemT>
38
39template <int num_dimensions, typename elemT>
41 const CartesianCoordinate3D<float>& origin_v)
42 : base_type(range_v),
43 origin(origin_v)
44{}
45
46template <int num_dimensions, typename elemT>
47DiscretisedDensity<num_dimensions, elemT>::DiscretisedDensity(const shared_ptr<const ExamInfo>& exam_info_sptr,
48 const IndexRange<num_dimensions>& range_v,
49 const CartesianCoordinate3D<float>& origin_v)
50 : ExamData(exam_info_sptr),
51 base_type(range_v),
52 origin(origin_v)
53{}
54
55template <int num_dimensions, typename elemT>
56void
61
62template <int num_dimensions, typename elemT>
68
69template <int num_dimensions, typename elemT>
70bool
72 std::string& explanation) const
73{
74 if (typeid(other) != typeid(*this))
75 {
76 explanation = "Different type of data";
77 return false;
78 }
79
80 if (norm(other.get_origin() - this->get_origin()) > 1.E-2)
81 {
82 char tmp[2000];
83 snprintf(tmp,
84 2000,
85 "Not the same origin: (%g,%g,%g) and (%g,%g,%g)",
86 other.get_origin()[1],
87 other.get_origin()[2],
88 other.get_origin()[3],
89 this->get_origin()[1],
90 this->get_origin()[2],
91 this->get_origin()[3]);
92 explanation = tmp;
93 return false;
94 }
95 if (other.get_index_range() != this->get_index_range())
96 {
97 explanation = "Not the same index ranges.";
98 return false;
99 }
100 return true;
101}
102
103template <int num_dimensions, typename elemT>
104bool
106 std::string& explanation) const
107{
108 return this->actual_has_same_characteristics(other, explanation);
109}
110
111template <int num_dimensions, typename elemT>
112bool
113DiscretisedDensity<num_dimensions, elemT>::has_same_characteristics(DiscretisedDensity<num_dimensions, elemT> const& other) const
114{
115 std::string explanation;
116 return this->actual_has_same_characteristics(other, explanation);
117}
118
119template <int num_dimensions, typename elemT>
120bool
122{
123 return this->has_same_characteristics(that) && base_type::operator==(that);
125
126template <int num_dimensions, typename elemT>
127bool
129{
130 return !((*this) == that);
131}
133template <int num_dimensions, typename elemT>
140
141template <int num_dimensions, typename elemT>
148
149template <int num_dimensions, typename elemT>
152 const CartesianCoordinate3D<float>& coords) const
153{
154 return this->actual_get_index_coordinates_for_relative_coordinates(coords - this->get_origin());
155}
156
157template <int num_dimensions, typename elemT>
160 const CartesianCoordinate3D<float>& coords) const
161{
162 return this->actual_get_index_coordinates_for_relative_coordinates(coords);
164
165template <int num_dimensions, typename elemT>
168 const CartesianCoordinate3D<float>& coords) const
169{
170 return round(this->actual_get_index_coordinates_for_relative_coordinates(coords));
171}
172
173template <int num_dimensions, typename elemT>
177{
178 return this->get_relative_coordinates_for_indices(indices) + this->get_origin();
179}
180
181template <int num_dimensions, typename elemT>
184 const BasicCoordinate<num_dimensions, float>& indices) const
185{
186 return this->get_relative_coordinates_for_indices(indices) + this->get_origin();
187}
188
189template <int num_dimensions, typename elemT>
197template <int num_dimensions, typename elemT>
199DiscretisedDensity<num_dimensions, elemT>::swap_axes_based_on_orientation(const CartesianCoordinate3D<float>& coords,
200 const PatientPosition patient_position)
201{
202 CartesianCoordinate3D<float> flip_coords = coords;
203 // STIR coordinates run:
204 // x: left to right as you face the scanner (as seen from the bed side)
205 // y: top to bottom of the scanner
206 // z: running from deep in the scanner out along the bed (as seen from the bed
207 // side)
208 // ITK coordinates are defined w.r.t LPS
209 switch (patient_position.get_position())
210 {
211 case PatientPosition::unknown_position: // If unknown, assume HFS
212 case PatientPosition::HFS: // HFS means currently in patient LPI
213 flip_coords.z() *= -1;
214 break;
215
216 case PatientPosition::HFP: // HFP means currently in patient RAI
217 flip_coords.x() *= -1;
218 flip_coords.y() *= -1;
219 flip_coords.z() *= -1;
220 break;
221
222 case PatientPosition::FFS: // FFS means currently in patient RPS
223 flip_coords.x() *= -1;
224 break;
225
226 case PatientPosition::FFP: // FFP means currently in patient LAS
227 flip_coords.y() *= -1;
228 break;
230 default:
231 throw std::runtime_error("Unsupported patient position, can't convert to LPS.");
232 }
233 return flip_coords;
234}
235
236template <int num_dimensions, typename elemT>
239 const CartesianCoordinate3D<float>& coords) const
240{
241 return swap_axes_based_on_orientation(coords, this->get_exam_info().patient_position);
242}
243
244template <int num_dimensions, typename elemT>
251
252template <int num_dimensions, typename elemT>
259
260template <int num_dimensions, typename elemT>
268
269template <int num_dimensions, typename elemT>
277template <int num_dimensions, typename elemT>
284
285END_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
This abstract class is the basis for all image representations.
Definition DiscretisedDensity.h:99
void set_origin(const CartesianCoordinate3D< float > &origin)
Set the origin.
Definition DiscretisedDensity.inl:57
BasicCoordinate< num_dimensions, int > get_indices_closest_to_relative_coordinates(const CartesianCoordinate3D< float > &coords) const
Return the indices of the basis-function closest to the given point.
Definition DiscretisedDensity.inl:167
BasicCoordinate< num_dimensions, float > get_index_coordinates_for_LPS_coordinates(const CartesianCoordinate3D< float > &coords) const
Translation from LPS coordinates to continuous indices.
Definition DiscretisedDensity.inl:271
BasicCoordinate< num_dimensions, float > get_index_coordinates_for_physical_coordinates(const CartesianCoordinate3D< float > &coords) const
Return the indices of the basis-function closest to the given point.
Definition DiscretisedDensity.inl:151
DiscretisedDensity()
Construct an empty DiscretisedDensity.
Definition DiscretisedDensity.inl:36
CartesianCoordinate3D< float > get_LPS_coordinates_for_indices(const BasicCoordinate< num_dimensions, int > &indices) const
Translation from indices to LPS coordinates.
Definition DiscretisedDensity.inl:254
BasicCoordinate< num_dimensions, int > get_indices_closest_to_LPS_coordinates(const CartesianCoordinate3D< float > &coords) const
Translation from LPS coordinates to indices.
Definition DiscretisedDensity.inl:279
CartesianCoordinate3D< float > get_relative_coordinates_for_indices(const BasicCoordinate< num_dimensions, int > &indices) const
Return the relative coordinates of the centre of the basis-function corresponding to indices.
Definition DiscretisedDensity.inl:135
bool operator!=(const self_type &) const
negation of operator==
Definition DiscretisedDensity.inl:128
CartesianCoordinate3D< float > get_physical_coordinates_for_indices(const BasicCoordinate< num_dimensions, int > &indices) const
Return the coordinates of the centre of the basis-function corresponding to indices.
Definition DiscretisedDensity.inl:175
bool operator==(const self_type &) const
check equality (data has to be identical)
Definition DiscretisedDensity.inl:121
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
CartesianCoordinate3D< float > get_LPS_coordinates_for_physical_coordinates(const CartesianCoordinate3D< float > &indices) const
Translation from physical to LPS coordinates.
Definition DiscretisedDensity.inl:238
BasicCoordinate< num_dimensions, float > get_index_coordinates_for_relative_coordinates(const CartesianCoordinate3D< float > &coords) const
Return the index-coordinates of the basis-function closest to the given point.
Definition DiscretisedDensity.inl:159
CartesianCoordinate3D< float > get_relative_coordinates_for_indices(const BasicCoordinate< num_dimensions, float > &indices) const
Return the relative coordinates of the centre of the basis-function corresponding to the non-integer ...
Definition DiscretisedDensity.inl:143
CartesianCoordinate3D< float > get_physical_coordinates_for_LPS_coordinates(const CartesianCoordinate3D< float > &coords) const
Translation from LPS coordinates to physical coordinates.
Definition DiscretisedDensity.inl:262
const CartesianCoordinate3D< float > & get_origin() const
Return the origin.
Definition DiscretisedDensity.inl:64
bool has_same_characteristics(self_type const &, std::string &explanation) const
Checks if the 2 objects have the same type, index range, origin etc.
BasicCoordinate< num_dimensions, int > get_indices_closest_to_physical_coordinates(const CartesianCoordinate3D< float > &coords) const
Return the indices of the basis-function closest to the given point.
Definition DiscretisedDensity.inl:191
virtual CartesianCoordinate3D< float > actual_get_relative_coordinates_for_indices(const BasicCoordinate< num_dimensions, float > &indices) const =0
Implementation used by get_relative_coordinates_for_indices.
ExamData()
ExamData.
Definition ExamData.cxx:21
This class defines ranges which can be 'irregular'.
Definition IndexRange.h:69
Definition PatientPosition.h:29
@ HFS
Head First-Supine.
Definition PatientPosition.h:55
@ HFP
Head First-Prone.
Definition PatientPosition.h:56
@ FFP
Feet First-Prone.
Definition PatientPosition.h:60
@ FFS
Feet First-Supine.
Definition PatientPosition.h:59
double norm(const BasicCoordinate< num_dimensions, coordT > &p1)
compute sqrt(inner_product(p1,p1))
Definition BasicCoordinate.inl:426
int round(const float x)
Implements rounding of floating point numbers.
Definition round.inl:59
Declaration of the stir::round functions.