Perievent#

The perievent module allows to re-center time series and timestamps data around a particular event as well as computing events (spikes) trigger average.

Hide code cell content
import pynapple as nap
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
custom_params = {"axes.spines.right": False, "axes.spines.top": False}
sns.set_theme(style="ticks", palette="colorblind", font_scale=1.5, rc=custom_params)

Peri-Event Time Histogram (PETH)#

stim = nap.Tsd(
    t=np.sort(np.random.uniform(0, 1000, 50)), 
    d=np.random.rand(50), time_units="s"
)
ts1 = nap.Ts(t=np.sort(np.random.uniform(0, 1000, 2000)), time_units="s")

The function compute_perievent align timestamps to a particular set of timestamps.

peth = nap.compute_perievent(
  data=ts1, 
  tref=stim, 
  minmax=(-0.1, 0.2), 
  time_unit="s")

print(peth)
Index    rate     ref_times
-------  -------  -------------
0        nan      0.766272919
1        3.33333  21.468630865
2        nan      53.314449709
3        3.33333  64.835773482
4        3.33333  66.29494006
5        3.33333  73.384913702
6        nan      122.16215032
...      ...      ...
43       nan      838.716955634
44       nan      861.978416405
45       nan      873.17284197
46       nan      876.243890603
47       3.33333  911.70960862
48       6.66667  978.832354393
49       nan      994.857494195

The returned object is a TsGroup. The column ref_times is a metadata column that indicates the center timestamps.

Raster plot#

It is then easy to create a raster plot around the times of the stimulation event by calling the to_tsd function of pynapple to “flatten” the TsGroup peth.

plt.figure(figsize=(10, 6))
plt.subplot(211)
plt.plot(np.sum(peth.count(0.01), 1), linewidth=3, color="red")
plt.xlim(-0.1, 0.2)
plt.ylabel("Count")
plt.axvline(0.0)
plt.subplot(212)
plt.plot(peth.to_tsd(), "|", markersize=20, color="red", mew=4)
plt.xlabel("Time from stim (s)")
plt.ylabel("Stimulus")
plt.xlim(-0.1, 0.2)
plt.axvline(0.0)
<matplotlib.lines.Line2D at 0x7f59eb9c3980>
../_images/7751aab4310e54a4d0bfcfc189d1cb734969dc3b604922ab705445555b1f822a.png

The same function can be applied to a group of neurons. In this case, it returns a dict of TsGroup

Event trigger average#

The function compute_event_trigger_average compute the average feature around a particular event time.

Hide code cell content
group = {
    0: nap.Ts(t=np.sort(np.random.uniform(0, 100, 10))),
    1: nap.Ts(t=np.sort(np.random.uniform(0, 100, 20))),
    2: nap.Ts(t=np.sort(np.random.uniform(0, 100, 30))),
}

tsgroup = nap.TsGroup(group)
eta = nap.compute_event_trigger_average(
  group=tsgroup, 
  feature=stim, 
  binsize=0.1, 
  windowsize=(-1, 1))

print(eta)
Time (s)    0        1        2
----------  -------  -------  -------
-1.0        0.45653  0.44195  0.56859
-0.9        0.45653  0.44195  0.56859
-0.8        0.45653  0.44195  0.56859
-0.7        0.45653  0.44195  0.56859
-0.6        0.45653  0.44195  0.56859
-0.5        0.45653  0.45104  0.56859
-0.4        0.45653  0.45104  0.58551
...         ...      ...      ...
0.4         0.45653  0.46013  0.58551
0.5         0.45653  0.46013  0.58551
0.6         0.45653  0.46013  0.58551
0.7         0.45653  0.46013  0.58551
0.8         0.45653  0.46013  0.58551
0.9         0.45653  0.46013  0.58551
1.0         0.45653  0.46013  0.58551
dtype: float64, shape: (21, 3)

Peri-Event continuous time series#

The function nap.compute_perievent_continuous align a time series of any dimensions around events.

Hide code cell content
features = nap.TsdFrame(t=np.arange(0, 100), d=np.random.randn(100,6))
events = nap.Ts(t=np.sort(np.random.uniform(0, 100, 5)))
perievent = nap.compute_perievent_continuous(
  data=features, 
  tref=events, 
  minmax=(-1, 1))

print(perievent)
Time (s)
----------  -------------------------------
-1          [[-0.534289 ...  1.687164] ...]
0           [[0.77695  ... 0.554556] ...]
1           [[-0.548893 ... -2.4883  ] ...]
dtype: float64, shape: (3, 5, 6)

The object perievent is now of shape (number of bins, (dimensions of input), number of events ) :

print(perievent.shape)
(3, 5, 6)