Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
else:
raise HeaderDataError('Not all slice times can be None')
for ind, time in enumerate(slice_times[::-1]):
if time is not None:
slice_end = slice_len-ind-1
break
timed = slice_times[slice_start:slice_end+1]
for time in timed:
if time is None:
raise HeaderDataError('Cannot have None in middle '
'of slice time vector')
# Find slice duration, check times are compatible with single
# duration
tdiffs = np.diff(np.sort(timed))
if not np.allclose(np.diff(tdiffs), 0):
raise HeaderDataError('Slice times not compatible with '
'single slice duration')
duration = np.mean(tdiffs)
# To slice time order
st_order = np.round(np.array(timed) / duration)
# Check if slice times fit known schemes
n_timed = len(timed)
so_recoder = self._field_recoders['slice_code']
labels = so_recoder.value_set('label')
labels.remove('unknown')
for label in labels:
if np.all(st_order == self._slice_time_order(
label,
n_timed)):
break
else:
raise HeaderDataError('slice ordering of %s fits '
True
If you do not pass an endianness, and you pass some data, we
will try to guess from the passed data.
>>> binblock3 = hdr3.binaryblock
>>> hdr4 = AnalyzeHeader(binblock3)
>>> hdr4.endianness == swapped_code
True
'''
if binaryblock is None:
self._header_data = self._empty_headerdata(endianness)
return
# check size
if len(binaryblock) != self._dtype.itemsize:
raise HeaderDataError('Binary block is wrong size')
hdr = np.ndarray(shape=(),
dtype=self._dtype,
buffer=binaryblock)
if endianness is None:
endianness = self._guessed_endian(hdr)
else:
endianness = endian_codes[endianness]
if endianness != native_code:
dt = self._dtype.newbyteorder(endianness)
hdr = np.ndarray(shape=(),
dtype=dt,
buffer=binaryblock)
self._header_data = hdr.copy()
if check:
self.check_fix()
return
def _chk_datatype(klass, hdr, fix=False):
rep = Report(HeaderDataError)
code = int(hdr['datatype'])
try:
dtype = klass._data_type_codes.dtype[code]
except KeyError:
rep.problem_level = 40
rep.problem_msg = 'data code %d not recognized' % code
else:
if dtype.type is np.void:
rep.problem_level = 40
rep.problem_msg = 'data code %d not supported' % code
else:
return hdr, rep
if fix:
rep.fix_msg = 'not attempting fix'
return hdr, rep
Parameters
----------
binaryblock : {None, string} optional
binary block to set into header. By default, None, in
which case we insert the default empty header block
check : bool, optional
Whether to check content of header in initialization.
Default is True.
'''
if binaryblock is None:
self._header_data = self._empty_headerdata()
return
# check size
if len(binaryblock) != self.template_dtype.itemsize:
raise HeaderDataError('Binary block is wrong size')
hdr = np.ndarray(shape=(),
dtype=self.template_dtype,
buffer=binaryblock)
#if goodRASFlag, discard delta, Mdc and c_ras stuff
if int(hdr['goodRASFlag']) < 0:
hdr = self._set_affine_default(hdr)
self._header_data = hdr.copy()
if check:
self.check_fix()
return
def set_zooms(self, zooms):
''' Set zooms into header fields
See docstring for ``get_zooms`` for examples
'''
hdr = self._structarr
dims = hdr['dim']
ndim = dims[0]
zooms = np.asarray(zooms)
if len(zooms) != ndim:
raise HeaderDataError('Expecting %d zoom values for ndim %d'
% (ndim, ndim))
if np.any(zooms < 0):
raise HeaderDataError('zooms must be positive')
pixdims = hdr['pixdim']
pixdims[1:ndim + 1] = zooms[:]
def get_n_slices(self):
''' Return the number of slices
'''
hdr = self._header_data
_, _, slice_dim = self.get_dim_info()
if slice_dim is None:
raise HeaderDataError('Slice dimension not set in header '
'dim_info')
shape = self.get_data_shape()
try:
slice_len = shape[slice_dim]
except IndexError:
raise HeaderDataError('Slice dimension index (%s) outside '
'shape tuple (%s)'
% (slice_dim, shape))
return slice_len
def get_n_slices(self):
''' Return the number of slices
'''
hdr = self._header_data
_, _, slice_dim = self.get_dim_info()
if slice_dim is None:
raise HeaderDataError('Slice dimension not set in header '
'dim_info')
shape = self.get_data_shape()
try:
slice_len = shape[slice_dim]
except IndexError:
raise HeaderDataError('Slice dimension index (%s) outside '
'shape tuple (%s)'
% (slice_dim, shape))
return slice_len
--------
>>> hdr = Nifti1Header()
>>> hdr.set_dim_info(slice=2)
>>> hdr.set_data_shape((1, 1, 7))
>>> hdr.set_slice_duration(0.1)
>>> hdr['slice_code'] = slice_order_codes['sequential increasing']
>>> slice_times = hdr.get_slice_times()
>>> np.allclose(slice_times, [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
True
'''
hdr = self._header_data
slice_len = self.get_n_slices()
duration = self.get_slice_duration()
slabel = self.get_value_label('slice_code')
if slabel == 'unknown':
raise HeaderDataError('Cannot get slice times when '
'Slice code is "unknown"')
slice_start, slice_end = (int(hdr['slice_start']),
int(hdr['slice_end']))
if slice_start < 0:
raise HeaderDataError('slice_start should be >= 0')
if slice_end == 0:
slice_end = slice_len-1
n_timed = slice_end - slice_start + 1
if n_timed < 1:
raise HeaderDataError('slice_end should be > slice_start')
st_order = self._slice_time_order(slabel, n_timed)
times = st_order * duration
return ((None,)*slice_start +
tuple(times) +
(None,)*(slice_len-slice_end-1))
>>> from nibabel.analyze import AnalyzeHeader
>>> hdr = AnalyzeHeader()
>>> hdr.set_data_shape((1, 2, 3))
>>> hdr.set_data_dtype(np.float64)
>>> from StringIO import StringIO
>>> str_io = StringIO()
>>> data = np.arange(6).reshape(1,2,3)
>>> write_scaled_data(hdr, data, str_io)
>>> data.astype(np.float64).tostring('F') == str_io.getvalue()
True
'''
data = np.asarray(data)
slope, inter, mn, mx = hdr.scaling_from_data(data)
shape = hdr.get_data_shape()
if data.shape != shape:
raise HeaderDataError('Data should be shape (%s)' %
', '.join(str(s) for s in shape))
offset = hdr.get_data_offset()
out_dtype = hdr.get_data_dtype()
array_to_file(data, fileobj, out_dtype, offset, inter, slope, mn, mx)
hdr.set_slope_inter(slope, inter)
def _write_data(self, mghfile, data, header):
''' Utility routine to write image
Parameters
----------
mghfile : file-like
file-like object implementing ``seek`` or ``tell``, and
``write``
data : array-like
array to write
header : analyze-type header object
header
'''
shape = header.get_data_shape()
if data.shape != shape:
raise HeaderDataError('Data should be shape (%s)' %
', '.join(str(s) for s in shape))
offset = header.get_data_offset()
out_dtype = header.get_data_dtype()
array_to_file(data, mghfile, out_dtype, offset)