Skip to content
Merged
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
2 changes: 2 additions & 0 deletions src/spikeinterface/extractors/neoextractors/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .alphaomega import AlphaOmegaRecordingExtractor, AlphaOmegaEventExtractor, read_alphaomega, read_alphaomega_event
from .axon import AxonRecordingExtractor, read_axon
from .axona import AxonaRecordingExtractor, read_axona
from .biocam import BiocamRecordingExtractor, read_biocam
from .blackrock import BlackrockRecordingExtractor, BlackrockSortingExtractor, read_blackrock, read_blackrock_sorting
Expand Down Expand Up @@ -44,6 +45,7 @@

neo_recording_extractors_dict = {
AlphaOmegaRecordingExtractor: dict(wrapper_string="read_alphaomega", wrapper_class=read_alphaomega),
AxonRecordingExtractor: dict(wrapper_string="read_axon", wrapper_class=read_axon),
AxonaRecordingExtractor: dict(wrapper_string="read_axona", wrapper_class=read_axona),
BiocamRecordingExtractor: dict(wrapper_string="read_biocam", wrapper_class=read_biocam),
BlackrockRecordingExtractor: dict(wrapper_string="read_blackrock", wrapper_class=read_blackrock),
Expand Down
66 changes: 66 additions & 0 deletions src/spikeinterface/extractors/neoextractors/axon.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
from __future__ import annotations

from pathlib import Path

from spikeinterface.core.core_tools import define_function_from_class

from .neobaseextractor import NeoBaseRecordingExtractor


class AxonRecordingExtractor(NeoBaseRecordingExtractor):
"""
Class for reading Axon Binary Format (ABF) files.

Based on :py:class:`neo.rawio.AxonRawIO`

Supports both ABF1 (pClamp ≤9) and ABF2 (pClamp ≥10) formats.
Can read data from pCLAMP and AxoScope software.

Parameters
----------
file_path : str or Path
The ABF file path to load the recordings from.
stream_id : str or None, default: None
If there are several streams, specify the stream id you want to load.
stream_name : str or None, default: None
If there are several streams, specify the stream name you want to load.
all_annotations : bool, default: False
Load exhaustively all annotations from neo.
use_names_as_ids : bool, default: False
Determines the format of the channel IDs used by the extractor.

Examples
--------
>>> from spikeinterface.extractors import read_axon
>>> recording = read_axon(file_path='path/to/file.abf')
"""

NeoRawIOClass = "AxonRawIO"

def __init__(
self,
file_path,
stream_id=None,
stream_name=None,
all_annotations: bool = False,
use_names_as_ids: bool = False,
):
neo_kwargs = self.map_to_neo_kwargs(file_path)
NeoBaseRecordingExtractor.__init__(
self,
stream_id=stream_id,
stream_name=stream_name,
all_annotations=all_annotations,
use_names_as_ids=use_names_as_ids,
**neo_kwargs,
)

self._kwargs.update(dict(file_path=str(Path(file_path).absolute())))

@classmethod
def map_to_neo_kwargs(cls, file_path):
neo_kwargs = {"filename": str(file_path)}
return neo_kwargs


read_axon = define_function_from_class(source_class=AxonRecordingExtractor, name="read_axon")
7 changes: 7 additions & 0 deletions src/spikeinterface/extractors/tests/test_neoextractors.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
Spike2RecordingExtractor,
EDFRecordingExtractor,
Plexon2RecordingExtractor,
AxonRecordingExtractor,
)

from spikeinterface.extractors.extractor_classes import KiloSortSortingExtractor
Expand Down Expand Up @@ -294,6 +295,12 @@ class TdTRecordingTest(RecordingCommonTestSuite, unittest.TestCase):
entities = [("tdt/aep_05", {"stream_id": "1"})]


class AxonRecordingTest(RecordingCommonTestSuite, unittest.TestCase):
ExtractorClass = AxonRecordingExtractor
downloads = ["axon"]
entities = ["axon/extracellular_data/four_electrodes/24606005_SampleData.abf"]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And this only has one stream?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, otherwise that test would not work.



class AxonaRecordingTest(RecordingCommonTestSuite, unittest.TestCase):
ExtractorClass = AxonaRecordingExtractor
downloads = ["axona"]
Expand Down