Source code for allensdk.brain_observatory.behavior.data_objects.metadata.ophys_experiment_metadata.ophys_experiment_metadata
from typing import Optional
from pynwb import NWBFile
from allensdk.core import DataObject
from allensdk.core import \
JsonReadableInterface, NwbReadableInterface, \
LimsReadableInterface
from allensdk.brain_observatory.behavior.data_objects.metadata\
.ophys_experiment_metadata.experiment_container_id import \
ExperimentContainerId
from allensdk.brain_observatory.behavior.data_objects.metadata\
.ophys_experiment_metadata.field_of_view_shape import \
FieldOfViewShape
from allensdk.brain_observatory.behavior.data_objects.metadata\
.ophys_experiment_metadata.imaging_depth import \
ImagingDepth
from allensdk.brain_observatory.behavior.data_objects.metadata\
.ophys_experiment_metadata.ophys_session_id import \
OphysSessionId
from allensdk.brain_observatory.behavior.data_objects.metadata\
.ophys_experiment_metadata.project_code import \
ProjectCode
from allensdk.internal.api import PostgresQueryMixin
[docs]class OphysExperimentMetadata(DataObject, LimsReadableInterface,
JsonReadableInterface, NwbReadableInterface):
"""Container class for ophys experiment metadata"""
def __init__(self,
ophys_experiment_id: int,
ophys_session_id: OphysSessionId,
experiment_container_id: ExperimentContainerId,
field_of_view_shape: FieldOfViewShape,
imaging_depth: ImagingDepth,
project_code: Optional[ProjectCode] = None):
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._experiment_container_id = experiment_container_id
self._field_of_view_shape = field_of_view_shape
self._imaging_depth = imaging_depth
self._project_code = project_code
# project_code needs to be excluded from comparison
# since it's only exposed internally
self._exclude_from_equals = {'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)
experiment_container_id = ExperimentContainerId.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)
project_code = ProjectCode.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,
experiment_container_id=experiment_container_id,
field_of_view_shape=field_of_view_shape,
imaging_depth=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)
experiment_container_id = ExperimentContainerId.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)
return OphysExperimentMetadata(
ophys_experiment_id=ophys_experiment_id,
ophys_session_id=ophys_session_id,
experiment_container_id=experiment_container_id,
field_of_view_shape=field_of_view_shape,
imaging_depth=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)
experiment_container_id = ExperimentContainerId.from_nwb(
nwbfile=nwbfile)
field_of_view_shape = FieldOfViewShape.from_nwb(nwbfile=nwbfile)
imaging_depth = ImagingDepth.from_nwb(nwbfile=nwbfile)
return OphysExperimentMetadata(
ophys_experiment_id=ophys_experiment_id,
ophys_session_id=ophys_session_id,
experiment_container_id=experiment_container_id,
field_of_view_shape=field_of_view_shape,
imaging_depth=imaging_depth
)
# TODO rename to ophys_container_id
@property
def experiment_container_id(self) -> int:
return self._experiment_container_id.value
@property
def field_of_view_shape(self) -> FieldOfViewShape:
return self._field_of_view_shape
@property
def imaging_depth(self) -> int:
return self._imaging_depth.value
@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) -> Optional[str]:
if self._project_code is None:
pc = self._project_code
else:
pc = self._project_code.value
return pc