Skip to content

Commit d9beeae

Browse files
authored
fix: load stored waveforms without templates (#63)
1 parent 9bcbdad commit d9beeae

3 files changed

Lines changed: 22 additions & 1 deletion

File tree

‎CHANGELOG.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212

1313
### Fixed
1414
- Development checkouts now report a development version with a Git commit suffix.
15-
- Template datasets without waveform templates can be reloaded after cluster assignments change.
15+
- Template datasets without waveform templates can be reloaded after cluster assignments change,
16+
and stored spike-waveform subsets provide their waveform sample count.
1617

1718
## [2.7.0] 2025-12-10
1819

‎phylib/io/model.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,14 @@ def _load_data(self):
427427

428428
# Spike waveforms (optional, otherwise fetched from raw data as needed).
429429
self.spike_waveforms = self._load_spike_waveforms()
430+
if self.n_samples_waveforms == 0 and self.spike_waveforms is not None:
431+
waveforms = self.spike_waveforms.waveforms
432+
if waveforms.ndim != 3:
433+
raise ValueError(
434+
"Stored spike waveforms must have shape "
435+
"(n_spikes_subset, n_samples_waveforms, n_channels_loc)."
436+
)
437+
self.n_samples_waveforms = waveforms.shape[1]
430438

431439
# Whitening.
432440
try:

‎phylib/io/tests/test_model.py‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,17 @@ def test_model_save(template_model_full):
136136

137137

138138
def test_model_reload_curated_dataset_without_templates(template_path):
139+
model = load_model(template_path)
140+
model.save_spikes_subset_waveforms(10, 16)
141+
expected_n_samples_waveforms = model.n_samples_waveforms
142+
model.close()
143+
139144
(template_path.parent / 'templates.npy').unlink()
140145

141146
model = load_model(template_path)
142147
assert model.sparse_templates is None
148+
assert model.spike_waveforms is not None
149+
assert model.n_samples_waveforms == expected_n_samples_waveforms
143150
spike_clusters = model.spike_clusters.copy()
144151
spike_clusters[spike_clusters == spike_clusters[0]] = spike_clusters.max() + 1
145152
model.save_spike_clusters(spike_clusters)
@@ -151,6 +158,11 @@ def test_model_reload_curated_dataset_without_templates(template_path):
151158
assert model.sparse_templates is None
152159
assert model.sparse_clusters is None
153160
assert model.n_clusters == spike_clusters.max() + 1
161+
assert model.n_samples_waveforms == expected_n_samples_waveforms
162+
spike_ids = model.spike_waveforms.spike_ids[:3]
163+
channel_ids = model.spike_waveforms.spike_channels[0, :2]
164+
waveforms = model.get_waveforms(spike_ids, channel_ids)
165+
assert waveforms.shape == (3, expected_n_samples_waveforms, 2)
154166
finally:
155167
model.close()
156168

0 commit comments

Comments
 (0)