Skip to content

Commit 088bcc6

Browse files
committed
make spiking work when no neurons are recorded
1 parent 942fbdb commit 088bcc6

2 files changed

Lines changed: 32 additions & 8 deletions

File tree

‎cleo/ephys/spiking.py‎

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,12 @@ def connect_to_neuron_group(self, neuron_group: NeuronGroup, **kwparams):
245245
# spike sorters don't sort by multi-channel recall; we only do this
246246
# for computational efficiency, to not get super distant neurons
247247

248+
# needed even if no neurons are recorded
249+
if not self._prev_t:
250+
self._prev_t = self.probe.sim.network.t
251+
if self._mu_eap is None:
252+
self._mu_eap = np.zeros((0, self.n_channels))
253+
248254
n2keep = np.sum(where_to_keep)
249255
if n2keep == 0:
250256
warnings.warn(
@@ -271,14 +277,8 @@ def connect_to_neuron_group(self, neuron_group: NeuronGroup, **kwparams):
271277
assert len(self.i_ng_by_i_probe) == i_probe_start
272278
self.i_ng_by_i_probe.extend(list(zip([neuron_group] * n2keep, i2keep)))
273279

274-
if not self._prev_t:
275-
self._prev_t = self.probe.sim.network.t
276-
277280
# store neuron-channel mean and stdev of EAPs to use in subclasses
278-
if self._mu_eap is None:
279-
self._mu_eap = snr[where_to_keep]
280-
else:
281-
self._mu_eap = np.concatenate((self._mu_eap, snr[where_to_keep]), axis=0)
281+
self._mu_eap = np.concatenate((self._mu_eap, snr[where_to_keep]), axis=0)
282282

283283
return snr[where_to_keep].max(axis=1), new_i_probe
284284

@@ -642,7 +642,11 @@ def sorted_units_snr(self) -> Float[np.ndarray, "{self.n_sorted}"]:
642642
return self._mu_eap[self._i_probe_by_i_sorted]
643643

644644
def connect_to_neuron_group(self, neuron_group, **kwparams):
645-
snr, i_probe = super().connect_to_neuron_group(neuron_group, **kwparams)
645+
connect_result = super().connect_to_neuron_group(neuron_group, **kwparams)
646+
if connect_result is None:
647+
# No neurons with high-enough multi-channel recall to record
648+
return
649+
snr, i_probe = connect_result
646650
n_recorded_ng = len(snr)
647651
# filter by SNR (measured on peak channel)
648652
above_cutoff = snr >= self.snr_cutoff

‎tests/ephys/test_spiking.py‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,26 @@ def test_cutoff(rand_seed):
530530
)
531531

532532

533+
def test_no_neurons():
534+
"""When neurons are too far away to be picked up at all."""
535+
sgg = spike_generator_group([9000, 9001, 9002] * mm, period=1 * ms)
536+
sim = CLSimulator(Network(sgg))
537+
assert hasattr(sim, "network")
538+
ss = SortedSpiking()
539+
mua = MultiUnitActivity()
540+
probe = Probe([0, 0, 0] * um, [ss, mua])
541+
sim.inject(probe, sgg)
542+
sim.run(10 * ms)
543+
probe.get_state()
544+
sim.run(10 * ms)
545+
probe.get_state()
546+
for sig in [ss, mua]:
547+
assert len(sig.i) == 0
548+
assert len(sig.t) == 0
549+
assert len(sig.t_samp) == 0
550+
assert sig.n_neurons == 0
551+
552+
533553
def _test_spiking_to_neo(spike_signal_class):
534554
spike_sig = spike_signal_class()
535555
n_channels = 50

0 commit comments

Comments
 (0)