Source code for viziphant.asset
"""
Analysis of Sequences of Synchronous EvenTs (ASSET) plots
---------------------------------------------------------
Visualizes the output of :class:`elephant.asset.ASSET` analysis.
.. autosummary::
:toctree: toctree/asset
plot_synchronous_events
"""
# Copyright 2017-2023 by the Viziphant team, see `doc/authors.rst`.
# License: Modified BSD, see LICENSE.txt for details.
import numpy as np
import warnings
from viziphant.rasterplot import rasterplot
[docs]
def plot_synchronous_events(spiketrains, sse, title=None, **kwargs):
"""
Reorder and plot the `spiketrains` according to a series of synchronous
events `sse` obtained with the ASSET analysis. Spike trains that do not
participate in the chosen group will be shown at the top in a different
color.
Parameters
----------
spiketrains : list of neo.SpikeTrain
ASSET input spiketrains.
sse : dict
One entry of the output dict from
:meth:`elephant.asset.ASSET.extract_synchronous_events`.
title : str or None, optional
User-defined title string. If None, it'll be set to an automatic
description.
Default: None
**kwargs
Additional arguments to :func:`viziphant.rasterplot.rasterplot`
Returns
-------
axes : matplotlib.Axes.axes
See Also
--------
viziphant.patterns.plot_patterns : plot patterns repeated in time
Examples
--------
In this example we
* simulate two noisy synfire chains;
* shuffle the neurons to destroy visual appearance;
* run ASSET analysis to recover the original neurons arrangement.
.. plot::
:include-source:
import neo
import numpy as np
import quantities as pq
import matplotlib.pyplot as plt
import viziphant
from elephant import asset
np.random.seed(10)
spiketrain = np.linspace(0, 50, num=10)
np.random.shuffle(spiketrain)
spiketrains = np.c_[spiketrain, spiketrain + 100]
spiketrains += np.random.random_sample(spiketrains.shape) * 5
spiketrains = [neo.SpikeTrain(st, units='ms', t_stop=1 * pq.s)
for st in spiketrains]
asset_obj = asset.ASSET(spiketrains, bin_size=3 * pq.ms)
imat = asset_obj.intersection_matrix()
pmat = asset_obj.probability_matrix_analytical(imat,
kernel_width=50 * pq.ms)
jmat = asset_obj.joint_probability_matrix(pmat, filter_shape=(5, 1),
n_largest=3)
mmat = asset_obj.mask_matrices([pmat, jmat], thresholds=.9)
cmat = asset_obj.cluster_matrix_entries(mmat, max_distance=11,
min_neighbors=3, stretch=5)
sses = asset_obj.extract_synchronous_events(cmat)
viziphant.asset.plot_synchronous_events(spiketrains, sse=sses[1], s=10)
plt.show()
Refer to `ASSET tutorial
<https://elephant.readthedocs.io/en/latest/tutorials/asset.html>`_
for real-case scenario.
"""
if len(sse) == 0:
warnings.warn("Passed an empty synchronous event dict.")
cluster_chain = []
for chain in sse.values():
cluster_chain.extend(chain)
_, indices_pattern = np.unique(cluster_chain, return_index=True)
indices_pattern = np.take(cluster_chain, np.sort(indices_pattern))
indices_left = set(range(len(spiketrains))).difference(indices_pattern)
reordered_sts = [spiketrains[idx] for idx in indices_pattern]
sts_not_a_pattern = [spiketrains[idx] for idx in sorted(indices_left)]
if title is None:
title = "Neurons ordering reconstructed with ASSET"
axes = rasterplot([reordered_sts, sts_not_a_pattern],
title=title, **kwargs)
axes.set_ylabel('reordered neurons')
axes.yaxis.set_label_coords(-0.01, 0.5)
return axes