Christoph Budziszewski commited on 2009-08-03 16:18:15
Zeige 10 geänderte Dateien mit 45 Einfügungen und 58 Löschungen.
git-svn-id: https://svn.discofish.de/MATLAB/spmtoolbox/SVMCrossVal@202 83ab2cfd-5345-466c-8aeb-2b2739fb922d
... | ... |
@@ -11,15 +11,6 @@ timeline.decodeDuration = header.frameShift.decodeDuration; |
11 | 11 |
timeLineStart = timeline.frameShiftStart; |
12 | 12 |
timeLineEnd = timeline.frameShiftEnd; |
13 | 13 |
|
14 |
-% for iVoxel = 1:nVoxel |
|
15 |
-% rawdata = []; |
|
16 |
-% for iImage = 1:length(extr); |
|
17 |
-% tmp = extr(iImage); |
|
18 |
-% rawdata = [rawdata tmp.dat(iVoxel)]; |
|
19 |
-% end |
|
20 |
-% pst{iVoxel} = calculatePST(timeline,calculatePstOpts,rawdata); |
|
21 |
-% end |
|
22 |
- |
|
23 | 14 |
timePointArgs.pst = subjectStruct.pst; |
24 | 15 |
timePointArgs.labelMap = LabelMap(header.classDef.labelCells,header.classDef.conditionCells); |
25 | 16 |
timePointArgs.eventList = header.classDef.eventMatrix; |
... | ... |
@@ -30,6 +21,7 @@ decodePerformance = []; |
30 | 21 |
for index = 1:timeLineEnd-timeLineStart+1 |
31 | 22 |
|
32 | 23 |
svmdata = timePointMatrix{index}(:,2:size(timePointMatrix{index},2)); |
24 |
+ svmdata = header.timeframeGroupingfunction(svmdata); |
|
33 | 25 |
svmlabel = timePointMatrix{index}(:,1); |
34 | 26 |
|
35 | 27 |
if RANDOMIZE_DATAPOINTS |
... | ... |
@@ -1,13 +1,13 @@ |
1 |
-function [extr voxelcount] = calculateImageData(filenameList, coordlist) |
|
1 |
+function [extr voxelcount] = calculateImageData(filenameList, coordlist,gFkt) |
|
2 | 2 |
|
3 |
+%center coordinates |
|
3 | 4 |
vox = []; |
4 |
-% radius = []; |
|
5 | 5 |
nCoords = size(coordlist,1); |
6 | 6 |
for iCoord = 1:nCoords |
7 | 7 |
vox = [vox ; coordlist(iCoord).coord]; |
8 |
-% radius = [radius , coordlist(iCoord).rad]; |
|
9 | 8 |
end |
10 | 9 |
|
10 |
+%maximum extracted voxels over all images |
|
11 | 11 |
voxelcount = 0; |
12 | 12 |
|
13 | 13 |
V = filenameList; |
... | ... |
@@ -15,14 +15,13 @@ nImage = numel(V); |
15 | 15 |
nVoxel = nCoords; |
16 | 16 |
for kImage=1:nImage |
17 | 17 |
roicenter = round(inv(V(kImage).mat)*[vox, ones(nVoxel,1)]'); |
18 |
-% x = roicenter(1,:); |
|
19 |
-% y = roicenter(2,:); |
|
20 |
-% z = roicenter(3,:); |
|
21 | 18 |
|
22 | 19 |
subvoxelcount = 0; |
23 | 20 |
for iVoxel = 1:nVoxel |
24 | 21 |
|
22 |
+ %radius |
|
25 | 23 |
rad = coordlist(iVoxel).rad; |
24 |
+ |
|
26 | 25 |
tmp = spm_imatrix(V(kImage).mat); |
27 | 26 |
vdim = tmp(7:9); |
28 | 27 |
vxrad = ceil((rad*ones(nVoxel,3))./(ones(nVoxel,1)*vdim))'; |
... | ... |
@@ -45,12 +44,16 @@ for kImage=1:nImage |
45 | 44 |
|
46 | 45 |
dat = spm_sample_vol(V(kImage), x, y, z,0); |
47 | 46 |
|
47 |
+ %%Implement Spatial grouping here |
|
48 |
+ |
|
49 |
+ dat = gFkt(dat); |
|
50 |
+ |
|
51 |
+ % no grouping |
|
48 | 52 |
for iSubVoxel = 1:size(dat,1) |
49 | 53 |
subvoxelcount = subvoxelcount +1; |
50 | 54 |
extr(kImage).dat(subvoxelcount) = dat(iSubVoxel); |
51 | 55 |
end |
52 |
-% extr(kImage).mean(iVoxel) = nanmean(dat); |
|
53 |
-% extr(kImage).nvx(iVoxel) = numel(dat); |
|
56 |
+ |
|
54 | 57 |
end |
55 | 58 |
voxelcount = max(voxelcount,subvoxelcount); |
56 | 59 |
end |
... | ... |
@@ -1,35 +1,15 @@ |
1 | 1 |
function defineGlobals() |
2 |
-global SVMCROSSVAL_SPMDIR; |
|
2 |
+ |
|
3 | 3 |
global SVMCROSSVAL_TOOLBOXPATH; |
4 |
-SVMCROSSVAL_TOOLBOXPATH = fullfile(SVMCROSSVAL_SPMDIR,'toolbox','SVMCrossVal'); |
|
4 |
+SVMCROSSVAL_TOOLBOXPATH = fullfile(getSpmPath,'toolbox','SVMCrossVal'); |
|
5 | 5 |
|
6 | 6 |
global SVMCROSSVAL_STUDYDIR; |
7 | 7 |
SVMCROSSVAL_STUDYDIR = fullfile(SVMCROSSVAL_TOOLBOXPATH,'study'); |
8 | 8 |
|
9 |
-%define global constants |
|
10 |
-global SVMCROSSVAL_USE_DRIVE_CHECK_HACK; |
|
11 |
-%enables subroutine to check if image path starts with 'D' |
|
12 |
-SVMCROSSVAL_USE_DRIVE_CHECK_HACK = 1; |
|
13 |
- |
|
14 |
-global SVMCROSSVAL_CROSSVAL_METHOD_DEF; |
|
15 |
-% supported classification methods |
|
16 |
-SVMCROSSVAL_CROSSVAL_METHOD_DEF.svmcrossval = 'svm crossval'; |
|
17 |
-SVMCROSSVAL_CROSSVAL_METHOD_DEF.classPerformance = 'svm class performance'; |
|
18 |
-SVMCROSSVAL_CROSSVAL_METHOD_DEF.crossSubject = 'svm across subject testing'; |
|
19 |
-SVMCROSSVAL_CROSSVAL_METHOD_DEF.somTraining = 'som Training'; |
|
20 |
- |
|
21 |
-global SVMCROSSVAL_VOXEL_SELECTION_MODE_DEF; |
|
22 |
-% supported voxel selection methods |
|
23 |
-SVMCROSSVAL_VOXEL_SELECTION_MODE_DEF.manualGui = 'manually defined in GUI'; |
|
24 |
-SVMCROSSVAL_VOXEL_SELECTION_MODE_DEF.roiImage = 'use ROI image by pop-up image selector'; |
|
25 |
- |
|
26 | 9 |
global SVMCROSSVAL_SUBJECT_PREFIX; |
27 |
-% internally used to prefix subject-ids starting with numbers. |
|
28 | 10 |
SVMCROSSVAL_SUBJECT_PREFIX = 'subject'; |
29 | 11 |
|
30 | 12 |
global SVMCROSSVAL_SUBJECTSTRUCT_NAME; |
31 | 13 |
SVMCROSSVAL_SUBJECTSTRUCT_NAME = 'subjectStruct'; |
32 | 14 |
|
33 |
-global SVMCROSSVAL_PREPROCESSED_DATA_NAME; |
|
34 |
-SVMCROSSVAL_PREPROCESSED_DATA_NAME = 'preprocessedData'; |
|
35 | 15 |
end |
36 | 16 |
\ No newline at end of file |
... | ... |
@@ -31,7 +31,7 @@ psthOpts.psthNorm = getPsthNormalizationMethod(model); |
31 | 31 |
|
32 | 32 |
switch task |
33 | 33 |
case 'COORD' |
34 |
- disp('COORD'); |
|
34 |
+ disp('LUT Approach'); |
|
35 | 35 |
|
36 | 36 |
out = struct; |
37 | 37 |
out.header = struct; |
... | ... |
@@ -48,11 +48,12 @@ switch task |
48 | 48 |
coordargs.coords = parseCoordinateTextField(model); |
49 | 49 |
coordargs.mask = mask; |
50 | 50 |
coordargs.psthOpts = psthOpts; |
51 |
+ coordargs.groupingFkt = getSpatialGroupingFunction(model); |
|
51 | 52 |
|
52 | 53 |
out.subjectdata = runCoordTable(coordargs); |
53 | 54 |
|
54 | 55 |
case 'ROI' |
55 |
- disp('ROI'); |
|
56 |
+ disp('ROI Image Approach'); |
|
56 | 57 |
out = struct; |
57 | 58 |
out.header = struct; |
58 | 59 |
out.header.type = 'ROI'; |
... | ... |
@@ -117,6 +118,7 @@ end |
117 | 118 |
warn = warning('off','all'); |
118 | 119 |
header = preprocessedData.header; |
119 | 120 |
header.frameShift = getFrameShiftParams(model); |
121 |
+header.timeframeGroupingfunction = getTemporalGroupingFunction(model); |
|
120 | 122 |
data = preprocessedData.subjectdata; |
121 | 123 |
|
122 | 124 |
switch task |
... | ... |
@@ -1,7 +1,5 @@ |
1 | 1 |
function subjectData = runCoordTable(args) |
2 | 2 |
|
3 |
-% global SVMCROSSVAL_SUBJECTSTRUCT_NAME; |
|
4 |
- |
|
5 | 3 |
disp('run coord table') |
6 | 4 |
|
7 | 5 |
subjects = args.subjects; |
... | ... |
@@ -12,20 +10,21 @@ function subjectData = runCoordTable(args) |
12 | 10 |
disp(sprintf('batch processing %g subjects.',nSubjects)); |
13 | 11 |
|
14 | 12 |
for s = 1:nSubjects |
13 |
+ % load SPM Design |
|
15 | 14 |
subjectStruct{s}.dir = fullfile(args.basedir,cell2mat(subjects(s))); |
16 | 15 |
d = load(fullfile(subjectStruct{s}.dir,'results','SPM.mat')); |
17 | 16 |
subjectStruct{s}.des = d.SPM; |
18 | 17 |
subjectStruct{s}.name = cell2mat(subjects(s)); |
19 |
- |
|
18 |
+ % load ROI look-up table |
|
20 | 19 |
map = load(fullfile(subjectStruct{s}.dir,'results','roi','coord_map.mat')); |
21 | 20 |
subjectStruct{s}.coords = getSubjectCoordinates(args.coords,map); |
22 | 21 |
|
23 |
-% nVoxel = size(subjectStruct{s}.coords,1); |
|
24 |
- |
|
22 |
+ %preload images |
|
25 | 23 |
disp('fetching volume definitions, please wait'); |
26 | 24 |
subjectStruct{s}.volumes = spm_vol(getImageFileList(subjectStruct{s}.dir,sessionlist,args.mask)); |
27 | 25 |
|
28 |
- [extr nExtractedVoxel] = calculateImageData(subjectStruct{s}.volumes,subjectStruct{s}.coords); |
|
26 |
+ %extract voxel values |
|
27 |
+ [extr nExtractedVoxel] = calculateImageData(subjectStruct{s}.volumes,subjectStruct{s}.coords,args.groupingFkt); |
|
29 | 28 |
|
30 | 29 |
pstopts.des = subjectStruct{s}.des; |
31 | 30 |
pstopts.eventList = args.eventList; |
... | ... |
@@ -5,7 +5,7 @@ function ui_main(varargin) |
5 | 5 |
frameHeight=450; |
6 | 6 |
|
7 | 7 |
frame = figure('Visible','off','Position',[0,0,frameWidth,frameHeight]); |
8 |
- movegui(frame,'west'); % get this thing visible on smaller displays. |
|
8 |
+ movegui(frame,'center'); % get this thing visible on smaller displays. |
|
9 | 9 |
set(frame,'Name','SVMCrossVal Decode Performance 4 SPM'); |
10 | 10 |
set(frame,'NumberTitle','off'); |
11 | 11 |
set(frame,'MenuBar','none'); |
... | ... |
@@ -92,7 +92,8 @@ end |
92 | 92 |
%%%%% ui elements |
93 | 93 |
function model = createFirstStepPanel(model,parent) |
94 | 94 |
norm1Model = {'none','mean','minmax'}; |
95 |
- roiGroupMethods = {'none','mean','max','median'}; |
|
95 |
+ roiGroupMethodNames = {'none','mean','max','median'}; |
|
96 |
+ roiGroupMethodFunctions = {@(in)in, @(in)nanmean(in),@(in)nanmax(in),@(in)nanmedian(in)}; |
|
96 | 97 |
|
97 | 98 |
main_grid = cell(2,4); |
98 | 99 |
main_grid{1,1} = [0 0.7 0.4 0.3]; |
... | ... |
@@ -243,11 +244,10 @@ function model = createFirstStepPanel(model,parent) |
243 | 244 |
model.selRoiGrouping = uicontrol(pOptions,'Style','popupmenu',... |
244 | 245 |
'Units','normalized',... |
245 | 246 |
'Position',cell2mat(optGrid(2,4)),... |
246 |
- 'String',roiGroupMethods,... |
|
247 |
- 'UserData',roiGroupMethods); |
|
247 |
+ 'String',roiGroupMethodNames,... |
|
248 |
+ 'UserData',roiGroupMethodFunctions); |
|
248 | 249 |
set(model.selRoiGrouping,'BackgroundColor','w'); |
249 | 250 |
|
250 |
- |
|
251 | 251 |
% COORD TABLE |
252 | 252 |
pVoxel = uipanel(parent,'Title','ROI','Position',cell2mat(main_grid(1,3))); |
253 | 253 |
set(pVoxel,'BackgroundColor','w'); |
... | ... |
@@ -281,6 +281,9 @@ end |
281 | 281 |
function model = createSecondStepPanel(model,parent) |
282 | 282 |
basecolor = 'w'; |
283 | 283 |
|
284 |
+TimeframeGroupingStrings = {'none','mean'};%,'sum,'max','median'}; |
|
285 |
+TimeframeGroupingFunctions = {@(in)in,@(in)nanmean(in,2)};%,'sum',','max','median'}; |
|
286 |
+ |
|
284 | 287 |
pTime = uipanel(parent,'Units','normalized','Position',[0.0 0.7 1 0.3]); |
285 | 288 |
set(pTime,'Title','Decode Timeframe Options'); |
286 | 289 |
set(pTime,'BackgroundColor',basecolor); |
... | ... |
@@ -310,14 +313,14 @@ pTime = uipanel(parent,'Units','normalized','Position',[0.0 0.7 1 0.3]); |
310 | 313 |
model.txtFrameShiftEnd = createTextField(pTime,cell2mat(time_grid(3,2)),''); |
311 | 314 |
model.txtFrameShiftDur = createTextField(pTime,cell2mat(time_grid(2,3)),''); |
312 | 315 |
|
313 |
- TimeframeGroupingOptions = {'none','sum','mean','max','median'}; |
|
316 |
+ |
|
314 | 317 |
|
315 | 318 |
model.selTimeframeGrouping = uicontrol(pTime,'Style','popupmenu',... |
316 | 319 |
'Units','normalized',... |
317 | 320 |
'Position',cell2mat(time_grid(2,4)),... |
318 |
- 'String',TimeframeGroupingOptions,... |
|
319 |
- 'UserData',TimeframeGroupingOptions); |
|
320 |
- set(model.selTimeframeGrouping,'Enable','off'); |
|
321 |
+ 'String',TimeframeGroupingStrings,... |
|
322 |
+ 'UserData',TimeframeGroupingFunctions); |
|
323 |
+ set(model.selTimeframeGrouping,'Enable','on'); |
|
321 | 324 |
|
322 | 325 |
pSVM = uipanel(parent,'Units','normalized','Position',[0 0.3 0.5 0.4]); |
323 | 326 |
set(pSVM,'Title','SVM Classification'); |