figpack 0.2.15__py3-none-any.whl → 0.2.16__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of figpack might be problematic. Click here for more details.

Files changed (32) hide show
  1. figpack/__init__.py +3 -1
  2. figpack/core/_bundle_utils.py +24 -15
  3. figpack/core/_view_figure.py +1 -1
  4. figpack/core/extension_view.py +2 -2
  5. figpack/core/figpack_view.py +2 -2
  6. figpack/core/zarr.py +61 -0
  7. figpack/franklab/views/TrackAnimation.py +2 -1
  8. figpack/spike_sorting/views/Autocorrelograms.py +3 -5
  9. figpack/spike_sorting/views/AverageWaveforms.py +2 -3
  10. figpack/spike_sorting/views/CrossCorrelograms.py +2 -3
  11. figpack/spike_sorting/views/RasterPlot.py +2 -6
  12. figpack/spike_sorting/views/SpikeAmplitudes.py +2 -12
  13. figpack/spike_sorting/views/UnitMetricsGraph.py +2 -4
  14. figpack/spike_sorting/views/UnitsTable.py +2 -9
  15. figpack/views/Box.py +2 -3
  16. figpack/views/DataFrame.py +6 -12
  17. figpack/views/Gallery.py +2 -3
  18. figpack/views/Image.py +3 -9
  19. figpack/views/Markdown.py +3 -4
  20. figpack/views/MatplotlibFigure.py +2 -11
  21. figpack/views/MultiChannelTimeseries.py +2 -6
  22. figpack/views/PlotlyExtension/PlotlyExtension.py +7 -13
  23. figpack/views/Spectrogram.py +2 -7
  24. figpack/views/Splitter.py +2 -3
  25. figpack/views/TabLayout.py +2 -3
  26. figpack/views/TimeseriesGraph.py +6 -10
  27. {figpack-0.2.15.dist-info → figpack-0.2.16.dist-info}/METADATA +21 -2
  28. {figpack-0.2.15.dist-info → figpack-0.2.16.dist-info}/RECORD +32 -31
  29. {figpack-0.2.15.dist-info → figpack-0.2.16.dist-info}/WHEEL +0 -0
  30. {figpack-0.2.15.dist-info → figpack-0.2.16.dist-info}/entry_points.txt +0 -0
  31. {figpack-0.2.15.dist-info → figpack-0.2.16.dist-info}/licenses/LICENSE +0 -0
  32. {figpack-0.2.15.dist-info → figpack-0.2.16.dist-info}/top_level.txt +0 -0
figpack/__init__.py CHANGED
@@ -2,10 +2,11 @@
2
2
  figpack - A Python package for creating shareable, interactive visualizations in the browser
3
3
  """
4
4
 
5
- __version__ = "0.2.15"
5
+ __version__ = "0.2.16"
6
6
 
7
7
  from .cli import view_figure
8
8
  from .core import FigpackView, FigpackExtension, ExtensionRegistry, ExtensionView
9
+ from .core.zarr import Group
9
10
 
10
11
  __all__ = [
11
12
  "view_figure",
@@ -13,4 +14,5 @@ __all__ = [
13
14
  "FigpackExtension",
14
15
  "ExtensionRegistry",
15
16
  "ExtensionView",
17
+ "Group",
16
18
  ]
@@ -7,6 +7,7 @@ import zarr
7
7
  from .figpack_view import FigpackView
8
8
  from .figpack_extension import ExtensionRegistry
9
9
  from .extension_view import ExtensionView
10
+ from .zarr import Group, _check_zarr_version
10
11
 
11
12
  thisdir = pathlib.Path(__file__).parent.resolve()
12
13
 
@@ -45,24 +46,32 @@ def prepare_figure_bundle(
45
46
  target_sub = target / subitem.name
46
47
  target_sub.write_bytes(subitem.read_bytes())
47
48
 
48
- # Write the view data to the Zarr group
49
- zarr_group = zarr.open_group(
50
- pathlib.Path(tmpdir) / "data.zarr",
51
- mode="w",
52
- synchronizer=zarr.ThreadSynchronizer(),
53
- )
54
- view._write_to_zarr_group(zarr_group)
49
+ # If we are using zarr 3, then we set the default zarr format to 2 temporarily
50
+ # because we only support version 2 on the frontend right now.
55
51
 
56
- # Add title and description as attributes on the top-level zarr group
57
- zarr_group.attrs["title"] = title
58
- if description is not None:
59
- zarr_group.attrs["description"] = description
52
+ if _check_zarr_version() == 3:
53
+ old_default_zarr_format = zarr.config.get("default_zarr_format")
54
+ zarr.config.set({"default_zarr_format": 2})
60
55
 
61
- # Discover and write extension JavaScript files
62
- required_extensions = _discover_required_extensions(view)
63
- _write_extension_files(required_extensions, tmpdir)
56
+ try:
57
+ # Write the view data to the Zarr group
58
+ zarr_group = zarr.open_group(pathlib.Path(tmpdir) / "data.zarr", mode="w")
59
+ zarr_group = Group(zarr_group)
60
+ view._write_to_zarr_group(zarr_group)
64
61
 
65
- zarr.consolidate_metadata(zarr_group.store)
62
+ # Add title and description as attributes on the top-level zarr group
63
+ zarr_group.attrs["title"] = title
64
+ if description is not None:
65
+ zarr_group.attrs["description"] = description
66
+
67
+ # Discover and write extension JavaScript files
68
+ required_extensions = _discover_required_extensions(view)
69
+ _write_extension_files(required_extensions, tmpdir)
70
+
71
+ zarr.consolidate_metadata(zarr_group._zarr_group.store)
72
+ finally:
73
+ if _check_zarr_version() == 3:
74
+ zarr.config.set({"default_zarr_format": old_default_zarr_format})
66
75
 
67
76
 
68
77
  def _discover_required_extensions(view: FigpackView) -> Set[str]:
@@ -109,7 +109,7 @@ def view_figure(figure_path: str, port: Union[int, None] = None) -> None:
109
109
 
110
110
  try:
111
111
  with tarfile.open(figure_path, "r:gz") as tar:
112
- tar.extractall(temp_path)
112
+ tar.extractall(temp_path, filter="data")
113
113
 
114
114
  # Count extracted files
115
115
  extracted_files = list(temp_path.rglob("*"))
@@ -2,9 +2,9 @@
2
2
  Base class for views that use figpack extensions
3
3
  """
4
4
 
5
- import zarr
6
5
  from .figpack_view import FigpackView
7
6
  from .figpack_extension import ExtensionRegistry
7
+ from ..core.zarr import Group
8
8
 
9
9
 
10
10
  class ExtensionView(FigpackView):
@@ -32,7 +32,7 @@ class ExtensionView(FigpackView):
32
32
  )
33
33
  self.extension = extension
34
34
 
35
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
35
+ def _write_to_zarr_group(self, group: Group) -> None:
36
36
  """
37
37
  Write the extension view metadata to a Zarr group.
38
38
  Subclasses should call super()._write_to_zarr_group(group) first,
@@ -7,7 +7,7 @@ import random
7
7
  import string
8
8
  from typing import Union
9
9
 
10
- import zarr
10
+ from .zarr import Group
11
11
 
12
12
 
13
13
  class FigpackView:
@@ -155,7 +155,7 @@ class FigpackView:
155
155
 
156
156
  _save_figure(self, output_path, title=title)
157
157
 
158
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
158
+ def _write_to_zarr_group(self, group: Group) -> None:
159
159
  """
160
160
  Write the view data to a Zarr group. Must be implemented by subclasses.
161
161
 
figpack/core/zarr.py ADDED
@@ -0,0 +1,61 @@
1
+ from typing import Any, Dict
2
+ import zarr
3
+
4
+
5
+ _UNSPECIFIED = object()
6
+
7
+
8
+ class Group:
9
+ def __init__(self, zarr_group: zarr.Group):
10
+ self._zarr_group = zarr_group
11
+
12
+ def create_group(self, name: str) -> "Group":
13
+ return Group(self._zarr_group.create_group(name))
14
+
15
+ def create_dataset(
16
+ self,
17
+ name: str,
18
+ *,
19
+ data=_UNSPECIFIED,
20
+ dtype=_UNSPECIFIED,
21
+ chunks=_UNSPECIFIED,
22
+ compressor=_UNSPECIFIED,
23
+ ) -> None:
24
+ kwargs = {}
25
+ if data is not _UNSPECIFIED:
26
+ kwargs["data"] = data
27
+ if dtype is not _UNSPECIFIED:
28
+ kwargs["dtype"] = dtype
29
+ if chunks is not _UNSPECIFIED:
30
+ kwargs["chunks"] = chunks
31
+ if compressor is not _UNSPECIFIED:
32
+ kwargs["compressor"] = compressor
33
+ if _check_zarr_version() == 2:
34
+ self._zarr_group.create_dataset(name, **kwargs)
35
+ elif _check_zarr_version() == 3:
36
+ self._zarr_group.create_array(name, **kwargs)
37
+ else:
38
+ raise RuntimeError("Unsupported Zarr version")
39
+
40
+ @property
41
+ def attrs(self) -> Dict[str, Any]:
42
+ return self._zarr_group.attrs
43
+
44
+ def __getitem__(self, key: str) -> Any:
45
+ return self._zarr_group[key]
46
+
47
+ # implement in operator
48
+ def __contains__(self, key: str) -> bool:
49
+ return key in self._zarr_group
50
+
51
+ def __iter__(self):
52
+ return iter(self._zarr_group)
53
+
54
+ def __reversed__(self):
55
+ return reversed(self._zarr_group)
56
+
57
+
58
+ def _check_zarr_version():
59
+ version = zarr.__version__
60
+ major_version = int(version.split(".")[0])
61
+ return major_version
@@ -8,6 +8,7 @@ import numpy as np
8
8
  import zarr
9
9
 
10
10
  from ...core.figpack_view import FigpackView
11
+ from ...core.zarr import Group
11
12
 
12
13
 
13
14
  class TrackAnimation(FigpackView):
@@ -116,7 +117,7 @@ class TrackAnimation(FigpackView):
116
117
  self.track_bin_height = track_bin_height
117
118
  self.track_bin_width = track_bin_width
118
119
 
119
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
120
+ def _write_to_zarr_group(self, group: Group) -> None:
120
121
  """
121
122
  Write the track animation data to a Zarr group
122
123
 
@@ -2,12 +2,12 @@
2
2
  Autocorrelograms view for figpack - displays multiple autocorrelograms
3
3
  """
4
4
 
5
- from typing import List, Optional
5
+ from typing import List
6
6
 
7
7
  import numpy as np
8
- import zarr
9
8
 
10
9
  from ...core.figpack_view import FigpackView
10
+ from ...core.zarr import Group
11
11
  from .AutocorrelogramItem import AutocorrelogramItem
12
12
 
13
13
 
@@ -66,7 +66,7 @@ class Autocorrelograms(FigpackView):
66
66
  view = Autocorrelograms(autocorrelograms=ac_items)
67
67
  return view
68
68
 
69
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
69
+ def _write_to_zarr_group(self, group: Group) -> None:
70
70
  """
71
71
  Write the Autocorrelograms data to a Zarr group
72
72
 
@@ -90,7 +90,6 @@ class Autocorrelograms(FigpackView):
90
90
  group.create_dataset(
91
91
  "bin_edges_sec",
92
92
  data=self.autocorrelograms[0].bin_edges_sec,
93
- dtype=np.float32,
94
93
  )
95
94
 
96
95
  # Create 2D array for all bin counts
@@ -111,7 +110,6 @@ class Autocorrelograms(FigpackView):
111
110
  group.create_dataset(
112
111
  "bin_counts",
113
112
  data=bin_counts,
114
- dtype=np.int32,
115
113
  )
116
114
 
117
115
  # Store the autocorrelogram metadata
@@ -8,6 +8,7 @@ import numpy as np
8
8
  import zarr
9
9
 
10
10
  from ...core.figpack_view import FigpackView
11
+ from ...core.zarr import Group
11
12
 
12
13
 
13
14
  class AverageWaveformItem:
@@ -97,7 +98,7 @@ class AverageWaveforms(FigpackView):
97
98
  view = AverageWaveforms(average_waveforms=average_waveform_items)
98
99
  return view
99
100
 
100
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
101
+ def _write_to_zarr_group(self, group: Group) -> None:
101
102
  """
102
103
  Write the AverageWaveforms data to a Zarr group
103
104
 
@@ -127,13 +128,11 @@ class AverageWaveforms(FigpackView):
127
128
  group.create_dataset(
128
129
  f"{waveform_name}/waveform",
129
130
  data=waveform.waveform,
130
- dtype=waveform.waveform.dtype,
131
131
  )
132
132
  if waveform.waveform_std_dev is not None:
133
133
  group.create_dataset(
134
134
  f"{waveform_name}/waveform_std_dev",
135
135
  data=waveform.waveform_std_dev,
136
- dtype=waveform.waveform_std_dev.dtype,
137
136
  )
138
137
  if waveform.waveform_percentiles is not None:
139
138
  for j, p in enumerate(waveform.waveform_percentiles):
@@ -8,6 +8,7 @@ import numpy as np
8
8
  import zarr
9
9
 
10
10
  from ...core.figpack_view import FigpackView
11
+ from ...core.zarr import Group
11
12
  from .CrossCorrelogramItem import CrossCorrelogramItem
12
13
 
13
14
 
@@ -75,7 +76,7 @@ class CrossCorrelograms(FigpackView):
75
76
  view = CrossCorrelograms(cross_correlograms=cc_items, hide_unit_selector=False)
76
77
  return view
77
78
 
78
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
79
+ def _write_to_zarr_group(self, group: Group) -> None:
79
80
  """
80
81
  Write the CrossCorrelograms data to a Zarr group
81
82
 
@@ -103,7 +104,6 @@ class CrossCorrelograms(FigpackView):
103
104
  group.create_dataset(
104
105
  "bin_edges_sec",
105
106
  data=self.cross_correlograms[0].bin_edges_sec,
106
- dtype=np.float32,
107
107
  )
108
108
 
109
109
  # Create 2D array for all bin counts
@@ -125,7 +125,6 @@ class CrossCorrelograms(FigpackView):
125
125
  group.create_dataset(
126
126
  "bin_counts",
127
127
  data=bin_counts,
128
- dtype=np.int32,
129
128
  )
130
129
 
131
130
  # Store the cross-correlogram metadata
@@ -7,6 +7,7 @@ import numpy as np
7
7
  import zarr
8
8
 
9
9
  from ...core.figpack_view import FigpackView
10
+ from ...core.zarr import Group
10
11
  from .RasterPlotItem import RasterPlotItem
11
12
  from .UnitsTable import UnitsTable, UnitsTableColumn, UnitsTableRow
12
13
  from ...views.Box import Box, LayoutItem
@@ -105,7 +106,7 @@ class RasterPlot(FigpackView):
105
106
  else:
106
107
  return view
107
108
 
108
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
109
+ def _write_to_zarr_group(self, group: Group) -> None:
109
110
  """
110
111
  Args:
111
112
  group: Zarr group to write data into
@@ -141,25 +142,21 @@ class RasterPlot(FigpackView):
141
142
  group.create_dataset(
142
143
  "timestamps",
143
144
  data=unified_data["timestamps"],
144
- dtype=np.float32,
145
145
  chunks=chunks,
146
146
  )
147
147
  group.create_dataset(
148
148
  "unit_indices",
149
149
  data=unified_data["unit_indices"],
150
- dtype=np.uint16,
151
150
  chunks=chunks,
152
151
  )
153
152
  group.create_dataset(
154
153
  "reference_times",
155
154
  data=unified_data["reference_times"],
156
- dtype=np.float32,
157
155
  chunks=(len(unified_data["reference_times"]),),
158
156
  )
159
157
  group.create_dataset(
160
158
  "reference_indices",
161
159
  data=unified_data["reference_indices"],
162
- dtype=np.uint32,
163
160
  chunks=(len(unified_data["reference_indices"]),),
164
161
  )
165
162
 
@@ -188,7 +185,6 @@ class RasterPlot(FigpackView):
188
185
  group.create_dataset(
189
186
  "spike_counts_1sec",
190
187
  data=spike_counts,
191
- dtype=np.uint16,
192
188
  chunks=(min(num_bins, 10000), min(num_units, 500)),
193
189
  )
194
190
 
@@ -5,9 +5,9 @@ SpikeAmplitudes view for figpack - displays spike amplitudes over time
5
5
  from typing import List
6
6
 
7
7
  import numpy as np
8
- import zarr
9
8
 
10
9
  from ...core.figpack_view import FigpackView
10
+ from ...core.zarr import Group
11
11
  from .SpikeAmplitudesItem import SpikeAmplitudesItem
12
12
  from .UnitsTable import UnitsTable, UnitsTableColumn, UnitsTableRow
13
13
  from ...views.Box import Box, LayoutItem
@@ -112,7 +112,7 @@ class SpikeAmplitudes(FigpackView):
112
112
  else:
113
113
  return view
114
114
 
115
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
115
+ def _write_to_zarr_group(self, group: Group) -> None:
116
116
  """
117
117
  Write the SpikeAmplitudes data to a Zarr group using unified storage format
118
118
 
@@ -151,31 +151,26 @@ class SpikeAmplitudes(FigpackView):
151
151
  group.create_dataset(
152
152
  "timestamps",
153
153
  data=unified_data["timestamps"],
154
- dtype=np.float32,
155
154
  chunks=chunks,
156
155
  )
157
156
  group.create_dataset(
158
157
  "unit_indices",
159
158
  data=unified_data["unit_indices"],
160
- dtype=np.uint16,
161
159
  chunks=chunks,
162
160
  )
163
161
  group.create_dataset(
164
162
  "amplitudes",
165
163
  data=unified_data["amplitudes"],
166
- dtype=np.float32,
167
164
  chunks=chunks,
168
165
  )
169
166
  group.create_dataset(
170
167
  "reference_times",
171
168
  data=unified_data["reference_times"],
172
- dtype=np.float32,
173
169
  chunks=(len(unified_data["reference_times"]),),
174
170
  )
175
171
  group.create_dataset(
176
172
  "reference_indices",
177
173
  data=unified_data["reference_indices"],
178
- dtype=np.uint32,
179
174
  chunks=(len(unified_data["reference_indices"]),),
180
175
  )
181
176
 
@@ -202,31 +197,26 @@ class SpikeAmplitudes(FigpackView):
202
197
  factor_group.create_dataset(
203
198
  "timestamps",
204
199
  data=data["timestamps"],
205
- dtype=np.float32,
206
200
  chunks=chunks,
207
201
  )
208
202
  factor_group.create_dataset(
209
203
  "unit_indices",
210
204
  data=data["unit_indices"],
211
- dtype=np.uint16,
212
205
  chunks=chunks,
213
206
  )
214
207
  factor_group.create_dataset(
215
208
  "amplitudes",
216
209
  data=data["amplitudes"],
217
- dtype=np.float32,
218
210
  chunks=chunks,
219
211
  )
220
212
  factor_group.create_dataset(
221
213
  "reference_times",
222
214
  data=data["reference_times"],
223
- dtype=np.float32,
224
215
  chunks=(len(data["reference_times"]),),
225
216
  )
226
217
  factor_group.create_dataset(
227
218
  "reference_indices",
228
219
  data=data["reference_indices"],
229
- dtype=np.uint32,
230
220
  chunks=(len(data["reference_indices"]),),
231
221
  )
232
222
 
@@ -9,6 +9,7 @@ import numpy as np
9
9
  import zarr
10
10
 
11
11
  from ...core.figpack_view import FigpackView
12
+ from ...core.zarr import Group
12
13
 
13
14
 
14
15
  class UnitMetricsGraphMetric:
@@ -97,7 +98,7 @@ class UnitMetricsGraph(FigpackView):
97
98
  self.metrics = metrics
98
99
  self.height = height
99
100
 
100
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
101
+ def _write_to_zarr_group(self, group: Group) -> None:
101
102
  """
102
103
  Write the UnitMetricsGraph data to a Zarr group
103
104
 
@@ -122,8 +123,5 @@ class UnitMetricsGraph(FigpackView):
122
123
  group.create_dataset(
123
124
  "units_data",
124
125
  data=units_array,
125
- dtype=np.uint8,
126
- chunks=True,
127
- compressor=zarr.Blosc(cname="zstd", clevel=3, shuffle=zarr.Blosc.SHUFFLE),
128
126
  )
129
127
  group.attrs["units_data_size"] = len(units_json)
@@ -9,6 +9,7 @@ import numpy as np
9
9
  import zarr
10
10
 
11
11
  from ...core.figpack_view import FigpackView
12
+ from ...core.zarr import Group
12
13
  from .UnitSimilarityScore import UnitSimilarityScore
13
14
  from .UnitsTableColumn import UnitsTableColumn
14
15
  from .UnitsTableRow import UnitsTableRow
@@ -41,7 +42,7 @@ class UnitsTable(FigpackView):
41
42
  self.similarity_scores = similarity_scores or []
42
43
  self.height = height
43
44
 
44
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
45
+ def _write_to_zarr_group(self, group: Group) -> None:
45
46
  """
46
47
  Write the UnitsTable data to a Zarr group
47
48
 
@@ -66,9 +67,6 @@ class UnitsTable(FigpackView):
66
67
  group.create_dataset(
67
68
  "rows_data",
68
69
  data=rows_array,
69
- dtype=np.uint8,
70
- chunks=True,
71
- compressor=zarr.Blosc(cname="zstd", clevel=3, shuffle=zarr.Blosc.SHUFFLE),
72
70
  )
73
71
  group.attrs["rows_data_size"] = len(rows_json)
74
72
 
@@ -80,10 +78,5 @@ class UnitsTable(FigpackView):
80
78
  group.create_dataset(
81
79
  "similarity_scores_data",
82
80
  data=scores_array,
83
- dtype=np.uint8,
84
- chunks=True,
85
- compressor=zarr.Blosc(
86
- cname="zstd", clevel=3, shuffle=zarr.Blosc.SHUFFLE
87
- ),
88
81
  )
89
82
  group.attrs["similarity_scores_data_size"] = len(scores_json)
figpack/views/Box.py CHANGED
@@ -4,9 +4,8 @@ Box view for figpack - a layout container that handles other views
4
4
 
5
5
  from typing import Any, Dict, List, Literal, Optional
6
6
 
7
- import zarr
8
-
9
7
  from ..core.figpack_view import FigpackView
8
+ from ..core.zarr import Group
10
9
  from .LayoutItem import LayoutItem
11
10
 
12
11
 
@@ -43,7 +42,7 @@ class Box(FigpackView):
43
42
  self.items = items
44
43
  self.title = title
45
44
 
46
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
45
+ def _write_to_zarr_group(self, group: Group) -> None:
47
46
  """
48
47
  Write the Box layout data to a Zarr group
49
48
 
@@ -3,13 +3,12 @@ DataFrame view for figpack - displays pandas DataFrames as interactive tables
3
3
  """
4
4
 
5
5
  import json
6
- from typing import Any, Dict, Union
7
6
 
8
7
  import numpy as np
9
- import pandas as pd
10
8
  import zarr
11
9
 
12
10
  from ..core.figpack_view import FigpackView
11
+ from ..core.zarr import Group
13
12
 
14
13
 
15
14
  class DataFrame(FigpackView):
@@ -17,7 +16,7 @@ class DataFrame(FigpackView):
17
16
  A DataFrame visualization component for displaying pandas DataFrames as interactive tables
18
17
  """
19
18
 
20
- def __init__(self, df: pd.DataFrame):
19
+ def __init__(self, df):
21
20
  """
22
21
  Initialize a DataFrame view
23
22
 
@@ -27,12 +26,14 @@ class DataFrame(FigpackView):
27
26
  Raises:
28
27
  ValueError: If df is not a pandas DataFrame
29
28
  """
29
+ import pandas as pd
30
+
30
31
  if not isinstance(df, pd.DataFrame):
31
32
  raise ValueError("df must be a pandas DataFrame")
32
33
 
33
34
  self.df = df
34
35
 
35
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
36
+ def _write_to_zarr_group(self, group: Group) -> None:
36
37
  """
37
38
  Write the DataFrame data to a Zarr group
38
39
 
@@ -54,11 +55,6 @@ class DataFrame(FigpackView):
54
55
  group.create_dataset(
55
56
  "csv_data",
56
57
  data=csv_array,
57
- dtype=np.uint8,
58
- chunks=True,
59
- compressor=zarr.Blosc(
60
- cname="zstd", clevel=3, shuffle=zarr.Blosc.SHUFFLE
61
- ),
62
58
  )
63
59
 
64
60
  # Store metadata about the DataFrame
@@ -104,6 +100,4 @@ class DataFrame(FigpackView):
104
100
  group.attrs["data_size"] = 0
105
101
  group.attrs["column_info"] = "[]"
106
102
  # Create empty array as placeholder
107
- group.create_dataset(
108
- "csv_data", data=np.array([], dtype=np.uint8), dtype=np.uint8
109
- )
103
+ group.create_dataset("csv_data", data=np.array([], dtype=np.uint8))
figpack/views/Gallery.py CHANGED
@@ -4,9 +4,8 @@ Gallery view for figpack - a gallery layout container that handles other views w
4
4
 
5
5
  from typing import Any, Dict, List, Optional
6
6
 
7
- import zarr
8
-
9
7
  from ..core.figpack_view import FigpackView
8
+ from ..core.zarr import Group
10
9
  from .GalleryItem import GalleryItem
11
10
 
12
11
 
@@ -45,7 +44,7 @@ class Gallery(FigpackView):
45
44
  max(0, min(initial_item_index, len(items) - 1)) if items else 0
46
45
  )
47
46
 
48
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
47
+ def _write_to_zarr_group(self, group: Group) -> None:
49
48
  """
50
49
  Write the Gallery data to a Zarr group
51
50
 
figpack/views/Image.py CHANGED
@@ -8,6 +8,7 @@ import numpy as np
8
8
  import zarr
9
9
 
10
10
  from ..core.figpack_view import FigpackView
11
+ from ..core.zarr import Group
11
12
 
12
13
 
13
14
  class Image(FigpackView):
@@ -69,7 +70,7 @@ class Image(FigpackView):
69
70
  except Exception as e:
70
71
  raise ValueError(f"Failed to download image from URL: {str(e)}")
71
72
 
72
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
73
+ def _write_to_zarr_group(self, group: Group) -> None:
73
74
  """
74
75
  Write the image data to a Zarr group
75
76
 
@@ -98,11 +99,6 @@ class Image(FigpackView):
98
99
  group.create_dataset(
99
100
  "image_data",
100
101
  data=image_array,
101
- dtype=np.uint8,
102
- chunks=True,
103
- compressor=zarr.Blosc(
104
- cname="zstd", clevel=3, shuffle=zarr.Blosc.SHUFFLE
105
- ),
106
102
  )
107
103
 
108
104
  # Try to determine format from file signature
@@ -124,6 +120,4 @@ class Image(FigpackView):
124
120
  group.attrs["image_format"] = "Unknown"
125
121
  group.attrs["data_size"] = 0
126
122
  # Create empty array as placeholder
127
- group.create_dataset(
128
- "image_data", data=np.array([], dtype=np.uint8), dtype=np.uint8
129
- )
123
+ group.create_dataset("image_data", data=np.array([], dtype=np.uint8))
figpack/views/Markdown.py CHANGED
@@ -6,6 +6,7 @@ import numpy as np
6
6
  import zarr
7
7
 
8
8
  from ..core.figpack_view import FigpackView
9
+ from ..core.zarr import Group
9
10
 
10
11
 
11
12
  class Markdown(FigpackView):
@@ -22,7 +23,7 @@ class Markdown(FigpackView):
22
23
  """
23
24
  self.content = content
24
25
 
25
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
26
+ def _write_to_zarr_group(self, group: Group) -> None:
26
27
  """
27
28
  Write the markdown data to a Zarr group
28
29
 
@@ -37,9 +38,7 @@ class Markdown(FigpackView):
37
38
  content_array = np.frombuffer(content_bytes, dtype=np.uint8)
38
39
 
39
40
  # Store the markdown content as a zarr array
40
- group.create_dataset(
41
- "content_data", data=content_array, dtype=np.uint8, chunks=True
42
- )
41
+ group.create_dataset("content_data", data=content_array, chunks=True)
43
42
 
44
43
  # Store content size in attrs
45
44
  group.attrs["data_size"] = len(content_bytes)
@@ -9,6 +9,7 @@ from typing import Any, Union
9
9
  import zarr
10
10
 
11
11
  from ..core.figpack_view import FigpackView
12
+ from ..core.zarr import Group
12
13
 
13
14
 
14
15
  class MatplotlibFigure(FigpackView):
@@ -25,7 +26,7 @@ class MatplotlibFigure(FigpackView):
25
26
  """
26
27
  self.fig = fig
27
28
 
28
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
29
+ def _write_to_zarr_group(self, group: Group) -> None:
29
30
  """
30
31
  Write the matplotlib figure data to a Zarr group
31
32
 
@@ -54,11 +55,6 @@ class MatplotlibFigure(FigpackView):
54
55
  group.create_dataset(
55
56
  "svg_data",
56
57
  data=svg_array,
57
- dtype=np.uint8,
58
- chunks=True,
59
- compressor=zarr.Blosc(
60
- cname="zstd", clevel=3, shuffle=zarr.Blosc.SHUFFLE
61
- ),
62
58
  )
63
59
 
64
60
  # Store figure dimensions for reference
@@ -77,11 +73,6 @@ class MatplotlibFigure(FigpackView):
77
73
  group.create_dataset(
78
74
  "svg_data",
79
75
  data=np.array([], dtype=np.uint8),
80
- dtype=np.uint8,
81
- chunks=True,
82
- compressor=zarr.Blosc(
83
- cname="zstd", clevel=3, shuffle=zarr.Blosc.SHUFFLE
84
- ),
85
76
  )
86
77
  group.attrs["error"] = f"Failed to export matplotlib figure: {str(e)}"
87
78
  group.attrs["figure_width_inches"] = 6.0
@@ -6,9 +6,9 @@ import math
6
6
  from typing import List, Optional, Union
7
7
 
8
8
  import numpy as np
9
- import zarr
10
9
 
11
10
  from ..core.figpack_view import FigpackView
11
+ from ..core.zarr import Group
12
12
 
13
13
 
14
14
  class MultiChannelTimeseries(FigpackView):
@@ -174,7 +174,7 @@ class MultiChannelTimeseries(FigpackView):
174
174
  else: # len(shape) == 3
175
175
  return (chunk_timepoints, 2, n_channels)
176
176
 
177
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
177
+ def _write_to_zarr_group(self, group: Group) -> None:
178
178
  """
179
179
  Write the multi-channel timeseries data to a Zarr group
180
180
 
@@ -198,8 +198,6 @@ class MultiChannelTimeseries(FigpackView):
198
198
  "data",
199
199
  data=self.data,
200
200
  chunks=original_chunks,
201
- compression="blosc",
202
- compression_opts={"cname": "lz4", "clevel": 5, "shuffle": 1},
203
201
  )
204
202
 
205
203
  # Store downsampled data arrays
@@ -216,8 +214,6 @@ class MultiChannelTimeseries(FigpackView):
216
214
  dataset_name,
217
215
  data=downsampled_array,
218
216
  chunks=ds_chunks,
219
- compression="blosc",
220
- compression_opts={"cname": "lz4", "clevel": 5, "shuffle": 1},
221
217
  )
222
218
 
223
219
  print(
@@ -5,7 +5,7 @@ import urllib.request
5
5
  import urllib.error
6
6
  from datetime import date, datetime
7
7
 
8
- from figpack import FigpackExtension, ExtensionRegistry, ExtensionView
8
+ import figpack
9
9
 
10
10
 
11
11
  def _download_plotly_library():
@@ -42,17 +42,17 @@ except Exception as e:
42
42
  additional_files = {}
43
43
 
44
44
  # Create and register the plotly extension
45
- _plotly_extension = FigpackExtension(
45
+ _plotly_extension = figpack.FigpackExtension(
46
46
  name="figpack_plotly",
47
47
  javascript_code=_load_javascript_code(),
48
48
  additional_files=additional_files,
49
49
  version="1.0.0",
50
50
  )
51
51
 
52
- ExtensionRegistry.register(_plotly_extension)
52
+ figpack.ExtensionRegistry.register(_plotly_extension)
53
53
 
54
54
 
55
- class PlotlyFigure(ExtensionView):
55
+ class PlotlyFigure(figpack.ExtensionView):
56
56
  """
57
57
  A Plotly graph visualization view using the plotly library.
58
58
 
@@ -67,12 +67,12 @@ class PlotlyFigure(ExtensionView):
67
67
  fig: The plotly figure object
68
68
  """
69
69
  # for some reason, we need to reregister here to avoid issues with pytest
70
- ExtensionRegistry.register(_plotly_extension)
70
+ figpack.ExtensionRegistry.register(_plotly_extension)
71
71
  super().__init__(extension_name="figpack_plotly")
72
72
 
73
73
  self.fig = fig
74
74
 
75
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
75
+ def _write_to_zarr_group(self, group: figpack.Group) -> None:
76
76
  """
77
77
  Write the plotly figure data to a Zarr group
78
78
 
@@ -92,13 +92,7 @@ class PlotlyFigure(ExtensionView):
92
92
  json_array = np.frombuffer(json_bytes, dtype=np.uint8)
93
93
 
94
94
  # Store the figure data as compressed array
95
- group.create_dataset(
96
- "figure_data",
97
- data=json_array,
98
- dtype=np.uint8,
99
- chunks=True,
100
- compressor=zarr.Blosc(cname="zstd", clevel=3, shuffle=zarr.Blosc.SHUFFLE),
101
- )
95
+ group.create_dataset("figure_data", data=json_array)
102
96
 
103
97
  # Store data size for reference
104
98
  group.attrs["data_size"] = len(json_bytes)
@@ -9,6 +9,7 @@ import numpy as np
9
9
  import zarr
10
10
 
11
11
  from ..core.figpack_view import FigpackView
12
+ from ..core.zarr import Group
12
13
 
13
14
 
14
15
  class Spectrogram(FigpackView):
@@ -185,7 +186,7 @@ class Spectrogram(FigpackView):
185
186
 
186
187
  return (chunk_timepoints, n_frequencies)
187
188
 
188
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
189
+ def _write_to_zarr_group(self, group: Group) -> None:
189
190
  """
190
191
  Write the spectrogram data to a Zarr group
191
192
 
@@ -212,8 +213,6 @@ class Spectrogram(FigpackView):
212
213
  group.create_dataset(
213
214
  "frequencies",
214
215
  data=self.frequencies,
215
- compression="blosc",
216
- compression_opts={"cname": "lz4", "clevel": 5, "shuffle": 1},
217
216
  )
218
217
 
219
218
  # Store original data with optimal chunking
@@ -222,8 +221,6 @@ class Spectrogram(FigpackView):
222
221
  "data",
223
222
  data=self.data,
224
223
  chunks=original_chunks,
225
- compression="blosc",
226
- compression_opts={"cname": "lz4", "clevel": 5, "shuffle": 1},
227
224
  )
228
225
 
229
226
  # Store downsampled data arrays
@@ -240,8 +237,6 @@ class Spectrogram(FigpackView):
240
237
  dataset_name,
241
238
  data=downsampled_array,
242
239
  chunks=ds_chunks,
243
- compression="blosc",
244
- compression_opts={"cname": "lz4", "clevel": 5, "shuffle": 1},
245
240
  )
246
241
 
247
242
  print(f"Stored Spectrogram with {len(downsample_factors)} downsampled levels:")
figpack/views/Splitter.py CHANGED
@@ -4,9 +4,8 @@ Splitter view for figpack - a resizable split layout container
4
4
 
5
5
  from typing import Literal
6
6
 
7
- import zarr
8
-
9
7
  from ..core.figpack_view import FigpackView
8
+ from ..core.zarr import Group
10
9
  from .LayoutItem import LayoutItem
11
10
 
12
11
 
@@ -37,7 +36,7 @@ class Splitter(FigpackView):
37
36
  self.item2 = item2
38
37
  self.split_pos = max(0.1, min(0.9, split_pos)) # Clamp between 0.1 and 0.9
39
38
 
40
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
39
+ def _write_to_zarr_group(self, group: Group) -> None:
41
40
  """
42
41
  Write the Splitter layout data to a Zarr group
43
42
 
@@ -4,9 +4,8 @@ TabLayout view for figpack - a tabbed layout container that handles other views
4
4
 
5
5
  from typing import Any, Dict, List, Optional
6
6
 
7
- import zarr
8
-
9
7
  from ..core.figpack_view import FigpackView
8
+ from ..core.zarr import Group
10
9
  from .TabLayoutItem import TabLayoutItem
11
10
 
12
11
 
@@ -33,7 +32,7 @@ class TabLayout(FigpackView):
33
32
  max(0, min(initial_tab_index, len(items) - 1)) if items else 0
34
33
  )
35
34
 
36
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
35
+ def _write_to_zarr_group(self, group: Group) -> None:
37
36
  """
38
37
  Write the TabLayout data to a Zarr group
39
38
 
@@ -6,9 +6,9 @@ import math
6
6
  from typing import Any, Dict, List, Optional, Union
7
7
 
8
8
  import numpy as np
9
- import zarr
10
9
 
11
10
  from ..core.figpack_view import FigpackView
11
+ from ..core.zarr import Group
12
12
 
13
13
 
14
14
  class TimeseriesGraph(FigpackView):
@@ -160,7 +160,7 @@ class TimeseriesGraph(FigpackView):
160
160
  )
161
161
  )
162
162
 
163
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
163
+ def _write_to_zarr_group(self, group: Group) -> None:
164
164
  """
165
165
  Write the graph data to a Zarr group
166
166
 
@@ -217,7 +217,7 @@ class TGLineSeries:
217
217
 
218
218
  def _write_to_zarr_group(
219
219
  self,
220
- group: zarr.Group,
220
+ group: Group,
221
221
  ) -> None:
222
222
  group.attrs["series_type"] = "line"
223
223
  group.attrs["color"] = self.color
@@ -248,7 +248,7 @@ class TGMarkerSeries:
248
248
  self.radius = radius
249
249
  self.shape = shape
250
250
 
251
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
251
+ def _write_to_zarr_group(self, group: Group) -> None:
252
252
  """
253
253
  Write the marker series data to a Zarr dataset
254
254
 
@@ -287,7 +287,7 @@ class TGIntervalSeries:
287
287
  self.color = color
288
288
  self.alpha = alpha
289
289
 
290
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
290
+ def _write_to_zarr_group(self, group: Group) -> None:
291
291
  """
292
292
  Write the interval series data to a Zarr dataset
293
293
 
@@ -492,7 +492,7 @@ class TGUniformSeries:
492
492
  else: # len(shape) == 3
493
493
  return (chunk_timepoints, 2, n_channels)
494
494
 
495
- def _write_to_zarr_group(self, group: zarr.Group) -> None:
495
+ def _write_to_zarr_group(self, group: Group) -> None:
496
496
  """
497
497
  Write the uniform series data to a Zarr group
498
498
 
@@ -518,8 +518,6 @@ class TGUniformSeries:
518
518
  "data",
519
519
  data=self.data,
520
520
  chunks=original_chunks,
521
- compression="blosc",
522
- compression_opts={"cname": "lz4", "clevel": 5, "shuffle": 1},
523
521
  )
524
522
 
525
523
  # Store downsampled data arrays
@@ -536,6 +534,4 @@ class TGUniformSeries:
536
534
  dataset_name,
537
535
  data=downsampled_array,
538
536
  chunks=ds_chunks,
539
- compression="blosc",
540
- compression_opts={"cname": "lz4", "clevel": 5, "shuffle": 1},
541
537
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: figpack
3
- Version: 0.2.15
3
+ Version: 0.2.16
4
4
  Summary: A Python package for creating shareable, interactive visualizations in the browser
5
5
  Author-email: Jeremy Magland <jmagland@flatironinstitute.org>
6
6
  License: Apache-2.0
@@ -25,7 +25,7 @@ Requires-Python: >=3.8
25
25
  Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
27
  Requires-Dist: numpy
28
- Requires-Dist: zarr<3
28
+ Requires-Dist: zarr
29
29
  Requires-Dist: requests
30
30
  Requires-Dist: psutil
31
31
  Provides-Extra: test
@@ -37,6 +37,25 @@ Requires-Dist: matplotlib; extra == "test"
37
37
  Requires-Dist: plotly; extra == "test"
38
38
  Requires-Dist: Pillow; extra == "test"
39
39
  Requires-Dist: pandas; extra == "test"
40
+ Provides-Extra: test-zarr2
41
+ Requires-Dist: pytest>=7.0; extra == "test-zarr2"
42
+ Requires-Dist: pytest-cov>=4.0; extra == "test-zarr2"
43
+ Requires-Dist: pytest-mock>=3.10; extra == "test-zarr2"
44
+ Requires-Dist: spikeinterface; extra == "test-zarr2"
45
+ Requires-Dist: matplotlib; extra == "test-zarr2"
46
+ Requires-Dist: plotly; extra == "test-zarr2"
47
+ Requires-Dist: Pillow; extra == "test-zarr2"
48
+ Requires-Dist: pandas; extra == "test-zarr2"
49
+ Requires-Dist: zarr<3; extra == "test-zarr2"
50
+ Provides-Extra: test-zarr3
51
+ Requires-Dist: pytest>=7.0; extra == "test-zarr3"
52
+ Requires-Dist: pytest-cov>=4.0; extra == "test-zarr3"
53
+ Requires-Dist: pytest-mock>=3.10; extra == "test-zarr3"
54
+ Requires-Dist: matplotlib; extra == "test-zarr3"
55
+ Requires-Dist: plotly; extra == "test-zarr3"
56
+ Requires-Dist: Pillow; extra == "test-zarr3"
57
+ Requires-Dist: pandas; extra == "test-zarr3"
58
+ Requires-Dist: zarr>=3; extra == "test-zarr3"
40
59
  Provides-Extra: dev
41
60
  Requires-Dist: pytest>=7.0; extra == "dev"
42
61
  Requires-Dist: pytest-cov>=4.0; extra == "dev"
@@ -1,60 +1,61 @@
1
- figpack/__init__.py,sha256=wJMYi-BCkRJz-Yh3Xnzki9-faM1YkhBUGC2DmiTApjE,360
1
+ figpack/__init__.py,sha256=ZzDwKk8AfWS09QYjRrL0YdJDKDLn_i0ZdmF9gJFRWRk,402
2
2
  figpack/cli.py,sha256=xWF7J2BxUqOLvPu-Kje7Q6oGukTroXsLq8WN8vJgyw0,8321
3
3
  figpack/core/__init__.py,sha256=V4wVdyBJ80mi9Rz8HjDSQNkqhqYB6sq4vWH3xQ10kaE,232
4
- figpack/core/_bundle_utils.py,sha256=16hgTExPLkJCtGjVUCLlnbs_qgns6v01egVr3CEnUXE,6082
4
+ figpack/core/_bundle_utils.py,sha256=mEhdyw5dytQBIIJ5a_sPiQOR2ARPhuYurX40-mX_5Q0,6602
5
5
  figpack/core/_save_figure.py,sha256=52ny-m1ThGgxY4ZgMn7m33n8A2OCyezj8H8TMvw0Y8Q,1043
6
6
  figpack/core/_server_manager.py,sha256=BTLeZtSbaJtAmtslAfgvp9C-SV0aJnn4WCpUJzd1Mlg,10997
7
7
  figpack/core/_show_view.py,sha256=-5HT1MYSeVuEoaL3RNNyoCjYsZy4Jy9XLjljUqLuvV4,5146
8
8
  figpack/core/_upload_bundle.py,sha256=54hdWayJJdRZdx7N9V2aH_X33KkR6hImMjN6tkBTLi8,14894
9
- figpack/core/_view_figure.py,sha256=o1x1I2VKFrp2W_TStUS3fQblRW8AvGbu7Uy7MgVjofA,4186
9
+ figpack/core/_view_figure.py,sha256=xKmOdrqV-tQTRAK3n3eQx75de5el2KNIbHXdkCIqxSg,4201
10
10
  figpack/core/config.py,sha256=oOR7SlP192vuFhYlS-h14HnG-kd_3gaz0vshXch2RNc,173
11
- figpack/core/extension_view.py,sha256=flFj8X4XuDzzOyeOe3SBddbr_t4wbg1V3vFzJoEVAB4,1995
11
+ figpack/core/extension_view.py,sha256=isBQa2iZpdVdSbegEdlB4NxFbpYWysgpx5lS5kirMEA,2008
12
12
  figpack/core/figpack_extension.py,sha256=EJHZpe7GsQMUnSvxcYf8374-f6n85F_k1IEelFMRFP8,4332
13
- figpack/core/figpack_view.py,sha256=X_EtpWTloENfRnDEJcBxXBPditaObv5BWMzO-_stAho,6297
13
+ figpack/core/figpack_view.py,sha256=L--pBg-PjEiAE2Ry4u-1eZsRVu4j4-p-NKwtJSVnGj0,6304
14
+ figpack/core/zarr.py,sha256=LTWOIX6vuH25STYTQS9_apfnfYXmATAEQkil3z9eYKE,1634
14
15
  figpack/figpack-figure-dist/index.html,sha256=QEgK_8r_xh9cEtRs_85TSUb2cCYOdar73GYaC7T2bqU,486
15
16
  figpack/figpack-figure-dist/assets/index-D9a3K6eW.css,sha256=ki61XkOz_TBJnU9Qyk5EgBzh2-_ilZQui2i8DHSarEo,5584
16
17
  figpack/figpack-figure-dist/assets/index-DtOnN02w.js,sha256=0PDEXSULzwI8N4YYSOAtQJOtOYa6XsRrk1GBd0VHlkg,1625494
17
18
  figpack/figpack-figure-dist/assets/neurosift-logo-CLsuwLMO.png,sha256=g5m-TwrGh5f6-9rXtWV-znH4B0nHgc__0GWclRDLUHs,9307
18
19
  figpack/franklab/__init__.py,sha256=HkehqGImJE_sE2vbPDo-HbgtEYaMICb9-230xTYvRTU,56
19
- figpack/franklab/views/TrackAnimation.py,sha256=3Jv1Ri4FIwTyqNahinqhHsBH1Bv_iZrEGx12w6diJ2M,5636
20
+ figpack/franklab/views/TrackAnimation.py,sha256=eQultUKsHwzKwZ9er48ZvpLfWB3vEooTO7GJOTojEik,5662
20
21
  figpack/franklab/views/__init__.py,sha256=XXZ9QJLh9KAeeLgKbi6ogYOyfTgHP-N6o3u981NFwx8,116
21
22
  figpack/spike_sorting/__init__.py,sha256=09njqh-oFaCTdZUsc4HAOFTliUYV9DClddfZ0Q_dm0I,61
22
23
  figpack/spike_sorting/views/AutocorrelogramItem.py,sha256=qHmvIdHpbfVA_utPb5N2oP3hSP2cGnlT8VLaxOXV4UM,738
23
- figpack/spike_sorting/views/Autocorrelograms.py,sha256=6MXOYJKUNEhJokiyOs8SGJVF9U9N6sHuQNYz7IEssqc,3677
24
- figpack/spike_sorting/views/AverageWaveforms.py,sha256=mvMkS3wf6MpI95tlGqKxBjxZlHqJr4aqG7SZvHigIsI,5193
24
+ figpack/spike_sorting/views/Autocorrelograms.py,sha256=kkGUvRbqDmwJcAPXb5e6QYeiqlNH8mbK3Vu3h0G940Y,3623
25
+ figpack/spike_sorting/views/AverageWaveforms.py,sha256=cvGUI-7IImW2Mnx2-jOsyGaabXE_UEKFyGAd9hb549U,5113
25
26
  figpack/spike_sorting/views/CrossCorrelogramItem.py,sha256=uSd0i2hupteuILi_aKp7bYPYpL_PdC3CUDRMOEKUEM0,880
26
- figpack/spike_sorting/views/CrossCorrelograms.py,sha256=OGQq_5t_T1zq4eFCpuTAvUIhZQu7ef7LVexKNdByMvo,4415
27
- figpack/spike_sorting/views/RasterPlot.py,sha256=m8Cg-KioAM3CdIJOecpyTqp71HwhQVDzAk3J4Xb4V-c,9940
27
+ figpack/spike_sorting/views/CrossCorrelograms.py,sha256=NbG3jLIUkAovAvx500e1KvEGYgoRUgvBUVfvTNyv6vc,4383
28
+ figpack/spike_sorting/views/RasterPlot.py,sha256=Y0anPrLPbf_rEg66M7bCK6B1RRCELlb4q_OBXiMqcGg,9819
28
29
  figpack/spike_sorting/views/RasterPlotItem.py,sha256=iW7fuDEjSfvf5YMIwrF_6cmKvD76oCigOUMHtGgBsPI,638
29
- figpack/spike_sorting/views/SpikeAmplitudes.py,sha256=UOGxReKs5WwH7iRdR-iVN3Pr6wF3AnIV15veoZZzOco,13433
30
+ figpack/spike_sorting/views/SpikeAmplitudes.py,sha256=iTENfvPj5o1Wlui1UCewnvsPRXgGoDTXmWn-R33VzsQ,13111
30
31
  figpack/spike_sorting/views/SpikeAmplitudesItem.py,sha256=j5Na-diY-vRUAPu0t0VkyFCSKFnQ_f5HT077mB3Cy8c,1134
31
- figpack/spike_sorting/views/UnitMetricsGraph.py,sha256=Eva0YgexnHZqRH7bPQFgaqobWFz_ab6zgTb4-QZ4h2k,3381
32
+ figpack/spike_sorting/views/UnitMetricsGraph.py,sha256=_o8iO7ozQBoX80oGDXxEfkMV-zOIbJpbG5WaCcsYDy0,3267
32
33
  figpack/spike_sorting/views/UnitSimilarityScore.py,sha256=cJA9MkETos9qHhV1tqgA7SfNEaPo-duXYCE76hSFGnA,948
33
- figpack/spike_sorting/views/UnitsTable.py,sha256=M3y1IDJzSnvOaM1-QOyJOVcUcdTkVvxYhEMGd1kmUzs,2969
34
+ figpack/spike_sorting/views/UnitsTable.py,sha256=moWVNVV9u39k5TdLaaI2WLDJw_5gxP6Igx53ngw13YI,2665
34
35
  figpack/spike_sorting/views/UnitsTableColumn.py,sha256=zBnuoeILTuiVLDvtcOxqa37E5WlbR12rlwNJUeWXxY4,847
35
36
  figpack/spike_sorting/views/UnitsTableRow.py,sha256=rEb2hMTA_pl2fTW1nOvnGir0ysfNx4uww3aekZzfWjk,720
36
37
  figpack/spike_sorting/views/__init__.py,sha256=2caaV9yxi97aHoYfUWUYyyIXQSZJRtRVqmPOW9ZeG1I,1159
37
- figpack/views/Box.py,sha256=KEItT39xpw0Nl_4NU3WpPmi67wQKVSgiMyB4zAFGf4w,2409
38
- figpack/views/DataFrame.py,sha256=VFP-EM_Wnc1G3uimVVMJe08KKWCAZe7DvmYf5e07uTk,3653
39
- figpack/views/Gallery.py,sha256=sHlZbaqxcktasmNsJnuxe8WmgUQ6iurG50JiChKSMbQ,3314
38
+ figpack/views/Box.py,sha256=dH4Vxax4NPJExZSx8jAG6feMgkNU5mOPEf-lLOd41-4,2421
39
+ figpack/views/DataFrame.py,sha256=FAqrEddh3v0MNXlXA1DQzN34d9gacDXHUdiahIKlgOI,3401
40
+ figpack/views/Gallery.py,sha256=D6drCKfnPN6MNn3wjQV0i5FW2s3q9xP-X75q-PR4Sc8,3326
40
41
  figpack/views/GalleryItem.py,sha256=b_upJno5P3ANSulbG-h3t6Xj56tPGJ7iVxqyiZu3zaQ,1244
41
- figpack/views/Image.py,sha256=hmyAHlRwj0l6fC7aNmHYJFaj-qCqyH67soERm78V5dk,3953
42
+ figpack/views/Image.py,sha256=8eNWzednvpsz0EcaoK3GdWGBfCybT2pXnBhMlZMr4yA,3742
42
43
  figpack/views/LayoutItem.py,sha256=wy8DggkIzZpU0F1zFIBceS7HpBb6lu-A3hpYINQzedk,1595
43
- figpack/views/Markdown.py,sha256=Dl1UX5s0aC-mEx5m6jIJ839YKMNeeVzIDG-EANVrbys,1147
44
- figpack/views/MatplotlibFigure.py,sha256=YoNtZTItEjatbtNJqATm2H-Oircp5Ca6FZLjHk_B0zg,2778
45
- figpack/views/MultiChannelTimeseries.py,sha256=sWr2nW1eoYR7V44wF7fac7IoQ6BOnus1nc4STkgIkYw,8501
46
- figpack/views/Spectrogram.py,sha256=GfTNinkuMFu4dxn35MvSB4Perz84sx4LMcjUrOviz6c,9648
47
- figpack/views/Splitter.py,sha256=x9jLCTlIvDy5p9ymVd0X48KDccyD6bJANhXyFgKEmtE,2007
48
- figpack/views/TabLayout.py,sha256=5g3nmL95PfqgI0naqZXHMwLVo2ebDlGX01Hy9044bUw,1898
44
+ figpack/views/Markdown.py,sha256=8kScwS1XaiQt5KRcbWG1B4RNUbA_FG5fIUJcv6csB8g,1134
45
+ figpack/views/MatplotlibFigure.py,sha256=v4rc8sT9FcuHPrwljq9s-BUT5vlJiRDAf5tBP4YujAE,2423
46
+ figpack/views/MultiChannelTimeseries.py,sha256=loZ1zGyIC_VJbduR7EIBbFHFPEr8DRQw-QNQSFVSdHQ,8292
47
+ figpack/views/Spectrogram.py,sha256=9aJpzlOsOo7ReddR-i6riN2MG2RdveRS7m6MI2cCYjM,9336
48
+ figpack/views/Splitter.py,sha256=q29pBu4RJgr0o_m1Jliv5FrGGCm5_jhowMg8Xgh70gk,2019
49
+ figpack/views/TabLayout.py,sha256=bKLjeI_CnllThB6t7AwlP-Oh5mKbWt8hpubW5Zyj420,1910
49
50
  figpack/views/TabLayoutItem.py,sha256=xmHA0JsW_6naJze4_mQuP_Fy0Nm17p2N7w_AsmVRp8k,880
50
- figpack/views/TimeseriesGraph.py,sha256=nfmlh4LYB4Ut7htMZTtArqxUAsh66TW8dSx7jE3vdRI,17929
51
+ figpack/views/TimeseriesGraph.py,sha256=VErwmzRqNFq1i2XEWzAHM6csbHry064did32AbxLMms,17700
51
52
  figpack/views/__init__.py,sha256=nyd3Ot2x702W4j9oBN0lK6i0DZzg9Ai41XoYCm5DeQ8,546
52
- figpack/views/PlotlyExtension/PlotlyExtension.py,sha256=_-GiqzHFb9uF1O6RNKEkd85SX8z9z5kFOh8tO_9aAbk,3778
53
+ figpack/views/PlotlyExtension/PlotlyExtension.py,sha256=HLmaRiTC62Q-uEg2OVkCL0-MxFwWL9lvRcWp4mRRCmM,3582
53
54
  figpack/views/PlotlyExtension/__init__.py,sha256=80Wy1mDMWyagjuR99ECxJePIYpRQ6TSyHkB0uZoBZ_0,70
54
55
  figpack/views/PlotlyExtension/plotly_view.js,sha256=gCsZS0IaYGTN5a3DC2c4NmzoOxZi1xGfCAYI6WSoFpM,3596
55
- figpack-0.2.15.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
56
- figpack-0.2.15.dist-info/METADATA,sha256=oEmaJIEjsFFqqg6VKjKsxwjNtWuEDdl7qJi5rAKgtjc,3617
57
- figpack-0.2.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
58
- figpack-0.2.15.dist-info/entry_points.txt,sha256=l6d3siH2LxXa8qJGbjAqpIZtI5AkMSyDeoRDCzdrUto,45
59
- figpack-0.2.15.dist-info/top_level.txt,sha256=lMKGaC5xWmAYBx9Ac1iMokm42KFnJFjmkP2ldyvOo-c,8
60
- figpack-0.2.15.dist-info/RECORD,,
56
+ figpack-0.2.16.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
57
+ figpack-0.2.16.dist-info/METADATA,sha256=xRrlEnscZFMvAvM5uCXPYMzJ-qyAnVMwLBVjLsfIRi0,4501
58
+ figpack-0.2.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
59
+ figpack-0.2.16.dist-info/entry_points.txt,sha256=l6d3siH2LxXa8qJGbjAqpIZtI5AkMSyDeoRDCzdrUto,45
60
+ figpack-0.2.16.dist-info/top_level.txt,sha256=lMKGaC5xWmAYBx9Ac1iMokm42KFnJFjmkP2ldyvOo-c,8
61
+ figpack-0.2.16.dist-info/RECORD,,