Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ def test_calculate_firing_rates(sorting_analyzer_simple):
firing_rates_periods = compute_firing_rates(sorting_analyzer, periods=periods)
assert firing_rates == firing_rates_periods

# Overlapping periods shouldn't double-count time:
# the same periods twice should give the same firing rates as the original periods
firing_rates_overlapping = compute_firing_rates(sorting_analyzer, periods=np.concatenate([periods, periods]))
assert firing_rates_overlapping == firing_rates

# calculate num spikes with empty periods
empty_periods = np.empty(0, dtype=unit_period_dtype)
firing_rates_empty_periods = compute_firing_rates(sorting_analyzer, periods=empty_periods)
Expand Down
14 changes: 11 additions & 3 deletions src/spikeinterface/metrics/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def compute_total_samples_per_unit(sorting_analyzer, periods=None):
sorting_analyzer : SortingAnalyzer
The sorting analyzer object.
periods : array of unit_period_dtype, default: None
Periods to consider for each unit.
Periods to consider for each unit. Where a unit's periods overlap, the overlapping samples count once.

Returns
-------
Expand All @@ -93,9 +93,17 @@ def compute_total_samples_per_unit(sorting_analyzer, periods=None):
if periods is not None:
total_samples_array = np.zeros(len(sorting_analyzer.unit_ids), dtype="int64")
sorting = sorting_analyzer.sorting
for period in periods:
# count the union of each unit's periods
order = np.lexsort((periods["start_sample_index"], periods["segment_index"], periods["unit_index"]))
covered_until = {} # (unit_index, segment_index) -> end of that unit's periods so far
for period in periods[order]:
unit_index = period["unit_index"]
total_samples_array[unit_index] += period["end_sample_index"] - period["start_sample_index"]
key = (unit_index, period["segment_index"])
start = max(period["start_sample_index"], covered_until.get(key, period["start_sample_index"]))
end = period["end_sample_index"]
if end > start:
total_samples_array[unit_index] += end - start
covered_until[key] = end
total_samples = dict(zip(sorting.unit_ids, total_samples_array))
else:
total = sorting_analyzer.get_total_samples()
Expand Down
Loading