CTL  0.6.1
Computed Tomography Library
singleviewdata.h
Go to the documentation of this file.
1 #ifndef CTL_SINGLEVIEWDATA_H
2 #define CTL_SINGLEVIEWDATA_H
3 
4 #include "chunk2d.h"
5 #include "modulelayout.h"
6 
7 namespace CTL {
8 
20 {
21 private:
22  template<class DataType, class NestedIteratorType>
24 
25 public:
26  typedef Chunk2D<float> ModuleData;
27  struct Dimensions;
28 
31  using reverse_iterator = std::reverse_iterator<iterator>;
32  using const_reverse_iterator = std::reverse_iterator<const_iterator>;
33 
34  // ctors
35  explicit SingleViewData(const ModuleData::Dimensions& moduleDimensions);
36  SingleViewData(uint channelsPerModule, uint rowsPerModule);
37  SingleViewData(const ModuleData& moduleData);
38  SingleViewData(ModuleData&& moduleData);
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<ModuleData>& constData() const;
56  const std::vector<ModuleData>& data() const;
57  std::vector<ModuleData>& data();
58  Dimensions dimensions() const;
59  uint elementsPerModule() const;
60  const ModuleData& first() const;
61  ModuleData& first();
63  const ModuleData& module(uint i) const;
64  uint nbModules() const;
65  size_t totalPixelCount() const;
66 
67  // other methods
69  void allocateMemory(uint nbModules, float initValue);
70  void append(ModuleData&& moduleData);
71  void append(const ModuleData& moduleData);
72  void append(std::vector<float>&& dataVector);
73  void append(const std::vector<float>& dataVector);
74  Chunk2D<float> combined(const ModuleLayout& layout = ModuleLayout(), bool* ok = nullptr) const;
75  void fill(float fillValue);
76  void freeMemory();
77  float max() const;
78  float min() const;
79  void setDataFromVector(const std::vector<float>& dataVector);
80  SingleViewData split(const ModuleLayout& layout) const;
81  std::vector<float> toVector() const;
82  void transformToExtinction(double i0orN0 = 1.0);
83  void transformToIntensity(double i0 = 1.0);
84  void transformToCounts(double n0 = 1.0);
85 
86  bool operator==(const SingleViewData& other) const;
87  bool operator!=(const SingleViewData& other) const;
88 
90  SingleViewData& operator-=(const SingleViewData& other);
91  SingleViewData& operator*=(float factor);
92  SingleViewData& operator/=(float divisor);
93 
94  SingleViewData operator+(const SingleViewData& other) const;
95  SingleViewData operator-(const SingleViewData& other) const;
96  SingleViewData operator*(float factor) const;
97  SingleViewData operator/(float divisor) const;
98 
99 protected:
100  ModuleData::Dimensions _moduleDim;
101 
102  std::vector<ModuleData> _data;
103 
104 private:
105  bool hasEqualSizeAs(const ModuleData& other) const;
106  bool hasEqualSizeAs(const std::vector<float>& other) const;
107 };
108 
115 {
119 
120  bool operator==(const Dimensions& other) const;
121  bool operator!=(const Dimensions& other) const;
122 
123  std::string info() const;
124  size_t totalNbElements() const;
125 };
126 
127 template<class DataType, class NestedIteratorType>
129 {
130 public:
131  using iterator_category = std::bidirectional_iterator_tag;
132  using value_type = typename NestedIteratorType::value_type;
133  using difference_type = std::ptrdiff_t;
134  using pointer = typename NestedIteratorType::pointer;
135  using reference = typename NestedIteratorType::reference;
136 
137  PixelIterator(DataType* viewData = nullptr, uint module = 0, uint pixel = 0);
138 
139  friend bool operator==(const PixelIterator& left, const PixelIterator& right)
140  { return left._moduleIterator == right._moduleIterator; }
141  friend bool operator!=(const PixelIterator& left, const PixelIterator& right)
142  { return left._moduleIterator != right._moduleIterator; }
143 
144  PixelIterator& operator++();
145  PixelIterator operator++(int);
146  PixelIterator& operator--();
147  PixelIterator operator--(int);
148 
149  reference operator*() {return *_moduleIterator;}
150  const reference operator*() const {return *_moduleIterator;}
151  pointer operator->() {return _moduleIterator.operator->();}
152 
153  template<class DataType2, class NestedIteratorType2>
154  operator PixelIterator<DataType2, NestedIteratorType2>() const;
155 
156  uint module() const;
157  uint pixel() const;
158 
159 private:
160  DataType* _dataPtr;
161  NestedIteratorType _moduleIterator;
162 
163  uint _curModule{0};
164 
165  void nextModule();
166  void prevModule();
167 };
168 
169 template<class DataType, class NestedIteratorType>
170 SingleViewData::PixelIterator<DataType, NestedIteratorType>::PixelIterator(DataType* viewData,
171  uint module,
172  uint pixel)
173  : _dataPtr(viewData)
174  , _curModule(module)
175 {
176  _dataPtr = viewData;
177 
178  if(_dataPtr)
179  _moduleIterator = std::next(_dataPtr->module(module).begin(), pixel);
180 }
181 
182 template<class DataType, class NestedIteratorType>
183 SingleViewData::PixelIterator<DataType, NestedIteratorType>&
184 SingleViewData::PixelIterator<DataType, NestedIteratorType>::operator++()
185 {
186  ++_moduleIterator;
187  if(_moduleIterator == _dataPtr->module(_curModule).end())
188  nextModule();
189 
190  return (*this);
191 }
192 
193 template<class DataType, class NestedIteratorType>
194 SingleViewData::PixelIterator<DataType, NestedIteratorType>
195 SingleViewData::PixelIterator<DataType, NestedIteratorType>::operator++(int)
196 {
197  auto temp(*this);
198  ++(*this);
199  return temp;
200 }
201 
202 template<class DataType, class NestedIteratorType>
204 SingleViewData::PixelIterator<DataType, NestedIteratorType>::operator--()
205 {
206  if(_moduleIterator == _dataPtr->module(_curModule).begin())
207  prevModule();
208 
209  --_moduleIterator;
210 
211  return (*this);
212 }
213 
214 template<class DataType, class NestedIteratorType>
216 SingleViewData::PixelIterator<DataType, NestedIteratorType>::operator--(int)
217 {
218  auto temp(*this);
219  --(*this);
220  return temp;
221 }
222 
223 template<class DataType, class NestedIteratorType>
224 uint SingleViewData::PixelIterator<DataType, NestedIteratorType>::module() const
225 {
226  return _curModule;
227 }
228 
229 template<class DataType, class NestedIteratorType>
230 uint SingleViewData::PixelIterator<DataType, NestedIteratorType>::pixel() const
231 {
232  return std::distance(_dataPtr->module(_curModule).cbegin(),
233  ModuleData::const_iterator{ _moduleIterator });
234 }
235 
236 template<class DataType, class NestedIteratorType>
237 void SingleViewData::PixelIterator<DataType, NestedIteratorType>::nextModule()
238 {
239  ++_curModule;
240 
241  if(_curModule < _dataPtr->nbModules())
242  _moduleIterator = _dataPtr->module(_curModule).begin();
243  else
244  --_curModule;
245 }
246 
247 template<class DataType, class NestedIteratorType>
248 void SingleViewData::PixelIterator<DataType, NestedIteratorType>::prevModule()
249 {
250  --_curModule;
251 
252  if(_curModule >= 0)
253  _moduleIterator = _dataPtr->module(_curModule).end();
254  else
255  ++_curModule;
256 
257 }
258 
259 
260 } // namespace CTL
261 
264 #endif // CTL_SINGLEVIEWDATA_H
Simple class that holds the layout of a multi module detector.
Definition: modulelayout.h:32
ModuleData::Dimensions _moduleDim
The dimensions of the individual modules.
Definition: singleviewdata.h:100
void append(ModuleData &&moduleData)
Definition: singleviewdata.cpp:117
const ModuleData & first() const
Definition: singleviewdata.cpp:704
ModuleData & module(uint i)
Definition: singleviewdata.cpp:721
Chunk2D< float > combined(const ModuleLayout &layout=ModuleLayout(), bool *ok=nullptr) const
Definition: singleviewdata.cpp:360
Definition: singleviewdata.h:23
bool operator==(const Dimensions &other) const
Definition: singleviewdata.cpp:635
void transformToIntensity(double i0=1.0)
Definition: singleviewdata.cpp:212
SingleViewData operator/(float divisor) const
Definition: singleviewdata.cpp:624
float min() const
Definition: singleviewdata.cpp:462
size_t totalPixelCount() const
Definition: singleviewdata.cpp:748
void transformToExtinction(double i0orN0=1.0)
Definition: singleviewdata.cpp:196
void transformToCounts(double n0=1.0)
Definition: singleviewdata.cpp:228
SingleViewData split(const ModuleLayout &layout) const
Splits the projection data from a single module dataset into different modules according to the detec...
Definition: singleviewdata.cpp:307
SingleViewData operator *(float factor) const
Definition: singleviewdata.cpp:613
Dimensions dimensions() const
Definition: singleviewdata.cpp:686
uint nbModules
Number of modules.
Definition: singleviewdata.h:118
std::vector< float > toVector() const
Definition: singleviewdata.cpp:178
std::vector< ModuleData > _data
The internal data storage vector.
Definition: singleviewdata.h:102
uint nbModules() const
Definition: singleviewdata.cpp:740
void allocateMemory(uint nbModules)
Definition: singleviewdata.cpp:509
bool operator!=(const Dimensions &other) const
Definition: singleviewdata.cpp:644
void setDataFromVector(const std::vector< float > &dataVector)
Definition: singleviewdata.cpp:268
bool hasEqualSizeAs(const ModuleData &other) const
Definition: singleviewdata.cpp:483
float max() const
Definition: singleviewdata.cpp:439
std::string info() const
Definition: singleviewdata.cpp:653
uint nbChannels
Number of channels in each module.
Definition: singleviewdata.h:116
Struct that holds the dimensions, namely number of channels, rows and modules, of a SingleViewData ob...
Definition: singleviewdata.h:114
unsigned int uint
Qt style alias for unsigned int.
Definition: modulelayout.h:6
void fill(float fillValue)
Definition: singleviewdata.cpp:419
const std::vector< ModuleData > & data() const
Definition: singleviewdata.cpp:675
SingleViewData & operator *=(float factor)
Definition: singleviewdata.cpp:567
uint nbRows
Number of rows in each module.
Definition: singleviewdata.h:117
const std::vector< ModuleData > & constData() const
Definition: singleviewdata.cpp:667
SingleViewData(const ModuleData::Dimensions &moduleDimensions)
Definition: singleviewdata.cpp:13
Chunk2D< float > ModuleData
Alias for template specialization Chunk2D<float>.
Definition: singleviewdata.h:23
SingleViewData operator+(const SingleViewData &other) const
Definition: singleviewdata.cpp:590
uint elementsPerModule() const
Definition: singleviewdata.cpp:696
The SingleViewData class is the container class used to store all projections from one particular vie...
Definition: singleviewdata.h:19
SingleViewData & operator+=(const SingleViewData &other)
Definition: singleviewdata.cpp:532
void freeMemory()
Definition: singleviewdata.cpp:428
SingleViewData & operator/=(float divisor)
Definition: singleviewdata.cpp:578