''' Interfaces to SPM ''' from __future__ import with_statement import os import numpy as np from scipy.io import savemat from nipy.utils import InTemporaryDirectory, setattr_on_read from nipy.io.imageformats import load from nipy.interfaces.matlab import run_matlab_script class SpmInfo(object): @setattr_on_read def spm_path(self): with InTemporaryDirectory() as tmpdir: run_matlab_script(""" spm_path = spm('dir'); fid = fopen('spm_path.txt', 'wt'); fprintf(fid, '%s', spm_path); fclose(fid); """) spm_path = file('spm_path.txt', 'rt').read() return spm_path spm_info = SpmInfo() def make_job(jobtype, jobname, contents): return {'jobs':[{jobtype:[{jobname:contents}]}]} # XXX this should be moved into a matdict class or something def fltcols(vals): ''' Trivial little function to make 1xN float vector ''' return np.atleast_2d(np.array(vals, dtype=float)) def run_jobdef(jobdef): with InTemporaryDirectory(): savemat('pyjobs.mat', jobdef) run_matlab_script(""" load pyjobs; spm_jobman('run', jobs); """) def scans_for_fname(fname): img = load(fname) n_scans = img.get_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 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 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) def fnames_presuffix(fnames, prefix='', suffix=''): f2 = [] for fname in fnames: f2.append(fname_presuffix(fname, prefix, suffix)) return f2