Skip to content

Commit 803b092

Browse files
Merge pull request #234 from NeurodataWithoutBorders/order_of_images
add checks and tests for bounds of radians and degrees
2 parents 04f44cd + 822e820 commit 803b092

File tree

2 files changed

+97
-1
lines changed

2 files changed

+97
-1
lines changed

nwbinspector/checks/behavior.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""Checks for types belonging to the pynwb.behavior module."""
2+
import numpy as np
23
from pynwb.behavior import SpatialSeries, CompassDirection
34

45
from ..register_checks import register_check, Importance, InspectorMessage
@@ -21,3 +22,23 @@ def check_compass_direction_unit(compass_direction: CompassDirection):
2122
message=f"SpatialSeries objects inside a CompassDirection object should be angular and should have a "
2223
f"unit of 'degrees' or 'radians', but '{spatial_series.name}' has units '{spatial_series.unit}'."
2324
)
25+
26+
27+
@register_check(importance=Importance.BEST_PRACTICE_VIOLATION, neurodata_type=SpatialSeries)
28+
def check_spatial_series_radians_magnitude(spatial_series: SpatialSeries, nelems: int = 200):
29+
if spatial_series.unit in ("radian", "radians"):
30+
data = spatial_series.data[:nelems]
31+
if np.any(data > (2 * np.pi)) or np.any(data < (-2 * np.pi)):
32+
return InspectorMessage(
33+
message="SpatialSeries with units of radians must have values between -2pi and 2pi."
34+
)
35+
36+
37+
@register_check(importance=Importance.BEST_PRACTICE_VIOLATION, neurodata_type=SpatialSeries)
38+
def check_spatial_series_degrees_magnitude(spatial_series: SpatialSeries, nelems: int = 200):
39+
if spatial_series.unit in ("degree", "degrees"):
40+
data = spatial_series.data[:nelems]
41+
if np.any(data > 360) or np.any(data < -360):
42+
return InspectorMessage(
43+
message="SpatialSeries with units of degrees must have values between -360 and 360."
44+
)

tests/unit_tests/test_behavior.py

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
22
import numpy as np
33

44
from nwbinspector import InspectorMessage, Importance
5-
from nwbinspector.checks.behavior import check_compass_direction_unit, check_spatial_series_dims
5+
from nwbinspector.checks.behavior import (
6+
check_compass_direction_unit,
7+
check_spatial_series_dims,
8+
check_spatial_series_degrees_magnitude,
9+
check_spatial_series_radians_magnitude,
10+
)
611

712

813
def test_check_spatial_series_dims():
@@ -81,3 +86,73 @@ def test_pass_check_compass_direction_unit():
8186
)
8287

8388
assert check_compass_direction_unit(obj) is None
89+
90+
91+
def test_pass_check_spatial_series_degrees_magnitude():
92+
93+
spatial_series = SpatialSeries(
94+
name="SpatialSeries",
95+
description="description",
96+
data=np.ones((10,)),
97+
rate=3.0,
98+
reference_frame="reference_frame",
99+
unit="degrees",
100+
)
101+
102+
assert check_spatial_series_degrees_magnitude(spatial_series) is None
103+
104+
105+
def test_check_spatial_series_degrees_magnitude():
106+
107+
spatial_series = SpatialSeries(
108+
name="SpatialSeries",
109+
description="description",
110+
data=np.ones((10,)) * 400,
111+
rate=3.0,
112+
reference_frame="reference_frame",
113+
unit="degrees",
114+
)
115+
116+
assert check_spatial_series_degrees_magnitude(spatial_series) == InspectorMessage(
117+
check_function_name="check_spatial_series_degrees_magnitude",
118+
message="SpatialSeries with units of degrees must have values between -360 and 360.",
119+
importance=Importance.BEST_PRACTICE_VIOLATION,
120+
object_name="SpatialSeries",
121+
location="/",
122+
object_type="SpatialSeries",
123+
)
124+
125+
126+
def test_pass_check_spatial_series_radians_magnitude():
127+
128+
spatial_series = SpatialSeries(
129+
name="SpatialSeries",
130+
description="description",
131+
data=np.ones((10,)),
132+
rate=3.0,
133+
reference_frame="reference_frame",
134+
unit="radians",
135+
)
136+
137+
assert check_spatial_series_radians_magnitude(spatial_series) is None
138+
139+
140+
def test_check_spatial_series_radians_magnitude():
141+
142+
spatial_series = SpatialSeries(
143+
name="SpatialSeries",
144+
description="description",
145+
data=np.ones((10,)) * 400,
146+
rate=3.0,
147+
reference_frame="reference_frame",
148+
unit="radians",
149+
)
150+
151+
assert check_spatial_series_radians_magnitude(spatial_series) == InspectorMessage(
152+
check_function_name="check_spatial_series_radians_magnitude",
153+
message="SpatialSeries with units of radians must have values between -2pi and 2pi.",
154+
importance=Importance.BEST_PRACTICE_VIOLATION,
155+
object_name="SpatialSeries",
156+
location="/",
157+
object_type="SpatialSeries",
158+
)

0 commit comments

Comments
 (0)