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;