Source code for neuroconv.tools.nwb_helpers._configure_backend
"""Collection of helper functions related to configuration of datasets dependent on backend."""
import importlib
from typing import Union
from hdmf.common import Data
from pynwb import NWBFile, TimeSeries
from ._configuration_models._hdf5_backend import HDF5BackendConfiguration
from ._configuration_models._zarr_backend import ZarrBackendConfiguration
from ..importing import is_package_installed
[docs]def configure_backend(
nwbfile: NWBFile, backend_configuration: Union[HDF5BackendConfiguration, ZarrBackendConfiguration]
) -> None:
"""
Configure all datasets specified in the `backend_configuration` with their appropriate DataIO and options.
Parameters
----------
nwbfile : pynwb.NWBFile
The in-memory pynwb.NWBFile object to configure.
backend_configuration : HDF5BackendConfiguration or ZarrBackendConfiguration
The configuration model to use when configuring the datasets for this backend.
"""
is_ndx_events_installed = is_package_installed(package_name="ndx_events")
ndx_events = importlib.import_module("ndx_events") if is_ndx_events_installed else None
# A remapping of the object IDs in the backend configuration might necessary
locations_to_remap = backend_configuration.find_locations_requiring_remapping(nwbfile=nwbfile)
if any(locations_to_remap):
backend_configuration = backend_configuration.build_remapped_backend(locations_to_remap=locations_to_remap)
# Set all DataIO based on the configuration
data_io_class = backend_configuration.data_io_class
for dataset_configuration in backend_configuration.dataset_configurations.values():
object_id = dataset_configuration.object_id
dataset_name = dataset_configuration.dataset_name
data_io_kwargs = dataset_configuration.get_data_io_kwargs()
# TODO: update buffer shape in iterator, if present
neurodata_object = nwbfile.objects[object_id]
is_dataset_linked = isinstance(neurodata_object.fields.get(dataset_name), TimeSeries)
# Table columns
if isinstance(neurodata_object, Data):
neurodata_object.set_data_io(data_io_class=data_io_class, data_io_kwargs=data_io_kwargs)
# TimeSeries data or timestamps
elif isinstance(neurodata_object, TimeSeries) and not is_dataset_linked:
neurodata_object.set_data_io(
dataset_name=dataset_name, data_io_class=data_io_class, data_io_kwargs=data_io_kwargs
)
# Special ndx-events v0.2.0 types
elif is_ndx_events_installed and isinstance(neurodata_object, ndx_events.Events):
neurodata_object.set_data_io(
dataset_name=dataset_name, data_io_class=data_io_class, data_io_kwargs=data_io_kwargs
)
# But temporarily skipping LabeledEvents
elif is_ndx_events_installed and isinstance(neurodata_object, ndx_events.LabeledEvents):
continue
# Skip the setting of a DataIO when target dataset is a link (assume it will be found in parent)
elif isinstance(neurodata_object, TimeSeries) and is_dataset_linked:
continue
# Strictly speaking, it would be odd if a `backend_configuration` got to this line, but might as well be safe
else:
raise NotImplementedError(
f"Unsupported object type {type(neurodata_object)} for backend configuration "
f"of {neurodata_object.name}!"
)