STIR  6.2.0
Public Types | Public Member Functions | Protected Attributes | List of all members
stir::ProjDataInfoGeneric Class Referenceabstract

projection data info for data corresponding to 'Generic' sampling. More...

#include "stir/ProjDataInfoGeneric.h"

Inheritance diagram for stir::ProjDataInfoGeneric:
Inheritance graph
[legend]

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

 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...
 
std::string parameter_info () const override
 Return a string describing the object.
 
- 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 RingNumPairsget_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.
 
virtual ProjDataInfoclone () const =0
 Standard trick for a 'virtual copy-constructor'.
 
shared_ptr< ProjDataInfocreate_shared_clone () const
 Like clone() but return a shared_ptr.
 
shared_ptr< ProjDataInfocreate_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...
 
virtual Bin get_bin (const LOR< float > &, const double delta_time=0.0) const =0
 Find the bin in the projection data that 'contains' an LOR. More...
 
const Scannerget_scanner_ptr () const
 Get scanner pointer.
 
shared_ptr< Scannerget_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...
 
virtual float get_s (const Bin &) const =0
 Get value of the tangential coordinate in the projection plane (in mm) 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...
 

Protected Attributes

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...
 

Additional Inherited Members

- Static Public Member Functions inherited from stir::ProjDataInfo
static ProjDataInfoask_parameters ()
 Ask for the details and return a ProjDataInfo pointer.
 
static ProjDataInfoProjDataInfoGE (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 ProjDataInfoProjDataInfoCTI (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< ProjDataInfoconstruct_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< Float1Float2tof_bin_boundaries_mm
 Vector which holds the lower and higher boundary for each TOF position in mm, for faster access.
 
VectorWithOffset< Float1Float2tof_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 Member Functions inherited from stir::ProjDataInfoCylindrical
bool blindly_equals (const root_type *const) const override=0
 

Detailed Description

projection data info for data corresponding to 'Generic' sampling.

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.

Currently this class is derived from ProjDataInfoCylindrical. 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, we just delete some member functions that do not make sense in the Generic case. There are a few ones left which might be removed in future, but are currently still used.

Todo:
change hierarchy order, i.e. derive from ProjDataInfoCylindrical from ProjDataInfoGeneric.

Constructor & Destructor Documentation

◆ ProjDataInfoGeneric()

stir::ProjDataInfoGeneric::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.

The min and max ring difference in each segment are passed as VectorWithOffsets. All three vectors have to have index ranges from min_segment_num to max_segment_num.

Warning
Most of this library assumes that segment 0 corresponds to an average ring difference of 0.

References stir::ProjDataInfoCylindrical::blindly_equals(), and stir::ProjDataInfo::blindly_equals().

Member Function Documentation

◆ get_tantheta()

float stir::ProjDataInfoGeneric::get_tantheta ( const Bin ) const
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.

◆ get_t()

float stir::ProjDataInfoGeneric::get_t ( const Bin ) const
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.

◆ get_m()

float stir::ProjDataInfoGeneric::get_m ( const Bin bin) const
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.

◆ get_sampling_in_t()

float stir::ProjDataInfoGeneric::get_sampling_in_t ( const Bin bin) const
inlineoverridevirtual

Get sampling distance in the t coordinate.

For some coordinate systems, this might depend on the Bin. The default implementation computes it as

1/2(get_t(..., ax_pos+1,...)-get_t(..., ax_pos-1,...)))

Reimplemented from stir::ProjDataInfoCylindrical.

◆ get_sampling_in_m()

float stir::ProjDataInfoGeneric::get_sampling_in_m ( const Bin bin) const
inlineoverridevirtual

Get sampling distance in the m coordinate.

For some coordinate systems, this might depend on the Bin. The default implementation computes it as

1/2(get_m(..., ax_pos+1,...)-get_m(..., ax_pos-1,...)))

Reimplemented from stir::ProjDataInfoCylindrical.

◆ get_axial_sampling()

float stir::ProjDataInfoGeneric::get_axial_sampling ( int  segment_num) const
inlineoverridevirtual

Get the axial sampling (e.g in z_direction)

Warning
The implementation of this function currently assumes that the axial sampling is equal to the ring spacing for non-spanned data (i.e. no axial compression), while it is half the ring spacing for spanned data.

Reimplemented from stir::ProjDataInfoCylindrical.

◆ axial_sampling_is_uniform()

bool stir::ProjDataInfoGeneric::axial_sampling_is_uniform ( ) const
inlineoverridevirtual

Return if axial sampling makes sense.

could be false for block/generic cases

Reimplemented from stir::ProjDataInfoCylindrical.


The documentation for this class was generated from the following files: