-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdp_node_md.m
executable file
·68 lines (42 loc) · 1.46 KB
/
dp_node_md.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
classdef dp_node_md < dp_node
properties
% defaults for mdt mapping
b_min = 1.4e9;
b_max = 2.6e9;
b_delta = 0;
name = 'MDT';
opt = struct('filter_sigma', 0.5);
end
methods
function output = i2o(obj, input)
op = msf_fileparts(input.nii_fn);
output.bp = input.bp;
output.op = op;
output.md_fn = fullfile(output.op, [obj.name '.nii.gz']);
1;
end
function output = execute(obj, input, output)
[I,h] = mdm_nii_read(input.nii_fn);
xps = mdm_xps_load(mdm_xps_fn_from_nii_fn(input.nii_fn));
if (obj.opt.filter_sigma > 0)
I = mio_smooth_4d(I, obj.opt.filter_sigma);
end
ind = ...
(xps.b > obj.b_min) & ...
(xps.b < obj.b_max) & ...
(abs(xps.b_delta - obj.b_delta) < 0.01);
X = [ones(sum(ind), 1) xps.b(ind) * 1e-9];
g = @(x)reshape(x(:,:,:,ind), prod(size(I,1,2,3)), sum(ind));
M = log(abs(g(double(I)))) * X * inv(X' * X);
M = reshape(M, [size(I,1,2,3) 2]);
MD = -M(:,:,:,2);
MD(MD < 0) = 0;
MD(MD > 4) = 4;
if (~isempty(input.mask_fn))
mask = mdm_nii_read(input.mask_fn);
MD = MD .* double(mask);
end
mdm_nii_write(MD, output.md_fn, h);
end
end
end