JiscMail Logo
Email discussion lists for the UK Education and Research communities

Help for SPM Archives


SPM Archives

SPM Archives


SPM@JISCMAIL.AC.UK


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Monospaced Font

LISTSERV Archives

LISTSERV Archives

SPM Home

SPM Home

SPM  2006

SPM 2006

Options

Subscribe or Unsubscribe

Subscribe or Unsubscribe

Log In

Log In

Get Password

Get Password

Subject:

Re: export clusters to a file?

From:

Joel Dunn <[log in to unmask]>

Reply-To:

Joel Dunn <[log in to unmask]>

Date:

Mon, 3 Apr 2006 13:11:24 +0100

Content-Type:

multipart/mixed

Parts/Attachments:

Parts/Attachments

text/plain (59 lines) , spm_results_ui_report.m (1060 lines) , cluster_info.m (74 lines)

Steven,
The simplest way is to use the VOI button. Then look at the Matlab
workspace variables Y, xY.XYZmm and xY.y for the weighted mean, cluster
coordinates and raw data, respectively.

Alternatively you can use these M-files I wrote for PET analysis.
spm_results_ui_report.m is a modified version of spm_results_ui.m
(unfortunately I couldn't find a way to do it without modifying it).

Run SPM, then run
 >> clust=cluster_info(SPM)
where SPM is the loaded SPM.mat structure.

It will run through all clusters defined by the contrast number,
p-value, p-method and extent threshold defined at the top of
cluster_info.m. The values of Y, xY.XYZmm and xY.y will be stored in the
cell array structure 'clust' for each cluster.

It shouldn't be too hard to set loops for multiple thresholds (or add
these as input arguments).

Joel

-----------------------------------------------
Joel Dunn
Research Assistant
PET Imaging Centre
Guy's, King's and St Thomas' School of Medicine
Lower Ground Floor, Lambeth Wing,
St Thomas' Hospital, Lambeth Palace Road,
London SE1 7EH UK Tel: 020 7188 7445
Email: [log in to unmask] Fax: 020 7620 0790
-----------------------------------------------



Steven WU wrote:
> HI SPMusers,
>
> Do you know how to export the clusters coordiantes and size for the result view to a file. Can we do multi-threasholds for uncorrected and corrected p-values? Thank you very much!
>
>
> Steven Wu
>
> --
> Ph.D.
>
> Laboratory of Image Science & Technology (LIST),
> Department of Biomedical Engineering,
> Southeast University,
> Nanjing, Jiangsu Province,
> P.R. of China,210096
> Phone: +86-25-3794249
> Fax: +86-26-3792698
>
>
>


function varargout = spm_results_ui_report_report(varargin)
% User interface for SPM/PPM results: Display and analysis of regional effects
% FORMAT [hReg,xSPM,SPM] = spm_results_ui_report
%
% Created by Joeld 13 Dec 2005
% Adapted from spm_results_ui for spm_result_report
%________________________________________________________________________________
%
% hReg - handle of MIP XYZ registry object
% (see spm_XYZreg for details)
% xSPM - structure containing specific SPM, distribution & filtering details
% (see spm_getSPM.m for contents)
% SDM - SPM structure containing generic parameters
% (see spm_spm.m for contents...
%
% NB: Results section GUI CallBacks use these data structures by name, which
% therefore *must* be assigned to the correctly named variables.
%_______________________________________________________________________
%
% The SPM results section is for the interactive exploration and
% characterisation of the results of a statistical analysis.
%
% The user is prompted to select a SPM{T} or SPM{F}, that is
% thresholded at user specified levels. The specification of the
% contrasts to use and the height and size thresholds are described in
% spm_getSPM.m. The resulting SPM is then displayed in the graphics
% window as a maximum intensity projection, alongside the design matrix
% and contrasts employed.
%
% The cursors in the MIP can be moved (dragged) to select a particular
% voxel. The three mouse buttons give different drag and drop behaviour:
% Button 1 - point & drop; Button 2 - "dynamic" drag & drop with
% co-ordinate & SPM value updating; Button 3 - "magnetic" drag & drop,
% where the cursor jumps to the nearest suprathreshold voxel in the
% MIP, and shows the value there. (See spm_mip_ui.m, the MIP GUI handling
% function for further details.)
%
% The design matrix and contrast pictures are "surfable": Click and
% drag over the images to report associated data. Clicking with
% different buttons produces different results. Double-clicking
% extracts the underlying data into the base workspace.
% See spm_DesRep for further details.
%
% The current voxel specifies the voxel, suprathreshold cluster, or
% orthogonal planes (planes passing through that voxel) for subsequent
% localised utilities.
%
% A control panel in the interactive window enables interactive
% exploration of the results.
%
% p-value buttons:
% (i) volume - Tabulates p-values and statistics for entire volume.
% - see spm_list.m
% (ii) cluster - Tabulates p-values and statistics for nearest cluster
% - Note that the cursor will jump to the nearest
% suprathreshold voxel, if it is not already at a
% location with suprathreshold statistic.
% - see spm_list.m
% (iii) voxel - (not implemented yet)
% - see spm_****.m
%
% p-values for VOI button:
% S.V.C - Small Volume Correction:
% Tabulates p-values corrected for a small specified
% volume of interest. (Tabulation by spm_list.m)
% - see spm_VOI.m
%
% Data extraction buttons:
% V.O.I. - Extracts Eigentimeseries for small volumes of interest.
% - Data can be adjusted or not.
% - If temporal filtering was specified (fMRI), then it is the
% filtered data that is returned.
% - Choose a VOI of radius 0 to extract the (filtered &)
% adjusted data for a single voxel. Note that this vector
% will be scaled to have a 2-norm of 1. (See spm_regions.m
% for further details.)
% - The plot button also returns fitted and adjusted
% (after any filtering) data for the voxel being plotted.)
% - Note that the cursor will jump to the nearest voxel for
% which raw data was saved.
% - see spm_regions.m
%
% Visualisation buttons:
% (i) plot - Graphs of adjusted and fitted activity against
% various ordinates.
% - Note that the cursor will jump to the nearest
% suprathreshold voxel, if it is not already at a
% location with suprathreshold statistic.
% - Additionally, returns fitted and adjusted data to the
% MatLab base workspace.
% - see spm_graph.m
% (ii) overlays - Popup menu: Overlays of filtered SPM on a structural image
% - slices - Slices of the thresholded statistic image overlaid
% on a secondary image chosen by the user. Three
% transverse slices are shown, being those at the
% level of the cursor in the z-axis and the two
% adjacent to it. - see spm_transverse.m
% - sections - Orthogonal sections of the thresholded statistic
% image overlaid on a secondary image chosen by the user.
% The sections are through the cursor position.
% - see spm_sections.m
% - render - Render blobs on previously extracted cortical surface
% - see spm_render.m
% (iii) write filtered - Write out thresholded SPM as image
% - see spm_write_filtered.m
%
%
% The current cursor location can be set by editing the co-ordinate
% widgets at the bottom of the interactive window. (Note that many of the
% results section facilities are "linked" and can update co-ordinates. E.g.
% clicking on the co-ordinates in a p-value listing jumps to that location.)
%
% Graphics appear in the bottom half of the graphics window, additional
% controls and questions appearing in the interactive window.
%
% ----------------
%
% The MIP uses a template outline in Talairach space. Consequently for
% the results section to display properly the input images to the
% statistics section should either be in Talairach space (with the
% ORIGIN correctly specified), or the ORIGIN header fields should be
% set to the voxel coordinates of the anterior commissure in the input
% images. See spm_format.man ("Data Format" in the help facility) for
% further details of the Analyze image format used by SPM.
%
% Similarly, secondary images should be aligned with the input images
% used for the statistical analysis. In particular the ORIGIN must
% correspond to (0,0,0) in XYZ, the vector of locations.
%
% ----------------
%
% In addition to setting up the results section, spm_results_ui_report.m sets
% up the results section GUI and services the CallBacks. FORMAT
% specifications for embedded CallBack functions are given in the main
% body of the code.
%_______________________________________________________________________
% @(#)spm_results_ui_report.m 2.42 Karl Friston, Andrew Holmes 03/02/28
SCCSid = '2.42';

%=======================================================================
% - FORMAT specifications for embedded CallBack functions
%=======================================================================
%( This is a multi function function, the first argument is an action )
%( string, specifying the particular action function to take. )
%
% spm_results_ui_report sets up and handles the SPM results graphical user
% unterface, initialising an XYZ registry (see spm_XYZreg.m) to co-ordinate
% locations between various location controls.
%
%_______________________________________________________________________
%
% FORMAT hReg = spm_results_ui_report('SetupGUI',M,DIM,xSPM,Finter)
% Setup results GUI in Interactive window
% M - 4x4 transformation matrix relating voxel to "real" co-ordinates
% DIM - 3 vector of image X, Y & Z dimensions
% xSPM - structure containing xSPM. Required fields are:
% .Z - minimum of n Statistics {filtered on u and k}
% .XYZmm - location of voxels {mm}
% Finter - handle (or 'Tag') of Interactive window (default 'Interactive')
% hReg - handle of XYZ registry object
%
% FORMAT spm_results_ui_report('DrawButts',hReg,DIM,Finter,WS,FS)
% Draw GUI buttons
% hReg - handle of XYZ registry object
% DIM - 3 vector of image X, Y & Z dimensions
% Finter - handle of Interactive window
% WS - WinScale [Default spm('WinScale') ]
% FS - FontSizes [Default spm('FontSizes')]
%
% FORMAT hFxyz = spm_results_ui_report('DrawXYZgui',M,DIM,xSPM,xyz,Finter)
% Setup editable XYZ control widgets at foot of Interactive window
% M - 4x4 transformation matrix relating voxel to "real" co-ordinates
% DIM - 3 vector of image X, Y & Z dimensions
% xSPM - structure containing SPM. Required fields are:
% .Z - minimum of n Statistics {filtered on u and k}
% .XYZmm - location of voxels {mm}
% xyz - Initial xyz location {mm}
% Finter - handle of Interactive window
% hFxyz - handle of XYZ control - the frame containing the edit widgets
%
% FORMAT spm_results_ui_report('EdWidCB')
% Callback for editable XYZ control widgets
%
% FORMAT spm_results_ui_report('UpdateSPMval',hFxyz)
% FORMAT spm_results_ui_report('UpdateSPMval',UD)
% Updates SPM value string in Results GUI (using data from UserData of hFxyz)
% hFxyz - handle of frame enclosing widgets - the Tag object for this control
% UD - XYZ data structure (UserData of hFxyz).
%
% FORMAT xyz = spm_results_ui_report('GetCoords',hFxyz)
% Get current co-ordinates from editable XYZ control
% hFxyz - handle of frame enclosing widgets - the Tag object for this control
% xyz - current co-ordinates {mm}
% NB: When using the results section, should use XYZregistry to get/set location
%
% FORMAT [xyz,d] = spm_results_ui_report('SetCoords',xyz,hFxyz,hC)
% Set co-ordinates to XYZ widget
% xyz - (Input) desired co-ordinates {mm}
% hFxyz - handle of XYZ control - the frame containing the edit widgets
% hC - handle of calling object, if used as a callback. [Default 0]
% xyz - (Output) Desired co-ordinates are rounded to nearest voxel if hC
% is not specified, or is zero. Otherwise, caller is assummed to
% have checked verity of desired xyz co-ordinates. Output xyz returns
% co-ordinates actually set {mm}.
% d - Euclidean distance between desired and set co-ordinates.
% NB: When using the results section, should use XYZregistry to get/set location
%
% FORMAT hFxyz = spm_results_ui_report('FindXYZframe',h)
% Find/check XYZ edit widgets frame handle, 'Tag'ged 'hFxyz'
% h - handle of frame enclosing widgets, or containing figure [default gcf]
% If isstr(h), then uses spm_figure('FindWin',h) to locate named figures
% hFxyz - handle of confirmed XYZ editable widgets control
% Errors if hFxyz is not an XYZ widget control, or a figure containing
% a unique such control
%
% FORMAT spm_results_ui_report('PlotUi',hAx)
% GUI for adjusting plot attributes - Sets up controls just above results GUI
% hAx - handle of axes to work with
%
% FORMAT spm_results_ui_report('PlotUiCB')
% CallBack handler for Plot attribute GUI
%
% FORMAT Fgraph = spm_results_ui_report('Clear',F,mode)
% Clears results subpane of Graphics window, deleting all but semi-permanent
% results section stuff
% F - handle of Graphics window [Default spm_figure('FindWin','Graphics')]
% mode - 1 [default] - clear results subpane
% - 0 - clear results subpane and hide results stuff
% - 2 - clear, but respect 'NextPlot' 'add' axes
% (which is set by `hold on`)
% Fgraph - handle of Graphics window
%
% FORMAT hMP = spm_results_ui_report('LaunchMP',M,DIM,hReg,hBmp)
% Prototype callback handler for integrating MultiPlanar toolbox
%
% FORMAT spm_results_ui_report('Delete',h)
% deletes HandleGraphics objects, but only if they're valid, thus avoiding
% warning statements from MatLab!
%_______________________________________________________________________


%-Condition arguments
%-----------------------------------------------------------------------
if nargin == 0, Action='SetUp'; else, Action=varargin{1}; end

%=======================================================================
switch lower(Action), case 'setup' %-Set up results
%=======================================================================
SPM=varargin{2};
iCon=varargin{3};
pstr=varargin{4};
pval=varargin{5};
kthr=varargin{6};

%-Initialise
%-----------------------------------------------------------------------
SPMid = spm('FnBanner',mfilename,SCCSid);
[Finter,Fgraph,CmdLine] = spm('FnUIsetup','Stats: Results');
FS = spm('FontSizes');

% clear satfig if it exists
%-----------------------------------------------------------------------
hSat = findobj('tag','Satellite');
spm_figure('clear',hSat);

%-Get thresholded xSPM data and parameters of design
%=======================================================================
[xSPM] = spm_getSPM_read(SPM,iCon,pstr,pval,kthr);
M = SPM.xVol.M;
DIM = SPM.xVol.DIM;

% ensure pwd = swd so that relative filenames are valid
%-----------------------------------------------------------------------
cd(SPM.swd)

%-Setup Results User Interface; Display MIP, design matrix & parameters
%=======================================================================
spm('FigName',['SPM{',xSPM.STAT,'}: Results'],Finter,CmdLine);


%-Setup results GUI
%-----------------------------------------------------------------------
spm_figure('Clear',Finter)
hReg = spm_results_ui_report('SetupGUI',M,DIM,xSPM,Finter);

%-Setup design interrogation menu
%-----------------------------------------------------------------------
hDesRepUI = spm_DesRep('DesRepUI',SPM);
figure(Finter)

%-Setup Maximium intensity projection (MIP) & register
%-----------------------------------------------------------------------
hMIPax = axes('Parent',Fgraph,'Position',[0.05 0.60 0.55 0.36],'Visible','off');
hMIPax = spm_mip_ui(xSPM.Z,xSPM.XYZmm,M,DIM,hMIPax);
spm_XYZreg('XReg',hReg,hMIPax,'spm_mip_ui');
if xSPM.STAT == 'P'
str = xSPM.STATstr;
else
str = ['SPM\{',xSPM.STATstr,'\}'];
end
text(240,260,str,...
'Interpreter','TeX',...
'FontSize',FS(14),'Fontweight','Bold',...
'Parent',hMIPax)


%-Print comparison title
%-----------------------------------------------------------------------
hTitAx = axes('Parent',Fgraph,...
'Position',[0.02 0.95 0.96 0.02],...
'Visible','off');

text(0.5,0,xSPM.title,'Parent',hTitAx,...
'HorizontalAlignment','center',...
'VerticalAlignment','baseline',...
'FontWeight','Bold','FontSize',FS(14))


%-Print SPMresults: Results directory & thresholding info
%-----------------------------------------------------------------------
hResAx = axes('Parent',Fgraph,...
'Position',[0.05 0.55 0.45 0.05],...
'DefaultTextVerticalAlignment','baseline',...
'DefaultTextFontSize',FS(9),...
'DefaultTextColor',[1,1,1]*.7,...
'Units','points',...
'Visible','off');
AxPos = get(hResAx,'Position'); set(hResAx,'YLim',[0,AxPos(4)])
h = text(0,24,'SPMresults:','Parent',hResAx,...
'FontWeight','Bold','FontSize',FS(14));
text(get(h,'Extent')*[0;0;1;0],24,spm_str_manip(SPM.swd,'a30'),'Parent',hResAx)
text(0,12,sprintf('Height threshold %c = %0.2f',xSPM.STAT,xSPM.u),'Parent',hResAx)
text(0,00,sprintf('Extent threshold k = %0.0f voxels',xSPM.k), 'Parent',hResAx)


%-Plot design matrix
%-----------------------------------------------------------------------
hDesMtx = axes('Parent',Fgraph,'Position',[0.65 0.55 0.25 0.25]);
hDesMtxIm = image((SPM.xX.nKX + 1)*32);
xlabel('Design matrix')
set(hDesMtxIm,'ButtonDownFcn','spm_DesRep(''SurfDesMtx_CB'')',...
'UserData',struct(...
'X', SPM.xX.xKXs.X,...
'fnames', {reshape({SPM.xY.VY.fname},size(SPM.xY.VY))},...
'Xnames', {SPM.xX.name}))

%-Plot contrasts
%-----------------------------------------------------------------------
nPar = size(SPM.xX.X,2);
xx = [repmat([0:nPar-1],2,1);repmat([1:nPar],2,1)];
nCon = length(xSPM.Ic);
xCon = SPM.xCon;
if nCon
dy = 0.15/max(nCon,2);
hConAx = axes('Position',[0.65 (0.80 + dy*.1) 0.25 dy*(nCon-.1)],...
'Tag','ConGrphAx','Visible','off');
title('contrast(s)')
htxt = get(hConAx,'title');
set(htxt,'Visible','on','HandleVisibility','on')
end

for ii = nCon:-1:1
    axes('Position',[0.65 (0.80 + dy*(nCon - ii +.1)) 0.25 dy*.9])
    if xCon(xSPM.Ic(ii)).STAT == 'T' & size(xCon(xSPM.Ic(ii)).c,2) == 1

%-Single vector contrast for SPM{t} - bar
%---------------------------------------------------------------
yy = [zeros(1,nPar);repmat(xCon(xSPM.Ic(ii)).c',2,1);zeros(1,nPar)];
h = patch(xx,yy,[1,1,1]*.5);
set(gca,'Tag','ConGrphAx',...
'Box','off','TickDir','out',...
'XTick',spm_DesRep('ScanTick',nPar,10) - 0.5,'XTickLabel','',...
'XLim', [0,nPar],...
'YTick',[-1,0,+1],'YTickLabel','',...
'YLim',[min(xCon(xSPM.Ic(ii)).c),max(xCon(xSPM.Ic(ii)).c)] +...
[-1 +1] * max(abs(xCon(xSPM.Ic(ii)).c))/10 )

    else

%-F-contrast - image
%---------------------------------------------------------------
h = image((xCon(xSPM.Ic(ii)).c'/max(abs(xCon(xSPM.Ic(ii)).c(:)))+1)*32);
set(gca,'Tag','ConGrphAx',...
'Box','on','TickDir','out',...
'XTick',spm_DesRep('ScanTick',nPar,10),'XTickLabel','',...
'XLim', [0,nPar]+0.5,...
'YTick',[0:size(SPM.xCon(xSPM.Ic(ii)).c,2)]+0.5,....
'YTickLabel','',...
'YLim', [0,size(xCon(xSPM.Ic(ii)).c,2)]+0.5 )

    end
    ylabel(num2str(xSPM.Ic(ii)))
    set(h,'ButtonDownFcn','spm_DesRep(''SurfCon_CB'')',...
     'UserData', struct( 'i', xSPM.Ic(ii),...
     'h', htxt,...
     'xCon', xCon(xSPM.Ic(ii))))
end


%-Store handles of results section Graphics window objects
%-----------------------------------------------------------------------
H = get(Fgraph,'Children');
H = findobj(H,'flat','HandleVisibility','on');
H = findobj(H);
Hv = get(H,'Visible');
set(hResAx,'Tag','PermRes','UserData',struct('H',H,'Hv',{Hv}))


%-Finished results setup
%-----------------------------------------------------------------------
varargout = {hReg,xSPM,SPM};
spm('Pointer','Arrow')


%=======================================================================
case 'setupgui' %-Set up results section GUI
%=======================================================================
% hReg = spm_results_ui_report('SetupGUI',M,DIM,xSPM,Finter)
if nargin < 5, Finter='Interactive'; else, Finter = varargin{5}; end
if nargin < 4, error('Insufficient arguments'), end
M = varargin{2};
DIM = varargin{3};
Finter = spm_figure('GetWin',Finter);
WS = spm('WinScale');
FS = spm('FontSizes');

%-Create frame for Results GUI objects
%-----------------------------------------------------------------------
hReg = uicontrol(Finter,'Style','Frame','Position',[001 001 400 190].*WS,...
'BackgroundColor',spm('Colour'));
hFResUi = uicontrol(Finter,'Style','Frame','Position',[008 007 387 178].*WS);

%-Initialise registry in hReg frame object
%-----------------------------------------------------------------------
[hReg,xyz] = spm_XYZreg('InitReg',hReg,M,DIM,[0;0;0]);

%-Setup editable XYZ widgets & cross register with registry
%-----------------------------------------------------------------------
hFxyz = spm_results_ui_report('DrawXYZgui',M,DIM,varargin{4},xyz,Finter);
spm_XYZreg('XReg',hReg,hFxyz,'spm_results_ui_report');

%-Set up buttons for results functions
%-----------------------------------------------------------------------
spm_results_ui_report('DrawButts',hReg,DIM,Finter,WS,FS);

varargout = {hReg};


%=======================================================================
case 'drawbutts' %-Draw results section buttons in Interactive window
%=======================================================================
% spm_results_ui_report('DrawButts',hReg,DIM,Finter,WS,FS)
%
if nargin<3, error('Insufficient arguments'), end
hReg = varargin{2};
DIM = varargin{3};
if nargin<4, Finter = spm_figure('FindWin','Interactive');
else, Finter = varargin{4}; end
if nargin < 5, WS = spm('WinScale'); else, WS = varargin{5}; end
if nargin < 6, FS = spm('FontSizes'); else, FS = varargin{6}; end
PF = spm_platform('fonts');

%-p-values
%-----------------------------------------------------------------------
uicontrol(Finter,'Style','Frame','Position',[010 090 110 085].*WS)
uicontrol(Finter,'Style','Text','String','p-values',...
'Position',[020 168 050 015].*WS,...
'FontName',PF.times,'FontWeight','Normal','FontAngle','Italic',...
'FontSize',FS(10),...
'HorizontalAlignment','Left',...
'ForegroundColor','w')
uicontrol(Finter,'Style','PushButton','String','volume','FontSize',FS(10),...
'ToolTipString',...
'tabulate summary of local maxima, p-values & statistics',...
'Callback','spm_list(''List'',xSPM,hReg);',...
'Interruptible','on','Enable','on',...
'Position',[015 145 100 020].*WS)
uicontrol(Finter,'Style','PushButton','String','cluster','FontSize',FS(10),...
'ToolTipString',...
'tabulate p-values & statistics for local maxima of nearest cluster',...
'Callback','spm_list(''ListCluster'',xSPM,hReg);',...
'Interruptible','on','Enable','on',...
'Position',[015 120 100 020].*WS)
uicontrol(Finter,'Style','PushButton','String','S.V.C.','FontSize',FS(10),...
'ToolTipString',['Small Volume Correction - corrected p-values ',...
'for a small search region'],...
'Callback','spm_VOI(SPM,xSPM,hReg);',...
'Interruptible','on','Enable','on',...
'Position',[015 095 100 020].*WS)


%-SPM area - used for Volume of Interest
%-----------------------------------------------------------------------
uicontrol(Finter,'Style','Frame','Position',[125 090 150 085].*WS)
uicontrol(Finter,'Style','Text','String','Regional responses',...
'Position',[135 168 94 015].*WS,...
'FontName',PF.times,'FontWeight','Normal','FontAngle','Italic',...
'FontSize',FS(10),...
'HorizontalAlignment','Left',...
'ForegroundColor','w')
uicontrol(Finter,'Style','PushButton','String','VOI',...
'Position',[130 100 140 060].*WS,...
'ToolTipString',...
'Responses in volume of interest',...
'Callback','[Y,xY] = spm_regions(xSPM,SPM,hReg)',...
'Interruptible','on','Enable','on',...
'FontName',PF.times,'FontWeight','Bold','FontAngle','Italic',...
'FontSize',FS(32),...
'HorizontalAlignment','Center',...
'ForegroundColor',[1,1,1]*.5)

%-Hemodynamic modeling
%-----------------------------------------------------------------------
uicontrol(Finter,'Style','Frame','Position',[125 050 150 030].*WS)
global defaults
if strcmp(defaults.modality,'FMRI')
uicontrol(Finter,'Style','PushButton','String','Hemodynamics',...
'FontSize',FS(10),...
'ToolTipString','Hemodynamic modeling of regional response',...
'Callback','[Ep,Cp,K1,K2] = spm_hdm_ui(xSPM,SPM,hReg);',...
'Interruptible','on','Enable','on',...
'Position',[130 055 140 020].*WS,...
'ForegroundColor','r');
end

%-Not currently used
%-----------------------------------------------------------------------
uicontrol(Finter,'Style','Frame','Position',[010 050 110 030].*WS)
if strcmp(defaults.modality,'FMRI')
uicontrol(Finter,'Style','PushButton','String',' ','FontSize',FS(10),...
'ToolTipString',' ',...
'Callback',' ',...
'Interruptible','on','Enable','on',...
'Position',[015 055 100 020].*WS)
end

%-Visualisation
%-----------------------------------------------------------------------
uicontrol(Finter,'Style','Frame','Position',[280 090 110 085].*WS)
uicontrol(Finter,'Style','Text','String','visualisation',...
'Position',[290 168 065 015].*WS,...
'FontName',PF.times,'FontWeight','Normal','FontAngle','Italic',...
'FontSize',FS(10),...
'HorizontalAlignment','Left',...
'ForegroundColor','w')
uicontrol(Finter,'Style','PushButton','String','plot','FontSize',FS(10),...
'ToolTipString','plot data & contrasts at current voxel',...
'Callback','[Y,y,beta,Bcov] = spm_graph(xSPM,SPM,hReg);',...
'Interruptible','on','Enable','on',...
'Position',[285 145 100 020].*WS)

str = { 'overlays...','slices','sections','render'};
tstr = { 'overlay filtered SPM on another image: ',...
'3 slices / ','ortho sections / ','render'};
tmp = { 'spm_transverse(''set'',xSPM,hReg)',...
'spm_sections(xSPM,hReg)',...
['spm_render( struct( ''XYZ'', xSPM.XYZ,',...
'''t'', xSPM.Z'',',...
'''mat'', xSPM.M,',...
'''dim'', xSPM.DIM))']};
if DIM(3) == 1, str(2 + 1) = []; tstr(2 + 1) = []; tmp(2) = []; end
uicontrol(Finter,'Style','PopUp','String',str,'FontSize',FS(10),...
'ToolTipString',cat(2,tstr{:}),...
'Callback','spm(''PopUpCB'',gcbo)',...
'UserData',tmp,...
'Interruptible','on','Enable','on',...
'Position',[285 120 100 020].*WS)
uicontrol(Finter,'Style','PushButton','String','save','FontSize',FS(10),...
'ToolTipString','save thresholded SPM as image',...
'Callback',['spm_write_filtered(xSPM.Z,xSPM.XYZ,xSPM.DIM,xSPM.M,',...
'sprintf(''SPM{%c}-filtered: u = %5.3f, k = %d'',',...
'xSPM.STAT,xSPM.u,xSPM.k));'],...
'Interruptible','on','Enable','on',...
'Position',[285 095 100 020].*WS)

%-ResultsUI controls
%-----------------------------------------------------------------------
uicontrol(Finter,'Style','Frame','Position',[280 050 110 030].*WS)

hClear = uicontrol(Finter,'Style','PushButton','String','clear',...
'ToolTipString','clears results subpane',...
'FontSize',FS(9),'ForegroundColor','b',...
'Callback',['spm_results_ui_report(''Clear''); ',...
'spm_input(''!DeleteInputObj''),',...
'spm_clf(''Satellite'')'],...
'Interruptible','on','Enable','on',...
'DeleteFcn','clc,spm_clf(''Graphics'')',...
'Position',[285 055 035 018].*WS);

hExit = uicontrol(Finter,'Style','PushButton','String','exit',...
'ToolTipString','exit the results section',...
'FontSize',FS(9),'ForegroundColor','r',...
'Callback',['spm_clf(''Interactive''), spm_clf(''Graphics''),'...
'close(spm_figure(''FindWin'',''Satellite'')),'...
'clear'],...
'Interruptible','on','Enable','on',...
'Position',[325 055 035 018].*WS);

hHelp = uicontrol(Finter,'Style','PushButton','String','?',...
'ToolTipString','results section help',...
'FontSize',FS(9),'ForegroundColor','g',...
'Callback','spm_help(''spm_results_ui_report'')',...
'Interruptible','on','Enable','on',...
'Position',[365 055 020 018].*WS);


%=======================================================================
case 'drawxyzgui' %-Draw XYZ GUI area
%=======================================================================
% hFxyz = spm_results_ui_report('DrawXYZgui',M,DIM,xSPM,xyz,Finter)
if nargin<6, Finter=spm_figure('FindWin','Interactive');
else, Finter=varargin{6}; end
if nargin < 5, xyz=[0;0;0]; else, xyz=varargin{5}; end
if nargin < 4, error('Insufficient arguments'), end
DIM = varargin{3};
M = varargin{2};
xyz = spm_XYZreg('RoundCoords',xyz,M,DIM);

%-Locate windows etc...
%-----------------------------------------------------------------------
WS = spm('WinScale');
FS = spm('FontSizes');
PF = spm_platform('fonts');

%-Create XYZ control objects
%-----------------------------------------------------------------------
hFxyz = uicontrol(Finter,'Style','Frame','Position',[010 010 265 030].*WS);
uicontrol(Finter,'Style','Text','String','co-ordinates',...
'Position',[020 033 078 016].*WS,...
'FontName',PF.times,'FontWeight','Normal','FontAngle','Italic',...
'FontSize',FS(10),...
'HorizontalAlignment','Left',...
'ForegroundColor','w')

uicontrol(Finter,'Style','Text','String','x =',...
'Position',[020 015 024 018].*WS,...
'FontName',PF.times,'FontSize',FS(10),'FontAngle','Italic',...
'HorizontalAlignment','Center');
hX = uicontrol(Finter,'Style','Edit','String',sprintf('%.2f',xyz(1)),...
'ToolTipString','enter x-coordinate',...
'Position',[044 015 056 020].*WS,...
'FontSize',FS(10),'BackGroundColor',[.8,.8,1],...
'HorizontalAlignment','Right',...
'Tag','hX',...
'Callback','spm_results_ui_report(''EdWidCB'')');

uicontrol(Finter,'Style','Text','String','y =',...
'Position',[105 015 024 018].*WS,...
'FontName',PF.times,'FontSize',FS(10),'FontAngle','Italic',...
'HorizontalAlignment','Center')
hY = uicontrol(Finter,'Style','Edit','String',sprintf('%.2f',xyz(2)),...
'ToolTipString','enter y-coordinate',...
'Position',[129 015 056 020].*WS,...
'FontSize',FS(10),'BackGroundColor',[.8,.8,1],...
'HorizontalAlignment','Right',...
'Tag','hY',...
'Callback','spm_results_ui_report(''EdWidCB'')');

uicontrol(Finter,'Style','Text','String','z =',...
'Position',[190 015 024 018].*WS,...
'FontName',PF.times,'FontSize',FS(10),'FontAngle','Italic',...
'HorizontalAlignment','Center')
hZ = uicontrol(Finter,'Style','Edit','String',sprintf('%.2f',xyz(3)),...
'ToolTipString','enter z-coordinate',...
'Position',[214 015 056 020].*WS,...
'FontSize',FS(10),'BackGroundColor',[.8,.8,1],...
'HorizontalAlignment','Right',...
'Tag','hZ',...
'Callback','spm_results_ui_report(''EdWidCB'')');

%-Statistic value reporting pane
%-----------------------------------------------------------------------
hFconB = uicontrol(Finter,'Style','Frame','Position',[280 010 110 030].*WS);
uicontrol(Finter,'Style','Text','String','statistic value',...
'Position',[285 035 085 016].*WS,...
'FontName',PF.times,'FontWeight','Normal','FontAngle','Italic',...
'FontSize',FS(10),...
'HorizontalAlignment','Left',...
'ForegroundColor','w')
hSPM = uicontrol(Finter,'Style','Text','String','',...
'Position',[285 012 100 020].*WS,...
'FontSize',FS(10),...
'HorizontalAlignment','Center');


%-Store data
%-----------------------------------------------------------------------
set(hFxyz,'Tag','hFxyz','UserData',struct(...
'hReg', [],...
'M', M,...
'DIM', DIM,...
'XYZ', varargin{4}.XYZmm,...
'Z', varargin{4}.Z,...
'hX', hX,...
'hY', hY,...
'hZ', hZ,...
'hSPM', hSPM,...
'xyz', xyz ));

set([hX,hY,hZ],'UserData',hFxyz)
varargout = {hFxyz};



%=======================================================================
case 'edwidcb' %-Callback for editable widgets
%=======================================================================
% spm_results_ui_report('EdWidCB')

hC = gcbo;
d = find(strcmp(get(hC,'Tag'),{'hX','hY','hZ'}));
hFxyz = get(hC,'UserData');
UD = get(hFxyz,'UserData');
xyz = UD.xyz;
nxyz = xyz;

o = evalin('base',['[',get(hC,'String'),']'],'sprintf(''error'')');
if ischar(o) | length(o)>1
warning(sprintf('%s: Error evaluating ordinate:\n\t%s',...
mfilename,lasterr))
else
nxyz(d) = o;
nxyz = spm_XYZreg('RoundCoords',nxyz,UD.M,UD.DIM);
end

if abs(xyz(d)-nxyz(d))>0
UD.xyz = nxyz; set(hFxyz,'UserData',UD)
if ~isempty(UD.hReg), spm_XYZreg('SetCoords',nxyz,UD.hReg,hFxyz); end
set(hC,'String',sprintf('%.3f',nxyz(d)))
spm_results_ui_report('UpdateSPMval',UD)
end

%=======================================================================
case 'updatespmval' %-Update SPM value in GUI
%=======================================================================
% spm_results_ui_report('UpdateSPMval',hFxyz)
% spm_results_ui_report('UpdateSPMval',UD)
if nargin<2, error('insufficient arguments'), end
if isstruct(varargin{2}), UD=varargin{2}; else, UD = get(varargin{2},'UserData'); end
i = spm_XYZreg('FindXYZ',UD.xyz,UD.XYZ);
if isempty(i), str = ''; else, str = sprintf('%6.2f',UD.Z(i)); end
set(UD.hSPM,'String',str);


%=======================================================================
case 'getcoords' % Get current co-ordinates from XYZ widget
%=======================================================================
% xyz = spm_results_ui_report('GetCoords',hFxyz)
if nargin<2, hFxyz='Interactive'; else, hFxyz=varargin{2}; end
hFxyz = spm_results_ui_report('FindXYZframe',hFxyz);
varargout = {getfield(get(hFxyz,'UserData'),'xyz')};



%=======================================================================
case 'setcoords' % Set co-ordinates to XYZ widget
%=======================================================================
% [xyz,d] = spm_results_ui_report('SetCoords',xyz,hFxyz,hC)
if nargin<4, hC=0; else, hC=varargin{4}; end
if nargin<3, hFxyz=spm_results_ui_report('FindXYZframe'); else, hFxyz=varargin{3}; end
if nargin<2, error('Set co-ords to what!'), else, xyz=varargin{2}; end

%-If this is an internal call, then don't do anything
if hFxyz==hC, return, end

UD = get(hFxyz,'UserData');

%-Check validity of coords only when called without a caller handle
%-----------------------------------------------------------------------
if hC <= 0
[xyz,d] = spm_XYZreg('RoundCoords',xyz,UD.M,UD.DIM);
if d>0 & nargout<2, warning(sprintf(...
'%s: Co-ords rounded to neatest voxel center: Discrepancy %.2f',...
mfilename,d)), end
else
d = [];
end

%-Update xyz information & widget strings
%-----------------------------------------------------------------------
UD.xyz = xyz; set(hFxyz,'UserData',UD)
set(UD.hX,'String',sprintf('%.2f',xyz(1)))
set(UD.hY,'String',sprintf('%.2f',xyz(2)))
set(UD.hZ,'String',sprintf('%.2f',xyz(3)))
spm_results_ui_report('UpdateSPMval',UD)

%-Tell the registry, if we've not been called by the registry...
%-----------------------------------------------------------------------
if (~isempty(UD.hReg) & UD.hReg~=hC)
spm_XYZreg('SetCoords',xyz,UD.hReg,hFxyz);
end

%-Return arguments
%-----------------------------------------------------------------------
varargout = {xyz,d};



%=======================================================================
case 'findxyzframe' % Find hFxyz frame
%=======================================================================
% hFxyz = spm_results_ui_report('FindXYZframe',h)
% Sorts out hFxyz handles
if nargin<2, h='Interactive'; else, h=varargin{2}; end
if isstr(h), h=spm_figure('FindWin',h); end
if ~ishandle(h), error('invalid handle'), end
if ~strcmp(get(h,'Tag'),'hFxyz'), h=findobj(h,'Tag','hFxyz'); end
if isempty(h), error('XYZ frame not found'), end
if length(h)>1, error('Multiple XYZ frames found'), end
varargout = {h};



%=======================================================================
case 'plotui' %-GUI for plot manipulation
%=======================================================================
% spm_results_ui_report('PlotUi',hAx)
if nargin<2, hAx=gca; else, hAx=varargin{2}; end

WS = spm('WinScale');
FS = spm('FontSizes');
Finter=spm_figure('FindWin','Interactive');
figure(Finter)

%-Check there aren't already controls!
%-----------------------------------------------------------------------
hGraphUI = findobj(Finter,'Tag','hGraphUI');
if ~isempty(hGraphUI) %-Controls exist
hBs = get(hGraphUI,'UserData');
if hAx==get(hBs(1),'UserData') %-Controls linked to these axes
return
else %-Old controls remain
delete(findobj(Finter,'Tag','hGraphUIbg'))
end
end

%-Frames & text
%-----------------------------------------------------------------------
hGraphUIbg = uicontrol(Finter,'Style','Frame','Tag','hGraphUIbg',...
'BackgroundColor',spm('Colour'),...
'Position',[001 196 400 055].*WS);
hGraphUI = uicontrol(Finter,'Style','Frame','Tag','hGraphUI',...
'Position',[008 202 387 043].*WS);
hGraphUIButtsF = uicontrol(Finter,'Style','Frame',...
'Position',[010 205 380 030].*WS);
hText = uicontrol(Finter,'Style','Text','String','plot controls',...
'Position',[020 227 080 016].*WS,...
'FontName',spm_platform('font','times'),'FontWeight','Normal',...
'FontAngle','Italic','FontSize',FS(10),...
'HorizontalAlignment','Left',...
'ForegroundColor','w');

%-Controls
%-----------------------------------------------------------------------
h1 = uicontrol(Finter,'Style','CheckBox','String','hold',...
'ToolTipString','toggle hold to overlay plots',...
'FontSize',FS(10),...
'Value',strcmp(get(hAx,'NextPlot'),'add'),...
'Callback',[...
'if get(gcbo,''Value''), ',...
'set(get(gcbo,''UserData''),''NextPlot'',''add''), ',...
'else, ',...
'set(get(gcbo,''UserData''),''NextPlot'',''replace''), ',...
'end'],...
'Interruptible','on','Enable','on',...
'Position',[015 210 070 020].*WS);
h2 = uicontrol(Finter,'Style','CheckBox','String','grid',...
'ToolTipString','toggle axes grid',...
'FontSize',FS(10),...
'Value',strcmp(get(hAx,'XGrid'),'on'),...
'Callback',[...
'if get(gcbo,''Value''), ',...
'set(get(gcbo,''UserData''),''XGrid'',''on'','...
'''YGrid'',''on'',''ZGrid'',''on''), ',...
'else, ',...
'set(get(gcbo,''UserData''),''XGrid'',''off'','...
'''YGrid'',''off'',''ZGrid'',''off''), ',...
'end'],...
'Interruptible','on','Enable','on',...
'Position',[090 210 070 020].*WS);
h3 = uicontrol(Finter,'Style','CheckBox','String','Box',...
'ToolTipString','toggle axes box',...
'FontSize',FS(10),...
'Value',strcmp(get(hAx,'Box'),'on'),...
'Callback',[...
'if get(gcbo,''Value''), ',...
'set(get(gcbo,''UserData''),''Box'',''on''), ',...
'else, ',...
'set(get(gcbo,''UserData''),''Box'',''off''), ',...
'end'],...
'Interruptible','on','Enable','on',...
'Position',[165 210 070 020].*WS);
h4 = uicontrol(Finter,'Style','PopUp',...
'ToolTipString','edit axis text annotations',...
'FontSize',FS(10),...
'String','text|Title|Xlabel|Ylabel',...
'Callback','spm_results_ui_report(''PlotUiCB'')',...
'Interruptible','on','Enable','on',...
'Position',[240 210 070 020].*WS);
h5 = uicontrol(Finter,'Style','PopUp',...
'ToolTipString','change various axes attributes',...
'FontSize',FS(10),...
'String','attrib|LineWidth|XLim|YLim|handle',...
'Callback','spm_results_ui_report(''PlotUiCB'')',...
'Interruptible','off','Enable','on',...
'Position',[315 210 070 020].*WS);

%-Handle storage for linking, and DeleteFcns for linked deletion
%-----------------------------------------------------------------------
set(hGraphUI,'UserData',[h1,h2,h3,h4,h5])
set([h1,h2,h3,h4,h5],'UserData',hAx)

set(hGraphUIbg,'UserData',...
[hGraphUI,hGraphUIButtsF,hText,h1,h2,h3,h4,h5],...
'DeleteFcn','spm_results_ui_report(''Delete'',get(gcbo,''UserData''))')
set(hAx,'UserData',hGraphUIbg,...
'DeleteFcn','spm_results_ui_report(''Delete'',get(gcbo,''UserData''))')




%=======================================================================
case 'plotuicb'
%=======================================================================
% spm_results_ui_report('PlotUiCB')
hPM = gcbo;
v = get(hPM,'Value');
if v==1, return, end
str = cellstr(get(hPM,'String'));
str = str{v};

hAx = get(hPM,'UserData');
switch str
case 'Title'
h = get(hAx,'Title');
set(h,'String',spm_input('Enter title:',-1,'s+',get(h,'String')))
case 'Xlabel'
h = get(hAx,'Xlabel');
set(h,'String',spm_input('Enter X axis label:',-1,'s+',get(h,'String')))
case 'Ylabel'
h = get(hAx,'Ylabel');
set(h,'String',spm_input('Enter Y axis label:',-1,'s+',get(h,'String')))
case 'LineWidth'
lw = spm_input('Enter LineWidth',-1,'e',get(hAx,'LineWidth'),1);
set(hAx,'LineWidth',lw)
case 'XLim'
XLim = spm_input('Enter XLim',-1,'e',get(hAx,'XLim'),[1,2]);
set(hAx,'XLim',XLim)
case 'YLim'
YLim = spm_input('Enter YLim',-1,'e',get(hAx,'YLim'),[1,2]);
set(hAx,'YLim',YLim)
case 'handle'
varargout={hAx};
otherwise
warning(['Unknown action: ',str])
end

set(hPM,'Value',1)


%=======================================================================
case {'clear','clearpane'} %-Clear results subpane
%=======================================================================
% Fgraph = spm_results_ui_report('Clear',F,mode)
% mode 1 [default] usual, mode 0 - clear & hide Res stuff, 2 - RNP
if strcmp(lower(Action),'clearpane')
warning('''ClearPane'' action is grandfathered, use ''Clear'' instead')
end

if nargin<3, mode=1; else, mode=varargin{3}; end
if nargin<2, F='Graphics'; else, F=varargin{2}; end
F = spm_figure('FindWin',F);

%-Clear input objects from 'Interactive' window
%-----------------------------------------------------------------------
%spm_input('!DeleteInputObj')


%-Get handles of objects in Graphics window & note permanent results objects
%-----------------------------------------------------------------------
H = get(F,'Children'); %-Get contents of window
H = findobj(H,'flat','HandleVisibility','on'); %-Drop GUI components
h = findobj(H,'flat','Tag','PermRes'); %-Look for 'PermRes' object

if ~isempty(h)
%-Found 'PermRes' object
% This has handles of permanent results objects in it's UserData
tmp = get(h,'UserData');
HR = tmp.H;
HRv = tmp.Hv;
else
%-No trace of permanent results objects
HR = [];
HRv = {};
end
H = setdiff(H,HR); %-Drop permanent results obj


%-Delete stuff as appropriate
%-----------------------------------------------------------------------
if mode==2 %-Don't delete axes with NextPlot 'add'
H = setdiff(H,findobj(H,'flat','Type','axes','NextPlot','add'));
end

delete(H)

if mode==0 %-Hide the permanent results section stuff
set(HR,'Visible','off')
else
set(HR,{'Visible'},HRv)
end


%=======================================================================
case 'launchmp' %-Launch multiplanar toolbox
%=======================================================================
% hMP = spm_results_ui_report('LaunchMP',M,DIM,hReg,hBmp)
if nargin<5, hBmp = gcbo; else, hBmp = varargin{5}; end
hReg = varargin{4};
DIM = varargin{3};
M = varargin{2};

%-Check for existing MultiPlanar toolbox
hMP = get(hBmp,'UserData');
if ishandle(hMP)
figure(spm_figure('ParentFig',hMP))
varargout = {hMP};
return
end

%-Initialise and cross-register MultiPlanar toolbox
hMP = spm_XYZreg_Ex2('Create',M,DIM);
spm_XYZreg('Xreg',hReg,hMP,'spm_XYZreg_Ex2');

%-Setup automatic deletion of MultiPlanar on deletion of results controls
set(hBmp,'Enable','on','UserData',hMP)
set(hBmp,'DeleteFcn','spm_results_ui_report(''delete'',get(gcbo,''UserData''))')

varargout = {hMP};



%=======================================================================
case 'delete' %-Delete HandleGraphics objects
%=======================================================================
% spm_results_ui_report('Delete',h)
h = varargin{2};
delete(h(ishandle(h)));


%=======================================================================
otherwise
%=======================================================================
error('Unknown action string')

%=======================================================================
end



function clust=cluster_info(SPM)
% function cluster_info(SPM)
% SPM = structure from SPM.mat
% clust.XYZmm = mm coordinates of cluster
% clust.y = raw data at each coordinate
% clust.Y = weighted mean of raw data for each cluster
%_______________________________
% Created Joeld KCL 3 April 2006

Ic=2; % Contrast Number (defined in 'Results' part of analysis)
pstr='none'; % or 'FDR' or 'FWE'
pval=0.001; % p-value threshold
kthr=100; % extent threshold

[hReg,xSPM,SPM] = spm_results_ui_report('setup',SPM,Ic,pstr,pval,kthr);
xVol=spm_list('List',xSPM,hReg); % structure of cluster data

if isempty(xVol.dat) % check results exist
    clust=[];
    error('No significant clusters for defined thresholds, contrasts or methods');
end

% Choose only Cluster Maximum Coordinates
xyz=[];
c1=1;
for icl=1:size(xVol.dat,1)
    if ~isempty(xVol.dat{icl,3})
        xyz(:,c1)=xVol.dat{icl,11};
        c1=c1+1;
    end
end

nclust=size(xyz,2);
for icl=1:nclust
    cmax=xyz(:,icl);
    spm_results_ui('SetCoords',cmax); % move to cmax

    % Following code from spm_regions.m
    [x1,i1]=SPM_XYZreg('NearestXYZ',cmax,xSPM.XYZmm);
    A=spm_clusters(xSPM.XYZ);
    Q=find(A==A(i1));
    %-Get raw data, whiten and filter
    %-----------------------------------------------------------------------
    y = spm_get_data(SPM.xY.VY,xSPM.XYZ(:,Q));
    y = spm_filter(SPM.xX.K,SPM.xX.W*y);
    XYZmm = xSPM.XYZmm(:,Q);
    % compute regional response in terms of first eigenvariate
    %-----------------------------------------------------------------------
    [m n] = size(y);
    if m > n
        [v s v] = svd(spm_atranspa(y));
        s = diag(s);
        v = v(:,1);
        u = y*v/sqrt(s(1));
    else
        [u s u] = svd(spm_atranspa(y'));
        s = diag(s);
        u = u(:,1);
        v = y'*u/sqrt(s(1));
    end
    d = sign(sum(v));
    u = u*d;
    v = v*d;
    Y = u*sqrt(s(1)/n);
    % end spm_regions.m

    clust.XYZmm{icl}=XYZmm;
    clust.y{icl}=y;
    clust.Y{icl}=Y;

end


Top of Message | Previous Page | Permalink

JiscMail Tools


RSS Feeds and Sharing


Advanced Options


Archives

May 2024
April 2024
March 2024
February 2024
January 2024
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
2006
2005
2004
2003
2002
2001
2000
1999
1998


JiscMail is a Jisc service.

View our service policies at https://www.jiscmail.ac.uk/policyandsecurity/ and Jisc's privacy policy at https://www.jisc.ac.uk/website/privacy-notice

For help and support help@jisc.ac.uk

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager