31#include "stir/ProjDataInfoGeneric.h"
38const DiscretisedDensityOnCartesianGrid<3,float> *
39DataSymmetriesForBins_PET_CartesianGrid::
40cartesian_grid_info_ptr()
const
43 return static_cast<const DiscretisedDensityOnCartesianGrid<3,float> *
>
44 (image_info_ptr.get());
51 return static_cast<float>(num_planes_per_axial_pos[segment_num]);
57 return static_cast<float>(num_planes_per_scanner_ring);
61DataSymmetriesForBins_PET_CartesianGrid::get_axial_pos_to_z_offset(
const int segment_num)
const
63 return axial_pos_to_z_offset[segment_num];
67DataSymmetriesForBins_PET_CartesianGrid::find_transform_z(
const int segment_num,
const int axial_pos_num)
const
69 const float delta = this->deltas[segment_num];
72 if (proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"Cylindrical")
79 const float transform_z_float = (2 * num_planes_per_axial_pos[segment_num] * (axial_pos_num)
80 + num_planes_per_scanner_ring * delta + 2 * axial_pos_to_z_offset[segment_num]);
82 transform_z = (int)floor(transform_z_float + 0.5);
83 assert(fabs(transform_z - transform_z_float) < 10E-4);
87 else if (proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"BlocksOnCylindrical")
94 const float transform_z_float = (2 * num_planes_per_axial_pos[segment_num] * (axial_pos_num)
95 + num_planes_per_scanner_ring * delta + 2 * axial_pos_to_z_offset[segment_num]);
97 transform_z = (int)floor(transform_z_float + 0.5);
98 assert(fabs(transform_z - transform_z_float) < 10E-4);
108 const float transform_z_float = (2 * num_planes_per_axial_pos[segment_num] * (axial_pos_num)
109 + num_planes_per_scanner_ring * delta + 2 * axial_pos_to_z_offset[segment_num]);
111 int transform_z = (int)floor(transform_z_float + 0.5);
112 assert(fabs(transform_z - transform_z_float) < 10E-4);
121DataSymmetriesForBins_PET_CartesianGrid::find_sym_op_bin0(
int segment_num,
int view_num,
int axial_pos_num)
const
124 if (proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"Cylindrical")
127 const int transform_z = find_transform_z(abs(segment_num), do_symmetry_shift_z ? 0 : axial_pos_num);
130 const int axial_pos_shift = do_symmetry_shift_z ? axial_pos_num : 0;
132 const int z_shift = do_symmetry_shift_z ? num_planes_per_axial_pos[segment_num] * axial_pos_num : 0;
134 const int view180 = num_views;
137 assert(!do_symmetry_180degrees_min_phi || view_num >= 0);
138 assert(!do_symmetry_180degrees_min_phi || view_num < num_views);
145 const int view135 = view180 / 4 * 3;
146 const int view90 = view180 / 2;
147 const int view45 = view180 / 4;
149 if (do_symmetry_90degrees_min_phi && view_num > view90 && view_num <= view135)
151 if (!do_symmetry_swap_segment || segment_num >= 0)
152 return new SymmetryOperation_PET_CartesianGrid_swap_xmy_yx(view180, axial_pos_shift, z_shift);
154 return new SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq(
155 view180, axial_pos_shift, z_shift, transform_z);
157 else if (do_symmetry_90degrees_min_phi && view_num > view45 && view_num <= view90)
159 if (!do_symmetry_swap_segment || segment_num >= 0)
160 return new SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq(view180, axial_pos_shift, z_shift, transform_z);
162 return new SymmetryOperation_PET_CartesianGrid_swap_xy_yx(
163 view180, axial_pos_shift, z_shift);
165 else if (do_symmetry_180degrees_min_phi && view_num > view90 )
167 if (!do_symmetry_swap_segment || segment_num >= 0)
168 return new SymmetryOperation_PET_CartesianGrid_swap_xmx_zq(view180, axial_pos_shift, z_shift, transform_z);
170 return new SymmetryOperation_PET_CartesianGrid_swap_xmx(view180, axial_pos_shift, z_shift);
174 assert(!do_symmetry_90degrees_min_phi || (view_num >= view0 && view_num <= view45));
175 assert(!do_symmetry_180degrees_min_phi || (view_num >= view0 && view_num <= view90));
176 if (do_symmetry_swap_segment && segment_num < 0)
177 return new SymmetryOperation_PET_CartesianGrid_swap_zq(view180, axial_pos_shift, z_shift, transform_z);
181 return new TrivialSymmetryOperation();
183 return new SymmetryOperation_PET_CartesianGrid_z_shift(axial_pos_shift, z_shift);
188 if (proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"BlocksOnCylindrical")
190 if (do_symmetry_90degrees_min_phi || do_symmetry_swap_segment || do_symmetry_swap_s || do_symmetry_180degrees_min_phi)
192 warning(
"Currently, no symmetry is implemented for block geometry.\n");
193 return new TrivialSymmetryOperation();
196 if (do_symmetry_shift_z)
198 Bin basic_bin(segment_num, view_num, axial_pos_num, 0);
199 find_basic_bin(basic_bin);
200 const int z_shift = num_planes_per_axial_pos[segment_num] * (axial_pos_num - basic_bin.axial_pos_num());
203 return new TrivialSymmetryOperation();
205 return new SymmetryOperation_PET_CartesianGrid_z_shift(axial_pos_num, z_shift);
208 if (!do_symmetry_90degrees_min_phi && !do_symmetry_swap_segment && !do_symmetry_swap_s && !do_symmetry_180degrees_min_phi
209 && !do_symmetry_shift_z)
211 return new TrivialSymmetryOperation();
214 if (proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"Generic")
217 return new TrivialSymmetryOperation();
219 return new TrivialSymmetryOperation();
224DataSymmetriesForBins_PET_CartesianGrid::find_sym_op_general_bin(
int s,
int segment_num,
int view_num,
int axial_pos_num)
const
227 if (proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"Cylindrical")
230 const int transform_z = find_transform_z(abs(segment_num), do_symmetry_shift_z ? 0 : axial_pos_num);
233 const int axial_pos_shift = do_symmetry_shift_z ? axial_pos_num : 0;
235 const int z_shift = do_symmetry_shift_z ? num_planes_per_axial_pos[segment_num] * axial_pos_num : 0;
238 assert(!do_symmetry_180degrees_min_phi || view_num >= 0);
239 assert(!do_symmetry_180degrees_min_phi || view_num < num_views);
241 const int view180 = num_views;
248 const int view135 = view180 / 4 * 3;
249 const int view90 = view180 / 2;
250 const int view45 = view180 / 4;
252 if (do_symmetry_90degrees_min_phi && view_num > view90 && view_num <= view135)
254 if (!do_symmetry_swap_segment || segment_num > 0)
256 if (!do_symmetry_swap_s || s > 0)
257 return new SymmetryOperation_PET_CartesianGrid_swap_xmy_yx(view180, axial_pos_shift, z_shift);
259 return new SymmetryOperation_PET_CartesianGrid_swap_xy_ymx_zq(
260 view180, axial_pos_shift, z_shift, transform_z);
266 if (!do_symmetry_swap_s || s > 0)
267 return new SymmetryOperation_PET_CartesianGrid_swap_xmy_yx_zq(view180, axial_pos_shift, z_shift, transform_z);
269 return new SymmetryOperation_PET_CartesianGrid_swap_xy_ymx(view180, axial_pos_shift, z_shift);
273 if (!do_symmetry_swap_s || s > 0)
274 return new SymmetryOperation_PET_CartesianGrid_swap_xmy_yx(view180, axial_pos_shift, z_shift);
276 return new SymmetryOperation_PET_CartesianGrid_swap_xy_ymx(view180, axial_pos_shift, z_shift);
279 else if (do_symmetry_90degrees_min_phi && view_num > view45 && view_num <= view90)
281 if (!do_symmetry_swap_segment || segment_num > 0)
283 if (!do_symmetry_swap_s || s > 0)
284 return new SymmetryOperation_PET_CartesianGrid_swap_xy_yx_zq(view180, axial_pos_shift, z_shift, transform_z);
286 return new SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx(view180, axial_pos_shift, z_shift);
288 else if (segment_num < 0)
290 if (!do_symmetry_swap_s || s > 0)
291 return new SymmetryOperation_PET_CartesianGrid_swap_xy_yx(view180, axial_pos_shift, z_shift);
293 return new SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx_zq(view180, axial_pos_shift, z_shift, transform_z);
297 if (!do_symmetry_swap_s || s > 0)
298 return new SymmetryOperation_PET_CartesianGrid_swap_xy_yx(view180, axial_pos_shift, z_shift);
300 return new SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx(view180, axial_pos_shift, z_shift);
303 else if (do_symmetry_180degrees_min_phi
304 && view_num > view90 )
306 if (!do_symmetry_swap_segment || segment_num > 0)
308 if (!do_symmetry_swap_s || s > 0)
309 return new SymmetryOperation_PET_CartesianGrid_swap_xmx_zq(view180, axial_pos_shift, z_shift, transform_z);
311 return new SymmetryOperation_PET_CartesianGrid_swap_ymy(view180, axial_pos_shift, z_shift);
315 if (!do_symmetry_swap_s || s > 0)
316 return new SymmetryOperation_PET_CartesianGrid_swap_xmx(view180, axial_pos_shift, z_shift);
318 return new SymmetryOperation_PET_CartesianGrid_swap_ymy_zq(view180, axial_pos_shift, z_shift, transform_z);
325 assert(!do_symmetry_90degrees_min_phi || (view_num >= view0 && view_num <= view45));
326 assert(!do_symmetry_180degrees_min_phi || (view_num >= view0 && view_num <= view90));
327 if (!do_symmetry_swap_segment || segment_num > 0)
329 if (do_symmetry_swap_s && s < 0)
330 return new SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy_zq(view180, axial_pos_shift, z_shift, transform_z);
334 return new TrivialSymmetryOperation();
336 return new SymmetryOperation_PET_CartesianGrid_z_shift(axial_pos_shift, z_shift);
339 else if (segment_num < 0)
344 if (do_symmetry_swap_s && s < 0)
345 return new SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy(view180, axial_pos_shift, z_shift);
347 return new SymmetryOperation_PET_CartesianGrid_swap_zq(view180, axial_pos_shift, z_shift, transform_z);
351 if (do_symmetry_swap_s && s < 0)
352 return new SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy(view180, axial_pos_shift, z_shift);
356 return new TrivialSymmetryOperation();
358 return new SymmetryOperation_PET_CartesianGrid_z_shift(axial_pos_shift, z_shift);
365 if (proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"BlocksOnCylindrical")
367 if (do_symmetry_90degrees_min_phi || do_symmetry_swap_segment || do_symmetry_swap_s || do_symmetry_180degrees_min_phi)
369 warning(
"Currently, only symmetry along z is implemented for block geometry.\n");
370 return new TrivialSymmetryOperation();
372 if (do_symmetry_shift_z)
374 Bin basic_bin(segment_num, view_num, axial_pos_num, s);
375 find_basic_bin(basic_bin);
376 const int z_shift = num_planes_per_axial_pos[segment_num] * (axial_pos_num - basic_bin.axial_pos_num());
379 return new TrivialSymmetryOperation();
381 return new SymmetryOperation_PET_CartesianGrid_z_shift(axial_pos_num, z_shift);
383 if (!do_symmetry_90degrees_min_phi && !do_symmetry_swap_segment && !do_symmetry_swap_s && !do_symmetry_180degrees_min_phi
384 && !do_symmetry_shift_z)
386 return new TrivialSymmetryOperation();
389 if (proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"Generic")
392 return new TrivialSymmetryOperation();
395 return new TrivialSymmetryOperation();
403 assert(!do_symmetry_180degrees_min_phi || v_s.
view_num() >= 0);
404 assert(!do_symmetry_180degrees_min_phi || v_s.
view_num() < num_views);
407 const int view90 = num_views >> 1;
408 const int view45 = view90 >> 1;
409 const int view135 = view90 + view45;
411 if (do_symmetry_swap_segment && v_s.
segment_num() < 0)
417 if (do_symmetry_90degrees_min_phi)
437 else if (do_symmetry_180degrees_min_phi)
451 int& segment_num,
int& view_num,
int& axial_pos_num,
int& tangential_pos_num,
int& timing_pos_num)
const
455 if (proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"Cylindrical")
459 change = find_basic_view_segment_numbers(v_s);
461 view_num = v_s.view_num();
462 segment_num = v_s.segment_num();
464 if (do_symmetry_swap_s && tangential_pos_num < 0)
467 tangential_pos_num *= -1;
468 timing_pos_num *= -1;
471 if (do_symmetry_shift_z && axial_pos_num != 0)
481 if (proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"BlocksOnCylindrical")
495 const ProjDataInfoBlocksOnCylindrical* proj_data_info_blk_ptr
496 =
static_cast<const ProjDataInfoBlocksOnCylindrical*
>(proj_data_info_ptr.get());
497 if (do_symmetry_shift_z)
500 proj_data_info_blk_ptr->get_ring_pair_for_segment_axial_pos_num(ring1, ring2, segment_num, axial_pos_num);
504 int axial_crys_diff = ring2 - ring1;
505 int num_axial_crys_per_block = proj_data_info_ptr->get_scanner_ptr()->get_num_axial_crystals_per_block();
506 int axial_blk_diff = ring2 / num_axial_crys_per_block - ring1 / num_axial_crys_per_block;
508 if (axial_crys_diff >= 0)
510 if (axial_crys_diff % num_axial_crys_per_block == 0)
514 ring1 = (ring1 / num_axial_crys_per_block) * num_axial_crys_per_block;
515 ring2 = ring1 + axial_crys_diff;
521 if (axial_blk_diff == axial_crys_diff / num_axial_crys_per_block)
523 ring1 = (ring1 / num_axial_crys_per_block) * num_axial_crys_per_block;
524 ring2 = ring1 + axial_crys_diff;
526 else if (axial_blk_diff > axial_crys_diff / num_axial_crys_per_block)
528 ring1 = (ring1 / num_axial_crys_per_block) * num_axial_crys_per_block + num_axial_crys_per_block - 1;
529 ring2 = ring1 + axial_crys_diff;
533 else if (axial_crys_diff < 0)
535 if (abs(axial_crys_diff) % num_axial_crys_per_block == 0)
539 ring2 = (ring2 / num_axial_crys_per_block) * num_axial_crys_per_block;
540 ring1 = ring2 - axial_crys_diff;
546 if (abs(axial_blk_diff) == abs(axial_crys_diff) / num_axial_crys_per_block)
548 ring2 = (ring2 / num_axial_crys_per_block) * num_axial_crys_per_block;
549 ring1 = ring2 - axial_crys_diff;
551 else if (abs(axial_blk_diff) > abs(axial_crys_diff) / num_axial_crys_per_block)
553 ring2 = (ring2 / num_axial_crys_per_block) * num_axial_crys_per_block + num_axial_crys_per_block - 1;
554 ring1 = ring2 - axial_crys_diff;
559 int segment_num_temp, axial_pos_num_temp;
560 proj_data_info_blk_ptr->get_segment_axial_pos_num_for_ring_pair(segment_num_temp, axial_pos_num_temp, ring1, ring2);
565 if (segment_num_temp != segment_num)
566 error(
"segment number shouldn't change in basic bin when implementing only symmetry in z.\n"
567 "segment_num = %d while segment_num_temp = %d \n",
570 else if (axial_pos_num_temp != axial_pos_num)
572 axial_pos_num = axial_pos_num_temp;
577 if (proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"Generic")
580 if (do_symmetry_shift_z)
583 proj_data_info_gen_ptr->get_ring_pair_for_segment_axial_pos_num(ring1, ring2, segment_num, axial_pos_num);
585 int axial_crys_diff = ring2 - ring1;
586 int num_axial_crys_per_block = proj_data_info_ptr->get_scanner_ptr()->get_num_axial_crystals_per_block();
587 int axial_blk_diff = ring2 / num_axial_crys_per_block - ring1 / num_axial_crys_per_block;
589 if (axial_crys_diff >= 0)
591 if (axial_crys_diff % num_axial_crys_per_block == 0)
595 ring1 = (ring1 / num_axial_crys_per_block) * num_axial_crys_per_block;
596 ring2 = ring1 + axial_crys_diff;
602 if (axial_blk_diff == axial_crys_diff / num_axial_crys_per_block)
604 ring1 = (ring1 / num_axial_crys_per_block) * num_axial_crys_per_block;
605 ring2 = ring1 + axial_crys_diff;
607 else if (axial_blk_diff > axial_crys_diff / num_axial_crys_per_block)
609 ring1 = (ring1 / num_axial_crys_per_block) * num_axial_crys_per_block + num_axial_crys_per_block - 1;
610 ring2 = ring1 + axial_crys_diff;
614 else if (axial_crys_diff < 0)
616 if (abs(axial_crys_diff) % num_axial_crys_per_block == 0)
620 ring2 = (ring2 / num_axial_crys_per_block) * num_axial_crys_per_block;
621 ring1 = ring2 - axial_crys_diff;
627 if (abs(axial_blk_diff) == abs(axial_crys_diff) / num_axial_crys_per_block)
629 ring2 = (ring2 / num_axial_crys_per_block) * num_axial_crys_per_block;
630 ring1 = ring2 - axial_crys_diff;
632 else if (abs(axial_blk_diff) > abs(axial_crys_diff) / num_axial_crys_per_block)
634 ring2 = (ring2 / num_axial_crys_per_block) * num_axial_crys_per_block + num_axial_crys_per_block - 1;
635 ring1 = ring2 - axial_crys_diff;
640 int segment_num_temp, axial_pos_num_temp;
641 proj_data_info_gen_ptr->get_segment_axial_pos_num_for_ring_pair(segment_num_temp, axial_pos_num_temp, ring1, ring2);
643 if (segment_num_temp != segment_num)
644 error(
"segment number shouldn't change in basic bin when implementing only symmetry in z.\n"
645 "segment_num = %d while segment_num_temp = %d \n",
648 else if (axial_pos_num_temp != axial_pos_num)
650 axial_pos_num = axial_pos_num_temp;
665unique_ptr<SymmetryOperation>
668 unique_ptr<SymmetryOperation> sym_op(
679 int num = do_symmetry_180degrees_min_phi && (vs.
view_num() % (num_views / 2)) != 0 ? 2 : 1;
680 if (do_symmetry_90degrees_min_phi && (vs.
view_num() % (num_views / 2)) != num_views / 4)
682 if (do_symmetry_swap_segment && vs.
segment_num() != 0)
694 num = do_symmetry_180degrees_min_phi && (b.
view_num() % (num_views / 2)) != 0 ? 2 : 1;
695 if (do_symmetry_90degrees_min_phi && (b.
view_num() % (num_views / 2)) != num_views / 4)
697 if (do_symmetry_swap_segment && b.
segment_num() != 0)
703 if (do_symmetry_shift_z)
708 if (
proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"BlocksOnCylindrical")
710 const ProjDataInfoBlocksOnCylindrical* proj_data_info_blk_ptr
712 if (do_symmetry_shift_z)
716 int axial_crys_diff = ring1 - ring2;
717 int num_axial_crys_per_block =
proj_data_info_ptr->get_scanner_ptr()->get_num_axial_crystals_per_block();
718 int axial_blk_diff = ring1 / num_axial_crys_per_block - ring2 / num_axial_crys_per_block;
720 if (axial_blk_diff == axial_crys_diff / num_axial_crys_per_block)
722 num = num_axial_crys_per_block - abs(axial_crys_diff) % num_axial_crys_per_block;
724 else if (axial_blk_diff > axial_crys_diff / num_axial_crys_per_block)
726 num = abs(axial_crys_diff) % num_axial_crys_per_block;
742 const int min_axial_pos_num,
743 const int max_axial_pos_num,
744 const int min_tangential_pos_num,
745 const int max_tangential_pos_num)
const
750 for (
int axial_pos_num = do_symmetry_shift_z ? min_axial_pos_num : b.
axial_pos_num();
751 axial_pos_num <= (do_symmetry_shift_z ? max_axial_pos_num : b.
axial_pos_num());
764 if (
proj_data_info_ptr->get_scanner_ptr()->get_scanner_geometry() ==
"BlocksOnCylindrical")
766 for (
int axial_pos_num = do_symmetry_shift_z ? min_axial_pos_num : b.
axial_pos_num();
767 axial_pos_num <= (do_symmetry_shift_z ? max_axial_pos_num : b.
axial_pos_num());
776 if (basic_bin == bin_temp)
783 for (
int axial_pos_num = do_symmetry_shift_z ? min_axial_pos_num : b.
axial_pos_num();
784 axial_pos_num <= (do_symmetry_shift_z ? max_axial_pos_num : b.
axial_pos_num());
793 if (basic_bin == bin_temp)
814 const bool symz = do_symmetry_swap_segment && (segment_num != 0);
824 if (do_symmetry_180degrees_min_phi && do_symmetry_90degrees_min_phi && (view_num % (num_views / 2)) != num_views / 4)
826 const int related_view_num = view_num < num_views / 2 ? view_num + num_views / 2 : view_num - num_views / 2;
832 if (do_symmetry_180degrees_min_phi && (view_num % (num_views / 2)) != 0)
838 if (do_symmetry_90degrees_min_phi && (view_num % (num_views / 4)) != 0)
842 const int related_view_num = (num_views / 2 - view_num + num_views) % num_views;
Declaration of class stir::ProjDataInfoBlocksOnCylindrical.
Declaration of all symmetry classes for PET (cylindrical) scanners and cartesian images.
A class for storing coordinates and value of a single projection bin.
Definition Bin.h:49
int tangential_pos_num() const
get tangential position number
Definition Bin.inl:76
int axial_pos_num() const
get axial position number
Definition Bin.inl:70
void get_related_bins_factorised(std::vector< AxTangPosNumbers > &, const Bin &b, const int min_axial_pos_num, const int max_axial_pos_num, const int min_tangential_pos_num, const int max_tangential_pos_num) const override
fills in a vector with the axial and tangential position numbers related to this bin
Definition DataSymmetriesForBins_PET_CartesianGrid.inl:740
float get_num_planes_per_axial_pos(const int segment_num) const
find correspondence between axial_pos_num and image coordinates
Definition DataSymmetriesForBins_PET_CartesianGrid.inl:49
float get_num_planes_per_scanner_ring() const
find out how many image planes there are for every scanner ring
Definition DataSymmetriesForBins_PET_CartesianGrid.inl:55
void get_related_view_segment_numbers(std::vector< ViewSegmentNumbers > &rel_vs, const ViewSegmentNumbers &vs) const override
fills in a vector with all the view/segments that are related to 'v_s' (including itself)
Definition DataSymmetriesForBins_PET_CartesianGrid.inl:801
int num_related_view_segment_numbers(const ViewSegmentNumbers &vs) const override
returns the number of view_segment_numbers related to 'v_s'
Definition DataSymmetriesForBins_PET_CartesianGrid.inl:677
bool find_basic_view_segment_numbers(ViewSegmentNumbers &v_s) const override
given an arbitrary view/segment, find the basic view/segment
Definition DataSymmetriesForBins_PET_CartesianGrid.inl:399
unique_ptr< SymmetryOperation > find_symmetry_operation_from_basic_bin(Bin &) const override
given an arbitrary bin 'b', find the basic bin and the corresponding symmetry operation
Definition DataSymmetriesForBins_PET_CartesianGrid.inl:666
bool find_basic_bin(Bin &b) const override
given an arbitrary bin 'b', find the basic bin
Definition DataSymmetriesForBins_PET_CartesianGrid.inl:659
int num_related_bins(const Bin &b) const override
returns the number of bins related to 'b'
Definition DataSymmetriesForBins_PET_CartesianGrid.inl:688
const shared_ptr< const ProjDataInfo > proj_data_info_ptr
Member storing the info needed by get_related_bins() et al.
Definition DataSymmetriesForBins.h:163
void get_ring_pair_for_segment_axial_pos_num(int &ring1, int &ring2, const int segment_num, const int axial_pos_num) const
Find a ring pair that contributes to a segment and axial position.
Definition ProjDataInfoCylindrical.cxx:336
int segment_num() const
get segment number for const objects
Definition SegmentIndices.inl:32
int timing_pos_num() const
get TOF index for const objects
Definition SegmentIndices.inl:44
alias for ViewgramIndices
Definition ViewSegmentNumbers.h:34
int view_num() const
get view number for const objects
Definition ViewgramIndices.inl:36
Declaration of stir::error()
void warning(const char *const s,...)
Print warning with format string a la printf.
Definition warning.cxx:41
Coordinate2D< int > AxTangPosNumbers
AxTangPosNumbers as a class that provides the 2 remaining coordinates for a Bin, aside from ViewSegme...
Definition DataSymmetriesForBins.h:52
ProjDataInfoGenericNoArcCorr ProjDataInfoGeneric
For backwards compatibility.
Definition ProjDataInfoGenericNoArcCorr.h:175
Declaration of stir::warning()