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 complex_float_t min()
const
563 IMAGE_PROCESSING_SWITCH_CONST(type_, min_, ptr_, &s);
566 float diff(ImageWrap& iw)
const
569 IMAGE_PROCESSING_SWITCH_CONST(type_, diff_, iw.ptr_image(), &s);
574 IMAGE_PROCESSING_SWITCH(type_, conjugate_, ptr_);
580 mutable gadgetron::shared_ptr<Iterator> begin_;
581 mutable gadgetron::shared_ptr<Iterator> end_;
582 mutable gadgetron::shared_ptr<Iterator_const> begin_const_;
583 mutable gadgetron::shared_ptr<Iterator_const> end_const_;
585 ImageWrap& operator=(
const ImageWrap& iw)
593 void get_data_parameters_
594 (
const ISMRMRD::Image<T>* ptr_im,
size_t *n,
unsigned int *dsize,
597 const ISMRMRD::Image<T>& im = *(
const ISMRMRD::Image<T>*)ptr_im;
599 dim[0] = im.getMatrixSizeX();
600 dim[1] = im.getMatrixSizeY();
601 dim[2] = im.getMatrixSizeZ();
602 dim[3] = im.getNumberOfChannels();
603 *data = (
char*)im.getDataPtr();
613 size_t num_data_elm_(
const ISMRMRD::Image<T>* ptr)
const
615 return ptr->getNumberOfDataElements();
619 void copy_(
const ISMRMRD::Image<T>* ptr_im)
621 type_ = ptr_im->getDataType();
622 ptr_ = (
void*)
new ISMRMRD::Image<T>(*ptr_im);
626 ISMRMRD::ImageHeader& get_head_ref_(ISMRMRD::Image<T>* ptr_im)
628 return ptr_im->getHead();
632 const ISMRMRD::ImageHeader& get_head_ref_const_(
const ISMRMRD::Image<T>* ptr_im)
const
634 return ptr_im->getHead();
638 void set_imtype_(ISMRMRD::Image<T>* ptr_im, ISMRMRD::ISMRMRD_ImageTypes type)
640 ptr_im->setImageType(type);
644 void get_size_(
const ISMRMRD::Image<T>* ptr_im,
size_t& size)
const
646 size = ptr_im->getDataSize();
650 void get_attr_(
const ISMRMRD::Image<T>* ptr_im, std::string& attr)
const
652 ptr_im->getAttributeString(attr);
656 void set_attr_(ISMRMRD::Image<T>* ptr_im,
const std::string& attr)
658 ptr_im->setAttributeString(attr);
662 void show_attr_(
const ISMRMRD::Image<T>* ptr_im,
int i)
const
664 const ISMRMRD::Image<T>& im = *ptr_im;
665 size_t meta_attrib_length = im.getAttributeStringLength();
666 std::cout <<
"meta_attrib_length: " << meta_attrib_length <<
'\n';
667 std::string meta_attrib(meta_attrib_length + 1, 0);
668 im.getAttributeString(meta_attrib);
671 if (meta_attrib_length > 0) {
672 ISMRMRD::MetaContainer mc;
673 ISMRMRD::deserialize(meta_attrib.c_str(), mc);
674 for (
auto it = mc.begin(); it != mc.end(); ++it) {
675 auto name = it->first.c_str();
676 std::cout << name <<
":\n";
677 size_t l = mc.length(name);
678 for (
int j = 0; j <l; j++)
679 std::cout << mc.as_str(name, j) <<
'\n';
681 std::stringstream meta_xml;
682 ISMRMRD::serialize(mc, meta_xml);
683 std::cout << meta_xml.str().c_str() <<
'\n';
689 (
const ISMRMRD::Image<T>* ptr_im, ISMRMRD::Dataset& dataset)
const
692 const ISMRMRD::Image<T>& im = *ptr_im;
693 std::stringstream ss;
694 ss <<
"image_" << im.getHead().image_series_index;
695 std::string image_varname = ss.str();
699 dataset.appendImage(image_varname, im);
706 (
const ISMRMRD::Image<T>* ptr,
707 ISMRMRD::Dataset& dataset,
const char* var,
int index,
710 ISMRMRD::Image < T >* ptr_im =
new ISMRMRD::Image < T > ;
711 *ptr_ptr = (
void*)ptr_im;
712 ISMRMRD::Image<T>& im = *ptr_im;
713 dataset.readImage(var, index, im);
718 void get_dim_(
const ISMRMRD::Image<T>* ptr_im,
int* dim)
const
720 const ISMRMRD::Image<T>& im = *(
const ISMRMRD::Image<T>*)ptr_im;
721 dim[0] = im.getMatrixSizeX();
722 dim[1] = im.getMatrixSizeY();
723 dim[2] = im.getMatrixSizeZ();
724 dim[3] = im.getNumberOfChannels();
727 void get_data_type_(
const ISMRMRD::Image<T>* ptr_im, ISMRMRD::ISMRMRD_DataTypes* data_type_ptr)
const
729 const ISMRMRD::Image<T>& im = *
static_cast<const ISMRMRD::Image<T>*
>(ptr_im);
730 *data_type_ptr = im.getDataType();
734 void get_data_(
const ISMRMRD::Image<T>* ptr_im,
float* data)
const
736 const ISMRMRD::Image<T>& im = *ptr_im;
737 const T* ptr = im.getDataPtr();
738 size_t n = im.getNumberOfDataElements();
739 for (
size_t i = 0; i < n; i++)
740 data[i] = std::real(ptr[i]);
744 void set_data_(ISMRMRD::Image<T>* ptr_im,
const float* data)
746 ISMRMRD::Image<T>& im = *ptr_im;
747 T* ptr = im.getDataPtr();
748 size_t n = im.getNumberOfDataElements();
749 for (
size_t i = 0; i < n; i++)
754 void get_complex_data_
755 (
const ISMRMRD::Image<T>* ptr_im, complex_float_t* data)
const
757 const ISMRMRD::Image<T>& im = *ptr_im;
758 const T* ptr = im.getDataPtr();
759 size_t n = im.getNumberOfDataElements();
760 for (
size_t i = 0; i < n; i++)
761 data[i] = complex_float_t(ptr[i]);
765 void set_complex_data_
766 (ISMRMRD::Image<T>* ptr_im,
const complex_float_t* data)
768 ISMRMRD::Image<T>& im = *ptr_im;
769 ISMRMRD::ISMRMRD_DataTypes type = im.getDataType();
770 T* ptr = im.getDataPtr();
771 size_t n = im.getNumberOfDataElements();
772 if (type == ISMRMRD::ISMRMRD_CXFLOAT || type == ISMRMRD::ISMRMRD_CXDOUBLE)
773 for (
size_t i = 0; i < n; i++)
774 xGadgetronUtilities::convert_complex(data[i], ptr[i]);
776 for (
size_t i = 0; i < n; i++)
777 xGadgetronUtilities::convert_complex(data[i], ptr[i]);
782 (
const ISMRMRD::Image<T>* ptr_x, complex_float_t a,
783 const void* vptr_y, complex_float_t b)
785 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)vptr_y;
786 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
787 size_t n = ptr->getNumberOfDataElements();
788 size_t nx = ptr_x->getNumberOfDataElements();
789 size_t ny = ptr_y->getNumberOfDataElements();
790 if (!(n == nx && n == ny))
791 THROW(
"sizes mismatch in ImageWrap multiply");
792 const T* i = ptr_x->getDataPtr();
793 const T* j = ptr_y->getDataPtr();
794 T* k = ptr->getDataPtr();
795 if (b == complex_float_t(0.0))
796 for (
size_t ii = 0; ii < n; i++, k++, ii++) {
797 complex_float_t u = (complex_float_t)*i;
798 xGadgetronUtilities::convert_complex(a*u, *k);
801 for (
size_t ii = 0; ii < n; i++, j++, k++, ii++) {
802 complex_float_t u = (complex_float_t)*i;
803 complex_float_t v = (complex_float_t)*j;
804 complex_float_t w = a*u + b*v;
805 xGadgetronUtilities::convert_complex(w, *k);
811 (
const ISMRMRD::Image<T>* ptr_x,
const void* vptr_a,
812 const void* vptr_y,
const void* vptr_b,
int a_type,
int b_type)
814 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)vptr_y;
815 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
816 size_t n = ptr->getNumberOfDataElements();
817 size_t nx = ptr_x->getNumberOfDataElements();
819 THROW(
"sizes mismatch in ImageWrap::xapyb: nx != n");
820 size_t ny = ptr_y->getNumberOfDataElements();
822 THROW(
"sizes mismatch in ImageWrap::xapyb: ny != n");
823 const T* ix = ptr_x->getDataPtr();
824 const T* iy = ptr_y->getDataPtr();
825 T* i = ptr->getDataPtr();
836 ISMRMRD::Image<T>* ptr_a = (ISMRMRD::Image<T>*)vptr_a;
837 na = ptr_a->getNumberOfDataElements();
839 THROW(
"sizes mismatch in ImageWrap xapyb: na != n");
840 ia = ptr_a->getDataPtr();
849 ISMRMRD::Image<T>* ptr_b = (ISMRMRD::Image<T>*)vptr_b;
850 nb = ptr_b->getNumberOfDataElements();
854 THROW(
"sizes mismatch in ImageWrap xapyb: nb != n");
855 ib = ptr_b->getDataPtr();
858 for (
size_t ii = 0; ii < n; ix++, ia += ja, iy++, ib += jb, i++, ii++) {
859 complex_float_t vx = (complex_float_t)*ix;
860 complex_float_t va = (complex_float_t)*ia;
861 complex_float_t vy = (complex_float_t)*iy;
862 complex_float_t vb = (complex_float_t)*ib;
863 complex_float_t v = vx * va + vy * vb;
864 xGadgetronUtilities::convert_complex(v, *i);
869 void binary_op_(
const ISMRMRD::Image<T>* ptr_x,
const void* vptr_y,
870 complex_float_t(*f)(complex_float_t, complex_float_t))
872 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
873 ISMRMRD::Image<T>* ptr_y = (ISMRMRD::Image<T>*)vptr_y;
874 size_t nx = ptr_x->getNumberOfDataElements();
875 size_t ny = ptr_y->getNumberOfDataElements();
876 size_t n = ptr->getNumberOfDataElements();
877 if (!(n == nx && n == ny))
878 THROW(
"sizes mismatch in ImageWrap binary_op_");
879 const T* i = ptr_x->getDataPtr();
880 const T* j = ptr_y->getDataPtr();
881 T* k = ptr->getDataPtr();
883 for (; ii < n; i++, j++, k++, ii++) {
884 complex_float_t u = (complex_float_t)*i;
885 complex_float_t v = (complex_float_t)*j;
886 xGadgetronUtilities::convert_complex(f(u, v), *k);
891 void semibinary_op_(
const ISMRMRD::Image<T>* ptr_x, complex_float_t y,
892 complex_float_t(*f)(complex_float_t, complex_float_t))
894 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
895 size_t nx = ptr_x->getNumberOfDataElements();
896 size_t n = ptr->getNumberOfDataElements();
898 THROW(
"sizes mismatch in ImageWrap semibinary_op_");
899 const T* i = ptr_x->getDataPtr();
900 T* k = ptr->getDataPtr();
902 for (; ii < n; i++, k++, ii++) {
903 complex_float_t x = (complex_float_t)*i;
904 xGadgetronUtilities::convert_complex(f(x, y), *k);
909 void unary_op_(
const ISMRMRD::Image<T>* ptr_x,
910 complex_float_t(*f)(complex_float_t))
912 ISMRMRD::Image<T>* ptr = (ISMRMRD::Image<T>*)ptr_;
913 size_t nx = ptr_x->getNumberOfDataElements();
914 size_t n = ptr->getNumberOfDataElements();
916 THROW(
"sizes mismatch in ImageWrap semibinary_op_");
917 const T* i = ptr_x->getDataPtr();
918 T* k = ptr->getDataPtr();
920 for (; ii < n; i++, k++, ii++) {
921 complex_float_t x = (complex_float_t)*i;
922 xGadgetronUtilities::convert_complex(f(x), *k);
927 void dot_(
const ISMRMRD::Image<T>* ptr_im, complex_float_t *z)
const
929 const ISMRMRD::Image<T>* ptr = (
const ISMRMRD::Image<T>*)ptr_;
934 size_t n = ptr_im->getNumberOfDataElements();
935 for (i = ptr->getDataPtr(), j = ptr_im->getDataPtr(); ii < n;
937 complex_float_t u = (complex_float_t)*i;
938 complex_float_t v = (complex_float_t)*j;
939 *z += std::conj(v) * u;
944 void norm_(
const ISMRMRD::Image<T>* ptr,
float *r)
const
949 size_t n = ptr->getNumberOfDataElements();
950 for (i = ptr->getDataPtr(); ii < n; i++, ii++) {
951 complex_float_t a = (complex_float_t)*i;
952 *r += std::abs(std::conj(a) * a);
958 void sum_(
const ISMRMRD::Image<T>* ptr, complex_float_t* s)
const
963 size_t n = ptr->getNumberOfDataElements();
964 for (i = ptr->getDataPtr(); ii < n; i++, ii++)
965 *s += (complex_float_t)*i;
969 void max_(
const ISMRMRD::Image<T>* ptr, complex_float_t* s)
const
974 size_t n = ptr->getNumberOfDataElements();
975 for (i = ptr->getDataPtr(); ii < n; i++, ii++) {
976 complex_float_t si = (complex_float_t)*i;
977 float r = std::real(*s);
978 float ri = std::real(si);
979 if (ii == 0 || ri > r)
985 void min_(
const ISMRMRD::Image<T>* ptr, complex_float_t* s)
const
990 size_t n = ptr->getNumberOfDataElements();
991 for (i = ptr->getDataPtr(); ii < n; i++, ii++) {
992 complex_float_t si = (complex_float_t)*i;
993 float r = std::real(*s);
994 float ri = std::real(si);
995 if (ii == 0 || ri < r)
1000 template<
typename T>
1001 void diff_(
const ISMRMRD::Image<T>* ptr_im,
float *s)
const
1003 const ISMRMRD::Image<T>* ptr = (
const ISMRMRD::Image<T>*)ptr_;
1008 size_t n = ptr_im->getNumberOfDataElements();
1009 for (i = ptr->getDataPtr(), j = ptr_im->getDataPtr(); ii < n;
1011 complex_float_t a = (complex_float_t)*i;
1012 complex_float_t b = (complex_float_t)*j;
1013 *s += (float)std::abs(b - a);
1017 template<
typename T>
1018 void conjugate_(ISMRMRD::Image<T>* ptr)
1022 size_t n = ptr->getNumberOfDataElements();
1023 for (i = ptr->getDataPtr(); ii < n; i++, ii++) {
1024 complex_float_t a = (complex_float_t)*i;
1025 xGadgetronUtilities::convert_complex(std::conj(a), *i);
1033 #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 base class for SIRF image data.
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.