33 #ifndef GADGETRON_DATA_CONTAINERS
34 #define GADGETRON_DATA_CONTAINERS
42 #include <ismrmrd/ismrmrd.h>
43 #include <ismrmrd/dataset.h>
45 #include "sirf/common/DataContainer.h"
46 #include "sirf/common/ImageData.h"
47 #include "sirf/common/multisort.h"
48 #include "sirf/Gadgetron/cgadgetron_shared_ptr.h"
51 #include "sirf/iUtilities/LocalisedException.h"
54 #define SIRF_DYNAMIC_CAST(T, X, Y) T& X = dynamic_cast<T&>(Y)
63 #define TO_BE_IGNORED(acq) \
64 (!(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_IS_PARALLEL_CALIBRATION) && \
65 !(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_IS_PARALLEL_CALIBRATION_AND_IMAGING) && \
66 !(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_LAST_IN_MEASUREMENT) && \
67 !(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_IS_REVERSE) && \
68 (acq).flags() >= (1 << (ISMRMRD::ISMRMRD_ACQ_IS_NOISE_MEASUREMENT - 1)))
78 class FourierEncoding;
79 class CartesianFourierEncoding;
80 #if GADGETRON_TOOLBOXES_AVAILABLE
81 class RPEFourierEncoding;
107 const char* c_str()
const {
return data_.c_str(); }
108 operator std::string&() {
return data_; }
109 operator const std::string&()
const {
return data_; }
110 bool empty()
const {
return data_.empty(); }
111 const ISMRMRD::IsmrmrdHeader& get_IsmrmrdHeader()
const
119 void deserialize()
const
122 { header_ = ISMRMRD::IsmrmrdHeader();
123 ISMRMRD::deserialize(data_.c_str(), header_);
128 mutable ISMRMRD::IsmrmrdHeader header_;
129 mutable bool have_header_;
145 static int const num_kspace_dims_ = 7 + ISMRMRD::ISMRMRD_Constants::ISMRMRD_USER_INTS;
149 typedef std::array<int, num_kspace_dims_> TagType;
150 typedef std::vector<int> SetType;
153 for(
int i=0; i<num_kspace_dims_; ++i)
164 this->idx_set_ = idx_set;
167 TagType get_tag(
void)
const {
return tag_;}
168 SetType get_idx_set(
void)
const {
return idx_set_;}
169 void add_idx_to_set(
size_t const idx){this->idx_set_.push_back(idx);}
171 bool is_first_set()
const {
172 bool is_first= (tag_[0] == 0);
175 for(
int dim=2; dim<num_kspace_dims_; ++dim)
176 is_first *= (tag_[dim] == 0);
181 static void print_tag(
const TagType& tag);
182 static void print_acquisition_tag(ISMRMRD::Acquisition acq);
223 static void binary_op
224 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y,
225 complex_float_t (*f)(complex_float_t, complex_float_t));
226 static void semibinary_op
227 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y, complex_float_t y,
228 complex_float_t(*f)(complex_float_t, complex_float_t));
230 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y,
231 complex_float_t(*f)(complex_float_t));
234 (complex_float_t a,
const ISMRMRD::Acquisition& acq_x,
235 complex_float_t b, ISMRMRD::Acquisition& acq_y);
237 (
const ISMRMRD::Acquisition& acq_x, complex_float_t a,
238 ISMRMRD::Acquisition& acq_y, complex_float_t b);
240 (
const ISMRMRD::Acquisition& acq_x, complex_float_t a,
241 ISMRMRD::Acquisition& acq_y,
const ISMRMRD::Acquisition& acq_b);
243 (
const ISMRMRD::Acquisition& acq_x,
const ISMRMRD::Acquisition& acq_a,
244 ISMRMRD::Acquisition& acq_y,
const ISMRMRD::Acquisition& acq_b);
247 static complex_float_t dot
248 (
const ISMRMRD::Acquisition& acq_x,
const ISMRMRD::Acquisition& acq_y);
250 static complex_float_t sum(
const ISMRMRD::Acquisition& acq_x);
252 static complex_float_t max(
const ISMRMRD::Acquisition& acq_x);
256 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
260 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y, complex_float_t y);
264 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y, complex_float_t y);
268 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
272 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
274 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y, complex_float_t y);
278 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
280 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y, complex_float_t y);
283 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
285 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y, complex_float_t y);
288 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
291 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
294 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
297 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
301 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
302 static float norm(
const ISMRMRD::Acquisition& acq_x);
305 static void ismrmrd_par_info(
const char* par,
int* output)
323 output[1] = ISMRMRD::ISMRMRD_Constants::ISMRMRD_PHYS_STAMPS;
325 output[1] = ISMRMRD::ISMRMRD_Constants::ISMRMRD_CHANNEL_MASKS;
334 output[1] = ISMRMRD::ISMRMRD_Constants::ISMRMRD_USER_INTS;
336 output[1] = ISMRMRD::ISMRMRD_Constants::ISMRMRD_USER_FLOATS;
339 static void ismrmrd_par_value(ISMRMRD::Acquisition& acq,
340 const char* name,
unsigned long long int* v)
343 *v = ((
unsigned int)acq.version());
345 *v = ((
unsigned long long int)acq.flags());
347 *v = ((
unsigned int)acq.measurement_uid());
349 *v = ((
unsigned int)acq.scan_counter());
351 *v = ((
unsigned int)acq.acquisition_time_stamp());
353 *v = ((
unsigned int)acq.number_of_samples());
355 *v = ((
unsigned int)acq.available_channels());
357 *v = ((
unsigned int)acq.active_channels());
359 *v = ((
unsigned int)acq.discard_pre());
361 *v = ((
unsigned int)acq.discard_post());
363 *v = ((
unsigned int)acq.center_sample());
365 *v = ((
unsigned int)acq.encoding_space_ref());
367 *v = ((
unsigned int)acq.trajectory_dimensions());
369 *v = ((
unsigned int)acq.idx().kspace_encode_step_1);
371 *v = ((
unsigned int)acq.idx().kspace_encode_step_2);
373 *v = ((
unsigned int)acq.idx().average);
375 *v = ((
unsigned int)acq.idx().slice);
377 *v = ((
unsigned int)acq.idx().contrast);
379 *v = ((
unsigned int)acq.idx().phase);
381 *v = ((
unsigned int)acq.idx().repetition);
383 *v = ((
unsigned int)acq.idx().set);
385 *v = ((
unsigned int)acq.idx().segment);
387 int n = ISMRMRD::ISMRMRD_Constants::ISMRMRD_PHYS_STAMPS;
388 const uint32_t* pts = acq.physiology_time_stamp();
389 for (
int i = 0; i < n; i++)
390 v[i] = (
unsigned int)pts[i];
393 int n = ISMRMRD::ISMRMRD_Constants::ISMRMRD_CHANNEL_MASKS;
394 const uint64_t* pts = acq.channel_mask();
395 for (
int i = 0; i < n; i++)
396 v[i] = (
unsigned long long int)pts[i];
400 static void ismrmrd_par_value(ISMRMRD::Acquisition& acq,
401 const char* name,
float* v)
404 *v = acq.sample_time_us();
406 float* u = acq.position();
407 for (
int i = 0; i < 3; i++)
411 float* u = acq.read_dir();
412 for (
int i = 0; i < 3; i++)
416 float* u = acq.phase_dir();
417 for (
int i = 0; i < 3; i++)
421 float* u = acq.slice_dir();
422 for (
int i = 0; i < 3; i++)
426 float* u = acq.patient_table_position();
427 for (
int i = 0; i < 3; i++)
438 const std::tuple<unsigned short,unsigned short,unsigned short> min_max_ctr)
440 ISMRMRD::IsmrmrdHeader hdr = this->acquisitions_info().get_IsmrmrdHeader();
441 ISMRMRD::EncodingLimits enc_limits = hdr.encoding[0].encodingLimits;
443 ISMRMRD::Limit limit;
444 limit.minimum = std::get<0>(min_max_ctr);
445 limit.maximum = std::get<1>(min_max_ctr);
446 limit.center = std::get<2>(min_max_ctr);
449 enc_limits.kspace_encoding_step_1.get() = limit;
451 enc_limits.kspace_encoding_step_2.get() = limit;
453 enc_limits.average.get() = limit;
455 enc_limits.slice.get() = limit;
457 enc_limits.contrast.get() = limit;
459 enc_limits.phase.get() = limit;
461 enc_limits.repetition.get() = limit;
463 enc_limits.set.get() = limit;
465 enc_limits.segment.get() = limit;
467 throw std::runtime_error(
"You passed a name that is not an encoding limit.");
469 hdr.encoding[0].encodingLimits = enc_limits;
470 std::stringstream serialised_hdr;
471 ISMRMRD::serialize(hdr, serialised_hdr);
475 std::tuple<unsigned short,unsigned short,unsigned short>
476 get_encoding_limits(
const std::string& name)
const
478 ISMRMRD::IsmrmrdHeader hdr = this->acquisitions_info().get_IsmrmrdHeader();
479 ISMRMRD::EncodingLimits enc_limits = hdr.encoding[0].encodingLimits;
481 ISMRMRD::Limit limit;
484 limit = enc_limits.kspace_encoding_step_1.get();
486 limit = enc_limits.kspace_encoding_step_2.get();
488 limit = enc_limits.average.get();
490 limit = enc_limits.slice.get();
492 limit = enc_limits.contrast.get();
494 limit = enc_limits.phase.get();
496 limit = enc_limits.repetition.get();
498 limit = enc_limits.set.get();
500 limit = enc_limits.segment.get();
502 throw std::runtime_error(
"You passed a name that is not an encoding limit.");
504 return std::make_tuple(limit.minimum, limit.maximum, limit.center);
509 virtual void empty() = 0;
510 virtual void take_over(MRAcquisitionData&) = 0;
513 virtual unsigned int number()
const = 0;
515 virtual gadgetron::shared_ptr<ISMRMRD::Acquisition>
516 get_acquisition_sptr(
unsigned int num) = 0;
517 virtual int get_acquisition(
unsigned int num, ISMRMRD::Acquisition& acq)
const = 0;
518 virtual void set_acquisition(
unsigned int num, ISMRMRD::Acquisition& acq) = 0;
519 virtual void append_acquisition(ISMRMRD::Acquisition& acq) = 0;
521 virtual void copy_acquisitions_info(
const MRAcquisitionData& ac) = 0;
522 virtual void copy_acquisitions_data(
const MRAcquisitionData& ac) = 0;
525 virtual gadgetron::unique_ptr<MRAcquisitionData> new_acquisitions_container() = 0;
526 virtual MRAcquisitionData*
527 same_acquisitions_container(
const AcquisitionsInfo& info)
const = 0;
529 virtual void set_data(
const complex_float_t* z,
int all = 1) = 0;
530 virtual void get_data(complex_float_t* z,
int all = 1);
532 virtual void set_user_floats(
float const *
const z,
int const idx);
534 virtual bool is_complex()
const
541 virtual void sum(
void* ptr)
const;
542 virtual void max(
void* ptr)
const;
543 virtual void dot(
const DataContainer& dc,
void* ptr)
const;
544 complex_float_t dot(
const DataContainer& a_x)
551 const void* ptr_a,
const DataContainer& a_x,
552 const void* ptr_b,
const DataContainer& a_y);
554 const DataContainer& a_x,
const DataContainer& a_a,
555 const DataContainer& a_y,
const DataContainer& a_b);
560 axpby(ptr_a, a_x, ptr_b, a_y);
570 virtual void multiply(
const DataContainer& x,
const void* y);
580 virtual float norm()
const;
582 virtual void write(
const std::string &filename)
const;
586 void(*f)(
const ISMRMRD::Acquisition&, ISMRMRD::Acquisition&));
587 void semibinary_op(
const DataContainer& a_x, complex_float_t y,
588 void(*f)(
const ISMRMRD::Acquisition&, ISMRMRD::Acquisition&, complex_float_t));
590 void(*f)(
const ISMRMRD::Acquisition&, ISMRMRD::Acquisition&));
593 void set_acquisitions_info(std::string info) { acqs_info_ = info; }
594 void set_acquisitions_info(
const AcquisitionsInfo info) { acqs_info_ = info;}
596 ISMRMRD::TrajectoryType get_trajectory_type()
const;
598 void set_trajectory_type(
const ISMRMRD::TrajectoryType type);
600 void set_trajectory(
const uint16_t traj_dim,
float* traj)
602 ISMRMRD::Acquisition acq;
603 for(
int i=0; i<number(); ++i)
605 get_acquisition(i, acq);
606 const uint16_t num_samples = acq.number_of_samples();
607 const uint16_t num_channels = acq.active_channels();
608 acq.resize(num_samples,num_channels,traj_dim);
609 int const offset = i*traj_dim*num_samples;
610 acq.setTraj(traj + offset);
611 set_acquisition(i, acq);
615 gadgetron::unique_ptr<MRAcquisitionData> clone()
const
617 return gadgetron::unique_ptr<MRAcquisitionData>(this->clone_impl());
620 bool undersampled()
const;
621 int get_acquisitions_dimensions(
size_t ptr_dim)
const;
622 void get_kspace_dimensions(std::vector<size_t>& dims)
const;
623 uint16_t get_trajectory_dimensions(
void)
const;
627 bool sorted()
const {
return sorted_; }
628 void set_sorted(
bool sorted) { sorted_ = sorted; }
649 virtual std::vector<int> get_flagged_acquisitions_index(
const std::vector<ISMRMRD::ISMRMRD_AcquisitionFlags> flags)
const;
650 virtual std::vector<int> get_slice_encoding_index(
const unsigned kspace_encode_step_2)
const;
653 virtual void get_subset(
MRAcquisitionData& subset,
const std::vector<int> subset_idx)
const;
654 virtual void set_subset(
const MRAcquisitionData &subset,
const std::vector<int> subset_idx);
656 std::vector<int> index() {
return index_; }
657 const std::vector<int>& index()
const {
return index_; }
659 int index(
int i)
const
661 const std::size_t ni = index_.size();
662 if (i < 0 || (ni > 0 &&
static_cast<std::size_t
>(i) >= ni) ||
static_cast<unsigned>(i) >= number())
663 THROW(
"Aquisition number is out of range");
679 void read(
const std::string& filename_ismrmrd_with_ext,
int all = 0);
682 bool sorted_ =
false;
683 std::vector<int> index_;
684 std::vector<KSpaceSubset> sorting_;
685 AcquisitionsInfo acqs_info_;
689 static gadgetron::shared_ptr<MRAcquisitionData> acqs_templ_;
691 virtual MRAcquisitionData* clone_impl()
const = 0;
709 this->
read(filename_with_ext, all);
716 virtual void empty();
718 virtual unsigned int number()
const {
return (
unsigned int)acqs_.size(); }
719 virtual unsigned int items()
const {
return (
unsigned int)acqs_.size(); }
720 virtual void append_acquisition(ISMRMRD::Acquisition& acq)
722 acqs_.push_back(gadgetron::shared_ptr<ISMRMRD::Acquisition>
723 (
new ISMRMRD::Acquisition(acq)));
725 virtual gadgetron::shared_ptr<ISMRMRD::Acquisition>
726 get_acquisition_sptr(
unsigned int num)
728 int ind = index(num);
731 virtual int get_acquisition(
unsigned int num, ISMRMRD::Acquisition& acq)
const
733 int ind = index(num);
735 if (!(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_IS_PARALLEL_CALIBRATION) && \
736 !(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_IS_PARALLEL_CALIBRATION_AND_IMAGING) && \
737 !(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_LAST_IN_MEASUREMENT) && \
738 !(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_IS_REVERSE) && \
739 (acq).flags() >= (1 << (ISMRMRD::ISMRMRD_ACQ_IS_NOISE_MEASUREMENT - 1)))
743 virtual void set_acquisition(
unsigned int num, ISMRMRD::Acquisition& acq)
745 int ind = index(num);
750 acqs_info_ = ac.acquisitions_info();
753 virtual void set_data(
const complex_float_t* z,
int all = 1);
764 (gadgetron::shared_ptr<DataContainer>(ptr));
766 virtual gadgetron::unique_ptr<MRAcquisitionData>
767 new_acquisitions_container()
769 return gadgetron::unique_ptr<MRAcquisitionData>
774 std::vector<gadgetron::shared_ptr<ISMRMRD::Acquisition> > acqs_;
776 virtual void conjugate_impl();
790 virtual void empty() = 0;
791 virtual unsigned int number()
const = 0;
792 virtual gadgetron::shared_ptr<ImageWrap> sptr_image_wrap
793 (
unsigned int im_num) = 0;
794 virtual gadgetron::shared_ptr<const ImageWrap> sptr_image_wrap
795 (
unsigned int im_num)
const = 0;
798 virtual void append(
int image_data_type,
void* ptr_image) = 0;
799 virtual void append(
const ImageWrap& iw) = 0;
800 virtual void append(gadgetron::shared_ptr<ImageWrap> sptr_iw) = 0;
801 virtual gadgetron::shared_ptr<ISMRMRDImageData> abs()
const = 0;
802 virtual gadgetron::shared_ptr<ISMRMRDImageData> real()
const = 0;
803 virtual void clear_data() = 0;
804 virtual void set_image_type(
int imtype) = 0;
805 virtual void get_data(complex_float_t* data)
const;
806 virtual void set_data(
const complex_float_t* data);
807 virtual void get_real_data(
float* data)
const;
808 virtual void set_real_data(
const float* data);
809 virtual int read(std::string filename, std::string variable =
"",
int iv = -1);
810 virtual void write(
const std::string &filename,
const std::string &groupname,
const bool dicom)
const;
811 virtual void write(
const std::string &filename)
const
813 size_t size = filename.size();
814 std::string suff = filename.substr(size - 4, 4);
815 if (suff == std::string(
".dcm")) {
816 std::string prefix = filename.substr(0, size - 4);
817 this->write(prefix,
"",
true);
820 auto found = filename.find_last_of(
"/\\");
821 auto slash_found = found;
822 if (found == std::string::npos)
823 found = filename.find_last_of(
".");
825 found = filename.substr(found + 1).find_last_of(
".");
826 if (found == std::string::npos)
827 this->write(filename +
".h5",
"",
false);
829 std::string ext = filename.substr(slash_found + found + 1);
830 if (ext == std::string(
".h5"))
831 this->write(filename,
"",
false);
833 std::cerr <<
"WARNING: writing ISMRMRD images to "
834 << ext <<
"-files not implemented, "
835 <<
"please convert to Nifti images\n";
839 virtual Dimensions dimensions()
const
852 virtual void get_image_dimensions(
unsigned int im_num,
int* dim)
const
854 if (im_num >= number())
855 dim[0] = dim[1] = dim[2] = dim[3] = 0;
856 const ImageWrap& iw = image_wrap(im_num);
859 bool check_dimension_consistency()
const
861 size_t const num_dims = 4;
862 std::vector<int> first_img_dims(num_dims), temp_img_dims(num_dims);
864 this->get_image_dimensions(0, &first_img_dims[0]);
866 bool dims_match =
true;
867 for(
int i=1; i<number(); ++i)
869 this->get_image_dimensions(0, &temp_img_dims[0]);
870 dims_match *= (first_img_dims == temp_img_dims);
874 virtual gadgetron::shared_ptr<ISMRMRDImageData>
875 new_images_container()
const = 0;
876 virtual gadgetron::shared_ptr<ISMRMRDImageData>
877 clone(
const char* attr,
const char* target) = 0;
878 virtual int image_data_type(
unsigned int im_num)
const
880 return image_wrap(im_num).type();
882 virtual size_t num_data_elm()
const
884 return image_wrap(0).num_data_elm();
887 virtual float norm()
const;
889 virtual void sum(
void* ptr)
const;
890 virtual void max(
void* ptr)
const;
899 ComplexFloat_ a(*
static_cast<const complex_float_t*
>(ptr_a));
900 ComplexFloat_ b(*
static_cast<const complex_float_t*
>(ptr_b));
901 xapyb_(a_x, a, a_y, b);
907 ComplexFloat_ a(*
static_cast<const complex_float_t*
>(ptr_a));
909 xapyb_(a_x, a, a_y, b);
925 xapyb_(a_x, a, a_y, b);
945 complex_float_t(*f)(complex_float_t, complex_float_t));
948 complex_float_t(*f)(complex_float_t, complex_float_t));
949 void unary_op(
const DataContainer& a_x, complex_float_t(*f)(complex_float_t));
960 complex_float_t a,
const DataContainer& a_x,
961 complex_float_t b,
const DataContainer& a_y)
963 axpby(&a, a_x, &b, a_y);
966 const DataContainer& a_x, complex_float_t a,
967 const DataContainer& a_y, complex_float_t b)
969 xapyb(a_x, &a, a_y, &b);
971 gadgetron::unique_ptr<ISMRMRDImageData> clone()
const
973 return gadgetron::unique_ptr<ISMRMRDImageData>(this->
clone_impl());
976 virtual void sort() = 0;
977 bool sorted()
const {
return sorted_; }
978 void set_sorted(
bool sorted) { sorted_ = sorted; }
979 std::vector<int> index() {
return index_; }
980 const std::vector<int>& index()
const {
return index_; }
981 int index(
int i)
const
983 const std::size_t ni = index_.size();
984 if (i < 0 || (ni > 0 &&
static_cast<std::size_t
>(i) >= ni) ||
static_cast<unsigned>(i) >= number())
985 THROW(
"Image number is out of range. You tried to look up an image number that is not inside the container.");
991 ImageWrap& image_wrap(
unsigned int im_num)
993 gadgetron::shared_ptr<ImageWrap> sptr_iw = sptr_image_wrap(im_num);
996 const ImageWrap& image_wrap(
unsigned int im_num)
const
998 const gadgetron::shared_ptr<const ImageWrap>& sptr_iw =
999 sptr_image_wrap(im_num);
1009 std::vector<int> index_;
1016 class ComplexFloat_ {
1018 ComplexFloat_(complex_float_t v) : v_(v) {}
1019 unsigned int number()
const
1023 complex_float_t image_wrap(
unsigned int i)
1027 size_t num_data_elm()
1035 template<
class A,
class B>
1036 void xapyb_(
const DataContainer& a_x, A& a,
const DataContainer& a_y, B& b)
1038 SIRF_DYNAMIC_CAST(
const ISMRMRDImageData, x, a_x);
1039 SIRF_DYNAMIC_CAST(
const ISMRMRDImageData, y, a_y);
1040 unsigned int nx = x.number();
1041 unsigned int na = a.number();
1042 unsigned int ny = y.number();
1043 unsigned int nb = b.number();
1047 THROW(
"ImageData sizes mismatch in axpby");
1048 if (na > 0 && na != nx)
1049 THROW(
"ImageData sizes mismatch in axpby");
1050 if (nb > 0 && nb != nx)
1051 THROW(
"ImageData sizes mismatch in axpby");
1052 unsigned int n = number();
1055 THROW(
"ImageData sizes mismatch in axpby");
1056 for (
unsigned int i = 0; i < nx; i++)
1057 image_wrap(i).xapyb(x.image_wrap(i), a.image_wrap(i),
1058 y.image_wrap(i), b.image_wrap(i));
1061 for (
unsigned int i = 0; i < nx; i++) {
1062 const ImageWrap& u = x.image_wrap(i);
1063 const ImageWrap& v = y.image_wrap(i);
1065 w.xapyb(u, a.image_wrap(i), v, b.image_wrap(i));
1074 typedef ISMRMRDImageData GadgetronImageData;
1088 typedef std::vector<gadgetron::shared_ptr<ImageWrap> >::iterator
1090 typedef std::vector<gadgetron::shared_ptr<ImageWrap> >::const_iterator
1091 ImageWrapIter_const;
1095 iw_(iw), n_(n), i_(i), iter_(it), end_((**iw).end())
1098 iter_(iter.iter_), end_(iter.end_), sptr_iter_(iter.sptr_iter_)
1107 sptr_iter_ = iter.sptr_iter_;
1110 virtual bool operator==(
const BaseIter& ai)
const
1112 SIRF_DYNAMIC_CAST(
const Iterator, i, ai);
1113 return iter_ == i.iter_;
1115 virtual bool operator!=(
const BaseIter& ai)
const
1117 SIRF_DYNAMIC_CAST(
const Iterator, i, ai);
1118 return iter_ != i.iter_;
1122 if (i_ >= n_ || (i_ == n_ - 1 && iter_ == end_))
1123 throw std::out_of_range(
"cannot advance out-of-range iterator");
1125 if (iter_ == end_ && i_ < n_ - 1) {
1128 iter_ = (**iw_).begin();
1129 end_ = (**iw_).end();
1135 sptr_iter_.reset(
new Iterator(*
this));
1136 if (i_ >= n_ || (i_ == n_ - 1 && iter_ == end_))
1137 throw std::out_of_range(
"cannot advance out-of-range iterator");
1139 if (iter_ == end_ && i_ < n_ - 1) {
1142 iter_ = (**iw_).begin();
1143 end_ = (**iw_).end();
1149 if (i_ >= n_ || (i_ == n_ - 1 && iter_ == end_))
1150 throw std::out_of_range
1151 (
"cannot dereference out-of-range iterator");
1161 gadgetron::shared_ptr<Iterator> sptr_iter_;
1168 iw_(iw), n_(n), i_(i), iter_(it), end_((**iw).end_const())
1171 n_(iter.n_), i_(iter.i_),
1172 iter_(iter.iter_), end_(iter.end_), sptr_iter_(iter.sptr_iter_)
1181 sptr_iter_ = iter.sptr_iter_;
1187 return iter_ == i.iter_;
1192 return iter_ != i.iter_;
1196 if (i_ >= n_ || (i_ == n_ - 1 && iter_ == end_))
1197 throw std::out_of_range(
"cannot advance out-of-range iterator");
1199 if (iter_ == end_ && i_ < n_ - 1) {
1202 iter_ = (**iw_).begin_const();
1203 end_ = (**iw_).end_const();
1222 const NumRef& operator*()
const
1224 if (i_ >= n_ || (i_ == n_ - 1 && iter_ == end_))
1225 throw std::out_of_range
1226 (
"cannot dereference out-of-range iterator");
1233 ImageWrapIter_const iw_;
1239 gadgetron::shared_ptr<Iterator_const> sptr_iter_;
1258 const char* target);
1259 virtual void empty()
1263 virtual unsigned int items()
const
1265 return (
unsigned int)images_.size();
1267 virtual unsigned int number()
const
1269 return (
unsigned int)images_.size();
1271 virtual void append(
int image_data_type,
void* ptr_image)
1273 images_.push_back(gadgetron::shared_ptr<ImageWrap>
1274 (
new ImageWrap(image_data_type, ptr_image)));
1276 virtual void append(CFImage& img)
1278 void* vptr_img =
new CFImage(img);
1279 this->append(7, vptr_img);
1281 virtual void append(
const ImageWrap& iw)
1283 images_.push_back(gadgetron::shared_ptr<ImageWrap>(
new ImageWrap(iw)));
1285 virtual void append(gadgetron::shared_ptr<ImageWrap> sptr_iw)
1287 images_.push_back(sptr_iw);
1289 virtual gadgetron::shared_ptr<GadgetronImageData> abs()
const;
1290 virtual gadgetron::shared_ptr<GadgetronImageData> real()
const;
1291 virtual void clear_data()
1293 std::vector<gadgetron::shared_ptr<ImageWrap> > empty_data;
1294 images_.swap(empty_data);
1296 virtual void sort();
1297 virtual gadgetron::shared_ptr<ImageWrap> sptr_image_wrap
1298 (
unsigned int im_num)
1300 int i = index(im_num);
1301 return images_.at(i);
1303 virtual gadgetron::shared_ptr<const ImageWrap> sptr_image_wrap
1304 (
unsigned int im_num)
const
1306 int i = index(im_num);
1307 return images_.at(i);
1324 (gadgetron::shared_ptr<DataContainer>(new_images_container()));
1326 virtual gadgetron::shared_ptr<GadgetronImageData> new_images_container()
const
1328 gadgetron::shared_ptr<GadgetronImageData> sptr_img
1329 ((GadgetronImageData*)
new GadgetronImagesVector());
1333 virtual gadgetron::shared_ptr<GadgetronImageData>
1334 clone(
const char* attr,
const char* target)
1336 return gadgetron::shared_ptr<GadgetronImageData>
1337 (
new GadgetronImagesVector(*
this, attr, target));
1340 virtual Iterator& begin()
1342 ImageWrapIter iw = images_.begin();
1343 begin_.reset(
new Iterator(iw, images_.size(), 0, (**iw).begin()));
1346 virtual Iterator& end()
1348 ImageWrapIter iw = images_.begin();
1349 int n = images_.size();
1350 for (
int i = 0; i < n - 1; i++)
1352 end_.reset(
new Iterator(iw, n, n - 1, (**iw).end()));
1355 virtual Iterator_const& begin()
const
1357 ImageWrapIter_const iw = images_.begin();
1359 (
new Iterator_const(iw, images_.size(), 0, (**iw).begin_const()));
1360 return *begin_const_;
1362 virtual Iterator_const& end()
const
1364 ImageWrapIter_const iw = images_.begin();
1365 int n = images_.size();
1366 for (
int i = 0; i < n - 1; i++)
1369 (
new Iterator_const(iw, n, n - 1, (**iw).end_const()));
1372 virtual void set_image_type(
int image_type);
1373 virtual void get_data(complex_float_t* data)
const;
1374 virtual void set_data(
const complex_float_t* data);
1375 virtual void get_real_data(
float* data)
const;
1376 virtual void set_real_data(
const float* data);
1379 std::unique_ptr<GadgetronImagesVector>
clone()
const
1381 return std::unique_ptr<GadgetronImagesVector>(this->clone_impl());
1403 std::vector<gadgetron::shared_ptr<ImageWrap> > images_;
1404 mutable gadgetron::shared_ptr<Iterator> begin_;
1405 mutable gadgetron::shared_ptr<Iterator> end_;
1406 mutable gadgetron::shared_ptr<Iterator_const> begin_const_;
1407 mutable gadgetron::shared_ptr<Iterator_const> end_const_;
1421 std::unique_ptr<MRAcquisitionData> extract_calibration_data(
const MRAcquisitionData& ad)
const;
1422 gadgetron::shared_ptr<FourierEncoding> sptr_enc_;
1449 throw std::runtime_error(
"This has not been implemented yet.");
1452 void set_csm_smoothness(
int s){csm_smoothness_ = s;}
1462 CFImage get_csm_as_cfimage(
size_t const i)
const;
1463 CFImage get_csm_as_cfimage(
const KSpaceSubset::TagType tag,
const int offset)
const;
1466 void get_dim(
size_t const num_csm,
int* dim)
const
1468 GadgetronImagesVector::get_image_dimensions(num_csm, dim);
1479 void calculate_csm(ISMRMRD::NDArray<complex_float_t>& cm, ISMRMRD::NDArray<float>& img, ISMRMRD::NDArray<complex_float_t>& csm);
1482 int csm_smoothness_ = 0;
1483 void smoothen_(
int nx,
int ny,
int nz,
int nc, complex_float_t* u, complex_float_t* v,
int* obj_mask,
int w);
1484 void mask_noise_(
int nx,
int ny,
int nz,
float* u,
float noise,
int* mask);
1485 float max_diff_(
int nx,
int ny,
int nz,
int nc,
float small_grad, complex_float_t* u, complex_float_t* v);
1486 float max_(
int nx,
int ny,
int nz,
float* u);
1490 void match_img_header_to_acquisition(CFImage& img,
const ISMRMRD::Acquisition& acq);
Definition: DataHandle.h:159
Definition: gadgetron_data_containers.h:84
A vector implementation of the abstract MR acquisition data container class.
Definition: gadgetron_data_containers.h:705
A coil images container based on the GadgetronImagesVector class.
Definition: gadgetron_data_containers.h:1416
A coil sensitivities container based on the GadgetronImagesVector class.
Definition: gadgetron_data_containers.h:1440
Definition: DataContainer.h:42
Definition: gadgetron_data_containers.h:1164
Definition: gadgetron_data_containers.h:1092
A vector implementation of the abstract Gadgetron image data container class.
Definition: gadgetron_data_containers.h:1084
virtual bool is_complex() const
Is complex?
Definition: gadgetron_data_containers.cpp:2244
virtual void set_up_geom_info()
Populate the geometrical info metadata (from the image's own metadata)
Definition: gadgetron_data_containers.cpp:2345
virtual void reorient(const VoxelisedGeometricalInfo3D &geom_info_out)
Reorient image. Requires that dimensions match.
Definition: gadgetron_data_containers.cpp:2252
std::unique_ptr< GadgetronImagesVector > clone() const
Clone and return as unique pointer.
Definition: gadgetron_data_containers.h:1379
void print_header(const unsigned im_num)
Print header info.
Definition: gadgetron_data_containers.cpp:2207
Abstract Gadgetron image data container class.
Definition: gadgetron_data_containers.h:785
void set_meta_data(const AcquisitionsInfo &acqs_info)
Set the meta data.
Definition: gadgetron_data_containers.cpp:1983
virtual void xapyb(const DataContainer &a_x, const void *ptr_a, const DataContainer &a_y, const DataContainer &a_b)
*this = elementwise sum of x*a and elementwise y*b
Definition: gadgetron_data_containers.h:903
virtual void conjugate_impl()
we assume data to be real, complex data containers must override this
Definition: gadgetron_data_containers.cpp:1928
virtual void multiply(const DataContainer &x, const DataContainer &y)
*this = the elementwise product x*y
Definition: gadgetron_data_containers.cpp:1570
virtual void exp(const DataContainer &x)
*this = the elementwise exp(x)
Definition: gadgetron_data_containers.cpp:1656
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: gadgetron_data_containers.h:895
virtual void minimum(const DataContainer &x, const DataContainer &y)
*this = the elementwise min(x, y)
Definition: gadgetron_data_containers.cpp:1620
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: gadgetron_data_containers.cpp:1691
virtual void maximum(const DataContainer &x, const DataContainer &y)
*this = the elementwise max(x, y)
Definition: gadgetron_data_containers.cpp:1602
virtual void sqrt(const DataContainer &x)
*this = the elementwise sqrt(x)
Definition: gadgetron_data_containers.cpp:1670
virtual void log(const DataContainer &x)
*this = the elementwise log(x)
Definition: gadgetron_data_containers.cpp:1663
virtual void max(void *ptr) const
calculates the value of this container's element with the largest real part
Definition: gadgetron_data_containers.cpp:1447
virtual void divide(const DataContainer &x, const DataContainer &y)
*this = the elementwise ratio x / y
Definition: gadgetron_data_containers.cpp:1594
virtual void xapyb(const DataContainer &a_x, const DataContainer &a_a, const DataContainer &a_y, const DataContainer &a_b)
*this = elementwise sum of two elementwise products x*a and y*b
Definition: gadgetron_data_containers.h:919
virtual ISMRMRDImageData * clone_impl() const =0
Clone helper function. Don't use.
virtual void dot(const DataContainer &dc, void *ptr) const
calculates the dot product of this container with another one
Definition: gadgetron_data_containers.cpp:1420
virtual void add(const DataContainer &x, const void *ptr_y)
*this = the sum x + y with scalar y
Definition: gadgetron_data_containers.cpp:1586
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: gadgetron_data_containers.cpp:1463
virtual void power(const DataContainer &x, const DataContainer &y)
*this = the elementwise pow(x, y)
Definition: gadgetron_data_containers.cpp:1638
virtual void sign(const DataContainer &x)
*this = the elementwise sign(x)
Definition: gadgetron_data_containers.cpp:1677
const AcquisitionsInfo & get_meta_data() const
Get the meta data.
Definition: gadgetron_data_containers.h:1005
virtual void sum(void *ptr) const
below all void* are actually complex_float_t*
Definition: gadgetron_data_containers.cpp:1434
Definition: ImageData.h:52
Definition: ImageData.h:44
Definition: ImageData.h:38
Definition: gadgetron_image_wrap.h:179
Definition: gadgetron_image_wrap.h:108
Wrapper for ISMRMRD::Image.
Definition: gadgetron_image_wrap.h:106
Class to keep track of order in k-space.
Definition: gadgetron_data_containers.h:144
static TagType get_tag_from_img(const CFImage &img)
Function to get k-space dimension tag from an ISMRMRD::Image.
Definition: gadgetron_data_containers.cpp:1367
static TagType get_tag_from_acquisition(ISMRMRD::Acquisition acq)
Function to get k-space dimension tag from an ISMRMRD::Acquisition.
Definition: gadgetron_data_containers.cpp:1386
Abstract MR acquisition data container class.
Definition: gadgetron_data_containers.h:217
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: gadgetron_data_containers.h:556
std::vector< KSpaceSubset::SetType > get_kspace_order() const
Function to get the indices of the acquisitions belonging to different dimensions of k-space.
Definition: gadgetron_data_containers.cpp:1136
std::vector< KSpaceSubset > get_kspace_sorting() const
Function to get the all KSpaceSubset's of the MRAcquisitionData.
Definition: gadgetron_data_containers.h:638
virtual float norm() const
returns the norm of this container viewed as a vector
Definition: gadgetron_data_containers.cpp:1050
void read(const std::string &filename_ismrmrd_with_ext, int all=0)
Reader for ISMRMRD::Acquisition from ISMRMRD file. filename_ismrmrd_with_ext: filename of ISMRMRD raw...
Definition: gadgetron_data_containers.cpp:99
void organise_kspace()
Function to go through Acquisitions and assign them to their k-space dimension.
Definition: gadgetron_data_containers.cpp:1166
void set_encoding_limits(const std::string &name, const std::tuple< unsigned short, unsigned short, unsigned short > min_max_ctr)
Setter for the encoding limits in the header of the acquisition. inputs: name, name of k-space dimens...
Definition: gadgetron_data_containers.h:437
Definition: ANumRef.h:140
Definition: GeometricalInfo.h:50
Specification file for a wrapper class for ISMRMRD::Image.
Abstract data container.
Definition: GeometricalInfo.cpp:141
bool iequals(const std::string &a, const std::string &b)
Case insensitive string comparison, replaces boost::iequals.
Definition: iequals.cpp:7