-
Notifications
You must be signed in to change notification settings - Fork 13
/
test-u_vis_volume_3d.R
223 lines (165 loc) · 10.7 KB
/
test-u_vis_volume_3d.R
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
test_that("A brain volume or parts of it can be rendered in voxel mode", {
testthat::skip_on_cran(); # CRAN maintainers asked me to reduce test time on CRAN by disabling unit tests.
testthat::skip_on_travis(); # Reduce test time on travis to prevent the build from being killed.
skip_if(tests_running_on_cran_under_macos(), message = "Skipping on CRAN under MacOS, required test data cannot be downloaded.");
skip_if_not(box.can.run.all.tests(), "This test requires X11 and all test data.");
fsbrain::download_optional_data();
subjects_dir = fsbrain::get_optional_data_filepath("subjects_dir");
skip_if_not(dir.exists(subjects_dir), message="Test data missing.");
subject_id = "subject1";
aseg = subject.volume(subjects_dir, subject_id, 'aseg'); # Not shipped with the package atm.
ventricle_aseg_codes = c(4, 14, 15, 43); # see FreeSurferColorLUT.txt
ventricle_mask = vol.mask.from.segmentation(aseg, ventricle_aseg_codes);
volvis.voxels(ventricle_mask, render_every = 10);
# Some more segmentation ROIs to play with:
wm_mask = vol.mask.from.segmentation(aseg, c(2, 41));
cortex_mask = vol.mask.from.segmentation(aseg, c(3, 42));
# Use voxel colors when rendering: gray-scale, computed from the intensity values of the volume itself:
volvis.voxels(ventricle_mask, voxelcol = 'from_intensity', render_every = 6);
# Use voxel colors when rendering: based on a colormap.
coloredvoxels = volvis.voxels(ventricle_mask, voxelcol = vol.overlay.colors.from.activation(ventricle_mask), render_every = 1);
render_animation = FALSE;
if(render_animation) {
rgloptions=list("windowRect"=c(80,80,800,800));
rglactions = list("movie"="vox_ventricles_rot");
vislayout.from.coloredmeshes(coloredvoxels, view_angles="sr", rgloptions = rgloptions, rglactions = rglactions);
}
expect_equal(1L, 1L); # Empty tests will be skipped by testthat.
})
test_that("A test volume or parts of it can be rendered in voxel mode", {
testthat::skip_on_cran(); # CRAN maintainers asked me to reduce test time on CRAN by disabling unit tests.
myvol = gen.test.volume(c(40, 40, 40), bg = NA);
volvis.voxels(myvol, render_every = 10);
volvis.voxels(myvol, render_every = 10, voxelcol = "blue");
myvol2 = gen.test.volume(c(40, 40, 40), bg = 0L);
volvis.voxels(myvol2, render_every = 10, voxelcol = "from_intensity");
testthat::expect_equal(dim(myvol), c(40, 40, 40)); # add a check to prevent skip
})
test_that("The voxel hull can be computed from a volume", {
testthat::skip_on_cran(); # CRAN maintainers asked me to reduce test time on CRAN by disabling unit tests.
myvol = gen.test.volume(c(25, 25, 25), bg = NA);
vh = vol.hull(myvol);
testthat::expect_equal(dim(myvol), dim(vh));
})
test_that("The voxel contour can be visualized for a volume", {
testthat::skip_on_cran(); # CRAN maintainers asked me to reduce test time on CRAN by disabling unit tests.
myvol = gen.test.volume(c(25, 25, 25), bg = 1L);
volvis.contour(myvol);
testthat::expect_equal(dim(myvol), c(25,25,25)); # add a check to prevent skip
#testthat::expect_error(volvis.contour(myvol, color = c("white", "green"))); # color must be a scalar
})
test_that("The voxel contour can be visualized for a volume", {
testthat::skip_on_cran(); # CRAN maintainers asked me to reduce test time on CRAN by disabling unit tests.
centers = matrix(rnorm(500*3)*100, ncol=3);
rglvoxels(centers, voxelcol="red");
rglvoxels(centers);
testthat::expect_equal(1L, 1L); # add a check to prevent skip
})
test_that("A brain volume segmentation can be rendered with correct colors from the aseg", {
testthat::skip_on_travis(); # Reduce test time on travis to prevent the build from being killed.
testthat::skip_on_cran(); # CRAN maintainers asked me to reduce test time on CRAN by disabling unit tests.
skip_if(tests_running_on_cran_under_macos(), message = "Skipping on CRAN under MacOS, required test data cannot be downloaded.");
skip_if_not(box.can.run.all.tests(), "This test requires X11, an aseg.mgz file for the demo subject and the FreeSurferColorLUT.");
fsbrain::download_optional_data();
subjects_dir = fsbrain::get_optional_data_filepath("subjects_dir");
skip_if_not(dir.exists(subjects_dir), message="Test data missing.");
subject_id = "subject1";
#aseg = subject.volume(subjects_dir, subject_id, 'aseg'); # Not shipped with the package atm.
aseg = subject.volume(subjects_dir, subject_id, 'aparc+aseg'); # Not shipped with the package atm.
aseg_codes = unique(as.vector(aseg));
fs_home = find.freesurferhome()$found_at;
ct = freesurferformats::read.fs.colortable(file.path(fs_home, 'FreeSurferColorLUT.txt'));
rgl::open3d();
all_regions_coloredvoxels = list();
for(aseg_code in aseg_codes) {
if(aseg_code == 0) { # skip background ('unknown').
next;
}
ct_entry = subset(ct, ct$struct_index == aseg_code);
ct_color_rgb = grDevices::rgb(ct_entry$r / 255., ct_entry$g / 255., ct_entry$b / 255.);
cv = volvis.voxels(vol.mask.from.segmentation(aseg, aseg_code), render_every=1, voxelcol=ct_color_rgb);
all_regions_coloredvoxels = c(all_regions_coloredvoxels, cv);
}
# Check it out, it looks pretty cool.
render_animation = FALSE;
if(render_animation) {
rgloptions=list("windowRect"=c(80,80,800,800));
rglactions = list("movie"="vox_aseg_rot");
vislayout.from.coloredmeshes(all_regions_coloredvoxels, view_angles="sr", rgloptions = rgloptions, rglactions = rglactions);
}
expect_equal(1L, 1L); # Empty tests will be skipped by testthat.
})
test_that("Brain structures can be rendered as contours using misc3d", {
testthat::skip_on_cran(); # CRAN maintainers asked me to reduce test time on CRAN by disabling unit tests.
testthat::skip_if(tests_running_on_cran_under_macos(), message = "Skipping on CRAN under MacOS, required test data cannot be downloaded.");
testthat::skip_if_not(box.can.run.all.tests(), "This test requires X11, the misc3d package, and an aseg.mgz file for the demo subject.");
fsbrain::download_optional_data();
subjects_dir = fsbrain::get_optional_data_filepath("subjects_dir");
testthat::skip_if_not(dir.exists(subjects_dir), message="Test data missing.");
subject_id = "subject1";
aseg = subject.volume(subjects_dir, subject_id, 'aseg'); # Not shipped with the package atm.
ventricle_aseg_codes = c(4, 14, 15, 43); # see FreeSurferColorLUT.txt
ventricle_mask = vol.mask.from.segmentation(aseg, ventricle_aseg_codes);
# Remove the NAs, contour3d does not seem to like them.
ventricle_mask_mod = ventricle_mask;
ventricle_mask_mod[which(is.na(ventricle_mask), arr.ind=T)] = 0;
custom_colors = grDevices::terrain.colors(length(ventricle_aseg_codes));
misc3d::contour3d(ventricle_mask_mod, level=ventricle_aseg_codes, color=custom_colors, alpha = seq(0.2, 0.5, length.out = length(ventricle_aseg_codes)));
## ---- Draw the surface of the left hemi, and the ventricle contours into the same plot ----
vis.subject.morph.native(subjects_dir, 'subject1', 'thickness', 'lh', views = 'si', style='semitransparent');
vent_tris = misc3d::contour3d(ventricle_mask_mod, level=3, color="red", draw=FALSE);
# # Fix the rendering coords to surface RAS
vent_tris = apply.transform(vent_tris, vox2ras_tkr());
misc3d::drawScene.rgl(vent_tris, add = TRUE);
## Add transparent overlay of whole brain for worse performance ><
have_mighty_computer = TRUE;
if(have_mighty_computer) {
brain_tris = misc3d::contour3d(aseg, level=1, color="gray", alpha=0.1, back='culled', draw = FALSE);
brain_tris = apply.transform(brain_tris, vox2ras_tkr());
misc3d::drawScene.rgl(brain_tris, add = TRUE);
}
expect_equal(1L, 1L); # Empty tests will be skipped by testthat.
})
test_that("The pial surface drawn as a transparent wrapping over the white surface", {
testthat::skip_on_travis(); # Reduce test time on travis to prevent the build from being killed.
testthat::skip_on_cran(); # CRAN maintainers asked me to reduce test time on CRAN by disabling unit tests.
skip_if(tests_running_on_cran_under_macos(), message = "Skipping on CRAN under MacOS, required test data cannot be downloaded.");
skip_if_not(box.can.run.all.tests(), "This test requires X11 and extra data.");
fsbrain::download_optional_data();
subjects_dir = testdatapath.subjectsdir.full.subject1();
skip_if_not(dir.exists(subjects_dir), message="Test data missing.");
subject_id = "subject1";
cm_white = vis.subject.morph.native(subjects_dir, 'subject1', 'thickness', hemi = 'both', surface = 'white', views = NULL);
cm_pial = vis.subject.morph.native(subjects_dir, 'subject1', 'thickness', hemi = 'both', surface = 'pial', views = NULL);
cm_pial[[1]]$style = 'semitransparent';
cm_pial[[2]]$style = 'semitransparent';
vis.coloredmeshes(c(cm_white, cm_pial), skip_all_na = FALSE, style = 'from_mesh');
expect_equal(1L, 1L); # Empty tests will be skipped by testthat.
})
test_that("Voxels can be rotated and rendered in a brainview", {
testthat::skip_on_cran(); # CRAN maintainers asked me to reduce test time on CRAN by disabling unit tests.
skip_if(tests_running_on_cran_under_macos(), message = "Skipping on CRAN under MacOS, required test data cannot be downloaded.");
skip_if_not(box.can.run.all.tests(), "This test requires X11.");
fsbrain::download_optional_data();
subjects_dir = fsbrain::get_optional_data_filepath("subjects_dir");
skip_if_not(dir.exists(subjects_dir), message="Test data missing.");
subject_id = "subject1";
vol = subject.volume(subjects_dir, subject_id, "brain");
vol[vol < 90] = NA;
volvox = volvis.voxels(vol);
brainviews("t9", volvox);
expect_equal(1L, 1L); # Empty tests will be skipped by testthat.
})
test_that("A misc3d contour (Triangles3D instance) can be rotated and rendered in a brainview", {
testthat::skip_on_cran(); # CRAN maintainers asked me to reduce test time on CRAN by disabling unit tests.
skip_if(tests_running_on_cran_under_macos(), message = "Skipping on CRAN under MacOS, required test data cannot be downloaded.");
skip_if_not(box.can.run.all.tests(), "This test requires X11.");
fsbrain::download_optional_data();
subjects_dir = fsbrain::get_optional_data_filepath("subjects_dir");
skip_if_not(dir.exists(subjects_dir), message="Test data missing.");
subject_id = "subject1";
vol = subject.volume(subjects_dir, subject_id, "brain");
surface_tris = fsbrain::volvis.contour(vol);
brainviews("t9", surface_tris);
expect_equal(1L, 1L); # Empty tests will be skipped by testthat.
})