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;
154 (stir::shared_ptr<const stir::ExamInfo> sptr_exam_info,
155 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
const = 0;
156 virtual std::shared_ptr<STIRAcquisitionData> new_acquisition_data()
const = 0;
158 virtual bool is_complex()
const
163 virtual std::unique_ptr<STIRAcquisitionData> get_subset(
const std::vector<int>& views)
const = 0;
181 const int num_segments_to_combine,
182 const int num_views_to_combine = 1,
183 const int num_tang_poss_to_trim = 0,
184 const bool do_normalisation =
true,
185 const int max_in_segment_num_to_process = -1,
186 const int num_tof_bins_to_combine = 1
189 stir::shared_ptr<stir::ProjDataInfo> out_proj_data_info_sptr(
190 stir::SSRB(*data()->get_proj_data_info_sptr(),
191 num_segments_to_combine,
192 num_views_to_combine,
193 num_tang_poss_to_trim,
194 max_in_segment_num_to_process,
195 num_tof_bins_to_combine
197 std::shared_ptr<STIRAcquisitionData>
198 sptr(same_acquisition_data
199 (this->get_exam_info_sptr(), out_proj_data_info_sptr));
200 stir::SSRB(*sptr, *data(), do_normalisation);
204 static std::string storage_scheme()
206 static bool initialized =
false;
208 _storage_scheme =
"file";
211 return _storage_scheme;
213 static std::shared_ptr<STIRAcquisitionData> storage_template()
218 stir::shared_ptr<stir::ProjData> data()
222 const stir::shared_ptr<stir::ProjData> data()
const
226 void set_data(stir::shared_ptr<stir::ProjData> data)
232 virtual void fill(
const float v) { data()->fill(v); }
233 virtual void fill(
const STIRAcquisitionData& ad)
236 THROW(
"The source of STIRAcquisitionData::fill is empty");
237 stir::shared_ptr<stir::ProjData> sptr = ad.data();
240 virtual void fill_from(
const float* d) { data()->fill_from(d); }
241 virtual void copy_to(
float* d)
const { data()->copy_to(d); }
242 std::unique_ptr<STIRAcquisitionData> clone()
const
244 return std::unique_ptr<STIRAcquisitionData>(clone_impl());
248 unsigned int items()
const {
250 return _is_empty ? 0 : 1;
252 get_segment_by_sinogram(0);
261 virtual float norm()
const;
263 virtual void sum(
void* ptr)
const;
264 virtual void max(
void* ptr)
const;
265 virtual void dot(
const DataContainer& a_x,
void* ptr)
const;
266 float dot(
const DataContainer& a_x)
const
273 const void* ptr_a,
const DataContainer& a_x,
274 const void* ptr_b,
const DataContainer& a_y);
276 const DataContainer& a_x,
const void* ptr_a,
277 const DataContainer& a_y,
const void* ptr_b);
279 const DataContainer& a_x,
const DataContainer& a_a,
280 const DataContainer& a_y,
const DataContainer& a_b);
282 const DataContainer& a_x,
const void* ptr_a,
283 const DataContainer& a_y,
const DataContainer& a_b);
286 unary_op(x, std::abs);
290 unary_op(x, std::exp);
294 unary_op(x, std::log);
298 unary_op(x, std::sqrt);
306 float y = *
static_cast<const float*
>(ptr_y);
307 semibinary_op(x, y, DataContainer::product<float>);
311 float y = *
static_cast<const float*
>(ptr_y);
312 semibinary_op(x, y, DataContainer::sum<float>);
314 virtual void divide(
const DataContainer& x,
const void* ptr_y)
316 float y = *
static_cast<const float*
>(ptr_y);
317 semibinary_op(x, y, DataContainer::ratio<float>);
319 virtual void maximum(
const DataContainer& x,
const void* ptr_y)
321 float y = *
static_cast<const float*
>(ptr_y);
322 semibinary_op(x, y, DataContainer::maximum<float>);
324 virtual void minimum(
const DataContainer& x,
const void* ptr_y)
326 float y = *
static_cast<const float*
>(ptr_y);
327 semibinary_op(x, y, DataContainer::minimum<float>);
329 virtual void power(
const DataContainer& x,
const void* ptr_y)
331 float y = *
static_cast<const float*
>(ptr_y);
332 semibinary_op(x, y, std::pow);
336 binary_op(x, y, DataContainer::product<float>);
340 binary_op(x, y, DataContainer::ratio<float>);
344 binary_op(x, y, DataContainer::maximum<float>);
348 binary_op(x, y, DataContainer::minimum<float>);
352 binary_op(x, y, std::pow);
355 virtual void write(
const std::string &filename)
const
362 int get_num_tangential_poss()
364 return data()->get_num_tangential_poss();
368 return data()->get_num_views();
376 return data()->get_num_sinograms();
382 return data()->get_num_non_tof_sinograms();
385 int get_num_TOF_bins()
387 return data()->get_num_tof_poss();
390 int get_tof_mash_factor()
const
392 return data()->get_proj_data_info_sptr()->get_tof_mash_factor();
395 size_t get_dimensions(
int* dim)
397 dim[0] = get_num_tangential_poss();
398 dim[1] = get_num_views();
400 dim[3] = get_num_TOF_bins();
401 return static_cast<size_t>(dim[0] * dim[1] * dim[2] * dim[3]);
403 int get_max_segment_num()
const
405 return data()->get_max_segment_num();
407 stir::SegmentBySinogram<float>
408 get_segment_by_sinogram(
const int segment_num)
const
410 return data()->get_segment_by_sinogram(segment_num);
412 stir::SegmentBySinogram<float>
413 get_empty_segment_by_sinogram(
const int segment_num)
const
415 return data()->get_empty_segment_by_sinogram(segment_num);
417 void set_segment(
const stir::SegmentBySinogram<float>& s)
419 if (data()->set_segment(s) != stir::Succeeded::yes)
420 THROW(
"stir::ProjData set segment failed");
422 stir::shared_ptr<const stir::ExamInfo> get_exam_info_sptr()
const
424 return data()->get_exam_info_sptr();
426 stir::shared_ptr<const stir::ProjDataInfo> get_proj_data_info_sptr()
const
428 return data()->get_proj_data_info_sptr();
432 operator stir::ProjData&() {
return *data(); }
433 operator const stir::ProjData&()
const {
return *data(); }
434 operator stir::shared_ptr<stir::ProjData>() {
return data(); }
436 static stir::shared_ptr<stir::ProjDataInfo>
437 proj_data_info_from_scanner(std::string scanner_name,
438 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
440 stir::shared_ptr<stir::Scanner>
441 sptr_s(stir::Scanner::get_scanner_from_name(scanner_name));
446 int num_views = sptr_s->get_num_detectors_per_ring() / 2 / view_mash_factor;
447 int num_tang_pos = sptr_s->get_max_num_non_arccorrected_bins();
448 if (max_ring_diff < 0)
449 max_ring_diff = sptr_s->get_num_rings() - 1;
450 return std::move(stir::ProjDataInfo::construct_proj_data_info
451 (sptr_s, span, max_ring_diff, num_views, num_tang_pos,
false));
454 void unary_op(
const DataContainer& a_x,
float(*f)(
float));
455 void semibinary_op(
const DataContainer& a_x,
float y,
float(*f)(
float,
float));
456 void binary_op(
const DataContainer& a_x,
const DataContainer& a_y,
float(*f)(
float,
float));
459 static std::string _storage_scheme;
460 static std::shared_ptr<STIRAcquisitionData> _template;
461 stir::shared_ptr<stir::ProjData> _data;
462 virtual STIRAcquisitionData* clone_impl()
const = 0;
463 STIRAcquisitionData* clone_base()
const
465 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi = this->get_proj_data_info_sptr()->create_shared_clone();
466 STIRAcquisitionData* ptr =
467 _template->same_acquisition_data(this->get_exam_info_sptr(), sptr_pdi);
468 if (!this->is_empty())
474 mutable int _is_empty = -1;
488 _data = stir::ProjData::read_from_file(filename);
491 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
494 (MAKE_SHARED<stir::ExamInfo>(*sptr_exam_info), sptr_proj_data_info,
495 _filename = SIRFUtilities::scratch_file_name()));
500 (pd, _filename = SIRFUtilities::scratch_file_name()));
503 (stir::shared_ptr<stir::ExamInfo> sptr_ei, std::string scanner_name,
504 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
506 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi =
507 STIRAcquisitionData::proj_data_info_from_scanner
508 (scanner_name, span, max_ring_diff, view_mash_factor);
510 _filename = SIRFUtilities::scratch_file_name());
517 auto pd_ptr =
dynamic_cast<stir::ProjDataInterfile*
>(uptr_pd.get());
519 _data = std::move(uptr_pd);
521 stir::ProjData& pd = *uptr_pd;
522 stir::shared_ptr<const stir::ExamInfo> sptr_exam_info =
523 pd.get_exam_info_sptr();
524 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info =
525 pd.get_proj_data_info_sptr()->create_shared_clone();
527 (MAKE_SHARED<stir::ExamInfo>(*sptr_exam_info), sptr_proj_data_info,
528 _filename = SIRFUtilities::scratch_file_name()));
532 std::shared_ptr<STIRAcquisitionData> new_acquisition_data(std::string filename)
535 sptr_ad->_data.reset(
new ProjDataFile(*data(), filename,
false));
540 static bool initialized =
false;
542 _storage_scheme =
"file";
545 STIRAcquisitionData::storage_scheme();
548 static void set_as_template()
551 _storage_scheme =
"file";
556 (stir::shared_ptr<const stir::ExamInfo> sptr_exam_info,
557 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
const
567 this->get_exam_info_sptr(),
568 this->get_proj_data_info_sptr()->create_shared_clone());
570 (std::shared_ptr<DataContainer>(ptr));
572 virtual std::shared_ptr<STIRAcquisitionData> new_acquisition_data()
const
575 return std::shared_ptr < STIRAcquisitionData >
576 (_template->same_acquisition_data(this->get_exam_info_sptr(),
577 this->get_proj_data_info_sptr()->create_shared_clone()));
579 virtual std::unique_ptr<STIRAcquisitionData> get_subset(
const std::vector<int>& views)
const;
583 std::string _filename;
601 stir::shared_ptr<const stir::ProjDataInfo> sptr_proj_data_info)
603 _data = stir::shared_ptr<stir::ProjData>
604 (
new stir::ProjDataInMemory(SPTR_WRAP(sptr_exam_info), SPTR_WRAP(sptr_proj_data_info)));
608 _data = stir::shared_ptr<stir::ProjData>
609 (
new stir::ProjDataInMemory(templ.get_exam_info_sptr(),
610 templ.get_proj_data_info_sptr()->create_shared_clone()));
613 (stir::shared_ptr<stir::ExamInfo> sptr_ei, std::string scanner_name,
614 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
616 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi =
617 STIRAcquisitionData::proj_data_info_from_scanner
618 (scanner_name, span, max_ring_diff, view_mash_factor);
619 stir::ProjDataInMemory* ptr =
new stir::ProjDataInMemory(sptr_ei, sptr_pdi);
626 auto pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(uptr_pd.get());
628 _data = std::move(uptr_pd);
630 std::cout <<
"copying ProjData to ProjDataInMemory...\n";
631 const stir::ProjData& pd = *uptr_pd;
632 auto exam_info_sptr = SPTR_WRAP(pd.get_exam_info_sptr());
633 auto proj_data_info_sptr =
634 SPTR_WRAP(pd.get_proj_data_info_sptr()->create_shared_clone());
635 _data.reset(
new stir::ProjDataInMemory(exam_info_sptr, proj_data_info_sptr));
642 auto pd_sptr = stir::ProjData::read_from_file(filename);
643 bool is_empty =
false;
645 pd_sptr->get_segment_by_sinogram(0);
651 _data = stir::shared_ptr<stir::ProjData>
652 (
new stir::ProjDataInMemory(pd_sptr->get_exam_info_sptr(),
653 pd_sptr->get_proj_data_info_sptr()->create_shared_clone()));
655 _data = stir::shared_ptr<stir::ProjData>
656 (
new stir::ProjDataInMemory(*pd_sptr));
661 static void set_as_template()
664 _storage_scheme =
"memory";
668 virtual STIRAcquisitionData* same_acquisition_data
669 (stir::shared_ptr<const stir::ExamInfo> sptr_exam_info,
670 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
const
672 STIRAcquisitionData* ptr_ad =
673 new STIRAcquisitionDataInMemory(sptr_exam_info, sptr_proj_data_info);
679 DataContainer* ptr = _template->same_acquisition_data
680 (this->get_exam_info_sptr(),
681 this->get_proj_data_info_sptr()->create_shared_clone());
683 (std::shared_ptr<DataContainer>(ptr));
685 virtual std::shared_ptr<STIRAcquisitionData> new_acquisition_data()
const
688 return std::shared_ptr < STIRAcquisitionData >
689 (_template->same_acquisition_data
690 (this->get_exam_info_sptr(),
691 this->get_proj_data_info_sptr()->create_shared_clone()));
693 virtual std::unique_ptr<STIRAcquisitionData> get_subset(
const std::vector<int>& views)
const;
696 virtual void fill(
const float v)
698 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
700 if (is_null_ptr(pd_ptr))
701 return this->STIRAcquisitionData::fill(v);
704 auto iter = pd_ptr->begin();
705 while (iter != pd_ptr->end())
712 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
713 const stir::ProjDataInMemory *pd2_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(ad.data().get());
715 if (is_null_ptr(pd_ptr) || is_null_ptr(pd2_ptr))
716 return this->STIRAcquisitionData::fill(ad);
719 auto iter = pd_ptr->begin();
720 auto iter_other = pd2_ptr->begin();
721 while (iter != pd_ptr->end())
722 *iter++ = *iter_other++;
727 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
729 if (is_null_ptr(pd_ptr))
730 return this->STIRAcquisitionData::fill_from(d);
733 auto iter = pd_ptr->begin();
734 while (iter != pd_ptr->end())
740 const stir::ProjDataInMemory *pd_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(data().get());
742 if (is_null_ptr(pd_ptr))
743 return this->STIRAcquisitionData::copy_to(d);
746 auto iter = pd_ptr->begin();
747 while (iter != pd_ptr->end())
752 const stir::ProjDataInMemory *pd_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(data().get());
754 if (is_null_ptr(pd_ptr))
759 auto iter = pd_ptr->begin();
760 for (; iter != pd_ptr->end(); ++iter)
761 t += (*iter) * (*iter);
762 return std::sqrt((
float)t);
768 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
769 const stir::ProjDataInMemory *pd2_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(x->data().get());
771 if (is_null_ptr(pd_ptr) || is_null_ptr(pd2_ptr))
776 auto iter = pd_ptr->begin();
777 auto iter_other = pd2_ptr->begin();
778 while (iter != pd_ptr->end())
779 t += (*iter++) * double(*iter_other++);
781 float* ptr_t =
static_cast<float*
>(ptr);
790 auto *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
791 auto *pd_x_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_x->data().get());
792 auto *pd_y_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_y->data().get());
795 if (is_null_ptr(pd_ptr) || is_null_ptr(pd_x_ptr) || is_null_ptr(pd_x_ptr))
799 auto iter = pd_ptr->begin();
800 auto iter_x = pd_x_ptr->begin();
801 auto iter_y = pd_y_ptr->begin();
802 while (iter != pd_ptr->end())
803 *iter++ = (*iter_x++) * (*iter_y++);
811 auto *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
812 auto *pd_x_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_x->data().get());
813 auto *pd_y_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_y->data().get());
816 if (is_null_ptr(pd_ptr) || is_null_ptr(pd_x_ptr) || is_null_ptr(pd_x_ptr))
817 return this->STIRAcquisitionData::divide(x,y);
820 auto iter = pd_ptr->begin();
821 auto iter_x = pd_x_ptr->begin();
822 auto iter_y = pd_y_ptr->begin();
823 while (iter != pd_ptr->end())
824 *iter++ = (*iter_x++) / (*iter_y++);
835 #if SIRF_VERSION_MAJOR < 4
844 typedef Image3DF::full_iterator Image3DFIterator;
845 typedef Image3DF::const_full_iterator Image3DFIterator_const;
863 typedef Image3DFIterator::difference_type difference_type;
864 typedef Image3DFIterator::value_type value_type;
865 typedef Image3DFIterator::reference reference;
866 typedef Image3DFIterator::pointer pointer;
867 typedef std::forward_iterator_tag iterator_category;
869 Iterator(
const Image3DFIterator& iter) : _iter(iter)
874 _ref.copy(iter._ref);
875 _sptr_iter = iter._sptr_iter;
889 virtual bool operator==(
const BaseIter& an_iter)
const
892 return _iter == iter._iter;
894 virtual bool operator!=(
const BaseIter& an_iter)
const
897 return _iter != iter._iter;
906 Image3DFIterator _iter;
908 std::shared_ptr<Iterator> _sptr_iter;
917 _ref.copy(iter._ref);
918 _sptr_iter = iter._sptr_iter;
935 return _iter == iter._iter;
940 return _iter != iter._iter;
942 virtual const FloatRef& operator*()
const
944 const float& v = *_iter;
945 _ref.set_ptr((
void*)&v);
949 Image3DFIterator_const _iter;
951 std::shared_ptr<Iterator_const> _sptr_iter;
957 _data.reset(image.data().clone());
960 STIRImageData(
const STIRAcquisitionData& ad)
962 _data.reset(
new Voxels3DF(MAKE_SHARED<stir::ExamInfo>(*ad.get_exam_info_sptr()), *ad.get_proj_data_info_sptr()));
965 STIRImageData(
const Image3DF& image)
967 _data.reset(image.clone());
970 STIRImageData(
const Voxels3DF& v)
972 _data.reset(v.clone());
975 STIRImageData(
const stir::ProjDataInfo& pdi)
977 _data.reset(
new Voxels3DF(pdi));
980 STIRImageData(stir::shared_ptr<Image3DF> ptr)
985 STIRImageData(std::string filename)
987 _data = stir::read_from_file<Image3DF>(filename);
990 STIRImageData* same_image_data()
const
992 STIRImageData* ptr_image =
new STIRImageData;
993 ptr_image->_data.reset(_data->get_empty_copy());
994 ptr_image->set_up_geom_info();
997 std::shared_ptr<STIRImageData> new_image_data()
999 return std::shared_ptr<STIRImageData>(same_image_data());
1004 (std::shared_ptr<DataContainer>(same_image_data()));
1010 unsigned int items()
const
1015 std::string modality()
const
1017 ExamInfo ex_info = data().get_exam_info();
1018 return ex_info.imaging_modality.get_name();
1020 void set_modality(
const std::string& mod)
1022 ExamInfo ex_info = data().get_exam_info();
1023 ex_info.imaging_modality = ImagingModality(mod);
1024 data().set_exam_info(ex_info);
1028 virtual void write(
const std::string& filename)
const;
1049 virtual void write(
const std::string& filename,
const std::string& format_file)
const;
1051 virtual float norm()
const;
1053 virtual void sum(
void* ptr)
const;
1054 virtual void max(
void* ptr)
const;
1055 virtual void dot(
const DataContainer& a_x,
void* ptr)
const;
1057 const void* ptr_a,
const DataContainer& a_x,
1058 const void* ptr_b,
const DataContainer& a_y);
1060 const DataContainer& a_x,
const void* ptr_a,
1061 const DataContainer& a_y,
const void* ptr_b);
1063 const DataContainer& a_x,
const DataContainer& a_a,
1064 const DataContainer& a_y,
const DataContainer& a_b);
1066 const DataContainer& a_x,
const void* ptr_a,
1067 const DataContainer& a_y,
const DataContainer& a_b);
1070 unary_op(x, std::abs);
1074 unary_op(x, std::exp);
1078 unary_op(x, std::log);
1082 unary_op(x, std::sqrt);
1090 float y = *
static_cast<const float*
>(ptr_y);
1091 semibinary_op(x, y, DataContainer::product<float>);
1095 float y = *
static_cast<const float*
>(ptr_y);
1096 semibinary_op(x, y, DataContainer::sum<float>);
1098 virtual void divide(
const DataContainer& x,
const void* ptr_y)
1100 float y = *
static_cast<const float*
>(ptr_y);
1101 semibinary_op(x, y, DataContainer::ratio<float>);
1103 virtual void maximum(
const DataContainer& x,
const void* ptr_y)
1105 float y = *
static_cast<const float*
>(ptr_y);
1106 semibinary_op(x, y, DataContainer::maximum<float>);
1108 virtual void minimum(
const DataContainer& x,
const void* ptr_y)
1110 float y = *
static_cast<const float*
>(ptr_y);
1111 semibinary_op(x, y, DataContainer::minimum<float>);
1113 virtual void power(
const DataContainer& x,
const void* ptr_y)
1115 float y = *
static_cast<const float*
>(ptr_y);
1116 semibinary_op(x, y, std::pow);
1120 binary_op(x, y, DataContainer::product<float>);
1124 binary_op(x, y, DataContainer::ratio<float>);
1128 binary_op(x, y, DataContainer::maximum<float>);
1132 binary_op(x, y, DataContainer::minimum<float>);
1136 binary_op(x, y, std::pow);
1143 const Image3DF& data()
const
1147 Image3DF* data_ptr()
1151 const Image3DF* data_ptr()
const
1155 stir::shared_ptr<Image3DF> data_sptr()
1159 stir::shared_ptr<const Image3DF> data_sptr()
const
1163 void set_data_sptr(stir::shared_ptr<Image3DF> sptr_data)
1172 void scale(
float s);
1173 float dot(
const DataContainer& a_x)
const
1180 float a,
const DataContainer& a_x,
1181 float b,
const DataContainer& a_y)
1183 axpby(&a, a_x, &b, a_y);
1186 const DataContainer& a_x,
float a,
1187 const DataContainer& a_y,
float b)
1189 xapyb(a_x, &a, a_y, &b);
1193 return _data->size_all();
1195 virtual Dimensions dimensions()
const
1205 int get_dimensions(
int* dim)
const;
1206 void get_voxel_sizes(
float* vsizes)
const;
1207 virtual void get_data(
float* data)
const;
1208 virtual void set_data(
const float* data);
1209 virtual Iterator& begin()
1211 _begin.reset(
new Iterator(data().begin_all()));
1214 virtual Iterator_const& begin()
const
1216 _begin_const.reset(
new Iterator_const(data().begin_all()));
1217 return *_begin_const;
1219 virtual Iterator& end()
1221 _end.reset(
new Iterator(data().end_all()));
1224 virtual Iterator_const& end()
const
1226 _end_const.reset(
new Iterator_const(data().end_all()));
1231 std::unique_ptr<STIRImageData>
clone()
const
1233 return std::unique_ptr<STIRImageData>(this->clone_impl());
1239 void zoom_image(
const Coord3DF& zooms = { 1.f,1.f,1.f },
const Coord3DF& offsets_in_mm = { 0.f,0.f,0.f },
1240 const Coord3DI& new_sizes = { -1,-1,-1 },
const char*
const zoom_options_str =
"preserve_sum");
1245 void zoom_image(
const Coord3DF& zooms = { 1.f,1.f,1.f },
const Coord3DF& offsets_in_mm = { 0.f,0.f,0.f },
1246 const Coord3DI& new_sizes = { -1,-1,-1 },
1247 const stir::ZoomOptions zoom_options = stir::ZoomOptions::preserve_sum);
1256 void unary_op(
const DataContainer& a_x,
float(*f)(
float));
1257 void semibinary_op(
const DataContainer& a_x,
float y,
float(*f)(
float,
float));
1258 void binary_op(
const DataContainer& a_x,
const DataContainer& a_y,
float(*f)(
float,
float));
1262 virtual STIRImageData* clone_impl()
const
1264 return new STIRImageData(*
this);
1268 stir::shared_ptr<Image3DF> _data;
1269 mutable std::shared_ptr<Iterator> _begin;
1270 mutable std::shared_ptr<Iterator> _end;
1271 mutable std::shared_ptr<Iterator_const> _begin_const;
1272 mutable std::shared_ptr<Iterator_const> _end_const;
Execution status type and wrappers for C++ objects.
Definition: LocalisedException.h:32
Definition: DataHandle.h:159
Definition: DataContainer.h:42
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:148
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:296
virtual void multiply(const DataContainer &x, const DataContainer &y)
*this = the elementwise product x*y
Definition: stir_data_containers.h:334
virtual void sign(const DataContainer &x)
*this = the elementwise sign(x)
Definition: stir_data_containers.h:300
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:142
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: stir_data_containers.cpp:36
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:132
int get_num_sinograms() const
total number of (2D) sinograms
Definition: stir_data_containers.h:374
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:101
virtual void add(const DataContainer &x, const void *ptr_y)
*this = the sum x + y with scalar y
Definition: stir_data_containers.h:309
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: stir_data_containers.h:338
virtual void minimum(const DataContainer &x, const DataContainer &y)
*this = the elementwise min(x, y)
Definition: stir_data_containers.h:346
int get_num_non_TOF_sinograms() const
total number of (2D) sinograms ignoring time-of-flight
Definition: stir_data_containers.h:380
virtual void abs(const DataContainer &x)
*this = the elementwise abs(x)
Definition: stir_data_containers.h:284
virtual void max(void *ptr) const
calculates the value of this container's element with the largest real part
Definition: stir_data_containers.cpp:80
virtual void log(const DataContainer &x)
*this = the elementwise log(x)
Definition: stir_data_containers.h:292
virtual void maximum(const DataContainer &x, const DataContainer &y)
*this = the elementwise max(x, y)
Definition: stir_data_containers.h:342
virtual void exp(const DataContainer &x)
*this = the elementwise exp(x)
Definition: stir_data_containers.h:288
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:180
virtual void multiply(const DataContainer &x, const void *ptr_y)
*this = the product x * y with scalar y
Definition: stir_data_containers.h:304
virtual void power(const DataContainer &x, const DataContainer &y)
*this = the elementwise pow(x, y)
Definition: stir_data_containers.h:350
In-file implementation of STIRAcquisitionData.
Definition: stir_data_containers.h:483
In-memory implementation of STIRAcquisitionData.
Definition: stir_data_containers.h:597
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: stir_data_containers.h:805
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:764
STIRAcquisitionDataInMemory(const char *filename)
Constructor for STIRAcquisitionDataInMemory from filename.
Definition: stir_data_containers.h:640
virtual void fill_from(const float *d)
Fill from float array.
Definition: stir_data_containers.h:725
virtual void fill(const STIRAcquisitionData &ad)
fill from another STIRAcquisitionData
Definition: stir_data_containers.h:709
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: stir_data_containers.h:750
virtual void multiply(const DataContainer &x, const DataContainer &y)
*this = the elementwise product x*y
Definition: stir_data_containers.h:784
virtual void fill(const float v)
fill with single value
Definition: stir_data_containers.h:696
virtual void copy_to(float *d) const
Copy to float array.
Definition: stir_data_containers.h:738
Definition: stir_data_containers.h:910
Definition: stir_data_containers.h:859
STIR DiscretisedDensity<3, float> wrapper with added functionality.
Definition: stir_data_containers.h:855
virtual void abs(const DataContainer &x)
*this = the elementwise abs(x)
Definition: stir_data_containers.h:1068
virtual void sqrt(const DataContainer &x)
*this = the elementwise sqrt(x)
Definition: stir_data_containers.h:1080
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: stir_data_containers.h:1122
virtual void max(void *ptr) const
calculates the value of this container's element with the largest real part
Definition: stir_data_containers.cpp:470
virtual void multiply(const DataContainer &x, const DataContainer &y)
*this = the elementwise product x*y
Definition: stir_data_containers.h:1118
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:486
virtual void set_up_geom_info()
Populate the geometrical info metadata (from the image's own metadata)
Definition: stir_data_containers.cpp:833
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:780
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: stir_data_containers.cpp:615
std::unique_ptr< STIRImageData > clone() const
Clone and return as unique pointer.
Definition: stir_data_containers.h:1231
virtual void maximum(const DataContainer &x, const DataContainer &y)
*this = the elementwise max(x, y)
Definition: stir_data_containers.h:1126
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:509
virtual bool is_complex() const
Is complex? Unless overwridden (Gadgetron), assume not complex.
Definition: stir_data_containers.h:1006
virtual void sum(void *ptr) const
below all void* are actually float*
Definition: stir_data_containers.cpp:454
virtual void log(const DataContainer &x)
*this = the elementwise log(x)
Definition: stir_data_containers.h:1076
void move_to_scanner_centre(const STIRAcquisitionData &)
Definition: stir_data_containers.cpp:824
virtual void sign(const DataContainer &x)
*this = the elementwise sign(x)
Definition: stir_data_containers.h:1084
virtual void write(const std::string &filename) const
Write to file.
Definition: stir_data_containers.cpp:422
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:518
virtual void minimum(const DataContainer &x, const DataContainer &y)
*this = the elementwise min(x, y)
Definition: stir_data_containers.h:1130
virtual void add(const DataContainer &x, const void *ptr_y)
*this = the sum x + y with scalar y
Definition: stir_data_containers.h:1093
virtual void power(const DataContainer &x, const DataContainer &y)
*this = the elementwise pow(x, y)
Definition: stir_data_containers.h:1134
virtual void exp(const DataContainer &x)
*this = the elementwise exp(x)
Definition: stir_data_containers.h:1072
virtual void multiply(const DataContainer &x, const void *ptr_y)
*this = the product x * y with scalar y
Definition: stir_data_containers.h:1088
Abstract data container.
Definition: GeometricalInfo.cpp:141
STIRAcquisitionData PETAcquisitionData
Definition: stir_data_containers.h:839
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