Christoph Budziszewski commited on 2009-03-27 14:57:26
Zeige 5 geänderte Dateien mit 195 Einfügungen und 12 Löschungen.
git-svn-id: https://svn.discofish.de/MATLAB/spmtoolbox/SVMCrossVal@166 83ab2cfd-5345-466c-8aeb-2b2739fb922d
| ... | ... |
@@ -0,0 +1,40 @@ |
| 1 |
+function decode = fbs_calculateDecodePerformance(header,psth,svmopts) |
|
| 2 |
+ |
|
| 3 |
+RANDOMIZE_DATAPOINTS = header.svmrnd; |
|
| 4 |
+ |
|
| 5 |
+timeline = header.timeline; |
|
| 6 |
+timeline.frameShiftStart = header.frameShift.frameShiftStart; |
|
| 7 |
+timeline.frameShiftEnd = header.frameShift.frameShiftEnd; |
|
| 8 |
+timeline.decodeDuration = header.frameShift.decodeDuration; |
|
| 9 |
+ |
|
| 10 |
+timeLineStart = timeline.frameShiftStart; |
|
| 11 |
+timeLineEnd = timeline.frameShiftEnd; |
|
| 12 |
+ |
|
| 13 |
+timePointArgs.pst = psth; |
|
| 14 |
+timePointArgs.labelMap = LabelMap(header.classDef.labelCells,header.classDef.conditionCells); |
|
| 15 |
+timePointArgs.eventList = header.classDef.eventMatrix; |
|
| 16 |
+ |
|
| 17 |
+timePointMatrix = buildTimePointMatrix(timeline,timePointArgs); |
|
| 18 |
+ |
|
| 19 |
+decodePerformance = []; |
|
| 20 |
+for index = 1:timeLineEnd-timeLineStart+1 |
|
| 21 |
+ |
|
| 22 |
+ svmdata = timePointMatrix{index}(:,2:size(timePointMatrix{index},2));
|
|
| 23 |
+ svmlabel = timePointMatrix{index}(:,1);
|
|
| 24 |
+ |
|
| 25 |
+ if RANDOMIZE_DATAPOINTS |
|
| 26 |
+ rndindex = randperm(length(svmlabel)); |
|
| 27 |
+ svmdata = svmdata(rndindex,:); |
|
| 28 |
+ svmlabel = svmlabel(rndindex); |
|
| 29 |
+ end |
|
| 30 |
+ |
|
| 31 |
+ decodePerformance = [decodePerformance; svm_single_crossval(svmlabel,svmdata,svmopts)]; |
|
| 32 |
+ |
|
| 33 |
+ |
|
| 34 |
+end |
|
| 35 |
+ |
|
| 36 |
+decode = decodePerformance; |
|
| 37 |
+end |
|
| 38 |
+ |
|
| 39 |
+ |
|
| 40 |
+ |
| ... | ... |
@@ -0,0 +1,18 @@ |
| 1 |
+function subjectStruct = fbs_load_mask(basedir,subjects) |
|
| 2 |
+nSubjects = numel(subjects); |
|
| 3 |
+ |
|
| 4 |
+for s = 1:nSubjects |
|
| 5 |
+ |
|
| 6 |
+ subjectName = cell2mat(subjects(s)); |
|
| 7 |
+ |
|
| 8 |
+ subjectStruct{s}.dir = fullfile(basedir,cell2mat(subjects(s)));
|
|
| 9 |
+ d = load(fullfile(subjectStruct{s}.dir,'results','SPM.mat'));
|
|
| 10 |
+ subjectStruct{s}.des = d.SPM;
|
|
| 11 |
+ subjectStruct{s}.name = subjectName;
|
|
| 12 |
+ subjectStruct{s}.roiFile = ui_selectRoiImage(...
|
|
| 13 |
+ sprintf('Select MASK File for %s',subjectName),...
|
|
| 14 |
+ fullfile(subjectStruct{s}.dir,'results'));
|
|
| 15 |
+ |
|
| 16 |
+end |
|
| 17 |
+ |
|
| 18 |
+end |
|
| 0 | 19 |
\ No newline at end of file |
| ... | ... |
@@ -49,8 +49,6 @@ switch task |
| 49 | 49 |
|
| 50 | 50 |
out.subjectdata = runCoordTable(coordargs); |
| 51 | 51 |
|
| 52 |
- assignin('base','preprocessedData',out);
|
|
| 53 |
- |
|
| 54 | 52 |
case 'ROI' |
| 55 | 53 |
disp('ROI');
|
| 56 | 54 |
out = struct; |
| ... | ... |
@@ -71,8 +69,6 @@ switch task |
| 71 | 69 |
|
| 72 | 70 |
out.subjectdata = runROIImageMaskMode(roiargs); |
| 73 | 71 |
|
| 74 |
- assignin('base','preprocessedData',out);
|
|
| 75 |
- |
|
| 76 | 72 |
case 'FBS' |
| 77 | 73 |
disp('FSB');
|
| 78 | 74 |
out = struct; |
| ... | ... |
@@ -81,14 +77,15 @@ switch task |
| 81 | 77 |
out.header.timeline = timeLine; |
| 82 | 78 |
out.header.classDef = classDef; |
| 83 | 79 |
|
| 84 |
- fbsargs = struct; |
|
| 85 |
- fbsargs.subject = subjects; |
|
| 80 |
+ |
|
| 81 |
+ out.subjectdata = fbs_load_mask(model.baseDir,subjects); |
|
| 86 | 82 |
|
| 87 | 83 |
if(size(subjects,2)>1) |
| 88 | 84 |
display(sprintf('No BATCH Support for Searchlight!'));
|
| 89 | 85 |
return |
| 90 | 86 |
end |
| 91 | 87 |
|
| 88 |
+ fbsargs = struct; |
|
| 92 | 89 |
fbsargs.timeline = timeLine; |
| 93 | 90 |
fbsargs.classes = classDef; |
| 94 | 91 |
fbsargs.mask = mask; |
| ... | ... |
@@ -97,9 +94,15 @@ switch task |
| 97 | 94 |
fbsargs.eventList = classDef.eventMatrix; |
| 98 | 95 |
fbsargs.psthOpts = psthOpts; |
| 99 | 96 |
|
| 100 |
- out.subjectdata = runFBSImageMaskMode(fbsargs); |
|
| 97 |
+ out.header.args = fbsargs; |
|
| 98 |
+ |
|
| 99 |
+ % no more preprocessing in this step! |
|
| 101 | 100 |
|
| 102 | 101 |
end |
| 102 |
+ |
|
| 103 |
+assignin('base','preprocessedData',out);
|
|
| 104 |
+ |
|
| 105 |
+ |
|
| 103 | 106 |
end |
| 104 | 107 |
|
| 105 | 108 |
function decode(model,task) |
| ... | ... |
@@ -137,8 +140,9 @@ switch task |
| 137 | 140 |
case 'X-SOM' |
| 138 | 141 |
disp('not implemented')
|
| 139 | 142 |
case 'FBS' |
| 140 |
- disp('not implemented')
|
|
| 141 |
- fbs.radius = getSearchlightRadius(model); |
|
| 143 |
+ disp('this method is under high development.')
|
|
| 144 |
+ fbsargs.radius = getSearchlightRadius(model); |
|
| 145 |
+ runFBSImageMaskMode(header,data,fbsargs); |
|
| 142 | 146 |
|
| 143 | 147 |
end |
| 144 | 148 |
|
| ... | ... |
@@ -0,0 +1,121 @@ |
| 1 |
+function output = runFBSImageMaskMode(header,subjectdata,fbsargs) |
|
| 2 |
+args = header.args; |
|
| 3 |
+ |
|
| 4 |
+subjects = subjectdata; |
|
| 5 |
+nSubjects = numel(subjects); |
|
| 6 |
+sessionlist = args.sessionList; |
|
| 7 |
+pstopts = args.psthOpts; |
|
| 8 |
+pstopts.eventList = args.eventList; |
|
| 9 |
+pstopts.sessionList = sessionlist; |
|
| 10 |
+ |
|
| 11 |
+radius = fbsargs.radius; |
|
| 12 |
+ |
|
| 13 |
+timeline = header.timeline; |
|
| 14 |
+timeline.frameShiftStart = header.frameShift.frameShiftStart; |
|
| 15 |
+timeline.frameShiftEnd = header.frameShift.frameShiftEnd; |
|
| 16 |
+timeline.decodeDuration = header.frameShift.decodeDuration; |
|
| 17 |
+ |
|
| 18 |
+timePointArgs.labelMap = LabelMap(header.classDef.labelCells,header.classDef.conditionCells); |
|
| 19 |
+timePointArgs.eventList = header.classDef.eventMatrix; |
|
| 20 |
+ |
|
| 21 |
+timeLineStart = timeline.frameShiftStart; |
|
| 22 |
+timeLineEnd = timeline.frameShiftEnd; |
|
| 23 |
+ |
|
| 24 |
+disp(sprintf('batch processing %g subjects.',nSubjects));
|
|
| 25 |
+ |
|
| 26 |
+for s = 1:nSubjects |
|
| 27 |
+ |
|
| 28 |
+ disp(sprintf('processing subject %s.',subjects{s}.name));
|
|
| 29 |
+ % load image data |
|
| 30 |
+ |
|
| 31 |
+ disp('fetching volume definitions, please wait');
|
|
| 32 |
+ volumes = spm_vol(getImageFileList(subjects{s}.dir,sessionlist,args.mask));
|
|
| 33 |
+ |
|
| 34 |
+ disp('computing volume values, please wait');
|
|
| 35 |
+ |
|
| 36 |
+ [extr x y z] = calculateRoiImageData(volumes,subjects{s}.roiFile);
|
|
| 37 |
+ |
|
| 38 |
+clear volumes; %save memory ?? |
|
| 39 |
+disp('cleared volumes');
|
|
| 40 |
+ |
|
| 41 |
+ |
|
| 42 |
+ nVoxel = size(extr(1).dat,1); |
|
| 43 |
+ |
|
| 44 |
+ indexToCoordMap = java.util.HashMap; |
|
| 45 |
+ coordToIndexMap = java.util.HashMap; |
|
| 46 |
+ for iVoxel = 1:nVoxel |
|
| 47 |
+ coord = [x(iVoxel),y(iVoxel),z(iVoxel)]; |
|
| 48 |
+ indexToCoordMap.put(iVoxel,coord); |
|
| 49 |
+ coordToIndexMap.put(coord,iVoxel); |
|
| 50 |
+ end |
|
| 51 |
+ |
|
| 52 |
+ subjects{s}.indexToCoordMap = indexToCoordMap;
|
|
| 53 |
+ subjects{s}.coordToIndexMap = coordToIndexMap;
|
|
| 54 |
+ |
|
| 55 |
+ % calculate psth |
|
| 56 |
+ |
|
| 57 |
+ warn = warning('off','all');
|
|
| 58 |
+ pstopts.des = subjects{s}.des;
|
|
| 59 |
+ |
|
| 60 |
+ disp(sprintf('computing psth for %g voxel.',nVoxel));
|
|
| 61 |
+ |
|
| 62 |
+ for iVoxel = 1:nVoxel |
|
| 63 |
+ rawdata = []; |
|
| 64 |
+ for iImage = 1:length(extr); |
|
| 65 |
+ tmp = extr(iImage); |
|
| 66 |
+ rawdata = [rawdata tmp.dat(iVoxel)]; |
|
| 67 |
+ end |
|
| 68 |
+% coordNameHelper = strcat('v',num2str(iVoxel));
|
|
| 69 |
+ pst{iVoxel} = calculatePST(args.timeline,pstopts,rawdata); % do not store in subjectStruct, so we can clear it later.
|
|
| 70 |
+ |
|
| 71 |
+ p = iVoxel/nVoxel*100; |
|
| 72 |
+ if(mod(iVoxel,nVoxel/100)==0) |
|
| 73 |
+ sprintf(' %g%%\t complete',p);
|
|
| 74 |
+ end |
|
| 75 |
+ end |
|
| 76 |
+ disp('psth done');
|
|
| 77 |
+ warning(warn); |
|
| 78 |
+ %run searchlight |
|
| 79 |
+ |
|
| 80 |
+ |
|
| 81 |
+ |
|
| 82 |
+ display(sprintf('rastering %g coordinates with approx. %g mm radius',nVoxel,radius));
|
|
| 83 |
+ % for each timeslice |
|
| 84 |
+ |
|
| 85 |
+ for index = 1:timeLineEnd-timeLineStart+1 |
|
| 86 |
+ timeShift = index; |
|
| 87 |
+ % center timepoint && relative shift |
|
| 88 |
+ frameStart = floor(-globalStart+1+timeShift - 0.5*decodeDuration); |
|
| 89 |
+ frameEnd = min(ceil(frameStart+decodeDuration + 0.5*decodeDuration),-globalStart+globalEnd); |
|
| 90 |
+ |
|
| 91 |
+ |
|
| 92 |
+ |
|
| 93 |
+ for iVoxel = 1:nVoxel % linear structure avoids 3D-Loop. |
|
| 94 |
+ % get coordinate for iVoxel |
|
| 95 |
+% coord = |
|
| 96 |
+ |
|
| 97 |
+ % get surrounding coordinates within radius |
|
| 98 |
+% sphere = |
|
| 99 |
+ |
|
| 100 |
+ % calculate decode performance on these coordinates |
|
| 101 |
+ svmdata = timePointMatrix{index}(:,2:size(timePointMatrix{index},2));
|
|
| 102 |
+ svmlabel = timePointMatrix{index}(:,1);
|
|
| 103 |
+ |
|
| 104 |
+ if RANDOMIZE_DATAPOINTS |
|
| 105 |
+ rndindex = randperm(length(svmlabel)); |
|
| 106 |
+ svmdata = svmdata(rndindex,:); |
|
| 107 |
+ svmlabel = svmlabel(rndindex); |
|
| 108 |
+ end |
|
| 109 |
+ decode = svm_single_crossval(svmlabel,svmdata,svmopts); |
|
| 110 |
+ % save the decode value to the corresponding coordinate |
|
| 111 |
+ end |
|
| 112 |
+ |
|
| 113 |
+ display('rastering done');
|
|
| 114 |
+ % save data for timeslice |
|
| 115 |
+ |
|
| 116 |
+ end %for each timeslice |
|
| 117 |
+ |
|
| 118 |
+ clear pst; %save memory! |
|
| 119 |
+end |
|
| 120 |
+ |
|
| 121 |
+end |
| ... | ... |
@@ -266,10 +266,10 @@ function model = createFirstStepPanel(model,parent,DEFAULT) |
| 266 | 266 |
set(btnRunButton1,'Callback',{@cbRunPreprocessing,model,'COORD'}); % set here, because of model.
|
| 267 | 267 |
set(btnRunButton1,'Enable','on'); |
| 268 | 268 |
|
| 269 |
- btnRunButton2 = uicontrol(pButtons,'String','run full-brain Searchlight',... |
|
| 269 |
+ btnRunButton2 = uicontrol(pButtons,'String',sprintf('use this settings for FBS'),...
|
|
| 270 | 270 |
'Units','normalized','Position',[0.33 0 0.33 1]); |
| 271 | 271 |
set(btnRunButton2,'Callback',{@cbRunPreprocessing,model,'FBS'}); % set here, because of model.
|
| 272 |
- set(btnRunButton2,'Enable','off'); |
|
| 272 |
+ set(btnRunButton2,'Enable','on'); |
|
| 273 | 273 |
|
| 274 | 274 |
btnRunButton3 = uicontrol(pButtons,'String','run ROI-Image processing',... |
| 275 | 275 |
'Units','normalized','Position',[0.66 0 0.33 1]); |
| ... | ... |
@@ -363,7 +363,7 @@ pSearchlight = uipanel(parent,'Units','normalized','Position',[0.0 0.1 1 0.3]); |
| 363 | 363 |
btnRunFBS = uicontrol(pSearchlight,'String','run Spatiotemporal FB classification',... |
| 364 | 364 |
'Units','normalized',... |
| 365 | 365 |
'Position',[0.0 0.0 1 0.3]); |
| 366 |
- set(btnRunFBS,'Enable','off'); |
|
| 366 |
+ set(btnRunFBS,'Enable','on'); |
|
| 367 | 367 |
|
| 368 | 368 |
|
| 369 | 369 |
% button callbacks set here, because of model. |
| 370 | 370 |