Skip to content

Commit 7cbe9df

Browse files
committed
Do not open nifti files with mmap if numpy < 1.12.0
Fixes #1795
1 parent 7d4d5e4 commit 7cbe9df

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

nipype/algorithms/confounds.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import os
1818
import os.path as op
19+
from distutils.version import LooseVersion
1920

2021
import nibabel as nb
2122
import numpy as np
@@ -29,6 +30,8 @@
2930
InputMultiPath)
3031
IFLOG = logging.getLogger('interface')
3132

33+
NUMPY_MMAP = LooseVersion(np.__version__) >= LooseVersion('1.12.0')
34+
3235
class ComputeDVARSInputSpec(BaseInterfaceInputSpec):
3336
in_file = File(exists=True, mandatory=True, desc='functional data, after HMC')
3437
in_mask = File(exists=True, mandatory=True, desc='a brain mask')
@@ -127,9 +130,9 @@ def _run_interface(self, runtime):
127130
dvars = compute_dvars(self.inputs.in_file, self.inputs.in_mask,
128131
remove_zerovariance=self.inputs.remove_zerovariance)
129132

130-
self._results['avg_std'] = float(dvars[0].mean())
131-
self._results['avg_nstd'] = float(dvars[1].mean())
132-
self._results['avg_vxstd'] = float(dvars[2].mean())
133+
(self._results['avg_std'],
134+
self._results['avg_nstd'],
135+
self._results['avg_vxstd']) = np.mean(dvars, axis=1).astype(float)
133136

134137
tr = None
135138
if isdefined(self.inputs.series_tr):
@@ -329,8 +332,8 @@ class CompCor(BaseInterface):
329332
}]
330333

331334
def _run_interface(self, runtime):
332-
imgseries = nb.load(self.inputs.realigned_file).get_data()
333-
mask = nb.load(self.inputs.mask_file).get_data()
335+
imgseries = nb.load(self.inputs.realigned_file, mmap=NUMPY_MMAP).get_data()
336+
mask = nb.load(self.inputs.mask_file, mmap=NUMPY_MMAP).get_data()
334337

335338
if imgseries.shape[:3] != mask.shape:
336339
raise ValueError('Inputs for CompCor, func {} and mask {}, do not have matching '
@@ -435,15 +438,15 @@ class TCompCor(CompCor):
435438
output_spec = TCompCorOutputSpec
436439

437440
def _run_interface(self, runtime):
438-
imgseries = nb.load(self.inputs.realigned_file).get_data()
441+
imgseries = nb.load(self.inputs.realigned_file, mmap=NUMPY_MMAP).get_data()
439442

440443
if imgseries.ndim != 4:
441444
raise ValueError('tCompCor expected a 4-D nifti file. Input {} has {} dimensions '
442445
'(shape {})'
443446
.format(self.inputs.realigned_file, imgseries.ndim, imgseries.shape))
444447

445448
if isdefined(self.inputs.mask_file):
446-
in_mask_data = nb.load(self.inputs.mask_file).get_data()
449+
in_mask_data = nb.load(self.inputs.mask_file, mmap=NUMPY_MMAP).get_data()
447450
imgseries = imgseries[in_mask_data != 0, :]
448451

449452
# From the paper:
@@ -521,9 +524,9 @@ class TSNR(BaseInterface):
521524
output_spec = TSNROutputSpec
522525

523526
def _run_interface(self, runtime):
524-
img = nb.load(self.inputs.in_file[0])
527+
img = nb.load(self.inputs.in_file[0], mmap=NUMPY_MMAP)
525528
header = img.header.copy()
526-
vollist = [nb.load(filename) for filename in self.inputs.in_file]
529+
vollist = [nb.load(filename, mmap=NUMPY_MMAP) for filename in self.inputs.in_file]
527530
data = np.concatenate([vol.get_data().reshape(
528531
vol.get_shape()[:3] + (-1,)) for vol in vollist], axis=3)
529532
data = np.nan_to_num(data)
@@ -626,8 +629,9 @@ def compute_dvars(in_file, in_mask, remove_zerovariance=False):
626629
from nitime.algorithms import AR_est_YW
627630
import warnings
628631

629-
func = nb.load(in_file).get_data().astype(np.float32)
630-
mask = nb.load(in_mask).get_data().astype(np.uint8)
632+
mmap
633+
func = nb.load(in_file, mmap=NUMPY_MMAP).get_data().astype(np.float32)
634+
mask = nb.load(in_mask, mmap=NUMPY_MMAP).get_data().astype(np.uint8)
631635

632636
if len(func.shape) != 4:
633637
raise RuntimeError(

0 commit comments

Comments
 (0)