Coverage for nilearn/surface/utils.py: 18%
42 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-16 12:32 +0200
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-16 12:32 +0200
1"""Utilities for surface mesh, data, images."""
3from warnings import warn
5import numpy as np
7from nilearn._utils.exceptions import MeshDimensionError
8from nilearn._utils.logger import find_stack_level
11def assert_polydata_equal(data_1, data_2):
12 """Check that 2 PolyData data are equal."""
13 set_1 = set(data_1.parts.keys())
14 set_2 = set(data_2.parts.keys())
15 if set_1 != set_2:
16 diff = set_1.symmetric_difference(set_2)
17 raise ValueError(
18 f"PolyData do not have the same keys. Offending keys: {diff}"
19 )
21 for key in data_1.parts:
22 if not np.array_equal(data_1.parts[key], data_2.parts[key]):
23 raise ValueError(
24 f"Part '{key}' of PolyData instances are not equal."
25 )
28def assert_polymesh_equal(mesh_1, mesh_2) -> None:
29 """Check that 2 PolyMeshes are equal."""
30 assert_polymesh_have_same_keys(mesh_1, mesh_2)
31 for key in mesh_1.parts:
32 assert_surface_mesh_equal(mesh_1.parts[key], mesh_2.parts[key])
35def assert_polymesh_have_same_keys(mesh_1, mesh_2):
36 """Check that 2 polymeshes have the same keys."""
37 set_1 = set(mesh_1.parts.keys())
38 set_2 = set(mesh_2.parts.keys())
39 if set_1 != set_2:
40 diff = set_1.symmetric_difference(set_2)
41 raise MeshDimensionError(
42 f"PolyMeshes do not have the same keys. Offending keys: {diff}"
43 )
46def check_polymesh_equal(mesh_1, mesh_2) -> None:
47 """Check polymesh at-least have same number of vertices if not equal."""
48 try:
49 assert_polymesh_equal(mesh_1, mesh_2)
50 except MeshDimensionError:
51 assert_polymesh_have_same_keys(mesh_1, mesh_2)
52 for key in mesh_1.parts:
53 assert_same_number_vertices(mesh_1.parts[key], mesh_2.parts[key])
54 warn(
55 "Meshes are not identical but have compatible number of vertices.",
56 stacklevel=find_stack_level(),
57 )
60def assert_same_number_vertices(mesh_1, mesh_2):
61 """Assert 2 meshes or polymeshes have the same number of vertices."""
62 if mesh_1.n_vertices != mesh_2.n_vertices:
63 raise MeshDimensionError(
64 f"Number of vertices do not match for between meshes.\n"
65 f"{mesh_1.n_vertices=} and {mesh_2.n_vertices=}"
66 )
69def assert_surface_mesh_equal(mesh_1, mesh_2) -> None:
70 """Check that 2 SurfaceMeshes are equal."""
71 if not np.array_equal(mesh_1.coordinates, mesh_2.coordinates):
72 raise MeshDimensionError("Meshes do not have the same coordinates.")
73 if not np.array_equal(mesh_1.faces, mesh_2.faces):
74 raise MeshDimensionError("Meshes do not have the same faces.")
77def assert_surface_image_equal(img_1, img_2) -> None:
78 """Check that 2 SurfaceImages are equal."""
79 assert_polymesh_equal(img_1.mesh, img_2.mesh)
80 assert_polydata_equal(img_1.data, img_2.data)