Source code for allensdk.brain_observatory.behavior.write_nwb.ophys.schemas
import marshmallow as mm
import pandas as pd
from allensdk.brain_observatory.behavior.behavior_project_cache.project_apis.data_io.behavior_project_cloud_api import ( # noqa: E501
sanitize_data_columns,
)
from allensdk.brain_observatory.behavior.behavior_project_cache.tables.metadata_table_schemas import ( # noqa: E501
OphysExperimentMetadataSchema,
)
from allensdk.brain_observatory.behavior.write_nwb.behavior.schemas import (
BaseInputSchema,
RaisingSchema,
)
from argschema.fields import Int, List, Nested, OutputFile
[docs]
class OphysExperimentInputSchema(BaseInputSchema):
ophys_experiment_id = Int(
required=True, description="Id of OphysExperiment to create."
)
ophys_container_experiment_ids = List(
Int,
required=False,
cli_as_single_argument=True,
description="Subset of the experiment ids in the same container to be "
"released. Experiment Ids are pulled from input metadata "
"table. Useful for when experiments are excluded from the "
"release and certain summary values (e.g. "
"targeted_imaging_depth) must be recalculated from the "
"released experiments.",
default=[],
)
ophys_experiment_metadata = Nested(
OphysExperimentMetadataSchema,
required=True,
description="Data pertaining to an ophys experiment.",
)
[docs]
@mm.pre_load
def retreive_metadata(self, data, **kwargs):
"""Load the data from csv using Pandas the same as the
project_cloud api.
"""
df = sanitize_data_columns(
data["metadata_table"], dtype_convert={"mouse_id": str}
)
df.set_index("ophys_experiment_id", inplace=True)
try:
# Enforce type as we haven't enfoced type in the
# schema yet.
oe_row = df.loc[int(data["ophys_experiment_id"])]
except KeyError:
raise KeyError(
f"Ophys experiment id {data['ophys_experiment_id']} "
"not in input OphysExperimentTable. Exiting."
)
data["ophys_experiment_metadata"] = self._get_behavior_metadata(oe_row)
data["ophys_experiment_metadata"]["behavior_session_id"] = oe_row[
"behavior_session_id"
]
# Ophys Experiment specific data.
data["ophys_experiment_metadata"]["imaging_depth"] = oe_row[
"imaging_depth"
]
imaging_plane_group = oe_row["imaging_plane_group"]
if pd.isna(imaging_plane_group):
imaging_plane_group = None
data["ophys_experiment_metadata"][
"imaging_plane_group"
] = imaging_plane_group
data["ophys_experiment_metadata"]["indicator"] = oe_row["indicator"]
data["ophys_experiment_metadata"]["ophys_container_id"] = oe_row[
"ophys_container_id"
]
data["ophys_experiment_metadata"]["ophys_experiment_id"] = oe_row.name
data["ophys_experiment_metadata"]["ophys_session_id"] = oe_row[
"ophys_session_id"
]
data["ophys_experiment_metadata"]["targeted_imaging_depth"] = oe_row[
"targeted_imaging_depth"
]
data["ophys_experiment_metadata"]["targeted_structure"] = oe_row[
"targeted_structure"
]
data["ophys_container_experiment_ids"] = df[
df["ophys_container_id"] == oe_row["ophys_container_id"]
].index.tolist()
return data
[docs]
class OutputSchema(RaisingSchema):
input_parameters = Nested(OphysExperimentInputSchema)
output_path = OutputFile(
required=True,
description="Path of output NWB file.",
)