% Modified version of Ferath's script to threshhold and print SPM5 second
% level results.
% Prints rendered activations as well as a list of coordinates.
% The first 11 lines are the ones you need to (or are most likely to
% want to) change.
% djm 03/08

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 (0.75 = light, 0.5 = more, 0.25 = lots)

% for results table
num=3;    % number of maxima per cluster
dis=8;    % distance among clusters (mm)
doaal = 0; % Label anatomical clusters with AAL? 1=yes 0=no
ignore_empty = 1 % (AVG) Create a file if there are no significant voxels? 1=yes 0=no

%%%%%%% 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


    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

    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]);

        try
            % should work if all tails tested have significant voxels
            spm_render_dm(dat,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');
        catch
            try
                % 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');
            catch
                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');
                    if ignore_empty == 0
                        %%(AVG) Alternatively: probably no need to draw, so do next contrast rather than print this one
                        continue;
                    end
                end
            end
        end

        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

        %Following section borrowed from Mirjana Bozic's script
        if doaal == 1
            % SPM_print anatomical labels for clusters using batch-enabled AAL scripts
            gin_clusters_plabels_auto('List',xSPM);
            spm_print(strcat(condir,outputfilesuffix));
        end

        xSPM= bck_xSPM; % Reset xSPM to default
        delete(ann1);
    end
    fprintf('\nFinished.\nResults saved to: %s.\r',strcat(condir,outputfilesuffix));
end