|
STIR 6.4.0
|
Projection data info for data for a scanner with discrete detectors. More...
#include "stir/ProjDataInfoGenericNoArcCorr.h"

Public Types | |
| typedef std::vector< std::pair< int, int > > | RingNumPairs |
| Type used by get_all_ring_pairs_for_segment_axial_pos_num() | |
Public Types inherited from stir::ProjDataInfoCylindrical | |
| typedef std::vector< std::pair< int, int > > | RingNumPairs |
| Type used by get_all_ring_pairs_for_segment_axial_pos_num() | |
Public Member Functions | |
| ProjDataInfoGenericNoArcCorr () | |
| Default constructor (leaves object in ill-defined state) | |
| ProjDataInfoGenericNoArcCorr (const shared_ptr< Scanner > scanner_ptr, const VectorWithOffset< int > &num_axial_pos_per_segment, const VectorWithOffset< int > &min_ring_diff_v, const VectorWithOffset< int > &max_ring_diff_v, const int num_views, const int num_tangential_poss) | |
| Constructor which gets geometry from the scanner. | |
| self_type * | clone () const override |
| Standard trick for a 'virtual copy-constructor'. | |
| bool | operator== (const self_type &) const |
| float | get_s (const Bin &) const override |
| Gets s coordinate in mm. | |
| float | get_tantheta (const Bin &) const override |
| Get tangent of the co-polar angle of the normal to the projection plane. | |
| float | get_phi (const Bin &) const override |
| find phi from correspoding lor | |
| float | get_t (const Bin &) const override |
| Get value of the (roughly) axial coordinate in the projection plane (in mm) | |
| float | get_m (const Bin &) const override |
| Return z-coordinate of the middle of the LOR. | |
| void | get_LOR (LORInAxialAndNoArcCorrSinogramCoordinates< float > &lor, const Bin &bin) const override |
| warning Find lor from cartesian coordinates of detector pair | |
| void | set_azimuthal_angle_offset (const float angle) override |
| currently calls error() unless nothing changes | |
| void | set_azimuthal_angle_sampling (const float angle) override |
| calls error() | |
| void | set_num_views (const int new_num_views) override |
| currently calls error() unless nothing changes | |
| void | set_ring_spacing (float ring_spacing_v) override |
| currently calls error() unless nothing changes | |
| void | set_ring_radii_for_all_views (const VectorWithOffset< float > &new_ring_radius) override |
| calls error() | |
| float | get_ring_spacing () const override |
| return an average ring-spacing (from Scanner) | |
| float | get_sampling_in_t (const Bin &) const override |
Get sampling distance in the t coordinate. | |
| float | get_sampling_in_m (const Bin &) const override |
Get sampling distance in the m coordinate. | |
| float | get_axial_sampling (int segment_num) const override |
| Get the axial sampling (e.g in z_direction) | |
| bool | axial_sampling_is_uniform () const override |
| Return if axial sampling makes sense. | |
| std::string | parameter_info () const override |
| Return a string describing the object. | |
| Bin | get_bin (const LOR< float > &, const double delta_time=0.0) const override |
Public Member Functions inherited from stir::ProjDataInfoCylindricalNoArcCorr | |
| ProjDataInfoCylindricalNoArcCorr () | |
| Default constructor (leaves object in ill-defined state) | |
| ProjDataInfoCylindricalNoArcCorr (const shared_ptr< Scanner > scanner_ptr, const float ring_radius, const float angular_increment, const VectorWithOffset< int > &num_axial_pos_per_segment, const VectorWithOffset< int > &min_ring_diff_v, const VectorWithOffset< int > &max_ring_diff_v, const int num_views, const int num_tangential_poss, const int tof_mash_factor=0) | |
| Constructor completely specifying all parameters. | |
| ProjDataInfoCylindricalNoArcCorr (const shared_ptr< Scanner > scanner_ptr, const VectorWithOffset< int > &num_axial_pos_per_segment, const VectorWithOffset< int > &min_ring_diff_v, const VectorWithOffset< int > &max_ring_diff_v, const int num_views, const int num_tangential_poss, const int tof_mash_factor=0) | |
| Constructor which gets ring_radius and angular_increment from the scanner. | |
| bool | operator== (const self_type &) const |
| float | get_angular_increment () const |
| Gets angular increment (in radians) | |
| virtual Succeeded | find_scanner_coordinates_given_cartesian_coordinates (int &det1, int &det2, int &ring1, int &ring2, const CartesianCoordinate3D< float > &c1, const CartesianCoordinate3D< float > &c2) const |
| void | find_cartesian_coordinates_of_detection (CartesianCoordinate3D< float > &coord_1, CartesianCoordinate3D< float > &coord_2, const Bin &bin) const |
| void | find_bin_given_cartesian_coordinates_of_detection (Bin &bin, const CartesianCoordinate3D< float > &coord_1, const CartesianCoordinate3D< float > &coord_2) const |
| bool | get_view_tangential_pos_num_for_det_num_pair (int &view_num, int &tang_pos_num, const int det1_num, const int det2_num) const |
| This gets view_num and tang_pos_num for a particular detector pair. | |
| void | get_det_num_pair_for_view_tangential_pos_num (int &det1_num, int &det2_num, const int view_num, const int tang_pos_num) const |
| This routine gets det_num1 and det_num2. | |
| Succeeded | get_bin_for_det_pos_pair (Bin &, const DetectionPositionPair<> &) const |
| This gets Bin coordinates for a particular detector pair. | |
| void | get_det_pos_pair_for_bin (DetectionPositionPair<> &, const Bin &) const |
| This routine gets the detector pair corresponding to a bin. | |
| unsigned int | get_num_det_pos_pairs_for_bin (const Bin &, bool ignore_non_spatial_dimensions=true) const |
| This routine returns the number of detector pairs that correspond to a bin. | |
| void | get_all_det_pos_pairs_for_bin (std::vector< DetectionPositionPair<> > &, const Bin &, bool ignore_non_spatial_dimensions=true) const |
| This routine fills a vector with all the detector pairs that correspond to a bin. | |
| void | get_det_pair_for_bin (int &det_num1, int &ring_num1, int &det_num2, int &ring_num2, const Bin &bin) const |
| This routine gets the detector pair corresponding to a bin. | |
Public Member Functions inherited from stir::ProjDataInfoCylindrical | |
| ProjDataInfoCylindrical () | |
| Constructors. | |
| ProjDataInfoCylindrical (const shared_ptr< Scanner > &scanner_ptr, const VectorWithOffset< int > &num_axial_poss_per_segment, const VectorWithOffset< int > &min_ring_diff, const VectorWithOffset< int > &max_ring_diff, const int num_views, const int num_tangential_poss) | |
| Constructor given all the necessary information. | |
| void | set_tof_mash_factor (const int new_num) override |
| The tof mashing factor (for TOF scanners). | |
| virtual float | get_azimuthal_angle_offset () const |
| Get azimuthal angle offset (in radians) | |
| virtual float | get_azimuthal_angle_sampling () const |
| Get the azimuthal sampling (in radians) | |
| float | get_average_ring_difference (int segment_num) const |
| Get average ring difference for the given segment. | |
| int | get_min_ring_difference (int segment_num) const |
| Get minimum ring difference for the given segment. | |
| int | get_max_ring_difference (int segment_num) const |
| Get maximum ring difference for the given segment. | |
| void | set_min_ring_difference (int min_ring_diff_v, int segment_num) |
| Set minimum ring difference. | |
| void | set_max_ring_difference (int max_ring_diff_v, int segment_num) |
| Set maximum ring difference. | |
| void | set_num_axial_poss_per_segment (const VectorWithOffset< int > &num_axial_poss_per_segment) override |
| Set number of axial positions per segment. | |
| void | set_min_axial_pos_num (const int min_ax_pos_num, const int segment_num) override |
| Set minimum axial position number for 1 segment. | |
| void | set_max_axial_pos_num (const int max_ax_pos_num, const int segment_num) override |
| Set maximum axial position number for 1 segment. | |
| void | reduce_segment_range (const int min_segment_num, const int max_segment_num) override |
| Set a new range of segment numbers. | |
| virtual VectorWithOffset< float > | get_ring_radii_for_all_views () const |
| Get detector ring radius for all views. | |
| virtual float | get_ring_radius () const |
| Get detector ring radius. | |
| virtual float | get_ring_radius (const int view_num) const |
| virtual int | get_view_mashing_factor () const |
| Get the mashing factor, i.e. how many 'original' views are combined. | |
| Succeeded | get_segment_num_for_ring_difference (int &segment_num, const int ring_diff) const |
| Find which segment a particular ring difference belongs to. | |
| Succeeded | get_segment_axial_pos_num_for_ring_pair (int &segment_num, int &axial_pos_num, const int ring1, const int ring2) const |
| Find to which segment and axial position a ring pair contributes. | |
| const RingNumPairs & | get_all_ring_pairs_for_segment_axial_pos_num (const int segment_num, const int axial_pos_num) const |
| Find all ring pairs that contribute to a segment and axial position. | |
| unsigned | get_num_ring_pairs_for_segment_axial_pos_num (const int segment_num, const int axial_pos_num) const |
| Find the number of ring pairs that contribute to a segment and axial position. | |
| 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. | |
Public Member Functions inherited from stir::ProjDataInfo | |
| ProjDataInfo () | |
| Construct an empty object. | |
| ProjDataInfo (const shared_ptr< Scanner > &scanner_ptr, const VectorWithOffset< int > &num_axial_pos_per_segment, const int num_views, const int num_tangential_poss) | |
| Constructor setting all relevant info for a ProjDataInfo. | |
| ProjDataInfo (const shared_ptr< Scanner > &scanner_ptr, const VectorWithOffset< int > &num_axial_pos_per_segment, const int num_views, const int num_tangential_poss, const int tof_mash_factor) | |
| Overloaded Contructor with TOF initialisation. | |
| shared_ptr< ProjDataInfo > | create_shared_clone () const |
| Like clone() but return a shared_ptr. | |
| shared_ptr< ProjDataInfo > | create_non_tof_clone () const |
| Similar to create_shared_clone() but returns a non-tof version of ProjDataInfo setting tof mashing factor = 0. | |
| virtual | ~ProjDataInfo () |
| Destructor. | |
| virtual void | set_num_tangential_poss (const int num_tang_poss) |
| Set number of tangential positions. | |
| virtual void | set_min_tangential_pos_num (const int min_tang_poss) |
| Set minimum tangential position number. | |
| virtual void | set_max_tangential_pos_num (const int max_tang_poss) |
| Set maximum tangential position number. | |
| int | get_num_segments () const |
| Get number of segments. | |
| int | get_num_axial_poss (const int segment_num) const |
| Get number of axial positions per segment. | |
| int | get_num_views () const |
| Get number of views. | |
| int | get_num_tangential_poss () const |
| Get number of tangential positions. | |
| int | get_tof_bin (const double delta) const |
| Get number of tof bin for a given time difference. | |
| int | get_num_tof_poss () const |
| Get number of TOF bins. | |
| int | get_min_segment_num () const |
| Get minimum segment number. | |
| int | get_max_segment_num () const |
| Get maximum segment number. | |
| int | get_min_axial_pos_num (const int segment_num) const |
| Get minimum axial position per segmnet. | |
| int | get_max_axial_pos_num (const int segment_num) const |
| Get maximum axial position per segment. | |
| int | get_min_view_num () const |
| Get minimum view number. | |
| int | get_max_view_num () const |
| Get maximum view number. | |
| int | get_min_tangential_pos_num () const |
| Get minimum tangential position number. | |
| int | get_max_tangential_pos_num () const |
| Get maximum tangential position number. | |
| int | get_tof_mash_factor () const |
| Get TOF mash factor. | |
| int | get_min_tof_pos_num () const |
| Get the index of the first TOF position. | |
| int | get_max_tof_pos_num () const |
| Get the index of the last timgin position. | |
| int | get_num_sinograms () const |
| Get the total number of sinograms. | |
| int | get_num_non_tof_sinograms () const |
| Get the number of non-tof sinograms. | |
| std::size_t | size_all () const |
| Get the total size of the data. | |
| bool | is_tof_data () const |
| Determine if TOF data from tof_mash_factor and num_tof_bins. | |
| virtual std::vector< int > | get_original_view_nums () const |
| Return a list of view numbers in the "original" data if subsets are used. | |
| float | get_costheta (const Bin &) const |
| Get cosine of the co-polar angle of the normal to the projection plane. | |
| float | get_k (const Bin &) const |
| Get value of the TOF location along the LOR (in mm) k is a line segment connecting the centers of the two detectors. | |
| double | get_tof_delta_time (const Bin &) const |
| Get the value of the TOF timing difference (in ps) | |
| virtual float | get_sampling_in_s (const Bin &) const |
Get sampling distance in the s coordinate. | |
| float | get_sampling_in_k (const Bin &) const |
Get sampling distance in the k coordinate. | |
| bool | operator== (const ProjDataInfo &proj) const |
| check equality | |
| bool | operator!= (const ProjDataInfo &proj) const |
| virtual bool | operator>= (const ProjDataInfo &proj) const |
Check if *this contains proj. | |
| Viewgram< float > | get_empty_viewgram (const ViewgramIndices &) const |
| Get empty viewgram. | |
| Sinogram< float > | get_empty_sinogram (const SinogramIndices &) const |
| Get empty_sinogram. | |
| SegmentByView< float > | get_empty_segment_by_view (const SegmentIndices &) const |
| Get empty segment sino. | |
| SegmentBySinogram< float > | get_empty_segment_by_sinogram (const SegmentIndices &) const |
| Get empty segment view. | |
| Viewgram< float > | get_empty_viewgram (const int view_num, const int segment_num, const bool make_num_tangential_poss_odd=false, const int timing_pos_num=0) const |
| Get empty viewgram. | |
| Sinogram< float > | get_empty_sinogram (const int ax_pos_num, const int segment_num, const bool make_num_tangential_poss_odd=false, const int timing_pos_num=0) const |
| Get empty_sinogram. | |
| SegmentByView< float > | get_empty_segment_by_view (const int segment_num, const bool make_num_tangential_poss_odd=false, const int timing_pos_num=0) const |
| Get empty segment sino. | |
| SegmentBySinogram< float > | get_empty_segment_by_sinogram (const int segment_num, const bool make_num_tangential_poss_odd=false, const int timing_pos_num=0) const |
| Get empty segment view. | |
| RelatedViewgrams< float > | get_empty_related_viewgrams (const ViewgramIndices &, const shared_ptr< DataSymmetriesForViewSegmentNumbers > &, const bool make_num_tangential_poss_odd=false, const int timing_pos_num=0) const |
| Get empty related viewgrams, where the symmetries_ptr specifies the symmetries to use. | |
| const Scanner * | get_scanner_ptr () const |
| Get scanner pointer. | |
| shared_ptr< Scanner > | get_scanner_sptr () const |
| Get scanner shared pointer. | |
| void | set_bed_position_horizontal (const float bed_position_horizontal_arg) |
| Vector which holds the lower and higher boundary for each TOF position, without the application of TOF mashing, in mm, for faster access. | |
| float | get_bed_position_horizontal () const |
| Get horizontal bed position. | |
| void | set_bed_position_vertical (const float bed_position_vertical_arg) |
| Set vertical bed position. | |
| float | get_bed_position_vertical () const |
| Get vertical bed position. | |
| bool | has_energy_information () const |
set of obsolete functions to go between bins<->LORs (will disappear!) | |
| CartesianCoordinate3D< float > | z_shift |
| virtual void | find_cartesian_coordinates_given_scanner_coordinates (CartesianCoordinate3D< float > &coord_1, CartesianCoordinate3D< float > &coord_2, const int Ring_A, const int Ring_B, const int det1, const int det2, const int timing_pos_num=0) const override |
| bool | blindly_equals (const root_type *const) const override |
Additional Inherited Members | |
Static Public Member Functions inherited from stir::ProjDataInfo | |
| static ProjDataInfo * | ask_parameters () |
| Ask for the details and return a ProjDataInfo pointer. | |
| static ProjDataInfo * | ProjDataInfoGE (const shared_ptr< Scanner > &scanner_ptr, const int max_delta, const int num_views, const int num_tangential_poss, const bool arc_corrected=true, const int tof_mash_factor=0) |
| Construct a ProjDataInfo with span=3 for segment 0, but span=1 for others. | |
| static ProjDataInfo * | ProjDataInfoCTI (const shared_ptr< Scanner > &scanner_ptr, const int span, const int max_delta, const int num_views, const int num_tangential_poss, const bool arc_corrected=true, const int tof_mash_factor=0) |
| Old name for construct_proj_data_info() | |
| static unique_ptr< ProjDataInfo > | construct_proj_data_info (const shared_ptr< Scanner > &scanner_sptr, const int span, const int max_delta, const int num_views, const int num_tangential_poss, const bool arc_corrected=true, const int tof_mash_factor=0) |
| Construct a ProjDataInfo suitable with a given span. | |
| VectorWithOffset< Float1Float2 > | tof_bin_boundaries_mm |
| Vector which holds the lower and higher boundary for each TOF position in mm, for faster access. | |
| VectorWithOffset< Float1Float2 > | tof_bin_boundaries_ps |
| Vector which holds the lower and higher boundary for each TOF position in ps`, for faster access. | |
Protected Types inherited from stir::ProjDataInfo | |
| typedef ProjDataInfo | root_type |
Protected Attributes inherited from stir::ProjDataInfoCylindrical | |
| bool | sampling_corresponds_to_physical_rings |
| a variable that is set if the data corresponds to physical rings in the scanner | |
Projection data info for data for a scanner with discrete detectors.
This isn't completely generic as it assumes that there is "axial" (or "ring") coordinate and a "transaxial" (or "crystal"). However, their spacing can be arbitrary.
It is assumed that for 'raw' data (i.e. no mashing) sinogram space is 'interleaved': 2 adjacent LOR_angles are merged to 1 'view', while the corresponding bins are interleaved:
before interleaving after interleaving
a00 a01 a02 ... view 0: a00 a10 a01 a11 ...
a10 a11 ...
a20 a21 a22 ... view 1: a20 a30 a21 a31 ...
a30 a31 ...
This (standard) interleaving is done because for 'odd' LOR_angles there is no LOR which goes through the origin.
Currently this class is derived from ProjDataInfoCylindricalNoArcCorr. Arguably it should be the other way around. However, this would break backwards compatibility dramatically, and break other pull-requests in progress. We will leave this for later. At present, the member functions that do not make sense in the Generic case will call error(). There are a few ones which might be removed in future, but are currently still used.
|
overridevirtual |
Standard trick for a 'virtual copy-constructor'.
Reimplemented from stir::ProjDataInfoCylindricalNoArcCorr.
|
inlineoverridevirtual |
Gets s coordinate in mm.
not take the 'interleaving' into account which is customarily applied to raw PET data.warning In cylindrical s is found from bin: sin(beta) = sin(tang_pos*angular_increment) In block it is calculated directly from corresponding lor
Reimplemented from stir::ProjDataInfoCylindricalNoArcCorr.
References get_LOR(), and get_s().
Referenced by get_s().
|
inlineoverridevirtual |
Get tangent of the co-polar angle of the normal to the projection plane.
theta=0 for 'direct' planes (i.e. projection planes parallel to the scanner axis)
Reimplemented from stir::ProjDataInfoCylindrical.
References get_LOR(), and get_tantheta().
Referenced by get_tantheta().
|
inlineoverridevirtual |
find phi from correspoding lor
Reimplemented from stir::ProjDataInfoCylindrical.
References get_LOR(), and get_phi().
Referenced by get_phi().
|
inlineoverridevirtual |
Get value of the (roughly) axial coordinate in the projection plane (in mm)
t-axis is defined to be orthogonal to the s-axis (and to the vector normal to the projection plane
Reimplemented from stir::ProjDataInfoCylindrical.
References stir::ProjDataInfo::get_costheta(), get_m(), and get_t().
Referenced by get_t().
|
inlineoverridevirtual |
Return z-coordinate of the middle of the LOR.
The 0 of the z-axis is chosen in the middle of the scanner.
warning In generic geometry m is calculated directly from lor while in cylindrical geometry m is calculated using m_offset and axial_sampling
Reimplemented from stir::ProjDataInfoCylindrical.
|
overridevirtual |
warning Find lor from cartesian coordinates of detector pair
Find lor from cartesian coordinates of detector pair.
Reimplemented from stir::ProjDataInfoCylindrical.
References get_LOR(), and stir::square().
Referenced by get_LOR(), get_m(), get_phi(), get_s(), and get_tantheta().
|
overridevirtual |
currently calls error() unless nothing changes
Reimplemented from stir::ProjDataInfoCylindrical.
References stir::angle(), stir::error(), and stir::ProjDataInfoCylindrical::get_azimuthal_angle_offset().
|
overridevirtual |
|
overridevirtual |
currently calls error() unless nothing changes
Reimplemented from stir::ProjDataInfoCylindrical.
References stir::error(), stir::ProjDataInfo::get_num_views(), and set_num_views().
Referenced by set_num_views().
|
overridevirtual |
currently calls error() unless nothing changes
Reimplemented from stir::ProjDataInfoCylindrical.
References stir::error(), and get_ring_spacing().
|
overridevirtual |
|
inlineoverridevirtual |
return an average ring-spacing (from Scanner)
Reimplemented from stir::ProjDataInfoCylindrical.
References get_ring_spacing(), and stir::ProjDataInfo::get_scanner_ptr().
Referenced by get_axial_sampling(), get_ring_spacing(), and set_ring_spacing().
|
inlineoverridevirtual |
Get sampling distance in the t coordinate.
For some coordinate systems, this might depend on the Bin. The default implementation computes it as
Reimplemented from stir::ProjDataInfoCylindrical.
References stir::ProjDataInfo::get_costheta(), get_sampling_in_t(), and stir::ProjDataInfo::get_scanner_ptr().
Referenced by get_sampling_in_t().
|
inlineoverridevirtual |
Get sampling distance in the m coordinate.
For some coordinate systems, this might depend on the Bin. The default implementation computes it as
Reimplemented from stir::ProjDataInfoCylindrical.
References get_sampling_in_m(), and stir::ProjDataInfo::get_scanner_ptr().
Referenced by get_sampling_in_m().
|
inlineoverridevirtual |
Get the axial sampling (e.g in z_direction)
Reimplemented from stir::ProjDataInfoCylindrical.
References get_axial_sampling(), and get_ring_spacing().
Referenced by get_axial_sampling().
|
inlineoverridevirtual |
Return if axial sampling makes sense.
could be false for block/generic cases
Reimplemented from stir::ProjDataInfoCylindrical.
References axial_sampling_is_uniform().
Referenced by axial_sampling_is_uniform().
|
overridevirtual |
Return a string describing the object.
Reimplemented from stir::ProjDataInfoCylindricalNoArcCorr.
References stir::ProjDataInfoCylindrical::get_max_ring_difference(), stir::ProjDataInfo::get_max_segment_num(), stir::ProjDataInfoCylindrical::get_min_ring_difference(), stir::ProjDataInfo::get_min_segment_num(), stir::ProjDataInfo::parameter_info(), and parameter_info().
Referenced by stir::ProjDataInfoBlocksOnCylindricalNoArcCorr::parameter_info(), and parameter_info().
|
overridevirtual |
Reimplemented from stir::ProjDataInfoCylindricalNoArcCorr.
References stir::error(), stir::ProjDataInfoCylindricalNoArcCorr::get_bin_for_det_pos_pair(), stir::ProjDataInfo::get_max_tangential_pos_num(), stir::ProjDataInfo::get_min_tangential_pos_num(), stir::ProjDataInfo::get_scanner_ptr(), stir::ProjDataInfo::get_tof_bin(), stir::Bin::set_bin_value(), and stir::Bin::tangential_pos_num().
|
overridevirtual |
Reimplemented from stir::ProjDataInfoCylindricalNoArcCorr.
References stir::error(), stir::Scanner::get_coordinate_for_det_pos(), and stir::ProjDataInfo::get_scanner_ptr().
|
overrideprotectedvirtual |
Default implementation checks common variables. Needs to be overloaded.
Reimplemented from stir::ProjDataInfoCylindricalNoArcCorr.