33 #ifndef __stir_buildblock_SCANNER_H__ 34 #define __stir_buildblock_SCANNER_H__ 46 #include <boost/algorithm/string.hpp> 47 #include <boost/unordered_map.hpp> 113 static Scanner* ask_parameters();
116 static Scanner* get_scanner_from_name(
const std::string& name);
121 static std::string list_all_names();
127 static std::list<std::string> get_names_of_predefined_scanners();
177 SAFIRDualRingPrototype,
179 UPENN_5rings_no_gaps,
181 UPENN_6rings_no_gaps,
182 User_defined_scanner,
198 const std::list<std::string>& list_of_names_v,
199 int num_detectors_per_ring_v,
201 int max_num_non_arccorrected_bins_v,
202 int default_num_arccorrected_bins_v,
203 float inner_ring_radius_v,
204 float average_depth_of_interaction_v,
205 float ring_spacing_v,
207 float intrinsic_tilt_v,
208 int num_axial_blocks_per_bucket_v,
209 int num_transaxial_blocks_per_bucket_v,
210 int num_axial_crystals_per_block_v,
211 int num_transaxial_crystals_per_block_v,
212 int num_axial_crystals_per_singles_unit_v,
213 int num_transaxial_crystals_per_singles_unit_v,
214 int num_detector_layers_v,
215 float energy_resolution_v = -1.0f,
216 float reference_energy_v = -1.0f,
217 short int max_num_of_timing_poss = -1,
218 float size_timing_pos = -1.0f,
219 float timing_resolution = -1.0f,
220 const std::string& scanner_geometry_v =
"Cylindrical",
221 float axial_crystal_spacing_v = -1.0f,
222 float transaxial_crystal_spacing_v = -1.0f,
223 float axial_block_spacing_v = -1.0f,
224 float transaxial_block_spacing_v = -1.0f,
225 const std::string& crystal_map_file_name =
"");
234 const std::string& name,
235 int num_detectors_per_ring_v,
237 int max_num_non_arccorrected_bins_v,
238 int default_num_arccorrected_bins_v,
239 float inner_ring_radius_v,
240 float average_depth_of_interaction_v,
241 float ring_spacing_v,
243 float intrinsic_tilt_v,
244 int num_axial_blocks_per_bucket_v,
245 int num_transaxial_blocks_per_bucket_v,
246 int num_axial_crystals_per_block_v,
247 int num_transaxial_crystals_per_block_v,
248 int num_axial_crystals_per_singles_unit_v,
249 int num_transaxial_crystals_per_singles_unit_v,
250 int num_detector_layers_v,
251 float energy_resolution_v = -1.0f,
252 float reference_energy_v = -1.0f,
253 short int max_num_of_timing_poss = -1,
254 float size_timing_pos = -1.0f,
255 float timing_resolution = -1.0f,
256 const std::string& scanner_geometry_v =
"Cylindrical",
257 float axial_crystal_spacing_v = -1.0f,
258 float transaxial_crystal_spacing_v = -1.0f,
259 float axial_block_spacing_v = -1.0f,
260 float transaxial_block_spacing_v = -1.0f,
261 const std::string& crystal_map_file_name =
"");
267 virtual void set_up();
270 std::string parameter_info()
const;
272 const std::string& get_name()
const;
274 const std::list<std::string>& get_all_names()
const;
276 std::string list_names()
const;
279 bool operator==(
const Scanner& scanner)
const;
280 inline bool operator!=(
const Scanner& scanner)
const;
283 inline Type get_type()
const;
294 inline int get_num_rings()
const;
296 inline int get_num_detectors_per_ring()
const;
306 inline int get_max_num_non_arccorrected_bins()
const;
313 inline int get_default_num_arccorrected_bins()
const;
316 inline int get_max_num_views()
const;
318 inline float get_inner_ring_radius()
const;
320 inline float get_max_FOV_radius()
const;
322 inline float get_effective_ring_radius()
const;
324 inline float get_average_depth_of_interaction()
const;
326 inline float get_ring_spacing()
const;
328 inline float get_default_bin_size()
const;
335 inline float get_intrinsic_azimuthal_tilt()
const;
338 inline int get_num_transaxial_blocks_per_bucket()
const;
341 inline int get_num_axial_blocks_per_bucket()
const;
343 inline int get_num_axial_crystals_per_block()
const;
345 inline int get_num_transaxial_crystals_per_block()
const;
347 inline int get_num_transaxial_crystals_per_bucket()
const;
349 inline int get_num_axial_crystals_per_bucket()
const;
351 inline int get_num_detector_layers()
const;
353 inline int get_num_axial_blocks()
const;
355 inline int get_num_transaxial_blocks()
const;
357 inline int get_num_axial_buckets()
const;
359 inline int get_num_transaxial_buckets()
const;
362 inline int get_num_axial_crystals_per_singles_unit()
const;
364 inline int get_num_transaxial_crystals_per_singles_unit()
const;
368 inline int get_num_axial_singles_units()
const;
370 inline int get_num_transaxial_singles_units()
const;
372 inline int get_num_singles_units()
const;
375 inline int get_max_num_timing_poss()
const;
381 inline float get_size_of_timing_pos()
const;
387 inline float get_timing_resolution()
const;
396 float get_coincidence_window_width_in_ps()
const;
399 float get_coincidence_window_width_in_mm()
const;
409 int get_num_virtual_axial_crystals_per_block()
const;
410 int get_num_virtual_transaxial_crystals_per_block()
const;
411 void set_num_virtual_axial_crystals_per_block(
int);
412 void set_num_virtual_transaxial_crystals_per_block(
int);
419 inline std::string get_scanner_geometry()
const;
421 inline float get_axial_crystal_spacing()
const;
423 inline float get_transaxial_crystal_spacing()
const;
425 inline float get_axial_block_spacing()
const;
427 inline float get_transaxial_block_spacing()
const;
432 inline float get_axial_length()
const;
437 inline std::string get_crystal_map_file_name()
const;
451 inline float get_energy_resolution()
const;
454 inline float get_reference_energy()
const;
456 inline bool has_energy_information()
const;
468 inline void set_type(
const Type& new_type);
470 inline void set_num_rings(
const int& new_num);
472 inline void set_num_detectors_per_ring(
const int& new_num);
474 inline void set_max_num_non_arccorrected_bins(
const int& new_num);
476 inline void set_default_num_arccorrected_bins(
const int& new_num);
478 inline void set_inner_ring_radius(
const float& new_radius);
480 inline void set_average_depth_of_interaction(
const float& new_depth_of_interaction);
482 inline void set_ring_spacing(
const float& new_spacing);
484 inline void set_default_bin_size(
const float& new_size);
486 inline void set_intrinsic_azimuthal_tilt(
const float new_tilt);
489 inline void set_num_transaxial_blocks_per_bucket(
const int& new_num);
492 inline void set_num_axial_blocks_per_bucket(
const int& new_num);
494 inline void set_num_axial_crystals_per_block(
const int& new_num);
496 inline void set_num_transaxial_crystals_per_block(
const int& new_num);
498 inline void set_num_detector_layers(
const int& new_num);
500 inline void set_num_axial_crystals_per_singles_unit(
const int& new_num);
502 inline void set_num_transaxial_crystals_per_singles_unit(
const int& new_num);
515 void set_scanner_geometry(
const std::string& new_scanner_geometry);
517 inline void set_axial_crystal_spacing(
const float& new_spacing);
519 inline void set_transaxial_crystal_spacing(
const float& new_spacing);
521 inline void set_axial_block_spacing(
const float& new_spacing);
523 inline void set_transaxial_block_spacing(
const float& new_spacing);
526 inline void set_crystal_map_file_name(
const std::string& new_crystal_map_file_name);
532 inline void set_energy_resolution(
const float new_num);
535 inline void set_reference_energy(
const float new_num);
537 inline void set_max_num_timing_poss(
int new_num);
539 inline void set_size_of_timing_poss(
float new_num);
541 inline void set_timing_resolution(
float new_num_in_ps);
547 inline int get_singles_bin_index(
int axial_index,
int transaxial_index)
const;
554 inline int get_axial_singles_unit(
int singles_bin_index)
const;
557 inline int get_transaxial_singles_unit(
int singles_bin_index)
const;
560 inline bool is_tof_ready()
const;
575 shared_ptr<const DetectorCoordinateMap> get_detector_map_sptr()
const {
return detector_map_sptr; }
580 std::list<std::string> list_of_names;
582 int max_num_non_arccorrected_bins;
583 int default_num_arccorrected_bins;
584 int num_detectors_per_ring;
586 float inner_ring_radius;
587 float average_depth_of_interaction;
588 float max_FOV_radius;
591 float intrinsic_tilt;
593 int num_transaxial_blocks_per_bucket;
594 int num_axial_blocks_per_bucket;
595 int num_axial_crystals_per_block;
596 int num_transaxial_crystals_per_block;
597 int num_detector_layers;
599 int num_axial_crystals_per_singles_unit;
600 int num_transaxial_crystals_per_singles_unit;
607 float energy_resolution;
610 float reference_energy;
612 float timing_resolution;
614 int max_num_of_timing_poss;
616 float size_timing_pos;
622 std::string scanner_geometry;
623 float axial_crystal_spacing;
624 float transaxial_crystal_spacing;
625 float axial_block_spacing;
626 float transaxial_block_spacing;
628 std::string crystal_map_file_name;
629 shared_ptr<DetectorCoordinateMap> detector_map_sptr;
631 void set_detector_map(
const DetectorCoordinateMap::det_pos_to_coord_type& coord_map);
632 void initialise_max_FOV_radius();
635 void read_detectormap_from_file(
const std::string& filename);
638 void set_params(
Type type_v,
639 const std::list<std::string>& list_of_names_v,
641 int max_num_non_arccorrected_bins_v,
642 int default_num_arccorrected_bins_v,
643 int num_detectors_per_ring_v,
644 float inner_ring_radius_v,
645 float average_depth_of_interaction_v,
646 float ring_spacing_v,
648 float intrinsic_tilt_v,
649 int num_axial_blocks_per_bucket_v,
650 int num_transaxial_blocks_per_bucket_v,
651 int num_axial_crystals_per_block_v,
652 int num_transaxial_crystals_per_block_v,
653 int num_axial_crystals_per_singles_unit_v,
654 int num_transaxial_crystals_per_singles_unit_v,
655 int num_detector_layers_v,
656 float energy_resolution_v = -1.0f,
657 float reference_energy = -1.0f,
658 short int max_num_of_timing_poss_v = -1.0f,
659 float size_timing_pos_v = -1.0f,
660 float timing_resolution_v = -1.0f,
661 const std::string& scanner_geometry_v =
"",
662 float axial_crystal_spacing_v = -1.0f,
663 float transaxial_crystal_spacing_v = -1.0f,
664 float axial_block_spacing_v = -1.0f,
665 float transaxial_block_spacing_v = -1.0f,
666 const std::string& crystal_map_file_name =
"");
implementation of inline functions of class Scanner
Type
enum for all predefined scanners
Definition: Scanner.h:140
Import of std::shared_ptr, std::dynamic_pointer_cast and std::static_pointer_cast into the stir names...
Test class for Blocks.
Definition: test_blocks_on_cylindrical_projectors.cxx:65
A class for storing some info on the scanner.
Definition: Scanner.h:107
Declaration of class stir::DetectorCoordinateMap.
Declaration of class stir::DetectionPosition.
a class containing an enumeration type that can be used by functions to signal successful operation o...
Definition: Succeeded.h:43
defines the stir::CartesianCoordinate3D<coordT> class