1 #ifndef CTL_TRAJECTORIES_H 2 #define CTL_TRAJECTORIES_H 4 #include "abstractpreparestep.h" 5 #include "acquisitionsetup.h" 6 #include "preparesteps.h" 14 public: std::vector<std::shared_ptr<AbstractPrepareStep>>
21 double startAngle = 0.0_deg);
25 double angleIncrement = 0.0_deg;
28 double startAngle = 0.0_deg;
33 public: std::vector<std::shared_ptr<AbstractPrepareStep>>
38 double startAngle = 0.0_deg,
39 double angleSpan = -1.0_deg,
40 double wobbleAngle = 15.0_deg,
46 double startAngle = 0.0_deg;
47 double angleSpan = -1.0_deg;
48 double wobbleAngle = 15.0_deg;
54 public: std::vector<std::shared_ptr<AbstractPrepareStep>>
60 double startAngle = 0.0_deg,
61 double angleSpan = 360.0_deg,
62 double fractionOfViewsForLine = 0.5);
68 double startAngle = 0.0_deg;
69 double angleSpan = 360.0_deg;
70 double fractionOfViewsForLine = 0.5;
75 public: std::vector<std::shared_ptr<AbstractPrepareStep>>
80 double startAngle = 0.0_deg,
81 double angleSpan = -1.0_deg,
82 bool rotateClockwise =
false);
87 double startAngle = 0.0_deg;
88 double angleSpan = -1.0_deg;
89 bool rotateClockwise =
false;
95 public: std::vector<std::shared_ptr<AbstractPrepareStep>>
103 double startAngle = 0.0_deg;
108 public: std::vector<std::shared_ptr<AbstractPrepareStep>>
113 double tomoAngle = 15.0_deg);
118 double tomoAngle = 15.0_deg;
121 template <u
int nbArcs>
124 static_assert(nbArcs > 1,
"Multi arc trajectory must have nb. arcs larger than 1.");
126 public: std::vector<std::shared_ptr<AbstractPrepareStep>>
131 double startAngle = 0.0_deg,
132 double tomoAngle = 15.0_deg);
137 double startAngle = 0.0_deg;
138 double tomoAngle = 15.0_deg;
144 public: std::vector<std::shared_ptr<AbstractPrepareStep>>
149 double startAngle = 0.0_deg,
150 double tomoAngle = 15.0_deg);
155 double startAngle = 0.0_deg;
156 double tomoAngle = 15.0_deg;
164 #if __cplusplus >= 201703L 167 public: std::vector<std::shared_ptr<AbstractPrepareStep>>
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);
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;
186 double computeAngularEllipsisParameter(
uint viewNb,
uint nbViews)
const;
192 public: std::vector<std::shared_ptr<AbstractPrepareStep>>
197 double twistAngle = 0.0_deg,
198 double smallAngle = 15.0_deg,
199 double largeAngle = 23.0_deg,
200 double fractionOfViewsHorizontal = 0.5);
205 double twistAngle = 0.0_deg;
206 double smallAngle = 15.0_deg;
207 double largeAngle = 23.0_deg;
208 double fractionOfViewsHorizontal = 0.5;
213 public: std::vector<std::shared_ptr<AbstractPrepareStep>>
218 double startAngle = 0.0_deg,
219 double tomoAngle = 15.0_deg,
220 bool verticalOrientation =
false);
225 double startAngle = 0.0_deg;
226 double tomoAngle = 15.0_deg;
227 bool verticalOrientation =
false;
234 template <u
int nbArcs>
238 : sourceToIsocenter(sourceToIsocenter)
239 , startAngle(startAngle)
240 , tomoAngle(tomoAngle)
244 template <u
int nbArcs>
245 std::vector<std::shared_ptr<AbstractPrepareStep>>
248 std::vector<std::shared_ptr<AbstractPrepareStep>> ret;
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;
257 auto arcRot = [](
double xAngle,
double yAngle) {
258 return mat::rotationMatrix(-xAngle + PI_2, Qt::XAxis) *
259 mat::rotationMatrix(yAngle, Qt::YAxis);
262 const auto rotAngle = std::fmod(viewNb, viewsPerArc) * angleIncrement - 0.5 * arcAngle;
263 const auto arcNb = std::floor(viewNb / viewsPerArc);
265 const auto viewRotation = mat::rotationMatrix(-arcNb * innerAngle + startAngle, Qt::YAxis) *
266 arcRot(-tomoAngle, rotAngle);
268 const auto viewPosition = viewRotation *
Vector3x1(0.0, 0.0, -sourceToIsocenter);
270 auto gantryPrep = std::make_shared<prepare::CarmGantryParam>();
271 gantryPrep->setLocation(
mat::Location(viewPosition, viewRotation));
272 ret.push_back(std::move(gantryPrep));
277 template <u
int nbArcs>
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:142
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:122
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