RNifti
Fast R and C++ Access to NIfTI Images
|
1 #ifndef _NIFTI_IMAGE_H_
2 #define _NIFTI_IMAGE_H_
12 #define MAYBE_SHARED(x) (NAMED(x) > 1)
17 #define R_NegInf -INFINITY
45 typedef std::complex<float> complex64_t;
46 typedef std::complex<double> complex128_t;
58 unsigned char bytes[4];
84 virtual size_t size ()
const {
return 0; }
85 virtual bool hasNaN ()
const {
return false; }
86 virtual complex128_t getComplex (
void *ptr)
const {
return complex128_t(0.0, 0.0); }
87 virtual double getDouble (
void *ptr)
const {
return 0.0; }
88 virtual int getInt (
void *ptr)
const {
return 0; }
90 virtual void setComplex (
void *ptr,
const complex128_t value)
const {}
91 virtual void setDouble (
void *ptr,
const double value)
const {}
92 virtual void setInt (
void *ptr,
const int value)
const {}
93 virtual void setRgb (
void *ptr,
const rgba32_t value)
const {}
94 virtual void minmax (
void *ptr,
const size_t length,
double *min,
double *max)
const { *min = 0.0; *max = 0.0; }
100 template <
typename Type,
bool alpha = false>
103 size_t size ()
const {
return (
sizeof(Type)); }
104 bool hasNaN ()
const {
return std::numeric_limits<Type>::has_quiet_NaN; }
105 complex128_t getComplex (
void *ptr)
const {
return complex128_t(
static_cast<double>(*
static_cast<Type*
>(ptr)), 0.0); }
106 double getDouble (
void *ptr)
const {
return static_cast<double>(*
static_cast<Type*
>(ptr)); }
107 int getInt (
void *ptr)
const {
return static_cast<int>(*
static_cast<Type*
>(ptr)); }
108 void setComplex (
void *ptr,
const complex128_t value)
const
110 *(
static_cast<Type*
>(ptr)) = Type(value.real());
111 *(
static_cast<Type*
>(ptr) + 1) = Type(0);
113 void setDouble (
void *ptr,
const double value)
const { *(
static_cast<Type*
>(ptr)) = Type(value); }
114 void setInt (
void *ptr,
const int value)
const { *(
static_cast<Type*
>(ptr)) = Type(value); }
115 void minmax (
void *ptr,
const size_t length,
double *min,
double *max)
const;
118 template <
typename ElementType>
121 size_t size ()
const {
return (
sizeof(ElementType) * 2); }
122 bool hasNaN ()
const {
return std::numeric_limits<ElementType>::has_quiet_NaN; }
123 std::complex<ElementType> getNative (
void *ptr)
const
125 const ElementType real = *
static_cast<ElementType*
>(ptr);
126 const ElementType imag = *(
static_cast<ElementType*
>(ptr) + 1);
127 return std::complex<ElementType>(real, imag);
129 void setNative (
void *ptr,
const std::complex<ElementType> native)
const
131 *(
static_cast<ElementType*
>(ptr)) = native.real();
132 *(
static_cast<ElementType*
>(ptr) + 1) = native.imag();
134 complex128_t getComplex (
void *ptr)
const {
return complex128_t(getNative(ptr)); }
135 double getDouble (
void *ptr)
const {
return static_cast<double>(getNative(ptr).real()); }
136 int getInt (
void *ptr)
const {
return static_cast<int>(getNative(ptr).real()); }
137 void setComplex (
void *ptr,
const complex128_t value)
const { setNative(ptr, std::complex<ElementType>(value)); }
138 void setDouble (
void *ptr,
const double value)
const { setNative(ptr, std::complex<ElementType>(value, 0.0)); }
139 void setInt (
void *ptr,
const int value)
const { setNative(ptr, std::complex<ElementType>(
static_cast<ElementType
>(value), 0.0)); }
140 void minmax (
void *ptr,
const size_t length,
double *min,
double *max)
const;
143 template <
bool alpha>
146 size_t size ()
const {
return alpha ? 4 : 3; }
147 int getInt (
void *ptr)
const {
return getRgb(ptr).value.packed; }
151 unsigned char *source =
static_cast<unsigned char *
>(ptr);
152 std::copy(source, source + (alpha ? 4 : 3), value.value.bytes);
155 void setInt (
void *ptr,
const int value)
const
158 native.value.packed = value;
161 void setRgb (
void *ptr,
const rgba32_t value)
const
163 unsigned char *target =
static_cast<unsigned char *
>(ptr);
164 std::copy(value.value.bytes, value.value.bytes + (alpha ? 4 : 3), target);
166 void minmax (
void *ptr,
const size_t length,
double *min,
double *max)
const { *min = 0.0; *max = 255.0; }
197 throw std::runtime_error(
"Unsupported data type (" + std::string(nifti_datatype_string(
_datatype)) +
")");
228 else if (alloc && data == NULL)
250 double dataMin, dataMax, typeMin, typeMax;
251 data.
minmax(&dataMin, &dataMax);
252 handler->minmax(NULL, 0, &typeMin, &typeMax);
255 if (dataMin < typeMin || dataMax > typeMax)
257 slope = (dataMax - dataMin) / (typeMax - typeMin);
283 this->ptr = (ptr == NULL ? parent.
dataPtr : ptr);
293 template <
typename SourceType>
306 template <
typename TargetType>
307 operator TargetType()
const
311 else if (std::numeric_limits<TargetType>::is_integer)
312 return TargetType(parent.
handler->getInt(ptr));
314 return TargetType(parent.
handler->getDouble(ptr));
317 template <
typename ElementType>
318 operator std::complex<ElementType>()
const
323 return std::complex<ElementType>(parent.
handler->getComplex(ptr));
330 operator Rcomplex()
const
332 const complex128_t value = parent.
handler->getComplex(ptr);
333 Rcomplex rValue = { value.real(), value.imag() };
345 return parent.
handler->getRgb(ptr);
352 class Iterator :
public std::iterator<std::random_access_iterator_tag, Element>
370 this->ptr = (ptr == NULL ? parent.
dataPtr : ptr);
371 this->step = (step == 0 ? parent.
handler->size() : step);
379 : parent(other.parent), ptr(other.ptr), step(other.step) {}
381 Iterator & operator++ () { ptr =
static_cast<char*
>(ptr) + step;
return *
this; }
382 Iterator operator++ (
int) {
Iterator copy(*
this); ptr =
static_cast<char*
>(ptr) + step;
return copy; }
383 Iterator operator+ (ptrdiff_t n)
const
385 void *newptr =
static_cast<char*
>(ptr) + (n * step);
386 return Iterator(parent, newptr, step);
388 Iterator & operator-- () { ptr =
static_cast<char*
>(ptr) - step;
return *
this; }
389 Iterator operator-- (
int) {
Iterator copy(*
this); ptr =
static_cast<char*
>(ptr) - step;
return copy; }
390 Iterator operator- (ptrdiff_t n)
const
392 void *newptr =
static_cast<char*
>(ptr) - (n * step);
393 return Iterator(parent, newptr, step);
396 ptrdiff_t operator- (
const Iterator &other)
const
398 const ptrdiff_t difference =
static_cast<char*
>(ptr) -
static_cast<char*
>(other.ptr);
399 return difference / step;
402 bool operator== (
const Iterator &other)
const {
return (ptr==other.ptr && step==other.step); }
403 bool operator!= (
const Iterator &other)
const {
return (ptr!=other.ptr || step!=other.step); }
404 bool operator> (
const Iterator &other)
const {
return (ptr > other.ptr); }
405 bool operator< (
const Iterator &other)
const {
return (ptr < other.ptr); }
407 const Element operator* ()
const {
return Element(parent, ptr); }
408 Element operator* () {
return Element(parent, ptr); }
409 const Element operator[] (
const size_t i)
const {
return Element(parent,
static_cast<char*
>(ptr) + (i * step)); }
410 Element operator[] (
const size_t i) {
return Element(parent,
static_cast<char*
>(ptr) + (i * step)); }
440 init(NULL, 0, DT_NONE, 0.0, 0.0,
false);
442 init(image->data, image->nvox, image->datatype,
static_cast<double>(image->scl_slope),
static_cast<double>(image->scl_inter),
false);
461 std::copy(source.
begin(), source.
end(), this->begin());
471 template <
class InputIterator>
474 const size_t length =
static_cast<size_t>(std::distance(from, to));
476 std::copy(from, to, this->
begin());
601 void minmax (
double *min,
double *max)
const
617 inline bool NiftiImageData::ConcreteTypeHandler<int>::hasNaN ()
const {
return true; }
625 template <
typename ElementType,
int Length>
629 ElementType elements[Length];
637 std::fill(elements, elements + Length, value);
645 std::copy(source, source + Length, this->elements);
654 for (
int i=0; i<Length; i++)
655 result.elements[i] = -elements[i];
659 const ElementType & operator[] (
const size_t i)
const {
return elements[i]; }
661 ElementType & operator[] (
const size_t i) {
return elements[i]; }
671 template <
class NiftiType,
typename ElementType,
int Order>
711 std::copy(source, source + Order*Order, this->elements);
719 const ElementType *castSource = (
const ElementType *) *source.m;
720 std::copy(castSource, castSource + Order*Order, this->elements);
729 Rcpp::NumericMatrix matrix(source);
730 if (matrix.cols() != Order && matrix.rows() != Order)
731 throw std::runtime_error(
"Matrix does not have the expected dimensions");
732 for (
int i=0; i<Order; i++)
734 for (
int j=0; j<Order; j++)
735 elements[j + i*Order] = matrix(i,j);
744 operator const NiftiType ()
const {
return niftiCopy(); }
767 const ElementType *
end ()
const {
return elements + Order*Order; }
780 for (
int i=0; i<Order; i++)
810 operator SEXP ()
const
812 Rcpp::NumericMatrix result(Order, Order);
813 for (
int i=0; i<Order; i++)
815 for (
int j=0; j<Order; j++)
816 result(i,j) =
elements[j + i*Order];
825 #include "RNifti/NiftiImage_matrix.h"
837 #if RNIFTI_NIFTILIB_VERSION == 1
839 typedef float pixdim_t;
840 typedef float scale_t;
841 #elif RNIFTI_NIFTILIB_VERSION == 2
842 typedef int64_t dim_t;
843 typedef double pixdim_t;
844 typedef double scale_t;
868 throw std::runtime_error(
"Blocks must be along the last dimension in the image");
881 if (source->datatype !=
image->datatype)
882 throw std::runtime_error(
"New data does not have the same datatype as the target block");
883 if (source->scl_slope !=
image->scl_slope || source->scl_inter !=
image->scl_inter)
884 throw std::runtime_error(
"New data does not have the same scale parameters as the target block");
886 size_t blockSize = 1;
890 if (blockSize != source->nvox)
891 throw std::runtime_error(
"New data does not have the same size as the target block");
893 blockSize *=
image->nbyper;
908 size_t blockSize = 1;
922 template <
typename TargetType>
923 std::vector<TargetType>
getData (
const bool useSlope =
true)
const;
939 void copy (
const nifti1_extension *source);
947 template <
typename SourceType>
966 if (!
copy || extension == NULL)
967 this->ext = extension;
969 this->
copy(extension);
987 template <
typename SourceType>
1003 const Rcpp::RObject object(source);
1004 if (
code == -1 &&
object.hasAttribute(
"code"))
1005 code = Rcpp::as<int>(
object.attr(
"code"));
1007 switch (
object.sexp_type())
1009 case RAWSXP:
copy(RAW(source), Rf_length(source),
code);
break;
1010 case REALSXP:
copy(REAL(source), Rf_length(source),
code);
break;
1011 case CPLXSXP:
copy(COMPLEX(source), Rf_length(source),
code);
break;
1012 case INTSXP:
copy(INTEGER(source), Rf_length(source),
code);
break;
1013 case LGLSXP:
copy(LOGICAL(source), Rf_length(source),
code);
break;
1016 if (Rf_length(source) > 1)
1017 Rf_warning(
"Character vector elements after the first will not be stored in a NIfTI extension");
1018 const char *
string = CHAR(STRING_ELT(source, 0));
1019 copy(
string, strlen(
string),
code);
1022 default: Rf_error(
"Unable to convert SEXP type %d to NIfTI extension",
object.sexp_type());
1037 const char *
data ()
const {
return (
ext == NULL ? NULL :
ext->edata); }
1043 size_t length ()
const {
return (
ext == NULL ||
ext->esize < 8 ? 0 :
size_t(
ext->esize - 8)); }
1049 size_t size ()
const {
return (
ext == NULL ||
ext->esize < 8 ? 0 :
size_t(
ext->esize - 8)); }
1055 operator SEXP ()
const
1057 if (
ext == NULL ||
ext->esize < 8)
1061 Rcpp::RawVector result(
length);
1062 const Rbyte *source = (
const Rbyte *)
ext->edata;
1063 std::copy(source, source+
length, result.begin());
1064 result.attr(
"code") =
ext->ecode;
1079 #if RNIFTI_NIFTILIB_VERSION == 1
1080 typedef float Element;
1085 #elif RNIFTI_NIFTILIB_VERSION == 2
1086 typedef double Element;
1108 : forward(NULL), inverse(NULL),
qparams(NULL),
mat() {}
1114 : forward(NULL), inverse(NULL),
qparams(NULL),
mat(source) {}
1119 Xform (
const Matrix::NativeType &source)
1120 : forward(NULL), inverse(NULL),
qparams(NULL),
mat(source) {}
1127 : forward(*source.m), inverse(NULL),
qparams(NULL),
mat(source) {}
1133 Xform (Matrix::NativeType &source, Matrix::NativeType &inverse, Element *
qparams = NULL)
1141 : forward(NULL), inverse(NULL),
qparams(NULL),
mat(Matrix(source)) {}
1148 operator const Matrix::NativeType ()
const {
return mat; }
1154 operator Matrix::NativeType () {
return mat; }
1231 if (sexpType == INTSXP || sexpType == LGLSXP)
1233 else if (sexpType == REALSXP)
1235 else if (sexpType == CPLXSXP)
1236 return DT_COMPLEX128;
1238 throw std::runtime_error(
"Array elements must be numeric");
1283 void copy (
const nifti_image *source);
1369 Rc_printf(
"Creating NiftiImage (v%d) with pointer %p (from NiftiImage)\n", RNIFTI_NIFTILIB_VERSION, this->image);
1382 Rc_printf(
"Creating NiftiImage (v%d) with pointer %p (from Block)\n", RNIFTI_NIFTILIB_VERSION, this->image);
1400 Rc_printf(
"Creating NiftiImage (v%d) with pointer %p (from pointer)\n", RNIFTI_NIFTILIB_VERSION, this->image);
1424 NiftiImage (
const std::string &path,
const bool readData =
true);
1432 NiftiImage (
const std::string &path,
const std::vector<dim_t> &volumes);
1445 NiftiImage (
const SEXP
object,
const bool readData =
true,
const bool readOnly =
false);
1457 operator const nifti_image* ()
const {
return image; }
1462 operator nifti_image* () {
return image; }
1482 Rc_printf(
"Creating NiftiImage (v%d), with pointer %p (from NiftiImage)\n", RNIFTI_NIFTILIB_VERSION, this->image);
1496 Rc_printf(
"Creating NiftiImage (v%d) with pointer %p (from Block)\n", RNIFTI_NIFTILIB_VERSION, this->image);
1553 std::vector<dim_t>
dim ()
const
1556 return std::vector<dim_t>();
1568 return std::vector<pixdim_t>();
1570 return std::vector<pixdim_t>(
image->pixdim+1,
image->pixdim+
image->ndim+1);
1581 int ndim =
image->ndim;
1582 while (
image->dim[ndim] < 2)
1610 template <
typename TargetType>
1611 std::vector<TargetType>
getData (
const bool useSlope =
true)
const;
1639 template <
typename SourceType>
1657 #if RNIFTI_NIFTILIB_VERSION == 1
1658 nifti_image_unload(
image);
1659 #elif RNIFTI_NIFTILIB_VERSION == 2
1660 nifti2_image_unload(
image);
1797 switch (
image->datatype)
1799 case DT_NONE:
return 0;
1800 case DT_RGB24:
return 3;
1801 case DT_RGBA32:
return 4;
1828 return std::list<Extension>();
1831 std::list<Extension> result;
1832 for (
int i=0; i<
image->num_ext; i++)
1835 if (code < 0 || code == extension.
code())
1836 result.push_back(extension);
1850 #if RNIFTI_NIFTILIB_VERSION == 1
1852 #elif RNIFTI_NIFTILIB_VERSION == 2
1878 #if RNIFTI_NIFTILIB_VERSION == 1
1879 nifti_free_extensions(
image);
1880 #elif RNIFTI_NIFTILIB_VERSION == 2
1881 nifti2_free_extensions(
image);
1894 std::pair<std::string,std::string>
toFile (
const std::string fileName,
const int datatype = DT_NONE,
const int filetype = -1)
const;
1904 std::pair<std::string,std::string>
toFile (
const std::string fileName,
const std::string &datatype,
const int filetype = -1)
const;
1934 #include "RNifti/NiftiImage_impl.h"
const Xform sform() const
Access the sform matrix.
Definition: NiftiImage.h:1726
Vector4 quaternion() const
Obtain the quaternion representation of the xform's rotation component.
MatrixType operator*(const MatrixType &other) const
Matrix-matrix multiplication (infix shorthand)
Definition: NiftiImage.h:793
NiftiImage(const std::string &path, const std::vector< dim_t > &volumes)
Initialise using a path string and sequence of required volumes.
std::string orientation() const
Obtain the approximate orientation of the image's coordinate frame, as a three-character string consi...
NiftiImage & rescale(const std::vector< pixdim_t > &scales)
Rescale the image, changing its image dimensions and pixel dimensions.
void release()
Release the currently wrapped pointer, if it is not NULL, decrementing the reference count and releas...
bool isScaled() const
Determine whether the object uses data scaling.
Definition: NiftiImage.h:529
Inner class referring to a subset of an image.
Definition: NiftiImage.h:852
NiftiImage(const Block &source)
Initialise from a block, copying in the data.
Definition: NiftiImage.h:1377
std::pair< std::string, std::string > toFile(const std::string fileName, const std::string &datatype, const int filetype=-1) const
Write the image to a NIfTI-1 file.
ElementType colnorm() const
Maximum column norm, as implemented in niftilib (Order 3 only)
std::vector< dim_t > dim() const
Return the dimensions of the image.
Definition: NiftiImage.h:1553
bool isComplex() const
Determine whether the datatype is complex.
Definition: NiftiImage.h:535
NiftiImageData & operator=(const NiftiImageData &source)
Copy assignment operator.
Definition: NiftiImage.h:494
nifti_image * image
The wrapped nifti_image pointer.
Definition: NiftiImage.h:1252
SquareMatrix(const ElementType *source)
Initialise from a C-style array of the appropriate type and length.
Definition: NiftiImage.h:709
Iterator type for NiftiImageData, with Element as its value type.
Definition: NiftiImage.h:353
const char * data() const
Return the data blob associated with the extension.
Definition: NiftiImage.h:1037
size_t size() const
Return the length of the data array.
Definition: NiftiImage.h:1049
const ElementType & operator()(const int i, const int j) const
Indexing operator.
Definition: NiftiImage.h:799
SquareMatrix(SEXP source)
Initialise from an R object representing a numeric matrix.
Definition: NiftiImage.h:727
Xform qform()
Access the qform matrix.
Definition: NiftiImage.h:1720
Block block(const int i)
Extract a block from the image.
Definition: NiftiImage.h:1756
const Block volume(const int i) const
Extract a volume block from a 4D image.
Definition: NiftiImage.h:1777
NiftiImage & dropData()
Drop the data from the image, retaining only the metadata.
Definition: NiftiImage.h:1655
int * refCount
A reference counter, shared with other objects wrapping the same pointer.
Definition: NiftiImage.h:1253
Extension(const Extension &source)
Copy constructor.
Definition: NiftiImage.h:976
Element(const NiftiImageData &parent, void *ptr=NULL)
Primary constructor.
Definition: NiftiImage.h:280
NiftiImage & operator=(const NiftiImage &source)
Copy assignment operator, which copies from its argument.
Definition: NiftiImage.h:1478
NiftiImage(const std::string &path, const bool readData=true)
Initialise using a path string.
NiftiImage(const NiftiImage &source, const bool copy=true)
Copy constructor.
Definition: NiftiImage.h:1361
NiftiImage & changeDatatype(const int datatype, const bool useSlope=false)
Change the datatype of the image, casting the pixel data if present.
Inner class representing an xform matrix, which indicates the orientation and other spatial propertie...
Definition: NiftiImage.h:1077
NiftiImageData(void *data, const size_t length, const int datatype, const double slope=1.0, const double intercept=0.0)
Primary constructor.
Definition: NiftiImage.h:428
void updatePixdim(const std::vector< pixdim_t > &pixdim)
Modify the pixel dimensions, and potentially the xform matrices to match.
Abstract inner class defining the type-specific functions required in concrete subclasses.
Definition: NiftiImage.h:82
const Iterator end() const
Obtain a constant iterator corresponding to the end of the blob.
Definition: NiftiImage.h:572
Vector< ElementType, Length > operator-() const
Unary negation operator, which reverses the signs of all elements.
Definition: NiftiImage.h:651
Thin wrapper around a C-style nifti_image struct that allows C++-style destruction.
Definition: NiftiImage.h:835
Simple RGB(A) type encapsulating an 8-bit colour value with optional opacity, which can also be set o...
Definition: NiftiImage.h:55
Xform(const Matrix::NativeType &source)
Initialise from a constant NIfTI mat44 or dmat44.
Definition: NiftiImage.h:1119
NiftiImageData(InputIterator from, InputIterator to, const int datatype)
Iterator-based constructor.
Definition: NiftiImage.h:472
bool isFloatingPoint() const
Determine whether the datatype is floating point.
Definition: NiftiImage.h:542
VectorType multiply(const VectorType &vec) const
Matrix-vector multiplication.
Matrix mat
The full xform matrix underpinning this object.
Definition: NiftiImage.h:1095
Extension(const SourceType *data, const size_t length, const int code)
Construct the object from its constituent parts.
Definition: NiftiImage.h:988
size_t size() const
Return the number of elements in the data.
Definition: NiftiImage.h:510
MatrixType polar() const
Polar decomposition, as implemented in niftilib (Order 3 only)
bool isNull() const
Determine whether or not the wrapped pointer is NULL.
Definition: NiftiImage.h:1514
void copy(const nifti_image *source)
Copy the contents of a nifti_image to create a new image, acquiring the new pointer.
void setPixunits(const std::vector< std::string > &pixunits)
Modify the pixel dimension units.
Extension(SEXP source, int code=-1)
Construct the object from an atomic R object, copying the data into a new extension.
Definition: NiftiImage.h:1001
SquareMatrix(const NiftiType &source)
Initialise from the appropriate niftilib type.
Definition: NiftiImage.h:717
NiftiImage & replaceData(const std::vector< SourceType > &data, const int datatype=DT_NONE)
Replace the pixel data in the image with the contents of a vector.
size_t length() const
Return the number of elements in the data.
Definition: NiftiImage.h:509
double slope
The slope term used to scale data values.
Definition: NiftiImage.h:74
Vector3 offset() const
Obtain the translation component of the xform matrix.
Block slice(const int i)
Extract a slice block from a 3D image.
Definition: NiftiImage.h:1770
Rcpp::RObject toPointer(const std::string label) const
Create an internal image to pass back to R.
const Element operator[](const size_t i) const
Indexing operator, returning a constant element.
Definition: NiftiImage.h:585
static MatrixType eye()
Construct an identity matrix of the appropriate size.
Definition: NiftiImage.h:777
void acquire(const NiftiImage &source)
Acquire the same pointer as another NiftiImage, incrementing the shared reference count.
Definition: NiftiImage.h:1267
NiftiImageData(const NiftiImageData &source, const int datatype=DT_NONE)
Copy constructor with optional type conversion.
Definition: NiftiImage.h:452
bool isShared() const
Determine whether the wrapped pointer is shared with another NiftiImage.
Definition: NiftiImage.h:1520
Submatrix submatrix() const
Obtain the upper left 3x3 submatrix from the xform matrix.
double intercept
The intercept term used to scale data values.
Definition: NiftiImage.h:75
dim_t nBlocks() const
Return the number of blocks in the image.
Definition: NiftiImage.h:1738
Iterator end()
Obtain a mutable iterator corresponding to the end of the blob.
Definition: NiftiImage.h:578
Rcpp::RObject toArrayOrPointer(const bool internal, const std::string label) const
A conditional method that calls either toArray or toPointer.
std::pair< std::string, std::string > toFile(const std::string fileName, const int datatype=DT_NONE, const int filetype=-1) const
Write the image to a NIfTI-1 file.
NiftiImage & reorient(const std::string &orientation)
Reorient the image by permuting dimensions and potentially reversing some.
ElementType rownorm() const
Maximum row norm, as implemented in niftilib (Order 3 only)
std::vector< TargetType > getData(const bool useSlope=true) const
Extract a vector of data from the image, casting it to any required element type.
Inner class representing a single element in the data blob.
Definition: NiftiImage.h:268
NiftiImage & replaceExtensions(const std::list< Extension > extensions)
Replace all extensions with new ones.
Definition: NiftiImage.h:1863
NiftiImage & update(const Rcpp::RObject &object)
Update the image from an R array.
const NiftiImageData data() const
Obtain the pixel data within the image.
Definition: NiftiImage.h:1593
NiftiImage & reorient(const int i, const int j, const int k)
Reorient the image by permuting dimensions and potentially reversing some.
size_t _length
The number of data elements in the blob.
Definition: NiftiImage.h:204
const Matrix & matrix() const
Access the xform matrix as an immutable SquareMatrix object.
Definition: NiftiImage.h:1177
bool isRgb() const
Determine whether the datatype corresponds to an RGB type.
Definition: NiftiImage.h:554
MatrixType inverse() const
Matrix inverse.
Xform(Matrix::NativeType &source)
Initialise from a NIfTI mat44 or dmat44.
Definition: NiftiImage.h:1126
NiftiType NativeType
The niftilib structure type corresponding to this matrix.
Definition: NiftiImage.h:694
int nExtensions() const
Return the number of extensions associated with the image.
Definition: NiftiImage.h:1817
Xform(const Matrix &source)
Initialise from a 4x4 SquareMatrix.
Definition: NiftiImage.h:1113
NiftiImage(nifti_image *const image, const bool copy=false)
Initialise using an existing nifti_image pointer.
Definition: NiftiImage.h:1392
SquareMatrix< NiftiType, ElementType, Order > MatrixType
Type alias for the current specialisation.
Definition: NiftiImage.h:695
Wrapper class encapsulating a NIfTI data blob, with responsibility for handling data scaling and poly...
Definition: NiftiImage.h:72
Rcpp::RObject toArray() const
Create an R array from the image.
Submatrix rotation() const
Obtain the 3x3 rotation matrix from the xform matrix, with scale and skew components removed.
NiftiImageData data() const
Obtain the data within the block.
Definition: NiftiImage.h:902
const Block block(const int i) const
Extract a block from the image.
Definition: NiftiImage.h:1747
A simple object-oriented wrapper around a fixed-length array.
Definition: NiftiImage.h:627
bool isInteger() const
Determine whether the datatype is an integer type.
Definition: NiftiImage.h:548
NiftiType * niftiPointer() const
Obtain a pointer to a NIfTI-style mat44 or dmat44 encapsulating the same data as this object.
Definition: NiftiImage.h:681
SquareMatrix(const ElementType value=0.0)
Initialise with a fixed element value, defaulting to zero.
Definition: NiftiImage.h:701
NiftiImage & setPersistence(const bool persistent)
Mark the image as persistent, so that it can be passed back to R.
Definition: NiftiImage.h:1508
NiftiImage & replaceData(const NiftiImageData &data)
Replace the pixel data in the image with the contents of a NiftiImageData object.
Block volume(const int i)
Extract a volume block from a 4D image.
Definition: NiftiImage.h:1784
NiftiImageData unscaled() const
Return a similar object to the callee, but with the slope and intercept values reset.
Definition: NiftiImage.h:560
Xform()
Default constructor.
Definition: NiftiImage.h:1107
virtual ~NiftiImage()
Destructor which decrements the reference counter, and releases the wrapped pointer if the counter dr...
Definition: NiftiImage.h:1452
Vector(const ElementType value=0.0)
Initialise with a fixed element value, defaulting to zero.
Definition: NiftiImage.h:635
NiftiImage & changeDatatype(const std::string &datatype, const bool useSlope=false)
Change the datatype of the image, casting the pixel data if present.
nifti1_extension * ext
The wrapped extension structure.
Definition: NiftiImage.h:933
NiftiImageData & disown()
Disown the data blob, removing responsibility for freeing it upon destruction.
Definition: NiftiImage.h:566
void copy(const SourceType *data, const size_t length, const int code)
Copy the specified data buffer into the object.
bool isDataScaled() const
Determine whether nontrivial scale and slope parameters are set.
Definition: NiftiImage.h:1535
void acquire(nifti_image *const image)
Acquire the specified pointer to a nifti_image struct, taking (possibly shared) responsibility for fr...
Xform & operator=(const Xform &source)
Copy assignment operator, taking an Xform and replacing linked data.
Definition: NiftiImage.h:1159
Iterator begin()
Obtain a mutable iterator corresponding to the start of the blob.
Definition: NiftiImage.h:575
const Xform xform(const bool preferQuaternion=true) const
Obtain an xform matrix, indicating the orientation of the image.
Concrete inner class template defining behaviour specific to individual data types.
Definition: NiftiImage.h:102
const dim_t index
The location along dimension.
Definition: NiftiImage.h:855
TypeHandler * createHandler()
Create a concrete type handler appropriate to the datatype code stored with the data.
Definition: NiftiImage.h:174
Extension(nifti1_extension *const extension, const bool copy=false)
Initialise from an existing nifti1_extension (which is used by both NIfTI-1 and NIfTI-2 images),...
Definition: NiftiImage.h:964
Definition: NiftiImage.h:56
static int fileVersion(const std::string &path)
Get the NIfTI format version used by the file at the specified path.
size_t length() const
Return the length of the data array.
Definition: NiftiImage.h:1043
std::vector< TargetType > getData(const bool useSlope=true) const
Extract a vector of data from a block, casting it to any required element type.
NiftiImage()
Default constructor.
Definition: NiftiImage.h:1352
const nifti_image * operator->() const
Allows a NiftiImage object to be treated as a pointer to a const nifti_image.
Definition: NiftiImage.h:1467
void * dataPtr
Opaque pointer to the underlying data blob.
Definition: NiftiImage.h:201
int datatype() const
Return stored datatype code.
Definition: NiftiImage.h:508
Block & operator=(const NiftiImage &source)
Copy assignment operator, which allows a block in one image to be replaced with the contents of anoth...
Definition: NiftiImage.h:879
TypeHandler * handler
Type handler, which is created to match the datatype.
Definition: NiftiImage.h:203
size_t nVoxels() const
Return the number of voxels in the image.
Definition: NiftiImage.h:1811
Xform(SEXP source)
Initialise from an R numeric matrix object.
Definition: NiftiImage.h:1140
MatrixType multiply(const MatrixType &other) const
Matrix-matrix multiplication.
Xform(Matrix::NativeType &source, Matrix::NativeType &inverse, Element *qparams=NULL)
Initialise from forward and backward matrices, and optionally quaternion parameters.
Definition: NiftiImage.h:1133
size_t totalBytes() const
Return the total size of the data blob, in bytes.
Definition: NiftiImage.h:516
Vector< ElementType, Order > VectorType
Type of vectors for which this matrix is a linear operator.
Definition: NiftiImage.h:696
void calibrateFrom(const NiftiImageData &data)
Update the slope and intercept to cover the range of another data object.
Definition: NiftiImage.h:243
void initFromMriImage(const Rcpp::RObject &object, const bool copyData=true)
Initialise the object from a reference object of class "MriImage".
void copy(const nifti1_extension *source)
Copy an existing nifti1_extension structure into the object.
ElementType elements[Order *Order]
The underlying raw data elements, stored row-major for consistency with niftilib.
Definition: NiftiImage.h:675
size_t bytesPerPixel() const
Return the number of bytes used per element, or zero if the datatype is undefined or the blob is NULL...
Definition: NiftiImage.h:513
void init(void *data, const size_t length, const int datatype, const double slope, const double intercept, const bool alloc=true)
Initialiser method, used by constructors.
Definition: NiftiImage.h:217
Element handedness() const
Returns the qfac value, which should be 1 where the xform matrix represents a right-handed coordinate...
Inner class wrapping a NIfTI extension, a weakly-specified standard for attaching additional metadata...
Definition: NiftiImage.h:931
ElementType * end()
Return a pointer/iterator to the end of the data.
Definition: NiftiImage.h:772
bool owner
An indicator of whether this object is responsible for cleaning up the data.
Definition: NiftiImage.h:205
Class representing a numeric square matrix of a fixed order.
Definition: NiftiImage.h:673
NiftiImage & dropExtensions()
Remove any extensions from the image.
Definition: NiftiImage.h:1875
const NiftiImage & image
The parent image.
Definition: NiftiImage.h:853
Extension()
Default constructor, wrapping NULL.
Definition: NiftiImage.h:954
std::list< Extension > extensions(const int code=-1) const
Return a list of the extensions associated with the image.
Definition: NiftiImage.h:1825
NiftiImageData(nifti_image *image)
Convenience constructor for a nifti_image.
Definition: NiftiImage.h:437
void * blob() const
Return an opaque pointer to the blob.
Definition: NiftiImage.h:507
NiftiImage(const std::vector< dim_t > &dim, const std::string &datatype)
Initialise from basic metadata, allocating and zeroing pixel data.
std::vector< pixdim_t > pixdim() const
Return the dimensions of the pixels or voxels in the image.
Definition: NiftiImage.h:1565
Vector3 spacing() const
Obtain the pixel spacing of the image in each spatial dimension.
void minmax(double *min, double *max) const
Calculate the minimum and maximum values in the blob, as doubles.
Definition: NiftiImage.h:601
ElementType determ() const
Matrix determinant, as implemented in niftilib (Order 3 only)
int nDims() const
Return the number of dimensions in the image.
Definition: NiftiImage.h:1541
ElementType * begin()
Return a pointer/iterator to the beginning of the data.
Definition: NiftiImage.h:762
Iterator(const Iterator &other)
Copy constructor.
Definition: NiftiImage.h:378
NiftiImage(const SEXP object, const bool readData=true, const bool readOnly=false)
Initialise from an R object, retrieving an existing image from an external pointer attribute if avail...
Iterator(const NiftiImageData &parent, void *ptr=NULL, const size_t step=0)
Primary constructor.
Definition: NiftiImage.h:367
NiftiImage & drop()
Drop unitary dimensions.
Definition: NiftiImage.h:1579
void initFromNiftiS4(const Rcpp::RObject &object, const bool copyData=true)
Initialise the object from an S4 object of class "nifti".
Xform sform()
Access the sform matrix.
Definition: NiftiImage.h:1732
void initFromArray(const Rcpp::RObject &object, const bool copyData=true)
Initialise the object from an R array.
void initFromList(const Rcpp::RObject &object)
Initialise the object from an R list with named elements, which can only contain metadata.
NiftiImageData data()
Obtain the pixel data within the image.
Definition: NiftiImage.h:1599
int nChannels() const
Return the number of colour channels used by the image.
Definition: NiftiImage.h:1791
const ElementType * begin() const
Return a pointer/iterator to the beginning of the data.
Definition: NiftiImage.h:756
void copy(const NiftiImage &source)
Copy the contents of another NiftiImage to create a new image, acquiring a new pointer.
const Xform qform() const
Access the qform matrix.
Definition: NiftiImage.h:1714
const int dimension
The dimension along which the block applies (which should be the last)
Definition: NiftiImage.h:854
NiftiImage & addExtension(const Extension &extension)
Add an extension to the image.
Definition: NiftiImage.h:1847
Block(const NiftiImage &image, const int dimension, const dim_t index)
Standard constructor for this class.
Definition: NiftiImage.h:864
const Block slice(const int i) const
Extract a slice block from a 3D image.
Definition: NiftiImage.h:1763
bool isPersistent() const
Determine whether or not the image is marked as persistent.
Definition: NiftiImage.h:1528
Element & operator=(const SourceType &value)
Copy assignment operator.
Element * qparams
Pointers to linked C-style arrays.
Definition: NiftiImage.h:1094
int code() const
Return the code associated with the extension.
Definition: NiftiImage.h:1031
virtual ~NiftiImageData()
Destructor which frees the type handler, and the data blob if it is owned by this object.
Definition: NiftiImage.h:482
bool isEmpty() const
Determine whether or not the object is empty.
Definition: NiftiImage.h:522
const Iterator begin() const
Obtain a constant iterator corresponding to the start of the blob.
Definition: NiftiImage.h:569
NiftiImageData()
Default constructor, creating an empty data object.
Definition: NiftiImage.h:416
NiftiType niftiCopy() const
Copy the data elements into a new NIfTI-style mat44 or dmat44.
Definition: NiftiImage.h:686
const ElementType * end() const
Return a pointer/iterator to the end of the data.
Definition: NiftiImage.h:767
void initFromDims(const std::vector< dim_t > &dim, const int datatype)
Initialise an empty object from basic metadata.
void replace(const Matrix &source)
Replace the current matrix with a new one.
void copy(const Block &source)
Copy the contents of a Block to create a new image, acquiring a new pointer.
NiftiImage(const std::vector< dim_t > &dim, const int datatype)
Initialise from basic metadata, allocating and zeroing pixel data.
int _datatype
Datatype code indicating the actual type of the elements.
Definition: NiftiImage.h:202
static int sexpTypeToNiftiType(const int sexpType)
Convert between R SEXP object type and nifti_image datatype codes.
Definition: NiftiImage.h:1229
Vector(const ElementType *source)
Initialise from a C-style array of the appropriate type and length.
Definition: NiftiImage.h:643