-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnormalize.m
125 lines (111 loc) · 5.26 KB
/
normalize.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
%-----------------------------------------------------------------------
% normalize.m
%
% Description: Create DARTEL template for normalization, then normalize all modalities to
% MNI space
% Author: Jonah Isen
% Created: February 17th, 2020
% Last Modified: June 25th, 2021
%-----------------------------------------------------------------------
function normalize(path, groups, sizes)
disp('Generating DARTEL template');
rc1s = {};
rc2s = {};
buffer = 1;
%Create cell arrays of grey and white matter
for i = 1:length(groups)
group = groups{i};
size = sizes{i};
for j = 1:size
rc1 = strcat(path, 'rc1', group, num2str(j, '%03.f'), '_T1.nii');
rc2 = strcat(path, 'rc2', group, num2str(j, '%03.f'), '_T1.nii');
if exist(rc1, 'file') == 2 && exist(rc2, 'file') == 2
rc1s{buffer} = rc1;
rc2s{buffer} = rc2;
buffer = buffer + 1;
end
end
end
%Create DARTEL template from segmented grey matter and white matter
matlabbatch{1}.spm.tools.dartel.warp.images{1,1} = rc1s.';
matlabbatch{1}.spm.tools.dartel.warp.images{1,2} = rc2s.';
matlabbatch{1}.spm.tools.dartel.warp.settings.template = 'Template';
matlabbatch{1}.spm.tools.dartel.warp.settings.rform = 0;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(1).its = 3;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(1).rparam = [4 2 1e-06];
matlabbatch{1}.spm.tools.dartel.warp.settings.param(1).K = 0;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(1).slam = 16;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(2).its = 3;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(2).rparam = [2 1 1e-06];
matlabbatch{1}.spm.tools.dartel.warp.settings.param(2).K = 0;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(2).slam = 8;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(3).its = 3;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(3).rparam = [1 0.5 1e-06];
matlabbatch{1}.spm.tools.dartel.warp.settings.param(3).K = 1;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(3).slam = 4;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(4).its = 3;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(4).rparam = [0.5 0.25 1e-06];
matlabbatch{1}.spm.tools.dartel.warp.settings.param(4).K = 2;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(4).slam = 2;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(5).its = 3;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(5).rparam = [0.25 0.125 1e-06];
matlabbatch{1}.spm.tools.dartel.warp.settings.param(5).K = 4;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(5).slam = 1;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(6).its = 3;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(6).rparam = [0.25 0.125 1e-06];
matlabbatch{1}.spm.tools.dartel.warp.settings.param(6).K = 6;
matlabbatch{1}.spm.tools.dartel.warp.settings.param(6).slam = 0.5;
matlabbatch{1}.spm.tools.dartel.warp.settings.optim.lmreg = 0.01;
matlabbatch{1}.spm.tools.dartel.warp.settings.optim.cyc = 3;
matlabbatch{1}.spm.tools.dartel.warp.settings.optim.its = 3;
spm_jobman('run',matlabbatch)
clear matlabbatch;
%Template generated from above code
final_template = strcat(path, 'Template_6.nii');
disp('Normalizing data to MNI space');
mods = ["GM", "WM", "DTI_FA", "DTI_MD", "NODDI_ficvf", "FLAIR"];
%Normalize all modalities
batchBuffer = 0;
for i = 1:length(groups)
group = groups{i};
size = sizes{i};
for j = 1:size
toNormalize = {};
buffer = 1;
%Loop makes cell array of paths to images to be normalized for each
%subject
for k = 1:length(mods)
if strcmp("GM", mods(k))
current = strcat(path, 'c1', group, num2str(j, '%03.f'), '_T1.nii');
elseif strcmp("WM", mods(k))
current = strcat(path, 'c2', group, num2str(j, '%03.f'), '_T1.nii');
elseif strcmp("FLAIR", mods(k))
current = strcat(path, 'rm', group, num2str(j, '%03.f'), '_', char(mods(k)), '.nii');
else
current = strcat(path, 'r', group, num2str(j, '%03.f'), '_', char(mods(k)), '.nii');
end
if exist(current, 'file') == 2
toNormalize{buffer} = {current};
buffer = buffer + 1;
disp(current)
end
end
%Use flowfield generated by previous step
flowfield = strcat(path, 'u_rc1', group, num2str(j, '%03.f'), '_T1_Template.nii');
if exist(flowfield, 'file') == 2 && ~isempty(toNormalize)
batchBuffer = batchBuffer + 1;
matlabbatch{batchBuffer}.spm.tools.dartel.mni_norm.template = {final_template};
matlabbatch{batchBuffer}.spm.tools.dartel.mni_norm.data.subjs.flowfields = {flowfield};
matlabbatch{batchBuffer}.spm.tools.dartel.mni_norm.data.subjs.images = toNormalize.';
matlabbatch{batchBuffer}.spm.tools.dartel.mni_norm.vox = [NaN NaN NaN];
matlabbatch{batchBuffer}.spm.tools.dartel.mni_norm.bb = [NaN NaN NaN
NaN NaN NaN];
matlabbatch{batchBuffer}.spm.tools.dartel.mni_norm.preserve = 0;
matlabbatch{batchBuffer}.spm.tools.dartel.mni_norm.fwhm = [8 8 8]; %8mm gaussian FWHM smoothing
end
end
end
if batchBuffer > 0
spm_jobman('run',matlabbatch);
end
end