CTL  0.6.1
Computed Tomography Library
abstractdetector.h
Go to the documentation of this file.
1 #ifndef CTL_ABSTRACTDETECTOR_H
2 #define CTL_ABSTRACTDETECTOR_H
3 
4 #include "systemcomponent.h"
5 #include "mat/matrix_utils.h" // for definition of mat::Location
6 #include "img/singleviewdata.h" // for definition of SingleViewData::Dimensions
8 #include "models/xydataseries.h"
9 
10 #include <QJsonArray>
11 #include <QSize>
12 #include <QVariantMap>
13 
14 /*
15  * NOTE: This is header only.
16  */
17 
18 namespace CTL {
19 
20 class GenericDetector;
21 
55 {
58 
59 public:
60  typedef mat::Location ModuleLocation;
61  enum SaturationModelType { Extinction, PhotonCount, Intensity, Undefined };
62 
63  // abstract interface
64  public:virtual QVector<ModuleLocation> moduleLocations() const = 0;
65 
66 public:
68  const QSizeF& pixelSize,
69  const QString& name);
70 
71  // virtual methods
72  QString info() const override;
73  void fromVariant(const QVariant& variant) override; // de-serialization
74  QVariant toVariant() const override; // serialization
75 
76  // setter methods
78  void setSaturationModel(std::unique_ptr<AbstractDataModel> model, SaturationModelType type);
80  void setSpectralResponseModel(std::unique_ptr<AbstractDataModel> model);
81 
82  // getter methods
83  uint nbDetectorModules() const;
84  const QSize& nbPixelPerModule() const;
85  Q_DECL_DEPRECATED_X("Within the CTL 'dimension' is use for a count of something, use pixelSize() instead.")
86  const QSizeF& pixelDimensions() const;
87  const QSizeF& pixelSize() const;
88  ModuleLocation moduleLocation(uint module) const;
89  const AbstractDataModel* saturationModel() const;
91  XYDataSeries inputResponse(float from, float to, uint nbSamples) const;
92  XYDataSeries spectralResponse(float from, float to, uint nbSamples) const;
94  double skewAngle() const;
95 
96  // other methods
97  bool hasSaturationModel() const;
98  bool hasSpectralResponseModel() const;
99  QSizeF moduleDimensions() const;
100  SingleViewData::Dimensions viewDimensions() const;
101 
102  // converter
103  std::unique_ptr<GenericDetector> toGeneric() const;
104 
105  ~AbstractDetector() override = default;
106 
107 protected:
108  AbstractDetector() = default;
109  AbstractDetector(const QString& name);
110 
111  AbstractDetector(const AbstractDetector&) = default;
112  AbstractDetector(AbstractDetector&&) = default;
113  AbstractDetector& operator=(const AbstractDetector&) = default;
114  AbstractDetector& operator=(AbstractDetector&&) = default;
115 
117  QSizeF _pixelSize;
118  double _skewAngle = 0.0;
119 
123 };
124 
130 inline uint AbstractDetector::nbDetectorModules() const { return moduleLocations().count(); }
131 
136 inline const QSize& AbstractDetector::nbPixelPerModule() const { return _nbPixelPerModule; }
137 
141 inline const QSizeF& AbstractDetector::pixelDimensions() const { return _pixelSize; }
142 
149 inline const QSizeF& AbstractDetector::pixelSize() const { return _pixelSize; }
150 
156 {
157  return { _nbPixelPerModule.width()*_pixelSize.width(),
158  _nbPixelPerModule.height()*_pixelSize.height() };
159 }
160 
166 {
168  ret.nbChannels = _nbPixelPerModule.width();
169  ret.nbRows = _nbPixelPerModule.height();
171  return ret;
172 }
173 
185 {
186  Q_ASSERT(module < nbDetectorModules());
187  return moduleLocations().at(module);
188 }
189 
194 {
195  return _saturationModel.get();
196 }
197 
203 {
204  return _saturationModelType;
205 }
206 
211 {
212  return _spectralResponseModel.get();
213 }
214 
215 inline double AbstractDetector::skewAngle() const { return _skewAngle; }
216 
222 inline XYDataSeries AbstractDetector::inputResponse(float from, float to, uint nbSamples) const
223 {
224  if(!_saturationModel)
225  return XYDataSeries();
226  return XYDataSeries::sampledFromModel(*_saturationModel, from, to, nbSamples);
227 }
228 
234 inline XYDataSeries AbstractDetector::spectralResponse(float from, float to, uint nbSamples) const
235 {
237  return XYDataSeries();
238  return XYDataSeries::sampledFromModel(*_spectralResponseModel, from, to, nbSamples);
239 }
240 
245 {
246  return static_cast<bool>(_saturationModel);
247 }
248 
253 {
254  return static_cast<bool>(_spectralResponseModel);
255 }
256 
260 inline AbstractDetector::AbstractDetector(const QString &name)
262 {
263 }
264 
270 inline AbstractDetector::AbstractDetector(const QSize& nbPixelPerModule,
271  const QSizeF& pixelSize,
272  const QString& name)
273  : SystemComponent(name)
274  , _nbPixelPerModule(nbPixelPerModule)
275  , _pixelSize(pixelSize)
276 {
277 }
278 
285 inline QString AbstractDetector::info() const
286 {
287  QString ret(SystemComponent::info());
288 
289  // clang-format off
290  ret +=
291  typeInfoString(typeid(this)) +
292  "\tNb. of modules: " + QString::number(nbDetectorModules()) + "\n"
293  "\tNb. of pixels per module: " + QString::number(_nbPixelPerModule.width()) + " x " +
294  QString::number(_nbPixelPerModule.height()) + "\n"
295  "\tPixel size: " + QString::number(_pixelSize.width()) + " mm x " +
296  QString::number(_pixelSize.height()) + " mm\n";
297 
298  ret += (this->type() == AbstractDetector::Type) ? QLatin1String("}\n") : QLatin1String("");
299  // clang-format on
300 
301  return ret;
302 }
303 
304 // Use SerializationInterface::fromVariant() documentation.
305 inline void AbstractDetector::fromVariant(const QVariant& variant)
306 {
308 
309  QVariantMap varMap = variant.toMap();
310 
311  auto nbPixels = varMap.value(QStringLiteral("pixel per module")).toMap();
312  _nbPixelPerModule.setWidth(nbPixels.value(QStringLiteral("channels")).toInt());
313  _nbPixelPerModule.setHeight(nbPixels.value(QStringLiteral("rows")).toInt());
314 
315  auto pixelDim = varMap.value(QStringLiteral("pixel size")).toMap();
316  _pixelSize.setWidth(pixelDim.value(QStringLiteral("width")).toDouble());
317  _pixelSize.setHeight(pixelDim.value(QStringLiteral("height")).toDouble());
318 
319  QVariant saturationModel = varMap.value(QStringLiteral("saturation model"));
320  _saturationModel.reset(SerializationHelper::parseDataModel(saturationModel));
321 
322  int satModTypeVal = varMap.value(QStringLiteral("saturation model type")).toMap().value(QStringLiteral("enum value")).toInt();
323  _saturationModelType = SaturationModelType(satModTypeVal);
324 }
325 
326 // Use SerializationInterface::toVariant() documentation.
327 inline QVariant AbstractDetector::toVariant() const
328 {
329  QVariantMap ret = SystemComponent::toVariant().toMap();
330 
331  QVariantMap nbPixels;
332  nbPixels.insert(QStringLiteral("channels"),_nbPixelPerModule.width());
333  nbPixels.insert(QStringLiteral("rows"), _nbPixelPerModule.height());
334 
335  QVariantMap pixelDim;
336  pixelDim.insert(QStringLiteral("width"),_pixelSize.width());
337  pixelDim.insert(QStringLiteral("height"), _pixelSize.height());
338 
339  QVariant saturationModel = hasSaturationModel() ? _saturationModel->toVariant()
340  : QVariant();
341 
342  QVariantMap satModelType;
343  satModelType.insert(QStringLiteral("enum value"), _saturationModelType);
344  satModelType.insert(QStringLiteral("meaning"), "0: Extinction, 1: Photon count, 2: Intensity, 3: Undefined");
345 
346  ret.insert(QStringLiteral("pixel per module"), nbPixels);
347  ret.insert(QStringLiteral("pixel size"), pixelDim);
348  ret.insert(QStringLiteral("saturation model"), saturationModel);
349  ret.insert(QStringLiteral("saturation model type"), satModelType);
350 
351  return ret;
352 }
353 
360 {
361  _saturationModel.reset(model);
363 }
364 
369 inline void AbstractDetector::setSaturationModel(std::unique_ptr<AbstractDataModel> model,
370  SaturationModelType type)
371 {
372  _saturationModel = std::move(model);
374 }
375 
381 {
382  _spectralResponseModel.reset(model);
383 }
384 
389 inline void AbstractDetector::setSpectralResponseModel(std::unique_ptr<AbstractDataModel> model)
390 {
391  _spectralResponseModel = std::move(model);
392 }
393 
426 } // namespace CTL
427 
429 
442 
444 #endif // CTL_ABSTRACTDETECTOR_H
#define DECLARE_ELEMENTAL_TYPE
Definition: systemcomponent.h:148
int type() const override
Definition: abstractdetector.h:56
SaturationModelType saturationModelType() const
Definition: abstractdetector.h:202
const QSizeF & pixelSize() const
Definition: abstractdetector.h:149
const QSizeF & pixelDimensions() const
Definition: abstractdetector.h:141
virtual QVector< ModuleLocation > moduleLocations() const =0
static QString typeInfoString(const std::type_info &type)
Definition: systemcomponent.cpp:52
SaturationModelType
Definition: abstractdetector.h:61
virtual QString info() const
Definition: systemcomponent.cpp:29
const QSize & nbPixelPerModule() const
Definition: abstractdetector.h:136
const AbstractDataModel * saturationModel() const
Definition: abstractdetector.h:193
mat::Location ModuleLocation
Definition: abstractdetector.h:60
const QString & name() const
Definition: systemcomponent.cpp:42
QSize _nbPixelPerModule
Number of pixels in each detector module.
Definition: abstractdetector.h:116
QVariant toVariant() const override
Definition: systemcomponent.cpp:64
XYDataSeries inputResponse(float from, float to, uint nbSamples) const
Definition: abstractdetector.h:222
AbstractDataModelPtr _saturationModel
Data model for saturation of measured values.
Definition: abstractdetector.h:121
Base class for detector components.
Definition: abstractdetector.h:54
bool hasSaturationModel() const
Definition: abstractdetector.h:244
Base class for all system components.
Definition: systemcomponent.h:53
uint nbModules
Number of modules.
Definition: singleviewdata.h:118
QSizeF _pixelSize
Size of individual pixels (in mm).
Definition: abstractdetector.h:117
AbstractDataModelPtr _spectralResponseModel
Data model for spectral detector response.
Definition: abstractdetector.h:120
double _skewAngle
obliqueness angle (specifies non-orthogonality of pixels)
Definition: abstractdetector.h:118
QVariant toVariant() const override
Definition: abstractdetector.h:327
Definition: matrix_utils.h:27
The AbstractDataModel class is the base class for basic data models.
Definition: abstractdatamodel.h:55
void fromVariant(const QVariant &variant) override
Definition: abstractdetector.h:305
SaturationModelType _saturationModelType
States whether saturation model refers to intensity or extinction values.
Definition: abstractdetector.h:122
QString info() const override
Definition: abstractdetector.h:285
static XYDataSeries sampledFromModel(const AbstractDataModel &dataModel, const QVector< float > &samplingPoints)
Definition: xydataseries.cpp:99
uint nbChannels
Number of channels in each module.
Definition: singleviewdata.h:116
The XYDataSeries class is container for a series of data points, each representing x and y value pair...
Definition: xydataseries.h:60
Struct that holds the dimensions, namely number of channels, rows and modules, of a SingleViewData ob...
Definition: singleviewdata.h:114
#define CTL_TYPE_ID(newIndex)
Definition: serializationinterface.h:189
unsigned int uint
Qt style alias for unsigned int.
Definition: modulelayout.h:6
const AbstractDataModel * spectralResponseModel() const
Definition: abstractdetector.h:210
QSizeF moduleDimensions() const
Definition: abstractdetector.h:155
ModuleLocation moduleLocation(uint module) const
Definition: abstractdetector.h:184
void fromVariant(const QVariant &variant) override
Definition: systemcomponent.cpp:58
Extends std::unique_ptr<T> with copy operations using the clone method of type T.
Definition: copyableuniqueptr.h:14
uint nbRows
Number of rows in each module.
Definition: singleviewdata.h:117
XYDataSeries spectralResponse(float from, float to, uint nbSamples) const
Definition: abstractdetector.h:234
void setSaturationModel(AbstractDataModel *model, SaturationModelType type)
Definition: abstractdetector.h:358
bool hasSpectralResponseModel() const
Definition: abstractdetector.h:252
SingleViewData::Dimensions viewDimensions() const
Definition: abstractdetector.h:165
Generic implementation of a detector component.
Definition: genericdetector.h:22
void setSpectralResponseModel(AbstractDataModel *model)
Definition: abstractdetector.h:380
uint nbDetectorModules() const
Definition: abstractdetector.h:130
The SingleViewData class is the container class used to store all projections from one particular vie...
Definition: singleviewdata.h:19