36const DataSymmetriesForBins*
39 return symmetries_sptr.get();
42const shared_ptr<DataSymmetriesForBins>
45 return symmetries_sptr;
54 probabilities.
erase();
56 if (cache_stores_only_basic_bins)
60 unique_ptr<SymmetryOperation> symm_ptr = symmetries_sptr->find_symmetry_operation_from_basic_bin(basic_bin);
62 probabilities.
set_bin(basic_bin);
73 apply_tof_kernel(probabilities);
79 symm_ptr->transform_proj_matrix_elems_for_one_bin(probabilities);
90 unique_ptr<SymmetryOperation> symm_ptr = symmetries_sptr->find_symmetry_operation_from_basic_bin(basic_bin);
91 probabilities.
set_bin(basic_bin);
103 apply_tof_kernel(probabilities);
107 symm_ptr->transform_proj_matrix_elems_for_one_bin(probabilities);
119 proj_data_info_sptr->get_LOR(lor, probabilities.
get_bin());
128 const float scanner_z_offset = (proj_data_info_sptr->get_scanner_ptr()->get_num_rings() - 1) / 2.0f
129 * proj_data_info_sptr->get_scanner_ptr()->get_ring_spacing();
138 std::size_t max_num_elements;
140 const auto length =
norm(point1 - point2);
141 const auto kernel_width = 8 / r_sqrt2_gauss_sigma;
142 const auto tof_bin_width = proj_data_info_sptr->tof_bin_boundaries_mm[probabilities.
get_bin().
timing_pos_num()].high_lim
144 const auto fraction = (kernel_width + tof_bin_width) / length;
147 max_num_elements = std::size_t(probabilities.
size() * std::min(fraction * 1.2, 1.001));
149 tof_row.reserve(max_num_elements);
151 for (ProjMatrixElemsForOneBin::iterator element_ptr = probabilities.
begin(); element_ptr != probabilities.end(); ++element_ptr)
153 Coordinate3D<int> c(element_ptr->get_coords());
155 const CartesianCoordinate3D<float> voxel_pos_image = image_info_sptr->get_physical_coordinates_for_indices(c);
158 const CartesianCoordinate3D<float> voxel_pos_scanner = voxel_pos_image - coord_system_offset;
161 const float d2 = -inner_product(voxel_pos_scanner - middle, diff_unit_vector);
164 = ((proj_data_info_sptr->tof_bin_boundaries_mm[probabilities.
get_bin().timing_pos_num()].low_lim - d2));
165 const float high_dist
166 = ((proj_data_info_sptr->tof_bin_boundaries_mm[probabilities.
get_bin().timing_pos_num()].high_lim - d2));
168 const auto tof_kernel_value = get_tof_value(low_dist, high_dist);
169 if (tof_kernel_value > 0)
171 if (
auto non_tof_value = element_ptr->get_value())
172 tof_row.push_back(ProjMatrixElemsForOneBin::value_type(c, non_tof_value * tof_kernel_value));
183 probabilities = tof_row;
188ProjMatrixByBin::get_tof_value(
const float d1,
const float d2)
const
190 const float d1_n = d1 * r_sqrt2_gauss_sigma;
191 const float d2_n = d2 * r_sqrt2_gauss_sigma;
193 if ((d1_n >= 4.f && d2_n >= 4.f) || (d1_n <= -4.f && d2_n <= -4.f))
196 return static_cast<float>(0.5 * (erf_interpolation(d2_n) - erf_interpolation(d1_n)));
Declaration of class stir::Succeeded.
Declaration of 2 classes: stir::SymmetryOperation and stir::TrivialSymmetryOperation.
A class for storing coordinates and value of a single projection bin.
Definition Bin.h:49
a templated class for 3-dimensional coordinates.
Definition CartesianCoordinate3D.h:53
A class for LORs.
Definition LORCoordinates.h:296
A class for LORs.
Definition LORCoordinates.h:511
const DataSymmetriesForBins * get_symmetries_ptr() const
get a pointer to an object encoding all symmetries that are used by this ProjMatrixByBin
Definition ProjMatrixByBin.inl:37
const shared_ptr< DataSymmetriesForBins > get_symmetries_sptr() const
get a shared_ptr to an object encoding all symmetries that are used by this ProjMatrixByBin
Definition ProjMatrixByBin.inl:43
void cache_proj_matrix_elems_for_one_bin(const ProjMatrixElemsForOneBin &) const
The method to store data in the cache.
Definition ProjMatrixByBin.cxx:202
virtual void calculate_proj_matrix_elems_for_one_bin(ProjMatrixElemsForOneBin &) const =0
This method needs to be implemented in the derived class.
void get_proj_matrix_elems_for_one_bin(ProjMatrixElemsForOneBin &, const Bin &) const
The main method for getting a row of the matrix.
Definition ProjMatrixByBin.inl:49
Succeeded get_cached_proj_matrix_elems_for_one_bin(ProjMatrixElemsForOneBin &) const
The method that tries to get data from the cache.
Definition ProjMatrixByBin.cxx:221
shared_ptr< const ProjDataInfo > proj_data_info_sptr
We need a local copy of the proj_data_info to get the integration boundaries and RayTracing.
Definition ProjMatrixByBin.h:192
This stores the non-zero projection matrix elements for every 'densel' that contributes to a given bi...
Definition ProjMatrixElemsForOneBin.h:69
size_type size() const
number of non-zero elements
Definition ProjMatrixElemsForOneBin.inl:47
const Bin & get_bin() const
get the bin coordinates corresponding to this row
Definition ProjMatrixElemsForOneBin.inl:29
void set_bin(const Bin &)
and set the bin coordinates
Definition ProjMatrixElemsForOneBin.inl:35
iterator begin()
functions for allowing iterator access
Definition ProjMatrixElemsForOneBin.inl:53
Succeeded check_state() const
check if each voxel occurs only once
Definition ProjMatrixElemsForOneBin.cxx:102
void erase()
reset lor to 0 length
Definition ProjMatrixElemsForOneBin.cxx:57
int timing_pos_num() const
get TOF index for const objects
Definition SegmentIndices.inl:44
double norm(const BasicCoordinate< num_dimensions, coordT > &p1)
compute sqrt(inner_product(p1,p1))
Definition BasicCoordinate.inl:426
A few functions to compute distances between lines etc.