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;
253 get_segment_by_sinogram(0,0);
255 get_segment_by_sinogram(0);
265 virtual float norm()
const;
267 virtual void sum(
void* ptr)
const;
268 virtual void max(
void* ptr)
const;
269 virtual void dot(
const DataContainer& a_x,
void* ptr)
const;
270 float dot(
const DataContainer& a_x)
const
277 const void* ptr_a,
const DataContainer& a_x,
278 const void* ptr_b,
const DataContainer& a_y);
280 const DataContainer& a_x,
const void* ptr_a,
281 const DataContainer& a_y,
const void* ptr_b);
283 const DataContainer& a_x,
const DataContainer& a_a,
284 const DataContainer& a_y,
const DataContainer& a_b);
286 const DataContainer& a_x,
const void* ptr_a,
287 const DataContainer& a_y,
const DataContainer& a_b);
290 unary_op(x, std::abs);
294 unary_op(x, std::exp);
298 unary_op(x, std::log);
302 unary_op(x, std::sqrt);
310 float y = *
static_cast<const float*
>(ptr_y);
311 semibinary_op(x, y, DataContainer::product<float>);
315 float y = *
static_cast<const float*
>(ptr_y);
316 semibinary_op(x, y, DataContainer::sum<float>);
318 virtual void divide(
const DataContainer& x,
const void* ptr_y)
320 float y = *
static_cast<const float*
>(ptr_y);
321 semibinary_op(x, y, DataContainer::ratio<float>);
323 virtual void maximum(
const DataContainer& x,
const void* ptr_y)
325 float y = *
static_cast<const float*
>(ptr_y);
326 semibinary_op(x, y, DataContainer::maximum<float>);
328 virtual void minimum(
const DataContainer& x,
const void* ptr_y)
330 float y = *
static_cast<const float*
>(ptr_y);
331 semibinary_op(x, y, DataContainer::minimum<float>);
333 virtual void power(
const DataContainer& x,
const void* ptr_y)
335 float y = *
static_cast<const float*
>(ptr_y);
336 semibinary_op(x, y, std::pow);
340 binary_op(x, y, DataContainer::product<float>);
344 binary_op(x, y, DataContainer::ratio<float>);
348 binary_op(x, y, DataContainer::maximum<float>);
352 binary_op(x, y, DataContainer::minimum<float>);
356 binary_op(x, y, std::pow);
359 virtual void write(
const std::string &filename)
const
366 int get_num_tangential_poss()
368 return data()->get_num_tangential_poss();
372 return data()->get_num_views();
380 return data()->get_num_sinograms();
386 return data()->get_num_non_tof_sinograms();
389 int get_num_TOF_bins()
391 return data()->get_num_tof_poss();
394 int get_tof_mash_factor()
const
396 return data()->get_proj_data_info_sptr()->get_tof_mash_factor();
399 size_t get_dimensions(
int* dim)
401 dim[0] = get_num_tangential_poss();
402 dim[1] = get_num_views();
404 dim[3] = get_num_TOF_bins();
405 return static_cast<size_t>(dim[0] * dim[1] * dim[2] * dim[3]);
407 int get_max_segment_num()
const
409 return data()->get_max_segment_num();
412 stir::SegmentBySinogram<float>
413 get_segment_by_sinogram(
const int segment_num,
const int timing_pos_num)
const
415 return data()->get_segment_by_sinogram(segment_num, timing_pos_num);
418 stir::SegmentBySinogram<float>
419 get_segment_by_sinogram(
const int segment_num)
const
421 return data()->get_segment_by_sinogram(segment_num);
425 stir::SegmentBySinogram<float>
426 get_empty_segment_by_sinogram(
const int segment_num,
const int timing_pos_num)
const
428 return data()->get_empty_segment_by_sinogram(segment_num,
false, timing_pos_num);
431 stir::SegmentBySinogram<float>
432 get_empty_segment_by_sinogram(
const int segment_num)
const
434 return data()->get_empty_segment_by_sinogram(segment_num);
437 void set_segment(
const stir::SegmentBySinogram<float>& s)
439 if (data()->set_segment(s) != stir::Succeeded::yes)
440 THROW(
"stir::ProjData set segment failed");
442 stir::shared_ptr<const stir::ExamInfo> get_exam_info_sptr()
const
444 return data()->get_exam_info_sptr();
446 stir::shared_ptr<const stir::ProjDataInfo> get_proj_data_info_sptr()
const
448 return data()->get_proj_data_info_sptr();
452 operator stir::ProjData&() {
return *data(); }
453 operator const stir::ProjData&()
const {
return *data(); }
454 operator stir::shared_ptr<stir::ProjData>() {
return data(); }
456 static stir::shared_ptr<stir::ProjDataInfo>
457 proj_data_info_from_scanner(std::string scanner_name,
458 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
460 stir::shared_ptr<stir::Scanner>
461 sptr_s(stir::Scanner::get_scanner_from_name(scanner_name));
466 int num_views = sptr_s->get_num_detectors_per_ring() / 2 / view_mash_factor;
467 int num_tang_pos = sptr_s->get_max_num_non_arccorrected_bins();
468 if (max_ring_diff < 0)
469 max_ring_diff = sptr_s->get_num_rings() - 1;
470 return std::move(stir::ProjDataInfo::construct_proj_data_info
471 (sptr_s, span, max_ring_diff, num_views, num_tang_pos,
false));
474 void unary_op(
const DataContainer& a_x,
float(*f)(
float));
475 void semibinary_op(
const DataContainer& a_x,
float y,
float(*f)(
float,
float));
476 void binary_op(
const DataContainer& a_x,
const DataContainer& a_y,
float(*f)(
float,
float));
479 static std::string _storage_scheme;
480 static std::shared_ptr<STIRAcquisitionData> _template;
481 stir::shared_ptr<stir::ProjData> _data;
482 virtual STIRAcquisitionData* clone_impl()
const = 0;
483 STIRAcquisitionData* clone_base()
const
485 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi = this->get_proj_data_info_sptr()->create_shared_clone();
486 STIRAcquisitionData* ptr =
487 _template->same_acquisition_data(this->get_exam_info_sptr(), sptr_pdi);
488 if (!this->is_empty())
494 mutable int _is_empty = -1;
508 _data = stir::ProjData::read_from_file(filename);
511 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
514 (MAKE_SHARED<stir::ExamInfo>(*sptr_exam_info), sptr_proj_data_info,
515 _filename = SIRFUtilities::scratch_file_name()));
520 (pd, _filename = SIRFUtilities::scratch_file_name()));
523 (stir::shared_ptr<stir::ExamInfo> sptr_ei, std::string scanner_name,
524 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
526 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi =
527 STIRAcquisitionData::proj_data_info_from_scanner
528 (scanner_name, span, max_ring_diff, view_mash_factor);
530 _filename = SIRFUtilities::scratch_file_name());
537 auto pd_ptr =
dynamic_cast<stir::ProjDataInterfile*
>(uptr_pd.get());
539 _data = std::move(uptr_pd);
541 stir::ProjData& pd = *uptr_pd;
542 stir::shared_ptr<const stir::ExamInfo> sptr_exam_info =
543 pd.get_exam_info_sptr();
544 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info =
545 pd.get_proj_data_info_sptr()->create_shared_clone();
547 (MAKE_SHARED<stir::ExamInfo>(*sptr_exam_info), sptr_proj_data_info,
548 _filename = SIRFUtilities::scratch_file_name()));
552 std::shared_ptr<STIRAcquisitionData> new_acquisition_data(std::string filename)
555 sptr_ad->_data.reset(
new ProjDataFile(*data(), filename,
false));
560 static bool initialized =
false;
562 _storage_scheme =
"file";
565 STIRAcquisitionData::storage_scheme();
568 static void set_as_template()
571 _storage_scheme =
"file";
576 (stir::shared_ptr<const stir::ExamInfo> sptr_exam_info,
577 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
const
587 this->get_exam_info_sptr(),
588 this->get_proj_data_info_sptr()->create_shared_clone());
590 (std::shared_ptr<DataContainer>(ptr));
592 virtual std::shared_ptr<STIRAcquisitionData> new_acquisition_data()
const
595 return std::shared_ptr < STIRAcquisitionData >
596 (_template->same_acquisition_data(this->get_exam_info_sptr(),
597 this->get_proj_data_info_sptr()->create_shared_clone()));
599 virtual std::unique_ptr<STIRAcquisitionData> get_subset(
const std::vector<int>& views)
const;
603 std::string _filename;
621 stir::shared_ptr<const stir::ProjDataInfo> sptr_proj_data_info)
623 _data = stir::shared_ptr<stir::ProjData>
624 (
new stir::ProjDataInMemory(SPTR_WRAP(sptr_exam_info), SPTR_WRAP(sptr_proj_data_info)));
628 _data = stir::shared_ptr<stir::ProjData>
629 (
new stir::ProjDataInMemory(templ.get_exam_info_sptr(),
630 templ.get_proj_data_info_sptr()->create_shared_clone()));
633 (stir::shared_ptr<stir::ExamInfo> sptr_ei, std::string scanner_name,
634 int span = 1,
int max_ring_diff = -1,
int view_mash_factor = 1)
636 stir::shared_ptr<stir::ProjDataInfo> sptr_pdi =
637 STIRAcquisitionData::proj_data_info_from_scanner
638 (scanner_name, span, max_ring_diff, view_mash_factor);
639 stir::ProjDataInMemory* ptr =
new stir::ProjDataInMemory(sptr_ei, sptr_pdi);
646 auto pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(uptr_pd.get());
648 _data = std::move(uptr_pd);
650 std::cout <<
"copying ProjData to ProjDataInMemory...\n";
651 const stir::ProjData& pd = *uptr_pd;
652 auto exam_info_sptr = SPTR_WRAP(pd.get_exam_info_sptr());
653 auto proj_data_info_sptr =
654 SPTR_WRAP(pd.get_proj_data_info_sptr()->create_shared_clone());
655 _data.reset(
new stir::ProjDataInMemory(exam_info_sptr, proj_data_info_sptr));
662 auto pd_sptr = stir::ProjData::read_from_file(filename);
663 bool is_empty =
false;
665 pd_sptr->get_segment_by_sinogram(0);
671 _data = stir::shared_ptr<stir::ProjData>
672 (
new stir::ProjDataInMemory(pd_sptr->get_exam_info_sptr(),
673 pd_sptr->get_proj_data_info_sptr()->create_shared_clone()));
675 _data = stir::shared_ptr<stir::ProjData>
676 (
new stir::ProjDataInMemory(*pd_sptr));
681 static void set_as_template()
684 _storage_scheme =
"memory";
688 virtual STIRAcquisitionData* same_acquisition_data
689 (stir::shared_ptr<const stir::ExamInfo> sptr_exam_info,
690 stir::shared_ptr<stir::ProjDataInfo> sptr_proj_data_info)
const
692 STIRAcquisitionData* ptr_ad =
693 new STIRAcquisitionDataInMemory(sptr_exam_info, sptr_proj_data_info);
699 DataContainer* ptr = _template->same_acquisition_data
700 (this->get_exam_info_sptr(),
701 this->get_proj_data_info_sptr()->create_shared_clone());
703 (std::shared_ptr<DataContainer>(ptr));
705 virtual std::shared_ptr<STIRAcquisitionData> new_acquisition_data()
const
708 return std::shared_ptr < STIRAcquisitionData >
709 (_template->same_acquisition_data
710 (this->get_exam_info_sptr(),
711 this->get_proj_data_info_sptr()->create_shared_clone()));
713 virtual std::unique_ptr<STIRAcquisitionData> get_subset(
const std::vector<int>& views)
const;
716 virtual void fill(
const float v)
718 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
720 if (is_null_ptr(pd_ptr))
721 return this->STIRAcquisitionData::fill(v);
724 auto iter = pd_ptr->begin();
725 while (iter != pd_ptr->end())
732 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
733 const stir::ProjDataInMemory *pd2_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(ad.data().get());
735 if (is_null_ptr(pd_ptr) || is_null_ptr(pd2_ptr))
736 return this->STIRAcquisitionData::fill(ad);
739 auto iter = pd_ptr->begin();
740 auto iter_other = pd2_ptr->begin();
741 while (iter != pd_ptr->end())
742 *iter++ = *iter_other++;
747 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
749 if (is_null_ptr(pd_ptr))
750 return this->STIRAcquisitionData::fill_from(d);
753 auto iter = pd_ptr->begin();
754 while (iter != pd_ptr->end())
760 const stir::ProjDataInMemory *pd_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(data().get());
762 if (is_null_ptr(pd_ptr))
763 return this->STIRAcquisitionData::copy_to(d);
766 auto iter = pd_ptr->begin();
767 while (iter != pd_ptr->end())
772 const stir::ProjDataInMemory *pd_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(data().get());
774 if (is_null_ptr(pd_ptr))
779 auto iter = pd_ptr->begin();
780 for (; iter != pd_ptr->end(); ++iter)
781 t += (*iter) * (*iter);
782 return std::sqrt((
float)t);
788 stir::ProjDataInMemory *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
789 const stir::ProjDataInMemory *pd2_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(x->data().get());
791 if (is_null_ptr(pd_ptr) || is_null_ptr(pd2_ptr))
796 auto iter = pd_ptr->begin();
797 auto iter_other = pd2_ptr->begin();
798 while (iter != pd_ptr->end())
799 t += (*iter++) * double(*iter_other++);
801 float* ptr_t =
static_cast<float*
>(ptr);
810 auto *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
811 auto *pd_x_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_x->data().get());
812 auto *pd_y_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_y->data().get());
815 if (is_null_ptr(pd_ptr) || is_null_ptr(pd_x_ptr) || is_null_ptr(pd_x_ptr))
819 auto iter = pd_ptr->begin();
820 auto iter_x = pd_x_ptr->begin();
821 auto iter_y = pd_y_ptr->begin();
822 while (iter != pd_ptr->end())
823 *iter++ = (*iter_x++) * (*iter_y++);
831 auto *pd_ptr =
dynamic_cast<stir::ProjDataInMemory*
>(data().get());
832 auto *pd_x_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_x->data().get());
833 auto *pd_y_ptr =
dynamic_cast<const stir::ProjDataInMemory*
>(a_y->data().get());
836 if (is_null_ptr(pd_ptr) || is_null_ptr(pd_x_ptr) || is_null_ptr(pd_x_ptr))
837 return this->STIRAcquisitionData::divide(x,y);
840 auto iter = pd_ptr->begin();
841 auto iter_x = pd_x_ptr->begin();
842 auto iter_y = pd_y_ptr->begin();
843 while (iter != pd_ptr->end())
844 *iter++ = (*iter_x++) / (*iter_y++);
855 #if SIRF_VERSION_MAJOR < 4
864 typedef Image3DF::full_iterator Image3DFIterator;
865 typedef Image3DF::const_full_iterator Image3DFIterator_const;
883 typedef Image3DFIterator::difference_type difference_type;
884 typedef Image3DFIterator::value_type value_type;
885 typedef Image3DFIterator::reference reference;
886 typedef Image3DFIterator::pointer pointer;
887 typedef std::forward_iterator_tag iterator_category;
889 Iterator(
const Image3DFIterator& iter) : _iter(iter)
894 _ref.copy(iter._ref);
895 _sptr_iter = iter._sptr_iter;
909 virtual bool operator==(
const BaseIter& an_iter)
const
912 return _iter == iter._iter;
914 virtual bool operator!=(
const BaseIter& an_iter)
const
917 return _iter != iter._iter;
926 Image3DFIterator _iter;
928 std::shared_ptr<Iterator> _sptr_iter;
937 _ref.copy(iter._ref);
938 _sptr_iter = iter._sptr_iter;
955 return _iter == iter._iter;
960 return _iter != iter._iter;
962 virtual const FloatRef& operator*()
const
964 const float& v = *_iter;
965 _ref.set_ptr((
void*)&v);
969 Image3DFIterator_const _iter;
971 std::shared_ptr<Iterator_const> _sptr_iter;
977 _data.reset(image.data().clone());
980 STIRImageData(
const STIRAcquisitionData& ad)
982 _data.reset(
new Voxels3DF(MAKE_SHARED<stir::ExamInfo>(*ad.get_exam_info_sptr()), *ad.get_proj_data_info_sptr()));
985 STIRImageData(
const Image3DF& image)
987 _data.reset(image.clone());
990 STIRImageData(
const Voxels3DF& v)
992 _data.reset(v.clone());
995 STIRImageData(
const stir::ProjDataInfo& pdi)
997 _data.reset(
new Voxels3DF(pdi));
1000 STIRImageData(stir::shared_ptr<Image3DF> ptr)
1005 STIRImageData(std::string filename)
1007 _data = stir::read_from_file<Image3DF>(filename);
1010 STIRImageData* same_image_data()
const
1012 STIRImageData* ptr_image =
new STIRImageData;
1013 ptr_image->_data.reset(_data->get_empty_copy());
1014 ptr_image->set_up_geom_info();
1017 std::shared_ptr<STIRImageData> new_image_data()
1019 return std::shared_ptr<STIRImageData>(same_image_data());
1024 (std::shared_ptr<DataContainer>(same_image_data()));
1030 unsigned int items()
const
1035 std::string modality()
const
1037 ExamInfo ex_info = data().get_exam_info();
1038 return ex_info.imaging_modality.get_name();
1040 void set_modality(
const std::string& mod)
1042 ExamInfo ex_info = data().get_exam_info();
1043 ex_info.imaging_modality = ImagingModality(mod);
1044 data().set_exam_info(ex_info);
1048 virtual void write(
const std::string& filename)
const;
1069 virtual void write(
const std::string& filename,
const std::string& format_file)
const;
1071 virtual float norm()
const;
1073 virtual void sum(
void* ptr)
const;
1074 virtual void max(
void* ptr)
const;
1075 virtual void dot(
const DataContainer& a_x,
void* ptr)
const;
1077 const void* ptr_a,
const DataContainer& a_x,
1078 const void* ptr_b,
const DataContainer& a_y);
1080 const DataContainer& a_x,
const void* ptr_a,
1081 const DataContainer& a_y,
const void* ptr_b);
1083 const DataContainer& a_x,
const DataContainer& a_a,
1084 const DataContainer& a_y,
const DataContainer& a_b);
1086 const DataContainer& a_x,
const void* ptr_a,
1087 const DataContainer& a_y,
const DataContainer& a_b);
1090 unary_op(x, std::abs);
1094 unary_op(x, std::exp);
1098 unary_op(x, std::log);
1102 unary_op(x, std::sqrt);
1110 float y = *
static_cast<const float*
>(ptr_y);
1111 semibinary_op(x, y, DataContainer::product<float>);
1115 float y = *
static_cast<const float*
>(ptr_y);
1116 semibinary_op(x, y, DataContainer::sum<float>);
1118 virtual void divide(
const DataContainer& x,
const void* ptr_y)
1120 float y = *
static_cast<const float*
>(ptr_y);
1121 semibinary_op(x, y, DataContainer::ratio<float>);
1123 virtual void maximum(
const DataContainer& x,
const void* ptr_y)
1125 float y = *
static_cast<const float*
>(ptr_y);
1126 semibinary_op(x, y, DataContainer::maximum<float>);
1128 virtual void minimum(
const DataContainer& x,
const void* ptr_y)
1130 float y = *
static_cast<const float*
>(ptr_y);
1131 semibinary_op(x, y, DataContainer::minimum<float>);
1133 virtual void power(
const DataContainer& x,
const void* ptr_y)
1135 float y = *
static_cast<const float*
>(ptr_y);
1136 semibinary_op(x, y, std::pow);
1140 binary_op(x, y, DataContainer::product<float>);
1144 binary_op(x, y, DataContainer::ratio<float>);
1148 binary_op(x, y, DataContainer::maximum<float>);
1152 binary_op(x, y, DataContainer::minimum<float>);
1156 binary_op(x, y, std::pow);
1163 const Image3DF& data()
const
1167 Image3DF* data_ptr()
1171 const Image3DF* data_ptr()
const
1175 stir::shared_ptr<Image3DF> data_sptr()
1179 stir::shared_ptr<const Image3DF> data_sptr()
const
1183 void set_data_sptr(stir::shared_ptr<Image3DF> sptr_data)
1192 void scale(
float s);
1193 float dot(
const DataContainer& a_x)
const
1200 float a,
const DataContainer& a_x,
1201 float b,
const DataContainer& a_y)
1203 axpby(&a, a_x, &b, a_y);
1206 const DataContainer& a_x,
float a,
1207 const DataContainer& a_y,
float b)
1209 xapyb(a_x, &a, a_y, &b);
1213 return _data->size_all();
1215 virtual Dimensions dimensions()
const
1225 int get_dimensions(
int* dim)
const;
1226 void get_voxel_sizes(
float* vsizes)
const;
1227 virtual void get_data(
float* data)
const;
1228 virtual void set_data(
const float* data);
1229 virtual Iterator& begin()
1231 _begin.reset(
new Iterator(data().begin_all()));
1234 virtual Iterator_const& begin()
const
1236 _begin_const.reset(
new Iterator_const(data().begin_all()));
1237 return *_begin_const;
1239 virtual Iterator& end()
1241 _end.reset(
new Iterator(data().end_all()));
1244 virtual Iterator_const& end()
const
1246 _end_const.reset(
new Iterator_const(data().end_all()));
1251 std::unique_ptr<STIRImageData>
clone()
const
1253 return std::unique_ptr<STIRImageData>(this->clone_impl());
1259 void zoom_image(
const Coord3DF& zooms = { 1.f,1.f,1.f },
const Coord3DF& offsets_in_mm = { 0.f,0.f,0.f },
1260 const Coord3DI& new_sizes = { -1,-1,-1 },
const char*
const zoom_options_str =
"preserve_sum");
1265 void zoom_image(
const Coord3DF& zooms = { 1.f,1.f,1.f },
const Coord3DF& offsets_in_mm = { 0.f,0.f,0.f },
1266 const Coord3DI& new_sizes = { -1,-1,-1 },
1267 const stir::ZoomOptions zoom_options = stir::ZoomOptions::preserve_sum);
1276 void unary_op(
const DataContainer& a_x,
float(*f)(
float));
1277 void semibinary_op(
const DataContainer& a_x,
float y,
float(*f)(
float,
float));
1278 void binary_op(
const DataContainer& a_x,
const DataContainer& a_y,
float(*f)(
float,
float));
1282 virtual STIRImageData* clone_impl()
const
1284 return new STIRImageData(*
this);
1288 stir::shared_ptr<Image3DF> _data;
1289 mutable std::shared_ptr<Iterator> _begin;
1290 mutable std::shared_ptr<Iterator> _end;
1291 mutable std::shared_ptr<Iterator_const> _begin_const;
1292 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:300
virtual void multiply(const DataContainer &x, const DataContainer &y)
*this = the elementwise product x*y
Definition: stir_data_containers.h:338
virtual void sign(const DataContainer &x)
*this = the elementwise sign(x)
Definition: stir_data_containers.h:304
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:145
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:135
int get_num_sinograms() const
total number of (2D) sinograms
Definition: stir_data_containers.h:378
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:103
virtual void add(const DataContainer &x, const void *ptr_y)
*this = the sum x + y with scalar y
Definition: stir_data_containers.h:313
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: stir_data_containers.h:342
virtual void minimum(const DataContainer &x, const DataContainer &y)
*this = the elementwise min(x, y)
Definition: stir_data_containers.h:350
int get_num_non_TOF_sinograms() const
total number of (2D) sinograms ignoring time-of-flight
Definition: stir_data_containers.h:384
virtual void abs(const DataContainer &x)
*this = the elementwise abs(x)
Definition: stir_data_containers.h:288
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:296
virtual void maximum(const DataContainer &x, const DataContainer &y)
*this = the elementwise max(x, y)
Definition: stir_data_containers.h:346
virtual void exp(const DataContainer &x)
*this = the elementwise exp(x)
Definition: stir_data_containers.h:292
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:308
virtual void power(const DataContainer &x, const DataContainer &y)
*this = the elementwise pow(x, y)
Definition: stir_data_containers.h:354
In-file implementation of STIRAcquisitionData.
Definition: stir_data_containers.h:503
In-memory implementation of STIRAcquisitionData.
Definition: stir_data_containers.h:617
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: stir_data_containers.h:825
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:784
STIRAcquisitionDataInMemory(const char *filename)
Constructor for STIRAcquisitionDataInMemory from filename.
Definition: stir_data_containers.h:660
virtual void fill_from(const float *d)
Fill from float array.
Definition: stir_data_containers.h:745
virtual void fill(const STIRAcquisitionData &ad)
fill from another STIRAcquisitionData
Definition: stir_data_containers.h:729
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: stir_data_containers.h:770
virtual void multiply(const DataContainer &x, const DataContainer &y)
*this = the elementwise product x*y
Definition: stir_data_containers.h:804
virtual void fill(const float v)
fill with single value
Definition: stir_data_containers.h:716
virtual void copy_to(float *d) const
Copy to float array.
Definition: stir_data_containers.h:758
Definition: stir_data_containers.h:930
Definition: stir_data_containers.h:879
STIR DiscretisedDensity<3, float> wrapper with added functionality.
Definition: stir_data_containers.h:875
virtual void abs(const DataContainer &x)
*this = the elementwise abs(x)
Definition: stir_data_containers.h:1088
virtual void sqrt(const DataContainer &x)
*this = the elementwise sqrt(x)
Definition: stir_data_containers.h:1100
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: stir_data_containers.h:1142
virtual void max(void *ptr) const
calculates the value of this container's element with the largest real part
Definition: stir_data_containers.cpp:478
virtual void multiply(const DataContainer &x, const DataContainer &y)
*this = the elementwise product x*y
Definition: stir_data_containers.h:1138
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:494
virtual void set_up_geom_info()
Populate the geometrical info metadata (from the image's own metadata)
Definition: stir_data_containers.cpp:841
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:788
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: stir_data_containers.cpp:623
std::unique_ptr< STIRImageData > clone() const
Clone and return as unique pointer.
Definition: stir_data_containers.h:1251
virtual void maximum(const DataContainer &x, const DataContainer &y)
*this = the elementwise max(x, y)
Definition: stir_data_containers.h:1146
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:517
virtual bool is_complex() const
Is complex? Unless overwridden (Gadgetron), assume not complex.
Definition: stir_data_containers.h:1026
virtual void sum(void *ptr) const
below all void* are actually float*
Definition: stir_data_containers.cpp:462
virtual void log(const DataContainer &x)
*this = the elementwise log(x)
Definition: stir_data_containers.h:1096
void move_to_scanner_centre(const STIRAcquisitionData &)
Definition: stir_data_containers.cpp:832
virtual void sign(const DataContainer &x)
*this = the elementwise sign(x)
Definition: stir_data_containers.h:1104
virtual void write(const std::string &filename) const
Write to file.
Definition: stir_data_containers.cpp:430
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:526
virtual void minimum(const DataContainer &x, const DataContainer &y)
*this = the elementwise min(x, y)
Definition: stir_data_containers.h:1150
virtual void add(const DataContainer &x, const void *ptr_y)
*this = the sum x + y with scalar y
Definition: stir_data_containers.h:1113
virtual void power(const DataContainer &x, const DataContainer &y)
*this = the elementwise pow(x, y)
Definition: stir_data_containers.h:1154
virtual void exp(const DataContainer &x)
*this = the elementwise exp(x)
Definition: stir_data_containers.h:1092
virtual void multiply(const DataContainer &x, const void *ptr_y)
*this = the product x * y with scalar y
Definition: stir_data_containers.h:1108
Abstract data container.
Definition: GeometricalInfo.cpp:141
STIRAcquisitionData PETAcquisitionData
Definition: stir_data_containers.h:859
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