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

1"""Utilities for surface mesh, data, images.""" 

2 

3from warnings import warn 

4 

5import numpy as np 

6 

7from nilearn._utils.exceptions import MeshDimensionError 

8from nilearn._utils.logger import find_stack_level 

9 

10 

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 ) 

20 

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 ) 

26 

27 

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]) 

33 

34 

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 ) 

44 

45 

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 ) 

58 

59 

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 ) 

67 

68 

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.") 

75 

76 

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)