23const DiscretisedDensityOnCartesianGrid<3,float> *
24DataSymmetriesForDensels_PET_CartesianGrid::
25cartesian_grid_info_ptr()
const
28 return static_cast<const DiscretisedDensityOnCartesianGrid<3,float> *
>
29 (image_info_ptr.get());
36 return static_cast<float>(num_planes_per_axial_pos[segment_num]);
42 return static_cast<float>(num_planes_per_scanner_ring);
46DataSymmetriesForDensels_PET_CartesianGrid::get_axial_pos_to_z_offset(
const int segment_num)
const
48 return axial_pos_to_z_offset[segment_num];
52DataSymmetriesForDensels_PET_CartesianGrid::find_sym_op_general_densel(
const int z,
const int y,
const int x)
const
54 const int z_shift = z - (z % num_independent_planes);
57 const int axial_pos_num_shift = z_shift / num_independent_planes;
58 const int view180 = num_views;
63 return new TrivialSymmetryOperation();
65 return new SymmetryOperation_PET_CartesianGrid_z_shift(axial_pos_num_shift, z_shift);
67 else if (x >= 0 && y > x)
68 return new SymmetryOperation_PET_CartesianGrid_swap_xy_yx(view180, axial_pos_num_shift, z_shift);
69 else if (x < 0 && y > -x)
70 return new SymmetryOperation_PET_CartesianGrid_swap_xmy_yx(view180, axial_pos_num_shift, z_shift);
71 else if (x < 0 && y >= 0)
74 return new SymmetryOperation_PET_CartesianGrid_swap_xmx(view180, axial_pos_num_shift, z_shift);
76 else if (x < 0 && y <= 0 && -y <= -x)
77 return new SymmetryOperation_PET_CartesianGrid_swap_xmx_ymy(view180, axial_pos_num_shift, z_shift);
78 else if (x <= 0 && y < 0)
81 return new SymmetryOperation_PET_CartesianGrid_swap_xmy_ymx(view180, axial_pos_num_shift, z_shift);
83 else if (x > 0 && -y > x)
84 return new SymmetryOperation_PET_CartesianGrid_swap_xy_ymx(view180, axial_pos_num_shift, z_shift);
87 assert(x > 0 && y < 0 && -y <= x);
88 return new SymmetryOperation_PET_CartesianGrid_swap_ymy(view180, axial_pos_num_shift, z_shift);
98 if (z == z % num_independent_planes && x >= 0 && y >= 0 && y <= x)
100 z = z % num_independent_planes;
111unique_ptr<SymmetryOperation>
114 unique_ptr<SymmetryOperation> sym_op(find_sym_op_general_densel(c[1], c[2], c[3]));
116 const Densel copy_original = c;
121 sym_op->transform_image_coordinates(copy);
122 assert(copy_original == copy);
135 if (abs(b[3]) != abs(b[2]))
138 num *=
static_cast<int>(ceil(
static_cast<float>(num_planes) / num_independent_planes));
156 const int basic_z = d[1];
158 for (
int z = basic_z; z < num_planes; z += num_independent_planes)
159 v.push_back(
Densel(z, y, x));
163 for (
int z = basic_z; z < num_planes; z += num_independent_planes)
164 v.push_back(
Densel(z, y, -x));
168 for (
int z = basic_z; z < num_planes; z += num_independent_planes)
169 v.push_back(
Densel(z, -y, x));
173 for (
int z = basic_z; z < num_planes; z += num_independent_planes)
174 v.push_back(
Densel(z, -y, -x));
179 for (
int z = basic_z; z < num_planes; z += num_independent_planes)
180 v.push_back(
Densel(z, x, y));
184 for (
int z = basic_z; z < num_planes; z += num_independent_planes)
185 v.push_back(
Densel(z, x, -y));
189 for (
int z = basic_z; z < num_planes; z += num_independent_planes)
190 v.push_back(
Densel(z, -x, y));
194 for (
int z = basic_z; z < num_planes; z += num_independent_planes)
195 v.push_back(
Densel(z, -x, -y));
Declaration of class stir::ProjDataInfoCylindrical.
Declaration of all symmetry classes for PET (cylindrical) scanners and cartesian images.
unique_ptr< SymmetryOperation > find_symmetry_operation_from_basic_densel(Densel &) const override
given an arbitrary Densel 'b', find the basic Densel
Definition DataSymmetriesForDensels_PET_CartesianGrid.inl:112
float get_num_planes_per_axial_pos(const int segment_num) const
find correspondence between axial_pos_num and image coordinates
Definition DataSymmetriesForDensels_PET_CartesianGrid.inl:34
bool find_basic_densel(Densel &b) const override
given an arbitrary Densel 'b', find the basic Densel
Definition DataSymmetriesForDensels_PET_CartesianGrid.inl:93
void get_related_densels(std::vector< Densel > &, const Densel &b) const override
fills in a vector with all the Densels that are related to 'b' (including itself)
Definition DataSymmetriesForDensels_PET_CartesianGrid.inl:143
int num_related_densels(const Densel &b) const override
returns the number of Densels related to 'b'
Definition DataSymmetriesForDensels_PET_CartesianGrid.inl:128
float get_num_planes_per_scanner_ring() const
find out how many image planes there are for every scanner ring
Definition DataSymmetriesForDensels_PET_CartesianGrid.inl:40
Coordinate3D< int > Densel
a typedef used for an element of a DiscretisedDensity
Definition Densel.h:36