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

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. | |
| ProjDataInfo * | 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. More... | |
| 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 |
| Find the bin in the projection data that 'contains' an LOR. More... | |
Public Member Functions inherited from stir::ProjDataInfoGeneric | |
| ProjDataInfoGeneric () | |
| Constructors. | |
| ProjDataInfoGeneric (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. More... | |
| float | get_tantheta (const Bin &) const override |
| Get tangent of the co-polar angle of the normal to the projection plane. More... | |
| 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) More... | |
| float | get_m (const Bin &) const override |
| Return z-coordinate of the middle of the LOR. More... | |
| 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)=delete |
| void | set_azimuthal_angle_sampling (const float angle)=delete |
| void | set_num_views (const int new_num_views) override |
| set new number of views (currently calls error() unless nothing changes) | |
| float | get_azimuthal_angle_sampling () const =delete |
| float | get_azimuthal_angle_offset () const =delete |
| float | get_ring_radius () const =delete |
| void | set_ring_radii_for_all_views (const VectorWithOffset< float > &new_ring_radius)=delete |
| VectorWithOffset< float > | get_ring_radii_for_all_views () const =delete |
| float | get_ring_spacing () const |
| return an average ring-spacing (from Scanner) | |
| float | get_sampling_in_t (const Bin &) const override |
Get sampling distance in the t coordinate. More... | |
| float | get_sampling_in_m (const Bin &) const override |
Get sampling distance in the m coordinate. More... | |
| float | get_axial_sampling (int segment_num) const override |
| Get the axial sampling (e.g in z_direction) More... | |
| bool | axial_sampling_is_uniform () const override |
| Return if axial sampling makes sense. More... | |
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. More... | |
| void | set_azimuthal_angle_offset (const float angle) |
| Set azimuthal angle offset (in radians) | |
| void | set_azimuthal_angle_sampling (const float angle) |
| Set the azimuthal sampling (in radians) | |
| void | set_tof_mash_factor (const int new_num) override |
| The tof mashing factor (for TOF scanners). More... | |
| float | get_azimuthal_angle_offset () const |
| Get azimuthal angle offset (in radians) | |
| 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. More... | |
| 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. More... | |
| 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. More... | |
| void | reduce_segment_range (const int min_segment_num, const int max_segment_num) override |
| Set a new range of segment numbers. More... | |
| void | set_ring_radii_for_all_views (const VectorWithOffset< float > &new_ring_radius) |
| Set detector ring radius for all views. | |
| VectorWithOffset< float > | get_ring_radii_for_all_views () const |
| Get detector ring radius for all views. | |
| float | get_ring_radius () const |
| Get detector ring radius. | |
| float | get_ring_radius (const int view_num) const |
| float | get_ring_spacing () const |
| Get detector ring spacing. | |
| void | set_ring_spacing (float ring_spacing_v) |
| Set detector ring spacing. | |
| int | get_view_mashing_factor () const |
| Get the mashing factor, i.e. how many 'original' views are combined. More... | |
| Succeeded | get_segment_num_for_ring_difference (int &segment_num, const int ring_diff) const |
| Find which segment a particular ring difference belongs to. More... | |
| 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. More... | |
| 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. More... | |
| 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. More... | |
| 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. More... | |
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. More... | |
| 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. | |
| 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. More... | |
| 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. More... | |
| 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 |
| virtual void | set_num_tangential_poss (const int num_tang_poss) |
| Set number of tangential positions. More... | |
| virtual void | set_min_tangential_pos_num (const int min_tang_poss) |
| Set minimum tangential position number. More... | |
| virtual void | set_max_tangential_pos_num (const int max_tang_poss) |
| Set maximum tangential position number. More... | |
| 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. More... | |
| int | get_num_non_tof_sinograms () const |
| Get the number of non-tof sinograms. More... | |
| std::size_t | size_all () const |
| Get the total size of the data. | |
| float | get_costheta (const Bin &) const |
| Get cosine of the co-polar angle of the normal to the projection plane. More... | |
| 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. More... | |
| 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. More... | |
| 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. More... | |
| 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. More... | |
| 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. More... | |
| 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. More... | |
| 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. More... | |
Functions that convert between bins and detection positions | |
| 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. More... | |
| 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. More... | |
| Succeeded | get_bin_for_det_pos_pair (Bin &, const DetectionPositionPair<> &) const |
| This gets Bin coordinates for a particular detector pair. More... | |
| void | get_det_pos_pair_for_bin (DetectionPositionPair<> &, const Bin &) const |
| This routine gets the detector pair corresponding to a bin. More... | |
| unsigned int | get_num_det_pos_pairs_for_bin (const Bin &) 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 &) const |
| This routine fills a vector with all the detector pairs that correspond to a bin. More... | |
| void | get_det_pair_for_bin (int &det1_num, int &ring1_num, int &det2_num, int &ring2_num, const Bin &) const |
| This routine gets the detector pair corresponding to a bin. More... | |
set of obsolete functions to go between bins<->LORs (will disappear!) | |
| void | find_cartesian_coordinates_of_detection (CartesianCoordinate3D< float > &coord_1, CartesianCoordinate3D< float > &coord_2, const Bin &bin) const override |
| 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 |
| bool | blindly_equals (const root_type *const) const override |
Additional Inherited Members | |
Public Types inherited from stir::ProjDataInfoGeneric | |
| 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() | |
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. More... | |
| 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() More... | |
| 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. More... | |
Public Attributes inherited from stir::ProjDataInfo | |
| 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::ProjDataInfoGeneric | |
| CartesianCoordinate3D< float > | z_shift |
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 More... | |
Projection data info for data for a scanner with discrete detectors.
This class also contains some functions specific for (static) full-ring PET scanners. In this case, 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.
When the ring difference = 0 (i.e. a 2D - or direct - sinogram), interchanging the 2 detectors does not change the LOR. This is why (in 2D) one gets away with a full sinogram size of num_views * 2 * num_views, where the size of 'detector-space' is twice as large. However, in 3D, interchanging the detectors, also interchanges the rings. One has 2 options:
|
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
Implements stir::ProjDataInfo.
|
inline |
This gets view_num and tang_pos_num for a particular detector pair.
This function makes only sense if the scanner is a full-ring scanner with discrete detectors and there is no rotation or wobble.
true if the detector pair is stored in a positive segment, false otherwise.References stir::Bin::axial_pos_num(), stir::SegmentIndices::segment_num(), stir::Bin::tangential_pos_num(), and stir::ViewgramIndices::view_num().
|
inline |
This routine gets det_num1 and det_num2.
It sets the detectors in a particular order (i.e. it fixes the orientation of the LOR) corresponding to the detector pair belonging to a positive segment.
|
inline |
This gets Bin coordinates for a particular detector pair.
Note that when axial compression and/or mashing is applied, this is a many-to-one relation, i.e. multiple detector pairs contribute to one bin.
Referenced by get_bin(), and stir::ProjDataInfoBlocksOnCylindricalNoArcCorr::parameter_info().
|
inline |
This routine gets the detector pair corresponding to a bin.
| void stir::ProjDataInfoGenericNoArcCorr::get_all_det_pos_pairs_for_bin | ( | std::vector< DetectionPositionPair<>> & | dps, |
| const Bin & | bin | ||
| ) | const |
This routine fills a vector with all the detector pairs that correspond to a bin.
References stir::Bin::axial_pos_num(), stir::ProjDataInfoCylindrical::get_all_ring_pairs_for_segment_axial_pos_num(), stir::ProjDataInfo::get_min_view_num(), get_num_det_pos_pairs_for_bin(), stir::ProjDataInfoCylindrical::get_view_mashing_factor(), stir::SegmentIndices::segment_num(), stir::Bin::tangential_pos_num(), and stir::ViewgramIndices::view_num().
|
inline |
This routine gets the detector pair corresponding to a bin.
References stir::Bin::axial_pos_num(), stir::SegmentIndices::segment_num(), stir::Bin::tangential_pos_num(), and stir::ViewgramIndices::view_num().
Referenced by find_cartesian_coordinates_of_detection().
|
overridevirtual |
Find the bin in the projection data that 'contains' an LOR.
Projection data corresponds to lines, so most Lines Of Response (LORs) there is a bin in the projection data. Usually this will be the bin which has a central LOR that is 'closest' to the LOR that is passed as an argument.
If there is no such bin (e.g. the LOR does not intersect the detectors, Bin::get_bin_value() will be less than 0, otherwise it will be 1.
Implements stir::ProjDataInfo.
References stir::error(), 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::Bin::set_bin_value(), and stir::Bin::tangential_pos_num().
|
overridevirtual |
Implements stir::ProjDataInfoGeneric.
References stir::Scanner::get_coordinate_for_det_pos(), get_det_pair_for_bin(), and stir::ProjDataInfo::get_scanner_ptr().
|
overrideprotectedvirtual |
Default implementation checks common variables. Needs to be overloaded.
Implements stir::ProjDataInfoCylindrical.
Referenced by stir::ProjDataInfoBlocksOnCylindricalNoArcCorr::clone().
1.8.13