32 #ifndef STIR_DATA_CONTAINER_TYPES
33 #define STIR_DATA_CONTAINER_TYPES
41 #include "sirf/STIR/stir_types.h"
42 #include "sirf/iUtilities/LocalisedException.h"
45 #include "sirf/common/JacobiCG.h"
46 #include "sirf/common/DataContainer.h"
47 #include "sirf/common/ANumRef.h"
48 #include "sirf/common/ImageData.h"
49 #include "sirf/common/GeometricalInfo.h"
50 #include "stir/ZoomOptions.h"
52 #if STIR_VERSION < 050000
53 #define SPTR_WRAP(X) X->create_shared_clone()
55 #define SPTR_WRAP(X) X
62 static long long milliseconds()
64 auto now = std::chrono::system_clock::now();
65 auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
66 return (
long long)ms.count();
68 static std::string scratch_file_name()
72 long long int ms = milliseconds();
74 sprintf(buff,
"tmp_%d_%lld", calls, ms);
75 return std::string(buff);
90 ProjDataFile(
const stir::ProjData& pd,
const std::string& filename,
bool owns_file =
true) :
91 stir::ProjDataInterfile(pd.get_exam_info_sptr(),
92 pd.get_proj_data_info_sptr()->create_shared_clone(),
93 filename, std::ios::in | std::ios::out | std::ios::trunc),
97 ProjDataFile(stir::shared_ptr<const stir::ExamInfo> sptr_exam_info,
98 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info,
99 const std::string& filename,
bool owns_file =
true) :
100 stir::ProjDataInterfile(SPTR_WRAP(sptr_exam_info), SPTR_WRAP(sptr_proj_data_info),
101 filename, std::ios::in | std::ios::out | std::ios::trunc),
103 _owns_file(owns_file)
112 err = std::remove((_filename +
".hs").c_str());
114 std::cout <<
"deleting " << _filename <<
".hs "
115 <<
"failed, please delete manually" << std::endl;
116 err = std::remove((_filename +
".s").c_str());
118 std::cout <<
"deleting " << _filename <<
".s "
119 <<
"failed, please delete manually" << std::endl;
121 stir::shared_ptr<std::iostream> sino_stream_sptr()
127 ((std::fstream*)sino_stream.get())->close();
131 ((std::fstream*)sino_stream.get())->clear();
135 std::string _filename;
146 virtual ~STIRScanData() {}
147 virtual stir::shared_ptr<stir::ExamData> data_sptr()
const = 0;
166 (stir::shared_ptr<const stir::ExamInfo> sptr_exam_info,
167 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
const = 0;
168 virtual std::shared_ptr<STIRAcquisitionData> new_acquisition_data()
const = 0;
170 std::string get_info()
const
172 return this->data()->get_exam_info_sptr()->parameter_info() +
173 this->data()->get_proj_data_info_sptr()->parameter_info();
176 virtual bool is_complex()
const
181 virtual std::unique_ptr<STIRAcquisitionData> get_subset(
const std::vector<int>& views)
const = 0;
199 const int num_segments_to_combine,
200 const int num_views_to_combine = 1,
201 const int num_tang_poss_to_trim = 0,
202 const bool do_normalisation =
true,
203 const int max_in_segment_num_to_process = -1,
204 const int num_tof_bins_to_combine = 1
207 stir::shared_ptr<stir::ProjDataInfo> out_proj_data_info_sptr(
208 stir::SSRB(*data()->get_proj_data_info_sptr(),
209 num_segments_to_combine,
210 num_views_to_combine,
211 num_tang_poss_to_trim,
212 max_in_segment_num_to_process,
213 num_tof_bins_to_combine
215 std::shared_ptr<STIRAcquisitionData>
216 sptr(same_acquisition_data
217 (this->get_exam_info_sptr(), out_proj_data_info_sptr));
218 stir::SSRB(*sptr, *data(), do_normalisation);
222 static std::string storage_scheme()
224 static bool initialized =
false;
226 _storage_scheme =
"file";
229 return _storage_scheme;
231 static std::shared_ptr<STIRAcquisitionData> storage_template()
234 error(
"storage_template error. You probably need to call set_storage_scheme() first");
238 stir::shared_ptr<stir::ProjData> data()
247 const stir::shared_ptr<stir::ProjData> data() const
253 virtual stir::shared_ptr<stir::ExamData> data_sptr()
const
258 void set_data(stir::shared_ptr<stir::ProjData> data)
264 virtual void fill(
const float v) { data()->fill(v); }
265 virtual void fill(
const STIRAcquisitionData& ad)
268 THROW(
"The source of STIRAcquisitionData::fill is empty");
269 stir::shared_ptr<const stir::ProjData> sptr = ad.data();
272 virtual void fill_from(
const float* d) { data()->fill_from(d); }
273 virtual void copy_to(
float* d)
const { data()->copy_to(d); }
274 std::unique_ptr<STIRAcquisitionData> clone()
const
276 return std::unique_ptr<STIRAcquisitionData>(clone_impl());
280 unsigned int items()
const {
282 return _is_empty ? 0 : 1;
285 get_segment_by_sinogram(0,0);
287 get_segment_by_sinogram(0);
297 virtual float norm()
const;
299 virtual void sum(
void* ptr)
const;
300 virtual void max(
void* ptr)
const;
301 virtual void min(
void* ptr)
const;
302 virtual void dot(
const DataContainer& a_x,
void* ptr)
const;
303 float dot(
const DataContainer& a_x)
const
310 const void* ptr_a,
const DataContainer& a_x,
311 const void* ptr_b,
const DataContainer& a_y);
313 const DataContainer& a_x,
const void* ptr_a,
314 const DataContainer& a_y,
const void* ptr_b);
316 const DataContainer& a_x,
const DataContainer& a_a,
317 const DataContainer& a_y,
const DataContainer& a_b);
319 const DataContainer& a_x,
const void* ptr_a,
320 const DataContainer& a_y,
const DataContainer& a_b);
323 unary_op(x, std::abs);
327 unary_op(x, std::exp);
331 unary_op(x, std::log);
335 unary_op(x, std::sqrt);
343 float y = *
static_cast<const float*
>(ptr_y);
344 semibinary_op(x, y, DataContainer::product<float>);
348 float y = *
static_cast<const float*
>(ptr_y);
349 semibinary_op(x, y, DataContainer::sum<float>);
351 virtual void divide(
const DataContainer& x,
const void* ptr_y)
353 float y = *
static_cast<const float*
>(ptr_y);
354 semibinary_op(x, y, DataContainer::ratio<float>);
356 virtual void maximum(
const DataContainer& x,
const void* ptr_y)
358 float y = *
static_cast<const float*
>(ptr_y);
359 semibinary_op(x, y, DataContainer::maximum<float>);
361 virtual void minimum(
const DataContainer& x,
const void* ptr_y)
363 float y = *
static_cast<const float*
>(ptr_y);
364 semibinary_op(x, y, DataContainer::minimum<float>);
366 virtual void power(
const DataContainer& x,
const void* ptr_y)
368 float y = *
static_cast<const float*
>(ptr_y);
369 semibinary_op(x, y, std::pow);
373 binary_op(x, y, DataContainer::product<float>);
377 binary_op(x, y, DataContainer::ratio<float>);
381 binary_op(x, y, DataContainer::maximum<float>);
385 binary_op(x, y, DataContainer::minimum<float>);
389 binary_op(x, y, std::pow);
392 virtual void write(
const std::string &filename)
const
399 int get_num_tangential_poss()
401 return data()->get_num_tangential_poss();
405 return data()->get_num_views();
413 return data()->get_num_sinograms();
419 return data()->get_num_non_tof_sinograms();
422 int get_num_TOF_bins()
424 return data()->get_num_tof_poss();
427 int get_tof_mash_factor()
const
429 return data()->get_proj_data_info_sptr()->get_tof_mash_factor();
432 size_t get_dimensions(
int* dim)
434 dim[0] = get_num_tangential_poss();
435 dim[1] = get_num_views();
437 dim[3] = get_num_TOF_bins();
438 return static_cast<size_t>(dim[0] * dim[1] * dim[2] * dim[3]);
440 int get_max_segment_num()
const
442 return data()->get_max_segment_num();
445 stir::SegmentBySinogram<float>
446 get_segment_by_sinogram(
const int segment_num,
const int timing_pos_num)
const
448 return data()->get_segment_by_sinogram(segment_num, timing_pos_num);
451 stir::SegmentBySinogram<float>
452 get_segment_by_sinogram(
const int segment_num)
const
454 return data()->get_segment_by_sinogram(segment_num);
458 stir::SegmentBySinogram<float>
459 get_empty_segment_by_sinogram(
const int segment_num,
const int timing_pos_num)
const
461 return data()->get_empty_segment_by_sinogram(segment_num,
false, timing_pos_num);
464 stir::SegmentBySinogram<float>
465 get_empty_segment_by_sinogram(
const int segment_num)
const
467 return data()->get_empty_segment_by_sinogram(segment_num);
470 void set_segment(
const stir::SegmentBySinogram<float>& s)
472 if (data()->set_segment(s) != stir::Succeeded::yes)
473 THROW(
"stir::ProjData set segment failed");
475 stir::shared_ptr<const stir::ExamInfo> get_exam_info_sptr()
const
477 return data()->get_exam_info_sptr();
479 stir::shared_ptr<const stir::ProjDataInfo> get_proj_data_info_sptr()
const
481 return data()->get_proj_data_info_sptr();
485 operator stir::ProjData&() {
return *data(); }
486 operator const stir::ProjData&()
const {
return *data(); }
487 operator stir::shared_ptr<stir::ProjData>() {
return data(); }
489 static stir::shared_ptr<stir::ProjDataInfo>
490 proj_data_info_from_scanner(std::string scanner_name,
491 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
493 stir::shared_ptr<stir::Scanner>
494 sptr_s(stir::Scanner::get_scanner_from_name(scanner_name));
499 int num_views = sptr_s->get_num_detectors_per_ring() / 2 / view_mash_factor;
500 int num_tang_pos = sptr_s->get_max_num_non_arccorrected_bins();
501 if (max_ring_diff < 0)
502 max_ring_diff = sptr_s->get_num_rings() - 1;
503 return std::move(stir::ProjDataInfo::construct_proj_data_info
504 (sptr_s, span, max_ring_diff, num_views, num_tang_pos,
false));
507 void unary_op(
const DataContainer& a_x,
float(*f)(
float));
508 void semibinary_op(
const DataContainer& a_x,
float y,
float(*f)(
float,
float));
509 void binary_op(
const DataContainer& a_x,
const DataContainer& a_y,
float(*f)(
float,
float));
512 static std::string _storage_scheme;
513 static std::shared_ptr<STIRAcquisitionData> _template;
514 stir::shared_ptr<stir::ProjData> _data;
515 virtual STIRAcquisitionData* clone_impl()
const = 0;
516 STIRAcquisitionData* clone_base()
const
518 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi = this->get_proj_data_info_sptr()->create_shared_clone();
519 STIRAcquisitionData* ptr =
520 _template->same_acquisition_data(this->get_exam_info_sptr(), sptr_pdi);
521 if (!this->is_empty())
527 mutable int _is_empty = -1;
541 _data = stir::ProjData::read_from_file(filename);
544 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
547 (MAKE_SHARED<stir::ExamInfo>(*sptr_exam_info), sptr_proj_data_info,
548 _filename = SIRFUtilities::scratch_file_name()));
553 (pd, _filename = SIRFUtilities::scratch_file_name()));
556 (stir::shared_ptr<stir::ExamInfo> sptr_ei, std::string scanner_name,
557 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
559 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi =
560 STIRAcquisitionData::proj_data_info_from_scanner
561 (scanner_name, span, max_ring_diff, view_mash_factor);
563 _filename = SIRFUtilities::scratch_file_name());
570 auto pd_ptr =
dynamic_cast<stir::ProjDataInterfile*
>(uptr_pd.get());
572 _data = std::move(uptr_pd);
574 stir::ProjData& pd = *uptr_pd;
575 stir::shared_ptr<const stir::ExamInfo> sptr_exam_info =
576 pd.get_exam_info_sptr();
577 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info =
578 pd.get_proj_data_info_sptr()->create_shared_clone();
580 (MAKE_SHARED<stir::ExamInfo>(*sptr_exam_info), sptr_proj_data_info,
581 _filename = SIRFUtilities::scratch_file_name()));
585 std::shared_ptr<STIRAcquisitionData> new_acquisition_data(std::string filename)
588 sptr_ad->_data.reset(
new ProjDataFile(*data(), filename,
false));
593 static bool initialized =
false;
595 _storage_scheme =
"file";
598 STIRAcquisitionData::storage_scheme();
601 static void set_as_template()
604 _storage_scheme =
"file";
609 (stir::shared_ptr<const stir::ExamInfo> sptr_exam_info,
610 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
const
620 this->get_exam_info_sptr(),
621 this->get_proj_data_info_sptr()->create_shared_clone());
623 (std::shared_ptr<DataContainer>(ptr));
625 virtual std::shared_ptr<STIRAcquisitionData> new_acquisition_data()
const
628 return std::shared_ptr < STIRAcquisitionData >
629 (_template->same_acquisition_data(this->get_exam_info_sptr(),
630 this->get_proj_data_info_sptr()->create_shared_clone()));
632 virtual std::unique_ptr<STIRAcquisitionData> get_subset(
const std::vector<int>& views)
const;
636 std::string _filename;
654 stir::shared_ptr<const stir::ProjDataInfo> sptr_proj_data_info)
656 _data = stir::shared_ptr<stir::ProjData>
657 (
new stir::ProjDataInMemory(SPTR_WRAP(sptr_exam_info), SPTR_WRAP(sptr_proj_data_info)));
661 _data = stir::shared_ptr<stir::ProjData>
662 (
new stir::ProjDataInMemory(templ.get_exam_info_sptr(),
663 templ.get_proj_data_info_sptr()->create_shared_clone()));
666 (stir::shared_ptr<stir::ExamInfo> sptr_ei, std::string scanner_name,
667 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
669 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi =
670 STIRAcquisitionData::proj_data_info_from_scanner
671 (scanner_name, span, max_ring_diff, view_mash_factor);
672 stir::ProjDataInMemory* ptr =
new stir::ProjDataInMemory(sptr_ei, sptr_pdi);
679 auto pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(uptr_pd.get());
681 _data = std::move(uptr_pd);
683 std::cout <<
"copying ProjData to ProjDataInMemory...\n";
684 const stir::ProjData& pd = *uptr_pd;
685 auto exam_info_sptr = SPTR_WRAP(pd.get_exam_info_sptr());
686 auto proj_data_info_sptr =
687 SPTR_WRAP(pd.get_proj_data_info_sptr()->create_shared_clone());
688 _data.reset(
new stir::ProjDataInMemory(exam_info_sptr, proj_data_info_sptr));
695 auto pd_sptr = stir::ProjData::read_from_file(filename);
696 bool is_empty =
false;
698 pd_sptr->get_segment_by_sinogram(0);
704 _data = stir::shared_ptr<stir::ProjData>
705 (
new stir::ProjDataInMemory(pd_sptr->get_exam_info_sptr(),
706 pd_sptr->get_proj_data_info_sptr()->create_shared_clone()));
708 _data = stir::shared_ptr<stir::ProjData>
709 (
new stir::ProjDataInMemory(*pd_sptr));
714 static void set_as_template()
717 _storage_scheme =
"memory";
721 virtual STIRAcquisitionData* same_acquisition_data
722 (stir::shared_ptr<const stir::ExamInfo> sptr_exam_info,
723 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
const
725 STIRAcquisitionData* ptr_ad =
726 new STIRAcquisitionDataInMemory(sptr_exam_info, sptr_proj_data_info);
732 DataContainer* ptr = _template->same_acquisition_data
733 (this->get_exam_info_sptr(),
734 this->get_proj_data_info_sptr()->create_shared_clone());
736 (std::shared_ptr<DataContainer>(ptr));
738 virtual std::shared_ptr<STIRAcquisitionData> new_acquisition_data()
const
741 return std::shared_ptr < STIRAcquisitionData >
742 (_template->same_acquisition_data
743 (this->get_exam_info_sptr(),
744 this->get_proj_data_info_sptr()->create_shared_clone()));
746 virtual std::unique_ptr<STIRAcquisitionData> get_subset(
const std::vector<int>& views)
const;
749 virtual void fill(
const float v)
751 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
753 if (is_null_ptr(pd_ptr))
754 return this->STIRAcquisitionData::fill(v);
757 auto iter = pd_ptr->begin();
758 while (iter != pd_ptr->end())
765 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
766 const stir::ProjDataInMemory *pd2_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(ad.data().get());
768 if (is_null_ptr(pd_ptr) || is_null_ptr(pd2_ptr))
769 return this->STIRAcquisitionData::fill(ad);
772 auto iter = pd_ptr->begin();
773 auto iter_other = pd2_ptr->begin();
774 while (iter != pd_ptr->end())
775 *iter++ = *iter_other++;
780 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
782 if (is_null_ptr(pd_ptr))
783 return this->STIRAcquisitionData::fill_from(d);
786 auto iter = pd_ptr->begin();
787 while (iter != pd_ptr->end())
793 const stir::ProjDataInMemory *pd_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(data().get());
795 if (is_null_ptr(pd_ptr))
796 return this->STIRAcquisitionData::copy_to(d);
799 auto iter = pd_ptr->begin();
800 while (iter != pd_ptr->end())
805 const stir::ProjDataInMemory *pd_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(data().get());
807 if (is_null_ptr(pd_ptr))
812 auto iter = pd_ptr->begin();
813 for (; iter != pd_ptr->end(); ++iter)
814 t += (*iter) * (*iter);
815 return std::sqrt((
float)t);
821 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
822 const stir::ProjDataInMemory *pd2_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(x->data().get());
824 if (is_null_ptr(pd_ptr) || is_null_ptr(pd2_ptr))
829 auto iter = pd_ptr->begin();
830 auto iter_other = pd2_ptr->begin();
831 while (iter != pd_ptr->end())
832 t += (*iter++) * double(*iter_other++);
834 float* ptr_t =
static_cast<float*
>(ptr);
843 auto *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
844 auto *pd_x_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_x->data().get());
845 auto *pd_y_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_y->data().get());
848 if (is_null_ptr(pd_ptr) || is_null_ptr(pd_x_ptr) || is_null_ptr(pd_x_ptr))
852 auto iter = pd_ptr->begin();
853 auto iter_x = pd_x_ptr->begin();
854 auto iter_y = pd_y_ptr->begin();
855 while (iter != pd_ptr->end())
856 *iter++ = (*iter_x++) * (*iter_y++);
864 auto *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
865 auto *pd_x_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_x->data().get());
866 auto *pd_y_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_y->data().get());
869 if (is_null_ptr(pd_ptr) || is_null_ptr(pd_x_ptr) || is_null_ptr(pd_x_ptr))
870 return this->STIRAcquisitionData::divide(x,y);
873 auto iter = pd_ptr->begin();
874 auto iter_x = pd_x_ptr->begin();
875 auto iter_y = pd_y_ptr->begin();
876 while (iter != pd_ptr->end())
877 *iter++ = (*iter_x++) / (*iter_y++);
897 _data = stir::read_from_file<stir::ListModeData>(lmdata_filename);
902 virtual stir::shared_ptr<stir::ExamData> data_sptr()
const {
905 virtual stir::shared_ptr<stir::ListModeData> data()
const {
911 THROW(
"ListmodeData::new_data_container_handle not implemented");
919 return std::shared_ptr < STIRAcquisitionData >
920 (STIRAcquisitionData::storage_template()->same_acquisition_data(this->data()->get_exam_info_sptr(),
921 this->data()->get_proj_data_info_sptr()->create_shared_clone()));
923 std::string get_info()
const
925 return this->data()->get_exam_info_sptr()->parameter_info() +
926 this->data()->get_proj_data_info_sptr()->parameter_info();
929 stir::shared_ptr<stir::ListModeData> _data;
930 virtual DataContainer* clone_impl()
const
932 THROW(
"ListmodeData::clone not implemented");
936 #if SIRF_VERSION_MAJOR < 4
945 typedef Image3DF::full_iterator Image3DFIterator;
946 typedef Image3DF::const_full_iterator Image3DFIterator_const;
964 typedef Image3DFIterator::difference_type difference_type;
965 typedef Image3DFIterator::value_type value_type;
966 typedef Image3DFIterator::reference reference;
967 typedef Image3DFIterator::pointer pointer;
968 typedef std::forward_iterator_tag iterator_category;
970 Iterator(
const Image3DFIterator& iter) : _iter(iter)
975 _ref.copy(iter._ref);
976 _sptr_iter = iter._sptr_iter;
990 virtual bool operator==(
const BaseIter& an_iter)
const
993 return _iter == iter._iter;
995 virtual bool operator!=(
const BaseIter& an_iter)
const
998 return _iter != iter._iter;
1007 Image3DFIterator _iter;
1009 std::shared_ptr<Iterator> _sptr_iter;
1018 _ref.copy(iter._ref);
1019 _sptr_iter = iter._sptr_iter;
1036 return _iter == iter._iter;
1041 return _iter != iter._iter;
1043 virtual const FloatRef& operator*()
const
1045 const float& v = *_iter;
1046 _ref.set_ptr((
void*)&v);
1050 Image3DFIterator_const _iter;
1052 std::shared_ptr<Iterator_const> _sptr_iter;
1058 _data.reset(image.data().clone());
1061 STIRImageData(
const STIRAcquisitionData& ad)
1063 _data.reset(
new Voxels3DF(MAKE_SHARED<stir::ExamInfo>(*ad.get_exam_info_sptr()), *ad.get_proj_data_info_sptr()));
1066 STIRImageData(
const Image3DF& image)
1068 _data.reset(image.clone());
1071 STIRImageData(
const Voxels3DF& v)
1073 _data.reset(v.clone());
1076 STIRImageData(
const stir::ProjDataInfo& pdi)
1078 _data.reset(
new Voxels3DF(pdi));
1081 STIRImageData(stir::shared_ptr<Image3DF> ptr)
1086 STIRImageData(std::string filename)
1088 _data = stir::read_from_file<Image3DF>(filename);
1091 STIRImageData* same_image_data()
const
1093 STIRImageData* ptr_image =
new STIRImageData;
1094 ptr_image->_data.reset(_data->get_empty_copy());
1095 ptr_image->set_up_geom_info();
1098 std::shared_ptr<STIRImageData> new_image_data()
1100 return std::shared_ptr<STIRImageData>(same_image_data());
1105 (std::shared_ptr<DataContainer>(same_image_data()));
1107 std::string get_info()
const
1109 return this->data().get_exam_info_sptr()->parameter_info();
1116 unsigned int items()
const
1121 std::string modality()
const
1123 ExamInfo ex_info = data().get_exam_info();
1124 return ex_info.imaging_modality.get_name();
1126 void set_modality(
const std::string& mod)
1128 ExamInfo ex_info = data().get_exam_info();
1129 ex_info.imaging_modality = ImagingModality(mod);
1130 data().set_exam_info(ex_info);
1134 virtual void write(
const std::string& filename)
const;
1155 virtual void write(
const std::string& filename,
const std::string& format_file)
const;
1157 virtual float norm()
const;
1159 virtual void sum(
void* ptr)
const;
1160 virtual void max(
void* ptr)
const;
1161 virtual void min(
void* ptr)
const;
1162 virtual void dot(
const DataContainer& a_x,
void* ptr)
const;
1164 const void* ptr_a,
const DataContainer& a_x,
1165 const void* ptr_b,
const DataContainer& a_y);
1167 const DataContainer& a_x,
const void* ptr_a,
1168 const DataContainer& a_y,
const void* ptr_b);
1170 const DataContainer& a_x,
const DataContainer& a_a,
1171 const DataContainer& a_y,
const DataContainer& a_b);
1173 const DataContainer& a_x,
const void* ptr_a,
1174 const DataContainer& a_y,
const DataContainer& a_b);
1177 unary_op(x, std::abs);
1181 unary_op(x, std::exp);
1185 unary_op(x, std::log);
1189 unary_op(x, std::sqrt);
1197 float y = *
static_cast<const float*
>(ptr_y);
1198 semibinary_op(x, y, DataContainer::product<float>);
1202 float y = *
static_cast<const float*
>(ptr_y);
1203 semibinary_op(x, y, DataContainer::sum<float>);
1205 virtual void divide(
const DataContainer& x,
const void* ptr_y)
1207 float y = *
static_cast<const float*
>(ptr_y);
1208 semibinary_op(x, y, DataContainer::ratio<float>);
1210 virtual void maximum(
const DataContainer& x,
const void* ptr_y)
1212 float y = *
static_cast<const float*
>(ptr_y);
1213 semibinary_op(x, y, DataContainer::maximum<float>);
1215 virtual void minimum(
const DataContainer& x,
const void* ptr_y)
1217 float y = *
static_cast<const float*
>(ptr_y);
1218 semibinary_op(x, y, DataContainer::minimum<float>);
1220 virtual void power(
const DataContainer& x,
const void* ptr_y)
1222 float y = *
static_cast<const float*
>(ptr_y);
1223 semibinary_op(x, y, std::pow);
1227 binary_op(x, y, DataContainer::product<float>);
1231 binary_op(x, y, DataContainer::ratio<float>);
1235 binary_op(x, y, DataContainer::maximum<float>);
1239 binary_op(x, y, DataContainer::minimum<float>);
1243 binary_op(x, y, std::pow);
1250 const Image3DF& data()
const
1254 Image3DF* data_ptr()
1258 const Image3DF* data_ptr()
const
1262 stir::shared_ptr<Image3DF> data_sptr()
1266 stir::shared_ptr<const Image3DF> data_sptr()
const
1270 void set_data_sptr(stir::shared_ptr<Image3DF> sptr_data)
1279 void scale(
float s);
1280 float dot(
const DataContainer& a_x)
const
1287 float a,
const DataContainer& a_x,
1288 float b,
const DataContainer& a_y)
1290 axpby(&a, a_x, &b, a_y);
1293 const DataContainer& a_x,
float a,
1294 const DataContainer& a_y,
float b)
1296 xapyb(a_x, &a, a_y, &b);
1300 return _data->size_all();
1302 virtual Dimensions dimensions()
const
1312 int get_dimensions(
int* dim)
const;
1313 void get_voxel_sizes(
float* vsizes)
const;
1314 virtual void get_data(
float* data)
const;
1315 virtual void set_data(
const float* data);
1316 virtual Iterator& begin()
1318 _begin.reset(
new Iterator(data().begin_all()));
1321 virtual Iterator_const& begin()
const
1323 _begin_const.reset(
new Iterator_const(data().begin_all()));
1324 return *_begin_const;
1326 virtual Iterator& end()
1328 _end.reset(
new Iterator(data().end_all()));
1331 virtual Iterator_const& end()
const
1333 _end_const.reset(
new Iterator_const(data().end_all()));
1338 std::unique_ptr<STIRImageData>
clone()
const
1340 return std::unique_ptr<STIRImageData>(this->clone_impl());
1346 void zoom_image(
const Coord3DF& zooms = { 1.f,1.f,1.f },
const Coord3DF& offsets_in_mm = { 0.f,0.f,0.f },
1347 const Coord3DI& new_sizes = { -1,-1,-1 },
const char*
const zoom_options_str =
"preserve_sum");
1352 void zoom_image(
const Coord3DF& zooms = { 1.f,1.f,1.f },
const Coord3DF& offsets_in_mm = { 0.f,0.f,0.f },
1353 const Coord3DI& new_sizes = { -1,-1,-1 },
1354 const stir::ZoomOptions zoom_options = stir::ZoomOptions::preserve_sum);
1363 void unary_op(
const DataContainer& a_x,
float(*f)(
float));
1364 void semibinary_op(
const DataContainer& a_x,
float y,
float(*f)(
float,
float));
1365 void binary_op(
const DataContainer& a_x,
const DataContainer& a_y,
float(*f)(
float,
float));
1369 virtual STIRImageData* clone_impl()
const
1371 return new STIRImageData(*
this);
1375 stir::shared_ptr<Image3DF> _data;
1376 mutable std::shared_ptr<Iterator> _begin;
1377 mutable std::shared_ptr<Iterator> _end;
1378 mutable std::shared_ptr<Iterator_const> _begin_const;
1379 mutable std::shared_ptr<Iterator_const> _end_const;
Execution status type and wrappers for C++ objects.
Definition: LocalisedException.h:32
Definition: DataHandle.h:159
Abstract data container.
Definition: DataContainer.h:44
Abstract data container with numerical operations.
Definition: DataContainer.h:58
virtual void sign(const DataContainer &x)=0
*this = the elementwise sign(x)
Definition: ImageData.h:52
Definition: ImageData.h:44
Definition: ImageData.h:38
STIR ProjDataInterfile wrapper with additional file managing features.
Definition: stir_data_containers.h:87
Definition: stir_data_containers.h:60
STIR ProjData wrapper with added functionality.
Definition: stir_data_containers.h:161
virtual void min(void *ptr) const
calculates the value of this container's element with the smallest real part
Definition: stir_data_containers.cpp:109
virtual void sum(void *ptr) const
below all void* are actually float*
Definition: stir_data_containers.cpp:59
virtual void sqrt(const DataContainer &x)
*this = the elementwise sqrt(x)
Definition: stir_data_containers.h:333
virtual void multiply(const DataContainer &x, const DataContainer &y)
*this = the elementwise product x*y
Definition: stir_data_containers.h:371
virtual void sign(const DataContainer &x)
*this = the elementwise sign(x)
Definition: stir_data_containers.h:337
virtual void xapyb(const DataContainer &a_x, const void *ptr_a, const DataContainer &a_y, const void *ptr_b)
alternative interface to the above
Definition: stir_data_containers.cpp:179
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: stir_data_containers.cpp:46
virtual void axpby(const void *ptr_a, const DataContainer &a_x, const void *ptr_b, const DataContainer &a_y)
*this = the linear combination of x and y
Definition: stir_data_containers.cpp:169
int get_num_sinograms() const
total number of (2D) sinograms
Definition: stir_data_containers.h:411
virtual void dot(const DataContainer &a_x, void *ptr) const
calculates the dot product of this container with another one
Definition: stir_data_containers.cpp:137
virtual void add(const DataContainer &x, const void *ptr_y)
*this = the sum x + y with scalar y
Definition: stir_data_containers.h:346
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: stir_data_containers.h:375
virtual void minimum(const DataContainer &x, const DataContainer &y)
*this = the elementwise min(x, y)
Definition: stir_data_containers.h:383
int get_num_non_TOF_sinograms() const
total number of (2D) sinograms ignoring time-of-flight
Definition: stir_data_containers.h:417
virtual void abs(const DataContainer &x)
*this = the elementwise abs(x)
Definition: stir_data_containers.h:321
virtual void max(void *ptr) const
calculates the value of this container's element with the largest real part
Definition: stir_data_containers.cpp:81
virtual void log(const DataContainer &x)
*this = the elementwise log(x)
Definition: stir_data_containers.h:329
virtual void maximum(const DataContainer &x, const DataContainer &y)
*this = the elementwise max(x, y)
Definition: stir_data_containers.h:379
virtual void exp(const DataContainer &x)
*this = the elementwise exp(x)
Definition: stir_data_containers.h:325
std::shared_ptr< STIRAcquisitionData > single_slice_rebinned_data(const int num_segments_to_combine, const int num_views_to_combine=1, const int num_tang_poss_to_trim=0, const bool do_normalisation=true, const int max_in_segment_num_to_process=-1, const int num_tof_bins_to_combine=1)
rebin the data to lower resolution by adding
Definition: stir_data_containers.h:198
virtual void multiply(const DataContainer &x, const void *ptr_y)
*this = the product x * y with scalar y
Definition: stir_data_containers.h:341
virtual void power(const DataContainer &x, const DataContainer &y)
*this = the elementwise pow(x, y)
Definition: stir_data_containers.h:387
In-file implementation of STIRAcquisitionData.
Definition: stir_data_containers.h:536
In-memory implementation of STIRAcquisitionData.
Definition: stir_data_containers.h:650
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: stir_data_containers.h:858
virtual void dot(const DataContainer &a_x, void *ptr) const
calculates the dot product of this container with another one
Definition: stir_data_containers.h:817
STIRAcquisitionDataInMemory(const char *filename)
Constructor for STIRAcquisitionDataInMemory from filename.
Definition: stir_data_containers.h:693
virtual void fill_from(const float *d)
Fill from float array.
Definition: stir_data_containers.h:778
virtual void fill(const STIRAcquisitionData &ad)
fill from another STIRAcquisitionData
Definition: stir_data_containers.h:762
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: stir_data_containers.h:803
virtual void multiply(const DataContainer &x, const DataContainer &y)
*this = the elementwise product x*y
Definition: stir_data_containers.h:837
virtual void fill(const float v)
fill with single value
Definition: stir_data_containers.h:749
virtual void copy_to(float *d) const
Copy to float array.
Definition: stir_data_containers.h:791
Definition: stir_data_containers.h:1011
Definition: stir_data_containers.h:960
STIR DiscretisedDensity<3, float> wrapper with added functionality.
Definition: stir_data_containers.h:956
virtual void abs(const DataContainer &x)
*this = the elementwise abs(x)
Definition: stir_data_containers.h:1175
virtual void sqrt(const DataContainer &x)
*this = the elementwise sqrt(x)
Definition: stir_data_containers.h:1187
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: stir_data_containers.h:1229
virtual void max(void *ptr) const
calculates the value of this container's element with the largest real part
Definition: stir_data_containers.cpp:512
virtual void multiply(const DataContainer &x, const DataContainer &y)
*this = the elementwise product x*y
Definition: stir_data_containers.h:1225
virtual void dot(const DataContainer &a_x, void *ptr) const
calculates the dot product of this container with another one
Definition: stir_data_containers.cpp:544
virtual void set_up_geom_info()
Populate the geometrical info metadata (from the image's own metadata)
Definition: stir_data_containers.cpp:891
void zoom_image(const Coord3DF &zooms={ 1.f, 1.f, 1.f }, const Coord3DF &offsets_in_mm={ 0.f, 0.f, 0.f }, const Coord3DI &new_sizes={ -1,-1,-1 }, const char *const zoom_options_str="preserve_sum")
Definition: stir_data_containers.cpp:838
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: stir_data_containers.cpp:673
std::unique_ptr< STIRImageData > clone() const
Clone and return as unique pointer.
Definition: stir_data_containers.h:1338
virtual void maximum(const DataContainer &x, const DataContainer &y)
*this = the elementwise max(x, y)
Definition: stir_data_containers.h:1233
virtual void axpby(const void *ptr_a, const DataContainer &a_x, const void *ptr_b, const DataContainer &a_y)
*this = the linear combination of x and y
Definition: stir_data_containers.cpp:567
virtual bool is_complex() const
Is complex? Unless overwridden (Gadgetron), assume not complex.
Definition: stir_data_containers.h:1112
virtual void sum(void *ptr) const
below all void* are actually float*
Definition: stir_data_containers.cpp:496
virtual void log(const DataContainer &x)
*this = the elementwise log(x)
Definition: stir_data_containers.h:1183
void move_to_scanner_centre(const STIRAcquisitionData &)
Definition: stir_data_containers.cpp:882
virtual void sign(const DataContainer &x)
*this = the elementwise sign(x)
Definition: stir_data_containers.h:1191
virtual void write(const std::string &filename) const
Write to file.
Definition: stir_data_containers.cpp:464
virtual void xapyb(const DataContainer &a_x, const void *ptr_a, const DataContainer &a_y, const void *ptr_b)
alternative interface to the above
Definition: stir_data_containers.cpp:576
virtual void minimum(const DataContainer &x, const DataContainer &y)
*this = the elementwise min(x, y)
Definition: stir_data_containers.h:1237
virtual void min(void *ptr) const
calculates the value of this container's element with the smallest real part
Definition: stir_data_containers.cpp:528
virtual void add(const DataContainer &x, const void *ptr_y)
*this = the sum x + y with scalar y
Definition: stir_data_containers.h:1200
virtual void power(const DataContainer &x, const DataContainer &y)
*this = the elementwise pow(x, y)
Definition: stir_data_containers.h:1241
virtual void exp(const DataContainer &x)
*this = the elementwise exp(x)
Definition: stir_data_containers.h:1179
virtual void multiply(const DataContainer &x, const void *ptr_y)
*this = the product x * y with scalar y
Definition: stir_data_containers.h:1195
Definition: stir_data_containers.h:893
std::shared_ptr< STIRAcquisitionData > acquisition_data_template() const
Construct an AcquisitionData object corresponding to the listmode data.
Definition: stir_data_containers.h:917
Abstract base class for SIRF image data.
Definition: GeometricalInfo.cpp:141
STIRAcquisitionData PETAcquisitionData
Definition: stir_data_containers.h:940
bool iequals(const std::string &a, const std::string &b)
Case insensitive string comparison, replaces boost::iequals.
Definition: iequals.cpp:7
void err(const std::string &message)
throw error
Definition: sirf_convert_image_type.cpp:115