figpack 0.2.8__py3-none-any.whl → 0.2.10__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.
- figpack/__init__.py +9 -2
- figpack/core/__init__.py +5 -0
- figpack/core/_bundle_utils.py +125 -2
- figpack/core/extension_view.py +53 -0
- figpack/core/figpack_extension.py +137 -0
- figpack/core/figpack_view.py +1 -1
- figpack/figpack-figure-dist/assets/{index-CjiTpC6i.js → index-D2FnM_hN.js} +82 -84
- figpack/figpack-figure-dist/assets/{index-Cmae55E4.css → index-D9a3K6eW.css} +1 -1
- figpack/figpack-figure-dist/index.html +2 -2
- figpack/spike_sorting/views/UnitMetricsGraph.py +129 -0
- figpack/spike_sorting/views/__init__.py +8 -0
- figpack/views/Spectrogram.py +50 -21
- {figpack-0.2.8.dist-info → figpack-0.2.10.dist-info}/METADATA +1 -1
- {figpack-0.2.8.dist-info → figpack-0.2.10.dist-info}/RECORD +18 -15
- {figpack-0.2.8.dist-info → figpack-0.2.10.dist-info}/WHEEL +0 -0
- {figpack-0.2.8.dist-info → figpack-0.2.10.dist-info}/entry_points.txt +0 -0
- {figpack-0.2.8.dist-info → figpack-0.2.10.dist-info}/licenses/LICENSE +0 -0
- {figpack-0.2.8.dist-info → figpack-0.2.10.dist-info}/top_level.txt +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
.unitEntryBase{padding-right:13px;padding-top:10px}.unselectedUnitEntry{border:1px transparent solid;font-weight:400;color:#000;background-color:#fff}.selectedUnitEntry{border:1px solid blue;font-weight:700;color:#000;background-color:#b5d1ff}.unitIdsColumnLabelStyle{min-width:200px;font-weight:700;padding:7px 5px}.unitLabelsStyle{padding-right:3px;color:#333}.plotUnitLabel{text-align:left;margin-left:20px;margin-top:5px;font-weight:700}.plotWrapperButtonParent{display:inline-block}.plotWrapperStyleButton{padding-top:50px}.plotUnselectedStyle{border:3px solid rgb(202,224,231)}.plotSelectedStyle{border:3px solid #9999ff;background-color:#fff}.plotUnselectableStyle{border:3px solid transparent}.plotCurrentStyle{border:3px solid blue;background-color:#fff}.plotLabelStyle{font-weight:700;text-align:center;overflow:hidden;white-space:nowrap}:root{font-family:system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;overflow:hidden}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.status-bar{position:fixed;bottom:0;left:0;right:0;height:30px;background-color:#2a2a2a;color:#fff;display:flex;align-items:center;padding:0 12px;font-size:12px;border-top:1px solid #444;z-index:1000}.status-bar.warning{background-color:#ff9800;color:#000}.status-bar.error{background-color:#f44336;color:#fff}.status-bar.expired{background-color:#d32f2f;color:#fff}.manage-button{background-color:#444;color:#fff;border:none;padding:4px 8px;border-radius:4px;cursor:pointer;font-size:11px;height:22px;margin-left:12px;transition:background-color .2s}.manage-button:hover{background-color:#666}.about-button{background-color:#444;color:#fff;border:none;padding:4px 8px;border-radius:4px;cursor:pointer;font-size:11px;height:22px;margin-left:12px;transition:background-color .2s}.about-button:hover{background-color:#666}.about-dialog-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:2000}.about-dialog{background-color:#2a2a2a;color:#fff;border-radius:8px;max-width:600px;max-height:80vh;width:90%;box-shadow:0 4px 20px #0000004d;overflow:hidden}.about-dialog-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #444}.about-dialog-header h2{margin:0;font-size:18px;font-weight:600}.about-dialog-close{background:none;border:none;color:#fff;font-size:24px;cursor:pointer;padding:0;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:background-color .2s}.about-dialog-close:hover{background-color:#444}.about-dialog-content{padding:20px;overflow-y:auto;max-height:calc(80vh - 80px)}.about-dialog-description{line-height:1.6}.about-dialog-description h1,.about-dialog-description h2,.about-dialog-description h3{margin-top:0;margin-bottom:12px}.about-dialog-description p{margin-bottom:12px}.about-dialog-description code{background-color:#444;padding:2px 4px;border-radius:3px;font-family:Courier New,monospace;font-size:.9em}.about-dialog-description pre{background-color:#444;padding:12px;border-radius:4px;overflow-x:auto;margin-bottom:12px}.about-dialog-description ul,.about-dialog-description ol{margin-bottom:12px;padding-left:20px}.about-dialog-description blockquote{border-left:4px solid #666;padding-left:16px;margin:12px 0;font-style:italic}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}.status-bar{background-color:#f5f5f5;color:#333;border-top:1px solid #ddd}.status-bar.warning{background-color:#fff3cd;color:#856404;border-top:1px solid #ffeaa7}.status-bar.error,.status-bar.expired{background-color:#f8d7da;color:#721c24;border-top:1px solid #f5c6cb}.manage-button{background-color:#e0e0e0;color:#333;border:1px solid #ccc}.manage-button:hover{background-color:#d0d0d0}.about-button{background-color:#e0e0e0;color:#333;border:1px solid #ccc}.about-button:hover{background-color:#d0d0d0}.about-dialog{background-color:#fff;color:#333;box-shadow:0 4px 20px #00000026}.about-dialog-header{border-bottom:1px solid #ddd}.about-dialog-close{color:#333}.about-dialog-close:hover{background-color:#f0f0f0}.about-dialog-description code,.about-dialog-description pre{background-color:#f5f5f5;color:#333}.about-dialog-description blockquote{border-left:4px solid #ccc}}.VerticalToolbar{overflow:hidden;position:absolute}.HorizontalToolbar{display:flex;justify-content:center;align-items:center;overflow:hidden;margin:auto}.SortableTableWidget .MuiTableCell-root{padding:1px 0;font-size:12px;border:solid 1px #f0f0f0}.SortableTableWidget .MuiTableRow-root.selectedRow{background-color:#b5d1ff}.SortableTableWidget .MuiTableRow-root.currentRow{background-color:#95b1df}.SortCaretSpan{font-size:16px;color:gray;padding-left:3px;padding-right:5px;padding-top:2px}.SortableTableWidget .unitLabel{width:10px;height:10px;position:relative;display:inline-block}.SortableTableWidget .SortableTableCheckbox{padding:1px}
|
|
1
|
+
.unitEntryBase{padding-right:13px;padding-top:10px}.unselectedUnitEntry{border:1px transparent solid;font-weight:400;color:#000;background-color:#fff}.selectedUnitEntry{border:1px solid blue;font-weight:700;color:#000;background-color:#b5d1ff}.unitIdsColumnLabelStyle{min-width:200px;font-weight:700;padding:7px 5px}.unitLabelsStyle{padding-right:3px;color:#333}.plotUnitLabel{text-align:left;margin-left:20px;margin-top:5px;font-weight:700}.plotWrapperButtonParent{display:inline-block}.plotWrapperStyleButton{padding-top:50px}.plotUnselectedStyle{border:3px solid rgb(202,224,231)}.plotSelectedStyle{border:3px solid #9999ff;background-color:#fff}.plotUnselectableStyle{border:3px solid transparent}.plotCurrentStyle{border:3px solid blue;background-color:#fff}.plotLabelStyle{font-weight:700;text-align:center;overflow:hidden;white-space:nowrap}:root{font-family:system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;overflow:hidden}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.status-bar{position:fixed;bottom:0;left:0;right:0;height:30px;background-color:#2a2a2a;color:#fff;display:flex;align-items:center;padding:0 12px;font-size:12px;border-top:1px solid #444;z-index:1000}.status-bar.warning{background-color:#ff9800;color:#000}.status-bar.error{background-color:#f44336;color:#fff}.status-bar.expired{background-color:#d32f2f;color:#fff}.manage-button{background-color:#444;color:#fff;border:none;padding:4px 8px;border-radius:4px;cursor:pointer;font-size:11px;height:22px;margin-left:12px;transition:background-color .2s}.manage-button:hover{background-color:#666}.about-button{background-color:#444;color:#fff;border:none;padding:4px 8px;border-radius:4px;cursor:pointer;font-size:11px;height:22px;margin-left:12px;transition:background-color .2s}.about-button:hover{background-color:#666}.about-dialog-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:2000}.about-dialog{background-color:#2a2a2a;color:#fff;border-radius:8px;max-width:600px;max-height:80vh;width:90%;box-shadow:0 4px 20px #0000004d;overflow:hidden}.about-dialog-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #444}.about-dialog-header h2{margin:0;font-size:18px;font-weight:600}.about-dialog-close{background:none;border:none;color:#fff;font-size:24px;cursor:pointer;padding:0;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:background-color .2s}.about-dialog-close:hover{background-color:#444}.about-dialog-content{padding:20px;overflow-y:auto;max-height:calc(80vh - 80px)}.about-dialog-description{line-height:1.6}.about-dialog-description h1,.about-dialog-description h2,.about-dialog-description h3{margin-top:0;margin-bottom:12px}.about-dialog-description p{margin-bottom:12px}.about-dialog-description code{background-color:#444;padding:2px 4px;border-radius:3px;font-family:Courier New,monospace;font-size:.9em}.about-dialog-description pre{background-color:#444;padding:12px;border-radius:4px;overflow-x:auto;margin-bottom:12px}.about-dialog-description ul,.about-dialog-description ol{margin-bottom:12px;padding-left:20px}.about-dialog-description blockquote{border-left:4px solid #666;padding-left:16px;margin:12px 0;font-style:italic}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}.status-bar{background-color:#f5f5f5;color:#333;border-top:1px solid #ddd}.status-bar.warning{background-color:#fff3cd;color:#856404;border-top:1px solid #ffeaa7}.status-bar.error,.status-bar.expired{background-color:#f8d7da;color:#721c24;border-top:1px solid #f5c6cb}.manage-button{background-color:#e0e0e0;color:#333;border:1px solid #ccc}.manage-button:hover{background-color:#d0d0d0}.about-button{background-color:#e0e0e0;color:#333;border:1px solid #ccc}.about-button:hover{background-color:#d0d0d0}.about-dialog{background-color:#fff;color:#333;box-shadow:0 4px 20px #00000026}.about-dialog-header{border-bottom:1px solid #ddd}.about-dialog-close{color:#333}.about-dialog-close:hover{background-color:#f0f0f0}.about-dialog-description code,.about-dialog-description pre{background-color:#f5f5f5;color:#333}.about-dialog-description blockquote{border-left:4px solid #ccc}}.VerticalToolbar{overflow:hidden;position:absolute}.HorizontalToolbar{display:flex;justify-content:center;align-items:center;overflow:hidden;margin:auto}.SortableTableWidget .MuiTableCell-root{padding:1px 0;font-size:12px;border:solid 1px #f0f0f0}.SortableTableWidget .MuiTableRow-root.selectedRow{background-color:#b5d1ff}.SortableTableWidget .MuiTableRow-root.currentRow{background-color:#95b1df}.SortCaretSpan{font-size:16px;color:gray;padding-left:3px;padding-right:5px;padding-top:2px}.SortableTableWidget .unitLabel{width:10px;height:10px;position:relative;display:inline-block}.SortableTableWidget .SortableTableCheckbox{padding:1px}.NiceTable .MuiTableCell-root{padding:5px}.NiceTable .MuiIconButton-root{padding:1px}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<link rel="icon" type="image/png" href="./assets/neurosift-logo-CLsuwLMO.png" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>figpack figure</title>
|
|
8
|
-
<script type="module" crossorigin src="./assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
8
|
+
<script type="module" crossorigin src="./assets/index-D2FnM_hN.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="./assets/index-D9a3K6eW.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""
|
|
2
|
+
UnitMetricsGraph view for figpack - displays unit metrics in a graph format
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import List, Optional, Union, Dict
|
|
6
|
+
import json
|
|
7
|
+
|
|
8
|
+
import numpy as np
|
|
9
|
+
import zarr
|
|
10
|
+
|
|
11
|
+
from ...core.figpack_view import FigpackView
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class UnitMetricsGraphMetric:
|
|
15
|
+
"""
|
|
16
|
+
Defines a metric with key, label, and data type
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
*,
|
|
22
|
+
key: str,
|
|
23
|
+
label: str,
|
|
24
|
+
dtype: str,
|
|
25
|
+
):
|
|
26
|
+
"""
|
|
27
|
+
Initialize a UnitMetricsGraphMetric
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
key: Unique identifier for the metric
|
|
31
|
+
label: Human-readable label for display
|
|
32
|
+
dtype: Data type of the metric ("int", "float", etc.)
|
|
33
|
+
"""
|
|
34
|
+
self.key = key
|
|
35
|
+
self.label = label
|
|
36
|
+
self.dtype = dtype
|
|
37
|
+
|
|
38
|
+
def to_dict(self) -> Dict:
|
|
39
|
+
"""Convert to dictionary for serialization"""
|
|
40
|
+
return {
|
|
41
|
+
"key": self.key,
|
|
42
|
+
"label": self.label,
|
|
43
|
+
"dtype": self.dtype,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class UnitMetricsGraphUnit:
|
|
48
|
+
"""
|
|
49
|
+
Represents a unit with its metric values
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
*,
|
|
55
|
+
unit_id: Union[str, int],
|
|
56
|
+
values: Dict[str, Union[int, float]],
|
|
57
|
+
):
|
|
58
|
+
"""
|
|
59
|
+
Initialize a UnitMetricsGraphUnit
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
unit_id: Identifier for the unit
|
|
63
|
+
values: Dictionary mapping metric keys to their values
|
|
64
|
+
"""
|
|
65
|
+
self.unit_id = unit_id
|
|
66
|
+
self.values = values
|
|
67
|
+
|
|
68
|
+
def to_dict(self) -> Dict:
|
|
69
|
+
"""Convert to dictionary for serialization"""
|
|
70
|
+
return {
|
|
71
|
+
"unit_id": str(self.unit_id),
|
|
72
|
+
"values": self.values,
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class UnitMetricsGraph(FigpackView):
|
|
77
|
+
"""
|
|
78
|
+
A view that displays unit metrics in a graph format
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
def __init__(
|
|
82
|
+
self,
|
|
83
|
+
*,
|
|
84
|
+
units: List[UnitMetricsGraphUnit],
|
|
85
|
+
metrics: List[UnitMetricsGraphMetric],
|
|
86
|
+
height: Optional[int] = None,
|
|
87
|
+
):
|
|
88
|
+
"""
|
|
89
|
+
Initialize a UnitMetricsGraph view
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
units: List of UnitMetricsGraphUnit objects containing the data
|
|
93
|
+
metrics: List of UnitMetricsGraphMetric objects defining the metrics
|
|
94
|
+
height: Height of the view in pixels
|
|
95
|
+
"""
|
|
96
|
+
self.units = units
|
|
97
|
+
self.metrics = metrics
|
|
98
|
+
self.height = height
|
|
99
|
+
|
|
100
|
+
def _write_to_zarr_group(self, group: zarr.Group) -> None:
|
|
101
|
+
"""
|
|
102
|
+
Write the UnitMetricsGraph data to a Zarr group
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
group: Zarr group to write data into
|
|
106
|
+
"""
|
|
107
|
+
# Set the view type
|
|
108
|
+
group.attrs["view_type"] = "UnitMetricsGraph"
|
|
109
|
+
|
|
110
|
+
# Set view properties
|
|
111
|
+
if self.height is not None:
|
|
112
|
+
group.attrs["height"] = self.height
|
|
113
|
+
|
|
114
|
+
# Store metrics metadata
|
|
115
|
+
metrics_metadata = [metric.to_dict() for metric in self.metrics]
|
|
116
|
+
group.attrs["metrics"] = metrics_metadata
|
|
117
|
+
|
|
118
|
+
# Store units data in a zarr array
|
|
119
|
+
units_data = [unit.to_dict() for unit in self.units]
|
|
120
|
+
units_json = json.dumps(units_data).encode("utf-8")
|
|
121
|
+
units_array = np.frombuffer(units_json, dtype=np.uint8)
|
|
122
|
+
group.create_dataset(
|
|
123
|
+
"units_data",
|
|
124
|
+
data=units_array,
|
|
125
|
+
dtype=np.uint8,
|
|
126
|
+
chunks=True,
|
|
127
|
+
compressor=zarr.Blosc(cname="zstd", clevel=3, shuffle=zarr.Blosc.SHUFFLE),
|
|
128
|
+
)
|
|
129
|
+
group.attrs["units_data_size"] = len(units_json)
|
|
@@ -15,6 +15,11 @@ from .SpikeAmplitudesItem import SpikeAmplitudesItem
|
|
|
15
15
|
from .SpikeAmplitudes import SpikeAmplitudes
|
|
16
16
|
from .RasterPlotItem import RasterPlotItem
|
|
17
17
|
from .RasterPlot import RasterPlot
|
|
18
|
+
from .UnitMetricsGraph import (
|
|
19
|
+
UnitMetricsGraph,
|
|
20
|
+
UnitMetricsGraphMetric,
|
|
21
|
+
UnitMetricsGraphUnit,
|
|
22
|
+
)
|
|
18
23
|
|
|
19
24
|
__all__ = [
|
|
20
25
|
"AutocorrelogramItem",
|
|
@@ -30,4 +35,7 @@ __all__ = [
|
|
|
30
35
|
"SpikeAmplitudes",
|
|
31
36
|
"RasterPlotItem",
|
|
32
37
|
"RasterPlot",
|
|
38
|
+
"UnitMetricsGraph",
|
|
39
|
+
"UnitMetricsGraphMetric",
|
|
40
|
+
"UnitMetricsGraphUnit",
|
|
33
41
|
]
|
figpack/views/Spectrogram.py
CHANGED
|
@@ -21,9 +21,10 @@ class Spectrogram(FigpackView):
|
|
|
21
21
|
*,
|
|
22
22
|
start_time_sec: float,
|
|
23
23
|
sampling_frequency_hz: float,
|
|
24
|
-
frequency_min_hz: float,
|
|
25
|
-
frequency_delta_hz: float,
|
|
26
24
|
data: np.ndarray,
|
|
25
|
+
frequency_min_hz: Optional[float] = None,
|
|
26
|
+
frequency_delta_hz: Optional[float] = None,
|
|
27
|
+
frequencies: Optional[np.ndarray] = None,
|
|
27
28
|
):
|
|
28
29
|
"""
|
|
29
30
|
Initialize a Spectrogram view
|
|
@@ -31,29 +32,53 @@ class Spectrogram(FigpackView):
|
|
|
31
32
|
Args:
|
|
32
33
|
start_time_sec: Starting time in seconds
|
|
33
34
|
sampling_frequency_hz: Sampling rate in Hz
|
|
34
|
-
frequency_min_hz: Minimum frequency in Hz
|
|
35
|
-
frequency_delta_hz: Frequency bin spacing in Hz
|
|
36
35
|
data: N×M numpy array where N is timepoints and M is frequency bins
|
|
36
|
+
frequency_min_hz: Minimum frequency in Hz (for uniform bins)
|
|
37
|
+
frequency_delta_hz: Frequency bin spacing in Hz (for uniform bins)
|
|
38
|
+
frequencies: Array of frequency values (for non-uniform bins)
|
|
37
39
|
"""
|
|
38
40
|
assert data.ndim == 2, "Data must be a 2D array (timepoints × frequencies)"
|
|
39
41
|
assert sampling_frequency_hz > 0, "Sampling frequency must be positive"
|
|
40
|
-
|
|
42
|
+
|
|
43
|
+
# Validate frequency specification - exactly one method must be provided
|
|
44
|
+
uniform_specified = (
|
|
45
|
+
frequency_min_hz is not None and frequency_delta_hz is not None
|
|
46
|
+
)
|
|
47
|
+
nonuniform_specified = frequencies is not None
|
|
48
|
+
|
|
49
|
+
if uniform_specified and nonuniform_specified:
|
|
50
|
+
raise ValueError(
|
|
51
|
+
"Cannot specify both uniform (freq_min_hz, frequency_delta_hz) and non-uniform (frequencies) frequency parameters"
|
|
52
|
+
)
|
|
53
|
+
if not uniform_specified and not nonuniform_specified:
|
|
54
|
+
raise ValueError(
|
|
55
|
+
"Must specify either uniform (freq_min_hz, frequency_delta_hz) or non-uniform (frequencies) frequency parameters"
|
|
56
|
+
)
|
|
41
57
|
|
|
42
58
|
self.start_time_sec = start_time_sec
|
|
43
59
|
self.sampling_frequency_hz = sampling_frequency_hz
|
|
44
|
-
self.frequency_min_hz = frequency_min_hz
|
|
45
|
-
self.frequency_delta_hz = frequency_delta_hz
|
|
46
60
|
self.data = data.astype(np.float32) # Ensure float32 for efficiency
|
|
47
61
|
|
|
62
|
+
# Store frequency information
|
|
63
|
+
if uniform_specified:
|
|
64
|
+
assert frequency_delta_hz > 0, "Frequency delta must be positive"
|
|
65
|
+
self.uniform_frequencies = True
|
|
66
|
+
self.frequency_min_hz = frequency_min_hz
|
|
67
|
+
self.frequency_delta_hz = frequency_delta_hz
|
|
68
|
+
self.frequencies = None
|
|
69
|
+
else:
|
|
70
|
+
assert (
|
|
71
|
+
len(frequencies) == data.shape[1]
|
|
72
|
+
), f"Number of frequencies ({len(frequencies)}) must match data frequency dimension ({data.shape[1]})"
|
|
73
|
+
self.uniform_frequencies = False
|
|
74
|
+
self.frequency_min_hz = None
|
|
75
|
+
self.frequency_delta_hz = None
|
|
76
|
+
self.frequencies = np.array(frequencies, dtype=np.float32)
|
|
77
|
+
|
|
48
78
|
n_timepoints, n_frequencies = data.shape
|
|
49
79
|
self.n_timepoints = n_timepoints
|
|
50
80
|
self.n_frequencies = n_frequencies
|
|
51
81
|
|
|
52
|
-
# Calculate frequency bins
|
|
53
|
-
self.frequency_bins = (
|
|
54
|
-
frequency_min_hz + np.arange(n_frequencies) * frequency_delta_hz
|
|
55
|
-
)
|
|
56
|
-
|
|
57
82
|
# Calculate data range for color scaling
|
|
58
83
|
self.data_min = float(np.nanmin(data))
|
|
59
84
|
self.data_max = float(np.nanmax(data))
|
|
@@ -172,20 +197,24 @@ class Spectrogram(FigpackView):
|
|
|
172
197
|
# Store metadata
|
|
173
198
|
group.attrs["start_time_sec"] = self.start_time_sec
|
|
174
199
|
group.attrs["sampling_frequency_hz"] = self.sampling_frequency_hz
|
|
175
|
-
group.attrs["
|
|
176
|
-
group.attrs["frequency_delta_hz"] = self.frequency_delta_hz
|
|
200
|
+
group.attrs["uniform_frequencies"] = self.uniform_frequencies
|
|
177
201
|
group.attrs["n_timepoints"] = self.n_timepoints
|
|
178
202
|
group.attrs["n_frequencies"] = self.n_frequencies
|
|
179
203
|
group.attrs["data_min"] = self.data_min
|
|
180
204
|
group.attrs["data_max"] = self.data_max
|
|
181
205
|
|
|
182
|
-
# Store frequency
|
|
183
|
-
|
|
184
|
-
"
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
206
|
+
# Store frequency information based on type
|
|
207
|
+
if self.uniform_frequencies:
|
|
208
|
+
group.attrs["frequency_min_hz"] = self.frequency_min_hz
|
|
209
|
+
group.attrs["frequency_delta_hz"] = self.frequency_delta_hz
|
|
210
|
+
else:
|
|
211
|
+
# Store frequencies as a dataset for non-uniform case
|
|
212
|
+
group.create_dataset(
|
|
213
|
+
"frequencies",
|
|
214
|
+
data=self.frequencies,
|
|
215
|
+
compression="blosc",
|
|
216
|
+
compression_opts={"cname": "lz4", "clevel": 5, "shuffle": 1},
|
|
217
|
+
)
|
|
189
218
|
|
|
190
219
|
# Store original data with optimal chunking
|
|
191
220
|
original_chunks = self._calculate_optimal_chunk_size(self.data.shape)
|
|
@@ -1,17 +1,19 @@
|
|
|
1
|
-
figpack/__init__.py,sha256=
|
|
1
|
+
figpack/__init__.py,sha256=E02IMyAwPn4hwSiDGEB5WbgYONLLHiTLrLeNB_Vx-xA,360
|
|
2
2
|
figpack/cli.py,sha256=xWF7J2BxUqOLvPu-Kje7Q6oGukTroXsLq8WN8vJgyw0,8321
|
|
3
|
-
figpack/core/__init__.py,sha256=
|
|
4
|
-
figpack/core/_bundle_utils.py,sha256=
|
|
3
|
+
figpack/core/__init__.py,sha256=V4wVdyBJ80mi9Rz8HjDSQNkqhqYB6sq4vWH3xQ10kaE,232
|
|
4
|
+
figpack/core/_bundle_utils.py,sha256=16hgTExPLkJCtGjVUCLlnbs_qgns6v01egVr3CEnUXE,6082
|
|
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
9
|
figpack/core/_view_figure.py,sha256=o1x1I2VKFrp2W_TStUS3fQblRW8AvGbu7Uy7MgVjofA,4186
|
|
10
10
|
figpack/core/config.py,sha256=oOR7SlP192vuFhYlS-h14HnG-kd_3gaz0vshXch2RNc,173
|
|
11
|
-
figpack/core/
|
|
12
|
-
figpack/
|
|
13
|
-
figpack/
|
|
14
|
-
figpack/figpack-figure-dist/
|
|
11
|
+
figpack/core/extension_view.py,sha256=ikgsofCB3R9e1-mQweaJER9z1wRBkmPtDiLJpslgWnc,1793
|
|
12
|
+
figpack/core/figpack_extension.py,sha256=EJHZpe7GsQMUnSvxcYf8374-f6n85F_k1IEelFMRFP8,4332
|
|
13
|
+
figpack/core/figpack_view.py,sha256=MJnJvUhYPzf_IkXjD3SZHCeQmwEAQi6QCLS2H2ksSyw,6123
|
|
14
|
+
figpack/figpack-figure-dist/index.html,sha256=N0wnfnfGeaKqmiajhD7v8LbZsFUA5pPhqKiHD2m63PY,486
|
|
15
|
+
figpack/figpack-figure-dist/assets/index-D2FnM_hN.js,sha256=FyaXGyCqVuyuXu1PAWyaL-7krKB3hxU4UM-7crrqo_c,1622190
|
|
16
|
+
figpack/figpack-figure-dist/assets/index-D9a3K6eW.css,sha256=ki61XkOz_TBJnU9Qyk5EgBzh2-_ilZQui2i8DHSarEo,5584
|
|
15
17
|
figpack/figpack-figure-dist/assets/neurosift-logo-CLsuwLMO.png,sha256=g5m-TwrGh5f6-9rXtWV-znH4B0nHgc__0GWclRDLUHs,9307
|
|
16
18
|
figpack/franklab/__init__.py,sha256=HkehqGImJE_sE2vbPDo-HbgtEYaMICb9-230xTYvRTU,56
|
|
17
19
|
figpack/franklab/views/TrackAnimation.py,sha256=3Jv1Ri4FIwTyqNahinqhHsBH1Bv_iZrEGx12w6diJ2M,5636
|
|
@@ -26,11 +28,12 @@ figpack/spike_sorting/views/RasterPlot.py,sha256=m8Cg-KioAM3CdIJOecpyTqp71HwhQVD
|
|
|
26
28
|
figpack/spike_sorting/views/RasterPlotItem.py,sha256=iW7fuDEjSfvf5YMIwrF_6cmKvD76oCigOUMHtGgBsPI,638
|
|
27
29
|
figpack/spike_sorting/views/SpikeAmplitudes.py,sha256=UOGxReKs5WwH7iRdR-iVN3Pr6wF3AnIV15veoZZzOco,13433
|
|
28
30
|
figpack/spike_sorting/views/SpikeAmplitudesItem.py,sha256=j5Na-diY-vRUAPu0t0VkyFCSKFnQ_f5HT077mB3Cy8c,1134
|
|
31
|
+
figpack/spike_sorting/views/UnitMetricsGraph.py,sha256=Eva0YgexnHZqRH7bPQFgaqobWFz_ab6zgTb4-QZ4h2k,3381
|
|
29
32
|
figpack/spike_sorting/views/UnitSimilarityScore.py,sha256=cJA9MkETos9qHhV1tqgA7SfNEaPo-duXYCE76hSFGnA,948
|
|
30
33
|
figpack/spike_sorting/views/UnitsTable.py,sha256=M3y1IDJzSnvOaM1-QOyJOVcUcdTkVvxYhEMGd1kmUzs,2969
|
|
31
34
|
figpack/spike_sorting/views/UnitsTableColumn.py,sha256=zBnuoeILTuiVLDvtcOxqa37E5WlbR12rlwNJUeWXxY4,847
|
|
32
35
|
figpack/spike_sorting/views/UnitsTableRow.py,sha256=rEb2hMTA_pl2fTW1nOvnGir0ysfNx4uww3aekZzfWjk,720
|
|
33
|
-
figpack/spike_sorting/views/__init__.py,sha256=
|
|
36
|
+
figpack/spike_sorting/views/__init__.py,sha256=2caaV9yxi97aHoYfUWUYyyIXQSZJRtRVqmPOW9ZeG1I,1159
|
|
34
37
|
figpack/views/Box.py,sha256=TfhPFNtVEq71LCucmWk3XX2WxQLdaeRiWGm5BM0k2l4,2236
|
|
35
38
|
figpack/views/DataFrame.py,sha256=VFP-EM_Wnc1G3uimVVMJe08KKWCAZe7DvmYf5e07uTk,3653
|
|
36
39
|
figpack/views/Gallery.py,sha256=sHlZbaqxcktasmNsJnuxe8WmgUQ6iurG50JiChKSMbQ,3314
|
|
@@ -41,15 +44,15 @@ figpack/views/Markdown.py,sha256=Dl1UX5s0aC-mEx5m6jIJ839YKMNeeVzIDG-EANVrbys,114
|
|
|
41
44
|
figpack/views/MatplotlibFigure.py,sha256=YoNtZTItEjatbtNJqATm2H-Oircp5Ca6FZLjHk_B0zg,2778
|
|
42
45
|
figpack/views/MultiChannelTimeseries.py,sha256=sWr2nW1eoYR7V44wF7fac7IoQ6BOnus1nc4STkgIkYw,8501
|
|
43
46
|
figpack/views/PlotlyFigure.py,sha256=E33PEkWSj907Ue73bYfZQlF-JFDdWA8jNrG-buFQLgs,2174
|
|
44
|
-
figpack/views/Spectrogram.py,sha256=
|
|
47
|
+
figpack/views/Spectrogram.py,sha256=GfTNinkuMFu4dxn35MvSB4Perz84sx4LMcjUrOviz6c,9648
|
|
45
48
|
figpack/views/Splitter.py,sha256=x9jLCTlIvDy5p9ymVd0X48KDccyD6bJANhXyFgKEmtE,2007
|
|
46
49
|
figpack/views/TabLayout.py,sha256=5g3nmL95PfqgI0naqZXHMwLVo2ebDlGX01Hy9044bUw,1898
|
|
47
50
|
figpack/views/TabLayoutItem.py,sha256=xmHA0JsW_6naJze4_mQuP_Fy0Nm17p2N7w_AsmVRp8k,880
|
|
48
51
|
figpack/views/TimeseriesGraph.py,sha256=OAaCjO8fo86u_gO_frNfRGxng3tczxGDGKcJEvZo3rE,7469
|
|
49
52
|
figpack/views/__init__.py,sha256=h9B6RWTOfgizOMqtEu8xGJxtXAhK-XXroN6ebL-Vcr0,543
|
|
50
|
-
figpack-0.2.
|
|
51
|
-
figpack-0.2.
|
|
52
|
-
figpack-0.2.
|
|
53
|
-
figpack-0.2.
|
|
54
|
-
figpack-0.2.
|
|
55
|
-
figpack-0.2.
|
|
53
|
+
figpack-0.2.10.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
54
|
+
figpack-0.2.10.dist-info/METADATA,sha256=OsZYqqvYVFnzLuCBScLUKAOLqssgHpLaGZqCzT7Q-zA,3617
|
|
55
|
+
figpack-0.2.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
56
|
+
figpack-0.2.10.dist-info/entry_points.txt,sha256=l6d3siH2LxXa8qJGbjAqpIZtI5AkMSyDeoRDCzdrUto,45
|
|
57
|
+
figpack-0.2.10.dist-info/top_level.txt,sha256=lMKGaC5xWmAYBx9Ac1iMokm42KFnJFjmkP2ldyvOo-c,8
|
|
58
|
+
figpack-0.2.10.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|