test_that("We can compute vertex distances on a sphere based on a spherical surface.", {
testthat::skip_on_cran();
fsbrain::download_fsaverage3(T); # Currently does NOT download the sphere file used below, you need to copy it manually.
sphere_surf_file = get_optional_data_filepath("subjects_dir/fsaverage3/surf/lh.sphere", mustWork = F);
if(! file.exists(sphere_surf_file)) {
testthat::skip("The sphere file is available");
}
spherical_surface = freesurferformats::read.fs.surface(sphere_surf_file);
num_verts = nrow(spherical_surface$vertices);
testthat::expect_equal(num_verts, 642L);
sphere_dists = surf.sphere.dist(spherical_surface, maxdist = 15.0);
testthat::expect_true(is.list(sphere_dists));
testthat::expect_true(all(names(sphere_dists) == c("neigh", "neigh_dist_dotproduct", "neigh_dist_surface")));
testthat::expect_true(is.list(sphere_dists$neigh));
testthat::expect_equal(length(sphere_dists$neigh), num_verts);
testthat::expect_true(is.list(sphere_dists$neigh_dist_dotproduct));
testthat::expect_equal(length(sphere_dists$neigh_dist_dotproduct), num_verts);
testthat::expect_true(is.list(sphere_dists$neigh_dist_surface));
testthat::expect_equal(length(sphere_dists$neigh_dist_surface), num_verts);
# So far we have only tested the data structure, but not whether the computed distances and neighbors
# themselves make any sense.
#
# One should look at the histogram of neighbor distances on the sphere for any vertex to
# quickly see whether it makes sense. E.g.,: hist(sphere_dists$neigh_dist_dotproduct[[1]]);
})
test_that("We can compute Gaussian weights based on a spherical surface.", {
testthat::skip_on_cran();
fsbrain::download_optional_data(); # Currently does NOT download the sphere file used below, you need to copy it manually.
sphere_surf_file = get_optional_data_filepath("subjects_dir/fsaverage3/surf/lh.sphere", mustWork = F);
if(! file.exists(sphere_surf_file)) {
testthat::skip("The sphere file is available");
}
fwhm = 5.0;
spherical_surface = freesurferformats::read.fs.surface(sphere_surf_file);
nv = nrow(spherical_surface$vertices);
sphere_dists = surf.sphere.dist(spherical_surface, maxdist = 20.0);
gstd = fwhm / sqrt(log(256.0));
gaussian_weights = fsbrain:::surf.sphere.gaussianweights(spherical_surface, sphere_dists, gstd);
testthat::expect_equal(length(sphere_dists$neigh), nv);
testthat::expect_equal(length(sphere_dists$neigh_dist_dotproduct), nv);
testthat::expect_equal(length(sphere_dists$neigh_dist_surface), nv);
# Check neighborhood of a single vertex
testthat::expect_equal(length(sphere_dists$neigh[[500]]), 7L);
testthat::expect_equal(length(sphere_dists$neigh_dist_dotproduct[[500]]), 7L);
testthat::expect_equal(length(sphere_dists$neigh_dist_surface[[500]]), 7L);
testthat::expect_equal(length(gaussian_weights), nv);
testthat::expect_equal(length(gaussian_weights[[500]]), 7L);
testthat::expect_equal(sum(gaussian_weights[[500]]), 1.0); # Test that weights sum to 1.0
})
test_that("Computing fwhm from niters and vice versa is consistent.", {
testthat::skip("This test is broken");
testthat::skip_on_cran();
fsbrain::download_optional_data(); # Currently does NOT download the sphere file used below, you need to copy it manually.
sphere_surf_file = get_optional_data_filepath("subjects_dir/fsaverage3/surf/lh.sphere", mustWork = F);
if(! file.exists(sphere_surf_file)) {
testthat::skip("The sphere file is available");
}
fwhm = 15.0;
spherical_surface = freesurferformats::read.fs.surface(sphere_surf_file);
# This is not gonna work because the niter value gets rounded down and transformed to an integer before returning it.
niter = fsbrain:::pervertexdata.smoothnn.compute.numiter(spherical_surface, fwhm = fwhm, is_template = TRUE);
fwhm2 = fsbrain:::pervertexdata.smoothnn.compute.fwhm(spherical_surface, niter, is_template = TRUE);
testthat::expect_equal(fwhm, fwhm2, tolerance = 1e-2);
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.