|
16 | 16 |
|
17 | 17 | import os
|
18 | 18 | import os.path as op
|
| 19 | +from distutils.version import LooseVersion |
19 | 20 |
|
20 | 21 | import nibabel as nb
|
21 | 22 | import numpy as np
|
|
29 | 30 | InputMultiPath)
|
30 | 31 | IFLOG = logging.getLogger('interface')
|
31 | 32 |
|
| 33 | +NUMPY_MMAP = LooseVersion(np.__version__) >= LooseVersion('1.12.0') |
| 34 | + |
32 | 35 | class ComputeDVARSInputSpec(BaseInterfaceInputSpec):
|
33 | 36 | in_file = File(exists=True, mandatory=True, desc='functional data, after HMC')
|
34 | 37 | in_mask = File(exists=True, mandatory=True, desc='a brain mask')
|
@@ -127,9 +130,9 @@ def _run_interface(self, runtime):
|
127 | 130 | dvars = compute_dvars(self.inputs.in_file, self.inputs.in_mask,
|
128 | 131 | remove_zerovariance=self.inputs.remove_zerovariance)
|
129 | 132 |
|
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) |
133 | 136 |
|
134 | 137 | tr = None
|
135 | 138 | if isdefined(self.inputs.series_tr):
|
@@ -329,8 +332,8 @@ class CompCor(BaseInterface):
|
329 | 332 | }]
|
330 | 333 |
|
331 | 334 | 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() |
334 | 337 |
|
335 | 338 | if imgseries.shape[:3] != mask.shape:
|
336 | 339 | raise ValueError('Inputs for CompCor, func {} and mask {}, do not have matching '
|
@@ -435,15 +438,15 @@ class TCompCor(CompCor):
|
435 | 438 | output_spec = TCompCorOutputSpec
|
436 | 439 |
|
437 | 440 | 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() |
439 | 442 |
|
440 | 443 | if imgseries.ndim != 4:
|
441 | 444 | raise ValueError('tCompCor expected a 4-D nifti file. Input {} has {} dimensions '
|
442 | 445 | '(shape {})'
|
443 | 446 | .format(self.inputs.realigned_file, imgseries.ndim, imgseries.shape))
|
444 | 447 |
|
445 | 448 | 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() |
447 | 450 | imgseries = imgseries[in_mask_data != 0, :]
|
448 | 451 |
|
449 | 452 | # From the paper:
|
@@ -521,9 +524,9 @@ class TSNR(BaseInterface):
|
521 | 524 | output_spec = TSNROutputSpec
|
522 | 525 |
|
523 | 526 | 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) |
525 | 528 | 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] |
527 | 530 | data = np.concatenate([vol.get_data().reshape(
|
528 | 531 | vol.get_shape()[:3] + (-1,)) for vol in vollist], axis=3)
|
529 | 532 | data = np.nan_to_num(data)
|
@@ -626,8 +629,9 @@ def compute_dvars(in_file, in_mask, remove_zerovariance=False):
|
626 | 629 | from nitime.algorithms import AR_est_YW
|
627 | 630 | import warnings
|
628 | 631 |
|
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) |
631 | 635 |
|
632 | 636 | if len(func.shape) != 4:
|
633 | 637 | raise RuntimeError(
|
|
0 commit comments