CTL  0.6.1
Computed Tomography Library
trajectories.h
1 #ifndef CTL_TRAJECTORIES_H
2 #define CTL_TRAJECTORIES_H
3 
4 #include "abstractpreparestep.h"
5 #include "acquisitionsetup.h"
6 #include "preparesteps.h"
7 #include "mat/mat.h"
8 
9 namespace CTL {
10 namespace protocols {
11 
13 {
14  public: std::vector<std::shared_ptr<AbstractPrepareStep>>
15  prepareSteps(uint viewNb, const AcquisitionSetup& setup) const override;
16 
17 public:
18  HelicalTrajectory(double angleIncrement,
19  double pitchIncrement = 0.0,
20  double startPitch = 0.0,
21  double startAngle = 0.0_deg);
22 
23  bool isApplicableTo(const AcquisitionSetup& setup) const override;
24 
25  double angleIncrement = 0.0_deg;
26  double pitchIncrement = 0.0;
27  double startPitch = 0.0;
28  double startAngle = 0.0_deg;
29 };
30 
32 {
33  public: std::vector<std::shared_ptr<AbstractPrepareStep>>
34  prepareSteps(uint viewNb, const AcquisitionSetup& setup) const override;
35 
36 public:
38  double startAngle = 0.0_deg,
39  double angleSpan = -1.0_deg,
40  double wobbleAngle = 15.0_deg,
41  double wobbleFreq = 1.0);
42 
43  bool isApplicableTo(const AcquisitionSetup& setup) const override;
44 
45  double sourceToIsocenter = 0.0;
46  double startAngle = 0.0_deg;
47  double angleSpan = -1.0_deg;
48  double wobbleAngle = 15.0_deg;
49  double wobbleFreq = 1.0;
50 };
51 
53 {
54  public: std::vector<std::shared_ptr<AbstractPrepareStep>>
55  prepareSteps(uint viewNb, const AcquisitionSetup& setup) const override;
56 
57 public:
59  double lineLength,
60  double startAngle = 0.0_deg,
61  double angleSpan = 360.0_deg,
62  double fractionOfViewsForLine = 0.5);
63 
64  bool isApplicableTo(const AcquisitionSetup& setup) const override;
65 
66  double sourceToIsocenter = 0.0;
67  double lineLength = 0.0;
68  double startAngle = 0.0_deg;
69  double angleSpan = 360.0_deg;
70  double fractionOfViewsForLine = 0.5;
71 };
72 
74 {
75  public: std::vector<std::shared_ptr<AbstractPrepareStep>>
76  prepareSteps(uint viewNb, const AcquisitionSetup& setup) const override;
77 
78 public:
80  double startAngle = 0.0_deg,
81  double angleSpan = -1.0_deg,
82  bool rotateClockwise = false);
83 
84  bool isApplicableTo(const AcquisitionSetup& setup) const override;
85 
86  double sourceToIsocenter = 0.0;
87  double startAngle = 0.0_deg;
88  double angleSpan = -1.0_deg;
89  bool rotateClockwise = false;
90 
91 };
92 
94 {
95  public: std::vector<std::shared_ptr<AbstractPrepareStep>>
96  prepareSteps(uint viewNb, const AcquisitionSetup& setup) const override;
97 
98 public:
99  AxialScanTrajectory(double startAngle = 0.0_deg);
100 
101  bool isApplicableTo(const AcquisitionSetup& setup) const override;
102 
103  double startAngle = 0.0_deg;
104 };
105 
107 {
108  public: std::vector<std::shared_ptr<AbstractPrepareStep>>
109  prepareSteps(uint viewNb, const AcquisitionSetup& setup) const override;
110 
111 public:
113  double tomoAngle = 15.0_deg);
114 
115  bool isApplicableTo(const AcquisitionSetup& setup) const override;
116 
117  double sourceToIsocenter = 0.0;
118  double tomoAngle = 15.0_deg;
119 };
120 
121 template <uint nbArcs>
123 {
124  static_assert(nbArcs > 1, "Multi arc trajectory must have nb. arcs larger than 1.");
125 
126  public: std::vector<std::shared_ptr<AbstractPrepareStep>>
127  prepareSteps(uint viewNb, const AcquisitionSetup& setup) const override;
128 
129 public:
131  double startAngle = 0.0_deg,
132  double tomoAngle = 15.0_deg);
133 
134  bool isApplicableTo(const AcquisitionSetup& setup) const override;
135 
136  double sourceToIsocenter = 0.0;
137  double startAngle = 0.0_deg;
138  double tomoAngle = 15.0_deg;
139 };
140 
141 template <>
143 {
144  public: std::vector<std::shared_ptr<AbstractPrepareStep>>
145  prepareSteps(uint viewNb, const AcquisitionSetup& setup) const override;
146 
147 public:
149  double startAngle = 0.0_deg,
150  double tomoAngle = 15.0_deg);
151 
152  bool isApplicableTo(const AcquisitionSetup& setup) const override;
153 
154  double sourceToIsocenter = 0.0;
155  double startAngle = 0.0_deg;
156  double tomoAngle = 15.0_deg;
157 };
158 
162 
163 
164 #if __cplusplus >= 201703L
165 class TomosynthesisEllipticalTrajectory : public AbstractPreparationProtocol
166 {
167  public: std::vector<std::shared_ptr<AbstractPrepareStep>>
168  prepareSteps(uint viewNb, const AcquisitionSetup& setup) const override;
169 
170 public:
171  TomosynthesisEllipticalTrajectory(double sourceToIsocenter,
172  double startAngle = 0.0_deg,
173  double smallAngle = 15.0_deg,
174  double largeAngle = 23.0_deg,
175  bool landscapeDetectorOrientation = false);
176 
177  bool isApplicableTo(const AcquisitionSetup& setup) const override;
178 
179  double sourceToIsocenter = 0.0;
180  double startAngle = 0.0_deg;
181  double smallAngle = 15.0_deg;
182  double largeAngle = 23.0_deg;
183  bool landscapeDetOrientation = false;
184 
185 private:
186  double computeAngularEllipsisParameter(uint viewNb, uint nbViews) const;
187 };
188 #endif // C++17
189 
191 {
192  public: std::vector<std::shared_ptr<AbstractPrepareStep>>
193  prepareSteps(uint viewNb, const AcquisitionSetup& setup) const override;
194 
195 public:
197  double twistAngle = 0.0_deg,
198  double smallAngle = 15.0_deg,
199  double largeAngle = 23.0_deg,
200  double fractionOfViewsHorizontal = 0.5);
201 
202  bool isApplicableTo(const AcquisitionSetup& setup) const override;
203 
204  double sourceToIsocenter = 0.0;
205  double twistAngle = 0.0_deg;
206  double smallAngle = 15.0_deg;
207  double largeAngle = 23.0_deg;
208  double fractionOfViewsHorizontal = 0.5;
209 };
210 
212 {
213  public: std::vector<std::shared_ptr<AbstractPrepareStep>>
214  prepareSteps(uint viewNb, const AcquisitionSetup& setup) const override;
215 
216 public:
218  double startAngle = 0.0_deg,
219  double tomoAngle = 15.0_deg,
220  bool verticalOrientation = false);
221 
222  bool isApplicableTo(const AcquisitionSetup& setup) const override;
223 
224  double sourceToIsocenter = 0.0;
225  double startAngle = 0.0_deg;
226  double tomoAngle = 15.0_deg;
227  bool verticalOrientation = false;
228 };
229 
230 
231 // Template implementations
232 // ========================
233 
234 template <uint nbArcs>
236  double startAngle,
237  double tomoAngle)
238  : sourceToIsocenter(sourceToIsocenter)
239  , startAngle(startAngle)
240  , tomoAngle(tomoAngle)
241 {
242 }
243 
244 template <uint nbArcs>
245 std::vector<std::shared_ptr<AbstractPrepareStep>>
247 {
248  std::vector<std::shared_ptr<AbstractPrepareStep>> ret;
249 
250  const auto viewsPerArc = setup.nbViews() / static_cast<double>(nbArcs);
251  constexpr auto innerAngle = 2.0 * PI / double(nbArcs);
252  const auto arcFactor = std::sqrt((1.0 - std::cos(2.0 * PI / nbArcs)) /
253  (1.0 + std::cos(2.0 * PI / nbArcs)));
254  const auto arcAngle = 2.0 * std::atan(arcFactor * std::sin(tomoAngle));
255  const auto angleIncrement = arcAngle / viewsPerArc;
256 
257  auto arcRot = [](double xAngle, double yAngle) {
258  return mat::rotationMatrix(-xAngle + PI_2, Qt::XAxis) *
259  mat::rotationMatrix(yAngle, Qt::YAxis);
260  };
261 
262  const auto rotAngle = std::fmod(viewNb, viewsPerArc) * angleIncrement - 0.5 * arcAngle;
263  const auto arcNb = std::floor(viewNb / viewsPerArc);
264 
265  const auto viewRotation = mat::rotationMatrix(-arcNb * innerAngle + startAngle, Qt::YAxis) *
266  arcRot(-tomoAngle, rotAngle);
267 
268  const auto viewPosition = viewRotation * Vector3x1(0.0, 0.0, -sourceToIsocenter);
269 
270  auto gantryPrep = std::make_shared<prepare::CarmGantryParam>();
271  gantryPrep->setLocation(mat::Location(viewPosition, viewRotation));
272  ret.push_back(std::move(gantryPrep));
273 
274  return ret;
275 }
276 
277 template <uint nbArcs>
279 {
281  return tmp.isApplicableTo(*setup.system());
282 }
283 
284 } // namespace protocols
285 } // namespace CTL
286 
287 #endif // CTL_TRAJECTORIES_H
TomosynthesisCrossTrajectory(double sourceToIsocenter, double twistAngle=0.0_deg, double smallAngle=15.0_deg, double largeAngle=23.0_deg, double fractionOfViewsHorizontal=0.5)
Definition: trajectories.cpp:423
std::vector< std::shared_ptr< AbstractPrepareStep > > prepareSteps(uint viewNb, const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:437
Definition: trajectories.h:73
double sourceToIsocenter
[mm]
Definition: trajectories.h:86
bool isApplicableTo(const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:475
Base class for entire preparation protocols (i.e. for multiple views) that can be used in combination...
Definition: abstractpreparestep.h:84
std::vector< std::shared_ptr< AbstractPrepareStep > > prepareSteps(uint viewNb, const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:213
SimpleCTSystem * system()
Definition: acquisitionsetup.cpp:591
Definition: trajectories.h:211
bool isApplicableTo(const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:231
double sourceToIsocenter
[mm]
Definition: trajectories.h:66
bool isApplicableTo(const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:43
double wobbleFreq
number of wobbles (2 arcs) during the acquisition
Definition: trajectories.h:49
std::vector< std::shared_ptr< AbstractPrepareStep > > prepareSteps(uint viewNb, const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:63
std::vector< std::shared_ptr< AbstractPrepareStep > > prepareSteps(uint viewNb, const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:245
Holds a CTSystem together with the information about the system settings for all views from which pro...
Definition: acquisitionsetup.h:175
Definition: trajectories.h:190
bool isApplicableTo(const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:95
double sourceToIsocenter
[mm]
Definition: trajectories.h:117
Definition: trajectories.h:93
bool isApplicableTo(const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:155
Definition: trajectories.h:106
double pitchIncrement
[mm]
Definition: trajectories.h:26
Definition: trajectories.h:52
Definition: trajectories.h:31
std::vector< std::shared_ptr< AbstractPrepareStep > > prepareSteps(uint viewNb, const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:115
Definition: matrix_utils.h:27
std::vector< std::shared_ptr< AbstractPrepareStep > > prepareSteps(uint viewNb, const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:169
Definition: preparesteps.h:44
double sourceToIsocenter
[mm]
Definition: trajectories.h:224
Definition: trajectories.h:12
unsigned int uint
Qt style alias for unsigned int.
Definition: modulelayout.h:6
bool isApplicableTo(const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:201
double startPitch
[mm]
Definition: trajectories.h:27
std::vector< std::shared_ptr< AbstractPrepareStep > > prepareSteps(uint viewNb, const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:493
bool isApplicableTo(const AcquisitionSetup &setup) const override
Definition: trajectories.h:278
double sourceToIsocenter
[mm]
Definition: trajectories.h:204
bool isApplicableTo(const CTSystem &system) const override
Definition: preparesteps.cpp:110
double sourceToIsocenter
[mm]
Definition: trajectories.h:136
uint nbViews() const
Definition: acquisitionsetup.cpp:543
std::vector< std::shared_ptr< AbstractPrepareStep > > prepareSteps(uint viewNb, const AcquisitionSetup &setup) const override
Definition: trajectories.h:246
bool isApplicableTo(const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:525
double sourceToIsocenter
[mm]
Definition: trajectories.h:45
bool isApplicableTo(const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:263
std::vector< std::shared_ptr< AbstractPrepareStep > > prepareSteps(uint viewNb, const AcquisitionSetup &setup) const override
Definition: trajectories.cpp:25
double lineLength
[mm]
Definition: trajectories.h:67