Source code for neurodsp.burst.utils
"""Utility functions for burst analysis."""
import numpy as np
###################################################################################################
###################################################################################################
[docs]def compute_burst_stats(bursting, fs):
"""Compute statistics of bursts.
Parameters
----------
bursting : 1d array
Boolean indication of where bursts are present in the input signal.
fs : float
Sampling rate, in Hz.
Returns
-------
stats_dict : dict
Contains the following keys:
* `n_bursts`: the number of bursts
* `duration_mean`: mean duration of bursts, in seconds
* `duration_std`: standard deviation of burst durations, in seconds
* `percent_burst`: percent time in bursts
* `burst_rate`: bursts/sec
Examples
--------
Compute statistics of detected bursts:
>>> from neurodsp.sim import sim_combined
>>> from neurodsp.burst import detect_bursts_dual_threshold
>>> sig = sim_combined(n_seconds=10, fs=500,
... components={'sim_synaptic_current': {},
... 'sim_bursty_oscillation' : {'freq': 10}})
>>> is_burst = detect_bursts_dual_threshold(sig, fs=500, dual_thresh=(1, 2), f_range=(8, 12))
>>> stats_dict = compute_burst_stats(is_burst, fs=500)
"""
tot_time = len(bursting) / fs
change = np.diff(bursting)
idcs, = change.nonzero()
idcs += 1 # Get indices following the change.
if bursting[0]:
# If the first sample is part of a burst, prepend a zero.
idcs = np.r_[0, idcs]
if bursting[-1]:
# If the last sample is part of a burst, append an index corresponding
# to the length of signal.
idcs = np.r_[idcs, bursting.size]
starts = idcs[0::2]
ends = idcs[1::2]
durations = (ends - starts) / fs
stats_dict = {'n_bursts': durations.size,
'duration_mean': durations.mean(),
'duration_std': durations.std(),
'percent_burst': 100 * sum(bursting) / len(bursting),
'bursts_per_second': durations.size / tot_time}
return stats_dict