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();
483 std::string modality()
const
485 const ExamInfo& ex_info = *get_exam_info_sptr();
486 return ex_info.imaging_modality.get_name();
490 operator stir::ProjData&() {
return *data(); }
491 operator const stir::ProjData&()
const {
return *data(); }
492 operator stir::shared_ptr<stir::ProjData>() {
return data(); }
494 static stir::shared_ptr<stir::ProjDataInfo>
495 proj_data_info_from_scanner(std::string scanner_name,
496 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
498 stir::shared_ptr<stir::Scanner>
499 sptr_s(stir::Scanner::get_scanner_from_name(scanner_name));
504 int num_views = sptr_s->get_num_detectors_per_ring() / 2 / view_mash_factor;
505 int num_tang_pos = sptr_s->get_max_num_non_arccorrected_bins();
506 if (max_ring_diff < 0)
507 max_ring_diff = sptr_s->get_num_rings() - 1;
508 return std::move(stir::ProjDataInfo::construct_proj_data_info
509 (sptr_s, span, max_ring_diff, num_views, num_tang_pos,
false));
512 void unary_op(
const DataContainer& a_x,
float(*f)(
float));
513 void semibinary_op(
const DataContainer& a_x,
float y,
float(*f)(
float,
float));
514 void binary_op(
const DataContainer& a_x,
const DataContainer& a_y,
float(*f)(
float,
float));
517 static std::string _storage_scheme;
518 static std::shared_ptr<STIRAcquisitionData> _template;
519 stir::shared_ptr<stir::ProjData> _data;
520 virtual STIRAcquisitionData* clone_impl()
const = 0;
521 STIRAcquisitionData* clone_base()
const
523 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi = this->get_proj_data_info_sptr()->create_shared_clone();
524 STIRAcquisitionData* ptr =
525 _template->same_acquisition_data(this->get_exam_info_sptr(), sptr_pdi);
526 if (!this->is_empty())
532 mutable int _is_empty = -1;
546 _data = stir::ProjData::read_from_file(filename);
549 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
552 (MAKE_SHARED<stir::ExamInfo>(*sptr_exam_info), sptr_proj_data_info,
553 _filename = SIRFUtilities::scratch_file_name()));
558 (pd, _filename = SIRFUtilities::scratch_file_name()));
561 (stir::shared_ptr<stir::ExamInfo> sptr_ei, std::string scanner_name,
562 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
564 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi =
565 STIRAcquisitionData::proj_data_info_from_scanner
566 (scanner_name, span, max_ring_diff, view_mash_factor);
568 _filename = SIRFUtilities::scratch_file_name());
575 auto pd_ptr =
dynamic_cast<stir::ProjDataInterfile*
>(uptr_pd.get());
577 _data = std::move(uptr_pd);
579 stir::ProjData& pd = *uptr_pd;
580 stir::shared_ptr<const stir::ExamInfo> sptr_exam_info =
581 pd.get_exam_info_sptr();
582 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info =
583 pd.get_proj_data_info_sptr()->create_shared_clone();
585 (MAKE_SHARED<stir::ExamInfo>(*sptr_exam_info), sptr_proj_data_info,
586 _filename = SIRFUtilities::scratch_file_name()));
590 std::shared_ptr<STIRAcquisitionData> new_acquisition_data(std::string filename)
593 sptr_ad->_data.reset(
new ProjDataFile(*data(), filename,
false));
598 static bool initialized =
false;
600 _storage_scheme =
"file";
603 STIRAcquisitionData::storage_scheme();
606 static void set_as_template()
609 _storage_scheme =
"file";
614 (stir::shared_ptr<const stir::ExamInfo> sptr_exam_info,
615 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
const
625 this->get_exam_info_sptr(),
626 this->get_proj_data_info_sptr()->create_shared_clone());
628 (std::shared_ptr<DataContainer>(ptr));
630 virtual std::shared_ptr<STIRAcquisitionData> new_acquisition_data()
const
633 return std::shared_ptr < STIRAcquisitionData >
634 (_template->same_acquisition_data(this->get_exam_info_sptr(),
635 this->get_proj_data_info_sptr()->create_shared_clone()));
637 virtual std::unique_ptr<STIRAcquisitionData> get_subset(
const std::vector<int>& views)
const;
641 std::string _filename;
659 stir::shared_ptr<const stir::ProjDataInfo> sptr_proj_data_info)
661 _data = stir::shared_ptr<stir::ProjData>
662 (
new stir::ProjDataInMemory(SPTR_WRAP(sptr_exam_info), SPTR_WRAP(sptr_proj_data_info)));
666 _data = stir::shared_ptr<stir::ProjData>
667 (
new stir::ProjDataInMemory(templ.get_exam_info_sptr(),
668 templ.get_proj_data_info_sptr()->create_shared_clone()));
671 (stir::shared_ptr<stir::ExamInfo> sptr_ei, std::string scanner_name,
672 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
674 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi =
675 STIRAcquisitionData::proj_data_info_from_scanner
676 (scanner_name, span, max_ring_diff, view_mash_factor);
677 stir::ProjDataInMemory* ptr =
new stir::ProjDataInMemory(sptr_ei, sptr_pdi);
684 auto pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(uptr_pd.get());
686 _data = std::move(uptr_pd);
688 std::cout <<
"copying ProjData to ProjDataInMemory...\n";
689 const stir::ProjData& pd = *uptr_pd;
690 auto exam_info_sptr = SPTR_WRAP(pd.get_exam_info_sptr());
691 auto proj_data_info_sptr =
692 SPTR_WRAP(pd.get_proj_data_info_sptr()->create_shared_clone());
693 _data.reset(
new stir::ProjDataInMemory(exam_info_sptr, proj_data_info_sptr));
700 auto pd_sptr = stir::ProjData::read_from_file(filename);
701 bool is_empty =
false;
703 pd_sptr->get_segment_by_sinogram(0);
709 _data = stir::shared_ptr<stir::ProjData>
710 (
new stir::ProjDataInMemory(pd_sptr->get_exam_info_sptr(),
711 pd_sptr->get_proj_data_info_sptr()->create_shared_clone()));
713 _data = stir::shared_ptr<stir::ProjData>
714 (
new stir::ProjDataInMemory(*pd_sptr));
719 static void set_as_template()
722 _storage_scheme =
"memory";
726 virtual STIRAcquisitionData* same_acquisition_data
727 (stir::shared_ptr<const stir::ExamInfo> sptr_exam_info,
728 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
const
730 STIRAcquisitionData* ptr_ad =
731 new STIRAcquisitionDataInMemory(sptr_exam_info, sptr_proj_data_info);
737 DataContainer* ptr = _template->same_acquisition_data
738 (this->get_exam_info_sptr(),
739 this->get_proj_data_info_sptr()->create_shared_clone());
741 (std::shared_ptr<DataContainer>(ptr));
743 virtual std::shared_ptr<STIRAcquisitionData> new_acquisition_data()
const
746 return std::shared_ptr < STIRAcquisitionData >
747 (_template->same_acquisition_data
748 (this->get_exam_info_sptr(),
749 this->get_proj_data_info_sptr()->create_shared_clone()));
751 virtual std::unique_ptr<STIRAcquisitionData> get_subset(
const std::vector<int>& views)
const;
754 virtual void fill(
const float v)
756 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
758 if (is_null_ptr(pd_ptr))
759 return this->STIRAcquisitionData::fill(v);
762 auto iter = pd_ptr->begin();
763 while (iter != pd_ptr->end())
770 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
771 const stir::ProjDataInMemory *pd2_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(ad.data().get());
773 if (is_null_ptr(pd_ptr) || is_null_ptr(pd2_ptr))
774 return this->STIRAcquisitionData::fill(ad);
777 auto iter = pd_ptr->begin();
778 auto iter_other = pd2_ptr->begin();
779 while (iter != pd_ptr->end())
780 *iter++ = *iter_other++;
785 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
787 if (is_null_ptr(pd_ptr))
788 return this->STIRAcquisitionData::fill_from(d);
791 auto iter = pd_ptr->begin();
792 while (iter != pd_ptr->end())
798 const stir::ProjDataInMemory *pd_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(data().get());
800 if (is_null_ptr(pd_ptr))
801 return this->STIRAcquisitionData::copy_to(d);
804 auto iter = pd_ptr->begin();
805 while (iter != pd_ptr->end())
810 const stir::ProjDataInMemory *pd_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(data().get());
812 if (is_null_ptr(pd_ptr))
816 #if STIR_VERSION <= 060100
818 auto iter = pd_ptr->begin();
819 for (; iter != pd_ptr->end(); ++iter)
820 t += (*iter) * (*iter);
821 return std::sqrt((
float)t);
823 return static_cast<float>(pd_ptr->norm());
830 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
831 const stir::ProjDataInMemory *pd2_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(x->data().get());
833 if (is_null_ptr(pd_ptr) || is_null_ptr(pd2_ptr))
838 auto iter = pd_ptr->begin();
839 auto iter_other = pd2_ptr->begin();
840 while (iter != pd_ptr->end())
841 t += (*iter++) * double(*iter_other++);
843 float* ptr_t =
static_cast<float*
>(ptr);
852 auto *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
853 auto *pd_x_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_x->data().get());
854 auto *pd_y_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_y->data().get());
857 if (is_null_ptr(pd_ptr) || is_null_ptr(pd_x_ptr) || is_null_ptr(pd_x_ptr))
861 auto iter = pd_ptr->begin();
862 auto iter_x = pd_x_ptr->begin();
863 auto iter_y = pd_y_ptr->begin();
864 while (iter != pd_ptr->end())
865 *iter++ = (*iter_x++) * (*iter_y++);
873 auto *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
874 auto *pd_x_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_x->data().get());
875 auto *pd_y_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_y->data().get());
878 if (is_null_ptr(pd_ptr) || is_null_ptr(pd_x_ptr) || is_null_ptr(pd_x_ptr))
879 return this->STIRAcquisitionData::divide(x,y);
882 auto iter = pd_ptr->begin();
883 auto iter_x = pd_x_ptr->begin();
884 auto iter_y = pd_y_ptr->begin();
885 while (iter != pd_ptr->end())
886 *iter++ = (*iter_x++) / (*iter_y++);
906 _data = stir::read_from_file<stir::ListModeData>(lmdata_filename);
911 virtual stir::shared_ptr<stir::ExamData> data_sptr()
const {
914 virtual stir::shared_ptr<stir::ListModeData> data()
const {
920 THROW(
"ListmodeData::new_data_container_handle not implemented");
928 return std::shared_ptr < STIRAcquisitionData >
929 (STIRAcquisitionData::storage_template()->same_acquisition_data(this->data()->get_exam_info_sptr(),
930 this->data()->get_proj_data_info_sptr()->create_shared_clone()));
932 std::string get_info()
const
934 return this->data()->get_exam_info_sptr()->parameter_info() +
935 this->data()->get_proj_data_info_sptr()->parameter_info();
938 stir::shared_ptr<stir::ListModeData> _data;
939 virtual DataContainer* clone_impl()
const
941 THROW(
"ListmodeData::clone not implemented");
945 #if SIRF_VERSION_MAJOR < 4
954 typedef Image3DF::full_iterator Image3DFIterator;
955 typedef Image3DF::const_full_iterator Image3DFIterator_const;
973 typedef Image3DFIterator::difference_type difference_type;
974 typedef Image3DFIterator::value_type value_type;
975 typedef Image3DFIterator::reference reference;
976 typedef Image3DFIterator::pointer pointer;
977 typedef std::forward_iterator_tag iterator_category;
979 Iterator(
const Image3DFIterator& iter) : _iter(iter)
984 _ref.copy(iter._ref);
985 _sptr_iter = iter._sptr_iter;
999 virtual bool operator==(
const BaseIter& an_iter)
const
1002 return _iter == iter._iter;
1004 virtual bool operator!=(
const BaseIter& an_iter)
const
1007 return _iter != iter._iter;
1016 Image3DFIterator _iter;
1018 std::shared_ptr<Iterator> _sptr_iter;
1027 _ref.copy(iter._ref);
1028 _sptr_iter = iter._sptr_iter;
1045 return _iter == iter._iter;
1050 return _iter != iter._iter;
1052 virtual const FloatRef& operator*()
const
1054 const float& v = *_iter;
1055 _ref.set_ptr((
void*)&v);
1059 Image3DFIterator_const _iter;
1061 std::shared_ptr<Iterator_const> _sptr_iter;
1067 _data.reset(image.data().clone());
1070 STIRImageData(
const STIRAcquisitionData& ad)
1072 _data.reset(
new Voxels3DF(MAKE_SHARED<stir::ExamInfo>(*ad.get_exam_info_sptr()), *ad.get_proj_data_info_sptr()));
1075 STIRImageData(
const Image3DF& image)
1077 _data.reset(image.clone());
1080 STIRImageData(
const Voxels3DF& v)
1082 _data.reset(v.clone());
1085 STIRImageData(
const stir::ProjDataInfo& pdi)
1087 _data.reset(
new Voxels3DF(pdi));
1090 STIRImageData(stir::shared_ptr<Image3DF> ptr)
1095 STIRImageData(std::string filename)
1097 _data = stir::read_from_file<Image3DF>(filename);
1100 STIRImageData* same_image_data()
const
1102 STIRImageData* ptr_image =
new STIRImageData;
1103 ptr_image->_data.reset(_data->get_empty_copy());
1104 ptr_image->set_up_geom_info();
1107 std::shared_ptr<STIRImageData> new_image_data()
1109 return std::shared_ptr<STIRImageData>(same_image_data());
1114 (std::shared_ptr<DataContainer>(same_image_data()));
1116 std::string get_info()
const
1118 return this->data().get_exam_info_sptr()->parameter_info();
1125 unsigned int items()
const
1130 std::string modality()
const
1132 ExamInfo ex_info = data().get_exam_info();
1133 return ex_info.imaging_modality.get_name();
1135 void set_modality(
const std::string& mod)
1137 ExamInfo ex_info = data().get_exam_info();
1138 ex_info.imaging_modality = ImagingModality(mod);
1139 data().set_exam_info(ex_info);
1143 virtual void write(
const std::string& filename)
const;
1164 virtual void write(
const std::string& filename,
const std::string& format_file)
const;
1166 virtual float norm()
const;
1168 virtual void sum(
void* ptr)
const;
1169 virtual void max(
void* ptr)
const;
1170 virtual void min(
void* ptr)
const;
1171 virtual void dot(
const DataContainer& a_x,
void* ptr)
const;
1173 const void* ptr_a,
const DataContainer& a_x,
1174 const void* ptr_b,
const DataContainer& a_y);
1176 const DataContainer& a_x,
const void* ptr_a,
1177 const DataContainer& a_y,
const void* ptr_b);
1179 const DataContainer& a_x,
const DataContainer& a_a,
1180 const DataContainer& a_y,
const DataContainer& a_b);
1182 const DataContainer& a_x,
const void* ptr_a,
1183 const DataContainer& a_y,
const DataContainer& a_b);
1186 unary_op(x, std::abs);
1190 unary_op(x, std::exp);
1194 unary_op(x, std::log);
1198 unary_op(x, std::sqrt);
1206 float y = *
static_cast<const float*
>(ptr_y);
1207 semibinary_op(x, y, DataContainer::product<float>);
1211 float y = *
static_cast<const float*
>(ptr_y);
1212 semibinary_op(x, y, DataContainer::sum<float>);
1214 virtual void divide(
const DataContainer& x,
const void* ptr_y)
1216 float y = *
static_cast<const float*
>(ptr_y);
1217 semibinary_op(x, y, DataContainer::ratio<float>);
1219 virtual void maximum(
const DataContainer& x,
const void* ptr_y)
1221 float y = *
static_cast<const float*
>(ptr_y);
1222 semibinary_op(x, y, DataContainer::maximum<float>);
1224 virtual void minimum(
const DataContainer& x,
const void* ptr_y)
1226 float y = *
static_cast<const float*
>(ptr_y);
1227 semibinary_op(x, y, DataContainer::minimum<float>);
1229 virtual void power(
const DataContainer& x,
const void* ptr_y)
1231 float y = *
static_cast<const float*
>(ptr_y);
1232 semibinary_op(x, y, std::pow);
1236 binary_op(x, y, DataContainer::product<float>);
1240 binary_op(x, y, DataContainer::ratio<float>);
1244 binary_op(x, y, DataContainer::maximum<float>);
1248 binary_op(x, y, DataContainer::minimum<float>);
1252 binary_op(x, y, std::pow);
1259 const Image3DF& data()
const
1263 Image3DF* data_ptr()
1267 const Image3DF* data_ptr()
const
1271 stir::shared_ptr<Image3DF> data_sptr()
1275 stir::shared_ptr<const Image3DF> data_sptr()
const
1279 void set_data_sptr(stir::shared_ptr<Image3DF> sptr_data)
1288 void scale(
float s);
1289 float dot(
const DataContainer& a_x)
const
1296 float a,
const DataContainer& a_x,
1297 float b,
const DataContainer& a_y)
1299 axpby(&a, a_x, &b, a_y);
1302 const DataContainer& a_x,
float a,
1303 const DataContainer& a_y,
float b)
1305 xapyb(a_x, &a, a_y, &b);
1309 return _data->size_all();
1311 virtual Dimensions dimensions()
const
1321 int get_dimensions(
int* dim)
const;
1322 void get_voxel_sizes(
float* vsizes)
const;
1323 virtual void get_data(
float* data)
const;
1324 virtual void set_data(
const float* data);
1325 virtual Iterator& begin()
1327 _begin.reset(
new Iterator(data().begin_all()));
1330 virtual Iterator_const& begin()
const
1332 _begin_const.reset(
new Iterator_const(data().begin_all()));
1333 return *_begin_const;
1335 virtual Iterator& end()
1337 _end.reset(
new Iterator(data().end_all()));
1340 virtual Iterator_const& end()
const
1342 _end_const.reset(
new Iterator_const(data().end_all()));
1347 std::unique_ptr<STIRImageData>
clone()
const
1349 return std::unique_ptr<STIRImageData>(this->clone_impl());
1355 void zoom_image(
const Coord3DF& zooms = { 1.f,1.f,1.f },
const Coord3DF& offsets_in_mm = { 0.f,0.f,0.f },
1356 const Coord3DI& new_sizes = { -1,-1,-1 },
const char*
const zoom_options_str =
"preserve_sum");
1361 void zoom_image(
const Coord3DF& zooms = { 1.f,1.f,1.f },
const Coord3DF& offsets_in_mm = { 0.f,0.f,0.f },
1362 const Coord3DI& new_sizes = { -1,-1,-1 },
1363 const stir::ZoomOptions zoom_options = stir::ZoomOptions::preserve_sum);
1372 void unary_op(
const DataContainer& a_x,
float(*f)(
float));
1373 void semibinary_op(
const DataContainer& a_x,
float y,
float(*f)(
float,
float));
1374 void binary_op(
const DataContainer& a_x,
const DataContainer& a_y,
float(*f)(
float,
float));
1378 virtual STIRImageData* clone_impl()
const
1380 return new STIRImageData(*
this);
1384 stir::shared_ptr<Image3DF> _data;
1385 mutable std::shared_ptr<Iterator> _begin;
1386 mutable std::shared_ptr<Iterator> _end;
1387 mutable std::shared_ptr<Iterator_const> _begin_const;
1388 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:121
virtual void sum(void *ptr) const
below all void* are actually float*
Definition: stir_data_containers.cpp:63
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:188
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:178
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:146
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:89
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:541
In-memory implementation of STIRAcquisitionData.
Definition: stir_data_containers.h:655
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: stir_data_containers.h:867
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:826
STIRAcquisitionDataInMemory(const char *filename)
Constructor for STIRAcquisitionDataInMemory from filename.
Definition: stir_data_containers.h:698
virtual void fill_from(const float *d)
Fill from float array.
Definition: stir_data_containers.h:783
virtual void fill(const STIRAcquisitionData &ad)
fill from another STIRAcquisitionData
Definition: stir_data_containers.h:767
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: stir_data_containers.h:808
virtual void multiply(const DataContainer &x, const DataContainer &y)
*this = the elementwise product x*y
Definition: stir_data_containers.h:846
virtual void fill(const float v)
fill with single value
Definition: stir_data_containers.h:754
virtual void copy_to(float *d) const
Copy to float array.
Definition: stir_data_containers.h:796
Definition: stir_data_containers.h:1020
Definition: stir_data_containers.h:969
STIR DiscretisedDensity<3, float> wrapper with added functionality.
Definition: stir_data_containers.h:965
virtual void abs(const DataContainer &x)
*this = the elementwise abs(x)
Definition: stir_data_containers.h:1184
virtual void sqrt(const DataContainer &x)
*this = the elementwise sqrt(x)
Definition: stir_data_containers.h:1196
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: stir_data_containers.h:1238
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:1234
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:526
virtual void set_up_geom_info()
Populate the geometrical info metadata (from the image's own metadata)
Definition: stir_data_containers.cpp:826
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:773
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: stir_data_containers.cpp:614
std::unique_ptr< STIRImageData > clone() const
Clone and return as unique pointer.
Definition: stir_data_containers.h:1347
virtual void maximum(const DataContainer &x, const DataContainer &y)
*this = the elementwise max(x, y)
Definition: stir_data_containers.h:1242
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:549
virtual bool is_complex() const
Is complex? Unless overwridden (Gadgetron), assume not complex.
Definition: stir_data_containers.h:1121
virtual void sum(void *ptr) const
below all void* are actually float*
Definition: stir_data_containers.cpp:505
virtual void log(const DataContainer &x)
*this = the elementwise log(x)
Definition: stir_data_containers.h:1192
void move_to_scanner_centre(const STIRAcquisitionData &)
Definition: stir_data_containers.cpp:817
virtual void sign(const DataContainer &x)
*this = the elementwise sign(x)
Definition: stir_data_containers.h:1200
virtual void write(const std::string &filename) const
Write to file.
Definition: stir_data_containers.cpp:473
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:558
virtual void minimum(const DataContainer &x, const DataContainer &y)
*this = the elementwise min(x, y)
Definition: stir_data_containers.h:1246
virtual void min(void *ptr) const
calculates the value of this container's element with the smallest real part
Definition: stir_data_containers.cpp:519
virtual void add(const DataContainer &x, const void *ptr_y)
*this = the sum x + y with scalar y
Definition: stir_data_containers.h:1209
virtual void power(const DataContainer &x, const DataContainer &y)
*this = the elementwise pow(x, y)
Definition: stir_data_containers.h:1250
virtual void exp(const DataContainer &x)
*this = the elementwise exp(x)
Definition: stir_data_containers.h:1188
virtual void multiply(const DataContainer &x, const void *ptr_y)
*this = the product x * y with scalar y
Definition: stir_data_containers.h:1204
Definition: stir_data_containers.h:902
std::shared_ptr< STIRAcquisitionData > acquisition_data_template() const
Construct an AcquisitionData object corresponding to the listmode data.
Definition: stir_data_containers.h:926
Abstract base class for SIRF image data.
Definition: GeometricalInfo.cpp:141
STIRAcquisitionData PETAcquisitionData
Definition: stir_data_containers.h:949
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