Source code for nipy.interfaces.spm

# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
# vi: set ft=python sts=4 ts=4 sw=4 et:
''' Interfaces to SPM '''
from __future__ import with_statement
from __future__ import absolute_import

import os

import numpy as np

from scipy.io import savemat

from nibabel import load
from nibabel.tmpdirs import InTemporaryDirectory

from .matlab import run_matlab_script


[docs]class SpmInfo(object):
[docs] def __init__(self): self._spm_path = None self._spm_ver = None
def _set_properties(self): with InTemporaryDirectory(): run_matlab_script(r""" spm_path = spm('dir'); spm_ver = spm('ver'); fid = fopen('spm_stuff.txt', 'wt'); fprintf(fid, '%s\n', spm_path); fprintf(fid, '%s\n', spm_ver); fclose(fid); """) with open('spm_stuff.txt', 'rt') as fobj: lines = fobj.readlines() self._spm_path = lines[0].strip() self._spm_ver = lines[1].strip() @property def spm_path(self): if self._spm_path is None: self._set_properties() return self._spm_path @property def spm_ver(self): if self._spm_ver is None: self._set_properties() return self._spm_ver
spm_info = SpmInfo()
[docs]def make_job(jobtype, jobname, contents): return {'jobs':[{jobtype:[{jobname:contents}]}]}
# XXX this should be moved into a matdict class or something
[docs]def fltcols(vals): ''' Trivial little function to make 1xN float vector ''' return np.atleast_2d(np.array(vals, dtype=float))
[docs]def run_jobdef(jobdef): script = """ load pyjobs; spm_jobman('run', jobs); """ # Need initcfg for SPM8 if spm_info.spm_ver != 'SPM5': script = "spm_jobman('initcfg');\n" + script with InTemporaryDirectory(): savemat('pyjobs.mat', jobdef, oned_as='row') run_matlab_script(script)
[docs]def scans_for_fname(fname): img = load(fname) n_scans = img.shape[3] scans = np.zeros((n_scans, 1), dtype=object) for sno in range(n_scans): scans[sno] = '%s,%d' % (fname, sno+1) return scans
[docs]def scans_for_fnames(fnames): n_sess = len(fnames) sess_scans = np.zeros((1,n_sess), dtype=object) for sess in range(n_sess): sess_scans[0,sess] = scans_for_fname(fnames[sess]) return sess_scans
[docs]def fname_presuffix(fname, prefix='', suffix='', use_ext=True): pth, fname = os.path.split(fname) fname, ext = os.path.splitext(fname) if not use_ext: ext = '' return os.path.join(pth, prefix+fname+suffix+ext)
[docs]def fnames_presuffix(fnames, prefix='', suffix=''): f2 = [] for fname in fnames: f2.append(fname_presuffix(fname, prefix, suffix)) return f2