Skip to content

Commit d66dc77

Browse files
committed
ENH: Add get_norm_zooms for zooms in mm/s units
1 parent 9d1f926 commit d66dc77

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

nibabel/analyze.py

+4
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,10 @@ def set_zooms(self, zooms):
710710
pixdims = hdr['pixdim']
711711
pixdims[1:ndim + 1] = zooms[:]
712712

713+
def get_norm_zooms(self, raise_unknown=False):
714+
''' Get zooms in mm/s units '''
715+
return self.get_zooms()
716+
713717
def as_analyze_map(self):
714718
""" Return header as mapping for conversion to Analyze types
715719

nibabel/nifti1.py

+33
Original file line numberDiff line numberDiff line change
@@ -1626,6 +1626,39 @@ def set_xyzt_units(self, xyz=None, t=None):
16261626
t_code = unit_codes[t]
16271627
self.structarr['xyzt_units'] = xyz_code + t_code
16281628

1629+
def get_norm_zooms(self, raise_unknown=False):
1630+
''' Get zooms in mm/s units '''
1631+
raw_zooms = self.get_zooms()
1632+
xyz_zooms = raw_zooms[:3]
1633+
t_zoom = raw_zooms[3] if len(raw_zooms) > 3 else None
1634+
1635+
xyz_code, t_code = self.get_xyzt_units()
1636+
xyz_msg = t_msg = ''
1637+
if xyz_code == 'unknown':
1638+
xyz_msg = 'Unknown spatial units'
1639+
xyz_code = 'mm'
1640+
if t_code == 'unknown' and t_zoom is not None:
1641+
t_msg = 'Unknown time units'
1642+
t_code = 'sec'
1643+
if raise_unknown and (xyz_msg, t_msg) != ('', ''):
1644+
if xyz_msg and t_msg:
1645+
msg = 'Unknown spatial and time units'
1646+
else:
1647+
msg = xyz_msg or t_msg
1648+
raise ValueError("Error: {}".format(msg))
1649+
if xyz_msg:
1650+
warnings.warn('{} - assuming mm'.format(xyz_msg))
1651+
if t_msg:
1652+
warnings.warn('{} - assuming sec'.format(t_msg))
1653+
1654+
xyz_factor = {'meter': 0.001, 'mm': 1, 'usec': 1000}[xyz_code]
1655+
t_factor = {'sec': 1, 'msec': 1000, 'usec': 1000000}[t_code]
1656+
1657+
xyz_zooms = tuple(np.array(xyz_zooms) / xyz_factor)
1658+
t_zoom = (t_zoom / t_factor,) if t_zoom is not None else ()
1659+
1660+
return xyz_zooms + t_zoom
1661+
16291662
def _clean_after_mapping(self):
16301663
''' Set format-specific stuff after converting header from mapping
16311664

nibabel/spatialimages.py

+4
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,10 @@ def set_zooms(self, zooms):
241241
raise HeaderDataError('zooms must be positive')
242242
self._zooms = zooms
243243

244+
def get_norm_zooms(self, raise_unknown=False):
245+
''' Get zooms in mm/s units '''
246+
return self.get_zooms()
247+
244248
def get_base_affine(self):
245249
shape = self.get_data_shape()
246250
zooms = self.get_zooms()

0 commit comments

Comments
 (0)