Source code for allensdk.brain_observatory.behavior.data_objects.metadata.ophys_experiment_metadata.targeted_imaging_depth

from typing import List, Optional

from allensdk.core import (
    DataObject,
    JsonReadableInterface,
    LimsReadableInterface,
    NwbReadableInterface,
)
from allensdk.internal.api import PostgresQueryMixin
from pynwb import NWBFile


[docs]class TargetedImagingDepth( DataObject, LimsReadableInterface, NwbReadableInterface, JsonReadableInterface, ): """Data object loads and stores the average `imaging_depth`s (microns) across experiments in the container that an experiment is associated with. """ def __init__(self, targeted_imaging_depth: int): super().__init__( name="targeted_imaging_depth", value=targeted_imaging_depth )
[docs] @classmethod def from_lims( cls, ophys_experiment_id: int, lims_db: PostgresQueryMixin, ophys_experiment_ids: Optional[List[int]] = None, ) -> "TargetedImagingDepth": """Load targeted imaging depth. Parameters ---------- ophys_experiment_id : int Id of experiment to calculate targeted depth for. lims_db : PostgresQueryMixin Connection to the LIMS2 database. ophys_experiment_ids : list of int Subset of experiments in the container of ``ophys_experiment_id`` to calculate the target_imaging_depth. List should contain the value of ``ophys_experiment_id``. """ query_container_id = """ SELECT visual_behavior_experiment_container_id FROM ophys_experiments_visual_behavior_experiment_containers WHERE ophys_experiment_id = {} """.format( ophys_experiment_id ) container_id = lims_db.fetchone(query_container_id, strict=True) query_depths = """ SELECT oe.id as ophys_experiment_id, imd.depth as depth FROM ophys_experiments_visual_behavior_experiment_containers ec JOIN ophys_experiments oe ON oe.id = ec.ophys_experiment_id LEFT JOIN imaging_depths imd ON imd.id = oe.imaging_depth_id WHERE ec.visual_behavior_experiment_container_id = {}; """.format( container_id ) depths = lims_db.select(query_depths).set_index("ophys_experiment_id") if ophys_experiment_ids is not None: if ophys_experiment_id not in ophys_experiment_ids: raise ValueError( "List of ophys_exeperiment_ids does not contain id of " "this experiment. Exiting. \n" f"\tophys_experiment_id={ophys_experiment_id}\n" f"\tophys_experiment_id list={ophys_experiment_ids}\n" ) depths = depths.loc[ophys_experiment_ids] targeted_imaging_depth = int(depths["depth"].mean()) return cls(targeted_imaging_depth=targeted_imaging_depth)
[docs] @classmethod def from_json(cls, dict_repr: dict) -> "TargetedImagingDepth": # TODO remove all of the from_json loading and validation step # ticket 2607 return cls(targeted_imaging_depth=dict_repr["targeted_depth"])
[docs] @classmethod def from_nwb(cls, nwbfile: NWBFile) -> "TargetedImagingDepth": try: metadata = nwbfile.lab_meta_data["metadata"] return cls(targeted_imaging_depth=metadata.targeted_imaging_depth) except AttributeError: return None