STIR 6.4.0
CListEventCylindricalScannerWithViewTangRingRingEncoding.inl
Go to the documentation of this file.
1//
2//
3/*
4 Copyright (C) 2003- 2011, Hammersmith Imanet Ltd
5 Copyright (C) 2018, 2022, University College London
6 This file is part of STIR.
7
8 SPDX-License-Identifier: Apache-2.0
9
10 See STIR/LICENSE.txt for details
11*/
22
23START_NAMESPACE_STIR
24
25template <class Derived>
26void
28{
29 det_pos.pos1().radial_coord() = 0;
30 det_pos.pos2().radial_coord() = 0;
31 int tangential_pos_num;
32 int view_num;
33 static_cast<const Derived*>(this)->get_data().get_sinogram_and_ring_coordinates(
34 view_num, tangential_pos_num, det_pos.pos1().axial_coord(), det_pos.pos2().axial_coord());
35
36 int det_num_1, det_num_2;
37 this->get_uncompressed_proj_data_info_sptr()->get_det_num_pair_for_view_tangential_pos_num(
38 det_num_1, det_num_2, view_num, tangential_pos_num);
39 det_pos.pos1().tangential_coord() = det_num_1;
40 det_pos.pos2().tangential_coord() = det_num_2;
41 det_pos.timing_pos() = this->get_uncompressed_proj_data_info_sptr()->get_tof_bin(delta_time);
42}
43
44template <class Derived>
45void
47{
48 int tangential_pos_num;
49 int view_num;
50 const bool swap_rings = this->get_uncompressed_proj_data_info_sptr()->get_view_tangential_pos_num_for_det_num_pair(
51 view_num, tangential_pos_num, det_pos.pos1().tangential_coord(), det_pos.pos2().tangential_coord());
52
53 if (swap_rings)
54 {
55 static_cast<Derived*>(this)->get_data().set_sinogram_and_ring_coordinates(
56 view_num, tangential_pos_num, det_pos.pos1().axial_coord(), det_pos.pos2().axial_coord());
57 }
58 else
59 {
60 static_cast<Derived*>(this)->get_data().set_sinogram_and_ring_coordinates(
61 view_num, tangential_pos_num, det_pos.pos2().axial_coord(), det_pos.pos1().axial_coord());
62 }
63 if (this->get_uncompressed_proj_data_info_sptr()->is_tof_data())
64 error(
65 "TODO: CListEventCylindricalScannerWithViewTangRingRingEncoding::set_detection_position needs to be implemented for TOF");
66}
67
68static void
69sinogram_coordinates_to_bin(Bin& bin,
70 const int view_num,
71 const int tang_pos_num,
72 const int ring_a,
73 const int ring_b,
74 const ProjDataInfoCylindrical& proj_data_info)
76 if (proj_data_info.get_segment_axial_pos_num_for_ring_pair(bin.segment_num(), bin.axial_pos_num(), ring_a, ring_b)
77 == Succeeded::no)
78 {
79 bin.set_bin_value(-1);
80 return;
81 }
83 bin.view_num() = view_num / proj_data_info.get_view_mashing_factor();
84 bin.tangential_pos_num() = tang_pos_num;
85}
86
87template <class Derived>
88void
90{
91 assert(dynamic_cast<const ProjDataInfoCylindricalNoArcCorr*>(&proj_data_info) != 0);
92
93 int tangential_pos_num;
94 int view_num;
95 unsigned int ring_a;
96 unsigned int ring_b;
97 static_cast<const Derived*>(this)->get_data().get_sinogram_and_ring_coordinates(view_num, tangential_pos_num, ring_a, ring_b);
98 sinogram_coordinates_to_bin(
99 bin, view_num, tangential_pos_num, ring_a, ring_b, static_cast<const ProjDataInfoCylindrical&>(proj_data_info));
100 bin.timing_pos_num() = proj_data_info.get_tof_bin(delta_time);
101}
102
103template <class Derived>
104bool
106{
107 if (dynamic_cast<ProjDataInfoCylindricalNoArcCorr const*>(&proj_data_info) != 0)
108 return true;
109
110 return false;
111}
112
113END_NAMESPACE_STIR
A class for storing coordinates and value of a single projection bin.
Definition Bin.h:49
int tangential_pos_num() const
get tangential position number
Definition Bin.inl:76
int axial_pos_num() const
get axial position number
Definition Bin.inl:70
void set_bin_value(float v)
set the value to be back projected
Definition Bin.inl:129
void set_detection_position(const DetectionPositionPair<> &)
Definition CListEventCylindricalScannerWithViewTangRingRingEncoding.inl:46
virtual bool is_valid_template(const ProjDataInfo &) const
This method checks if the template is valid for LmToProjData.
Definition CListEventCylindricalScannerWithViewTangRingRingEncoding.inl:105
void get_detection_position(DetectionPositionPair<> &) const
This routine returns the corresponding detector pair.
Definition CListEventCylindricalScannerWithViewTangRingRingEncoding.inl:27
virtual void get_bin(Bin &, const ProjDataInfo &) const
warning only ProjDataInfoCylindricalNoArcCorr
Definition CListEventCylindricalScannerWithViewTangRingRingEncoding.inl:89
A class for storing 2 coordinates-sets of a detection, together with a timing-position index (for TOF...
Definition DetectionPositionPair.h:41
Projection data info for data which are not arc-corrected.
Definition ProjDataInfoCylindricalNoArcCorr.h:83
projection data info for data corresponding to a 'cylindrical' sampling.
Definition ProjDataInfoCylindrical.h:49
virtual int get_view_mashing_factor() const
Get the mashing factor, i.e. how many 'original' views are combined.
Definition ProjDataInfoCylindrical.inl:207
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
An (abstract base) class that contains information on the projection data.
Definition ProjDataInfo.h:70
int get_tof_bin(const double delta) const
Get number of tof bin for a given time difference.
Definition ProjDataInfo.inl:77
int segment_num() const
get segment number for const objects
Definition SegmentIndices.inl:32
int timing_pos_num() const
get TOF index for const objects
Definition SegmentIndices.inl:44
int view_num() const
get view number for const objects
Definition ViewgramIndices.inl:36
void error(const char *const s,...)
Print error with format string a la printf and throw exception.
Definition error.cxx:42