SPM batching

The trick to making SPM batches is using the job manager. In the graphics window, click Batch in the TASKS menu. This opens a GUI in which an analysis tree can be specified and saved to a mat file. Loading the mat file shows that it contains a cell array called job. Browsing through job shows how SPM saves the analysis options given using the GUI. The cell array can be used as an argument in spm_job('run', job), which performs the specified analysis on the specified scans. What we want is to apply the analysis to different files. This requires adjusting the relevant fields in the cells of job (including the location of the template for normalization if you change computers!). The code below shows how to adjust a standard analysis saved in the zipped batch.mat. The analysis uses onsets etc saved in multivar files.

function custom_spm_analysis_batch

load batch;

n = 1;
dirlist{n} = 'D:\fMRI\Images\subject1\taskscans\subjectID1*.img';
reslist{n} = 'D:\fMRI\Images\subject1\results';
mv_file{n} = 'D:\fMRI\Performance\multivar_subject1.mat';
anatomy{n} = 'D:\fMRI\Images\subject1\anatomy\subject1_anatomy.img,1';
n = n + 1;

dirlist{n} = 'D:\fMRI\Images\subject2\taskscans\subjectID2*.img';
reslist{n} = 'D:\fMRI\Images\subject2\results';
mv_file{n} = 'D:\fMRI\Performance\multivar_subject2.mat';
anatomy{n} = 'D:\fMRI\Images\subject2\anatomy\subject2_anatomy.img,1';
n = n + 1;

for iDir = 1:length(dirlist),
    [p, n, e] = fileparts(dirlist{iDir});
    cd(p);
    x = dir([n e]);
    scans = {};
    ascans = {};
    wascans = {};
    swascans = {};
    for iFile = 1:length(x),
        scans{iFile} = [p '\' x(iFile).name ',1'];
        ascans{iFile} = [p '\' 'a' x(iFile).name];
        wascans{iFile} = [p '\' 'wa' x(iFile).name];
        swascans{iFile} =[p '\' 'swa' x(iFile).name];
    end;
    % slice time correction
    jobs{1}.temporal{1}.st.scans{1} = scans;
    % realign
    jobs{2}.spatial{1}.realign{1}.estimate.data{1} = ascans;
    % coreg
    jobs{2}.spatial{2}.coreg{1}.estimate.ref{1} = anatomy{iDir};
    jobs{2}.spatial{2}.coreg{1}.estimate.source{1} = ascans{1};
    jobs{2}.spatial{2}.coreg{1}.estimate.other = ascans;
    % normalize
    jobs{2}.spatial{3}.normalise{1}.estwrite.subj.source{1} = anatomy{iDir};
    jobs{2}.spatial{3}.normalise{1}.estwrite.subj.resample = ascans;
    n0 = length(jobs{2}.spatial{3}.normalise{1}.estwrite.subj.resample);
    jobs{2}.spatial{3}.normalise{1}.estwrite.subj.resample{n0 + 1} = anatomy{iDir};
    % smooth
    jobs{2}.spatial{4}.smooth.data = wascans;
    % stats: spec
    jobs{3}.stats{1}.fmri_spec.dir{1} = reslist{iDir};
    for nn = 1:length(swascans),
        jobs{3}.stats{1}.fmri_spec.sess.scans{nn, 1} = swascans{nn};
    end;
    jobs{3}.stats{1}.fmri_spec.sess.multi{1} = mv_file{iDir};
    % stats: estimate
    jobs{3}.stats{2}.fmri_est.spmmat{1} = [reslist{iDir} '\SPM.mat'];
    % stats: contrasts
    jobs{3}.stats{3}.con.spmmat{1} = [reslist{iDir} '\SPM.mat'];
    % run the job
    spm_jobman('run', jobs);
end;