diff --git a/nipype/algorithms/misc.py b/nipype/algorithms/misc.py index 84a905b065..d8b318b05c 100644 --- a/nipype/algorithms/misc.py +++ b/nipype/algorithms/misc.py @@ -263,6 +263,14 @@ class TSNRInputSpec(BaseInterfaceInputSpec): in_file = InputMultiPath(File(exists=True), mandatory=True, desc='realigned 4D file or a list of 3D files') regress_poly = traits.Range(low=1, desc='Remove polynomials') + tsnr_file = File('tsnr.nii.gz', usedefault=True, hash_files=False, + desc='output tSNR file') + mean_file = File('mean.nii.gz', usedefault=True, hash_files=False, + desc='output mean file') + stddev_file = File('stdev.nii.gz', usedefault=True, hash_files=False, + desc='output tSNR file') + detrended_file = File('detrend.nii.gz', usedefault=True, hash_files=False, + desc='input file after detrending') class TSNROutputSpec(TraitedSpec): @@ -288,24 +296,18 @@ class TSNR(BaseInterface): input_spec = TSNRInputSpec output_spec = TSNROutputSpec - def _gen_output_file_name(self, suffix=None): - _, base, ext = split_filename(self.inputs.in_file[0]) - if suffix in ['mean', 'stddev']: - return os.path.abspath(base + "_tsnr_" + suffix + ext) - elif suffix in ['detrended']: - return os.path.abspath(base + "_" + suffix + ext) - else: - return os.path.abspath(base + "_tsnr" + ext) - def _run_interface(self, runtime): img = nb.load(self.inputs.in_file[0]) header = img.header.copy() vollist = [nb.load(filename) for filename in self.inputs.in_file] data = np.concatenate([vol.get_data().reshape( - vol.shape[:3] + (-1,)) for vol in vollist], axis=3) + vol.get_shape()[:3] + (-1,)) for vol in vollist], axis=3) + data = data.nan_to_num() + if data.dtype.kind == 'i': header.set_data_dtype(np.float32) data = data.astype(np.float32) + if isdefined(self.inputs.regress_poly): timepoints = img.shape[-1] X = np.ones((timepoints, 1)) @@ -318,26 +320,28 @@ def _run_interface(self, runtime): betas[1:, :, :, :], 0, 3)), 0, 4) data = data - datahat - img = nb.Nifti1Image(data, img.affine, header) - nb.save(img, self._gen_output_file_name('detrended')) + img = nb.Nifti1Image(data, img.get_affine(), header) + nb.save(img, op.abspath(self.inputs.detrended_file)) + meanimg = np.mean(data, axis=3) stddevimg = np.std(data, axis=3) - tsnr = meanimg / stddevimg - img = nb.Nifti1Image(tsnr, img.affine, header) - nb.save(img, self._gen_output_file_name()) - img = nb.Nifti1Image(meanimg, img.affine, header) - nb.save(img, self._gen_output_file_name('mean')) - img = nb.Nifti1Image(stddevimg, img.affine, header) - nb.save(img, self._gen_output_file_name('stddev')) + tsnr = np.zeros_like(meanimg) + tsnr[stddevimg > 1.e-3] = meanimg[stddevimg > 1.e-3] / stddevimg[stddevimg > 1.e-3] + img = nb.Nifti1Image(tsnr, img.get_affine(), header) + nb.save(img, op.abspath(self.inputs.tsnr_file)) + img = nb.Nifti1Image(meanimg, img.get_affine(), header) + nb.save(img, op.abspath(self.inputs.mean_file)) + img = nb.Nifti1Image(stddevimg, img.get_affine(), header) + nb.save(img, op.abspath(self.inputs.stddev_file)) return runtime def _list_outputs(self): outputs = self._outputs().get() - outputs['tsnr_file'] = self._gen_output_file_name() - outputs['mean_file'] = self._gen_output_file_name('mean') - outputs['stddev_file'] = self._gen_output_file_name('stddev') + for k in ['tsnr_file', 'mean_file', 'stddev_file']: + outputs[k] = op.abspath(getattr(self.inputs, k)) + if isdefined(self.inputs.regress_poly): - outputs['detrended_file'] = self._gen_output_file_name('detrended') + outputs['detrended_file'] = op.abspath(self.inputs.detrended_file) return outputs