100 inline bool has_template_proj_data_info()
const {
return !stir::is_null_ptr(proj_data_info_sptr); }
107 shared_ptr<ProjData> get_output_proj_data_sptr()
const;
109 inline int get_num_scatter_points()
const {
return static_cast<int>(this->scatt_points_vector.size()); }
111 shared_ptr<const ProjDataInfo> get_template_proj_data_info_sptr()
const;
113 shared_ptr<const ExamInfo> get_exam_info_sptr()
const;
115 const DiscretisedDensity<3, float>& get_activity_image()
const;
116 const DiscretisedDensity<3, float>& get_attenuation_image()
const;
117 const DiscretisedDensity<3, float>& get_attenuation_image_for_scatter_points()
const;
119 shared_ptr<const DiscretisedDensity<3, float>> get_density_image_for_scatter_points_sptr()
const;
125 void set_template_proj_data_info(
const std::string&);
127 void set_template_proj_data_info(
const ProjDataInfo& arg);
129 void set_template_proj_data_info(shared_ptr<const ProjDataInfo> arg);
131 void set_activity_image_sptr(
const shared_ptr<
const DiscretisedDensity<3, float>>);
133 void set_activity_image(
const std::string& filename);
136 void set_exam_info(
const ExamInfo&);
137 void set_exam_info_sptr(
const shared_ptr<const ExamInfo>);
139 void set_output_proj_data_sptr(shared_ptr<ProjData>);
141 void set_density_image_sptr(
const shared_ptr<
const DiscretisedDensity<3, float>>);
143 void set_density_image(
const std::string&);
146 void set_output_proj_data(
const std::string&);
148 void set_output_proj_data_sptr(
const shared_ptr<const ExamInfo>,
const shared_ptr<const ProjDataInfo>,
const std::string&);
150 void set_density_image_for_scatter_points_sptr(shared_ptr<
const DiscretisedDensity<3, float>>);
152 void set_image_downsample_factors(
float factor_xy = 1.f,
float factor_z = 1.f,
int _size_zoom_xy = -1,
int _size_zoom_z = -1);
154 void set_density_image_for_scatter_points(
const std::string&);
156 void set_attenuation_threshold(
const float);
164 void set_randomly_place_scatter_points(
const bool);
166 void set_cache_enabled(
const bool);
173 void downsample_density_image_for_scatter_points(
float _zoom_xy,
float _zoom_z,
int _size_xy = -1,
int _size_z = -1);
177 void set_downsample_scanner_bool(
const bool arg);
178 bool get_downsample_scanner_bool()
const;
183 int get_num_downsample_scanner_rings()
const;
184 void set_num_downsample_scanner_rings(
const int arg);
189 int get_num_downsample_scanner_dets()
const;
190 void set_num_downsample_scanner_dets(
const int arg);
197 Succeeded downsample_scanner(
int new_num_rings = -1,
int new_num_dets = -1);
206 Succeeded downsample_images_to_scanner_size();
220 float detection_efficiency(
const float energy)
const;
224 static inline float dif_Compton_cross_section(
const float cos_theta,
float energy);
226 static inline float total_Compton_cross_section(
float energy);
228 static inline float photon_energy_after_Compton_scatter(
const float cos_theta,
const float energy);
230 static inline float photon_energy_after_Compton_scatter_511keV(
const float cos_theta);
232 static inline float total_Compton_cross_section_relative_to_511keV(
const float energy);
235 virtual Succeeded set_up();
238 virtual void write_log(
const double simulation_time,
const float total_scatter);
241 void set_use_cache(
const bool);
243 bool get_use_cache()
const;
248 virtual double process_data_for_view_segment_num(
const ViewSegmentNumbers& vs_num);
250 float compute_emis_to_det_points_solid_angle_factor(
const CartesianCoordinate3D<float>& emis_point,
251 const CartesianCoordinate3D<float>& detector_coord);
253 void set_defaults()
override;
254 void initialise_keymap()
override;
258 bool post_processing()
override;
267 CartesianCoordinate3D<float> coord;
271 std::vector<ScatterPoint> scatt_points_vector;
273 float scatter_volume;
279 void sample_scatter_points();
284 virtual void remove_cache_for_integrals_over_attenuation();
289 virtual void remove_cache_for_integrals_over_activity();
297 static float max_cos_angle(
const float low,
const float approx,
const float resolution_at_511keV);
300 static float energy_lower_limit(
const float low,
const float approx,
const float resolution_at_511keV);
302 virtual void find_detectors(
unsigned& det_num_A,
unsigned& det_num_B,
const Bin& bin)
const;
304 unsigned find_in_detection_points_vector(
const CartesianCoordinate3D<float>& coord)
const;
306 CartesianCoordinate3D<float> shift_detector_coordinates_to_origin;
309 double detection_efficiency_no_scatter(
const unsigned det_num_A,
const unsigned det_num_B)
const;
312 mutable std::vector<CartesianCoordinate3D<float>> detection_points_vector;
331 float cached_integral_over_activity_image_between_scattpoint_det(
const unsigned scatter_point_num,
const unsigned det_num);
333 float cached_exp_integral_over_attenuation_image_between_scattpoint_det(
const unsigned scatter_point_num,
334 const unsigned det_num);
337 std::string template_proj_data_filename;
339 shared_ptr<const ProjDataInfo> proj_data_info_sptr;
343 std::string density_image_filename;
345 std::string density_image_for_scatter_points_filename;
347 std::string density_image_for_scatter_points_output_filename;
349 shared_ptr<const DiscretisedDensity<3, float>> density_image_sptr;
395 bool downsample_scanner_bool;
396 bool _already_set_up;
403 shared_ptr<DiscretisedDensity<3, float>> density_image_for_scatter_points_sptr;
406 mutable float detector_efficiency_no_scatter;