STIR  6.3.0
DiscretisedDensity.h
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, University College London
8  Copyright (C) 2018, Commonwealth Scientific and Industrial Research Organisation
9  Australian eHealth Research Centre
10  This file is part of STIR.
11 
12  SPDX-License-Identifier: Apache-2.0 AND License-ref-PARAPET-license
13 
14  See STIR/LICENSE.txt for details
15 */
16 #ifndef __stir_DiscretisedDensity_H__
17 #define __stir_DiscretisedDensity_H__
18 
32 #include "stir/Array.h"
33 #include "stir/ExamData.h"
34 #include "stir/shared_ptr.h"
35 #include <string>
36 
37 START_NAMESPACE_STIR
38 
39 #ifdef SWIG
40 // SWIG doesn't seem to understand how we define ArrayType (with `using`).
41 // Do a HORRIBLE work-around for now. It will fail whenever we change ArrayType of course.
42 // TODO
43 # define ArrayType Array
44 #endif
45 
97 template <int num_dimensions, typename elemT>
98 class DiscretisedDensity : public ExamData, public ArrayType<num_dimensions, elemT>
99 {
100 #ifdef STIR_COMPILING_SWIG_WRAPPER
101  // work-around swig problem. It gets confused when using a private (or protected)
102  // typedef in a definition of a public typedef/member
103 public:
104 #endif
105  typedef ArrayType<num_dimensions, elemT> base_type;
106  typedef DiscretisedDensity<num_dimensions, elemT> self_type;
107 
108 public:
110 
116 
118  static DiscretisedDensity* read_from_file(const std::string& filename);
119 
121  inline DiscretisedDensity();
122 
125 
127  inline DiscretisedDensity(const shared_ptr<const ExamInfo>& exam_info_sptr,
128  const IndexRange<num_dimensions>& range,
129  const CartesianCoordinate3D<float>& origin);
130 
132  inline const CartesianCoordinate3D<float>& get_origin() const;
133 
135  inline void set_origin(const CartesianCoordinate3D<float>& origin);
136 
138 
154 
156 
163  get_physical_coordinates_for_indices(const BasicCoordinate<num_dimensions, int>& indices) const;
164 
167 
170  get_physical_coordinates_for_indices(const BasicCoordinate<num_dimensions, float>& indices) const;
171 
173 
176  get_relative_coordinates_for_indices(const BasicCoordinate<num_dimensions, int>& indices) const;
177 
180 
186  get_relative_coordinates_for_indices(const BasicCoordinate<num_dimensions, float>& indices) const;
187 
189 
196  get_indices_closest_to_physical_coordinates(const CartesianCoordinate3D<float>& coords) const;
197 
199 
204  get_indices_closest_to_relative_coordinates(const CartesianCoordinate3D<float>& coords) const;
205 
207 
211  get_index_coordinates_for_physical_coordinates(const CartesianCoordinate3D<float>& coords) const;
212 
214 
218  get_index_coordinates_for_relative_coordinates(const CartesianCoordinate3D<float>& coords) const;
219 
222  get_index_coordinates_for_LPS_coordinates(const CartesianCoordinate3D<float>& coords) const;
223 
226  get_LPS_coordinates_for_physical_coordinates(const CartesianCoordinate3D<float>& indices) const;
227 
229  inline CartesianCoordinate3D<float> get_LPS_coordinates_for_indices(const BasicCoordinate<num_dimensions, int>& indices) const;
230 
233  get_LPS_coordinates_for_indices(const BasicCoordinate<num_dimensions, float>& indices) const;
234 
237  get_physical_coordinates_for_LPS_coordinates(const CartesianCoordinate3D<float>& coords) const;
238 
241  get_indices_closest_to_LPS_coordinates(const CartesianCoordinate3D<float>& coords) const;
242 
244 
246  virtual DiscretisedDensity<num_dimensions, elemT>* get_empty_copy() const = 0;
247 
249  virtual DiscretisedDensity<num_dimensions, elemT>* clone() const = 0;
250 
252  //*! \deprecated Use get_empty_copy() instead
254  {
255  return get_empty_copy();
256  }
257 
259 
260 
264  inline bool has_same_characteristics(self_type const&, std::string& explanation) const;
265 
267 
269  inline bool has_same_characteristics(self_type const&) const;
270 
272 
276  inline bool operator==(const self_type&) const;
277 
279  inline bool operator!=(const self_type&) const;
281 
282 protected:
284 
292  virtual bool actual_has_same_characteristics(DiscretisedDensity<num_dimensions, elemT> const&, std::string& explanation) const;
293 
295 
301  actual_get_relative_coordinates_for_indices(const BasicCoordinate<num_dimensions, float>& indices) const = 0;
302 
304  actual_get_index_coordinates_for_relative_coordinates(const CartesianCoordinate3D<float>& coords) const = 0;
305 
306 private:
308 
309  static inline CartesianCoordinate3D<float> swap_axes_based_on_orientation(const CartesianCoordinate3D<float>& coordinates,
310  const PatientPosition patient_position);
311 };
312 
313 #ifdef SWIG
314 // Undo HORRIBLE work-around.
315 // TODO
316 # undef ArrayType
317 #endif
318 
319 END_NAMESPACE_STIR
320 
322 #endif
Definition: PatientPosition.h:28
This class defines ranges which can be &#39;irregular&#39;.
Definition: ArrayFunctionObject.h:31
inline implementation for stir::DiscretisedDensity
declaration of stir::ExamData
Import of std::shared_ptr, std::dynamic_pointer_cast and std::static_pointer_cast into the stir names...
defines the stir::Array class for multi-dimensional (numeric) arrays
unique_ptr< DataT > read_from_file(const FileSignature &signature, FileT file)
Function that reads data from file using the default InputFileFormatRegistry, using the provided File...
Definition: read_from_file.h:46
DiscretisedDensity< num_dimensions, elemT > * get_empty_discretised_density() const
Allocate a new DiscretisedDensity object with same characteristics as the current one...
Definition: DiscretisedDensity.h:253
defines the stir::CartesianCoordinate3D<coordT> class
Array< num_dimensions, elemT > ArrayType
type alias for future-proofing for "large" rectangular arrays
Definition: ArrayFwd.h:25
DiscretisedDensity< num_dimensions, elemT > hierarchy_base_type
A typedef that can be used what the base of the hierarchy is.
Definition: DiscretisedDensity.h:115
This abstract class is the basis for all image representations.
Definition: DDSR2DReconstruction.h:44