109 friend class BlocksTests;
113 static Scanner* ask_parameters();
178 SAFIRDualRingPrototype,
180 UPENN_5rings_no_gaps,
182 UPENN_6rings_no_gaps,
183 User_defined_scanner,
190 Scanner(Type scanner_type);
199 const std::list<std::string>& list_of_names_v,
200 int num_detectors_per_ring_v,
202 int max_num_non_arccorrected_bins_v,
203 int default_num_arccorrected_bins_v,
204 float inner_ring_radius_v,
205 float average_depth_of_interaction_v,
206 float ring_spacing_v,
208 float intrinsic_tilt_v,
209 int num_axial_blocks_per_bucket_v,
210 int num_transaxial_blocks_per_bucket_v,
211 int num_axial_crystals_per_block_v,
212 int num_transaxial_crystals_per_block_v,
213 int num_axial_crystals_per_singles_unit_v,
214 int num_transaxial_crystals_per_singles_unit_v,
215 int num_detector_layers_v,
216 float energy_resolution_v = -1.0f,
217 float reference_energy_v = -1.0f,
218 short int max_num_of_timing_poss = -1,
219 float size_timing_pos = -1.0f,
220 float timing_resolution = -1.0f,
221 const std::string& scanner_geometry_v =
"Cylindrical",
222 float axial_crystal_spacing_v = -1.0f,
223 float transaxial_crystal_spacing_v = -1.0f,
224 float axial_block_spacing_v = -1.0f,
225 float transaxial_block_spacing_v = -1.0f,
226 const std::string& crystal_map_file_name =
"");
235 const std::string& name,
236 int num_detectors_per_ring_v,
238 int max_num_non_arccorrected_bins_v,
239 int default_num_arccorrected_bins_v,
240 float inner_ring_radius_v,
241 float average_depth_of_interaction_v,
242 float ring_spacing_v,
244 float intrinsic_tilt_v,
245 int num_axial_blocks_per_bucket_v,
246 int num_transaxial_blocks_per_bucket_v,
247 int num_axial_crystals_per_block_v,
248 int num_transaxial_crystals_per_block_v,
249 int num_axial_crystals_per_singles_unit_v,
250 int num_transaxial_crystals_per_singles_unit_v,
251 int num_detector_layers_v,
252 float energy_resolution_v = -1.0f,
253 float reference_energy_v = -1.0f,
254 short int max_num_of_timing_poss = -1,
255 float size_timing_pos = -1.0f,
256 float timing_resolution = -1.0f,
257 const std::string& scanner_geometry_v =
"Cylindrical",
258 float axial_crystal_spacing_v = -1.0f,
259 float transaxial_crystal_spacing_v = -1.0f,
260 float axial_block_spacing_v = -1.0f,
261 float transaxial_block_spacing_v = -1.0f,
262 const std::string& crystal_map_file_name =
"");
268 virtual void set_up();
271 std::string parameter_info()
const;
273 const std::string& get_name()
const;
275 const std::list<std::string>& get_all_names()
const;
277 std::string list_names()
const;
280 bool operator==(
const Scanner& scanner)
const;
281 inline bool operator!=(
const Scanner& scanner)
const;
284 inline Type get_type()
const;
289 Succeeded check_consistency()
const;
295 inline int get_num_rings()
const;
297 inline int get_num_detectors_per_ring()
const;
307 inline int get_max_num_non_arccorrected_bins()
const;
314 inline int get_default_num_arccorrected_bins()
const;
317 inline int get_max_num_views()
const;
319 inline float get_inner_ring_radius()
const;
321 inline float get_max_FOV_radius()
const;
323 inline float get_effective_ring_radius()
const;
325 inline float get_average_depth_of_interaction()
const;
327 inline float get_ring_spacing()
const;
329 inline float get_default_bin_size()
const;
336 inline float get_intrinsic_azimuthal_tilt()
const;
340 inline int get_num_transaxial_blocks_per_bucket()
const;
342 inline int get_num_axial_blocks_per_bucket()
const;
344 inline int get_num_axial_crystals_per_block()
const;
346 inline int get_num_transaxial_crystals_per_block()
const;
348 inline int get_num_transaxial_crystals_per_bucket()
const;
350 inline int get_num_axial_crystals_per_bucket()
const;
352 inline int get_num_detector_layers()
const;
354 inline int get_num_axial_blocks()
const;
356 inline int get_num_transaxial_blocks()
const;
358 inline int get_num_axial_buckets()
const;
360 inline int get_num_transaxial_buckets()
const;
363 inline int get_num_axial_crystals_per_singles_unit()
const;
365 inline int get_num_transaxial_crystals_per_singles_unit()
const;
369 inline int get_num_axial_singles_units()
const;
371 inline int get_num_transaxial_singles_units()
const;
373 inline int get_num_singles_units()
const;
376 inline int get_max_num_timing_poss()
const;
382 inline float get_size_of_timing_pos()
const;
388 inline float get_timing_resolution()
const;
397 float get_coincidence_window_width_in_ps()
const;
400 float get_coincidence_window_width_in_mm()
const;
410 int get_num_virtual_axial_crystals_per_block()
const;
411 int get_num_virtual_transaxial_crystals_per_block()
const;
412 void set_num_virtual_axial_crystals_per_block(
int);
413 void set_num_virtual_transaxial_crystals_per_block(
int);
420 inline std::string get_scanner_geometry()
const;
422 inline float get_axial_crystal_spacing()
const;
424 inline float get_transaxial_crystal_spacing()
const;
426 inline float get_axial_block_spacing()
const;
428 inline float get_transaxial_block_spacing()
const;
433 inline float get_axial_length()
const;
438 inline std::string get_crystal_map_file_name()
const;
452 inline float get_energy_resolution()
const;
455 inline float get_reference_energy()
const;
457 inline bool has_energy_information()
const;
469 inline void set_type(
const Type& new_type);
471 inline void set_num_rings(
const int& new_num);
473 inline void set_num_detectors_per_ring(
const int& new_num);
475 inline void set_max_num_non_arccorrected_bins(
const int& new_num);
477 inline void set_default_num_arccorrected_bins(
const int& new_num);
479 inline void set_inner_ring_radius(
const float& new_radius);
481 inline void set_average_depth_of_interaction(
const float& new_depth_of_interaction);
483 inline void set_ring_spacing(
const float& new_spacing);
485 inline void set_default_bin_size(
const float& new_size);
487 inline void set_intrinsic_azimuthal_tilt(
const float new_tilt);
491 inline void set_num_transaxial_blocks_per_bucket(
const int& new_num);
493 inline void set_num_axial_blocks_per_bucket(
const int& new_num);
495 inline void set_num_axial_crystals_per_block(
const int& new_num);
497 inline void set_num_transaxial_crystals_per_block(
const int& new_num);
499 inline void set_num_detector_layers(
const int& new_num);
501 inline void set_num_axial_crystals_per_singles_unit(
const int& new_num);
503 inline void set_num_transaxial_crystals_per_singles_unit(
const int& new_num);
516 void set_scanner_geometry(
const std::string& new_scanner_geometry);
518 inline void set_axial_crystal_spacing(
const float& new_spacing);
520 inline void set_transaxial_crystal_spacing(
const float& new_spacing);
522 inline void set_axial_block_spacing(
const float& new_spacing);
524 inline void set_transaxial_block_spacing(
const float& new_spacing);
527 inline void set_crystal_map_file_name(
const std::string& new_crystal_map_file_name);
533 inline void set_energy_resolution(
const float new_num);
536 inline void set_reference_energy(
const float new_num);
538 inline void set_max_num_timing_poss(
int new_num);
540 inline void set_size_of_timing_poss(
float new_num);
542 inline void set_timing_resolution(
float new_num_in_ps);
548 inline int get_singles_bin_index(
int axial_index,
int transaxial_index)
const;
552 inline int get_singles_bin_index(
const DetectionPosition<>& det_pos)
const;
555 inline int get_axial_singles_unit(
int singles_bin_index)
const;
558 inline int get_transaxial_singles_unit(
int singles_bin_index)
const;
561 inline bool is_tof_ready()
const;
573 inline Succeeded find_detection_position_given_cartesian_coordinate(DetectionPosition<>& det_pos,
574 const CartesianCoordinate3D<float>& cart_coord)
const;
576 shared_ptr<const DetectorCoordinateMap> get_detector_map_sptr()
const {
return detector_map_sptr; }
581 std::list<std::string> list_of_names;
583 int max_num_non_arccorrected_bins;
584 int default_num_arccorrected_bins;
585 int num_detectors_per_ring;
587 float inner_ring_radius;
588 float average_depth_of_interaction;
589 float max_FOV_radius;
592 float intrinsic_tilt;
594 int num_transaxial_blocks_per_bucket;
595 int num_axial_blocks_per_bucket;
596 int num_axial_crystals_per_block;
597 int num_transaxial_crystals_per_block;
598 int num_detector_layers;
600 int num_axial_crystals_per_singles_unit;
601 int num_transaxial_crystals_per_singles_unit;
608 float energy_resolution;
611 float reference_energy;
613 float timing_resolution;
615 int max_num_of_timing_poss;
617 float size_timing_pos;
623 std::string scanner_geometry;
624 float axial_crystal_spacing;
625 float transaxial_crystal_spacing;
626 float axial_block_spacing;
627 float transaxial_block_spacing;
629 std::string crystal_map_file_name;
630 shared_ptr<DetectorCoordinateMap> detector_map_sptr;
632 void set_detector_map(
const DetectorCoordinateMap::det_pos_to_coord_type& coord_map);
633 void initialise_max_FOV_radius();
636 void read_detectormap_from_file(
const std::string& filename);
639 void set_params(Type type_v,
640 const std::list<std::string>& list_of_names_v,
642 int max_num_non_arccorrected_bins_v,
643 int default_num_arccorrected_bins_v,
644 int num_detectors_per_ring_v,
645 float inner_ring_radius_v,
646 float average_depth_of_interaction_v,
647 float ring_spacing_v,
649 float intrinsic_tilt_v,
650 int num_axial_blocks_per_bucket_v,
651 int num_transaxial_blocks_per_bucket_v,
652 int num_axial_crystals_per_block_v,
653 int num_transaxial_crystals_per_block_v,
654 int num_axial_crystals_per_singles_unit_v,
655 int num_transaxial_crystals_per_singles_unit_v,
656 int num_detector_layers_v,
657 float energy_resolution_v = -1.0f,
658 float reference_energy = -1.0f,
659 short int max_num_of_timing_poss_v = -1.0f,
660 float size_timing_pos_v = -1.0f,
661 float timing_resolution_v = -1.0f,
662 const std::string& scanner_geometry_v =
"",
663 float axial_crystal_spacing_v = -1.0f,
664 float transaxial_crystal_spacing_v = -1.0f,
665 float axial_block_spacing_v = -1.0f,
666 float transaxial_block_spacing_v = -1.0f,
667 const std::string& crystal_map_file_name =
"");