Diff for "BatchRenderRfx" - MRC CBU Imaging Wiki
location: Diff for "BatchRenderRfx"
Differences between revisions 1 and 15 (spanning 14 versions)
Revision 1 as of 2006-10-01 20:12:08
Size: 4890
Comment:
Revision 15 as of 2008-03-12 13:27:09
Size: 8613
Editor: pc0302
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
Modified version Ferath's script to threshhold and print SPM5 results.
The script prints rendered activations as well as a list of coordinates.
The first six blocks of lines are the ones you need to (or are most likely to
want to) change. Originally modified by DannyMitchell and subsequently by IanNimmoSmith.
Modified version Ferath's script to threshhold and print SPM5 results. The script prints glass brains and rendered activations as well as the first page of the results table. The lines in block (3) are the ones you need to (or are most likely to want to) change. Originally modified by DannyMitchell and subsequently by IanNimmoSmith.
Line 7: Line 4:
 1. Path to data, and where the results are printed
 {{{dataroot = '/imaging/dm01/TestReCon';}}}
 1. The program needs files attachment:cls_getRes.m and attachment:cls_getSPM2.m . For CBU people the following line should find them, otherwise you need to download them and point to their path. {{{addpath /imaging/dm01/MoreTools/spm2Batch}}}. Also, you should add a path to the custom spm_render_dm, which solves some of the issues of the default spm_render command {{{addpath /imaging/dm01/MEG/aaMEG}}}
Line 10: Line 6:
 1. Name of folder, in above directory, where analysis is
 {{{outputdir='';}}}
 1. Last updated 02/07 by DannyMitchell
Line 13: Line 8:
 1. Cell array of folder names in outputdir, containing the SPMs for each contrast
 {{{cond_dir={'EarlySmoothNoReCon'};}}}
 1. {{{
dataroot = ''; % path to data
anadirs = {''}; % name of folder(s), in above directory, where analysis is (useful if you have used several models in analysis)
cond_dir={''}; % cell array of folder names in outputdir, containing the SPMs for each contrast
% %%(AVG) Alternatively, save the data from your 'aamod_firstlevel_contrasts.m' file onto a 'contrast_names.mat' file and do the following:
% load contrast_names
% cond_dir=cname; %cname is the array of contrast names and their directory names in your second level analysis folder
Line 16: Line 16:
 1. Set the following variable to 'yes' to do a 2-tailed test and show rendered activations and deactivations (assumes that positive and negative second level contrasts have already been calculated; Glass brains will
 only show positive activations). Set it to 'no' to to a 1-tailed test and only calculate positive activations.
 {{{ShowDeactivations = 'no';}}}
outputfilesuffix='_RFX_Rendered.ps'
%{set the following variable to 'yes' to do a 2-tailed test and show
% rendered activations and deactivations (assumes that positive and negative
% second level contrasts have already been calculated; Glass brains will
% only show positive activations). Set it to 'no' to to a 1-tailed test
% and only calculate positive activations. %}
ShowDeactivations = 'no';
Threshold=0.05; % p threshold
ExtentThreshold=0; % minimum number of contiguous voxels
addpath /imaging/dm01/MoreTools/spm2Batch %{the program needs files cls_getRes.m and cls_getSPM2.m. For CBU people this line will find them, otherwise you need to download them and point to their path.%}
MCC='FDR'; % method for correcting for multiple comparisons : 'FWE','FDR', or 'none'
Brain='/imaging/local/spm/spm5/rend/render_smooth_average.mat'%render_single_subj.mat' %render_smooth_average.mat'; % the brain on which you want to render the results
Style=1; % Rendering Style: NaN=old, 1=normal, <1=brighter
Line 20: Line 30:
 1. p threshold
 {{{Threshold=0.05;}}}
% for results table
num=3; % number of maxima per cluster
dis=8; % distance among clusters (mm)}}}
Line 23: Line 34:
 1. Minimum number of contiguous voxels
 {{{ExtentThreshold=0;}}}
 2. {{{
%%%%%%% Do it:
for j = 1:size(anadirs,2)
    outputdir=anadirs{j};
Line 26: Line 39:
The program needs files cls_getRes.m and cls_getSPM2.m.
For CBU people this line will find them, otherwise you need to download them
and point to their path.
if exist(fullfile(dataroot,strcat(outputdir,outputfilesuffix)))==2
    delete(fullfile(dataroot,strcat(outputdir,outputfilesuffix)));
end;
Line 30: Line 43:
{{{addpath /imaging/dm01/MoreTools/spm2Batch}}}

Method for correcting for multiple comparisons : 'FWE','FDR', or 'none'
{{{MCC='FDR';}}}

The brain on which you want to render the results
{{{Brain='/imaging/local/spm/spm5/rend/render_smooth_average.mat';}}}

{{{%%%%%%% Do it:
if exist(fullfile(dataroot,strcat(outputdir,'_RFX_Rendered.ps')))==2
    delete(fullfile(dataroot,strcat(outputdir,'_RFX_Rendered.ps')));
end;
disp(strcat('Printing results to:...',fullfile(dataroot,strcat(outputdir,'_RFX_Rendered.ps'))))
Line 46: Line 46:
try q=defaults.units{3}; catch; defaults.units={'mm','mm','mm'}; end; % for some reason I had to add this line 15/01/07
Line 48: Line 49:
%- xSPM is a structure for the parameters %- xSPM is a structure for the parameters}}}
Line 50: Line 51:
 3. {{{
Line 61: Line 63:
clear SPM clear SPM}}}
Line 63: Line 65:
for i = 1:size(cond_dir,2)
    condir = fullfile(dataroot,outputdir,cond_dir{i});
    cd(condir);
    xSPM.spmmat = fullfile(condir,'SPM.mat'); % Get SPM path
    if ShowDeactivations(1)=='y'
        xSPM.u=0.025; % 2-tailed
        TailText='2-tailed, p<0.05';
    else
        xSPM.u=0.05; % 1-tailed
        TailText='1-tailed, p<0.05';
    end
    xSPM.k=0;
    bck_xSPM=xSPM;
    delete(gcf) % this is a bit annoying, but for some reason I had problems without it
    for i=2:-1:1
        xSPM= bck_xSPM; % Reset xSPM to default
        xSPM.Ic=i; %Set the current contrast Index
        [hReg,xSPM,SPM] = csl_getRes(xSPM);
        dat(3-i) = struct( 'XYZ', xSPM.XYZ,...
            't', xSPM.Z',...
            'mat', xSPM.M,...
            'dim', xSPM.DIM);
    end
    clear flipdat
    flipdat(1)=dat(2);
    if ShowDeactivations(1)=='y'
        flipdat(2)=dat(1);
    end
    try
        spm_render(flipdat,0.5,Brain);
        ann1=annotation('textbox',[0 .94 1 .06],'Color','r','String',{strcat('RFX results (',TailText,' correction=',MCC,', red=positive)'),strcat('Data:...',condir),strcat('Date:...',datestr(now,0))},'edge','none');
    catch
 4. {{{
    for i = 1:size(cond_dir,2)
        condir = fullfile(dataroot,outputdir,cond_dir{i});

        % Checks if there is a rendered file made for this contrast and deletes the old one
        if exist(strcat(condir,outputfilesuffix),'file')==2
            delete(strcat(condir,outputfilesuffix));
        end;

        cd(condir);
        xSPM.spmmat = fullfile(condir,'SPM.mat'); % Get SPM path

        %%%%%%%%% modified 080308 to run 2nd level contrasts if not found
        % Set significance thresholds and run t-tests if not done already
        load(xSPM.spmmat)
        if isempty(SPM.xCon)
            SPM.xCon = spm_FcUtil('Set',cond_dir{i},'T','c',1,SPM.xX.xKXs);
        end
        if lower(ShowDeactivations(1))=='y'
            xSPM.u=Threshold/2; % 2-tailed
            TailText=strcat('2-tailed, p<',num2str(Threshold));
            if length(SPM.xCon)<2
                SPM.xCon(end+1) = spm_FcUtil('Set',strcat('Negative_',cond_dir{i}),'T','c',-1,SPM.xX.xKXs);
            end
        else
            xSPM.u=Threshold; % 1-tailed
            TailText=strcat('1-tailed, p<',num2str(Threshold));
        end
        if isempty(SPM.xCon(1).Vcon)
            spm_contrasts(SPM);
        end
        %%%%%%%%%%%%%%

        xSPM.k=ExtentThreshold;
        bck_xSPM=xSPM;
        delete(gcf) % this is a bit annoying, but for some reason I had problems without it
        clear dat
        for con=2:-1:1 % get any negative tail first, so that glass brain ends up showing positive tail
            xSPM=bck_xSPM; % Reset xSPM to default
            xSPM.Ic=con; %Set the current contrast Index
            if strcmp(ShowDeactivations,'no') && con==2; continue; end;
            try
                [hReg,xSPM,SPM] = csl_getRes(xSPM);

                if exist('dat','var')
                    dat(end+1) = struct('XYZ', xSPM.XYZ,'t', xSPM.Z','mat', xSPM.M,'dim', xSPM.DIM);
                else
                    dat(1) = struct('XYZ', xSPM.XYZ,'t', xSPM.Z','mat', xSPM.M,'dim', xSPM.DIM);
                end
            catch
                xSPM.u=Threshold; % 1-tailed
                TailText=strcat('1-tailed, p<',num2str(Threshold));
            end
        end

        dat=circshift(dat,[1 1]);
Line 96: Line 123:
            spm_render(flipdat(1),0.5,Brain);             % should work if all tails tested have significant voxels
            spm_render_dm(dat,Style,Brain);
Line 100: Line 128:
                spm_render(flipdat(2),0.5,Brain);
                ann1=annotation('textbox',[0 .94 1 .06],'Color','r','String',{strcat('RFX results (',TailText,' correction=',MCC,', RED=NEGATIVE)'),strcat('Data:...',condir),strcat('Date:...',datestr(now,0))},'edge','none');
                % just render +ve tail if no significant -ve voxels
spm_render_dm(dat(1),Style,Brain);
                ann1=annotation('textbox',[0 .94 1 .06],'Color','r','String',{strcat('RFX results (',TailText,' correction=',MCC,', red=positive)'),strcat('Data:...',condir),strcat('Date:...',datestr(now,0))},'edge','none');
Line 103: Line 132:
                ann1=annotation('textbox',[0 .94 1 .06],'Color','r','String',{strcat('RFX results (',TailText,' correction=',MCC,') No significant effects'),strcat('Data:...',condir),strcat('Date:...',datestr(now,0))},'edge','none');                 try
                    % just render -ve tail if no significant +ve voxels
                    dat(1)=dat(2); dat(1).t=zeros(length(dat(1).XYZ),1); % set dat(1) as empty dat(2)
                    spm_render_dm(dat,Style,Brain);
                    ann1=annotation('textbox',[0 .94 1 .06],'Color','r','String',{strcat('RFX results (',TailText,' correction=',MCC,', blue=negative)'),strcat('Data:...',condir),strcat('Date:...',datestr(now,0))},'edge','none');
                catch
                    % probably no significant voxels
                    ann1=annotation('textbox',[0 .94 1 .06],'Color','r','String',{strcat('RFX results (',TailText,' correction=',MCC,') No significant effects'),strcat('Data:...',condir),strcat('Date:...',datestr(now,0))},'edge','none');
                end
Line 106: Line 143:

        try spm_print(strcat(condir,outputfilesuffix));
        catch fprintf('\nFailed to print! (check write permissions?)'); return
        end

        TabDat=spm_list('List',xSPM,hReg,num, dis);
        tot=0;
        for r=1:size(TabDat.dat,1)
            if ~isempty(TabDat.dat{r,4}); tot=tot+TabDat.dat{r,4};end
        end
        if tot>0
            delete(ann1);
            ann1=annotation('textbox',[0 .94 1 .06],'Color','r','String',{strcat('RFX results (',TailText,' correction=',MCC,')'),strcat('Data:...',condir),strcat('Date:...',datestr(now,0))},'edge','none');
            ann2=annotation('textbox',[0 0 1 .02],'Color','r','String',strcat('First page of table only. Total number of significant voxels=',num2str(tot)),'edge','none');
            try spm_print(strcat(condir,outputfilesuffix));
            catch fprintf('\nFailed to print! (check write permissions?)'); return
            end
            delete(ann2);
        end

        xSPM= bck_xSPM; % Reset xSPM to default
        delete(ann1);
Line 107: Line 166:
    spm_print(fullfile(dataroot,strcat(outputdir,'_RFX_Rendered.ps')));
    spm_list('List',xSPM,hReg);
    spm_print(fullfile(dataroot,strcat(outputdir,'_RFX_Rendered.ps')));
    xSPM= bck_xSPM; % Reset xSPM to default
    delete(ann1);
    fprintf('\nFinished.\nResults saved to: %s.\r',strcat(condir,outputfilesuffix));
Line 113: Line 168:
}}}

Modified version Ferath's script to threshhold and print SPM5 results. The script prints glass brains and rendered activations as well as the first page of the results table. The lines in block (3) are the ones you need to (or are most likely to want to) change. Originally modified by DannyMitchell and subsequently by IanNimmoSmith.

  1. The program needs files attachment:cls_getRes.m and attachment:cls_getSPM2.m . For CBU people the following line should find them, otherwise you need to download them and point to their path. addpath /imaging/dm01/MoreTools/spm2Batch. Also, you should add a path to the custom spm_render_dm, which solves some of the issues of the default spm_render command addpath /imaging/dm01/MEG/aaMEG

  2. Last updated 02/07 by DannyMitchell

  3. dataroot = ''; % path to data
    anadirs = {''}; % name of folder(s), in above directory, where analysis is (useful if you have used several models in analysis)
    cond_dir={''}; % cell array of folder names in outputdir, containing the SPMs for each contrast
    % %%(AVG) Alternatively, save the data from your 'aamod_firstlevel_contrasts.m' file onto a 'contrast_names.mat' file and do the following:
    % load contrast_names
    % cond_dir=cname; %cname is the array of contrast names and their directory names in your second level analysis folder
    
    outputfilesuffix='_RFX_Rendered.ps'
    %{set the following variable to 'yes' to do a 2-tailed test and show
    % rendered activations and deactivations (assumes that positive and negative
    % second level contrasts have already been calculated; Glass brains will
    % only show positive activations). Set it to 'no' to to a 1-tailed test
    % and only calculate positive activations. %}
    ShowDeactivations = 'no';
    Threshold=0.05; % p threshold
    ExtentThreshold=0; % minimum number of contiguous voxels
    addpath /imaging/dm01/MoreTools/spm2Batch %{the program needs files cls_getRes.m and cls_getSPM2.m. For CBU people this line will find them, otherwise you need to download them and point to their path.%}
    MCC='FDR'; % method for correcting for multiple comparisons : 'FWE','FDR', or 'none'
    Brain='/imaging/local/spm/spm5/rend/render_smooth_average.mat'%render_single_subj.mat' %render_smooth_average.mat'; % the brain on which you want to render the results
    Style=1; % Rendering Style: NaN=old, 1=normal, <1=brighter
    
    % for results table
    num=3;    % number of maxima per cluster
    dis=8;    % distance among clusters (mm)
  4. %%%%%%% Do it:
    for  j = 1:size(anadirs,2)
        outputdir=anadirs{j};
    
    if exist(fullfile(dataroot,strcat(outputdir,outputfilesuffix)))==2
        delete(fullfile(dataroot,strcat(outputdir,outputfilesuffix)));
    end;
    
    spm_defaults;
    global defaults
    defaults.modality='FMRI';
    try q=defaults.units{3}; catch; defaults.units={'mm','mm','mm'}; end; % for some reason I had to add this line 15/01/07
    
    %--------------------------------------------------------------------
    %- xSPM is a structure for the parameters
  5. xSPM = struct( ...
        'swd', '', ... % full path to SPM.mat file
        'Ic', [], ... % no of contrast (or contrasts for conjunction)
        'Im', [],... % no of contrast to mask with. Empty for no masking
        'pm', [],... % masking contrast uncorrected p
        'Ex', [],... % whether masking is inclusive or exclusive
        'title', '',... % if empty results in default contrast title
        'Mcp', MCC,... % Mutiple comp method: FWE|FDR|none
        'u', Threshold,... % threshold (corrected or uncorrected, as above)
        'k', ExtentThreshold); % extent threshold
    
    clear SPM

CbuImaging: BatchRenderRfx (last edited 2013-03-07 21:24:07 by localhost)