CTL  0.6.1
Computed Tomography Library
abstractgantry.h
Go to the documentation of this file.
1 #ifndef CTL_ABSTRACTGANTRY_H
2 #define CTL_ABSTRACTGANTRY_H
3 
4 #include "mat/matrix_utils.h"
5 #include "systemcomponent.h"
6 
7 /*
8  * NOTE: This is header only.
9  */
10 
11 namespace CTL {
12 
13 class GenericGantry;
14 
66 {
69 
70  // abstract interface
71  protected:virtual mat::Location nominalDetectorLocation() const = 0;
72  protected:virtual mat::Location nominalSourceLocation() const = 0;
73 
74 public:
75  // virtual methods
76  QString info() const override;
77  void fromVariant(const QVariant& variant) override; // de-serialization
78  QVariant toVariant() const override; // serialization
79 
80  // getter methods
81  mat::Location sourceLocation() const;
82  mat::Location detectorLocation() const;
83  const mat::Location& detectorDisplacement() const;
84  const mat::Location& gantryDisplacement() const;
85  const mat::Location& sourceDisplacement() const;
86 
87  // setter methods
88  void setDetectorDisplacement(const mat::Location& displacement);
89  void setGantryDisplacement(const mat::Location& displacement);
90  void setSourceDisplacement(const mat::Location& displacement);
91 
92  // convenience getter
93  Vector3x1 sourcePosition() const;
94  Matrix3x3 sourceRotation() const;
97 
98  // convenience setter
99  void setDetectorDisplacementAngles(double rollAngle, double tiltAngle, double twistAngle);
100  void setDetectorDisplacementPosition(const Vector3x1& position);
101  void setDetectorDisplacementPosition(double x, double y, double z);
102  void setGantryDisplacementPosition(const Vector3x1& position);
103  void setGantryDisplacementPosition(double x, double y, double z);
104  void setSourceDisplacementPosition(const Vector3x1& position);
105  void setSourceDisplacementPosition(double x, double y, double z);
106 
107  // converter
108  std::unique_ptr<GenericGantry> toGeneric() const;
109 
110  ~AbstractGantry() override = default;
111 
112 protected:
113  AbstractGantry() = default;
114  AbstractGantry(const QString& name);
115 
116  AbstractGantry(const AbstractGantry&) = default;
117  AbstractGantry(AbstractGantry&&) = default;
118  AbstractGantry& operator=(const AbstractGantry&) = default;
119  AbstractGantry& operator=(AbstractGantry&&) = default;
120 
121 private:
123  mat::Location _detectorDisplacement;
124  mat::Location _sourceDisplacement;
125 };
126 
130 inline AbstractGantry::AbstractGantry(const QString& name)
132 {
133 }
134 
149 {
150  return { sourcePosition(), sourceRotation() };
151 }
152 
165 {
166  return _globalGantryDisplacement.rotation* nominalSourceLocation().position
167  + sourceRotation() * _sourceDisplacement.position
168  + _globalGantryDisplacement.position;
169 }
170 
183 {
184  return _globalGantryDisplacement.rotation
185  * nominalSourceLocation().rotation
186  * _sourceDisplacement.rotation;
187 }
188 
205 {
206  return { detectorPosition(), detectorRotation() };
207 }
208 
226 {
227  return _globalGantryDisplacement.rotation * nominalDetectorLocation().position
229  + _globalGantryDisplacement.position;
230 }
231 
245 {
246  return _detectorDisplacement.rotation.transposed()
247  * nominalDetectorLocation().rotation
249 }
250 
260 {
261  return _detectorDisplacement;
262 }
263 
273 {
275 }
276 
286 {
287  return _sourceDisplacement;
288 }
289 
296 {
297  _detectorDisplacement = displacement;
298 }
299 
305 inline void AbstractGantry::setGantryDisplacement(const mat::Location& displacement)
306 {
307  _globalGantryDisplacement = displacement;
308 }
309 
315 inline void AbstractGantry::setSourceDisplacement(const mat::Location& displacement)
316 {
317  _sourceDisplacement = displacement;
318 }
319 
326 {
327  _detectorDisplacement.position = position;
328 }
329 
336 inline void AbstractGantry::setDetectorDisplacementPosition(double x, double y, double z)
337 {
338  _detectorDisplacement.position = Vector3x1(x, y, z);
339 }
340 
347 {
348  _globalGantryDisplacement.position = position;
349 }
350 
357 inline void AbstractGantry::setGantryDisplacementPosition(double x, double y, double z)
358 {
359  _globalGantryDisplacement.position = Vector3x1(x, y, z);
360 }
361 
368 {
369  _sourceDisplacement.position = position;
370 }
371 
378 inline void AbstractGantry::setSourceDisplacementPosition(double x, double y, double z)
379 {
380  _sourceDisplacement.position = Vector3x1(x, y, z);
381 }
382 
394 inline void
395 AbstractGantry::setDetectorDisplacementAngles(double rollAngle, double tiltAngle, double twistAngle)
396 {
397  _detectorDisplacement.rotation = mat::rotationMatrix(twistAngle, Qt::ZAxis)
398  * mat::rotationMatrix(tiltAngle, Qt::XAxis) * mat::rotationMatrix(rollAngle, Qt::YAxis);
399 }
400 
409 inline QString AbstractGantry::info() const
410 {
411  QString ret(SystemComponent::info());
412 
413  // clang-format off
414  QString srcDisplString = "(" + QString::number(_sourceDisplacement.position(0,0)) + " mm, " +
415  QString::number(_sourceDisplacement.position(1,0)) + " mm, " +
416  QString::number(_sourceDisplacement.position(2,0)) + " mm)\n";
417  QString detDisplString = "(" + QString::number(_detectorDisplacement.position(0,0)) + " mm, " +
418  QString::number(_detectorDisplacement.position(1,0)) + " mm, " +
419  QString::number(_detectorDisplacement.position(2,0)) + " mm)\n";
420  QString srcRotString = QString::fromStdString(_sourceDisplacement.rotation.info("\t"));
421  QString detRotString = QString::fromStdString(_detectorDisplacement.rotation.info("\t"));
422 
423  ret +=
424  typeInfoString(typeid(this)) +
425  "\tSource Displacement: " + srcDisplString +
426  "\t-Rotation:\n" + srcRotString +
427  "\tDetector Displacement: " + detDisplString +
428  "\t-Rotation:\n" + detRotString;
429  // clang-format on
430 
431  ret += (this->type() == AbstractGantry::Type) ? QLatin1String("}\n") : QLatin1String("");
432 
433  return ret;
434 }
435 
436 // Use SerializationInterface::fromVariant() documentation.
437 inline void AbstractGantry::fromVariant(const QVariant& variant)
438 {
440 
441  QVariantMap varMap = variant.toMap();
442  _detectorDisplacement.fromVariant(varMap.value(QStringLiteral("detector displacement")));
443  _globalGantryDisplacement.fromVariant(varMap.value(QStringLiteral("gantry displacement")));
444  _sourceDisplacement.fromVariant(varMap.value(QStringLiteral("source displacement")));
445 }
446 
447 // Use SerializationInterface::toVariant() documentation.
448 inline QVariant AbstractGantry::toVariant() const
449 {
450  QVariantMap ret = SystemComponent::toVariant().toMap();
451 
452  ret.insert(QStringLiteral("detector displacement"), _detectorDisplacement.toVariant());
453  ret.insert(QStringLiteral("gantry displacement"), _globalGantryDisplacement.toVariant());
454  ret.insert(QStringLiteral("source displacement"), _sourceDisplacement.toVariant());
455 
456  return ret;
457 }
458 
481 } // namespace CTL
482 
484 
487 #endif // CTL_ABSTRACTGANTRY_H
virtual mat::Location nominalSourceLocation() const =0
const mat::Location & sourceDisplacement() const
Definition: abstractgantry.h:285
Vector3x1 detectorPosition() const
Definition: abstractgantry.h:225
#define DECLARE_ELEMENTAL_TYPE
Definition: systemcomponent.h:148
mat::Location _globalGantryDisplacement
Displacement of the whole gantry.
Definition: abstractgantry.h:122
void setGantryDisplacementPosition(const Vector3x1 &position)
Definition: abstractgantry.h:346
QVariant toVariant() const override
Definition: abstractgantry.h:448
static QString typeInfoString(const std::type_info &type)
Definition: systemcomponent.cpp:52
mat::Location sourceLocation() const
Definition: abstractgantry.h:148
virtual mat::Location nominalDetectorLocation() const =0
QString info() const override
Definition: abstractgantry.h:409
virtual QString info() const
Definition: systemcomponent.cpp:29
Matrix3x3 sourceRotation() const
Definition: abstractgantry.h:182
const QString & name() const
Definition: systemcomponent.cpp:42
QVariant toVariant() const override
Definition: systemcomponent.cpp:64
std::string info(const char *lineModifier="") const
Definition: matrix.tpp:376
mat::Location detectorLocation() const
Definition: abstractgantry.h:204
const mat::Location & detectorDisplacement() const
Definition: abstractgantry.h:259
Base class for gantry components.
Definition: abstractgantry.h:65
Vector3x1 sourcePosition() const
Definition: abstractgantry.h:164
Base class for all system components.
Definition: systemcomponent.h:53
void setDetectorDisplacementAngles(double rollAngle, double tiltAngle, double twistAngle)
Definition: abstractgantry.h:395
Definition: matrix_utils.h:27
mat::Location _sourceDisplacement
Displacement of the source component.
Definition: abstractgantry.h:124
int type() const override
Definition: abstractgantry.h:67
mat::Location _detectorDisplacement
Displacement of the detector component.
Definition: abstractgantry.h:123
#define CTL_TYPE_ID(newIndex)
Definition: serializationinterface.h:189
void setDetectorDisplacement(const mat::Location &displacement)
Definition: abstractgantry.h:295
const mat::Location & gantryDisplacement() const
Definition: abstractgantry.h:272
void fromVariant(const QVariant &variant) override
Definition: systemcomponent.cpp:58
Matrix3x3 detectorRotation() const
Definition: abstractgantry.h:244
void setDetectorDisplacementPosition(const Vector3x1 &position)
Definition: abstractgantry.h:325
void setSourceDisplacement(const mat::Location &displacement)
Definition: abstractgantry.h:315
void setGantryDisplacement(const mat::Location &displacement)
Definition: abstractgantry.h:305
Matrix< Cols, Rows > transposed() const
Definition: matrix.tpp:737
void fromVariant(const QVariant &variant) override
Definition: abstractgantry.h:437
Generic implementation of a gantry component.
Definition: genericgantry.h:25
void setSourceDisplacementPosition(const Vector3x1 &position)
Definition: abstractgantry.h:367