31 #ifndef GADGETRON_IMAGE_WRAP_TYPE
32 #define GADGETRON_IMAGE_WRAP_TYPE
34 #include <ismrmrd/ismrmrd.h>
35 #include <ismrmrd/dataset.h>
36 #include <ismrmrd/meta.h>
37 #include <ismrmrd/xml.h>
39 #include "sirf/common/ANumRef.h"
41 #include "sirf/Gadgetron/cgadgetron_shared_ptr.h"
44 #define IMAGE_PROCESSING_SWITCH(Type, Operation, Arguments, ...)\
45 if (Type == ISMRMRD::ISMRMRD_USHORT)\
46 Operation ((ISMRMRD::Image<unsigned short>*) Arguments, ##__VA_ARGS__);\
47 else if (Type == ISMRMRD::ISMRMRD_SHORT)\
48 Operation ((ISMRMRD::Image<short>*) Arguments, ##__VA_ARGS__);\
49 else if (Type == ISMRMRD::ISMRMRD_UINT)\
50 Operation ((ISMRMRD::Image<unsigned int>*) Arguments, ##__VA_ARGS__);\
51 else if (Type == ISMRMRD::ISMRMRD_INT)\
52 Operation ((ISMRMRD::Image<int>*) Arguments, ##__VA_ARGS__);\
53 else if (Type == ISMRMRD::ISMRMRD_FLOAT)\
54 Operation ((ISMRMRD::Image<float>*) Arguments, ##__VA_ARGS__);\
55 else if (Type == ISMRMRD::ISMRMRD_DOUBLE)\
56 Operation ((ISMRMRD::Image<double>*) Arguments, ##__VA_ARGS__);\
57 else if (Type == ISMRMRD::ISMRMRD_CXFLOAT)\
58 Operation ((ISMRMRD::Image< std::complex<float> >*) Arguments, \
60 else if (Type == ISMRMRD::ISMRMRD_CXDOUBLE)\
61 Operation ((ISMRMRD::Image< std::complex<double> >*) Arguments, \
64 throw std::domain_error("unknown data type in IMAGE_PROCESSING_SWITCH");
66 #define IMAGE_PROCESSING_SWITCH_CONST(Type, Operation, Arguments, ...)\
67 if (Type == ISMRMRD::ISMRMRD_USHORT)\
68 Operation ((const ISMRMRD::Image<unsigned short>*) Arguments, \
70 else if (Type == ISMRMRD::ISMRMRD_SHORT)\
71 Operation ((const ISMRMRD::Image<short>*) Arguments, ##__VA_ARGS__);\
72 else if (Type == ISMRMRD::ISMRMRD_UINT)\
73 Operation ((const ISMRMRD::Image<unsigned int>*) Arguments, ##__VA_ARGS__);\
74 else if (Type == ISMRMRD::ISMRMRD_INT)\
75 Operation ((const ISMRMRD::Image<int>*) Arguments, ##__VA_ARGS__);\
76 else if (Type == ISMRMRD::ISMRMRD_FLOAT)\
77 Operation ((const ISMRMRD::Image<float>*) Arguments, ##__VA_ARGS__);\
78 else if (Type == ISMRMRD::ISMRMRD_DOUBLE)\
79 Operation ((const ISMRMRD::Image<double>*) Arguments, ##__VA_ARGS__);\
80 else if (Type == ISMRMRD::ISMRMRD_CXFLOAT)\
81 Operation ((const ISMRMRD::Image< std::complex<float> >*) Arguments, \
83 else if (Type == ISMRMRD::ISMRMRD_CXDOUBLE)\
84 Operation ((const ISMRMRD::Image< std::complex<double> >*) Arguments, \
87 throw std::domain_error("unknown data type in IMAGE_PROCESSING_SWITCH_CONST");
90 typedef ISMRMRD::Image<complex_float_t> CFImage;
91 typedef ISMRMRD::Image<complex_double_t> CDImage;
94 #pragma warning( push )
96 #pragma warning( disable : 4244 )
110 Iterator(
int type,
void* data,
unsigned int dsize,
size_t n) :
111 type_(type), ptr_((
char*)data), dsize_(dsize), n_(n), i_(0),
118 dsize_ = iter.dsize_;
121 sptr_iter_ = iter.sptr_iter_;
122 ref_.copy(iter.ref_);
124 bool operator!=(
const Iterator& i)
const
126 return ptr_ != i.ptr_;
128 bool operator==(
const Iterator& i)
const
130 return ptr_ == i.ptr_;
135 throw std::out_of_range(
"cannot advance out-of-range iterator");
154 throw std::out_of_range
155 (
"cannot dereference out-of-range iterator");
163 dsize_ = iter.dsize_;
166 sptr_iter_ = iter.sptr_iter_;
167 ref_.copy(iter.ref_);
176 gadgetron::shared_ptr<Iterator> sptr_iter_;
181 Iterator_const(
int type,
void* data,
unsigned int dsize,
size_t n) :
182 type_(type), ptr_((
char*)data), dsize_(dsize), n_(n), i_(0),
189 dsize_ = iter.dsize_;
192 sptr_iter_ = iter.sptr_iter_;
193 ref_.copy(iter.ref_);
197 return ptr_ != i.ptr_;
201 return ptr_ == i.ptr_;
206 throw std::out_of_range(
"cannot advance out-of-range iterator");
221 const NumRef& operator*()
const
224 std::cout << i_ <<
' ' << n_ <<
'\n';
225 throw std::out_of_range
226 (
"cannot dereference out-of-range iterator");
235 dsize_ = iter.dsize_;
238 sptr_iter_ = iter.sptr_iter_;
239 ref_.copy(iter.ref_);
248 gadgetron::shared_ptr<Iterator_const> sptr_iter_;
256 ImageWrap(uint16_t type, ISMRMRD::Dataset& dataset,
const char* var,
int index) noexcept(
false)
259 IMAGE_PROCESSING_SWITCH(type_, read_, ptr_, dataset, var, index, &ptr_);
261 ImageWrap(
const ImageWrap& iw) noexcept(
false)
264 IMAGE_PROCESSING_SWITCH(type_, copy_, iw.ptr_image());
266 ~ImageWrap() noexcept
269 IMAGE_PROCESSING_SWITCH(type_,
delete, ptr_);
284 const void* ptr_image()
const
293 IMAGE_PROCESSING_SWITCH
294 (type_, get_data_parameters_, ptr_, &n, &dsize, &ptr);
295 begin_.reset(
new Iterator(type_, ptr, dsize, n));
298 Iterator_const& begin_const()
const
303 IMAGE_PROCESSING_SWITCH_CONST
304 (type_, get_data_parameters_, ptr_, &n, &dsize, &ptr);
305 begin_const_.reset(
new Iterator_const(type_, ptr, dsize, n));
306 return *begin_const_;
313 IMAGE_PROCESSING_SWITCH
314 (type_, get_data_parameters_, ptr_, &n, &dsize, &ptr);
315 end_.reset(
new Iterator(type_, ptr + n*dsize, dsize, n));
318 Iterator_const& end_const()
const
323 IMAGE_PROCESSING_SWITCH_CONST
324 (type_, get_data_parameters_, ptr_, &n, &dsize, &ptr);
325 end_const_.reset(
new Iterator_const(type_, ptr + n*dsize, dsize, n));
332 IMAGE_PROCESSING_SWITCH_CONST(type_, get_size_, ptr_, s);
335 size_t num_data_elm()
const
337 IMAGE_PROCESSING_SWITCH_CONST(type_,
return num_data_elm_, ptr_);
339 ISMRMRD::ImageHeader& head()
341 IMAGE_PROCESSING_SWITCH(type_,
return get_head_ref_, ptr_);
343 const ISMRMRD::ImageHeader& head()
const
345 IMAGE_PROCESSING_SWITCH_CONST(type_,
return get_head_ref_const_, ptr_);
347 std::string attributes()
const
350 IMAGE_PROCESSING_SWITCH_CONST(type_, get_attr_, ptr_, attr);
353 void set_attributes(
const std::string& attr)
355 IMAGE_PROCESSING_SWITCH(type_, set_attr_, ptr_, attr);
357 void show_attributes()
const
359 IMAGE_PROCESSING_SWITCH_CONST(type_, show_attr_, ptr_, 0);
361 void set_imtype(ISMRMRD::ISMRMRD_ImageTypes imtype)
363 IMAGE_PROCESSING_SWITCH(type_, set_imtype_, ptr_, imtype);
365 size_t get_dim(
int* dim)
const
367 IMAGE_PROCESSING_SWITCH_CONST(type_, get_dim_, ptr_, dim);
374 void get_data(
float* data)
const
378 ImageWrap::Iterator_const i = begin_const();
379 ImageWrap::Iterator_const stop = end_const();
380 for (; i != stop; ++data, ++i) {
385 void set_data(
const float* data)
388 for (ImageWrap::Iterator i = begin(); i != end(); ++i, ++data)
394 for (ImageWrap::Iterator i = begin(); i != end(); ++i)
399 for (ImageWrap::Iterator i = begin(); i != end(); ++i)
402 void get_complex_data(complex_float_t* data)
const
406 ImageWrap::Iterator_const i = begin_const();
407 ImageWrap::Iterator_const stop = end_const();
408 for (; i != stop; ++data, ++i) {
409 *data = (*i).complex_float();
414 void set_complex_data(
const complex_float_t* data)
418 ImageWrap::Iterator i = begin();
419 ImageWrap::Iterator stop = end();
420 for (; i != stop; ++i, ++data) {
426 gadgetron::shared_ptr<ImageWrap> abs()
const
431 gadgetron::shared_ptr<ImageWrap> real(
const std::string& way =
"real")
const
435 ISMRMRD::Image<float>* ptr_im =
new ISMRMRD::Image<float>(dim[0], dim[1], dim[2], dim[3]);
436 ISMRMRD::Image<float>& im = *ptr_im;
438 ISMRMRD::ImageHeader header = head();
439 header.data_type = ISMRMRD::ISMRMRD_FLOAT;
440 header.image_type = ISMRMRD::ISMRMRD_IMTYPE_MAGNITUDE;
441 header.image_series_index = 0;
444 im.setAttributeString(attributes());
446 ImageWrap::Iterator_const i = begin_const();
447 ImageWrap::Iterator_const stop = end_const();
448 float* data = im.getDataPtr();
450 for (; i != stop; ++data, ++i) {
451 *data = std::abs((*i).complex_float());
454 for (; i != stop; ++data, ++i) {
455 *data = std::real((*i).complex_float());
458 THROW(
"unknown conversion to real specified in ImageWrap::real");
460 ImageWrap* ptr_iw =
new ImageWrap(ISMRMRD::ISMRMRD_FLOAT, ptr_im);
461 return gadgetron::shared_ptr<ImageWrap>(ptr_iw);
467 ISMRMRD::ISMRMRD_DataTypes data_type;
468 IMAGE_PROCESSING_SWITCH_CONST(type_, get_data_type_, ptr_, &data_type);
474 ISMRMRD::ISMRMRD_DataTypes data_type = this->
get_data_type();
475 if (data_type == ISMRMRD::ISMRMRD_DataTypes::ISMRMRD_CXFLOAT ||
476 data_type == ISMRMRD::ISMRMRD_DataTypes::ISMRMRD_CXDOUBLE) {
482 void write(ISMRMRD::Dataset& dataset)
const
484 IMAGE_PROCESSING_SWITCH_CONST(type_, write_, ptr_, dataset);
486 void read(ISMRMRD::Dataset& dataset,
const char* var,
int ind)
488 IMAGE_PROCESSING_SWITCH(type_, read_, ptr_, dataset, var, ind, &ptr_);
494 void axpby(complex_float_t a,
const ImageWrap& x, complex_float_t b,
500 void xapyb(
const ImageWrap& x, complex_float_t a,
501 const ImageWrap& y, complex_float_t b)
503 IMAGE_PROCESSING_SWITCH(type_, xapyb_, x.ptr_image(), &a,
504 y.ptr_image(), &b, 0, 0);
506 void xapyb(
const ImageWrap& x, complex_float_t a,
507 const ImageWrap& y,
const ImageWrap& b)
509 IMAGE_PROCESSING_SWITCH(type_, xapyb_, x.ptr_image(), &a,
510 y.ptr_image(), b.ptr_image(), 0, 1);
512 void xapyb(
const ImageWrap& x,
const ImageWrap& a,
513 const ImageWrap& y, complex_float_t b)
515 IMAGE_PROCESSING_SWITCH(type_, xapyb_, x.ptr_image(), a.ptr_image(),
516 y.ptr_image(), &b, 1, 0);
518 void xapyb(
const ImageWrap& x,
const ImageWrap& a,
519 const ImageWrap& y,
const ImageWrap& b)
521 IMAGE_PROCESSING_SWITCH(type_, xapyb_, x.ptr_image(), a.ptr_image(),
522 y.ptr_image(), b.ptr_image(), 1, 1);
524 void binary_op(
const ImageWrap& x,
const ImageWrap& y, complex_float_t(*f)(complex_float_t, complex_float_t))
526 IMAGE_PROCESSING_SWITCH(type_, binary_op_, x.ptr_image(), y.ptr_image(), f);
528 void semibinary_op(
const ImageWrap& x, complex_float_t y, complex_float_t(*f)(complex_float_t, complex_float_t))
530 IMAGE_PROCESSING_SWITCH(type_, semibinary_op_, x.ptr_image(), y, f);
532 void unary_op(
const ImageWrap& x, complex_float_t(*f)(complex_float_t))
534 IMAGE_PROCESSING_SWITCH(type_, unary_op_, x.ptr_image(), f);
536 complex_float_t dot(
const ImageWrap& iw)
const
539 IMAGE_PROCESSING_SWITCH_CONST(type_, dot_, iw.ptr_image(), &z);
545 IMAGE_PROCESSING_SWITCH_CONST(type_, norm_, ptr_, &r);
548 complex_float_t sum()
const
551 IMAGE_PROCESSING_SWITCH_CONST(type_, sum_, ptr_, &s);
554 complex_float_t max()
const
557 IMAGE_PROCESSING_SWITCH_CONST(type_, max_, ptr_, &s);
560 float diff(ImageWrap& iw)
const
563 IMAGE_PROCESSING_SWITCH_CONST(type_, diff_, iw.ptr_image(), &s);
568 IMAGE_PROCESSING_SWITCH(type_, conjugate_, ptr_);
574 mutable gadgetron::shared_ptr<Iterator> begin_;
575 mutable gadgetron::shared_ptr<Iterator> end_;
576 mutable gadgetron::shared_ptr<Iterator_const> begin_const_;
577 mutable gadgetron::shared_ptr<Iterator_const> end_const_;
579 ImageWrap& operator=(
const ImageWrap& iw)
587 void get_data_parameters_
588 (
const ISMRMRD::Image<T>* ptr_im,
size_t *n,
unsigned int *dsize,
591 const ISMRMRD::Image<T>& im = *(
const ISMRMRD::Image<T>*)ptr_im;
593 dim[0] = im.getMatrixSizeX();
594 dim[1] = im.getMatrixSizeY();
595 dim[2] = im.getMatrixSizeZ();
596 dim[3] = im.getNumberOfChannels();
597 *data = (
char*)im.getDataPtr();
607 size_t num_data_elm_(
const ISMRMRD::Image<T>* ptr)
const
609 return ptr->getNumberOfDataElements();
613 void copy_(
const ISMRMRD::Image<T>* ptr_im)
615 type_ = ptr_im->getDataType();
616 ptr_ = (
void*)
new ISMRMRD::Image<T>(*ptr_im);
620 ISMRMRD::ImageHeader& get_head_ref_(ISMRMRD::Image<T>* ptr_im)
622 return ptr_im->getHead();
626 const ISMRMRD::ImageHeader& get_head_ref_const_(
const ISMRMRD::Image<T>* ptr_im)
const
628 return ptr_im->getHead();
632 void set_imtype_(ISMRMRD::Image<T>* ptr_im, ISMRMRD::ISMRMRD_ImageTypes type)
634 ptr_im->setImageType(type);
638 void get_size_(
const ISMRMRD::Image<T>* ptr_im,
size_t& size)
const
640 size = ptr_im->getDataSize();
644 void get_attr_(
const ISMRMRD::Image<T>* ptr_im, std::string& attr)
const
646 ptr_im->getAttributeString(attr);
650 void set_attr_(ISMRMRD::Image<T>* ptr_im,
const std::string& attr)
652 ptr_im->setAttributeString(attr);
656 void show_attr_(
const ISMRMRD::Image<T>* ptr_im,
int i)
const
658 const ISMRMRD::Image<T>& im = *ptr_im;
659 size_t meta_attrib_length = im.getAttributeStringLength();
660 std::cout <<
"meta_attrib_length: " << meta_attrib_length <<
'\n';
661 std::string meta_attrib(meta_attrib_length + 1, 0);
662 im.getAttributeString(meta_attrib);
665 if (meta_attrib_length > 0) {
666 ISMRMRD::MetaContainer mc;
667 ISMRMRD::deserialize(meta_attrib.c_str(), mc);
668 for (
auto it = mc.begin(); it != mc.end(); ++it) {
669 auto name = it->first.c_str();
670 std::cout << name <<
":\n";
671 size_t l = mc.length(name);
672 for (
int j = 0; j <l; j++)
673 std::cout << mc.as_str(name, j) <<
'\n';
675 std::stringstream meta_xml;
676 ISMRMRD::serialize(mc, meta_xml);
677 std::cout << meta_xml.str().c_str() <<
'\n';
683 (
const ISMRMRD::Image<T>* ptr_im, ISMRMRD::Dataset& dataset)
const
686 const ISMRMRD::Image<T>& im = *ptr_im;
687 std::stringstream ss;
688 ss <<
"image_" << im.getHead().image_series_index;
689 std::string image_varname = ss.str();
693 dataset.appendImage(image_varname, im);
700 (
const ISMRMRD::Image<T>* ptr,
701 ISMRMRD::Dataset& dataset,
const char* var,
int index,
704 ISMRMRD::Image < T >* ptr_im =
new ISMRMRD::Image < T > ;
705 *ptr_ptr = (
void*)ptr_im;
706 ISMRMRD::Image<T>& im = *ptr_im;
707 dataset.readImage(var, index, im);
712 void get_dim_(
const ISMRMRD::Image<T>* ptr_im,
int* dim)
const
714 const ISMRMRD::Image<T>& im = *(
const ISMRMRD::Image<T>*)ptr_im;
715 dim[0] = im.getMatrixSizeX();
716 dim[1] = im.getMatrixSizeY();
717 dim[2] = im.getMatrixSizeZ();
718 dim[3] = im.getNumberOfChannels();
721 void get_data_type_(
const ISMRMRD::Image<T>* ptr_im, ISMRMRD::ISMRMRD_DataTypes* data_type_ptr)
const
723 const ISMRMRD::Image<T>& im = *
static_cast<const ISMRMRD::Image<T>*
>(ptr_im);
724 *data_type_ptr = im.getDataType();
728 void get_data_(
const ISMRMRD::Image<T>* ptr_im,
float* data)
const
730 const ISMRMRD::Image<T>& im = *ptr_im;
731 const T* ptr = im.getDataPtr();
732 size_t n = im.getNumberOfDataElements();
733 for (
size_t i = 0; i < n; i++)
734 data[i] = std::real(ptr[i]);
738 void set_data_(ISMRMRD::Image<T>* ptr_im,
const float* data)
740 ISMRMRD::Image<T>& im = *ptr_im;
741 T* ptr = im.getDataPtr();
742 size_t n = im.getNumberOfDataElements();
743 for (
size_t i = 0; i < n; i++)
748 void get_complex_data_
749 (
const ISMRMRD::Image<T>* ptr_im, complex_float_t* data)
const
751 const ISMRMRD::Image<T>& im = *ptr_im;
752 const T* ptr = im.getDataPtr();
753 size_t n = im.getNumberOfDataElements();
754 for (
size_t i = 0; i < n; i++)
755 data[i] = complex_float_t(ptr[i]);
759 void set_complex_data_
760 (ISMRMRD::Image<T>* ptr_im,
const complex_float_t* data)
762 ISMRMRD::Image<T>& im = *ptr_im;
763 ISMRMRD::ISMRMRD_DataTypes type = im.getDataType();
764 T* ptr = im.getDataPtr();
765 size_t n = im.getNumberOfDataElements();
766 if (type == ISMRMRD::ISMRMRD_CXFLOAT || type == ISMRMRD::ISMRMRD_CXDOUBLE)
767 for (
size_t i = 0; i < n; i++)
768 xGadgetronUtilities::convert_complex(data[i], ptr[i]);
770 for (
size_t i = 0; i < n; i++)
771 xGadgetronUtilities::convert_complex(data[i], ptr[i]);
776 (
const ISMRMRD::Image<T>* ptr_x, complex_float_t a,
777 const void* vptr_y, complex_float_t b)
779 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)vptr_y;
780 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
781 size_t n = ptr->getNumberOfDataElements();
782 size_t nx = ptr_x->getNumberOfDataElements();
783 size_t ny = ptr_y->getNumberOfDataElements();
784 if (!(n == nx && n == ny))
785 THROW(
"sizes mismatch in ImageWrap multiply");
786 const T* i = ptr_x->getDataPtr();
787 const T* j = ptr_y->getDataPtr();
788 T* k = ptr->getDataPtr();
789 if (b == complex_float_t(0.0))
790 for (
size_t ii = 0; ii < n; i++, k++, ii++) {
791 complex_float_t u = (complex_float_t)*i;
792 xGadgetronUtilities::convert_complex(a*u, *k);
795 for (
size_t ii = 0; ii < n; i++, j++, k++, ii++) {
796 complex_float_t u = (complex_float_t)*i;
797 complex_float_t v = (complex_float_t)*j;
798 complex_float_t w = a*u + b*v;
799 xGadgetronUtilities::convert_complex(w, *k);
805 (
const ISMRMRD::Image<T>* ptr_x,
const void* vptr_a,
806 const void* vptr_y,
const void* vptr_b,
int a_type,
int b_type)
808 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)vptr_y;
809 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
810 size_t n = ptr->getNumberOfDataElements();
811 size_t nx = ptr_x->getNumberOfDataElements();
813 THROW(
"sizes mismatch in ImageWrap::xapyb: nx != n");
814 size_t ny = ptr_y->getNumberOfDataElements();
816 THROW(
"sizes mismatch in ImageWrap::xapyb: ny != n");
817 const T* ix = ptr_x->getDataPtr();
818 const T* iy = ptr_y->getDataPtr();
819 T* i = ptr->getDataPtr();
830 ISMRMRD::Image<T>* ptr_a = (ISMRMRD::Image<T>*)vptr_a;
831 na = ptr_a->getNumberOfDataElements();
833 THROW(
"sizes mismatch in ImageWrap xapyb: na != n");
834 ia = ptr_a->getDataPtr();
843 ISMRMRD::Image<T>* ptr_b = (ISMRMRD::Image<T>*)vptr_b;
844 nb = ptr_b->getNumberOfDataElements();
848 THROW(
"sizes mismatch in ImageWrap xapyb: nb != n");
849 ib = ptr_b->getDataPtr();
852 for (
size_t ii = 0; ii < n; ix++, ia += ja, iy++, ib += jb, i++, ii++) {
853 complex_float_t vx = (complex_float_t)*ix;
854 complex_float_t va = (complex_float_t)*ia;
855 complex_float_t vy = (complex_float_t)*iy;
856 complex_float_t vb = (complex_float_t)*ib;
857 complex_float_t v = vx * va + vy * vb;
858 xGadgetronUtilities::convert_complex(v, *i);
863 void binary_op_(
const ISMRMRD::Image<T>* ptr_x,
const void* vptr_y,
864 complex_float_t(*f)(complex_float_t, complex_float_t))
866 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
867 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)vptr_y;
868 size_t nx = ptr_x->getNumberOfDataElements();
869 size_t ny = ptr_y->getNumberOfDataElements();
870 size_t n = ptr->getNumberOfDataElements();
871 if (!(n == nx && n == ny))
872 THROW(
"sizes mismatch in ImageWrap binary_op_");
873 const T* i = ptr_x->getDataPtr();
874 const T* j = ptr_y->getDataPtr();
875 T* k = ptr->getDataPtr();
877 for (; ii < n; i++, j++, k++, ii++) {
878 complex_float_t u = (complex_float_t)*i;
879 complex_float_t v = (complex_float_t)*j;
880 xGadgetronUtilities::convert_complex(f(u, v), *k);
885 void semibinary_op_(
const ISMRMRD::Image<T>* ptr_x, complex_float_t y,
886 complex_float_t(*f)(complex_float_t, complex_float_t))
888 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
889 size_t nx = ptr_x->getNumberOfDataElements();
890 size_t n = ptr->getNumberOfDataElements();
892 THROW(
"sizes mismatch in ImageWrap semibinary_op_");
893 const T* i = ptr_x->getDataPtr();
894 T* k = ptr->getDataPtr();
896 for (; ii < n; i++, k++, ii++) {
897 complex_float_t x = (complex_float_t)*i;
898 xGadgetronUtilities::convert_complex(f(x, y), *k);
903 void unary_op_(
const ISMRMRD::Image<T>* ptr_x,
904 complex_float_t(*f)(complex_float_t))
906 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
907 size_t nx = ptr_x->getNumberOfDataElements();
908 size_t n = ptr->getNumberOfDataElements();
910 THROW(
"sizes mismatch in ImageWrap semibinary_op_");
911 const T* i = ptr_x->getDataPtr();
912 T* k = ptr->getDataPtr();
914 for (; ii < n; i++, k++, ii++) {
915 complex_float_t x = (complex_float_t)*i;
916 xGadgetronUtilities::convert_complex(f(x), *k);
921 void dot_(
const ISMRMRD::Image<T>* ptr_im, complex_float_t *z)
const
923 const ISMRMRD::Image<T>* ptr = (
const ISMRMRD::Image<T>*)ptr_;
928 size_t n = ptr_im->getNumberOfDataElements();
929 for (i = ptr->getDataPtr(), j = ptr_im->getDataPtr(); ii < n;
931 complex_float_t u = (complex_float_t)*i;
932 complex_float_t v = (complex_float_t)*j;
933 *z += std::conj(v) * u;
938 void norm_(
const ISMRMRD::Image<T>* ptr,
float *r)
const
943 size_t n = ptr->getNumberOfDataElements();
944 for (i = ptr->getDataPtr(); ii < n; i++, ii++) {
945 complex_float_t a = (complex_float_t)*i;
946 *r += std::abs(std::conj(a) * a);
952 void sum_(
const ISMRMRD::Image<T>* ptr, complex_float_t* s)
const
957 size_t n = ptr->getNumberOfDataElements();
958 for (i = ptr->getDataPtr(); ii < n; i++, ii++)
959 *s += (complex_float_t)*i;
963 void max_(
const ISMRMRD::Image<T>* ptr, complex_float_t* s)
const
968 size_t n = ptr->getNumberOfDataElements();
969 for (i = ptr->getDataPtr(); ii < n; i++, ii++) {
970 complex_float_t si = (complex_float_t)*i;
971 float r = std::real(*s);
972 float ri = std::real(si);
979 void diff_(
const ISMRMRD::Image<T>* ptr_im,
float *s)
const
981 const ISMRMRD::Image<T>* ptr = (
const ISMRMRD::Image<T>*)ptr_;
986 size_t n = ptr_im->getNumberOfDataElements();
987 for (i = ptr->getDataPtr(), j = ptr_im->getDataPtr(); ii < n;
989 complex_float_t a = (complex_float_t)*i;
990 complex_float_t b = (complex_float_t)*j;
991 *s += (float)std::abs(b - a);
996 void conjugate_(ISMRMRD::Image<T>* ptr)
1000 size_t n = ptr->getNumberOfDataElements();
1001 for (i = ptr->getDataPtr(); ii < n; i++, ii++) {
1002 complex_float_t a = (complex_float_t)*i;
1003 xGadgetronUtilities::convert_complex(std::conj(a), *i);
1011 #pragma warning( pop )
Definition: gadgetron_image_wrap.h:179
Definition: gadgetron_image_wrap.h:108
Wrapper for ISMRMRD::Image.
Definition: gadgetron_image_wrap.h:106
bool is_complex() const
Is the image wrap complex?
Definition: gadgetron_image_wrap.h:472
ISMRMRD::ISMRMRD_DataTypes get_data_type() const
Get data type.
Definition: gadgetron_image_wrap.h:465
Definition: ANumRef.h:140
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
Various utilities used by SIRF Gadgetron extensions.