Skip to content

Commit 361885a

Browse files
CodyCBakerPhDCody Bakerpre-commit-ci[bot]bendichter
authored
[Add Check]: Spike times not in unobserved intervals (#168)
* main work on check/tests * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update nwbinspector/checks/ecephys.py Co-authored-by: Ben Dichter <[email protected]> * fix increment from auto commit * added another test to further illustrate * Update nwbinspector/checks/ecephys.py Co-authored-by: Ben Dichter <[email protected]> * add broken test * fixed logic Co-authored-by: Cody Baker <[email protected]> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ben Dichter <[email protected]>
1 parent 6ef4ace commit 361885a

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

nwbinspector/checks/ecephys.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,28 @@ def check_electrical_series_dims(electrical_series: ElectricalSeries):
5050
def check_electrical_series_reference_electrodes_table(electrical_series: ElectricalSeries):
5151
if electrical_series.electrodes.table.name != "electrodes":
5252
return InspectorMessage(message="electrodes does not reference an electrodes table.")
53+
54+
55+
@register_check(importance=Importance.BEST_PRACTICE_VIOLATION, neurodata_type=Units)
56+
def check_spike_times_not_in_unobserved_interval(units_table: Units, nunits: int = 4):
57+
"""Check if a Units table has spike times that occur outside of observed intervals."""
58+
if not units_table.obs_intervals:
59+
return
60+
for unit_spike_times, unit_obs_intervals in zip(
61+
units_table["spike_times"][:nunits], units_table["obs_intervals"][:nunits]
62+
):
63+
spike_times_array = np.array(unit_spike_times)
64+
if not all(
65+
sum(
66+
[
67+
np.logical_and(start <= spike_times_array, spike_times_array <= stop)
68+
for start, stop in unit_obs_intervals
69+
]
70+
)
71+
):
72+
return InspectorMessage(
73+
message=(
74+
"This Units table contains spike times that occur during periods of time not labeled as being "
75+
"observed intervals."
76+
)
77+
)

tests/unit_tests/test_ecephys.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
check_negative_spike_times,
1313
check_electrical_series_dims,
1414
check_electrical_series_reference_electrodes_table,
15+
check_spike_times_not_in_unobserved_interval,
1516
)
1617
from nwbinspector.register_checks import InspectorMessage, Importance
1718

@@ -152,3 +153,64 @@ def test_trigger_check_electrical_series_reference_electrodes_table(self):
152153
check_electrical_series_reference_electrodes_table(electrical_series).message
153154
== "electrodes does not reference an electrodes table."
154155
)
156+
157+
158+
def test_check_spike_times_not_in_unobserved_interval_pass():
159+
units_table = Units(name="TestUnits")
160+
units_table.add_unit(spike_times=[1, 2, 3], obs_intervals=[[0, 2.5], [2.7, 3.5]])
161+
assert check_spike_times_not_in_unobserved_interval(units_table=units_table) is None
162+
163+
164+
def test_check_spike_times_not_in_unobserved_interval_pass_no_intervals():
165+
units_table = Units(name="TestUnits")
166+
units_table.add_unit(spike_times=[1, 2, 3])
167+
assert check_spike_times_not_in_unobserved_interval(units_table=units_table) is None
168+
169+
170+
def test_check_spike_times_not_in_unobserved_interval_1():
171+
units_table = Units(name="TestUnits")
172+
units_table.add_unit(spike_times=[1, 2, 3], obs_intervals=[[0, 2.5], [3.5, 4]])
173+
assert check_spike_times_not_in_unobserved_interval(units_table=units_table) == InspectorMessage(
174+
message=(
175+
"This Units table contains spike times that occur during periods of time not labeled as being "
176+
"observed intervals."
177+
),
178+
importance=Importance.BEST_PRACTICE_VIOLATION,
179+
check_function_name="check_spike_times_not_in_unobserved_interval",
180+
object_type="Units",
181+
object_name="TestUnits",
182+
location="/",
183+
)
184+
185+
186+
def test_check_spike_times_not_in_unobserved_interval_2():
187+
units_table = Units(name="TestUnits")
188+
units_table.add_unit(spike_times=[1, 2, 3, 4, 5, 6], obs_intervals=[[0, 2.5], [3.5, 7]])
189+
assert check_spike_times_not_in_unobserved_interval(units_table=units_table) == InspectorMessage(
190+
message=(
191+
"This Units table contains spike times that occur during periods of time not labeled as being "
192+
"observed intervals."
193+
),
194+
importance=Importance.BEST_PRACTICE_VIOLATION,
195+
check_function_name="check_spike_times_not_in_unobserved_interval",
196+
object_type="Units",
197+
object_name="TestUnits",
198+
location="/",
199+
)
200+
201+
202+
def test_check_spike_times_not_in_unobserved_interval_multiple_units():
203+
units_table = Units(name="TestUnits")
204+
units_table.add_unit(spike_times=[1, 2, 3, 4, 5, 6], obs_intervals=[[0, 3.2], [3.5, 7]])
205+
units_table.add_unit(spike_times=[6.5, 12, 13, 14, 15, 16], obs_intervals=[[10, 15.2], [15.8, 17]])
206+
assert check_spike_times_not_in_unobserved_interval(units_table=units_table) == InspectorMessage(
207+
message=(
208+
"This Units table contains spike times that occur during periods of time not labeled as being "
209+
"observed intervals."
210+
),
211+
importance=Importance.BEST_PRACTICE_VIOLATION,
212+
check_function_name="check_spike_times_not_in_unobserved_interval",
213+
object_type="Units",
214+
object_name="TestUnits",
215+
location="/",
216+
)

0 commit comments

Comments
 (0)