Browse code

snapshot, working on fbs

git-svn-id: https://svn.discofish.de/MATLAB/spmtoolbox/SVMCrossVal@166 83ab2cfd-5345-466c-8aeb-2b2739fb922d

Christoph Budziszewski authored on 27/03/2009 14:57:26
Showing 5 changed files
1 1
new file mode 100644
... ...
@@ -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 41
new file mode 100644
... ...
@@ -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
... ...
@@ -48,9 +48,7 @@ switch task
48 48
         coordargs.psthOpts      = psthOpts;
49 49
         
50 50
         out.subjectdata = runCoordTable(coordargs);
51
-        
52
-        assignin('base','preprocessedData',out);
53
-        
51
+
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;
... ...
@@ -96,10 +93,16 @@ switch task
96 93
         fbsargs.sessionList     = 1:3;
97 94
         fbsargs.eventList       = classDef.eventMatrix;
98 95
         fbsargs.psthOpts        = psthOpts;
99
-        
100
-        out.subjectdata = runFBSImageMaskMode(fbsargs);
96
+
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
 
145 149
new file mode 100644
... ...
@@ -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.