111 friend class BlocksTests;
112 friend class ProjDataInfoCylindricalNoArcCorrTests;
116 static Scanner* ask_parameters();
181 SAFIRDualRingPrototype,
183 UPENN_5rings_no_gaps,
185 UPENN_6rings_no_gaps,
186 User_defined_scanner,
193 Scanner(Type scanner_type);
202 const std::list<std::string>& list_of_names_v,
203 int num_detectors_per_ring_v,
205 int max_num_non_arccorrected_bins_v,
206 int default_num_arccorrected_bins_v,
207 float inner_ring_radius_v,
208 float average_depth_of_interaction_v,
209 float ring_spacing_v,
211 float intrinsic_tilt_v,
212 int num_axial_blocks_per_bucket_v,
213 int num_transaxial_blocks_per_bucket_v,
214 int num_axial_crystals_per_block_v,
215 int num_transaxial_crystals_per_block_v,
216 int num_axial_crystals_per_singles_unit_v,
217 int num_transaxial_crystals_per_singles_unit_v,
218 int num_detector_layers_v,
219 float energy_resolution_v = -1.0f,
220 float reference_energy_v = -1.0f,
221 short int max_num_of_timing_poss = -1,
222 float size_timing_pos = -1.0f,
223 float timing_resolution = -1.0f,
224 const std::string& scanner_geometry_v =
"Cylindrical",
225 float axial_crystal_spacing_v = -1.0f,
226 float transaxial_crystal_spacing_v = -1.0f,
227 float axial_block_spacing_v = -1.0f,
228 float transaxial_block_spacing_v = -1.0f,
229 const std::string& crystal_map_file_name =
"");
238 const std::string& name,
239 int num_detectors_per_ring_v,
241 int max_num_non_arccorrected_bins_v,
242 int default_num_arccorrected_bins_v,
243 float inner_ring_radius_v,
244 float average_depth_of_interaction_v,
245 float ring_spacing_v,
247 float intrinsic_tilt_v,
248 int num_axial_blocks_per_bucket_v,
249 int num_transaxial_blocks_per_bucket_v,
250 int num_axial_crystals_per_block_v,
251 int num_transaxial_crystals_per_block_v,
252 int num_axial_crystals_per_singles_unit_v,
253 int num_transaxial_crystals_per_singles_unit_v,
254 int num_detector_layers_v,
255 float energy_resolution_v = -1.0f,
256 float reference_energy_v = -1.0f,
257 short int max_num_of_timing_poss = -1,
258 float size_timing_pos = -1.0f,
259 float timing_resolution = -1.0f,
260 const std::string& scanner_geometry_v =
"Cylindrical",
261 float axial_crystal_spacing_v = -1.0f,
262 float transaxial_crystal_spacing_v = -1.0f,
263 float axial_block_spacing_v = -1.0f,
264 float transaxial_block_spacing_v = -1.0f,
265 const std::string& crystal_map_file_name =
"");
271 virtual void set_up();
274 std::string parameter_info()
const;
276 const std::string& get_name()
const;
278 const std::list<std::string>& get_all_names()
const;
280 std::string list_names()
const;
283 bool operator==(
const Scanner& scanner)
const;
284 inline bool operator!=(
const Scanner& scanner)
const;
287 inline Type get_type()
const;
292 Succeeded check_consistency()
const;
298 inline int get_num_rings()
const;
300 inline int get_num_detectors_per_ring()
const;
310 inline int get_max_num_non_arccorrected_bins()
const;
317 inline int get_default_num_arccorrected_bins()
const;
320 inline int get_max_num_views()
const;
322 inline float get_inner_ring_radius()
const;
324 inline float get_max_FOV_radius()
const;
326 inline float get_effective_ring_radius()
const;
328 inline float get_average_depth_of_interaction()
const;
330 inline float get_ring_spacing()
const;
332 inline float get_default_bin_size()
const;
339 inline float get_intrinsic_azimuthal_tilt()
const;
343 inline int get_num_transaxial_blocks_per_bucket()
const;
345 inline int get_num_axial_blocks_per_bucket()
const;
347 inline int get_num_axial_crystals_per_block()
const;
349 inline int get_num_transaxial_crystals_per_block()
const;
351 inline int get_num_transaxial_crystals_per_bucket()
const;
353 inline int get_num_axial_crystals_per_bucket()
const;
355 inline int get_num_detector_layers()
const;
357 inline int get_num_axial_blocks()
const;
359 inline int get_num_transaxial_blocks()
const;
361 inline int get_num_axial_buckets()
const;
363 inline int get_num_transaxial_buckets()
const;
366 inline int get_num_axial_crystals_per_singles_unit()
const;
368 inline int get_num_transaxial_crystals_per_singles_unit()
const;
372 inline int get_num_axial_singles_units()
const;
374 inline int get_num_transaxial_singles_units()
const;
376 inline int get_num_singles_units()
const;
379 inline int get_max_num_timing_poss()
const;
385 inline float get_size_of_timing_pos()
const;
391 inline float get_timing_resolution()
const;
400 float get_coincidence_window_width_in_ps()
const;
403 float get_coincidence_window_width_in_mm()
const;
413 int get_num_virtual_axial_crystals_per_block()
const;
414 int get_num_virtual_transaxial_crystals_per_block()
const;
415 void set_num_virtual_axial_crystals_per_block(
int);
416 void set_num_virtual_transaxial_crystals_per_block(
int);
423 inline std::string get_scanner_geometry()
const;
425 inline float get_axial_crystal_spacing()
const;
427 inline float get_transaxial_crystal_spacing()
const;
429 inline float get_axial_block_spacing()
const;
431 inline float get_transaxial_block_spacing()
const;
436 inline float get_axial_length()
const;
441 inline std::string get_crystal_map_file_name()
const;
455 inline float get_energy_resolution()
const;
458 inline float get_reference_energy()
const;
460 inline bool has_energy_information()
const;
472 inline void set_type(
const Type& new_type);
474 inline void set_num_rings(
const int& new_num);
476 inline void set_num_detectors_per_ring(
const int& new_num);
478 inline void set_max_num_non_arccorrected_bins(
const int& new_num);
480 inline void set_default_num_arccorrected_bins(
const int& new_num);
482 inline void set_inner_ring_radius(
const float& new_radius);
484 inline void set_average_depth_of_interaction(
const float& new_depth_of_interaction);
486 inline void set_ring_spacing(
const float& new_spacing);
488 inline void set_default_bin_size(
const float& new_size);
490 inline void set_intrinsic_azimuthal_tilt(
const float new_tilt);
494 inline void set_num_transaxial_blocks_per_bucket(
const int& new_num);
496 inline void set_num_axial_blocks_per_bucket(
const int& new_num);
498 inline void set_num_axial_crystals_per_block(
const int& new_num);
500 inline void set_num_transaxial_crystals_per_block(
const int& new_num);
502 inline void set_num_detector_layers(
const int& new_num);
504 inline void set_num_axial_crystals_per_singles_unit(
const int& new_num);
506 inline void set_num_transaxial_crystals_per_singles_unit(
const int& new_num);
519 void set_scanner_geometry(
const std::string& new_scanner_geometry);
521 inline void set_axial_crystal_spacing(
const float& new_spacing);
523 inline void set_transaxial_crystal_spacing(
const float& new_spacing);
525 inline void set_axial_block_spacing(
const float& new_spacing);
527 inline void set_transaxial_block_spacing(
const float& new_spacing);
530 inline void set_crystal_map_file_name(
const std::string& new_crystal_map_file_name);
536 inline void set_energy_resolution(
const float new_num);
539 inline void set_reference_energy(
const float new_num);
541 inline void set_max_num_timing_poss(
int new_num);
543 inline void set_size_of_timing_poss(
float new_num);
545 inline void set_timing_resolution(
float new_num_in_ps);
551 inline int get_singles_bin_index(
int axial_index,
int transaxial_index)
const;
555 inline int get_singles_bin_index(
const DetectionPosition<>& det_pos)
const;
558 inline int get_axial_singles_unit(
int singles_bin_index)
const;
561 inline int get_transaxial_singles_unit(
int singles_bin_index)
const;
564 inline bool is_tof_ready()
const;
566 inline bool is_already_setup()
const {
return _already_setup; }
570 inline stir::DetectionPosition<> get_det_pos_for_index(
const stir::DetectionPosition<>& det_pos)
const;
573 inline stir::CartesianCoordinate3D<float> get_coordinate_for_det_pos(
const stir::DetectionPosition<>& det_pos)
const;
575 inline stir::CartesianCoordinate3D<float> get_coordinate_for_index(
const stir::DetectionPosition<>& det_pos)
const;
578 inline Succeeded find_detection_position_given_cartesian_coordinate(DetectionPosition<>& det_pos,
579 const CartesianCoordinate3D<float>& cart_coord)
const;
581 shared_ptr<const DetectorCoordinateMap>
STIR_DEPRECATED get_detector_map_sptr()
const {
return detector_map_sptr; }
582 shared_ptr<const DetectorCoordinateMap> get_detector_coordinate_map_sptr()
const {
return detector_map_sptr; }
583 const DetectorCoordinateMap& get_detector_coordinate_map()
const {
return *detector_map_sptr; }
588 std::list<std::string> list_of_names;
590 int max_num_non_arccorrected_bins;
591 int default_num_arccorrected_bins;
592 int num_detectors_per_ring;
594 float inner_ring_radius;
595 float average_depth_of_interaction;
596 float max_FOV_radius;
599 float intrinsic_tilt;
601 int num_transaxial_blocks_per_bucket;
602 int num_axial_blocks_per_bucket;
603 int num_axial_crystals_per_block;
604 int num_transaxial_crystals_per_block;
605 int num_detector_layers;
607 int num_axial_crystals_per_singles_unit;
608 int num_transaxial_crystals_per_singles_unit;
615 float energy_resolution;
618 float reference_energy;
620 float timing_resolution;
622 int max_num_of_timing_poss;
624 float size_timing_pos;
629 std::string scanner_geometry;
630 float axial_crystal_spacing;
631 float transaxial_crystal_spacing;
632 float axial_block_spacing;
633 float transaxial_block_spacing;
635 std::string crystal_map_file_name;
636 shared_ptr<const DetectorCoordinateMap> detector_map_sptr;
639 void set_detector_coordinate_map_sptr(shared_ptr<const DetectorCoordinateMap> new_map_sptr);
641 void set_detector_coordinate_map(
const DetectorCoordinateMap& coord_map);
642 void initialise_max_FOV_radius();
645 void read_detectormap_from_file(
const std::string& filename);
648 void set_params(Type type_v,
649 const std::list<std::string>& list_of_names_v,
651 int max_num_non_arccorrected_bins_v,
652 int default_num_arccorrected_bins_v,
653 int num_detectors_per_ring_v,
654 float inner_ring_radius_v,
655 float average_depth_of_interaction_v,
656 float ring_spacing_v,
658 float intrinsic_tilt_v,
659 int num_axial_blocks_per_bucket_v,
660 int num_transaxial_blocks_per_bucket_v,
661 int num_axial_crystals_per_block_v,
662 int num_transaxial_crystals_per_block_v,
663 int num_axial_crystals_per_singles_unit_v,
664 int num_transaxial_crystals_per_singles_unit_v,
665 int num_detector_layers_v,
666 float energy_resolution_v = -1.0f,
667 float reference_energy = -1.0f,
668 short int max_num_of_timing_poss_v = -1.0f,
669 float size_timing_pos_v = -1.0f,
670 float timing_resolution_v = -1.0f,
671 const std::string& scanner_geometry_v =
"",
672 float axial_crystal_spacing_v = -1.0f,
673 float transaxial_crystal_spacing_v = -1.0f,
674 float axial_block_spacing_v = -1.0f,
675 float transaxial_block_spacing_v = -1.0f,
676 const std::string& crystal_map_file_name =
"");