From 0606860b6b3bdd61a0135528d9f7fc36828cde60 Mon Sep 17 00:00:00 2001 From: bendichter Date: Tue, 9 Nov 2021 17:01:19 -0600 Subject: [PATCH 1/3] move tests outside the nwbwidgets package --- nwbwidgets/ophys.py | 1 - {nwbwidgets/test => test}/__init__.py | 0 {nwbwidgets/test => test}/test_base.py | 13 +++++++------ {nwbwidgets/test => test}/test_behavior.py | 0 {nwbwidgets/test => test}/test_controllers.py | 3 ++- {nwbwidgets/test => test}/test_ecephys.py | 0 {nwbwidgets/test => test}/test_file.py | 0 {nwbwidgets/test => test}/test_icephys.py | 3 ++- {nwbwidgets/test => test}/test_image.py | 0 {nwbwidgets/test => test}/test_misc.py | 0 {nwbwidgets/test => test}/test_ophys.py | 0 {nwbwidgets/test => test}/test_timeseries.py | 0 {nwbwidgets/test => test}/test_utils_cmaps.py | 0 .../test => test}/test_utils_dynamictable.py | 0 {nwbwidgets/test => test}/test_utils_mpl.py | 0 {nwbwidgets/test => test}/test_utils_timeseries.py | 0 {nwbwidgets/test => test}/test_utils_units.py | 4 ++-- 17 files changed, 13 insertions(+), 11 deletions(-) rename {nwbwidgets/test => test}/__init__.py (100%) rename {nwbwidgets/test => test}/test_base.py (99%) rename {nwbwidgets/test => test}/test_behavior.py (100%) rename {nwbwidgets/test => test}/test_controllers.py (99%) rename {nwbwidgets/test => test}/test_ecephys.py (100%) rename {nwbwidgets/test => test}/test_file.py (100%) rename {nwbwidgets/test => test}/test_icephys.py (99%) rename {nwbwidgets/test => test}/test_image.py (100%) rename {nwbwidgets/test => test}/test_misc.py (100%) rename {nwbwidgets/test => test}/test_ophys.py (100%) rename {nwbwidgets/test => test}/test_timeseries.py (100%) rename {nwbwidgets/test => test}/test_utils_cmaps.py (100%) rename {nwbwidgets/test => test}/test_utils_dynamictable.py (100%) rename {nwbwidgets/test => test}/test_utils_mpl.py (100%) rename {nwbwidgets/test => test}/test_utils_timeseries.py (100%) rename {nwbwidgets/test => test}/test_utils_units.py (98%) diff --git a/nwbwidgets/ophys.py b/nwbwidgets/ophys.py index a063bd0b..8ca02a54 100644 --- a/nwbwidgets/ophys.py +++ b/nwbwidgets/ophys.py @@ -1,7 +1,6 @@ from functools import lru_cache import ipywidgets as widgets -import matplotlib.pyplot as plt import numpy as np import plotly.graph_objects as go import plotly.express as px diff --git a/nwbwidgets/test/__init__.py b/test/__init__.py similarity index 100% rename from nwbwidgets/test/__init__.py rename to test/__init__.py diff --git a/nwbwidgets/test/test_base.py b/test/test_base.py similarity index 99% rename from nwbwidgets/test/test_base.py rename to test/test_base.py index 388fce17..ef513960 100644 --- a/nwbwidgets/test/test_base.py +++ b/test/test_base.py @@ -7,6 +7,13 @@ import pytest from dateutil.tz import tzlocal from ipywidgets import widgets +from pynwb import NWBFile +from pynwb import ProcessingModule +from pynwb import TimeSeries +from pynwb.behavior import Position, SpatialSeries +from pynwb.core import DynamicTable +from pynwb.file import Subject + from nwbwidgets.base import ( show_neurodata_base, processing_module, @@ -20,12 +27,6 @@ ) from nwbwidgets.view import default_neurodata_vis_spec from nwbwidgets.view import show_dynamic_table -from pynwb import NWBFile -from pynwb import ProcessingModule -from pynwb import TimeSeries -from pynwb.behavior import Position, SpatialSeries -from pynwb.core import DynamicTable -from pynwb.file import Subject def test_show_neurodata_base(): diff --git a/nwbwidgets/test/test_behavior.py b/test/test_behavior.py similarity index 100% rename from nwbwidgets/test/test_behavior.py rename to test/test_behavior.py diff --git a/nwbwidgets/test/test_controllers.py b/test/test_controllers.py similarity index 99% rename from nwbwidgets/test/test_controllers.py rename to test/test_controllers.py index 195816aa..76514efc 100644 --- a/nwbwidgets/test/test_controllers.py +++ b/test/test_controllers.py @@ -1,9 +1,10 @@ import unittest import numpy as np -from nwbwidgets.controllers import RangeController, GroupAndSortController from hdmf.common import DynamicTable, VectorData from pynwb.ecephys import ElectrodeGroup, Device +from nwbwidgets.controllers import RangeController, GroupAndSortController + class FloatRangeControllerTestCase(unittest.TestCase): def setUp(self): diff --git a/nwbwidgets/test/test_ecephys.py b/test/test_ecephys.py similarity index 100% rename from nwbwidgets/test/test_ecephys.py rename to test/test_ecephys.py diff --git a/nwbwidgets/test/test_file.py b/test/test_file.py similarity index 100% rename from nwbwidgets/test/test_file.py rename to test/test_file.py diff --git a/nwbwidgets/test/test_icephys.py b/test/test_icephys.py similarity index 99% rename from nwbwidgets/test/test_icephys.py rename to test/test_icephys.py index 626a0764..faa412c4 100644 --- a/nwbwidgets/test/test_icephys.py +++ b/test/test_icephys.py @@ -1,11 +1,12 @@ import matplotlib.pyplot as plt import numpy as np from ndx_icephys_meta.icephys import Sweeps, IntracellularRecordings -from nwbwidgets.icephys import show_single_sweep_sequence from pynwb.base import TimeSeries from pynwb.device import Device from pynwb.icephys import IntracellularElectrode +from nwbwidgets.icephys import show_single_sweep_sequence + def test_show_single_sweep_sequence(): device = Device(name="Axon Patch-Clamp") diff --git a/nwbwidgets/test/test_image.py b/test/test_image.py similarity index 100% rename from nwbwidgets/test/test_image.py rename to test/test_image.py diff --git a/nwbwidgets/test/test_misc.py b/test/test_misc.py similarity index 100% rename from nwbwidgets/test/test_misc.py rename to test/test_misc.py diff --git a/nwbwidgets/test/test_ophys.py b/test/test_ophys.py similarity index 100% rename from nwbwidgets/test/test_ophys.py rename to test/test_ophys.py diff --git a/nwbwidgets/test/test_timeseries.py b/test/test_timeseries.py similarity index 100% rename from nwbwidgets/test/test_timeseries.py rename to test/test_timeseries.py diff --git a/nwbwidgets/test/test_utils_cmaps.py b/test/test_utils_cmaps.py similarity index 100% rename from nwbwidgets/test/test_utils_cmaps.py rename to test/test_utils_cmaps.py diff --git a/nwbwidgets/test/test_utils_dynamictable.py b/test/test_utils_dynamictable.py similarity index 100% rename from nwbwidgets/test/test_utils_dynamictable.py rename to test/test_utils_dynamictable.py diff --git a/nwbwidgets/test/test_utils_mpl.py b/test/test_utils_mpl.py similarity index 100% rename from nwbwidgets/test/test_utils_mpl.py rename to test/test_utils_mpl.py diff --git a/nwbwidgets/test/test_utils_timeseries.py b/test/test_utils_timeseries.py similarity index 100% rename from nwbwidgets/test/test_utils_timeseries.py rename to test/test_utils_timeseries.py diff --git a/nwbwidgets/test/test_utils_units.py b/test/test_utils_units.py similarity index 98% rename from nwbwidgets/test/test_utils_units.py rename to test/test_utils_units.py index c84f1c76..7c962a15 100644 --- a/nwbwidgets/test/test_utils_units.py +++ b/test/test_utils_units.py @@ -12,8 +12,8 @@ from pynwb import NWBFile from pynwb.epoch import TimeIntervals -from ..base import TimeIntervalsSelector -from ..misc import TuningCurveWidget, TuningCurveExtendedWidget +from nwbwidgets.base import TimeIntervalsSelector +from nwbwidgets.misc import TuningCurveWidget, TuningCurveExtendedWidget class UnitsTrialsTestCase(unittest.TestCase): From e50ce15606bbf23a4974fc983650b76dfea0d854 Mon Sep 17 00:00:00 2001 From: bendichter Date: Mon, 15 Nov 2021 17:44:25 -0600 Subject: [PATCH 2/3] add test for StartAndDurationController --- test/test_controllers.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/test_controllers.py b/test/test_controllers.py index 76514efc..33081ff7 100644 --- a/test/test_controllers.py +++ b/test/test_controllers.py @@ -3,7 +3,7 @@ from hdmf.common import DynamicTable, VectorData from pynwb.ecephys import ElectrodeGroup, Device -from nwbwidgets.controllers import RangeController, GroupAndSortController +from nwbwidgets.controllers import RangeController, GroupAndSortController, StartAndDurationController class FloatRangeControllerTestCase(unittest.TestCase): @@ -72,3 +72,11 @@ def test_control(self): gas.order_dd.value = "Data1" gas.order_dd.value = None + + +class TestStartAndDurationController(unittest.TestCase): + def setUp(self) -> None: + self.start_and_duration_controller = StartAndDurationController(10) + + def test_set_duration(self): + self.start_and_duration_controller.duration.value = 2 From 6b7ac457f8220a78cd287879eb2ab7e0d73fb9b7 Mon Sep 17 00:00:00 2001 From: bendichter Date: Mon, 15 Nov 2021 18:27:13 -0600 Subject: [PATCH 3/3] not working yet.. --- nwbwidgets/image.py | 82 ++++++++++++++++++++------------------------- test/test_image.py | 20 +++++++---- 2 files changed, 49 insertions(+), 53 deletions(-) diff --git a/nwbwidgets/image.py b/nwbwidgets/image.py index bb6e599a..79de6ca5 100644 --- a/nwbwidgets/image.py +++ b/nwbwidgets/image.py @@ -91,56 +91,46 @@ def on_change(change): self.controls["time_window"].observe(on_change) -def show_image_series(image_series: ImageSeries, neurodata_vis_spec: dict): - if len(image_series.data.shape) == 3: - return show_grayscale_image_series(image_series, neurodata_vis_spec) +class ImageSeriesWidget(widgets.VBox): + + def __int__(self, image_series: ImageSeries, neurodata_vis_spec: dict = None): + self.image_series = image_series + + self.index_slider = widgets.IntSlider( + value=0, + min=0, + max=image_series.data.shape[0] - 1, + orientation="horizontal", + continuous_update=False, + description="index", + ) + + if len(image_series.data.shape) == 3: + self.show_image = self.show_grayscale_image + self.controls = {"index": self.index_slider} + out_fig = widgets.interactive_output(self.show_image, self.controls) + super().__init__(children=(out_fig, self.index_slider)) + else: + self.show_image = self.show_rgb_image + self.mode_dropdown = widgets.Dropdown( + options=("rgb", "bgr"), layout=Layout(width="200px"), description="mode" + ) + self.controls = {"index": self.index_slider, "mode": self.mode_dropdown} + out_fig = widgets.interactive_output(self.show_image, self.controls) + super.__init__(children=(out_fig, self.index_slider, self.mode_dropdown)) - def show_image(index=0, mode="rgb"): + def show_grayscale_image(self, index=0): fig, ax = plt.subplots(subplot_kw={"xticks": [], "yticks": []}) - image = image_series.data[index] - if mode == "bgr": - image = image[:, :, ::-1] - ax.imshow(image.transpose([1, 0, 2]), cmap="gray", aspect="auto") - fig.show() + ax.imshow(self.image_series.data[index].T, cmap="gray", aspect="auto") return fig2widget(fig) - slider = widgets.IntSlider( - value=0, - min=0, - max=image_series.data.shape[0] - 1, - orientation="horizontal", - continuous_update=False, - description="index", - ) - mode = widgets.Dropdown( - options=("rgb", "bgr"), layout=Layout(width="200px"), description="mode" - ) - controls = {"index": slider, "mode": mode} - out_fig = widgets.interactive_output(show_image, controls) - vbox = widgets.VBox(children=[out_fig, slider, mode]) - - return vbox - - -def show_grayscale_image_series(image_series: ImageSeries, neurodata_vis_spec: dict): - def show_image(index=0): + def show_rgb_image(self, index=0, mode="rgb"): fig, ax = plt.subplots(subplot_kw={"xticks": [], "yticks": []}) - ax.imshow(image_series.data[index].T, cmap="gray", aspect="auto") - return fig - - slider = widgets.IntSlider( - value=0, - min=0, - max=image_series.data.shape[0] - 1, - orientation="horizontal", - continuous_update=False, - description="index", - ) - controls = {"index": slider} - out_fig = widgets.interactive_output(show_image, controls) - vbox = widgets.VBox(children=[out_fig, slider]) - - return vbox + image = self.image_series.data[index] + if mode == "bgr": + image = image[:, :, ::-1] + ax.imshow(image.transpose([1, 0, 2]), aspect="auto") + return fig2widget(fig) def show_index_series(index_series, neurodata_vis_spec: dict): @@ -148,7 +138,7 @@ def show_index_series(index_series, neurodata_vis_spec: dict): series_widget = show_timeseries(index_series) indexed_timeseries = index_series.indexed_timeseries - image_series_widget = show_image_series(indexed_timeseries, neurodata_vis_spec) + image_series_widget = ImageSeriesWidget(indexed_timeseries, neurodata_vis_spec) return widgets.VBox([series_widget, image_series_widget]) diff --git a/test/test_image.py b/test/test_image.py index 65315cc2..7c158df9 100644 --- a/test/test_image.py +++ b/test/test_image.py @@ -1,3 +1,5 @@ +import unittest + import ipywidgets as widgets import matplotlib.pyplot as plt import numpy as np @@ -5,7 +7,7 @@ show_rbga_image, show_grayscale_image, show_index_series, - show_image_series, + ImageSeriesWidget ) from nwbwidgets.view import default_neurodata_vis_spec from pynwb.base import TimeSeries @@ -47,10 +49,14 @@ def test_show_index_series(): ) -def test_show_image_series(): - data = np.random.rand(800).reshape((8, 10, 10)) - image_series = ImageSeries(name="Image Series", data=data, rate=1.0, unit='n.a.') +class TestImageSeriesWidget(unittest.TestCase): - assert isinstance( - show_image_series(image_series, default_neurodata_vis_spec), widgets.Widget - ) + def test_grascale(self): + data = np.random.rand(800).reshape((8, 10, 10)) + image_series = ImageSeries(name="Image Series", data=data, rate=1.0, unit='n.a.') + widget = ImageSeriesWidget(image_series) + + def test_rgb(self): + data = np.random.rand(800 * 3).reshape((8, 10, 10,3)) + image_series = ImageSeries(name="Image Series", data=data, rate=1.0, unit='n.a.') + widget = ImageSeriesWidget(image_series)