STIR 6.4.0
SymmetryOperations_PET_CartesianGrid.inl
Go to the documentation of this file.
1//
2//
15/*
16 Copyright (C) 2000 PARAPET partners
17 Copyright (C) 2000- 2009, Hammersmith Imanet Ltd
18 This file is part of STIR.
19
20 SPDX-License-Identifier: Apache-2.0 AND License-ref-PARAPET-license
21
22 See STIR/LICENSE.txt for details
23*/
24/* History:
25 KT 07/10/2001:
26 made sure that the resulting view_num is in the allowed range
27 use that an LOR at {theta,phi,m,s} is equal to the one at {-theta, phi+Pi,m, -s}
28 TODO, didn't do it for the _zq symmetries, as I don't need it there yet
29 */
30
33#include "stir/Bin.h"
34
35START_NAMESPACE_STIR
36
37void
38SymmetryOperation_PET_CartesianGrid_z_shift::transform_bin_coordinates(Bin& b) const
39{
40 b.axial_pos_num() += axial_pos_shift;
41}
42
43void
44SymmetryOperation_PET_CartesianGrid_z_shift::transform_view_segment_indices(ViewSegmentNumbers& vs) const
45{}
46
47void
48SymmetryOperation_PET_CartesianGrid_z_shift::transform_image_coordinates(BasicCoordinate<3, int>& c) const
49{
50 c[1] += z_shift;
51}
52
54
55void
56SymmetryOperation_PET_CartesianGrid_swap_xmx_zq::transform_bin_coordinates(Bin& b) const
57{
58 b.axial_pos_num() += axial_pos_shift;
59 b.view_num() = view180 - b.view_num();
60 assert(0 <= b.view_num());
61 assert(b.view_num() < view180);
62}
63void
64SymmetryOperation_PET_CartesianGrid_swap_xmx_zq::transform_view_segment_indices(ViewSegmentNumbers& vs) const
65{
66 vs.view_num() = view180 - vs.view_num();
67 assert(0 <= vs.view_num());
68 assert(vs.view_num() < view180);
69}
70
71void
72SymmetryOperation_PET_CartesianGrid_swap_xmx_zq::transform_image_coordinates(BasicCoordinate<3, int>& c) const
73{
74 c[3] = -c[3];
75 c[1] = q - c[1] + z_shift;
76}
77
79
80void
81SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq::transform_bin_coordinates(Bin& b) const
82{
83 b.axial_pos_num() += axial_pos_shift;
84 b.segment_num() *= -1;
85 b.view_num() += view180 / 2;
86 assert(0 <= b.view_num());
87 assert(b.view_num() < view180);
88}
89
90void
91SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq::transform_view_segment_indices(ViewSegmentNumbers& vs) const
92{
93 vs.segment_num() *= -1;
94 vs.view_num() += view180 / 2;
95 assert(0 <= vs.view_num());
96 assert(vs.view_num() < view180);
97}
98
99void
100SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq::transform_image_coordinates(BasicCoordinate<3, int>& c) const
101{
102 const int tmp = c[3];
103 c[3] = -c[2];
104 c[2] = tmp;
105 c[1] = q - c[1] + z_shift;
106}
107
109
110void
111SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq::transform_bin_coordinates(Bin& b) const
112{
113 b.axial_pos_num() += axial_pos_shift;
114 b.view_num() = view180 / 2 - b.view_num();
115 assert(0 <= b.view_num());
116 assert(b.view_num() < view180);
117}
118void
119SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq::transform_view_segment_indices(ViewSegmentNumbers& vs) const
120{
121 vs.view_num() = view180 / 2 - vs.view_num();
122 assert(0 <= vs.view_num());
123 assert(vs.view_num() < view180);
124}
125
126void
127SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq::transform_image_coordinates(BasicCoordinate<3, int>& c) const
128{
129 const int tmp = c[3];
130 c[3] = c[2];
131 c[2] = tmp;
132 c[1] = q - c[1] + z_shift;
133}
134
136
137void
138SymmetryOperation_PET_CartesianGrid_swap_xmy_yx::transform_bin_coordinates(Bin& b) const
139{
140 b.axial_pos_num() += axial_pos_shift;
141 if (b.view_num() < view180 / 2)
142 {
143 b.view_num() += view180 / 2;
144 }
145 else
146 {
147 b.segment_num() *= -1;
148 b.view_num() -= view180 / 2;
149 b.tangential_pos_num() *= -1;
150 }
151 assert(0 <= b.view_num());
152 assert(b.view_num() < view180);
153}
154
155void
156SymmetryOperation_PET_CartesianGrid_swap_xmy_yx::transform_view_segment_indices(ViewSegmentNumbers& vs) const
157{
158 if (vs.view_num() < view180 / 2)
159 {
160 vs.view_num() += view180 / 2;
161 }
162 else
163 {
164 vs.segment_num() *= -1;
165 vs.view_num() -= view180 / 2;
166 }
167 assert(0 <= vs.view_num());
168 assert(vs.view_num() < view180);
169}
170
171void
172SymmetryOperation_PET_CartesianGrid_swap_xmy_yx::transform_image_coordinates(BasicCoordinate<3, int>& c) const
173{
174 const int tmp = c[3];
175 c[3] = -c[2];
176 c[2] = tmp;
177 c[1] += z_shift;
178}
179
181void
182SymmetryOperation_PET_CartesianGrid_swap_xy_yx::transform_bin_coordinates(Bin& b) const
183{
184 b.axial_pos_num() += axial_pos_shift;
185 if (b.view_num() <= view180 / 2)
186 {
187 b.segment_num() *= -1;
188 b.view_num() = view180 / 2 - b.view_num();
189 }
190 else
191 {
192 b.view_num() = 3 * view180 / 2 - b.view_num();
193 b.tangential_pos_num() *= -1;
194 }
195 assert(0 <= b.view_num());
196 assert(b.view_num() < view180);
197}
198void
199SymmetryOperation_PET_CartesianGrid_swap_xy_yx::transform_view_segment_indices(ViewSegmentNumbers& vs) const
200{
201 if (vs.view_num() <= view180 / 2)
202 {
203 vs.segment_num() *= -1;
204 vs.view_num() = view180 / 2 - vs.view_num();
205 }
206 else
207 {
208 vs.view_num() = 3 * view180 / 2 - vs.view_num();
209 }
210 assert(0 <= vs.view_num());
211 assert(vs.view_num() < view180);
212}
213
214void
215SymmetryOperation_PET_CartesianGrid_swap_xy_yx::transform_image_coordinates(BasicCoordinate<3, int>& c) const
216{
217 const int tmp = c[3];
218 c[3] = c[2];
219 c[2] = tmp;
220 c[1] += z_shift;
221}
222
224
225void
226SymmetryOperation_PET_CartesianGrid_swap_xmx::transform_bin_coordinates(Bin& b) const
227{
228 b.axial_pos_num() += axial_pos_shift;
229 if (b.view_num() != 0)
230 {
231 b.segment_num() *= -1;
232 b.view_num() = view180 - b.view_num();
233 }
234 else
235 {
236 b.tangential_pos_num() *= -1;
237 }
238 assert(0 <= b.view_num());
239 assert(b.view_num() < view180);
240}
241
242void
243SymmetryOperation_PET_CartesianGrid_swap_xmx::transform_view_segment_indices(ViewSegmentNumbers& vs) const
244{
245 if (vs.view_num() != 0)
246 {
247 vs.segment_num() *= -1;
248 vs.view_num() = view180 - vs.view_num();
249 }
250 else
251 {}
252 assert(0 <= vs.view_num());
253 assert(vs.view_num() < view180);
254}
255
256void
257SymmetryOperation_PET_CartesianGrid_swap_xmx::transform_image_coordinates(BasicCoordinate<3, int>& c) const
258{
259 c[3] = -c[3];
260 c[1] += z_shift;
261}
262
264
265void
266SymmetryOperation_PET_CartesianGrid_swap_ymy::transform_bin_coordinates(Bin& b) const
267{
268 b.axial_pos_num() += axial_pos_shift;
269 if (b.view_num() != 0)
270 {
271 b.view_num() = view180 - b.view_num();
272 b.tangential_pos_num() *= -1;
273 }
274 else
275 {
276 b.segment_num() *= -1;
277 }
278 assert(0 <= b.view_num());
279 assert(b.view_num() < view180);
280}
281void
282SymmetryOperation_PET_CartesianGrid_swap_ymy::transform_view_segment_indices(ViewSegmentNumbers& vs) const
283{
284 if (vs.view_num() != 0)
285 {
286 vs.view_num() = view180 - vs.view_num();
287 }
288 else
289 {
290 vs.segment_num() *= -1;
291 }
292 assert(0 <= vs.view_num());
293 assert(vs.view_num() < view180);
294}
295
296void
297SymmetryOperation_PET_CartesianGrid_swap_ymy::transform_image_coordinates(BasicCoordinate<3, int>& c) const
298{
299 c[2] = -c[2];
300 c[1] += z_shift;
301}
302
304
305void
306SymmetryOperation_PET_CartesianGrid_swap_zq::transform_bin_coordinates(Bin& b) const
307{
308 b.axial_pos_num() += axial_pos_shift;
309 b.segment_num() *= -1;
310}
311
312void
313SymmetryOperation_PET_CartesianGrid_swap_zq::transform_view_segment_indices(ViewSegmentNumbers& vs) const
314{
315 vs.segment_num() *= -1;
316}
317
318void
319SymmetryOperation_PET_CartesianGrid_swap_zq::transform_image_coordinates(BasicCoordinate<3, int>& c) const
320{
321 c[1] = q - c[1] + z_shift;
322}
323
325
326void
327SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq::transform_bin_coordinates(Bin& b) const
328{
329 b.axial_pos_num() += axial_pos_shift;
330 b.tangential_pos_num() *= -1;
331 b.timing_pos_num() *= -1;
332}
333
334void
335SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq::transform_view_segment_indices(ViewSegmentNumbers& vs) const
336{}
337
338void
339SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq::transform_image_coordinates(BasicCoordinate<3, int>& c) const
340{
341 c[3] = -c[3];
342 c[2] = -c[2];
343 c[1] = q - c[1] + z_shift;
344}
345
347
348void
349SymmetryOperation_PET_CartesianGrid_swap_xy_ymx_zq::transform_bin_coordinates(Bin& b) const
350{
351 b.axial_pos_num() += axial_pos_shift;
352 if (b.view_num() < view180 / 2)
353 {
354 b.view_num() += view180 / 2;
355 b.tangential_pos_num() *= -1;
356 }
357 else
358 {
359 b.segment_num() *= -1;
360 b.view_num() -= view180 / 2;
361 }
362 assert(0 <= b.view_num());
363 assert(b.view_num() < view180);
364}
365
366void
367SymmetryOperation_PET_CartesianGrid_swap_xy_ymx_zq::transform_view_segment_indices(ViewSegmentNumbers& vs) const
368{
369 if (vs.view_num() < view180 / 2)
370 {
371 vs.view_num() += view180 / 2;
372 }
373 else
374 {
375 vs.segment_num() *= -1;
376 vs.view_num() -= view180 / 2;
377 }
378 assert(0 <= vs.view_num());
379 assert(vs.view_num() < view180);
380}
381
382void
383SymmetryOperation_PET_CartesianGrid_swap_xy_ymx_zq::transform_image_coordinates(BasicCoordinate<3, int>& c) const
384{
385 const int tmp = c[3];
386 c[3] = c[2];
387 c[2] = -tmp;
388 c[1] = q - c[1] + z_shift;
389}
390
392
393void
394SymmetryOperation_PET_CartesianGrid_swap_xy_ymx::transform_bin_coordinates(Bin& b) const
395{
396 b.axial_pos_num() += axial_pos_shift;
397 if (b.view_num() < view180 / 2)
398 {
399 b.segment_num() *= -1;
400 b.view_num() += view180 / 2;
401 b.tangential_pos_num() *= -1;
402 }
403 else
404 {
405 b.view_num() -= view180 / 2;
406 }
407 assert(0 <= b.view_num());
408 assert(b.view_num() < view180);
409}
410void
411SymmetryOperation_PET_CartesianGrid_swap_xy_ymx::transform_view_segment_indices(ViewSegmentNumbers& vs) const
412{
413 if (vs.view_num() < view180 / 2)
414 {
415 vs.segment_num() *= -1;
416 vs.view_num() += view180 / 2;
417 }
418 else
419 {
420 vs.view_num() -= view180 / 2;
421 }
422 assert(0 <= vs.view_num());
423 assert(vs.view_num() < view180);
424}
425
426void
427SymmetryOperation_PET_CartesianGrid_swap_xy_ymx::transform_image_coordinates(BasicCoordinate<3, int>& c) const
428{
429 const int tmp = c[3];
430 c[3] = c[2];
431 c[2] = -tmp;
432 c[1] += z_shift;
433}
434
436
437void
438SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx::transform_bin_coordinates(Bin& b) const
439{
440 b.axial_pos_num() += axial_pos_shift;
441 if (b.view_num() <= view180 / 2)
442 {
443 b.view_num() = view180 / 2 - b.view_num();
444 b.tangential_pos_num() *= -1;
445 }
446 else
447 {
448 b.segment_num() *= -1;
449 b.view_num() = 3 * view180 / 2 - b.view_num();
450 }
451 assert(0 <= b.view_num());
452 assert(b.view_num() < view180);
453}
454
455void
456SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx::transform_view_segment_indices(ViewSegmentNumbers& vs) const
457{
458 if (vs.view_num() <= view180 / 2)
459 {
460 vs.view_num() = view180 / 2 - vs.view_num();
461 }
462 else
463 {
464 vs.segment_num() *= -1;
465 vs.view_num() = 3 * view180 / 2 - vs.view_num();
466 }
467 assert(0 <= vs.view_num());
468 assert(vs.view_num() < view180);
469}
470
471void
472SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx::transform_image_coordinates(BasicCoordinate<3, int>& c) const
473{
474 const int tmp = c[3];
475 c[3] = -c[2];
476 c[2] = -tmp;
477 c[1] += z_shift;
478}
479
481
482void
483SymmetryOperation_PET_CartesianGrid_swap_ymy_zq::transform_bin_coordinates(Bin& b) const
484{
485 b.axial_pos_num() += axial_pos_shift;
486 b.segment_num() *= -1;
487 b.view_num() = view180 - b.view_num();
488 b.tangential_pos_num() *= -1;
489 assert(0 <= b.view_num());
490 assert(b.view_num() < view180);
491}
492
493void
494SymmetryOperation_PET_CartesianGrid_swap_ymy_zq::transform_view_segment_indices(ViewSegmentNumbers& vs) const
495{
496 vs.segment_num() *= -1;
497 vs.view_num() = view180 - vs.view_num();
498 assert(0 <= vs.view_num());
499 assert(vs.view_num() < view180);
500}
501
502void
503SymmetryOperation_PET_CartesianGrid_swap_ymy_zq::transform_image_coordinates(BasicCoordinate<3, int>& c) const
504{
505 c[2] = -c[2];
506 c[1] = q - c[1] + z_shift;
507}
508
510
511void
512SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy::transform_bin_coordinates(Bin& b) const
513{
514 b.axial_pos_num() += axial_pos_shift;
515 b.segment_num() *= -1;
516 b.tangential_pos_num() *= -1;
517 b.timing_pos_num() *= -1;
518}
519void
520SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy::transform_view_segment_indices(ViewSegmentNumbers& vs) const
521{
522 vs.segment_num() *= -1;
523}
524
525void
526SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy::transform_image_coordinates(BasicCoordinate<3, int>& c) const
527{
528 c[3] = -c[3];
529 c[2] = -c[2];
530 c[1] += z_shift;
531}
532
534
535void
536SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx_zq::transform_bin_coordinates(Bin& b) const
537{
538 b.axial_pos_num() += axial_pos_shift;
539 b.segment_num() *= -1;
540 b.view_num() = view180 / 2 - b.view_num();
541 b.tangential_pos_num() *= -1;
542 assert(0 <= b.view_num());
543 assert(b.view_num() < view180);
544}
545
546void
547SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx_zq::transform_view_segment_indices(ViewSegmentNumbers& vs) const
548{
549 vs.segment_num() *= -1;
550 vs.view_num() = view180 / 2 - vs.view_num();
551 assert(0 <= vs.view_num());
552 assert(vs.view_num() < view180);
553}
554
555void
556SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx_zq::transform_image_coordinates(BasicCoordinate<3, int>& c) const
557{
558 const int tmp = c[3];
559 c[3] = -c[2];
560 c[2] = -tmp;
561 c[1] = q - c[1] + z_shift;
562}
563
564END_NAMESPACE_STIR
This file declares class stir::BasicCoordinate and some functions acting on stir::BasicCoordinate obj...
Declaration of class stir::Bin.
Definition of class stir::ViewSegmentNumbers, alias to stir::ViewgramIndices.