-
Notifications
You must be signed in to change notification settings - Fork 4
/
niftiWriteRF.m
109 lines (78 loc) · 3.22 KB
/
niftiWriteRF.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
% niftiWriteRF.m
%
% writes params of an RF model, COMPUTED INPLANE!!!, to a nii file where
% each volume contains a different parameter; the first (0th) being the
% variance explained for thresholding. Readable by programs such as afni,
% fsl (not tested), BV (not tested), etc.
%
% RFmodel is a model structure saved by rmMain.m
% new_fn is the filename of the nii (extension .nii or .nii.gz)
% basenii is a nifti structure in the 'correct' orientation of the
% functional data used to create RF maps (e.g., load one of the averaged
% vols)
%
% NOTE: no support for sigma major/minor (assumes major), etc - really
% built for nonlinear models, but can be adjusted to deal w/ others...
%
%
% Tommy Sprague, 4/5/2017
% - 7/30/2017 - changed order b/w default phase & VE - afni defaults to
% thresholding on 2nd dim. Also write out a new_fn_params.txt of order of
% params saved, to be used by label_retmap.sh
function niftiWriteRF(RFmodel,new_fn,basenii,which_params,xform)
if nargin < 2
% error
end
if nargin < 3
% either create a null nifti w/ niftiCreate, or load the first
% bar_width_*.nii.gz file in output directory? probably former (TODO)
basenii = [];
end
% check whether basenii is a niftiStruct?
if nargin < 4
which_params = {'pol','ve','ecc','sigmamajor','exponent','x0','y0','b'};
end
if nargin < 5
xform = niftiCreateXformBetweenStrings('PRS','PRS'); % identity transform matrix
end
% clear out data
newnii = basenii;
newnii.data = newnii.data*0;
% apply xform to PRS (the internal coord system of inplane models) NOTE -
% not necessary for square slices, like in afni, but in theory maybe
% important for non-square slices? I'll leave it in, doesn't harm
% anyone...
curr_ori = niftiCurrentOrientation(newnii); % what ori is the original data in?
newnii = niftiApplyXform(newnii,niftiCreateXformBetweenStrings(curr_ori,'PRS')); % reorient the nii so it's in the 'matched' ori as the model (PRS)
newnii.data = newnii.data(:,:,:,1:length(which_params));
newnii.dim(4) = length(which_params);
% TODO: check the model.(param) sizes match the first 3 nifti dims
% loop over which_params and insert into the relevant volume
for pp = 1:length(which_params)
if strcmpi(which_params{pp},'b')
tmp = rmGet(RFmodel,which_params{pp});
newnii.data(:,:,:,pp) = tmp(:,:,:,1);
clear tmp;
else
newnii.data(:,:,:,pp) = rmGet(RFmodel,which_params{pp});
end
% check if "b", if so, take only the first volume...
end
%% apply transform to 'final' nifti
% (maybe just need to flip the data brick? this may change qto/etc in a
% way we don't need....)
% convert from vista internal to an orientation that afni will like
newnii = niftiApplyXform(newnii,niftiCreateXformBetweenStrings('PRS','LPS'));
% fix the qto, sto to be like the base nii!!!!
savenii = basenii;
savenii.data = newnii.data;
savenii.dim = newnii.dim;
% this should have the correct position info, but a data block that's in
% the right orientation, etc....
niftiWrite(savenii,new_fn);
% find 1:.nii*, then remove everything after nii* and replace w/ _params.txt
params_fn = sprintf('%s_params.txt',new_fn(1:(strfind(new_fn,'.nii')-1)));
fid = fopen(params_fn,'w');
fprintf(fid,'%s ',which_params{:});
fclose(fid);
return