39ProjDataInfoCylindrical::initialise_ring_diff_arrays_if_not_done_yet()
const
45#if defined(STIR_OPENMP) && _OPENMP >= 201012
47# pragma omp atomic read
48 initialised = ring_diff_arrays_computed;
53#if defined(STIR_OPENMP)
54# pragma omp critical(PROJDATAINFOCYLINDRICALRINGDIFFARRAY)
57 if (!ring_diff_arrays_computed)
58 initialise_ring_diff_arrays();
67 return bin.
view_num() * azimuthal_angle_sampling + azimuthal_angle_offset;
74 this->initialise_ring_diff_arrays_if_not_done_yet();
88 if (fabs(delta) < 0.0001F)
91 assert(R >= fabs(
get_s(bin)));
108ProjDataInfoCylindrical::get_num_axial_poss_per_ring_inc(
const int segment_num)
const
110 return max_ring_diff[segment_num] != min_ring_diff[segment_num] ? 2 : 1;
116 return azimuthal_angle_offset;
122 return azimuthal_angle_sampling;
128 return ring_spacing / get_num_axial_poss_per_ring_inc(segment_num);
137 return (min_ring_diff[segment_num] + max_ring_diff[segment_num]) / 2.F;
143 return min_ring_diff[segment_num];
149 return max_ring_diff[segment_num];
155 if (this->ring_radius.get_min_index() != 0 || this->ring_radius.get_max_index() != 0)
158 for (VectorWithOffset<float>::const_iterator iter = this->ring_radius.begin(); iter != this->ring_radius.end(); ++iter)
160 if (*iter != *this->ring_radius.begin())
161 error(
"get_ring_radius called for non-circular ring");
164 return *this->ring_radius.begin();
170 if (new_ring_radius.
get_min_index() != this->get_min_view_num() || new_ring_radius.
get_max_index() != this->get_max_view_num())
172 error(
"error set_ring_radii_for_all_views: you need to use correct range of view numbers");
175 this->ring_radius = new_ring_radius;
181 if (this->ring_radius.get_min_index() == 0 && this->ring_radius.get_max_index() == 0)
184 out.
fill(this->ring_radius[0]);
188 return this->ring_radius;
194 if (this->ring_radius.get_min_index() == 0 && this->ring_radius.get_max_index() == 0)
195 return ring_radius[0];
197 return ring_radius[view_num];
221 return Succeeded::no;
225 return Succeeded::no;
227 this->initialise_ring_diff_arrays_if_not_done_yet();
229 segment_num = ring_diff_to_segment_num[ring_diff];
232 return Succeeded::yes;
234 return Succeeded::no;
241 const int ring2)
const
250 return Succeeded::no;
253 ax_pos_num = (ring1 + ring2 - ax_pos_num_offset[segment_num]) * get_num_axial_poss_per_ring_inc(segment_num) / 2;
254 return Succeeded::yes;
260 this->initialise_ring_diff_arrays_if_not_done_yet();
261 return *this->segment_axial_pos_to_ring_pair[segment_num][axial_pos_num];
Declaration of class stir::Bin.
Declaration of class stir::Succeeded.
A class for storing coordinates and value of a single projection bin.
Definition Bin.h:49
int axial_pos_num() const
get axial position number
Definition Bin.inl:70
float get_phi(const Bin &) const override
Get azimuthal angle phi of the normal to the projection plane.
Definition ProjDataInfoCylindrical.inl:65
std::vector< std::pair< int, int > > RingNumPairs
Type used by get_all_ring_pairs_for_segment_axial_pos_num()
Definition ProjDataInfoCylindrical.h:56
virtual VectorWithOffset< float > get_ring_radii_for_all_views() const
Get detector ring radius for all views.
Definition ProjDataInfoCylindrical.inl:179
virtual float get_azimuthal_angle_offset() const
Get azimuthal angle offset (in radians)
Definition ProjDataInfoCylindrical.inl:114
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.
Definition ProjDataInfoCylindrical.inl:258
virtual float get_ring_radius() const
Get detector ring radius.
Definition ProjDataInfoCylindrical.inl:153
virtual float get_ring_spacing() const
Get detector ring spacing.
Definition ProjDataInfoCylindrical.inl:201
float get_sampling_in_t(const Bin &) const override
Get sampling distance in the t coordinate.
Definition ProjDataInfoCylindrical.inl:102
virtual void set_ring_radii_for_all_views(const VectorWithOffset< float > &new_ring_radius)
Set detector ring radius for all views.
Definition ProjDataInfoCylindrical.inl:168
Succeeded get_segment_num_for_ring_difference(int &segment_num, const int ring_diff) const
Find which segment a particular ring difference belongs to.
Definition ProjDataInfoCylindrical.inl:218
float get_tantheta(const Bin &) const override
Get tangent of the co-polar angle of the normal to the projection plane.
Definition ProjDataInfoCylindrical.inl:85
virtual float get_azimuthal_angle_sampling() const
Get the azimuthal sampling (in radians)
Definition ProjDataInfoCylindrical.inl:120
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.
Definition ProjDataInfoCylindrical.inl:265
float get_t(const Bin &) const override
Get value of the (roughly) axial coordinate in the projection plane (in mm)
Definition ProjDataInfoCylindrical.inl:79
virtual int get_view_mashing_factor() const
Get the mashing factor, i.e. how many 'original' views are combined.
Definition ProjDataInfoCylindrical.inl:207
virtual float get_axial_sampling(int segment_num) const
Get the axial sampling (e.g in z_direction)
Definition ProjDataInfoCylindrical.inl:126
float get_sampling_in_m(const Bin &) const override
Get sampling distance in the m coordinate.
Definition ProjDataInfoCylindrical.inl:96
int get_min_ring_difference(int segment_num) const
Get minimum ring difference for the given segment.
Definition ProjDataInfoCylindrical.inl:141
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.
Definition ProjDataInfoCylindrical.inl:238
float get_m(const Bin &) const override
Return z-coordinate of the middle of the LOR.
Definition ProjDataInfoCylindrical.inl:71
bool sampling_corresponds_to_physical_rings
a variable that is set if the data corresponds to physical rings in the scanner
Definition ProjDataInfoCylindrical.h:275
int get_max_ring_difference(int segment_num) const
Get maximum ring difference for the given segment.
Definition ProjDataInfoCylindrical.inl:147
float get_average_ring_difference(int segment_num) const
Get average ring difference for the given segment.
Definition ProjDataInfoCylindrical.inl:132
int get_num_views() const
Get number of views.
Definition ProjDataInfo.inl:59
int get_min_segment_num() const
Get minimum segment number.
Definition ProjDataInfo.inl:120
float get_costheta(const Bin &) const
Get cosine of the co-polar angle of the normal to the projection plane.
Definition ProjDataInfo.inl:200
int get_min_view_num() const
Get minimum view number.
Definition ProjDataInfo.inl:144
int get_max_view_num() const
Get maximum view number.
Definition ProjDataInfo.inl:150
const Scanner * get_scanner_ptr() const
Get scanner pointer.
Definition ProjDataInfo.inl:212
virtual float get_s(const Bin &) const =0
Get value of the tangential coordinate in the projection plane (in mm)
int get_max_segment_num() const
Get maximum segment number.
Definition ProjDataInfo.inl:126
int segment_num() const
get segment number for const objects
Definition SegmentIndices.inl:32
a class containing an enumeration type that can be used by functions to signal successful operation o...
Definition Succeeded.h:44
A templated class for vectors, but with indices starting not from 0.
Definition VectorWithOffset.h:65
int get_max_index() const
get value of last valid index
Definition VectorWithOffset.inl:131
int get_min_index() const
get value of first valid index
Definition VectorWithOffset.inl:124
void fill(const T &n)
fill elements with value n
Definition VectorWithOffset.inl:571
int view_num() const
get view number for const objects
Definition ViewgramIndices.inl:36
Declaration of stir::error()
void error(const char *const s,...)
Print error with format string a la printf and throw exception.
Definition error.cxx:42
NUMBER square(const NUMBER &x)
returns the square of a number, templated.
Definition common.h:154
Definition of stir::is_null_ptr functions.