Test label geometric computations.
(fname, area)
| 1225 | ], |
| 1226 | ) |
| 1227 | def test_label_geometry(fname, area): |
| 1228 | """Test label geometric computations.""" |
| 1229 | pytest.importorskip("nibabel") |
| 1230 | label = read_label(fname, subject="sample") |
| 1231 | got_area = label.compute_area(subjects_dir=subjects_dir) |
| 1232 | assert_allclose(got_area, area, rtol=1e-3) |
| 1233 | # using a sparse label emits a warning |
| 1234 | label_sparse = label.restrict(src_fname) |
| 1235 | assert 0 < len(label_sparse.vertices) < len(label.vertices) |
| 1236 | with pytest.warns(RuntimeWarning, match="No complete triangles"): |
| 1237 | assert label_sparse.compute_area(subjects_dir=subjects_dir) == 0.0 |
| 1238 | dist, outside = label.distances_to_outside(subjects_dir=subjects_dir) |
| 1239 | rr, tris = read_surface(subjects_dir / "sample" / "surf" / "lh.white") |
| 1240 | mask = np.zeros(len(rr), bool) |
| 1241 | mask[label.vertices] = 1 |
| 1242 | border_mask = np.isin(label.vertices, _mesh_borders(tris, mask)) |
| 1243 | # The distances of the border vertices is smaller than that of non-border |
| 1244 | lo, mi, hi = np.percentile(dist[border_mask], (0, 50, 100)) |
| 1245 | assert 0.1e-3 < lo < 0.5e-3 < mi < 1.0e-3 < hi < 2.0e-3 |
| 1246 | lo, mi, hi = np.percentile(dist[~border_mask], (0, 50, 100)) |
| 1247 | assert 0.5e-3 < lo < 1.0e-3 < mi < 9.0e-3 < hi < 25e-3 |
| 1248 | # check that the distances are close but uniformly <= than euclidean |
| 1249 | assert not np.isin(outside, label.vertices).any() |
| 1250 | border_dist = dist[border_mask] |
| 1251 | border_euc = 1e-3 * np.linalg.norm( |
| 1252 | rr[label.vertices[border_mask]] - rr[outside[border_mask]], axis=1 |
| 1253 | ) |
| 1254 | assert_allclose(border_dist, border_euc, atol=1e-4) |
| 1255 | inside_dist = dist[~border_mask] |
| 1256 | inside_euc = 1e-3 * np.linalg.norm( |
| 1257 | rr[label.vertices[~border_mask]] - rr[outside[~border_mask]], axis=1 |
| 1258 | ) |
| 1259 | assert_array_less(inside_euc, inside_dist) |
| 1260 | assert_array_less(0.25 * inside_dist, inside_euc) |
nothing calls this directly
no test coverage detected