33 #ifndef GADGETRON_DATA_CONTAINERS 34 #define GADGETRON_DATA_CONTAINERS 41 #include <ismrmrd/ismrmrd.h> 42 #include <ismrmrd/dataset.h> 44 #include "sirf/common/DataContainer.h" 45 #include "sirf/common/ImageData.h" 46 #include "sirf/common/multisort.h" 47 #include "sirf/Gadgetron/cgadgetron_shared_ptr.h" 50 #include "sirf/iUtilities/LocalisedException.h" 53 #define SIRF_DYNAMIC_CAST(T, X, Y) T& X = dynamic_cast<T&>(Y) 62 #define TO_BE_IGNORED(acq) \ 63 (!(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_IS_PARALLEL_CALIBRATION) && \ 64 !(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_IS_PARALLEL_CALIBRATION_AND_IMAGING) && \ 65 !(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_LAST_IN_MEASUREMENT) && \ 66 !(acq).isFlagSet(ISMRMRD::ISMRMRD_ACQ_IS_REVERSE) && \ 67 (acq).flags() >= (1 << (ISMRMRD::ISMRMRD_ACQ_IS_NOISE_MEASUREMENT - 1))) 77 class FourierEncoding;
78 class CartesianFourierEncoding;
79 #if GADGETRON_TOOLBOXES_AVAILABLE 80 class RPEFourierEncoding;
106 const char* c_str()
const {
return data_.c_str(); }
107 operator std::string&() {
return data_; }
108 operator const std::string&()
const {
return data_; }
109 bool empty()
const {
return data_.empty(); }
110 const ISMRMRD::IsmrmrdHeader& get_IsmrmrdHeader()
const 118 void deserialize()
const 121 { header_ = ISMRMRD::IsmrmrdHeader();
122 ISMRMRD::deserialize(data_.c_str(), header_);
127 mutable ISMRMRD::IsmrmrdHeader header_;
128 mutable bool have_header_;
144 static int const num_kspace_dims_ = 7 + ISMRMRD::ISMRMRD_Constants::ISMRMRD_USER_INTS;
148 typedef std::array<int, num_kspace_dims_> TagType;
149 typedef std::vector<int> SetType;
152 for(
int i=0; i<num_kspace_dims_; ++i)
163 this->idx_set_ = idx_set;
166 TagType get_tag(
void)
const {
return tag_;}
167 SetType get_idx_set(
void)
const {
return idx_set_;}
168 void add_idx_to_set(
size_t const idx){this->idx_set_.push_back(idx);}
170 bool is_first_set()
const {
171 bool is_first= (tag_[0] == 0);
174 for(
int dim=2; dim<num_kspace_dims_; ++dim)
175 is_first *= (tag_[dim] == 0);
180 static void print_tag(
const TagType& tag);
181 static void print_acquisition_tag(ISMRMRD::Acquisition acq);
187 static TagType get_tag_from_acquisition(ISMRMRD::Acquisition acq);
193 static TagType get_tag_from_img(
const CFImage& img);
224 (complex_float_t a,
const ISMRMRD::Acquisition& acq_x,
225 complex_float_t b, ISMRMRD::Acquisition& acq_y);
227 (
const ISMRMRD::Acquisition& acq_x, complex_float_t a,
228 ISMRMRD::Acquisition& acq_y, complex_float_t b);
230 (
const ISMRMRD::Acquisition& acq_x,
const ISMRMRD::Acquisition& acq_a,
231 ISMRMRD::Acquisition& acq_y,
const ISMRMRD::Acquisition& acq_b);
234 static complex_float_t dot
235 (
const ISMRMRD::Acquisition& acq_x,
const ISMRMRD::Acquisition& acq_y);
239 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
243 (
const ISMRMRD::Acquisition& acq_x, ISMRMRD::Acquisition& acq_y);
245 static float norm(
const ISMRMRD::Acquisition& acq_x);
248 static void ismrmrd_par_info(
const char* par,
int* output)
266 output[1] = ISMRMRD::ISMRMRD_Constants::ISMRMRD_PHYS_STAMPS;
268 output[1] = ISMRMRD::ISMRMRD_Constants::ISMRMRD_CHANNEL_MASKS;
277 output[1] = ISMRMRD::ISMRMRD_Constants::ISMRMRD_USER_INTS;
279 output[1] = ISMRMRD::ISMRMRD_Constants::ISMRMRD_USER_FLOATS;
282 static void ismrmrd_par_value(ISMRMRD::Acquisition& acq,
283 const char* name,
unsigned long long int* v)
286 *v = ((
unsigned int)acq.version());
288 *v = ((
unsigned long long int)acq.flags());
290 *v = ((
unsigned int)acq.measurement_uid());
292 *v = ((
unsigned int)acq.scan_counter());
294 *v = ((
unsigned int)acq.acquisition_time_stamp());
296 *v = ((
unsigned int)acq.number_of_samples());
298 *v = ((
unsigned int)acq.available_channels());
300 *v = ((
unsigned int)acq.active_channels());
302 *v = ((
unsigned int)acq.discard_pre());
304 *v = ((
unsigned int)acq.discard_post());
306 *v = ((
unsigned int)acq.center_sample());
308 *v = ((
unsigned int)acq.encoding_space_ref());
310 *v = ((
unsigned int)acq.trajectory_dimensions());
312 *v = ((
unsigned int)acq.idx().kspace_encode_step_1);
314 *v = ((
unsigned int)acq.idx().kspace_encode_step_2);
316 *v = ((
unsigned int)acq.idx().average);
318 *v = ((
unsigned int)acq.idx().slice);
320 *v = ((
unsigned int)acq.idx().contrast);
322 *v = ((
unsigned int)acq.idx().phase);
324 *v = ((
unsigned int)acq.idx().repetition);
326 *v = ((
unsigned int)acq.idx().set);
328 *v = ((
unsigned int)acq.idx().segment);
330 int n = ISMRMRD::ISMRMRD_Constants::ISMRMRD_PHYS_STAMPS;
331 const uint32_t* pts = acq.physiology_time_stamp();
332 for (
int i = 0; i < n; i++)
333 v[i] = (
unsigned int)pts[i];
336 int n = ISMRMRD::ISMRMRD_Constants::ISMRMRD_CHANNEL_MASKS;
337 const uint64_t* pts = acq.channel_mask();
338 for (
int i = 0; i < n; i++)
339 v[i] = (
unsigned long long int)pts[i];
343 static void ismrmrd_par_value(ISMRMRD::Acquisition& acq,
344 const char* name,
float* v)
347 *v = acq.sample_time_us();
349 float* u = acq.position();
350 for (
int i = 0; i < 3; i++)
354 float* u = acq.read_dir();
355 for (
int i = 0; i < 3; i++)
359 float* u = acq.phase_dir();
360 for (
int i = 0; i < 3; i++)
364 float* u = acq.slice_dir();
365 for (
int i = 0; i < 3; i++)
369 float* u = acq.patient_table_position();
370 for (
int i = 0; i < 3; i++)
377 virtual void empty() = 0;
381 virtual unsigned int number()
const = 0;
383 virtual gadgetron::shared_ptr<ISMRMRD::Acquisition>
384 get_acquisition_sptr(
unsigned int num) = 0;
385 virtual void get_acquisition(
unsigned int num, ISMRMRD::Acquisition& acq)
const = 0;
386 virtual void set_acquisition(
unsigned int num, ISMRMRD::Acquisition& acq) = 0;
387 virtual void append_acquisition(ISMRMRD::Acquisition& acq) = 0;
393 virtual gadgetron::unique_ptr<MRAcquisitionData> new_acquisitions_container() = 0;
397 virtual void set_data(
const complex_float_t* z,
int all = 1) = 0;
398 virtual void get_data(complex_float_t* z,
int all = 1);
400 virtual void set_user_floats(
float const *
const z,
int const idx);
402 virtual bool is_complex()
const 431 THROW(
"maximum not defined for MRAcquisitionData");
435 THROW(
"minimum not defined for MRAcquisitionData");
437 virtual float norm()
const;
439 virtual void write(
const std::string &filename)
const;
444 void set_acquisitions_info(std::string info) { acqs_info_ = info; }
445 void set_acquisitions_info(
const AcquisitionsInfo info) { acqs_info_ = info;}
447 ISMRMRD::TrajectoryType get_trajectory_type()
const;
449 void set_trajectory_type(
const ISMRMRD::TrajectoryType type);
451 void set_trajectory(
const uint16_t traj_dim,
float* traj)
453 ISMRMRD::Acquisition acq;
454 for(
int i=0; i<number(); ++i)
456 get_acquisition(i, acq);
457 const uint16_t num_samples = acq.number_of_samples();
458 const uint16_t num_channels = acq.active_channels();
459 acq.resize(num_samples,num_channels,traj_dim);
460 int const offset = i*traj_dim*num_samples;
461 acq.setTraj(traj + offset);
462 set_acquisition(i, acq);
466 gadgetron::unique_ptr<MRAcquisitionData> clone()
const 468 return gadgetron::unique_ptr<MRAcquisitionData>(this->clone_impl());
471 bool undersampled()
const;
472 int get_acquisitions_dimensions(
size_t ptr_dim)
const;
473 void get_kspace_dimensions(std::vector<size_t>& dims)
const;
474 uint16_t get_trajectory_dimensions(
void)
const;
478 bool sorted()
const {
return sorted_; }
479 void set_sorted(
bool sorted) { sorted_ = sorted; }
486 std::vector<KSpaceSubset::SetType > get_kspace_order()
const;
498 void organise_kspace();
500 virtual std::vector<int> get_flagged_acquisitions_index(
const std::vector<ISMRMRD::ISMRMRD_AcquisitionFlags> flags)
const;
501 virtual std::vector<int> get_slice_encoding_index(
const unsigned kspace_encode_step_2)
const;
504 virtual void get_subset(
MRAcquisitionData& subset,
const std::vector<int> subset_idx)
const;
505 virtual void set_subset(
const MRAcquisitionData &subset,
const std::vector<int> subset_idx);
507 std::vector<int> index() {
return index_; }
508 const std::vector<int>& index()
const {
return index_; }
510 int index(
int i)
const 512 const std::size_t ni = index_.size();
513 if (i < 0 || (ni > 0 && static_cast<std::size_t>(i) >= ni) || static_cast<unsigned>(i) >= number())
514 THROW(
"Aquisition number is out of range");
530 void read(
const std::string& filename_ismrmrd_with_ext );
533 bool sorted_ =
false;
534 std::vector<int> index_;
535 std::vector<KSpaceSubset> sorting_;
540 static gadgetron::shared_ptr<MRAcquisitionData> acqs_templ_;
545 void binary_op_(
int op,
547 const void* ptr_a = 0,
const void* ptr_b = 0);
563 this->read(filename_with_ext);
570 virtual void empty();
572 virtual unsigned int number()
const {
return (
unsigned int)acqs_.size(); }
573 virtual unsigned int items()
const {
return (
unsigned int)acqs_.size(); }
574 virtual void append_acquisition(ISMRMRD::Acquisition& acq)
576 acqs_.push_back(gadgetron::shared_ptr<ISMRMRD::Acquisition>
577 (
new ISMRMRD::Acquisition(acq)));
579 virtual gadgetron::shared_ptr<ISMRMRD::Acquisition>
580 get_acquisition_sptr(
unsigned int num)
582 int ind = index(num);
585 virtual void get_acquisition(
unsigned int num, ISMRMRD::Acquisition& acq)
const 587 int ind = index(num);
590 virtual void set_acquisition(
unsigned int num, ISMRMRD::Acquisition& acq)
592 int ind = index(num);
597 acqs_info_ = ac.acquisitions_info();
600 virtual void set_data(
const complex_float_t* z,
int all = 1);
611 (gadgetron::shared_ptr<DataContainer>(ptr));
613 virtual gadgetron::unique_ptr<MRAcquisitionData>
614 new_acquisitions_container()
616 return gadgetron::unique_ptr<MRAcquisitionData>
621 std::vector<gadgetron::shared_ptr<ISMRMRD::Acquisition> > acqs_;
623 virtual void conjugate_impl();
637 virtual void empty() = 0;
638 virtual unsigned int number()
const = 0;
639 virtual gadgetron::shared_ptr<ImageWrap> sptr_image_wrap
640 (
unsigned int im_num) = 0;
641 virtual gadgetron::shared_ptr<const ImageWrap> sptr_image_wrap
642 (
unsigned int im_num)
const = 0;
645 virtual void append(
int image_data_type,
void* ptr_image) = 0;
646 virtual void append(
const ImageWrap& iw) = 0;
647 virtual void append(gadgetron::shared_ptr<ImageWrap> sptr_iw) = 0;
648 virtual gadgetron::shared_ptr<ISMRMRDImageData> abs()
const = 0;
649 virtual gadgetron::shared_ptr<ISMRMRDImageData> real()
const = 0;
650 virtual void clear_data() = 0;
651 virtual void set_image_type(
int imtype) = 0;
652 virtual void get_data(complex_float_t* data)
const;
653 virtual void set_data(
const complex_float_t* data);
654 virtual void get_real_data(
float* data)
const;
655 virtual void set_real_data(
const float* data);
656 virtual int read(std::string filename, std::string variable =
"",
int iv = -1);
657 virtual void write(
const std::string &filename,
const std::string &groupname,
const bool dicom)
const;
658 virtual void write(
const std::string &filename)
const 660 size_t size = filename.size();
661 std::string suff = filename.substr(size - 4, 4);
662 if (suff == std::string(
".dcm")) {
663 std::string prefix = filename.substr(0, size - 4);
664 this->write(prefix,
"",
true);
667 auto found = filename.find_last_of(
"/\\");
668 auto slash_found = found;
669 if (found == std::string::npos)
670 found = filename.find_last_of(
".");
672 found = filename.substr(found + 1).find_last_of(
".");
673 if (found == std::string::npos)
674 this->write(filename +
".h5",
"",
false);
676 std::string ext = filename.substr(slash_found + found + 1);
677 if (ext == std::string(
".h5"))
678 this->write(filename,
"",
false);
680 std::cerr <<
"WARNING: writing ISMRMRD images to " 681 << ext <<
"-files not implemented, " 682 <<
"please convert to Nifti images\n";
686 virtual Dimensions dimensions()
const 699 virtual void get_image_dimensions(
unsigned int im_num,
int* dim)
const 701 if (im_num >= number())
702 dim[0] = dim[1] = dim[2] = dim[3] = 0;
703 const ImageWrap& iw = image_wrap(im_num);
706 bool check_dimension_consistency()
const 708 size_t const num_dims = 4;
709 std::vector<int> first_img_dims(num_dims), temp_img_dims(num_dims);
711 this->get_image_dimensions(0, &first_img_dims[0]);
713 bool dims_match =
true;
714 for(
int i=1; i<number(); ++i)
716 this->get_image_dimensions(0, &temp_img_dims[0]);
717 dims_match *= (first_img_dims == temp_img_dims);
721 virtual gadgetron::shared_ptr<ISMRMRDImageData>
722 new_images_container()
const = 0;
723 virtual gadgetron::shared_ptr<ISMRMRDImageData>
724 clone(
const char* attr,
const char* target) = 0;
725 virtual int image_data_type(
unsigned int im_num)
const 727 return image_wrap(im_num).type();
730 virtual float norm()
const;
739 ComplexFloat_ a(*(complex_float_t*)ptr_a);
740 ComplexFloat_ b(*(complex_float_t*)ptr_b);
741 xapyb_(a_x, a, a_y, b);
747 ComplexFloat_ a(*(complex_float_t*)ptr_a);
749 xapyb_(a_x, a, a_y, b);
756 ComplexFloat_ b(*(complex_float_t*)ptr_b);
757 xapyb_(a_x, a, a_y, b);
765 xapyb_(a_x, a, a_y, b);
771 THROW(
"maximum not defined for ISMRMRDImageData");
775 THROW(
"minimum not defined for ISMRMRDImageData");
790 axpby(&a, a_x, &b, a_y);
796 xapyb(a_x, &a, a_y, &b);
798 gadgetron::unique_ptr<ISMRMRDImageData> clone()
const 800 return gadgetron::unique_ptr<ISMRMRDImageData>(this->clone_impl());
803 virtual void sort() = 0;
804 bool sorted()
const {
return sorted_; }
805 void set_sorted(
bool sorted) { sorted_ = sorted; }
806 std::vector<int> index() {
return index_; }
807 const std::vector<int>& index()
const {
return index_; }
808 int index(
int i)
const 810 const std::size_t ni = index_.size();
811 if (i < 0 || (ni > 0 && static_cast<std::size_t>(i) >= ni) || static_cast<unsigned>(i) >= number())
812 THROW(
"Image number is out of range. You tried to look up an image number that is not inside the container.");
818 ImageWrap& image_wrap(
unsigned int im_num)
820 gadgetron::shared_ptr<ImageWrap> sptr_iw = sptr_image_wrap(im_num);
823 const ImageWrap& image_wrap(
unsigned int im_num)
const 825 const gadgetron::shared_ptr<const ImageWrap>& sptr_iw =
826 sptr_image_wrap(im_num);
836 std::vector<int> index_;
840 virtual void conjugate_impl();
843 class ComplexFloat_ {
845 ComplexFloat_(complex_float_t v) : v_(v) {}
846 unsigned int number()
const 850 complex_float_t image_wrap(
unsigned int i)
858 template<
class A,
class B>
863 unsigned int nx = x.number();
864 unsigned int na = a.number();
865 unsigned int ny = y.number();
866 unsigned int nb = b.number();
869 THROW(
"ImageData sizes mismatch in axpby");
870 if (na > 0 && na != nx)
871 THROW(
"ImageData sizes mismatch in axpby");
872 if (nb > 0 && nb != nx)
873 THROW(
"ImageData sizes mismatch in axpby");
874 unsigned int n = number();
877 THROW(
"ImageData sizes mismatch in axpby");
878 for (
unsigned int i = 0; i < nx; i++)
879 image_wrap(i).xapyb(x.image_wrap(i), a.image_wrap(i),
880 y.image_wrap(i), b.image_wrap(i));
883 for (
unsigned int i = 0; i < nx; i++) {
887 w.xapyb(u, a.image_wrap(i), v, b.image_wrap(i));
891 this->set_meta_data(x.get_meta_data());
910 typedef std::vector<gadgetron::shared_ptr<ImageWrap> >::iterator
912 typedef std::vector<gadgetron::shared_ptr<ImageWrap> >::const_iterator
917 iw_(iw), n_(n), i_(i), iter_(it), end_((**iw).end())
920 iter_(iter.iter_), end_(iter.end_), sptr_iter_(iter.sptr_iter_)
929 sptr_iter_ = iter.sptr_iter_;
932 virtual bool operator==(
const BaseIter& ai)
const 934 SIRF_DYNAMIC_CAST(
const Iterator, i, ai);
935 return iter_ == i.iter_;
937 virtual bool operator!=(
const BaseIter& ai)
const 939 SIRF_DYNAMIC_CAST(
const Iterator, i, ai);
940 return iter_ != i.iter_;
944 if (i_ >= n_ || (i_ == n_ - 1 && iter_ == end_))
945 throw std::out_of_range(
"cannot advance out-of-range iterator");
947 if (iter_ == end_ && i_ < n_ - 1) {
950 iter_ = (**iw_).begin();
951 end_ = (**iw_).end();
957 sptr_iter_.reset(
new Iterator(*
this));
958 if (i_ >= n_ || (i_ == n_ - 1 && iter_ == end_))
959 throw std::out_of_range(
"cannot advance out-of-range iterator");
961 if (iter_ == end_ && i_ < n_ - 1) {
964 iter_ = (**iw_).begin();
965 end_ = (**iw_).end();
971 if (i_ >= n_ || (i_ == n_ - 1 && iter_ == end_))
972 throw std::out_of_range
973 (
"cannot dereference out-of-range iterator");
983 gadgetron::shared_ptr<Iterator> sptr_iter_;
990 iw_(iw), n_(n), i_(i), iter_(it), end_((**iw).end_const())
993 n_(iter.n_), i_(iter.i_),
994 iter_(iter.iter_), end_(iter.end_), sptr_iter_(iter.sptr_iter_)
1003 sptr_iter_ = iter.sptr_iter_;
1006 bool operator==(
const BaseIter_const& ai)
const 1009 return iter_ == i.iter_;
1011 bool operator!=(
const BaseIter_const& ai)
const 1014 return iter_ != i.iter_;
1018 if (i_ >= n_ || (i_ == n_ - 1 && iter_ == end_))
1019 throw std::out_of_range(
"cannot advance out-of-range iterator");
1021 if (iter_ == end_ && i_ < n_ - 1) {
1024 iter_ = (**iw_).begin_const();
1025 end_ = (**iw_).end_const();
1044 const NumRef& operator*()
const 1046 if (i_ >= n_ || (i_ == n_ - 1 && iter_ == end_))
1047 throw std::out_of_range
1048 (
"cannot dereference out-of-range iterator");
1055 ImageWrapIter_const iw_;
1061 gadgetron::shared_ptr<Iterator_const> sptr_iter_;
1080 const char* target);
1081 virtual void empty()
1085 virtual unsigned int items()
const 1087 return (
unsigned int)images_.size();
1089 virtual unsigned int number()
const 1091 return (
unsigned int)images_.size();
1093 virtual void append(
int image_data_type,
void* ptr_image)
1095 images_.push_back(gadgetron::shared_ptr<ImageWrap>
1096 (
new ImageWrap(image_data_type, ptr_image)));
1098 virtual void append(CFImage& img)
1100 void* vptr_img =
new CFImage(img);
1101 this->append(7, vptr_img);
1103 virtual void append(
const ImageWrap& iw)
1105 images_.push_back(gadgetron::shared_ptr<ImageWrap>(
new ImageWrap(iw)));
1107 virtual void append(gadgetron::shared_ptr<ImageWrap> sptr_iw)
1109 images_.push_back(sptr_iw);
1111 virtual gadgetron::shared_ptr<GadgetronImageData> abs()
const;
1112 virtual gadgetron::shared_ptr<GadgetronImageData> real()
const;
1113 virtual void clear_data()
1115 std::vector<gadgetron::shared_ptr<ImageWrap> > empty_data;
1116 images_.swap(empty_data);
1118 virtual void sort();
1119 virtual gadgetron::shared_ptr<ImageWrap> sptr_image_wrap
1120 (
unsigned int im_num)
1122 int i = index(im_num);
1123 return images_.at(i);
1125 virtual gadgetron::shared_ptr<const ImageWrap> sptr_image_wrap
1126 (
unsigned int im_num)
const 1128 int i = index(im_num);
1129 return images_.at(i);
1146 (gadgetron::shared_ptr<DataContainer>(new_images_container()));
1148 virtual gadgetron::shared_ptr<GadgetronImageData> new_images_container()
const 1150 gadgetron::shared_ptr<GadgetronImageData> sptr_img
1152 sptr_img->set_meta_data(get_meta_data());
1155 virtual gadgetron::shared_ptr<GadgetronImageData>
1156 clone(
const char* attr,
const char* target)
1158 return gadgetron::shared_ptr<GadgetronImageData>
1164 ImageWrapIter iw = images_.begin();
1165 begin_.reset(
new Iterator(iw, images_.size(), 0, (**iw).begin()));
1170 ImageWrapIter iw = images_.begin();
1171 int n = images_.size();
1172 for (
int i = 0; i < n - 1; i++)
1174 end_.reset(
new Iterator(iw, n, n - 1, (**iw).end()));
1179 ImageWrapIter_const iw = images_.begin();
1181 (
new Iterator_const(iw, images_.size(), 0, (**iw).begin_const()));
1182 return *begin_const_;
1186 ImageWrapIter_const iw = images_.begin();
1187 int n = images_.size();
1188 for (
int i = 0; i < n - 1; i++)
1194 virtual void set_image_type(
int image_type);
1195 virtual void get_data(complex_float_t* data)
const;
1196 virtual void set_data(
const complex_float_t* data);
1197 virtual void get_real_data(
float* data)
const;
1198 virtual void set_real_data(
const float* data);
1201 std::unique_ptr<GadgetronImagesVector>
clone()
const 1203 return std::unique_ptr<GadgetronImagesVector>(this->clone_impl());
1207 void print_header(
const unsigned im_num);
1210 virtual bool is_complex()
const;
1216 virtual void set_up_geom_info();
1225 std::vector<gadgetron::shared_ptr<ImageWrap> > images_;
1226 mutable gadgetron::shared_ptr<Iterator> begin_;
1227 mutable gadgetron::shared_ptr<Iterator> end_;
1228 mutable gadgetron::shared_ptr<Iterator_const> begin_const_;
1229 mutable gadgetron::shared_ptr<Iterator_const> end_const_;
1243 std::unique_ptr<MRAcquisitionData> extract_calibration_data(
const MRAcquisitionData& ad)
const;
1244 gadgetron::shared_ptr<FourierEncoding> sptr_enc_;
1271 throw std::runtime_error(
"This has not been implemented yet.");
1274 void set_csm_smoothness(
int s){csm_smoothness_ = s;}
1284 CFImage get_csm_as_cfimage(
size_t const i)
const;
1285 CFImage get_csm_as_cfimage(
const KSpaceSubset::TagType tag,
const int offset)
const;
1288 void get_dim(
size_t const num_csm,
int* dim)
const 1290 GadgetronImagesVector::get_image_dimensions(num_csm, dim);
1293 void forward(GadgetronImageData& img, GadgetronImageData& combined_img)
const;
1294 void backward(GadgetronImageData& combined_img,
const GadgetronImageData& img)
const;
1298 void coilchannels_from_combined_image(GadgetronImageData& img, GadgetronImageData& combined_img)
const;
1299 void combine_images_with_coilmaps(GadgetronImageData& combined_img,
const GadgetronImageData& img)
const;
1301 void calculate_csm(ISMRMRD::NDArray<complex_float_t>& cm, ISMRMRD::NDArray<float>& img, ISMRMRD::NDArray<complex_float_t>& csm);
1304 int csm_smoothness_ = 0;
1305 void smoothen_(
int nx,
int ny,
int nz,
int nc, complex_float_t* u, complex_float_t* v,
int* obj_mask,
int w);
1306 void mask_noise_(
int nx,
int ny,
int nz,
float* u,
float noise,
int* mask);
1307 float max_diff_(
int nx,
int ny,
int nz,
int nc,
float small_grad, complex_float_t* u, complex_float_t* v);
1308 float max_(
int nx,
int ny,
int nz,
float* u);
1312 void match_img_header_to_acquisition(CFImage& img,
const ISMRMRD::Acquisition& acq);
Definition: ImageData.h:37
Definition: GeometricalInfo.h:49
bool iequals(const std::string &a, const std::string &b)
Case insensitive string comparison, replaces boost::iequals.
Definition: iequals.cpp:7
Definition: gadgetron_data_containers.h:986
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:735
virtual void maximum(const DataContainer &x, const DataContainer &y)
*this = the elementwise max(x, y)
Definition: gadgetron_data_containers.h:769
A coil sensitivities container based on the GadgetronImagesVector class.
Definition: gadgetron_data_containers.h:1261
Definition: ImageData.h:52
std::vector< KSpaceSubset > get_kspace_sorting() const
Function to get the all KSpaceSubset's of the MRAcquisitionData.
Definition: gadgetron_data_containers.h:489
A vector implementation of the abstract MR acquisition data container class.
Definition: gadgetron_data_containers.h:559
Definition: ANumRef.h:140
Definition: ImageData.h:44
Class to keep track of order in k-space.
Definition: gadgetron_data_containers.h:142
virtual void minimum(const DataContainer &x, const DataContainer &y)
*this = the elementwise min(x, y)
Definition: gadgetron_data_containers.h:773
Abstract data container.
Definition: GeometricalInfo.cpp:141
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:759
Definition: DataHandle.h:159
Definition: gadgetron_image_wrap.h:108
Definition: gadgetron_data_containers.h:83
virtual void minimum(const DataContainer &x, const DataContainer &y)
*this = the elementwise min(x, y)
Definition: gadgetron_data_containers.h:433
const AcquisitionsInfo & get_meta_data() const
Get the meta data.
Definition: gadgetron_data_containers.h:832
virtual void maximum(const DataContainer &x, const DataContainer &y)
*this = the elementwise max(x, y)
Definition: gadgetron_data_containers.h:429
Definition: DataContainer.h:41
Definition: gadgetron_data_containers.h:914
A vector implementation of the abstract Gadgetron image data container class.
Definition: gadgetron_data_containers.h:906
std::unique_ptr< GadgetronImagesVector > clone() const
Clone and return as unique pointer.
Definition: gadgetron_data_containers.h:1201
Specification file for a wrapper class for ISMRMRD::Image.
Definition: gadgetron_image_wrap.h:179
Abstract Gadgetron image data container class.
Definition: gadgetron_data_containers.h:632
Abstract MR acquisition data container class.
Definition: gadgetron_data_containers.h:216
A coil images container based on the GadgetronImagesVector class.
Definition: gadgetron_data_containers.h:1237
Wrapper for ISMRMRD::Image.
Definition: gadgetron_image_wrap.h:106