25
25
%
26
26
% Input-referred model (IRM) mapping tool.
27
27
%
28
- % irm = IRM(params ) creates an instance of the IRM class.
29
- % params is a structure with 5 required fields
28
+ % irm = IRM(parameters ) creates an instance of the IRM class.
29
+ % parameters is a structure with 5 required fields
30
30
% - f_sampling: sampling frequency (1/TR)
31
31
% - n_samples : number of samples (volumes)
32
32
% - n_rows : number of rows (in-plane resolution)
55
55
% (e.g. help IRM.mapping)
56
56
%
57
57
% typical workflow:
58
- % 1. irm = IRM(params );
58
+ % 1. irm = IRM(parameters );
59
59
% 2. irm.set_stimulus();
60
60
% 3. irm.create_timecourse(FUN,xdata);
61
61
% 4. results = irm.mapping(data);
87
87
88
88
methods (Access = public )
89
89
90
- function self = IRM(params ,varargin )
90
+ function self = IRM(parameters ,varargin )
91
91
% constructor
92
92
p = inputParser ;
93
- addRequired(p ,' params ' ,@isstruct );
93
+ addRequired(p ,' parameters ' ,@isstruct );
94
94
addOptional(p ,' hrf' ,[]);
95
- p .parse(params ,varargin{: });
95
+ p .parse(parameters ,varargin{: });
96
96
97
97
self.is = ' input-referred modeling tool' ;
98
98
99
99
self.two_gamma = @(t ) (6 * t .^ 5 .* exp(-t ))./gamma(6 )...
100
100
- 1 / 6 *(16 * t .^ 15 .* exp(-t ))/gamma(16 );
101
101
102
- self.f_sampling = p .Results .params .f_sampling ;
102
+ self.f_sampling = p .Results .parameters .f_sampling ;
103
103
self.p_sampling = 1 / self .f_sampling ;
104
- self.n_samples = p .Results .params .n_samples ;
105
- self.n_rows = p .Results .params .n_rows ;
106
- self.n_cols = p .Results .params .n_cols ;
107
- self.n_slices = p .Results .params .n_slices ;
104
+ self.n_samples = p .Results .parameters .n_samples ;
105
+ self.n_rows = p .Results .parameters .n_rows ;
106
+ self.n_cols = p .Results .parameters .n_cols ;
107
+ self.n_slices = p .Results .parameters .n_slices ;
108
108
self.n_total = self .n_rows * self .n_cols * self .n_slices ;
109
109
110
110
if ~isempty(p .Results .hrf )
@@ -228,7 +228,7 @@ function create_timecourse(self,FUN,xdata)
228
228
%
229
229
% optional inputs are
230
230
% - threshold: minimum voxel intensity (default = 100.0)
231
- % - mask : binary mask for selecting voxels
231
+ % - mask : binary mask for selecting voxels
232
232
233
233
text = ' mapping input-referred model...' ;
234
234
fprintf(' %s\n ' ,text )
@@ -247,7 +247,7 @@ function create_timecourse(self,FUN,xdata)
247
247
data = reshape(data(1 : self .n_samples ,: ,: ,: ),...
248
248
self .n_samples ,self .n_total );
249
249
mean_signal = mean(data );
250
- data = zscore( data );
250
+
251
251
252
252
if isempty(mask )
253
253
mask = mean_signal >= threshold ;
@@ -256,53 +256,51 @@ function create_timecourse(self,FUN,xdata)
256
256
voxel_index = find(mask );
257
257
n_voxels = numel(voxel_index );
258
258
259
- mag_d = sqrt(sum(data(: ,mask ).^2 ));
259
+ data = zscore(data(: ,mask ));
260
+ mag_d = sqrt(sum(data .^ 2 ));
260
261
261
262
results.R = zeros(self .n_total ,1 );
262
263
results.P = zeros(self .n_total ,self .n_predictors );
263
264
264
265
if size(self .hrf ,2 )==1
265
- hrf_fft = fft(repmat([self .hrf ;...
266
- zeros(self .n_samples - self .l_hrf ,1 )],...
267
- [1 ,self .n_points ]));
266
+ hrf_fft = fft([self .hrf ;...
267
+ zeros(self .n_samples - self .l_hrf ,1 )]);
268
268
tc = zscore(ifft(self .tc_fft .* hrf_fft ))' ;
269
269
270
270
mag_tc = sqrt(sum(tc .^ 2 ,2 ));
271
271
for m= 1 : n_voxels
272
272
v = voxel_index(m );
273
273
274
- CS = (tc * data(: ,v ))./...
275
- (mag_tc * mag_d(v ));
274
+ CS = (tc * data(: ,m ))./...
275
+ (mag_tc * mag_d(m ));
276
276
id = isinf(CS ) | isnan(CS );
277
277
CS(id ) = 0 ;
278
278
[results .R(v ),j ] = max(CS );
279
279
for p= 1 : self .n_predictors
280
280
results .P(v ,p ) = self.xdata{p }(self .idx(j ,p ));
281
281
end
282
282
283
- waitbar(v / self . n_total ,wb )
283
+ waitbar(m / n_voxels ,wb )
284
284
end
285
285
else
286
- hrf_fft_all = fft([self .hrf ;...
287
- zeros(self .n_samples - self .l_hrf ,self . n_total )]);
286
+ hrf_fft_all = fft([self .hrf( : , mask ) ;...
287
+ zeros(self .n_samples - self .l_hrf ,n_voxels )]);
288
288
for m= 1 : n_voxels
289
289
v = voxel_index(m );
290
290
291
- hrf_fft = repmat(hrf_fft_all(: ,v ),...
292
- [1 ,self .n_points ]);
293
- tc = zscore(ifft(self .tc_fft .* hrf_fft ))' ;
291
+ tc = zscore(ifft(self .tc_fft .* hrf_fft_all(: ,m )))' ;
294
292
mag_tc = sqrt(sum(tc .^ 2 ,2 ));
295
293
296
- CS = (tc * data(: ,v ))./...
297
- (mag_tc * mag_d(v ));
294
+ CS = (tc * data(: ,m ))./...
295
+ (mag_tc * mag_d(m ));
298
296
id = isinf(CS ) | isnan(CS );
299
297
CS(id ) = 0 ;
300
298
[results .R(v ),j ] = max(CS );
301
299
for p= 1 : self .n_predictors
302
300
results .P(v ,p ) = self .xdata(self .idx(j ,p ),p );
303
301
end
304
302
305
- waitbar(v / self . n_total ,wb )
303
+ waitbar(m / n_voxels ,wb )
306
304
end
307
305
end
308
306
results.R = reshape(results .R ,self .n_rows ,self .n_cols ,self .n_slices );
0 commit comments