Read various format into SpikeInterface

SpikeInterface can read various format of “recording” (traces) and “sorting” (spike train) data.

Internally, to read different formats, SpikeInterface either uses:
  • a wrapper to the neo rawio classes

  • or a direct implementation

Note that:

  • file formats contain a “recording”, a “sorting”, or “both”

  • file formats can be file-based (NWB, …) or folder based (SpikeGLX, OpenEphys, …)

In this example we demonstrate how to read different file formats into SI

import matplotlib.pyplot as plt

import spikeinterface as si
import spikeinterface.extractors as se
Traceback (most recent call last):
  File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/checkouts/0.98.0/examples/modules_gallery/extractors/plot_1_read_various_formats.py", line 22, in <module>
    import spikeinterface.extractors as se
  File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/__init__.py", line 1, in <module>
    from .extractorlist import *
  File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/extractorlist.py", line 15, in <module>
    from .neoextractors import *
  File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/__init__.py", line 1, in <module>
    from .alphaomega import AlphaOmegaRecordingExtractor, AlphaOmegaEventExtractor, read_alphaomega, read_alphaomega_event
  File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/alphaomega.py", line 3, in <module>
    from .neobaseextractor import NeoBaseRecordingExtractor, NeoBaseEventExtractor
  File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/neobaseextractor.py", line 332, in <module>
    class NeoBaseSortingExtractor(_NeoBaseExtractor, BaseSorting):
  File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/neobaseextractor.py", line 480, in NeoBaseSortingExtractor
    def _infer_t_start_from_signal_stream(self, segment_index: int, stream_id: Optional[str] = None) -> float | None:
TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'

Let’s download some datasets in different formats from the ephy_testing_data repo:

  • MEArec: an simulator format which is hdf5-based. It contains both a “recording” and a “sorting” in the same file.

  • Spike2: file from spike2 devices. It contains “recording” information only.

spike2_file_path = si.download_dataset(remote_path='spike2/130322-1LY.smr')
print(spike2_file_path)

mearec_folder_path = si.download_dataset(remote_path='mearec/mearec_test_10s.h5')
print(mearec_folder_path)

Now that we have downloaded the files let’s load them into SI.

The read_spike2() function returns one object, a BaseRecording.

Note that internally this file contains 2 data streams (‘0’ and ‘1’), so we need to specify which one we want to retrieve (‘0’ in our case). the stream information can be retrieve using get_neo_streams() function

stream_names, stream_ids = se.get_neo_streams('spike2', spike2_file_path)
print(stream_names)
print(stream_ids)
stream_id = stream_ids[0]
print('stream_id', stream_id)

recording = se.read_spike2(spike2_file_path, stream_id='0')
print(recording)
print(type(recording))
print(isinstance(recording, si.BaseRecording))

The read_spike2`() function is equivalent to instantiating a Spike2RecordingExtractor object:

recording = se.Spike2RecordingExtractor(spike2_file_path, stream_id='0')
print(recording)

The read_mearec() function returns two objects, a BaseRecording and a BaseSorting:

recording, sorting = se.read_mearec(mearec_folder_path)
print(recording)
print(type(recording))
print()
print(sorting)
print(type(sorting))

The read_mearec() function is equivalent to:

recording = se.MEArecRecordingExtractor(mearec_folder_path)
sorting = se.MEArecSortingExtractor(mearec_folder_path)

SI objects (BaseRecording and BaseSorting) object can be plotted quickly with the spikeinterface.widgets submodule:

import spikeinterface.widgets as sw

w_ts = sw.plot_timeseries(recording, time_range=(0, 5))
w_rs = sw.plot_rasters(sorting, time_range=(0, 5))

plt.show()

Total running time of the script: ( 0 minutes 0.002 seconds)

Gallery generated by Sphinx-Gallery