Source code for allensdk.brain_observatory.behavior.data_objects.metadata.ophys_experiment_metadata.ophys_experiment_metadata
from typing import List
from allensdk.brain_observatory.behavior.data_objects.metadata.ophys_experiment_metadata.field_of_view_shape import ( # noqa: E501
FieldOfViewShape,
)
from allensdk.brain_observatory.behavior.data_objects.metadata.ophys_experiment_metadata.imaging_depth import ( # noqa: E501
ImagingDepth,
)
from allensdk.brain_observatory.behavior.data_objects.metadata.ophys_experiment_metadata.ophys_container_id import ( # noqa: E501
OphysContainerId,
)
from allensdk.brain_observatory.behavior.data_objects.metadata.ophys_experiment_metadata.ophys_project_code import ( # noqa: E501
OphysProjectCode,
)
from allensdk.brain_observatory.behavior.data_objects.metadata.ophys_experiment_metadata.ophys_session_id import ( # noqa: E501
OphysSessionId,
)
from allensdk.brain_observatory.behavior.data_objects.metadata.ophys_experiment_metadata.targeted_imaging_depth import ( # noqa: E501
TargetedImagingDepth,
)
from allensdk.core import (
DataObject,
JsonReadableInterface,
LimsReadableInterface,
NwbReadableInterface,
)
from allensdk.internal.api import PostgresQueryMixin
from pynwb import NWBFile
[docs]class OphysExperimentMetadata(
DataObject,
LimsReadableInterface,
JsonReadableInterface,
NwbReadableInterface,
):
"""Container class for ophys experiment metadata"""
def __init__(
self,
ophys_experiment_id: int,
ophys_session_id: OphysSessionId,
ophys_container_id: OphysContainerId,
field_of_view_shape: FieldOfViewShape,
imaging_depth: ImagingDepth,
targeted_imaging_depth: TargetedImagingDepth,
project_code: OphysProjectCode = OphysProjectCode(),
):
super().__init__(
name="ophys_experiment_metadata", value=None, is_value_self=True
)
self._ophys_experiment_id = ophys_experiment_id
self._ophys_session_id = ophys_session_id
self._ophys_container_id = ophys_container_id
self._field_of_view_shape = field_of_view_shape
self._imaging_depth = imaging_depth
self._targeted_imaging_depth = targeted_imaging_depth
self._project_code = project_code
[docs] @classmethod
def from_lims(
cls, ophys_experiment_id: int, lims_db: PostgresQueryMixin
) -> "OphysExperimentMetadata":
ophys_session_id = OphysSessionId.from_lims(
ophys_experiment_id=ophys_experiment_id, lims_db=lims_db
)
ophys_container_id = OphysContainerId.from_lims(
ophys_experiment_id=ophys_experiment_id, lims_db=lims_db
)
field_of_view_shape = FieldOfViewShape.from_lims(
ophys_experiment_id=ophys_experiment_id, lims_db=lims_db
)
imaging_depth = ImagingDepth.from_lims(
ophys_experiment_id=ophys_experiment_id, lims_db=lims_db
)
targeted_imaging_depth = TargetedImagingDepth.from_lims(
ophys_experiment_id=ophys_experiment_id, lims_db=lims_db
)
project_code = OphysProjectCode.from_lims(
ophys_experiment_id=ophys_experiment_id, lims_db=lims_db
)
return cls(
ophys_experiment_id=ophys_experiment_id,
ophys_session_id=ophys_session_id,
ophys_container_id=ophys_container_id,
field_of_view_shape=field_of_view_shape,
imaging_depth=imaging_depth,
targeted_imaging_depth=targeted_imaging_depth,
project_code=project_code,
)
[docs] @classmethod
def from_json(cls, dict_repr: dict) -> "OphysExperimentMetadata":
ophys_session_id = OphysSessionId.from_json(dict_repr=dict_repr)
ophys_container_id = OphysContainerId.from_json(dict_repr=dict_repr)
ophys_experiment_id = dict_repr["ophys_experiment_id"]
field_of_view_shape = FieldOfViewShape.from_json(dict_repr=dict_repr)
imaging_depth = ImagingDepth.from_json(dict_repr=dict_repr)
targeted_imaging_depth = TargetedImagingDepth.from_json(
dict_repr=dict_repr
)
return OphysExperimentMetadata(
ophys_experiment_id=ophys_experiment_id,
ophys_session_id=ophys_session_id,
ophys_container_id=ophys_container_id,
field_of_view_shape=field_of_view_shape,
imaging_depth=imaging_depth,
targeted_imaging_depth=targeted_imaging_depth,
)
[docs] @classmethod
def from_nwb(cls, nwbfile: NWBFile) -> "OphysExperimentMetadata":
ophys_experiment_id = int(nwbfile.identifier)
ophys_session_id = OphysSessionId.from_nwb(nwbfile=nwbfile)
ophys_container_id = OphysContainerId.from_nwb(nwbfile=nwbfile)
field_of_view_shape = FieldOfViewShape.from_nwb(nwbfile=nwbfile)
imaging_depth = ImagingDepth.from_nwb(nwbfile=nwbfile)
targeted_imaging_depth = TargetedImagingDepth.from_nwb(nwbfile=nwbfile)
project_code = OphysProjectCode.from_nwb(nwbfile=nwbfile)
return OphysExperimentMetadata(
ophys_experiment_id=ophys_experiment_id,
ophys_session_id=ophys_session_id,
ophys_container_id=ophys_container_id,
field_of_view_shape=field_of_view_shape,
imaging_depth=imaging_depth,
targeted_imaging_depth=targeted_imaging_depth,
project_code=project_code,
)
@property
def ophys_container_id(self) -> int:
# TODO: Remove upon updated VBO release.
if self._ophys_container_id is None:
return None
return self._ophys_container_id.value
@property
def field_of_view_shape(self) -> FieldOfViewShape:
return self._field_of_view_shape
@property
def imaging_depth(self) -> int:
# TODO: Remove upon updated VBO release.
if self._ophys_container_id is None:
return None
return self._imaging_depth.value
@property
def targeted_imaging_depth(self) -> int:
# TODO: Remove upon updated VBO release.
if self._targeted_imaging_depth is None:
return None
return self._targeted_imaging_depth.value
[docs] def update_targeted_imaging_depth(
self, ophys_experiment_ids: List[int], lims_db: PostgresQueryMixin
):
"""Update the value for targeted imaging depth given a set of
experiments to be published.
Compute the targeted_imaging_depth (average over experiments in a
container) only for those experiments input.
Parameters
----------
ophys_experiment_ids : list of ints
Set of experiments to calculate targeted_imaging_depth for. Needs
to contain the experiment this metadata represents.
lims_db : PostgresQueryMixin
Connection to the LIMS2 database.
"""
self._targeted_imaging_depth = TargetedImagingDepth.from_lims(
ophys_experiment_id=self._ophys_experiment_id,
ophys_experiment_ids=ophys_experiment_ids,
lims_db=lims_db,
)
@property
def ophys_experiment_id(self) -> int:
return self._ophys_experiment_id
@property
def ophys_session_id(self) -> int:
# TODO this is at the wrong layer of abstraction.
# Should be at ophys session level
# (need to create ophys session class)
return self._ophys_session_id.value
@property
def project_code(self) -> str:
return self._project_code.value