CTL  0.6.1
Computed Tomography Library
projectiondata.h
Go to the documentation of this file.
1 #ifndef CTL_PROJECTIONDATA_H
2 #define CTL_PROJECTIONDATA_H
3 
4 #include "singleviewdata.h"
5 
6 namespace CTL {
7 
20 {
21 private:
22  template<class DataType, class NestedIteratorType>
24 
25 public:
26  struct Dimensions;
29  typedef std::reverse_iterator<iterator> reverse_iterator;
30  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
31 
33  ProjectionData(uint channelsPerModule, uint rowsPerModule, uint nbModules);
34  ProjectionData(const SingleViewData& singleViewData);
35  ProjectionData(SingleViewData&& singleViewData);
36 
37  // factories
38  static ProjectionData dummy();
39 
40  // pixel iterators
41  iterator begin();
42  iterator end();
43  const_iterator begin() const;
44  const_iterator end() const;
45  const_iterator cbegin() const;
46  const_iterator cend() const;
47  reverse_iterator rbegin();
48  reverse_iterator rend();
49  const_reverse_iterator rbegin() const;
50  const_reverse_iterator rend() const;
51  const_reverse_iterator crbegin() const;
52  const_reverse_iterator crend() const;
53 
54  // getter methods
55  const std::vector<SingleViewData>& constData() const;
56  const std::vector<SingleViewData>& data() const;
57  std::vector<SingleViewData>& data();
58  Dimensions dimensions() const;
59  const SingleViewData& first() const;
61  uint nbViews() const;
63  const SingleViewData& view(uint i) const;
65 
66  // other methods
68  void allocateMemory(uint nbViews, float initValue);
69  void append(SingleViewData&& singleView);
70  void append(const SingleViewData& singleView);
71  ProjectionData combined(const ModuleLayout& layout = ModuleLayout()) const;
72  void fill(float fillValue);
73  void freeMemory();
74  float max() const;
75  float min() const;
76  void setDataFromVector(const std::vector<float>& dataVector);
77  ProjectionData split(const ModuleLayout& layout) const;
78  std::vector<float> toVector() const;
79  void transformToExtinction(double i0 = 1.0);
80  void transformToExtinction(const std::vector<double>& viewDependentI0);
81  void transformToIntensity(double i0 = 1.0);
82  void transformToIntensity(const std::vector<double>& viewDependentI0);
83  void transformToCounts(double n0 = 1.0);
84  void transformToCounts(const std::vector<double>& viewDependentN0);
85 
86  bool operator==(const ProjectionData& other) const;
87  bool operator!=(const ProjectionData& other) const;
88 
89  // arithmetic operations
91  ProjectionData& operator-=(const ProjectionData& other);
92  ProjectionData& operator*=(float factor);
93  ProjectionData& operator/=(float divisor);
94 
95  ProjectionData operator+(const ProjectionData& other) const;
96  ProjectionData operator-(const ProjectionData& other) const;
97  ProjectionData operator*(float factor) const;
98  ProjectionData operator/(float divisor) const;
99 
100 protected:
102 
103  std::vector<SingleViewData> _data;
104 
105 private:
106  bool hasEqualSizeAs(const SingleViewData& other) const;
107  template <class Function>
108  void parallelExecution(const Function& f) const;
109 };
110 
119 {
124 
125  Dimensions() = default;
128  , nbRows(nbRows)
130  , nbViews(nbViews) {}
132  : nbChannels(viewDim.nbChannels)
133  , nbRows(viewDim.nbRows)
134  , nbModules(viewDim.nbModules)
135  , nbViews(nbViews) {}
136 
137  bool operator==(const Dimensions& other) const;
138  bool operator!=(const Dimensions& other) const;
139 
140  std::string info() const;
141  size_t totalNbElements() const;
142 };
143 
144 // pixel iterator
145 template<class DataType, class NestedIteratorType>
146 class ProjectionData::PixelIterator
147 {
148 public:
149  using iterator_category = std::bidirectional_iterator_tag;
150  using value_type = typename NestedIteratorType::value_type;
151  using difference_type = std::ptrdiff_t;
152  using pointer = typename NestedIteratorType::pointer;
153  using reference = typename NestedIteratorType::reference;
154 
155  PixelIterator(DataType* projData = nullptr, uint view = 0, uint module = 0, uint pixel = 0);
156 
157  friend bool operator==(const PixelIterator& left, const PixelIterator& right)
158  { return left._viewIterator == right._viewIterator; }
159  friend bool operator!=(const PixelIterator& left, const PixelIterator& right)
160  { return left._viewIterator != right._viewIterator; }
161 
162  PixelIterator& operator++();
163  PixelIterator operator++(int);
164  PixelIterator& operator--();
165  PixelIterator operator--(int);
166 
167  reference operator*() { return *_viewIterator; }
168  const reference operator*() const { return *_viewIterator; }
169  pointer operator->() { return _viewIterator.operator->(); }
170 
171  template<class DataType2, class NestedIteratorType2>
172  operator PixelIterator<DataType2, NestedIteratorType2>() const;
173 
174  uint module() const;
175  uint view() const;
176 
177 private:
178  DataType* _dataPtr;
179  NestedIteratorType _viewIterator;
180 
181  uint _curViewIdx{0};
182 
183  void nextView();
184  void prevView();
185 };
186 
187 template<class DataType, class NestedIteratorType>
188 ProjectionData::PixelIterator<DataType, NestedIteratorType>::PixelIterator(DataType* projData,
189  uint view,
190  uint module,
191  uint pixel)
192  : _dataPtr(projData)
193  , _curViewIdx(view)
194 {
195  _dataPtr = projData;
196 
197  if(_dataPtr)
198  _viewIterator = NestedIteratorType(&_dataPtr->view(view), module, pixel);
199 }
200 
201 template<class DataType, class NestedIteratorType>
202 ProjectionData::PixelIterator<DataType, NestedIteratorType>&
203 ProjectionData::PixelIterator<DataType, NestedIteratorType>::operator++()
204 {
205  ++_viewIterator;
206  if(_viewIterator == _dataPtr->view(_curViewIdx).end())
207  nextView();
208 
209  return (*this);
210 }
211 
212 template<class DataType, class NestedIteratorType>
213 ProjectionData::PixelIterator<DataType, NestedIteratorType>
214 ProjectionData::PixelIterator<DataType, NestedIteratorType>::operator++(int)
215 {
216  auto temp(*this);
217  ++(*this);
218  return temp;
219 }
220 
221 template<class DataType, class NestedIteratorType>
222 ProjectionData::PixelIterator<DataType, NestedIteratorType>&
223 ProjectionData::PixelIterator<DataType, NestedIteratorType>::operator--()
224 {
225  if(_viewIterator == _dataPtr->view(_curViewIdx).begin())
226  prevView();
227 
228  --_viewIterator;
229 
230  return (*this);
231 }
232 
233 template<class DataType, class NestedIteratorType>
234 ProjectionData::PixelIterator<DataType, NestedIteratorType>
235 ProjectionData::PixelIterator<DataType, NestedIteratorType>::operator--(int)
236 {
237  auto temp(*this);
238  --(*this);
239  return temp;
240 }
241 
242 template<class DataType, class NestedIteratorType>
243 uint ProjectionData::PixelIterator<DataType, NestedIteratorType>::module() const
244 {
245  return _viewIterator.module();
246 }
247 
248 template<class DataType, class NestedIteratorType>
249 uint ProjectionData::PixelIterator<DataType, NestedIteratorType>::view() const
250 {
251  return _curViewIdx;
252 }
253 
254 template<class DataType, class NestedIteratorType>
255 void ProjectionData::PixelIterator<DataType, NestedIteratorType>::nextView()
256 {
257  ++_curViewIdx;
258 
259  if(_curViewIdx < _dataPtr->nbViews())
260  _viewIterator = NestedIteratorType(&_dataPtr->view(_curViewIdx), 0, 0);
261  else
262  --_curViewIdx;
263 }
264 
265 template<class DataType, class NestedIteratorType>
266 void ProjectionData::PixelIterator<DataType, NestedIteratorType>::prevView()
267 {
268  --_curViewIdx;
269 
270  if(_curViewIdx >= 0)
271  _viewIterator = _dataPtr->view(_curViewIdx).end();
272  else
273  ++_curViewIdx;
274 }
275 
276 } // namespace CTL
277 
280 #endif // CTL_PROJECTIONDATA_H
Simple class that holds the layout of a multi module detector.
Definition: modulelayout.h:32
uint nbChannels
Number of channels in each module.
Definition: projectiondata.h:120
SingleViewData::Dimensions viewDimensions() const
Definition: projectiondata.cpp:761
std::vector< float > toVector() const
Definition: projectiondata.cpp:341
uint nbModules
Number of modules.
Definition: projectiondata.h:122
uint nbViews
Number of views.
Definition: projectiondata.h:123
bool hasEqualSizeAs(const SingleViewData &other) const
Definition: projectiondata.cpp:503
const std::vector< SingleViewData > & constData() const
Definition: projectiondata.cpp:696
void fill(float fillValue)
Definition: projectiondata.cpp:323
void transformToExtinction(double i0=1.0)
Definition: projectiondata.cpp:370
ProjectionData combined(const ModuleLayout &layout=ModuleLayout()) const
Definition: projectiondata.cpp:301
Definition: projectiondata.h:23
ProjectionData & operator+=(const ProjectionData &other)
Definition: projectiondata.cpp:544
uint nbRows
Number of rows in each module.
Definition: projectiondata.h:121
SingleViewData::Dimensions _viewDim
The dimensions of the individual single views.
Definition: projectiondata.h:101
ProjectionData split(const ModuleLayout &layout) const
Splits the projection data from a single module dataset into different modules according to the detec...
Definition: projectiondata.cpp:273
void parallelExecution(const Function &f) const
Definition: projectiondata.cpp:770
ProjectionData operator/(float divisor) const
Definition: projectiondata.cpp:650
ProjectionData operator *(float factor) const
Definition: projectiondata.cpp:639
The ProjectionData class is the container class used to store all projections from all views.
Definition: projectiondata.h:19
ProjectionData operator+(const ProjectionData &other) const
Definition: projectiondata.cpp:616
ProjectionData & operator *=(float factor)
Definition: projectiondata.cpp:592
float max() const
Definition: projectiondata.cpp:181
std::string info() const
Definition: projectiondata.cpp:679
void append(SingleViewData &&singleView)
Definition: projectiondata.cpp:151
size_t totalNbElements() const
Definition: projectiondata.cpp:688
Struct that holds the dimensions of a ProjectionData object.
Definition: projectiondata.h:118
const SingleViewData & first() const
Definition: projectiondata.cpp:721
void freeMemory()
Definition: projectiondata.cpp:332
float min() const
Definition: projectiondata.cpp:204
uint nbViews() const
Definition: projectiondata.cpp:737
bool operator!=(const Dimensions &other) const
Definition: projectiondata.cpp:670
ProjectionData & operator/=(float divisor)
Definition: projectiondata.cpp:604
Struct that holds the dimensions, namely number of channels, rows and modules, of a SingleViewData ob...
Definition: singleviewdata.h:114
Dimensions dimensions() const
Definition: projectiondata.cpp:713
unsigned int uint
Qt style alias for unsigned int.
Definition: modulelayout.h:6
void transformToCounts(double n0=1.0)
Definition: projectiondata.cpp:427
const std::vector< SingleViewData > & data() const
Definition: projectiondata.cpp:701
bool operator==(const Dimensions &other) const
Definition: projectiondata.cpp:661
void setDataFromVector(const std::vector< float > &dataVector)
Definition: projectiondata.cpp:230
ProjectionData(const SingleViewData::Dimensions &viewDimensions)
Definition: projectiondata.cpp:11
void transformToIntensity(double i0=1.0)
Definition: projectiondata.cpp:414
SingleViewData & view(uint i)
Definition: projectiondata.cpp:742
void allocateMemory(uint nbViews)
Definition: projectiondata.cpp:518
static ProjectionData dummy()
Constructs a ProjectionData object with dimensions (0, 0, 0).
Definition: projectiondata.cpp:76
std::vector< SingleViewData > _data
The internal data storage vector.
Definition: projectiondata.h:103
The SingleViewData class is the container class used to store all projections from one particular vie...
Definition: singleviewdata.h:19