Source code for neuroconv.datainterfaces.ophys.baseimagingextractorinterface
"""Author: Ben Dichter."""
from typing import Literal, Optional
import numpy as np
from pynwb import NWBFile
from pynwb.device import Device
from pynwb.ophys import ImagingPlane, OnePhotonSeries, TwoPhotonSeries
from ...baseextractorinterface import BaseExtractorInterface
from ...utils import (
dict_deep_update,
fill_defaults,
get_base_schema,
get_schema_from_hdmf_class,
)
[docs]class BaseImagingExtractorInterface(BaseExtractorInterface):
"""Parent class for all ImagingExtractorInterfaces."""
ExtractorModuleName = "roiextractors"
def __init__(self, verbose: bool = True, **source_data):
super().__init__(**source_data)
self.imaging_extractor = self.get_extractor()(**source_data)
self.verbose = verbose
[docs] def get_metadata_schema(
self, photon_series_type: Literal["OnePhotonSeries", "TwoPhotonSeries"] = "TwoPhotonSeries"
) -> dict:
metadata_schema = super().get_metadata_schema()
metadata_schema["required"] = ["Ophys"]
# Initiate Ophys metadata
metadata_schema["properties"]["Ophys"] = get_base_schema(tag="Ophys")
metadata_schema["properties"]["Ophys"]["required"] = ["Device", "ImagingPlane", photon_series_type]
metadata_schema["properties"]["Ophys"]["properties"] = dict(
Device=dict(type="array", minItems=1, items={"$ref": "#/properties/Ophys/properties/definitions/Device"}),
ImagingPlane=dict(
type="array", minItems=1, items={"$ref": "#/properties/Ophys/properties/definitions/ImagingPlane"}
),
)
metadata_schema["properties"]["Ophys"]["properties"].update(
{
photon_series_type: dict(
type="array",
minItems=1,
items={"$ref": f"#/properties/Ophys/properties/definitions/{photon_series_type}"},
),
}
)
# Schema definition for arrays
imaging_plane_schema = get_schema_from_hdmf_class(ImagingPlane)
imaging_plane_schema["properties"]["optical_channel"].pop("maxItems")
metadata_schema["properties"]["Ophys"]["properties"]["definitions"] = dict(
Device=get_schema_from_hdmf_class(Device),
ImagingPlane=imaging_plane_schema,
)
photon_series = dict(
OnePhotonSeries=OnePhotonSeries,
TwoPhotonSeries=TwoPhotonSeries,
)[photon_series_type]
metadata_schema["properties"]["Ophys"]["properties"]["definitions"].update(
{
photon_series_type: get_schema_from_hdmf_class(photon_series),
}
)
fill_defaults(metadata_schema, self.get_metadata())
return metadata_schema
[docs] def get_metadata(self) -> dict:
from ...tools.roiextractors import get_nwb_imaging_metadata
metadata = super().get_metadata()
default_metadata = get_nwb_imaging_metadata(self.imaging_extractor)
metadata = dict_deep_update(default_metadata, metadata)
# fix troublesome data types
if "TwoPhotonSeries" in metadata["Ophys"]:
for two_photon_series in metadata["Ophys"]["TwoPhotonSeries"]:
if "dimension" in two_photon_series:
two_photon_series["dimension"] = list(two_photon_series["dimension"])
if "rate" in two_photon_series:
two_photon_series["rate"] = float(two_photon_series["rate"])
return metadata
[docs] def get_original_timestamps(self) -> np.ndarray:
reinitialized_extractor = self.get_extractor()(**self.source_data)
return reinitialized_extractor.frame_to_time(frames=np.arange(stop=reinitialized_extractor.get_num_frames()))
[docs] def get_timestamps(self) -> np.ndarray:
return self.imaging_extractor.frame_to_time(frames=np.arange(stop=self.imaging_extractor.get_num_frames()))
[docs] def set_aligned_timestamps(self, aligned_timestamps: np.ndarray):
self.imaging_extractor.set_times(times=aligned_timestamps)
def add_to_nwbfile(
self,
nwbfile: NWBFile,
metadata: Optional[dict] = None,
photon_series_type: Literal["TwoPhotonSeries", "OnePhotonSeries"] = "TwoPhotonSeries",
photon_series_index: int = 0,
parent_container: Literal["acquisition", "processing/ophys"] = "acquisition",
stub_test: bool = False,
stub_frames: int = 100,
):
from ...tools.roiextractors import add_imaging
if stub_test:
stub_frames = min([stub_frames, self.imaging_extractor.get_num_frames()])
imaging_extractor = self.imaging_extractor.frame_slice(start_frame=0, end_frame=stub_frames)
else:
imaging_extractor = self.imaging_extractor
add_imaging(
imaging=imaging_extractor,
nwbfile=nwbfile,
metadata=metadata,
photon_series_type=photon_series_type,
photon_series_index=photon_series_index,
parent_container=parent_container,
)