update models

This commit is contained in:
sneakers-the-rat 2024-08-05 16:06:05 -07:00
parent b3b5b9d793
commit 0a150d6bc2
Signed by untrusted user who does not match committer: jonny
GPG key ID: 6DCB96EF1E4D232D
242 changed files with 9341 additions and 1449 deletions

View file

@ -87,7 +87,7 @@ class Image(NWBData):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -189,7 +189,7 @@ class TimeSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], Any],
NDArray[Shape["* num_times, * num_dim2"], Any],
@ -241,7 +241,7 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True}
)
children: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
None,
json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}

View file

@ -131,7 +131,7 @@ class SpatialSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -148,7 +148,7 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[IntervalSeries]] = Field(
value: Optional[List[IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
)
name: str = Field(...)
@ -163,7 +163,7 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -178,7 +178,7 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -193,7 +193,7 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -208,7 +208,7 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -223,7 +223,7 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -238,7 +238,7 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)

View file

@ -16,6 +16,7 @@ from pydantic import (
ValidationInfo,
BeforeValidator,
)
from ...core.v2_2_0.core_nwb_device import Device
from ...core.v2_2_0.core_nwb_base import (
TimeSeries,
TimeSeriesStartingTime,
@ -116,7 +117,12 @@ class ElectricalSeries(TimeSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -179,7 +185,12 @@ class SpikeEventSeries(ElectricalSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -256,7 +267,12 @@ class FeatureExtraction(NWBDataInterface):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
@ -287,6 +303,15 @@ class EventDetection(NWBDataInterface):
description="""Timestamps of events, in seconds.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_events"}]}}},
)
source_electricalseries: Union[ElectricalSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ElectricalSeries"}, {"range": "string"}],
}
},
)
class EventWaveform(NWBDataInterface):
@ -298,7 +323,7 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[SpikeEventSeries]] = Field(
value: Optional[List[SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
)
name: str = Field(...)
@ -313,7 +338,7 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -328,7 +353,7 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -352,6 +377,15 @@ class ElectrodeGroup(NWBContainer):
position: Optional[ElectrodeGroupPosition] = Field(
None, description="""stereotaxic or common framework coordinates"""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ElectrodeGroupPosition(ConfiguredBaseModel):
@ -406,6 +440,15 @@ class ClusterWaveforms(NWBDataInterface):
}
},
)
clustering_interface: Union[Clustering, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Clustering"}, {"range": "string"}],
}
},
)
class Clustering(NWBDataInterface):

View file

@ -127,7 +127,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for tags.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
timeseries: Optional[TimeIntervalsTimeseries] = Field(
@ -137,7 +142,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(

View file

@ -7,7 +7,6 @@ import sys
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator
import numpy as np
from ...core.v2_2_0.core_nwb_epoch import TimeIntervals
from ...core.v2_2_0.core_nwb_misc import Units
from ...core.v2_2_0.core_nwb_device import Device
from ...core.v2_2_0.core_nwb_ogen import OptogeneticStimulusSite
@ -22,6 +21,7 @@ from ...core.v2_2_0.core_nwb_ecephys import ElectrodeGroup
from numpydantic import NDArray, Shape
from ...hdmf_common.v1_1_0.hdmf_common_table import DynamicTable, VectorData, VectorIndex
from ...core.v2_2_0.core_nwb_icephys import IntracellularElectrode, SweepTable
from ...core.v2_2_0.core_nwb_epoch import TimeIntervals
metamodel_version = "None"
version = "2.2.0"
@ -158,19 +158,9 @@ class NWBFile(NWBContainer):
...,
description="""Experimental metadata, including protocol, notes and description of hardware device(s). The metadata stored in this section should be used to describe the experiment. Metadata necessary for interpreting the data is stored with the data. General experimental metadata, including animal strain, experimental protocols, experimenter, devices, etc, are stored under 'general'. Core metadata (e.g., that required to interpret data fields) is stored with the data itself, and implicitly defined by the file specification (e.g., time is in seconds). The strategy used here for storing non-core metadata is to use free-form text fields, such as would appear in sentences or paragraphs from a Methods section. Metadata fields are text to enable them to be more general, for example to represent ranges instead of numerical values. Machine-readable metadata is stored as attributes to these free-form datasets. All entries in the below table are to be included when data is present. Unused groups (e.g., intracellular_ephys in an optophysiology experiment) should not be created unless there is data to store within them.""",
)
intervals: Optional[List[TimeIntervals]] = Field(
intervals: Optional[NWBFileIntervals] = Field(
None,
description="""Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.""",
json_schema_extra={
"linkml_meta": {
"any_of": [
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
]
}
},
)
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
@ -544,6 +534,35 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
)
class NWBFileIntervals(ConfiguredBaseModel):
"""
Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.file"})
name: Literal["intervals"] = Field(
"intervals",
json_schema_extra={
"linkml_meta": {"equals_string": "intervals", "ifabsent": "string(intervals)"}
},
)
epochs: Optional[TimeIntervals] = Field(
None,
description="""Divisions in time marking experimental stages or sub-divisions of a single recording session.""",
)
trials: Optional[TimeIntervals] = Field(
None, description="""Repeated experimental events that have a logical grouping."""
)
invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis."""
)
time_intervals: Optional[List[TimeIntervals]] = Field(
None,
description="""Optional additional table(s) for describing other experimental time intervals.""",
)
# Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
NWBFile.model_rebuild()
@ -554,3 +573,4 @@ Subject.model_rebuild()
GeneralExtracellularEphys.model_rebuild()
ExtracellularEphysElectrodes.model_rebuild()
GeneralIntracellularEphys.model_rebuild()
NWBFileIntervals.model_rebuild()

View file

@ -11,6 +11,7 @@ from ...core.v2_2_0.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_2_0.core_nwb_device import Device
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union, Annotated, Type, TypeVar
from pydantic import (
BaseModel,
@ -117,6 +118,15 @@ class PatchClampSeries(TimeSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -164,7 +174,7 @@ class PatchClampSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times"], float]] = Field(
value: Optional[NDArray[Shape["* num_times"], float]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
@ -195,6 +205,15 @@ class CurrentClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -271,6 +290,15 @@ class IZeroClampSeries(CurrentClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -324,6 +352,15 @@ class CurrentClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -416,6 +453,15 @@ class VoltageClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -648,6 +694,15 @@ class VoltageClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -724,6 +779,15 @@ class IntracellularElectrode(NWBContainer):
slice: Optional[str] = Field(
None, description="""Information about slice used for recording."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class SweepTable(DynamicTable):
@ -752,7 +816,12 @@ class SweepTable(DynamicTable):
...,
description="""Index for series.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(

View file

@ -75,7 +75,7 @@ class GrayscaleImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -98,7 +98,7 @@ class RGBImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -121,7 +121,7 @@ class RGBAImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -208,7 +208,7 @@ class ImageSeriesExternalFile(ConfiguredBaseModel):
None,
description="""Each external image may contain one or more consecutive frames of the full ImageSeries. This attribute serves as an index to indicate which frames each file contains, to faciliate random access. The 'starting_frame' attribute, hence, contains a list of frame numbers within the full ImageSeries of the first frame of each file listed in the parent 'external_file' dataset. Zero-based indexing is used (hence, the first element will always be zero). For example, if the 'external_file' dataset has three paths to files and the first file has 5 frames, the second file has 10 frames, and the third file has 20 frames, then this attribute will have values [0, 5, 15]. If there is a single external file that holds all of the frames of the ImageSeries (and so there is a single element in the 'external_file' dataset), then this attribute should have value [0].""",
)
array: Optional[NDArray[Shape["* num_files"], str]] = Field(
value: Optional[NDArray[Shape["* num_files"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_files"}]}}}
)
@ -223,6 +223,15 @@ class ImageMaskSeries(ImageSeries):
)
name: str = Field(...)
masked_imageseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -362,6 +371,15 @@ class IndexSeries(TimeSeries):
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
indexed_timeseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,

View file

@ -167,7 +167,7 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
None,
description="""Since there can be different units for different features, store the units in 'feature_units'. The default value for this attribute is \"see 'feature_units'\".""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -287,6 +287,15 @@ class DecompositionSeries(TimeSeries):
...,
description="""Table for describing the bands that this series was generated from. There should be one row in this table for each band.""",
)
source_timeseries: Optional[Union[TimeSeries, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "TimeSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -334,7 +343,7 @@ class DecompositionSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -428,7 +437,12 @@ class Units(DynamicTable):
None,
description="""Index into the spike_times dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
spike_times: Optional[UnitsSpikeTimes] = Field(
@ -438,7 +452,12 @@ class Units(DynamicTable):
None,
description="""Index into the obs_intervals dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
obs_intervals: Optional[NDArray[Shape["* num_intervals, 2 start_end"], float]] = Field(
@ -459,14 +478,24 @@ class Units(DynamicTable):
None,
description="""Index into electrodes.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrodes: Named[Optional[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrode_group: Optional[List[ElectrodeGroup]] = Field(

View file

@ -14,6 +14,7 @@ from ...core.v2_2_0.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_2_0.core_nwb_device import Device
metamodel_version = "None"
version = "2.2.0"
@ -81,6 +82,15 @@ class OptogeneticSeries(TimeSeries):
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
site: Union[OptogeneticStimulusSite, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "OptogeneticStimulusSite"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -129,6 +139,15 @@ class OptogeneticStimulusSite(NWBContainer):
...,
description="""Location of the stimulation site. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
# Model rebuild

View file

@ -17,6 +17,7 @@ from pydantic import (
BeforeValidator,
)
from ...hdmf_common.v1_1_0.hdmf_common_table import DynamicTableRegion, DynamicTable
from ...core.v2_2_0.core_nwb_device import Device
from numpydantic import NDArray, Shape
from ...core.v2_2_0.core_nwb_base import (
TimeSeriesStartingTime,
@ -117,6 +118,15 @@ class TwoPhotonSeries(ImageSeries):
field_of_view: Optional[
Union[NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height"], float]]
] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""")
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -185,7 +195,12 @@ class RoiResponseSeries(TimeSeries):
...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
@ -229,7 +244,7 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -244,7 +259,7 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -259,7 +274,7 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[DynamicTable]] = Field(
value: Optional[List[DynamicTable]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "DynamicTable"}]}}
)
name: str = Field(...)
@ -302,6 +317,15 @@ class ImagingPlane(NWBContainer):
optical_channel: OpticalChannel = Field(
..., description="""An optical channel used to record from an imaging plane."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ImagingPlaneManifold(ConfiguredBaseModel):
@ -325,7 +349,7 @@ class ImagingPlaneManifold(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* height, * width, 3 x_y_z"], float],
NDArray[Shape["* height, * width, * depth, 3 x_y_z"], float],
@ -349,7 +373,7 @@ class ImagingPlaneOriginCoords(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Measurement units for origin_coords. The default value is 'meters'."""
)
array: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
value: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -380,7 +404,7 @@ class ImagingPlaneGridSpacing(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Measurement units for grid_spacing. The default value is 'meters'."""
)
array: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
value: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -416,7 +440,7 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[NWBDataInterface]] = Field(
value: Optional[List[NWBDataInterface]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}]}}
)
name: str = Field(...)

View file

@ -101,7 +101,7 @@ class RetinotopyMap(NWBData):
description="""Number of rows and columns in the image. NOTE: row, column representation is equivalent to height, width.""",
)
field_of_view: Optional[float] = Field(None, description="""Size of viewing area, in meters.""")
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -122,7 +122,7 @@ class AxisMap(RetinotopyMap):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -161,7 +161,7 @@ class RetinotopyImage(GrayscaleImage):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -187,35 +187,60 @@ class ImagingRetinotopy(NWBDataInterface):
...,
description="""Phase response to stimulus on the first measured axis.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
axis_1_power_map: Named[Optional[AxisMap]] = Field(
None,
description="""Power response on the first measured axis. Response is scaled so 0.0 is no power in the response and 1.0 is maximum relative power.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
axis_2_phase_map: Named[AxisMap] = Field(
...,
description="""Phase response to stimulus on the second measured axis.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
axis_2_power_map: Named[Optional[AxisMap]] = Field(
None,
description="""Power response to stimulus on the second measured axis.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
sign_map: Named[RetinotopyMap] = Field(
...,
description="""Sine of the angle between the direction of the gradient in axis_1 and axis_2.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
axis_descriptions: NDArray[Shape["2 num_axes"], str] = Field(
@ -235,7 +260,12 @@ class ImagingRetinotopy(NWBDataInterface):
...,
description="""Gray-scale anatomical image of cortical surface. Array structure: [rows][columns]""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
@ -273,7 +303,7 @@ class ImagingRetinotopyFocalDepthImage(RetinotopyImage):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],

View file

@ -133,6 +133,7 @@ from ...core.v2_2_0.core_nwb_file import (
GeneralExtracellularEphys,
ExtracellularEphysElectrodes,
GeneralIntracellularEphys,
NWBFileIntervals,
)
from ...core.v2_2_0.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries

View file

@ -87,7 +87,7 @@ class Image(NWBData):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -189,7 +189,7 @@ class TimeSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], Any],
NDArray[Shape["* num_times, * num_dim2"], Any],
@ -241,7 +241,7 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True}
)
children: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
None,
json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}

View file

@ -131,7 +131,7 @@ class SpatialSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -148,7 +148,7 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[IntervalSeries]] = Field(
value: Optional[List[IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
)
name: str = Field(...)
@ -163,7 +163,7 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -178,7 +178,7 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -193,7 +193,7 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -208,7 +208,7 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -223,7 +223,7 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -238,7 +238,7 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)

View file

@ -16,6 +16,7 @@ from pydantic import (
ValidationInfo,
BeforeValidator,
)
from ...core.v2_2_1.core_nwb_device import Device
from ...core.v2_2_1.core_nwb_base import (
TimeSeries,
TimeSeriesStartingTime,
@ -116,7 +117,12 @@ class ElectricalSeries(TimeSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -179,7 +185,12 @@ class SpikeEventSeries(ElectricalSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -256,7 +267,12 @@ class FeatureExtraction(NWBDataInterface):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
@ -287,6 +303,15 @@ class EventDetection(NWBDataInterface):
description="""Timestamps of events, in seconds.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_events"}]}}},
)
source_electricalseries: Union[ElectricalSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ElectricalSeries"}, {"range": "string"}],
}
},
)
class EventWaveform(NWBDataInterface):
@ -298,7 +323,7 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[SpikeEventSeries]] = Field(
value: Optional[List[SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
)
name: str = Field(...)
@ -313,7 +338,7 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -328,7 +353,7 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -352,6 +377,15 @@ class ElectrodeGroup(NWBContainer):
position: Optional[ElectrodeGroupPosition] = Field(
None, description="""stereotaxic or common framework coordinates"""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ElectrodeGroupPosition(ConfiguredBaseModel):
@ -406,6 +440,15 @@ class ClusterWaveforms(NWBDataInterface):
}
},
)
clustering_interface: Union[Clustering, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Clustering"}, {"range": "string"}],
}
},
)
class Clustering(NWBDataInterface):

View file

@ -127,7 +127,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for tags.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
timeseries: Optional[TimeIntervalsTimeseries] = Field(
@ -137,7 +142,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(

View file

@ -7,7 +7,6 @@ import sys
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator
import numpy as np
from ...core.v2_2_1.core_nwb_epoch import TimeIntervals
from ...core.v2_2_1.core_nwb_misc import Units
from ...core.v2_2_1.core_nwb_device import Device
from ...core.v2_2_1.core_nwb_ogen import OptogeneticStimulusSite
@ -22,6 +21,7 @@ from ...core.v2_2_1.core_nwb_ecephys import ElectrodeGroup
from numpydantic import NDArray, Shape
from ...hdmf_common.v1_1_2.hdmf_common_table import DynamicTable, VectorData, VectorIndex
from ...core.v2_2_1.core_nwb_icephys import IntracellularElectrode, SweepTable
from ...core.v2_2_1.core_nwb_epoch import TimeIntervals
metamodel_version = "None"
version = "2.2.1"
@ -158,19 +158,9 @@ class NWBFile(NWBContainer):
...,
description="""Experimental metadata, including protocol, notes and description of hardware device(s). The metadata stored in this section should be used to describe the experiment. Metadata necessary for interpreting the data is stored with the data. General experimental metadata, including animal strain, experimental protocols, experimenter, devices, etc, are stored under 'general'. Core metadata (e.g., that required to interpret data fields) is stored with the data itself, and implicitly defined by the file specification (e.g., time is in seconds). The strategy used here for storing non-core metadata is to use free-form text fields, such as would appear in sentences or paragraphs from a Methods section. Metadata fields are text to enable them to be more general, for example to represent ranges instead of numerical values. Machine-readable metadata is stored as attributes to these free-form datasets. All entries in the below table are to be included when data is present. Unused groups (e.g., intracellular_ephys in an optophysiology experiment) should not be created unless there is data to store within them.""",
)
intervals: Optional[List[TimeIntervals]] = Field(
intervals: Optional[NWBFileIntervals] = Field(
None,
description="""Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.""",
json_schema_extra={
"linkml_meta": {
"any_of": [
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
]
}
},
)
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
@ -544,6 +534,35 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
)
class NWBFileIntervals(ConfiguredBaseModel):
"""
Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.file"})
name: Literal["intervals"] = Field(
"intervals",
json_schema_extra={
"linkml_meta": {"equals_string": "intervals", "ifabsent": "string(intervals)"}
},
)
epochs: Optional[TimeIntervals] = Field(
None,
description="""Divisions in time marking experimental stages or sub-divisions of a single recording session.""",
)
trials: Optional[TimeIntervals] = Field(
None, description="""Repeated experimental events that have a logical grouping."""
)
invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis."""
)
time_intervals: Optional[List[TimeIntervals]] = Field(
None,
description="""Optional additional table(s) for describing other experimental time intervals.""",
)
# Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
NWBFile.model_rebuild()
@ -554,3 +573,4 @@ Subject.model_rebuild()
GeneralExtracellularEphys.model_rebuild()
ExtracellularEphysElectrodes.model_rebuild()
GeneralIntracellularEphys.model_rebuild()
NWBFileIntervals.model_rebuild()

View file

@ -11,6 +11,7 @@ from ...core.v2_2_1.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_2_1.core_nwb_device import Device
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union, Annotated, Type, TypeVar
from pydantic import (
BaseModel,
@ -117,6 +118,15 @@ class PatchClampSeries(TimeSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -164,7 +174,7 @@ class PatchClampSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times"], float]] = Field(
value: Optional[NDArray[Shape["* num_times"], float]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
@ -195,6 +205,15 @@ class CurrentClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -271,6 +290,15 @@ class IZeroClampSeries(CurrentClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -324,6 +352,15 @@ class CurrentClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -416,6 +453,15 @@ class VoltageClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -648,6 +694,15 @@ class VoltageClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -724,6 +779,15 @@ class IntracellularElectrode(NWBContainer):
slice: Optional[str] = Field(
None, description="""Information about slice used for recording."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class SweepTable(DynamicTable):
@ -752,7 +816,12 @@ class SweepTable(DynamicTable):
...,
description="""Index for series.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(

View file

@ -75,7 +75,7 @@ class GrayscaleImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -98,7 +98,7 @@ class RGBImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -121,7 +121,7 @@ class RGBAImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -208,7 +208,7 @@ class ImageSeriesExternalFile(ConfiguredBaseModel):
None,
description="""Each external image may contain one or more consecutive frames of the full ImageSeries. This attribute serves as an index to indicate which frames each file contains, to faciliate random access. The 'starting_frame' attribute, hence, contains a list of frame numbers within the full ImageSeries of the first frame of each file listed in the parent 'external_file' dataset. Zero-based indexing is used (hence, the first element will always be zero). For example, if the 'external_file' dataset has three paths to files and the first file has 5 frames, the second file has 10 frames, and the third file has 20 frames, then this attribute will have values [0, 5, 15]. If there is a single external file that holds all of the frames of the ImageSeries (and so there is a single element in the 'external_file' dataset), then this attribute should have value [0].""",
)
array: Optional[NDArray[Shape["* num_files"], str]] = Field(
value: Optional[NDArray[Shape["* num_files"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_files"}]}}}
)
@ -223,6 +223,15 @@ class ImageMaskSeries(ImageSeries):
)
name: str = Field(...)
masked_imageseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -362,6 +371,15 @@ class IndexSeries(TimeSeries):
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
indexed_timeseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,

View file

@ -167,7 +167,7 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
None,
description="""Since there can be different units for different features, store the units in 'feature_units'. The default value for this attribute is \"see 'feature_units'\".""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -287,6 +287,15 @@ class DecompositionSeries(TimeSeries):
...,
description="""Table for describing the bands that this series was generated from. There should be one row in this table for each band.""",
)
source_timeseries: Optional[Union[TimeSeries, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "TimeSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -334,7 +343,7 @@ class DecompositionSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -428,7 +437,12 @@ class Units(DynamicTable):
None,
description="""Index into the spike_times dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
spike_times: Optional[UnitsSpikeTimes] = Field(
@ -438,7 +452,12 @@ class Units(DynamicTable):
None,
description="""Index into the obs_intervals dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
obs_intervals: Optional[NDArray[Shape["* num_intervals, 2 start_end"], float]] = Field(
@ -459,14 +478,24 @@ class Units(DynamicTable):
None,
description="""Index into electrodes.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrodes: Named[Optional[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrode_group: Optional[List[ElectrodeGroup]] = Field(

View file

@ -14,6 +14,7 @@ from ...core.v2_2_1.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_2_1.core_nwb_device import Device
metamodel_version = "None"
version = "2.2.1"
@ -81,6 +82,15 @@ class OptogeneticSeries(TimeSeries):
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
site: Union[OptogeneticStimulusSite, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "OptogeneticStimulusSite"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -129,6 +139,15 @@ class OptogeneticStimulusSite(NWBContainer):
...,
description="""Location of the stimulation site. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
# Model rebuild

View file

@ -17,6 +17,7 @@ from pydantic import (
BeforeValidator,
)
from ...hdmf_common.v1_1_2.hdmf_common_table import DynamicTableRegion, DynamicTable
from ...core.v2_2_1.core_nwb_device import Device
from numpydantic import NDArray, Shape
from ...core.v2_2_1.core_nwb_base import (
TimeSeriesStartingTime,
@ -117,6 +118,15 @@ class TwoPhotonSeries(ImageSeries):
field_of_view: Optional[
Union[NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height"], float]]
] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""")
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -185,7 +195,12 @@ class RoiResponseSeries(TimeSeries):
...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
@ -229,7 +244,7 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -244,7 +259,7 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -259,7 +274,7 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[DynamicTable]] = Field(
value: Optional[List[DynamicTable]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "DynamicTable"}]}}
)
name: str = Field(...)
@ -302,6 +317,15 @@ class ImagingPlane(NWBContainer):
optical_channel: OpticalChannel = Field(
..., description="""An optical channel used to record from an imaging plane."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ImagingPlaneManifold(ConfiguredBaseModel):
@ -325,7 +349,7 @@ class ImagingPlaneManifold(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* height, * width, 3 x_y_z"], float],
NDArray[Shape["* height, * width, * depth, 3 x_y_z"], float],
@ -349,7 +373,7 @@ class ImagingPlaneOriginCoords(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Measurement units for origin_coords. The default value is 'meters'."""
)
array: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
value: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -380,7 +404,7 @@ class ImagingPlaneGridSpacing(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Measurement units for grid_spacing. The default value is 'meters'."""
)
array: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
value: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -416,7 +440,7 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[NWBDataInterface]] = Field(
value: Optional[List[NWBDataInterface]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}]}}
)
name: str = Field(...)

View file

@ -101,7 +101,7 @@ class RetinotopyMap(NWBData):
description="""Number of rows and columns in the image. NOTE: row, column representation is equivalent to height, width.""",
)
field_of_view: Optional[float] = Field(None, description="""Size of viewing area, in meters.""")
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -122,7 +122,7 @@ class AxisMap(RetinotopyMap):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -161,7 +161,7 @@ class RetinotopyImage(GrayscaleImage):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -187,35 +187,60 @@ class ImagingRetinotopy(NWBDataInterface):
...,
description="""Phase response to stimulus on the first measured axis.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
axis_1_power_map: Named[Optional[AxisMap]] = Field(
None,
description="""Power response on the first measured axis. Response is scaled so 0.0 is no power in the response and 1.0 is maximum relative power.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
axis_2_phase_map: Named[AxisMap] = Field(
...,
description="""Phase response to stimulus on the second measured axis.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
axis_2_power_map: Named[Optional[AxisMap]] = Field(
None,
description="""Power response to stimulus on the second measured axis.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
sign_map: Named[RetinotopyMap] = Field(
...,
description="""Sine of the angle between the direction of the gradient in axis_1 and axis_2.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
axis_descriptions: NDArray[Shape["2 num_axes"], str] = Field(
@ -235,7 +260,12 @@ class ImagingRetinotopy(NWBDataInterface):
...,
description="""Gray-scale anatomical image of cortical surface. Array structure: [rows][columns]""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
@ -273,7 +303,7 @@ class ImagingRetinotopyFocalDepthImage(RetinotopyImage):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],

View file

@ -133,6 +133,7 @@ from ...core.v2_2_1.core_nwb_file import (
GeneralExtracellularEphys,
ExtracellularEphysElectrodes,
GeneralIntracellularEphys,
NWBFileIntervals,
)
from ...core.v2_2_1.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries

View file

@ -87,7 +87,7 @@ class Image(NWBData):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -189,7 +189,7 @@ class TimeSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], Any],
NDArray[Shape["* num_times, * num_dim2"], Any],
@ -241,7 +241,7 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True}
)
children: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
None,
json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}

View file

@ -131,7 +131,7 @@ class SpatialSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -148,7 +148,7 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[IntervalSeries]] = Field(
value: Optional[List[IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
)
name: str = Field(...)
@ -163,7 +163,7 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -178,7 +178,7 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -193,7 +193,7 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -208,7 +208,7 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -223,7 +223,7 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -238,7 +238,7 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)

View file

@ -16,6 +16,7 @@ from pydantic import (
ValidationInfo,
BeforeValidator,
)
from ...core.v2_2_2.core_nwb_device import Device
from ...core.v2_2_2.core_nwb_base import (
TimeSeries,
TimeSeriesStartingTime,
@ -116,7 +117,12 @@ class ElectricalSeries(TimeSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -179,7 +185,12 @@ class SpikeEventSeries(ElectricalSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -256,7 +267,12 @@ class FeatureExtraction(NWBDataInterface):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
@ -287,6 +303,15 @@ class EventDetection(NWBDataInterface):
description="""Timestamps of events, in seconds.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_events"}]}}},
)
source_electricalseries: Union[ElectricalSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ElectricalSeries"}, {"range": "string"}],
}
},
)
class EventWaveform(NWBDataInterface):
@ -298,7 +323,7 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[SpikeEventSeries]] = Field(
value: Optional[List[SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
)
name: str = Field(...)
@ -313,7 +338,7 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -328,7 +353,7 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -352,6 +377,15 @@ class ElectrodeGroup(NWBContainer):
position: Optional[ElectrodeGroupPosition] = Field(
None, description="""stereotaxic or common framework coordinates"""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ElectrodeGroupPosition(ConfiguredBaseModel):
@ -406,6 +440,15 @@ class ClusterWaveforms(NWBDataInterface):
}
},
)
clustering_interface: Union[Clustering, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Clustering"}, {"range": "string"}],
}
},
)
class Clustering(NWBDataInterface):

View file

@ -127,7 +127,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for tags.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
timeseries: Optional[TimeIntervalsTimeseries] = Field(
@ -137,7 +142,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -187,7 +197,7 @@ class TimeIntervalsTimeseries(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -7,7 +7,6 @@ import sys
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator
import numpy as np
from ...core.v2_2_2.core_nwb_epoch import TimeIntervals
from ...core.v2_2_2.core_nwb_misc import Units
from ...core.v2_2_2.core_nwb_device import Device
from ...core.v2_2_2.core_nwb_ogen import OptogeneticStimulusSite
@ -22,6 +21,7 @@ from ...core.v2_2_2.core_nwb_ecephys import ElectrodeGroup
from numpydantic import NDArray, Shape
from ...hdmf_common.v1_1_3.hdmf_common_table import DynamicTable, VectorData, VectorIndex
from ...core.v2_2_2.core_nwb_icephys import IntracellularElectrode, SweepTable
from ...core.v2_2_2.core_nwb_epoch import TimeIntervals
metamodel_version = "None"
version = "2.2.2"
@ -158,19 +158,9 @@ class NWBFile(NWBContainer):
...,
description="""Experimental metadata, including protocol, notes and description of hardware device(s). The metadata stored in this section should be used to describe the experiment. Metadata necessary for interpreting the data is stored with the data. General experimental metadata, including animal strain, experimental protocols, experimenter, devices, etc, are stored under 'general'. Core metadata (e.g., that required to interpret data fields) is stored with the data itself, and implicitly defined by the file specification (e.g., time is in seconds). The strategy used here for storing non-core metadata is to use free-form text fields, such as would appear in sentences or paragraphs from a Methods section. Metadata fields are text to enable them to be more general, for example to represent ranges instead of numerical values. Machine-readable metadata is stored as attributes to these free-form datasets. All entries in the below table are to be included when data is present. Unused groups (e.g., intracellular_ephys in an optophysiology experiment) should not be created unless there is data to store within them.""",
)
intervals: Optional[List[TimeIntervals]] = Field(
intervals: Optional[NWBFileIntervals] = Field(
None,
description="""Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.""",
json_schema_extra={
"linkml_meta": {
"any_of": [
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
]
}
},
)
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
@ -544,6 +534,35 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
)
class NWBFileIntervals(ConfiguredBaseModel):
"""
Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.file"})
name: Literal["intervals"] = Field(
"intervals",
json_schema_extra={
"linkml_meta": {"equals_string": "intervals", "ifabsent": "string(intervals)"}
},
)
epochs: Optional[TimeIntervals] = Field(
None,
description="""Divisions in time marking experimental stages or sub-divisions of a single recording session.""",
)
trials: Optional[TimeIntervals] = Field(
None, description="""Repeated experimental events that have a logical grouping."""
)
invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis."""
)
time_intervals: Optional[List[TimeIntervals]] = Field(
None,
description="""Optional additional table(s) for describing other experimental time intervals.""",
)
# Model rebuild
# see https://pydantic-docs.helpmanual.io/usage/models/#rebuilding-a-model
NWBFile.model_rebuild()
@ -554,3 +573,4 @@ Subject.model_rebuild()
GeneralExtracellularEphys.model_rebuild()
ExtracellularEphysElectrodes.model_rebuild()
GeneralIntracellularEphys.model_rebuild()
NWBFileIntervals.model_rebuild()

View file

@ -11,6 +11,7 @@ from ...core.v2_2_2.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_2_2.core_nwb_device import Device
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union, Annotated, Type, TypeVar
from pydantic import (
BaseModel,
@ -117,6 +118,15 @@ class PatchClampSeries(TimeSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -164,7 +174,7 @@ class PatchClampSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times"], float]] = Field(
value: Optional[NDArray[Shape["* num_times"], float]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
@ -195,6 +205,15 @@ class CurrentClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -271,6 +290,15 @@ class IZeroClampSeries(CurrentClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -324,6 +352,15 @@ class CurrentClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -416,6 +453,15 @@ class VoltageClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -648,6 +694,15 @@ class VoltageClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -724,6 +779,15 @@ class IntracellularElectrode(NWBContainer):
slice: Optional[str] = Field(
None, description="""Information about slice used for recording."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class SweepTable(DynamicTable):
@ -752,7 +816,12 @@ class SweepTable(DynamicTable):
...,
description="""Index for series.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(

View file

@ -75,7 +75,7 @@ class GrayscaleImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -98,7 +98,7 @@ class RGBImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -121,7 +121,7 @@ class RGBAImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -208,7 +208,7 @@ class ImageSeriesExternalFile(ConfiguredBaseModel):
None,
description="""Each external image may contain one or more consecutive frames of the full ImageSeries. This attribute serves as an index to indicate which frames each file contains, to faciliate random access. The 'starting_frame' attribute, hence, contains a list of frame numbers within the full ImageSeries of the first frame of each file listed in the parent 'external_file' dataset. Zero-based indexing is used (hence, the first element will always be zero). For example, if the 'external_file' dataset has three paths to files and the first file has 5 frames, the second file has 10 frames, and the third file has 20 frames, then this attribute will have values [0, 5, 15]. If there is a single external file that holds all of the frames of the ImageSeries (and so there is a single element in the 'external_file' dataset), then this attribute should have value [0].""",
)
array: Optional[NDArray[Shape["* num_files"], str]] = Field(
value: Optional[NDArray[Shape["* num_files"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_files"}]}}}
)
@ -223,6 +223,15 @@ class ImageMaskSeries(ImageSeries):
)
name: str = Field(...)
masked_imageseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -360,6 +369,15 @@ class IndexSeries(TimeSeries):
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
indexed_timeseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,

View file

@ -167,7 +167,7 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
None,
description="""Since there can be different units for different features, store the units in 'feature_units'. The default value for this attribute is \"see 'feature_units'\".""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -287,6 +287,15 @@ class DecompositionSeries(TimeSeries):
...,
description="""Table for describing the bands that this series was generated from. There should be one row in this table for each band.""",
)
source_timeseries: Optional[Union[TimeSeries, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "TimeSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -334,7 +343,7 @@ class DecompositionSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -428,7 +437,12 @@ class Units(DynamicTable):
None,
description="""Index into the spike_times dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
spike_times: Optional[UnitsSpikeTimes] = Field(
@ -438,7 +452,12 @@ class Units(DynamicTable):
None,
description="""Index into the obs_intervals dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
obs_intervals: Optional[NDArray[Shape["* num_intervals, 2 start_end"], float]] = Field(
@ -459,14 +478,24 @@ class Units(DynamicTable):
None,
description="""Index into electrodes.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrodes: Named[Optional[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrode_group: Optional[List[ElectrodeGroup]] = Field(
@ -524,7 +553,7 @@ class UnitsSpikeTimes(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -14,6 +14,7 @@ from ...core.v2_2_2.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_2_2.core_nwb_device import Device
metamodel_version = "None"
version = "2.2.2"
@ -81,6 +82,15 @@ class OptogeneticSeries(TimeSeries):
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
site: Union[OptogeneticStimulusSite, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "OptogeneticStimulusSite"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -129,6 +139,15 @@ class OptogeneticStimulusSite(NWBContainer):
...,
description="""Location of the stimulation site. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
# Model rebuild

View file

@ -16,8 +16,9 @@ from pydantic import (
ValidationInfo,
BeforeValidator,
)
from numpydantic import NDArray, Shape
from ...hdmf_common.v1_1_3.hdmf_common_table import DynamicTableRegion, DynamicTable
from ...core.v2_2_2.core_nwb_device import Device
from numpydantic import NDArray, Shape
from ...core.v2_2_2.core_nwb_base import (
TimeSeriesStartingTime,
TimeSeriesSync,
@ -117,6 +118,15 @@ class TwoPhotonSeries(ImageSeries):
field_of_view: Optional[
Union[NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height"], float]]
] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""")
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -185,7 +195,12 @@ class RoiResponseSeries(TimeSeries):
...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
@ -229,7 +244,7 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -244,7 +259,7 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -259,7 +274,7 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[DynamicTable]] = Field(
value: Optional[List[DynamicTable]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "DynamicTable"}]}}
)
name: str = Field(...)
@ -274,10 +289,146 @@ class ImagingPlane(NWBContainer):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[NWBContainer]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "NWBContainer"}]}}
)
name: str = Field(...)
description: Optional[str] = Field(None, description="""Description of the imaging plane.""")
excitation_lambda: float = Field(..., description="""Excitation wavelength, in nm.""")
imaging_rate: float = Field(..., description="""Rate that images are acquired, in Hz.""")
indicator: str = Field(..., description="""Calcium indicator.""")
location: str = Field(
...,
description="""Location of the imaging plane. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
manifold: Optional[ImagingPlaneManifold] = Field(
None,
description="""DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.""",
)
origin_coords: Optional[ImagingPlaneOriginCoords] = Field(
None,
description="""Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).""",
)
grid_spacing: Optional[ImagingPlaneGridSpacing] = Field(
None,
description="""Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.""",
)
reference_frame: Optional[str] = Field(
None,
description="""Describes reference frame of origin_coords and grid_spacing. For example, this can be a text description of the anatomical location and orientation of the grid defined by origin_coords and grid_spacing or the vectors needed to transform or rotate the grid to a common anatomical axis (e.g., AP/DV/ML). This field is necessary to interpret origin_coords and grid_spacing. If origin_coords and grid_spacing are not present, then this field is not required. For example, if the microscope takes 10 x 10 x 2 images, where the first value of the data matrix (index (0, 0, 0)) corresponds to (-1.2, -0.6, -2) mm relative to bregma, the spacing between pixels is 0.2 mm in x, 0.2 mm in y and 0.5 mm in z, and larger numbers in x means more anterior, larger numbers in y means more rightward, and larger numbers in z means more ventral, then enter the following -- origin_coords = (-1.2, -0.6, -2) grid_spacing = (0.2, 0.2, 0.5) reference_frame = \"Origin coordinates are relative to bregma. First dimension corresponds to anterior-posterior axis (larger index = more anterior). Second dimension corresponds to medial-lateral axis (larger index = more rightward). Third dimension corresponds to dorsal-ventral axis (larger index = more ventral).\"""",
)
optical_channel: List[OpticalChannel] = Field(
..., description="""An optical channel used to record from an imaging plane."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ImagingPlaneManifold(ConfiguredBaseModel):
"""
DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["manifold"] = Field(
"manifold",
json_schema_extra={
"linkml_meta": {"equals_string": "manifold", "ifabsent": "string(manifold)"}
},
)
conversion: Optional[float] = Field(
None,
description="""Scalar to multiply each element in data to convert it to the specified 'unit'. If the data are stored in acquisition system units or other units that require a conversion to be interpretable, multiply the data by 'conversion' to convert the data to the specified 'unit'. e.g. if the data acquisition system stores values in this object as pixels from x = -500 to 499, y = -500 to 499 that correspond to a 2 m x 2 m range, then the 'conversion' multiplier to get from raw data acquisition pixel units to meters is 2/1000.""",
)
unit: Optional[str] = Field(
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'.""",
)
value: Optional[
Union[
NDArray[Shape["* height, * width, 3 x_y_z"], float],
NDArray[Shape["* height, * width, * depth, 3 x_y_z"], float],
]
] = Field(None)
class ImagingPlaneOriginCoords(ConfiguredBaseModel):
"""
Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["origin_coords"] = Field(
"origin_coords",
json_schema_extra={
"linkml_meta": {"equals_string": "origin_coords", "ifabsent": "string(origin_coords)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for origin_coords. The default value is 'meters'."""
)
value: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"array": {
"dimensions": [
{"alias": "x_y", "exact_cardinality": 2},
{"alias": "x_y_z", "exact_cardinality": 3},
]
}
}
},
)
class ImagingPlaneGridSpacing(ConfiguredBaseModel):
"""
Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["grid_spacing"] = Field(
"grid_spacing",
json_schema_extra={
"linkml_meta": {"equals_string": "grid_spacing", "ifabsent": "string(grid_spacing)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for grid_spacing. The default value is 'meters'."""
)
value: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"array": {
"dimensions": [
{"alias": "x_y", "exact_cardinality": 2},
{"alias": "x_y_z", "exact_cardinality": 3},
]
}
}
},
)
class OpticalChannel(NWBContainer):
"""
An optical channel used to record from an imaging plane.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: str = Field(...)
description: str = Field(..., description="""Description or other notes about the channel.""")
emission_lambda: float = Field(..., description="""Emission wavelength for channel, in nm.""")
class MotionCorrection(NWBDataInterface):
@ -289,7 +440,7 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[NWBDataInterface]] = Field(
value: Optional[List[NWBDataInterface]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}]}}
)
name: str = Field(...)
@ -303,4 +454,8 @@ DfOverF.model_rebuild()
Fluorescence.model_rebuild()
ImageSegmentation.model_rebuild()
ImagingPlane.model_rebuild()
ImagingPlaneManifold.model_rebuild()
ImagingPlaneOriginCoords.model_rebuild()
ImagingPlaneGridSpacing.model_rebuild()
OpticalChannel.model_rebuild()
MotionCorrection.model_rebuild()

View file

@ -135,7 +135,7 @@ class ImagingRetinotopyAxis1PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -167,7 +167,7 @@ class ImagingRetinotopyAxis1PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -199,7 +199,7 @@ class ImagingRetinotopyAxis2PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -231,7 +231,7 @@ class ImagingRetinotopyAxis2PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -268,7 +268,7 @@ class ImagingRetinotopyFocalDepthImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -294,7 +294,7 @@ class ImagingRetinotopySignMap(ConfiguredBaseModel):
description="""Number of rows and columns in the image. NOTE: row, column representation is equivalent to height, width.""",
)
field_of_view: Optional[float] = Field(None, description="""Size of viewing area, in meters.""")
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -330,7 +330,7 @@ class ImagingRetinotopyVasculatureImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}

View file

@ -52,6 +52,10 @@ from ...core.v2_2_2.core_nwb_ophys import (
Fluorescence,
ImageSegmentation,
ImagingPlane,
ImagingPlaneManifold,
ImagingPlaneOriginCoords,
ImagingPlaneGridSpacing,
OpticalChannel,
MotionCorrection,
)
from ...core.v2_2_2.core_nwb_device import Device
@ -132,6 +136,7 @@ from ...core.v2_2_2.core_nwb_file import (
GeneralExtracellularEphys,
ExtracellularEphysElectrodes,
GeneralIntracellularEphys,
NWBFileIntervals,
)
from ...core.v2_2_2.core_nwb_epoch import TimeIntervals, TimeIntervalsTimeseries

View file

@ -87,7 +87,7 @@ class Image(NWBData):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -189,7 +189,7 @@ class TimeSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], Any],
NDArray[Shape["* num_times, * num_dim2"], Any],
@ -241,7 +241,7 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True}
)
children: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
None,
json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}

View file

@ -131,7 +131,7 @@ class SpatialSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -148,7 +148,7 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[IntervalSeries]] = Field(
value: Optional[List[IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
)
name: str = Field(...)
@ -163,7 +163,7 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -178,7 +178,7 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -193,7 +193,7 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -208,7 +208,7 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -223,7 +223,7 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -238,7 +238,7 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)

View file

@ -16,6 +16,7 @@ from pydantic import (
ValidationInfo,
BeforeValidator,
)
from ...core.v2_2_4.core_nwb_device import Device
from ...core.v2_2_4.core_nwb_base import (
TimeSeries,
TimeSeriesStartingTime,
@ -116,7 +117,12 @@ class ElectricalSeries(TimeSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -179,7 +185,12 @@ class SpikeEventSeries(ElectricalSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -256,7 +267,12 @@ class FeatureExtraction(NWBDataInterface):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
@ -287,6 +303,15 @@ class EventDetection(NWBDataInterface):
description="""Timestamps of events, in seconds.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_events"}]}}},
)
source_electricalseries: Union[ElectricalSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ElectricalSeries"}, {"range": "string"}],
}
},
)
class EventWaveform(NWBDataInterface):
@ -298,7 +323,7 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[SpikeEventSeries]] = Field(
value: Optional[List[SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
)
name: str = Field(...)
@ -313,7 +338,7 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -328,7 +353,7 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -352,6 +377,15 @@ class ElectrodeGroup(NWBContainer):
position: Optional[ElectrodeGroupPosition] = Field(
None, description="""stereotaxic or common framework coordinates"""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ElectrodeGroupPosition(ConfiguredBaseModel):
@ -406,6 +440,15 @@ class ClusterWaveforms(NWBDataInterface):
}
},
)
clustering_interface: Union[Clustering, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Clustering"}, {"range": "string"}],
}
},
)
class Clustering(NWBDataInterface):

View file

@ -127,7 +127,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for tags.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
timeseries: Optional[TimeIntervalsTimeseries] = Field(
@ -137,7 +142,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -187,7 +197,7 @@ class TimeIntervalsTimeseries(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -7,7 +7,6 @@ import sys
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator
import numpy as np
from ...core.v2_2_4.core_nwb_epoch import TimeIntervals
from ...core.v2_2_4.core_nwb_misc import Units
from ...core.v2_2_4.core_nwb_device import Device
from ...core.v2_2_4.core_nwb_ogen import OptogeneticStimulusSite
@ -16,6 +15,7 @@ from ...core.v2_2_4.core_nwb_ecephys import ElectrodeGroup
from numpydantic import NDArray, Shape
from ...hdmf_common.v1_1_3.hdmf_common_table import DynamicTable, VectorData, VectorIndex
from ...core.v2_2_4.core_nwb_icephys import IntracellularElectrode, SweepTable
from ...core.v2_2_4.core_nwb_epoch import TimeIntervals
from ...core.v2_2_4.core_nwb_base import (
NWBData,
NWBContainer,
@ -174,19 +174,9 @@ class NWBFile(NWBContainer):
...,
description="""Experimental metadata, including protocol, notes and description of hardware device(s). The metadata stored in this section should be used to describe the experiment. Metadata necessary for interpreting the data is stored with the data. General experimental metadata, including animal strain, experimental protocols, experimenter, devices, etc, are stored under 'general'. Core metadata (e.g., that required to interpret data fields) is stored with the data itself, and implicitly defined by the file specification (e.g., time is in seconds). The strategy used here for storing non-core metadata is to use free-form text fields, such as would appear in sentences or paragraphs from a Methods section. Metadata fields are text to enable them to be more general, for example to represent ranges instead of numerical values. Machine-readable metadata is stored as attributes to these free-form datasets. All entries in the below table are to be included when data is present. Unused groups (e.g., intracellular_ephys in an optophysiology experiment) should not be created unless there is data to store within them.""",
)
intervals: Optional[List[TimeIntervals]] = Field(
intervals: Optional[NWBFileIntervals] = Field(
None,
description="""Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.""",
json_schema_extra={
"linkml_meta": {
"any_of": [
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
]
}
},
)
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
@ -522,6 +512,35 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
)
class NWBFileIntervals(ConfiguredBaseModel):
"""
Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.file"})
name: Literal["intervals"] = Field(
"intervals",
json_schema_extra={
"linkml_meta": {"equals_string": "intervals", "ifabsent": "string(intervals)"}
},
)
epochs: Optional[TimeIntervals] = Field(
None,
description="""Divisions in time marking experimental stages or sub-divisions of a single recording session.""",
)
trials: Optional[TimeIntervals] = Field(
None, description="""Repeated experimental events that have a logical grouping."""
)
invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis."""
)
time_intervals: Optional[List[TimeIntervals]] = Field(
None,
description="""Optional additional table(s) for describing other experimental time intervals.""",
)
class LabMetaData(NWBContainer):
"""
Lab-specific meta-data.
@ -579,5 +598,6 @@ GeneralSourceScript.model_rebuild()
GeneralExtracellularEphys.model_rebuild()
ExtracellularEphysElectrodes.model_rebuild()
GeneralIntracellularEphys.model_rebuild()
NWBFileIntervals.model_rebuild()
LabMetaData.model_rebuild()
Subject.model_rebuild()

View file

@ -11,6 +11,7 @@ from ...core.v2_2_4.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_2_4.core_nwb_device import Device
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union, Annotated, Type, TypeVar
from pydantic import (
BaseModel,
@ -117,6 +118,15 @@ class PatchClampSeries(TimeSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -164,7 +174,7 @@ class PatchClampSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times"], float]] = Field(
value: Optional[NDArray[Shape["* num_times"], float]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
@ -195,6 +205,15 @@ class CurrentClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -271,6 +290,15 @@ class IZeroClampSeries(CurrentClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -324,6 +352,15 @@ class CurrentClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -416,6 +453,15 @@ class VoltageClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -648,6 +694,15 @@ class VoltageClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -724,6 +779,15 @@ class IntracellularElectrode(NWBContainer):
slice: Optional[str] = Field(
None, description="""Information about slice used for recording."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class SweepTable(DynamicTable):
@ -752,7 +816,12 @@ class SweepTable(DynamicTable):
...,
description="""Index for series.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(

View file

@ -75,7 +75,7 @@ class GrayscaleImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -98,7 +98,7 @@ class RGBImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -121,7 +121,7 @@ class RGBAImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -208,7 +208,7 @@ class ImageSeriesExternalFile(ConfiguredBaseModel):
None,
description="""Each external image may contain one or more consecutive frames of the full ImageSeries. This attribute serves as an index to indicate which frames each file contains, to faciliate random access. The 'starting_frame' attribute, hence, contains a list of frame numbers within the full ImageSeries of the first frame of each file listed in the parent 'external_file' dataset. Zero-based indexing is used (hence, the first element will always be zero). For example, if the 'external_file' dataset has three paths to files and the first file has 5 frames, the second file has 10 frames, and the third file has 20 frames, then this attribute will have values [0, 5, 15]. If there is a single external file that holds all of the frames of the ImageSeries (and so there is a single element in the 'external_file' dataset), then this attribute should have value [0].""",
)
array: Optional[NDArray[Shape["* num_files"], str]] = Field(
value: Optional[NDArray[Shape["* num_files"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_files"}]}}}
)
@ -223,6 +223,15 @@ class ImageMaskSeries(ImageSeries):
)
name: str = Field(...)
masked_imageseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -360,6 +369,15 @@ class IndexSeries(TimeSeries):
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
indexed_timeseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,

View file

@ -167,7 +167,7 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
None,
description="""Since there can be different units for different features, store the units in 'feature_units'. The default value for this attribute is \"see 'feature_units'\".""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -287,6 +287,15 @@ class DecompositionSeries(TimeSeries):
...,
description="""Table for describing the bands that this series was generated from. There should be one row in this table for each band.""",
)
source_timeseries: Optional[Union[TimeSeries, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "TimeSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -334,7 +343,7 @@ class DecompositionSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -428,7 +437,12 @@ class Units(DynamicTable):
None,
description="""Index into the spike_times dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
spike_times: Optional[UnitsSpikeTimes] = Field(
@ -438,7 +452,12 @@ class Units(DynamicTable):
None,
description="""Index into the obs_intervals dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
obs_intervals: Optional[NDArray[Shape["* num_intervals, 2 start_end"], float]] = Field(
@ -459,14 +478,24 @@ class Units(DynamicTable):
None,
description="""Index into electrodes.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrodes: Named[Optional[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrode_group: Optional[List[ElectrodeGroup]] = Field(
@ -524,7 +553,7 @@ class UnitsSpikeTimes(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -14,6 +14,7 @@ from ...core.v2_2_4.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_2_4.core_nwb_device import Device
metamodel_version = "None"
version = "2.2.4"
@ -81,6 +82,15 @@ class OptogeneticSeries(TimeSeries):
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
site: Union[OptogeneticStimulusSite, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "OptogeneticStimulusSite"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -129,6 +139,15 @@ class OptogeneticStimulusSite(NWBContainer):
...,
description="""Location of the stimulation site. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
# Model rebuild

View file

@ -21,8 +21,8 @@ from ...hdmf_common.v1_1_3.hdmf_common_table import (
VectorIndex,
VectorData,
)
from ...core.v2_2_4.core_nwb_device import Device
from numpydantic import NDArray, Shape
from ...core.v2_2_4.core_nwb_image import ImageSeries, ImageSeriesExternalFile
from ...core.v2_2_4.core_nwb_base import (
TimeSeriesStartingTime,
TimeSeriesSync,
@ -30,6 +30,7 @@ from ...core.v2_2_4.core_nwb_base import (
NWBDataInterface,
NWBContainer,
)
from ...core.v2_2_4.core_nwb_image import ImageSeries, ImageSeriesExternalFile
metamodel_version = "None"
version = "2.2.4"
@ -122,6 +123,15 @@ class TwoPhotonSeries(ImageSeries):
field_of_view: Optional[
Union[NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height"], float]]
] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""")
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -190,7 +200,12 @@ class RoiResponseSeries(TimeSeries):
...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
@ -234,7 +249,7 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -249,7 +264,7 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -264,7 +279,7 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[PlaneSegmentation]] = Field(
value: Optional[List[PlaneSegmentation]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "PlaneSegmentation"}]}}
)
name: str = Field(...)
@ -288,7 +303,12 @@ class PlaneSegmentation(DynamicTable):
None,
description="""Index into pixel_mask.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
pixel_mask: Optional[PlaneSegmentationPixelMask] = Field(
@ -299,7 +319,12 @@ class PlaneSegmentation(DynamicTable):
None,
description="""Index into voxel_mask.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
voxel_mask: Optional[PlaneSegmentationVoxelMask] = Field(
@ -311,6 +336,15 @@ class PlaneSegmentation(DynamicTable):
description="""Image stacks that the segmentation masks apply to.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImageSeries"}]}},
)
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
colnames: Optional[str] = Field(
None,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -347,7 +381,7 @@ class PlaneSegmentationImageMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -376,7 +410,7 @@ class PlaneSegmentationPixelMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -406,7 +440,7 @@ class PlaneSegmentationVoxelMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -425,10 +459,137 @@ class ImagingPlane(NWBContainer):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[OpticalChannel]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "OpticalChannel"}]}}
)
name: str = Field(...)
description: Optional[str] = Field(None, description="""Description of the imaging plane.""")
excitation_lambda: float = Field(..., description="""Excitation wavelength, in nm.""")
imaging_rate: Optional[float] = Field(
None,
description="""Rate that images are acquired, in Hz. If the corresponding TimeSeries is present, the rate should be stored there instead.""",
)
indicator: str = Field(..., description="""Calcium indicator.""")
location: str = Field(
...,
description="""Location of the imaging plane. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
manifold: Optional[ImagingPlaneManifold] = Field(
None,
description="""DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.""",
)
origin_coords: Optional[ImagingPlaneOriginCoords] = Field(
None,
description="""Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).""",
)
grid_spacing: Optional[ImagingPlaneGridSpacing] = Field(
None,
description="""Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.""",
)
reference_frame: Optional[str] = Field(
None,
description="""Describes reference frame of origin_coords and grid_spacing. For example, this can be a text description of the anatomical location and orientation of the grid defined by origin_coords and grid_spacing or the vectors needed to transform or rotate the grid to a common anatomical axis (e.g., AP/DV/ML). This field is necessary to interpret origin_coords and grid_spacing. If origin_coords and grid_spacing are not present, then this field is not required. For example, if the microscope takes 10 x 10 x 2 images, where the first value of the data matrix (index (0, 0, 0)) corresponds to (-1.2, -0.6, -2) mm relative to bregma, the spacing between pixels is 0.2 mm in x, 0.2 mm in y and 0.5 mm in z, and larger numbers in x means more anterior, larger numbers in y means more rightward, and larger numbers in z means more ventral, then enter the following -- origin_coords = (-1.2, -0.6, -2) grid_spacing = (0.2, 0.2, 0.5) reference_frame = \"Origin coordinates are relative to bregma. First dimension corresponds to anterior-posterior axis (larger index = more anterior). Second dimension corresponds to medial-lateral axis (larger index = more rightward). Third dimension corresponds to dorsal-ventral axis (larger index = more ventral).\"""",
)
optical_channel: List[OpticalChannel] = Field(
..., description="""An optical channel used to record from an imaging plane."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ImagingPlaneManifold(ConfiguredBaseModel):
"""
DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["manifold"] = Field(
"manifold",
json_schema_extra={
"linkml_meta": {"equals_string": "manifold", "ifabsent": "string(manifold)"}
},
)
conversion: Optional[float] = Field(
None,
description="""Scalar to multiply each element in data to convert it to the specified 'unit'. If the data are stored in acquisition system units or other units that require a conversion to be interpretable, multiply the data by 'conversion' to convert the data to the specified 'unit'. e.g. if the data acquisition system stores values in this object as pixels from x = -500 to 499, y = -500 to 499 that correspond to a 2 m x 2 m range, then the 'conversion' multiplier to get from raw data acquisition pixel units to meters is 2/1000.""",
)
unit: Optional[str] = Field(
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'.""",
)
value: Optional[
Union[
NDArray[Shape["* height, * width, 3 x_y_z"], float],
NDArray[Shape["* height, * width, * depth, 3 x_y_z"], float],
]
] = Field(None)
class ImagingPlaneOriginCoords(ConfiguredBaseModel):
"""
Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["origin_coords"] = Field(
"origin_coords",
json_schema_extra={
"linkml_meta": {"equals_string": "origin_coords", "ifabsent": "string(origin_coords)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for origin_coords. The default value is 'meters'."""
)
value: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"array": {
"dimensions": [
{"alias": "x_y", "exact_cardinality": 2},
{"alias": "x_y_z", "exact_cardinality": 3},
]
}
}
},
)
class ImagingPlaneGridSpacing(ConfiguredBaseModel):
"""
Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["grid_spacing"] = Field(
"grid_spacing",
json_schema_extra={
"linkml_meta": {"equals_string": "grid_spacing", "ifabsent": "string(grid_spacing)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for grid_spacing. The default value is 'meters'."""
)
value: Optional[NDArray[Shape["2 x_y, 3 x_y_z"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"array": {
"dimensions": [
{"alias": "x_y", "exact_cardinality": 2},
{"alias": "x_y_z", "exact_cardinality": 3},
]
}
}
},
)
class OpticalChannel(NWBContainer):
@ -454,7 +615,7 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[CorrectedImageStack]] = Field(
value: Optional[List[CorrectedImageStack]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "CorrectedImageStack"}]}}
)
name: str = Field(...)
@ -477,6 +638,15 @@ class CorrectedImageStack(NWBDataInterface):
...,
description="""Stores the x,y delta necessary to align each frame to the common coordinates, for example, to align each frame to a reference image.""",
)
original: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
# Model rebuild
@ -491,6 +661,9 @@ PlaneSegmentationImageMask.model_rebuild()
PlaneSegmentationPixelMask.model_rebuild()
PlaneSegmentationVoxelMask.model_rebuild()
ImagingPlane.model_rebuild()
ImagingPlaneManifold.model_rebuild()
ImagingPlaneOriginCoords.model_rebuild()
ImagingPlaneGridSpacing.model_rebuild()
OpticalChannel.model_rebuild()
MotionCorrection.model_rebuild()
CorrectedImageStack.model_rebuild()

View file

@ -135,7 +135,7 @@ class ImagingRetinotopyAxis1PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -167,7 +167,7 @@ class ImagingRetinotopyAxis1PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -199,7 +199,7 @@ class ImagingRetinotopyAxis2PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -231,7 +231,7 @@ class ImagingRetinotopyAxis2PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -268,7 +268,7 @@ class ImagingRetinotopyFocalDepthImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -294,7 +294,7 @@ class ImagingRetinotopySignMap(ConfiguredBaseModel):
description="""Number of rows and columns in the image. NOTE: row, column representation is equivalent to height, width.""",
)
field_of_view: Optional[float] = Field(None, description="""Size of viewing area, in meters.""")
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -330,7 +330,7 @@ class ImagingRetinotopyVasculatureImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}

View file

@ -56,6 +56,9 @@ from ...core.v2_2_4.core_nwb_ophys import (
PlaneSegmentationPixelMask,
PlaneSegmentationVoxelMask,
ImagingPlane,
ImagingPlaneManifold,
ImagingPlaneOriginCoords,
ImagingPlaneGridSpacing,
OpticalChannel,
MotionCorrection,
CorrectedImageStack,
@ -138,6 +141,7 @@ from ...core.v2_2_4.core_nwb_file import (
GeneralExtracellularEphys,
ExtracellularEphysElectrodes,
GeneralIntracellularEphys,
NWBFileIntervals,
LabMetaData,
Subject,
)

View file

@ -87,7 +87,7 @@ class Image(NWBData):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -189,7 +189,7 @@ class TimeSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], Any],
NDArray[Shape["* num_times, * num_dim2"], Any],
@ -241,7 +241,7 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True}
)
children: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
None,
json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}

View file

@ -131,7 +131,7 @@ class SpatialSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -148,7 +148,7 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[IntervalSeries]] = Field(
value: Optional[List[IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
)
name: str = Field(...)
@ -163,7 +163,7 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -178,7 +178,7 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -193,7 +193,7 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -208,7 +208,7 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -223,7 +223,7 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -238,7 +238,7 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)

View file

@ -16,6 +16,7 @@ from pydantic import (
ValidationInfo,
BeforeValidator,
)
from ...core.v2_2_5.core_nwb_device import Device
from ...core.v2_2_5.core_nwb_base import (
TimeSeries,
TimeSeriesStartingTime,
@ -116,7 +117,12 @@ class ElectricalSeries(TimeSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -179,7 +185,12 @@ class SpikeEventSeries(ElectricalSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -256,7 +267,12 @@ class FeatureExtraction(NWBDataInterface):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
@ -287,6 +303,15 @@ class EventDetection(NWBDataInterface):
description="""Timestamps of events, in seconds.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_events"}]}}},
)
source_electricalseries: Union[ElectricalSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ElectricalSeries"}, {"range": "string"}],
}
},
)
class EventWaveform(NWBDataInterface):
@ -298,7 +323,7 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[SpikeEventSeries]] = Field(
value: Optional[List[SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
)
name: str = Field(...)
@ -313,7 +338,7 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -328,7 +353,7 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -352,6 +377,15 @@ class ElectrodeGroup(NWBContainer):
position: Optional[ElectrodeGroupPosition] = Field(
None, description="""stereotaxic or common framework coordinates"""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ElectrodeGroupPosition(ConfiguredBaseModel):
@ -406,6 +440,15 @@ class ClusterWaveforms(NWBDataInterface):
}
},
)
clustering_interface: Union[Clustering, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Clustering"}, {"range": "string"}],
}
},
)
class Clustering(NWBDataInterface):

View file

@ -127,7 +127,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for tags.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
timeseries: Optional[TimeIntervalsTimeseries] = Field(
@ -137,7 +142,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -187,7 +197,7 @@ class TimeIntervalsTimeseries(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -7,7 +7,6 @@ import sys
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator
import numpy as np
from ...core.v2_2_5.core_nwb_epoch import TimeIntervals
from ...core.v2_2_5.core_nwb_misc import Units
from ...core.v2_2_5.core_nwb_device import Device
from ...core.v2_2_5.core_nwb_ogen import OptogeneticStimulusSite
@ -16,6 +15,7 @@ from ...core.v2_2_5.core_nwb_ecephys import ElectrodeGroup
from numpydantic import NDArray, Shape
from ...hdmf_common.v1_1_3.hdmf_common_table import DynamicTable, VectorData, VectorIndex
from ...core.v2_2_5.core_nwb_icephys import IntracellularElectrode, SweepTable
from ...core.v2_2_5.core_nwb_epoch import TimeIntervals
from ...core.v2_2_5.core_nwb_base import (
NWBData,
NWBContainer,
@ -174,19 +174,9 @@ class NWBFile(NWBContainer):
...,
description="""Experimental metadata, including protocol, notes and description of hardware device(s). The metadata stored in this section should be used to describe the experiment. Metadata necessary for interpreting the data is stored with the data. General experimental metadata, including animal strain, experimental protocols, experimenter, devices, etc, are stored under 'general'. Core metadata (e.g., that required to interpret data fields) is stored with the data itself, and implicitly defined by the file specification (e.g., time is in seconds). The strategy used here for storing non-core metadata is to use free-form text fields, such as would appear in sentences or paragraphs from a Methods section. Metadata fields are text to enable them to be more general, for example to represent ranges instead of numerical values. Machine-readable metadata is stored as attributes to these free-form datasets. All entries in the below table are to be included when data is present. Unused groups (e.g., intracellular_ephys in an optophysiology experiment) should not be created unless there is data to store within them.""",
)
intervals: Optional[List[TimeIntervals]] = Field(
intervals: Optional[NWBFileIntervals] = Field(
None,
description="""Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.""",
json_schema_extra={
"linkml_meta": {
"any_of": [
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
]
}
},
)
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
@ -522,6 +512,35 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
)
class NWBFileIntervals(ConfiguredBaseModel):
"""
Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.file"})
name: Literal["intervals"] = Field(
"intervals",
json_schema_extra={
"linkml_meta": {"equals_string": "intervals", "ifabsent": "string(intervals)"}
},
)
epochs: Optional[TimeIntervals] = Field(
None,
description="""Divisions in time marking experimental stages or sub-divisions of a single recording session.""",
)
trials: Optional[TimeIntervals] = Field(
None, description="""Repeated experimental events that have a logical grouping."""
)
invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis."""
)
time_intervals: Optional[List[TimeIntervals]] = Field(
None,
description="""Optional additional table(s) for describing other experimental time intervals.""",
)
class LabMetaData(NWBContainer):
"""
Lab-specific meta-data.
@ -579,5 +598,6 @@ GeneralSourceScript.model_rebuild()
GeneralExtracellularEphys.model_rebuild()
ExtracellularEphysElectrodes.model_rebuild()
GeneralIntracellularEphys.model_rebuild()
NWBFileIntervals.model_rebuild()
LabMetaData.model_rebuild()
Subject.model_rebuild()

View file

@ -11,6 +11,7 @@ from ...core.v2_2_5.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_2_5.core_nwb_device import Device
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union, Annotated, Type, TypeVar
from pydantic import (
BaseModel,
@ -117,6 +118,15 @@ class PatchClampSeries(TimeSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -164,7 +174,7 @@ class PatchClampSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times"], float]] = Field(
value: Optional[NDArray[Shape["* num_times"], float]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
@ -195,6 +205,15 @@ class CurrentClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -271,6 +290,15 @@ class IZeroClampSeries(CurrentClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -324,6 +352,15 @@ class CurrentClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -416,6 +453,15 @@ class VoltageClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -648,6 +694,15 @@ class VoltageClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -724,6 +779,15 @@ class IntracellularElectrode(NWBContainer):
slice: Optional[str] = Field(
None, description="""Information about slice used for recording."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class SweepTable(DynamicTable):
@ -752,7 +816,12 @@ class SweepTable(DynamicTable):
...,
description="""Index for series.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(

View file

@ -75,7 +75,7 @@ class GrayscaleImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -98,7 +98,7 @@ class RGBImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -121,7 +121,7 @@ class RGBAImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -208,7 +208,7 @@ class ImageSeriesExternalFile(ConfiguredBaseModel):
None,
description="""Each external image may contain one or more consecutive frames of the full ImageSeries. This attribute serves as an index to indicate which frames each file contains, to faciliate random access. The 'starting_frame' attribute, hence, contains a list of frame numbers within the full ImageSeries of the first frame of each file listed in the parent 'external_file' dataset. Zero-based indexing is used (hence, the first element will always be zero). For example, if the 'external_file' dataset has three paths to files and the first file has 5 frames, the second file has 10 frames, and the third file has 20 frames, then this attribute will have values [0, 5, 15]. If there is a single external file that holds all of the frames of the ImageSeries (and so there is a single element in the 'external_file' dataset), then this attribute should have value [0].""",
)
array: Optional[NDArray[Shape["* num_files"], str]] = Field(
value: Optional[NDArray[Shape["* num_files"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_files"}]}}}
)
@ -223,6 +223,15 @@ class ImageMaskSeries(ImageSeries):
)
name: str = Field(...)
masked_imageseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -360,6 +369,15 @@ class IndexSeries(TimeSeries):
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
indexed_timeseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,

View file

@ -167,7 +167,7 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
None,
description="""Since there can be different units for different features, store the units in 'feature_units'. The default value for this attribute is \"see 'feature_units'\".""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -287,6 +287,15 @@ class DecompositionSeries(TimeSeries):
...,
description="""Table for describing the bands that this series was generated from. There should be one row in this table for each band.""",
)
source_timeseries: Optional[Union[TimeSeries, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "TimeSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -334,7 +343,7 @@ class DecompositionSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -428,7 +437,12 @@ class Units(DynamicTable):
None,
description="""Index into the spike_times dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
spike_times: Optional[UnitsSpikeTimes] = Field(
@ -438,7 +452,12 @@ class Units(DynamicTable):
None,
description="""Index into the obs_intervals dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
obs_intervals: Optional[NDArray[Shape["* num_intervals, 2 start_end"], float]] = Field(
@ -459,14 +478,24 @@ class Units(DynamicTable):
None,
description="""Index into electrodes.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrodes: Named[Optional[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrode_group: Optional[List[ElectrodeGroup]] = Field(
@ -524,7 +553,7 @@ class UnitsSpikeTimes(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -14,6 +14,7 @@ from ...core.v2_2_5.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_2_5.core_nwb_device import Device
metamodel_version = "None"
version = "2.2.5"
@ -81,6 +82,15 @@ class OptogeneticSeries(TimeSeries):
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
site: Union[OptogeneticStimulusSite, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "OptogeneticStimulusSite"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -129,6 +139,15 @@ class OptogeneticStimulusSite(NWBContainer):
...,
description="""Location of the stimulation site. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
# Model rebuild

View file

@ -21,8 +21,8 @@ from ...hdmf_common.v1_1_3.hdmf_common_table import (
VectorIndex,
VectorData,
)
from ...core.v2_2_5.core_nwb_device import Device
from numpydantic import NDArray, Shape
from ...core.v2_2_5.core_nwb_image import ImageSeries, ImageSeriesExternalFile
from ...core.v2_2_5.core_nwb_base import (
TimeSeriesStartingTime,
TimeSeriesSync,
@ -30,6 +30,7 @@ from ...core.v2_2_5.core_nwb_base import (
NWBDataInterface,
NWBContainer,
)
from ...core.v2_2_5.core_nwb_image import ImageSeries, ImageSeriesExternalFile
metamodel_version = "None"
version = "2.2.5"
@ -124,6 +125,15 @@ class TwoPhotonSeries(ImageSeries):
NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height_depth"], float]
]
] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""")
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -192,7 +202,12 @@ class RoiResponseSeries(TimeSeries):
...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
@ -236,7 +251,7 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -251,7 +266,7 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -266,7 +281,7 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[PlaneSegmentation]] = Field(
value: Optional[List[PlaneSegmentation]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "PlaneSegmentation"}]}}
)
name: str = Field(...)
@ -290,7 +305,12 @@ class PlaneSegmentation(DynamicTable):
None,
description="""Index into pixel_mask.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
pixel_mask: Optional[PlaneSegmentationPixelMask] = Field(
@ -301,7 +321,12 @@ class PlaneSegmentation(DynamicTable):
None,
description="""Index into voxel_mask.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
voxel_mask: Optional[PlaneSegmentationVoxelMask] = Field(
@ -313,6 +338,15 @@ class PlaneSegmentation(DynamicTable):
description="""Image stacks that the segmentation masks apply to.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImageSeries"}]}},
)
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
colnames: Optional[str] = Field(
None,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -349,7 +383,7 @@ class PlaneSegmentationImageMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -378,7 +412,7 @@ class PlaneSegmentationPixelMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -408,7 +442,7 @@ class PlaneSegmentationVoxelMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -427,10 +461,117 @@ class ImagingPlane(NWBContainer):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[OpticalChannel]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "OpticalChannel"}]}}
)
name: str = Field(...)
description: Optional[str] = Field(None, description="""Description of the imaging plane.""")
excitation_lambda: float = Field(..., description="""Excitation wavelength, in nm.""")
imaging_rate: Optional[float] = Field(
None,
description="""Rate that images are acquired, in Hz. If the corresponding TimeSeries is present, the rate should be stored there instead.""",
)
indicator: str = Field(..., description="""Calcium indicator.""")
location: str = Field(
...,
description="""Location of the imaging plane. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
manifold: Optional[ImagingPlaneManifold] = Field(
None,
description="""DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.""",
)
origin_coords: Optional[ImagingPlaneOriginCoords] = Field(
None,
description="""Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).""",
)
grid_spacing: Optional[ImagingPlaneGridSpacing] = Field(
None,
description="""Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.""",
)
reference_frame: Optional[str] = Field(
None,
description="""Describes reference frame of origin_coords and grid_spacing. For example, this can be a text description of the anatomical location and orientation of the grid defined by origin_coords and grid_spacing or the vectors needed to transform or rotate the grid to a common anatomical axis (e.g., AP/DV/ML). This field is necessary to interpret origin_coords and grid_spacing. If origin_coords and grid_spacing are not present, then this field is not required. For example, if the microscope takes 10 x 10 x 2 images, where the first value of the data matrix (index (0, 0, 0)) corresponds to (-1.2, -0.6, -2) mm relative to bregma, the spacing between pixels is 0.2 mm in x, 0.2 mm in y and 0.5 mm in z, and larger numbers in x means more anterior, larger numbers in y means more rightward, and larger numbers in z means more ventral, then enter the following -- origin_coords = (-1.2, -0.6, -2) grid_spacing = (0.2, 0.2, 0.5) reference_frame = \"Origin coordinates are relative to bregma. First dimension corresponds to anterior-posterior axis (larger index = more anterior). Second dimension corresponds to medial-lateral axis (larger index = more rightward). Third dimension corresponds to dorsal-ventral axis (larger index = more ventral).\"""",
)
optical_channel: List[OpticalChannel] = Field(
..., description="""An optical channel used to record from an imaging plane."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ImagingPlaneManifold(ConfiguredBaseModel):
"""
DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["manifold"] = Field(
"manifold",
json_schema_extra={
"linkml_meta": {"equals_string": "manifold", "ifabsent": "string(manifold)"}
},
)
conversion: Optional[float] = Field(
None,
description="""Scalar to multiply each element in data to convert it to the specified 'unit'. If the data are stored in acquisition system units or other units that require a conversion to be interpretable, multiply the data by 'conversion' to convert the data to the specified 'unit'. e.g. if the data acquisition system stores values in this object as pixels from x = -500 to 499, y = -500 to 499 that correspond to a 2 m x 2 m range, then the 'conversion' multiplier to get from raw data acquisition pixel units to meters is 2/1000.""",
)
unit: Optional[str] = Field(
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'.""",
)
value: Optional[
Union[
NDArray[Shape["* height, * width, 3 x_y_z"], float],
NDArray[Shape["* height, * width, * depth, 3 x_y_z"], float],
]
] = Field(None)
class ImagingPlaneOriginCoords(ConfiguredBaseModel):
"""
Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["origin_coords"] = Field(
"origin_coords",
json_schema_extra={
"linkml_meta": {"equals_string": "origin_coords", "ifabsent": "string(origin_coords)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for origin_coords. The default value is 'meters'."""
)
value: Optional[Union[NDArray[Shape["2 x_y"], float], NDArray[Shape["3 x_y_z"], float]]] = (
Field(None)
)
class ImagingPlaneGridSpacing(ConfiguredBaseModel):
"""
Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["grid_spacing"] = Field(
"grid_spacing",
json_schema_extra={
"linkml_meta": {"equals_string": "grid_spacing", "ifabsent": "string(grid_spacing)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for grid_spacing. The default value is 'meters'."""
)
value: Optional[Union[NDArray[Shape["2 x_y"], float], NDArray[Shape["3 x_y_z"], float]]] = (
Field(None)
)
class OpticalChannel(NWBContainer):
@ -456,7 +597,7 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[CorrectedImageStack]] = Field(
value: Optional[List[CorrectedImageStack]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "CorrectedImageStack"}]}}
)
name: str = Field(...)
@ -479,6 +620,15 @@ class CorrectedImageStack(NWBDataInterface):
...,
description="""Stores the x,y delta necessary to align each frame to the common coordinates, for example, to align each frame to a reference image.""",
)
original: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
# Model rebuild
@ -493,6 +643,9 @@ PlaneSegmentationImageMask.model_rebuild()
PlaneSegmentationPixelMask.model_rebuild()
PlaneSegmentationVoxelMask.model_rebuild()
ImagingPlane.model_rebuild()
ImagingPlaneManifold.model_rebuild()
ImagingPlaneOriginCoords.model_rebuild()
ImagingPlaneGridSpacing.model_rebuild()
OpticalChannel.model_rebuild()
MotionCorrection.model_rebuild()
CorrectedImageStack.model_rebuild()

View file

@ -135,7 +135,7 @@ class ImagingRetinotopyAxis1PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -167,7 +167,7 @@ class ImagingRetinotopyAxis1PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -199,7 +199,7 @@ class ImagingRetinotopyAxis2PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -231,7 +231,7 @@ class ImagingRetinotopyAxis2PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -268,7 +268,7 @@ class ImagingRetinotopyFocalDepthImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -294,7 +294,7 @@ class ImagingRetinotopySignMap(ConfiguredBaseModel):
description="""Number of rows and columns in the image. NOTE: row, column representation is equivalent to height, width.""",
)
field_of_view: Optional[float] = Field(None, description="""Size of viewing area, in meters.""")
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -330,7 +330,7 @@ class ImagingRetinotopyVasculatureImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}

View file

@ -56,6 +56,9 @@ from ...core.v2_2_5.core_nwb_ophys import (
PlaneSegmentationPixelMask,
PlaneSegmentationVoxelMask,
ImagingPlane,
ImagingPlaneManifold,
ImagingPlaneOriginCoords,
ImagingPlaneGridSpacing,
OpticalChannel,
MotionCorrection,
CorrectedImageStack,
@ -138,6 +141,7 @@ from ...core.v2_2_5.core_nwb_file import (
GeneralExtracellularEphys,
ExtracellularEphysElectrodes,
GeneralIntracellularEphys,
NWBFileIntervals,
LabMetaData,
Subject,
)

View file

@ -92,7 +92,7 @@ class Image(NWBData):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -198,7 +198,7 @@ class TimeSeriesData(ConfiguredBaseModel):
None,
description="""Optionally describe the continuity of the data. Can be \"continuous\", \"instantaneous\", or \"step\". For example, a voltage trace would be \"continuous\", because samples are recorded from a continuous process. An array of lick times would be \"instantaneous\", because the data represents distinct moments in time. Times of image presentations would be \"step\" because the picture remains the same until the next timepoint. This field is optional, but is useful in providing information about the underlying data. It may inform the way this data is interpreted, the way it is visualized, and what analysis methods are applicable.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], Any],
NDArray[Shape["* num_times, * num_dim2"], Any],
@ -250,7 +250,7 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True}
)
children: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
None,
json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}

View file

@ -131,7 +131,7 @@ class SpatialSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -148,7 +148,7 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[IntervalSeries]] = Field(
value: Optional[List[IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
)
name: str = Field(...)
@ -163,7 +163,7 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -178,7 +178,7 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -193,7 +193,7 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -208,7 +208,7 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -223,7 +223,7 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -238,7 +238,7 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)

View file

@ -16,6 +16,7 @@ from pydantic import (
ValidationInfo,
BeforeValidator,
)
from ...core.v2_3_0.core_nwb_device import Device
from ...core.v2_3_0.core_nwb_base import (
TimeSeries,
TimeSeriesStartingTime,
@ -120,7 +121,12 @@ class ElectricalSeries(TimeSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -187,7 +193,12 @@ class SpikeEventSeries(ElectricalSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -264,7 +275,12 @@ class FeatureExtraction(NWBDataInterface):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
@ -295,6 +311,15 @@ class EventDetection(NWBDataInterface):
description="""Timestamps of events, in seconds.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_events"}]}}},
)
source_electricalseries: Union[ElectricalSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ElectricalSeries"}, {"range": "string"}],
}
},
)
class EventWaveform(NWBDataInterface):
@ -306,7 +331,7 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[SpikeEventSeries]] = Field(
value: Optional[List[SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
)
name: str = Field(...)
@ -321,7 +346,7 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -336,7 +361,7 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -360,6 +385,15 @@ class ElectrodeGroup(NWBContainer):
position: Optional[ElectrodeGroupPosition] = Field(
None, description="""stereotaxic or common framework coordinates"""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ElectrodeGroupPosition(ConfiguredBaseModel):
@ -414,6 +448,15 @@ class ClusterWaveforms(NWBDataInterface):
}
},
)
clustering_interface: Union[Clustering, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Clustering"}, {"range": "string"}],
}
},
)
class Clustering(NWBDataInterface):

View file

@ -127,7 +127,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for tags.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
timeseries: Optional[TimeIntervalsTimeseries] = Field(
@ -137,7 +142,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -184,7 +194,7 @@ class TimeIntervalsTimeseries(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -7,7 +7,6 @@ import sys
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator
import numpy as np
from ...core.v2_3_0.core_nwb_epoch import TimeIntervals
from ...core.v2_3_0.core_nwb_misc import Units
from ...core.v2_3_0.core_nwb_device import Device
from ...core.v2_3_0.core_nwb_ogen import OptogeneticStimulusSite
@ -16,6 +15,7 @@ from ...core.v2_3_0.core_nwb_ecephys import ElectrodeGroup
from numpydantic import NDArray, Shape
from ...hdmf_common.v1_5_0.hdmf_common_table import DynamicTable, VectorData
from ...core.v2_3_0.core_nwb_icephys import IntracellularElectrode, SweepTable
from ...core.v2_3_0.core_nwb_epoch import TimeIntervals
from ...core.v2_3_0.core_nwb_base import (
NWBData,
NWBContainer,
@ -174,19 +174,9 @@ class NWBFile(NWBContainer):
...,
description="""Experimental metadata, including protocol, notes and description of hardware device(s). The metadata stored in this section should be used to describe the experiment. Metadata necessary for interpreting the data is stored with the data. General experimental metadata, including animal strain, experimental protocols, experimenter, devices, etc, are stored under 'general'. Core metadata (e.g., that required to interpret data fields) is stored with the data itself, and implicitly defined by the file specification (e.g., time is in seconds). The strategy used here for storing non-core metadata is to use free-form text fields, such as would appear in sentences or paragraphs from a Methods section. Metadata fields are text to enable them to be more general, for example to represent ranges instead of numerical values. Machine-readable metadata is stored as attributes to these free-form datasets. All entries in the below table are to be included when data is present. Unused groups (e.g., intracellular_ephys in an optophysiology experiment) should not be created unless there is data to store within them.""",
)
intervals: Optional[List[TimeIntervals]] = Field(
intervals: Optional[NWBFileIntervals] = Field(
None,
description="""Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.""",
json_schema_extra={
"linkml_meta": {
"any_of": [
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
]
}
},
)
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
@ -519,6 +509,35 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
)
class NWBFileIntervals(ConfiguredBaseModel):
"""
Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.file"})
name: Literal["intervals"] = Field(
"intervals",
json_schema_extra={
"linkml_meta": {"equals_string": "intervals", "ifabsent": "string(intervals)"}
},
)
epochs: Optional[TimeIntervals] = Field(
None,
description="""Divisions in time marking experimental stages or sub-divisions of a single recording session.""",
)
trials: Optional[TimeIntervals] = Field(
None, description="""Repeated experimental events that have a logical grouping."""
)
invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis."""
)
time_intervals: Optional[List[TimeIntervals]] = Field(
None,
description="""Optional additional table(s) for describing other experimental time intervals.""",
)
class LabMetaData(NWBContainer):
"""
Lab-specific meta-data.
@ -577,5 +596,6 @@ GeneralSourceScript.model_rebuild()
GeneralExtracellularEphys.model_rebuild()
ExtracellularEphysElectrodes.model_rebuild()
GeneralIntracellularEphys.model_rebuild()
NWBFileIntervals.model_rebuild()
LabMetaData.model_rebuild()
Subject.model_rebuild()

View file

@ -11,6 +11,7 @@ from ...core.v2_3_0.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_3_0.core_nwb_device import Device
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union, Annotated, Type, TypeVar
from pydantic import (
BaseModel,
@ -117,6 +118,15 @@ class PatchClampSeries(TimeSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -164,7 +174,7 @@ class PatchClampSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times"], float]] = Field(
value: Optional[NDArray[Shape["* num_times"], float]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
@ -195,6 +205,15 @@ class CurrentClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -272,6 +291,15 @@ class IZeroClampSeries(CurrentClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -325,6 +353,15 @@ class CurrentClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -417,6 +454,15 @@ class VoltageClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -649,6 +695,15 @@ class VoltageClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -725,6 +780,15 @@ class IntracellularElectrode(NWBContainer):
slice: Optional[str] = Field(
None, description="""Information about slice used for recording."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class SweepTable(DynamicTable):
@ -753,7 +817,12 @@ class SweepTable(DynamicTable):
...,
description="""Index for series.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(

View file

@ -7,6 +7,7 @@ import sys
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator
import numpy as np
from ...core.v2_3_0.core_nwb_device import Device
from numpydantic import NDArray, Shape
from ...core.v2_3_0.core_nwb_base import Image, TimeSeries, TimeSeriesStartingTime, TimeSeriesSync
@ -75,7 +76,7 @@ class GrayscaleImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -98,7 +99,7 @@ class RGBImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -121,7 +122,7 @@ class RGBAImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -159,6 +160,15 @@ class ImageSeries(TimeSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -208,7 +218,7 @@ class ImageSeriesExternalFile(ConfiguredBaseModel):
None,
description="""Each external image may contain one or more consecutive frames of the full ImageSeries. This attribute serves as an index to indicate which frames each file contains, to faciliate random access. The 'starting_frame' attribute, hence, contains a list of frame numbers within the full ImageSeries of the first frame of each file listed in the parent 'external_file' dataset. Zero-based indexing is used (hence, the first element will always be zero). For example, if the 'external_file' dataset has three paths to files and the first file has 5 frames, the second file has 10 frames, and the third file has 20 frames, then this attribute will have values [0, 5, 15]. If there is a single external file that holds all of the frames of the ImageSeries (and so there is a single element in the 'external_file' dataset), then this attribute should have value [0].""",
)
array: Optional[NDArray[Shape["* num_files"], str]] = Field(
value: Optional[NDArray[Shape["* num_files"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_files"}]}}}
)
@ -223,6 +233,15 @@ class ImageMaskSeries(ImageSeries):
)
name: str = Field(...)
masked_imageseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -242,6 +261,15 @@ class ImageMaskSeries(ImageSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -313,6 +341,15 @@ class OpticalSeries(ImageSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -360,6 +397,15 @@ class IndexSeries(TimeSeries):
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
indexed_timeseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,

View file

@ -167,7 +167,7 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
None,
description="""Since there can be different units for different features, store the units in 'feature_units'. The default value for this attribute is \"see 'feature_units'\".""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -287,13 +287,27 @@ class DecompositionSeries(TimeSeries):
None,
description="""DynamicTableRegion pointer to the channels that this decomposition series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
bands: DecompositionSeriesBands = Field(
...,
description="""Table for describing the bands that this series was generated from. There should be one row in this table for each band.""",
)
source_timeseries: Optional[Union[TimeSeries, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "TimeSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -341,7 +355,7 @@ class DecompositionSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -432,7 +446,12 @@ class Units(DynamicTable):
None,
description="""Index into the spike_times dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
spike_times: Optional[UnitsSpikeTimes] = Field(
@ -442,7 +461,12 @@ class Units(DynamicTable):
None,
description="""Index into the obs_intervals dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
obs_intervals: Optional[NDArray[Shape["* num_intervals, 2 start_end"], float]] = Field(
@ -463,14 +487,24 @@ class Units(DynamicTable):
None,
description="""Index into electrodes.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrodes: Named[Optional[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrode_group: Optional[List[ElectrodeGroup]] = Field(
@ -501,14 +535,24 @@ class Units(DynamicTable):
None,
description="""Index into the waveforms dataset. One value for every spike event. See 'waveforms' for more detail.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
waveforms_index_index: Named[Optional[VectorIndex]] = Field(
None,
description="""Index into the waveforms_index dataset. One value for every unit (row in the table). See 'waveforms' for more detail.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -548,7 +592,7 @@ class UnitsSpikeTimes(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -14,6 +14,7 @@ from ...core.v2_3_0.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_3_0.core_nwb_device import Device
metamodel_version = "None"
version = "2.3.0"
@ -81,6 +82,15 @@ class OptogeneticSeries(TimeSeries):
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
site: Union[OptogeneticStimulusSite, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "OptogeneticStimulusSite"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -129,6 +139,15 @@ class OptogeneticStimulusSite(NWBContainer):
...,
description="""Location of the stimulation site. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
# Model rebuild

View file

@ -21,8 +21,8 @@ from ...hdmf_common.v1_5_0.hdmf_common_table import (
VectorIndex,
VectorData,
)
from ...core.v2_3_0.core_nwb_device import Device
from numpydantic import NDArray, Shape
from ...core.v2_3_0.core_nwb_image import ImageSeries, ImageSeriesExternalFile
from ...core.v2_3_0.core_nwb_base import (
TimeSeriesStartingTime,
TimeSeriesSync,
@ -30,6 +30,7 @@ from ...core.v2_3_0.core_nwb_base import (
NWBDataInterface,
NWBContainer,
)
from ...core.v2_3_0.core_nwb_image import ImageSeries, ImageSeriesExternalFile
metamodel_version = "None"
version = "2.3.0"
@ -124,6 +125,15 @@ class TwoPhotonSeries(ImageSeries):
NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height_depth"], float]
]
] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""")
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
data: Optional[
Union[
NDArray[Shape["* frame, * x, * y"], float],
@ -143,6 +153,15 @@ class TwoPhotonSeries(ImageSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -192,7 +211,12 @@ class RoiResponseSeries(TimeSeries):
...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
@ -236,7 +260,7 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -251,7 +275,7 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -266,7 +290,7 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[PlaneSegmentation]] = Field(
value: Optional[List[PlaneSegmentation]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "PlaneSegmentation"}]}}
)
name: str = Field(...)
@ -290,7 +314,12 @@ class PlaneSegmentation(DynamicTable):
None,
description="""Index into pixel_mask.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
pixel_mask: Optional[PlaneSegmentationPixelMask] = Field(
@ -301,7 +330,12 @@ class PlaneSegmentation(DynamicTable):
None,
description="""Index into voxel_mask.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
voxel_mask: Optional[PlaneSegmentationVoxelMask] = Field(
@ -313,6 +347,15 @@ class PlaneSegmentation(DynamicTable):
description="""Image stacks that the segmentation masks apply to.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImageSeries"}]}},
)
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
colnames: Optional[str] = Field(
None,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -346,7 +389,7 @@ class PlaneSegmentationImageMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -375,7 +418,7 @@ class PlaneSegmentationPixelMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -405,7 +448,7 @@ class PlaneSegmentationVoxelMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -424,10 +467,117 @@ class ImagingPlane(NWBContainer):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[OpticalChannel]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "OpticalChannel"}]}}
)
name: str = Field(...)
description: Optional[str] = Field(None, description="""Description of the imaging plane.""")
excitation_lambda: float = Field(..., description="""Excitation wavelength, in nm.""")
imaging_rate: Optional[float] = Field(
None,
description="""Rate that images are acquired, in Hz. If the corresponding TimeSeries is present, the rate should be stored there instead.""",
)
indicator: str = Field(..., description="""Calcium indicator.""")
location: str = Field(
...,
description="""Location of the imaging plane. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
manifold: Optional[ImagingPlaneManifold] = Field(
None,
description="""DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.""",
)
origin_coords: Optional[ImagingPlaneOriginCoords] = Field(
None,
description="""Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).""",
)
grid_spacing: Optional[ImagingPlaneGridSpacing] = Field(
None,
description="""Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.""",
)
reference_frame: Optional[str] = Field(
None,
description="""Describes reference frame of origin_coords and grid_spacing. For example, this can be a text description of the anatomical location and orientation of the grid defined by origin_coords and grid_spacing or the vectors needed to transform or rotate the grid to a common anatomical axis (e.g., AP/DV/ML). This field is necessary to interpret origin_coords and grid_spacing. If origin_coords and grid_spacing are not present, then this field is not required. For example, if the microscope takes 10 x 10 x 2 images, where the first value of the data matrix (index (0, 0, 0)) corresponds to (-1.2, -0.6, -2) mm relative to bregma, the spacing between pixels is 0.2 mm in x, 0.2 mm in y and 0.5 mm in z, and larger numbers in x means more anterior, larger numbers in y means more rightward, and larger numbers in z means more ventral, then enter the following -- origin_coords = (-1.2, -0.6, -2) grid_spacing = (0.2, 0.2, 0.5) reference_frame = \"Origin coordinates are relative to bregma. First dimension corresponds to anterior-posterior axis (larger index = more anterior). Second dimension corresponds to medial-lateral axis (larger index = more rightward). Third dimension corresponds to dorsal-ventral axis (larger index = more ventral).\"""",
)
optical_channel: List[OpticalChannel] = Field(
..., description="""An optical channel used to record from an imaging plane."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ImagingPlaneManifold(ConfiguredBaseModel):
"""
DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["manifold"] = Field(
"manifold",
json_schema_extra={
"linkml_meta": {"equals_string": "manifold", "ifabsent": "string(manifold)"}
},
)
conversion: Optional[float] = Field(
None,
description="""Scalar to multiply each element in data to convert it to the specified 'unit'. If the data are stored in acquisition system units or other units that require a conversion to be interpretable, multiply the data by 'conversion' to convert the data to the specified 'unit'. e.g. if the data acquisition system stores values in this object as pixels from x = -500 to 499, y = -500 to 499 that correspond to a 2 m x 2 m range, then the 'conversion' multiplier to get from raw data acquisition pixel units to meters is 2/1000.""",
)
unit: Optional[str] = Field(
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'.""",
)
value: Optional[
Union[
NDArray[Shape["* height, * width, 3 x_y_z"], float],
NDArray[Shape["* height, * width, * depth, 3 x_y_z"], float],
]
] = Field(None)
class ImagingPlaneOriginCoords(ConfiguredBaseModel):
"""
Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["origin_coords"] = Field(
"origin_coords",
json_schema_extra={
"linkml_meta": {"equals_string": "origin_coords", "ifabsent": "string(origin_coords)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for origin_coords. The default value is 'meters'."""
)
value: Optional[Union[NDArray[Shape["2 x_y"], float], NDArray[Shape["3 x_y_z"], float]]] = (
Field(None)
)
class ImagingPlaneGridSpacing(ConfiguredBaseModel):
"""
Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["grid_spacing"] = Field(
"grid_spacing",
json_schema_extra={
"linkml_meta": {"equals_string": "grid_spacing", "ifabsent": "string(grid_spacing)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for grid_spacing. The default value is 'meters'."""
)
value: Optional[Union[NDArray[Shape["2 x_y"], float], NDArray[Shape["3 x_y_z"], float]]] = (
Field(None)
)
class OpticalChannel(NWBContainer):
@ -453,7 +603,7 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[CorrectedImageStack]] = Field(
value: Optional[List[CorrectedImageStack]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "CorrectedImageStack"}]}}
)
name: str = Field(...)
@ -476,6 +626,15 @@ class CorrectedImageStack(NWBDataInterface):
...,
description="""Stores the x,y delta necessary to align each frame to the common coordinates, for example, to align each frame to a reference image.""",
)
original: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
# Model rebuild
@ -490,6 +649,9 @@ PlaneSegmentationImageMask.model_rebuild()
PlaneSegmentationPixelMask.model_rebuild()
PlaneSegmentationVoxelMask.model_rebuild()
ImagingPlane.model_rebuild()
ImagingPlaneManifold.model_rebuild()
ImagingPlaneOriginCoords.model_rebuild()
ImagingPlaneGridSpacing.model_rebuild()
OpticalChannel.model_rebuild()
MotionCorrection.model_rebuild()
CorrectedImageStack.model_rebuild()

View file

@ -135,7 +135,7 @@ class ImagingRetinotopyAxis1PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -167,7 +167,7 @@ class ImagingRetinotopyAxis1PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -199,7 +199,7 @@ class ImagingRetinotopyAxis2PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -231,7 +231,7 @@ class ImagingRetinotopyAxis2PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -268,7 +268,7 @@ class ImagingRetinotopyFocalDepthImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -294,7 +294,7 @@ class ImagingRetinotopySignMap(ConfiguredBaseModel):
description="""Number of rows and columns in the image. NOTE: row, column representation is equivalent to height, width.""",
)
field_of_view: Optional[float] = Field(None, description="""Size of viewing area, in meters.""")
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -330,7 +330,7 @@ class ImagingRetinotopyVasculatureImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}

View file

@ -59,6 +59,9 @@ from ...core.v2_3_0.core_nwb_ophys import (
PlaneSegmentationPixelMask,
PlaneSegmentationVoxelMask,
ImagingPlane,
ImagingPlaneManifold,
ImagingPlaneOriginCoords,
ImagingPlaneGridSpacing,
OpticalChannel,
MotionCorrection,
CorrectedImageStack,
@ -141,6 +144,7 @@ from ...core.v2_3_0.core_nwb_file import (
GeneralExtracellularEphys,
ExtracellularEphysElectrodes,
GeneralIntracellularEphys,
NWBFileIntervals,
LabMetaData,
Subject,
)

View file

@ -102,7 +102,7 @@ class TimeSeriesReferenceVectorData(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -126,7 +126,7 @@ class Image(NWBData):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -232,7 +232,7 @@ class TimeSeriesData(ConfiguredBaseModel):
None,
description="""Optionally describe the continuity of the data. Can be \"continuous\", \"instantaneous\", or \"step\". For example, a voltage trace would be \"continuous\", because samples are recorded from a continuous process. An array of lick times would be \"instantaneous\", because the data represents distinct moments in time. Times of image presentations would be \"step\" because the picture remains the same until the next timepoint. This field is optional, but is useful in providing information about the underlying data. It may inform the way this data is interpreted, the way it is visualized, and what analysis methods are applicable.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], Any],
NDArray[Shape["* num_times, * num_dim2"], Any],
@ -284,7 +284,7 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True}
)
children: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
None,
json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}

View file

@ -131,7 +131,7 @@ class SpatialSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -148,7 +148,7 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[IntervalSeries]] = Field(
value: Optional[List[IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
)
name: str = Field(...)
@ -163,7 +163,7 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -178,7 +178,7 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -193,7 +193,7 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -208,7 +208,7 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -223,7 +223,7 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -238,7 +238,7 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)

View file

@ -16,6 +16,7 @@ from pydantic import (
ValidationInfo,
BeforeValidator,
)
from ...core.v2_4_0.core_nwb_device import Device
from ...core.v2_4_0.core_nwb_base import (
TimeSeries,
TimeSeriesStartingTime,
@ -120,7 +121,12 @@ class ElectricalSeries(TimeSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -187,7 +193,12 @@ class SpikeEventSeries(ElectricalSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -264,7 +275,12 @@ class FeatureExtraction(NWBDataInterface):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
@ -295,6 +311,15 @@ class EventDetection(NWBDataInterface):
description="""Timestamps of events, in seconds.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_events"}]}}},
)
source_electricalseries: Union[ElectricalSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ElectricalSeries"}, {"range": "string"}],
}
},
)
class EventWaveform(NWBDataInterface):
@ -306,7 +331,7 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[SpikeEventSeries]] = Field(
value: Optional[List[SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
)
name: str = Field(...)
@ -321,7 +346,7 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -336,7 +361,7 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -360,6 +385,15 @@ class ElectrodeGroup(NWBContainer):
position: Optional[ElectrodeGroupPosition] = Field(
None, description="""stereotaxic or common framework coordinates"""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ElectrodeGroupPosition(ConfiguredBaseModel):
@ -414,6 +448,15 @@ class ClusterWaveforms(NWBDataInterface):
}
},
)
clustering_interface: Union[Clustering, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Clustering"}, {"range": "string"}],
}
},
)
class Clustering(NWBDataInterface):

View file

@ -127,7 +127,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for tags.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
timeseries: Optional[TimeIntervalsTimeseries] = Field(
@ -137,7 +142,12 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -184,7 +194,7 @@ class TimeIntervalsTimeseries(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -7,7 +7,6 @@ import sys
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator
import numpy as np
from ...core.v2_4_0.core_nwb_epoch import TimeIntervals
from ...core.v2_4_0.core_nwb_misc import Units
from ...core.v2_4_0.core_nwb_device import Device
from ...core.v2_4_0.core_nwb_ogen import OptogeneticStimulusSite
@ -24,6 +23,7 @@ from ...core.v2_4_0.core_nwb_icephys import (
RepetitionsTable,
ExperimentalConditionsTable,
)
from ...core.v2_4_0.core_nwb_epoch import TimeIntervals
from ...core.v2_4_0.core_nwb_base import (
NWBData,
NWBContainer,
@ -182,19 +182,9 @@ class NWBFile(NWBContainer):
...,
description="""Experimental metadata, including protocol, notes and description of hardware device(s). The metadata stored in this section should be used to describe the experiment. Metadata necessary for interpreting the data is stored with the data. General experimental metadata, including animal strain, experimental protocols, experimenter, devices, etc, are stored under 'general'. Core metadata (e.g., that required to interpret data fields) is stored with the data itself, and implicitly defined by the file specification (e.g., time is in seconds). The strategy used here for storing non-core metadata is to use free-form text fields, such as would appear in sentences or paragraphs from a Methods section. Metadata fields are text to enable them to be more general, for example to represent ranges instead of numerical values. Machine-readable metadata is stored as attributes to these free-form datasets. All entries in the below table are to be included when data is present. Unused groups (e.g., intracellular_ephys in an optophysiology experiment) should not be created unless there is data to store within them.""",
)
intervals: Optional[List[TimeIntervals]] = Field(
intervals: Optional[NWBFileIntervals] = Field(
None,
description="""Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.""",
json_schema_extra={
"linkml_meta": {
"any_of": [
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
]
}
},
)
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
@ -548,6 +538,35 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
)
class NWBFileIntervals(ConfiguredBaseModel):
"""
Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.file"})
name: Literal["intervals"] = Field(
"intervals",
json_schema_extra={
"linkml_meta": {"equals_string": "intervals", "ifabsent": "string(intervals)"}
},
)
epochs: Optional[TimeIntervals] = Field(
None,
description="""Divisions in time marking experimental stages or sub-divisions of a single recording session.""",
)
trials: Optional[TimeIntervals] = Field(
None, description="""Repeated experimental events that have a logical grouping."""
)
invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis."""
)
time_intervals: Optional[List[TimeIntervals]] = Field(
None,
description="""Optional additional table(s) for describing other experimental time intervals.""",
)
class LabMetaData(NWBContainer):
"""
Lab-specific meta-data.
@ -606,5 +625,6 @@ GeneralSourceScript.model_rebuild()
GeneralExtracellularEphys.model_rebuild()
ExtracellularEphysElectrodes.model_rebuild()
GeneralIntracellularEphys.model_rebuild()
NWBFileIntervals.model_rebuild()
LabMetaData.model_rebuild()
Subject.model_rebuild()

View file

@ -5,6 +5,7 @@ from enum import Enum
import re
import sys
import numpy as np
from ...core.v2_4_0.core_nwb_device import Device
from ...core.v2_4_0.core_nwb_base import (
TimeSeries,
TimeSeriesStartingTime,
@ -124,6 +125,15 @@ class PatchClampSeries(TimeSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -171,7 +181,7 @@ class PatchClampSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times"], float]] = Field(
value: Optional[NDArray[Shape["* num_times"], float]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
@ -202,6 +212,15 @@ class CurrentClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -279,6 +298,15 @@ class IZeroClampSeries(CurrentClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -332,6 +360,15 @@ class CurrentClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -424,6 +461,15 @@ class VoltageClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -656,6 +702,15 @@ class VoltageClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -732,6 +787,15 @@ class IntracellularElectrode(NWBContainer):
slice: Optional[str] = Field(
None, description="""Information about slice used for recording."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class SweepTable(DynamicTable):
@ -760,7 +824,12 @@ class SweepTable(DynamicTable):
...,
description="""Index for series.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -827,7 +896,12 @@ class IntracellularStimuliTable(DynamicTable):
...,
description="""Column storing the reference to the recorded stimulus for the recording (rows).""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -861,7 +935,12 @@ class IntracellularResponsesTable(DynamicTable):
...,
description="""Column storing the reference to the recorded response for the recording (rows)""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -909,7 +988,7 @@ class IntracellularRecordingsTable(AlignedDynamicTable):
responses: IntracellularResponsesTable = Field(
..., description="""Table for storing intracellular response related metadata."""
)
children: Optional[List[DynamicTable]] = Field(
value: Optional[List[DynamicTable]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "DynamicTable"}]}}
)
colnames: Optional[str] = Field(
@ -952,7 +1031,12 @@ class SimultaneousRecordingsTable(DynamicTable):
...,
description="""Index dataset for the recordings column.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -992,7 +1076,7 @@ class SimultaneousRecordingsTableRecordings(DynamicTableRegion):
description: Optional[str] = Field(
None, description="""Description of what this table region points to."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -1028,7 +1112,12 @@ class SequentialRecordingsTable(DynamicTable):
...,
description="""Index dataset for the simultaneous_recordings column.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
stimulus_type: NDArray[Any, str] = Field(
@ -1080,7 +1169,7 @@ class SequentialRecordingsTableSimultaneousRecordings(DynamicTableRegion):
description: Optional[str] = Field(
None, description="""Description of what this table region points to."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -1113,7 +1202,12 @@ class RepetitionsTable(DynamicTable):
...,
description="""Index dataset for the sequential_recordings column.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -1156,7 +1250,7 @@ class RepetitionsTableSequentialRecordings(DynamicTableRegion):
description: Optional[str] = Field(
None, description="""Description of what this table region points to."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -1191,7 +1285,12 @@ class ExperimentalConditionsTable(DynamicTable):
...,
description="""Index dataset for the repetitions column.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -1231,7 +1330,7 @@ class ExperimentalConditionsTableRepetitions(DynamicTableRegion):
description: Optional[str] = Field(
None, description="""Description of what this table region points to."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -7,6 +7,7 @@ import sys
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator
import numpy as np
from ...core.v2_4_0.core_nwb_device import Device
from numpydantic import NDArray, Shape
from ...core.v2_4_0.core_nwb_base import Image, TimeSeries, TimeSeriesStartingTime, TimeSeriesSync
@ -75,7 +76,7 @@ class GrayscaleImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -98,7 +99,7 @@ class RGBImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -121,7 +122,7 @@ class RGBAImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -159,6 +160,15 @@ class ImageSeries(TimeSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -208,7 +218,7 @@ class ImageSeriesExternalFile(ConfiguredBaseModel):
None,
description="""Each external image may contain one or more consecutive frames of the full ImageSeries. This attribute serves as an index to indicate which frames each file contains, to faciliate random access. The 'starting_frame' attribute, hence, contains a list of frame numbers within the full ImageSeries of the first frame of each file listed in the parent 'external_file' dataset. Zero-based indexing is used (hence, the first element will always be zero). For example, if the 'external_file' dataset has three paths to files and the first file has 5 frames, the second file has 10 frames, and the third file has 20 frames, then this attribute will have values [0, 5, 15]. If there is a single external file that holds all of the frames of the ImageSeries (and so there is a single element in the 'external_file' dataset), then this attribute should have value [0].""",
)
array: Optional[NDArray[Shape["* num_files"], str]] = Field(
value: Optional[NDArray[Shape["* num_files"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_files"}]}}}
)
@ -223,6 +233,15 @@ class ImageMaskSeries(ImageSeries):
)
name: str = Field(...)
masked_imageseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
data: Union[
NDArray[Shape["* frame, * x, * y"], float], NDArray[Shape["* frame, * x, * y, * z"], float]
] = Field(
@ -242,6 +261,15 @@ class ImageMaskSeries(ImageSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -313,6 +341,15 @@ class OpticalSeries(ImageSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -360,6 +397,15 @@ class IndexSeries(TimeSeries):
description="""Index of the frame in the referenced ImageSeries.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
indexed_timeseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,

View file

@ -167,7 +167,7 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
None,
description="""Since there can be different units for different features, store the units in 'feature_units'. The default value for this attribute is \"see 'feature_units'\".""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -287,13 +287,27 @@ class DecompositionSeries(TimeSeries):
None,
description="""DynamicTableRegion pointer to the channels that this decomposition series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
bands: DecompositionSeriesBands = Field(
...,
description="""Table for describing the bands that this series was generated from. There should be one row in this table for each band.""",
)
source_timeseries: Optional[Union[TimeSeries, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "TimeSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -341,7 +355,7 @@ class DecompositionSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -432,7 +446,12 @@ class Units(DynamicTable):
None,
description="""Index into the spike_times dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
spike_times: Optional[UnitsSpikeTimes] = Field(
@ -442,7 +461,12 @@ class Units(DynamicTable):
None,
description="""Index into the obs_intervals dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
obs_intervals: Optional[NDArray[Shape["* num_intervals, 2 start_end"], float]] = Field(
@ -463,14 +487,24 @@ class Units(DynamicTable):
None,
description="""Index into electrodes.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrodes: Named[Optional[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrode_group: Optional[List[ElectrodeGroup]] = Field(
@ -501,14 +535,24 @@ class Units(DynamicTable):
None,
description="""Index into the waveforms dataset. One value for every spike event. See 'waveforms' for more detail.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
waveforms_index_index: Named[Optional[VectorIndex]] = Field(
None,
description="""Index into the waveforms_index dataset. One value for every unit (row in the table). See 'waveforms' for more detail.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -548,7 +592,7 @@ class UnitsSpikeTimes(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -14,6 +14,7 @@ from ...core.v2_4_0.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_4_0.core_nwb_device import Device
metamodel_version = "None"
version = "2.4.0"
@ -81,6 +82,15 @@ class OptogeneticSeries(TimeSeries):
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
site: Union[OptogeneticStimulusSite, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "OptogeneticStimulusSite"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -129,6 +139,15 @@ class OptogeneticStimulusSite(NWBContainer):
...,
description="""Location of the stimulation site. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
# Model rebuild

View file

@ -21,8 +21,8 @@ from ...hdmf_common.v1_5_0.hdmf_common_table import (
VectorIndex,
VectorData,
)
from ...core.v2_4_0.core_nwb_device import Device
from numpydantic import NDArray, Shape
from ...core.v2_4_0.core_nwb_image import ImageSeries, ImageSeriesExternalFile
from ...core.v2_4_0.core_nwb_base import (
TimeSeriesStartingTime,
TimeSeriesSync,
@ -30,6 +30,7 @@ from ...core.v2_4_0.core_nwb_base import (
NWBDataInterface,
NWBContainer,
)
from ...core.v2_4_0.core_nwb_image import ImageSeries, ImageSeriesExternalFile
metamodel_version = "None"
version = "2.4.0"
@ -124,6 +125,15 @@ class TwoPhotonSeries(ImageSeries):
NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height_depth"], float]
]
] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""")
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
data: Union[
NDArray[Shape["* frame, * x, * y"], float], NDArray[Shape["* frame, * x, * y, * z"], float]
] = Field(
@ -143,6 +153,15 @@ class TwoPhotonSeries(ImageSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -192,7 +211,12 @@ class RoiResponseSeries(TimeSeries):
...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
@ -236,7 +260,7 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -251,7 +275,7 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -266,7 +290,7 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[PlaneSegmentation]] = Field(
value: Optional[List[PlaneSegmentation]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "PlaneSegmentation"}]}}
)
name: str = Field(...)
@ -290,7 +314,12 @@ class PlaneSegmentation(DynamicTable):
None,
description="""Index into pixel_mask.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
pixel_mask: Optional[PlaneSegmentationPixelMask] = Field(
@ -301,7 +330,12 @@ class PlaneSegmentation(DynamicTable):
None,
description="""Index into voxel_mask.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
voxel_mask: Optional[PlaneSegmentationVoxelMask] = Field(
@ -313,6 +347,15 @@ class PlaneSegmentation(DynamicTable):
description="""Image stacks that the segmentation masks apply to.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImageSeries"}]}},
)
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
colnames: Optional[str] = Field(
None,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -346,7 +389,7 @@ class PlaneSegmentationImageMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -375,7 +418,7 @@ class PlaneSegmentationPixelMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -405,7 +448,7 @@ class PlaneSegmentationVoxelMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -424,10 +467,117 @@ class ImagingPlane(NWBContainer):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[OpticalChannel]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "OpticalChannel"}]}}
)
name: str = Field(...)
description: Optional[str] = Field(None, description="""Description of the imaging plane.""")
excitation_lambda: float = Field(..., description="""Excitation wavelength, in nm.""")
imaging_rate: Optional[float] = Field(
None,
description="""Rate that images are acquired, in Hz. If the corresponding TimeSeries is present, the rate should be stored there instead.""",
)
indicator: str = Field(..., description="""Calcium indicator.""")
location: str = Field(
...,
description="""Location of the imaging plane. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
manifold: Optional[ImagingPlaneManifold] = Field(
None,
description="""DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.""",
)
origin_coords: Optional[ImagingPlaneOriginCoords] = Field(
None,
description="""Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).""",
)
grid_spacing: Optional[ImagingPlaneGridSpacing] = Field(
None,
description="""Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.""",
)
reference_frame: Optional[str] = Field(
None,
description="""Describes reference frame of origin_coords and grid_spacing. For example, this can be a text description of the anatomical location and orientation of the grid defined by origin_coords and grid_spacing or the vectors needed to transform or rotate the grid to a common anatomical axis (e.g., AP/DV/ML). This field is necessary to interpret origin_coords and grid_spacing. If origin_coords and grid_spacing are not present, then this field is not required. For example, if the microscope takes 10 x 10 x 2 images, where the first value of the data matrix (index (0, 0, 0)) corresponds to (-1.2, -0.6, -2) mm relative to bregma, the spacing between pixels is 0.2 mm in x, 0.2 mm in y and 0.5 mm in z, and larger numbers in x means more anterior, larger numbers in y means more rightward, and larger numbers in z means more ventral, then enter the following -- origin_coords = (-1.2, -0.6, -2) grid_spacing = (0.2, 0.2, 0.5) reference_frame = \"Origin coordinates are relative to bregma. First dimension corresponds to anterior-posterior axis (larger index = more anterior). Second dimension corresponds to medial-lateral axis (larger index = more rightward). Third dimension corresponds to dorsal-ventral axis (larger index = more ventral).\"""",
)
optical_channel: List[OpticalChannel] = Field(
..., description="""An optical channel used to record from an imaging plane."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ImagingPlaneManifold(ConfiguredBaseModel):
"""
DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["manifold"] = Field(
"manifold",
json_schema_extra={
"linkml_meta": {"equals_string": "manifold", "ifabsent": "string(manifold)"}
},
)
conversion: Optional[float] = Field(
None,
description="""Scalar to multiply each element in data to convert it to the specified 'unit'. If the data are stored in acquisition system units or other units that require a conversion to be interpretable, multiply the data by 'conversion' to convert the data to the specified 'unit'. e.g. if the data acquisition system stores values in this object as pixels from x = -500 to 499, y = -500 to 499 that correspond to a 2 m x 2 m range, then the 'conversion' multiplier to get from raw data acquisition pixel units to meters is 2/1000.""",
)
unit: Optional[str] = Field(
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'.""",
)
value: Optional[
Union[
NDArray[Shape["* height, * width, 3 x_y_z"], float],
NDArray[Shape["* height, * width, * depth, 3 x_y_z"], float],
]
] = Field(None)
class ImagingPlaneOriginCoords(ConfiguredBaseModel):
"""
Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["origin_coords"] = Field(
"origin_coords",
json_schema_extra={
"linkml_meta": {"equals_string": "origin_coords", "ifabsent": "string(origin_coords)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for origin_coords. The default value is 'meters'."""
)
value: Optional[Union[NDArray[Shape["2 x_y"], float], NDArray[Shape["3 x_y_z"], float]]] = (
Field(None)
)
class ImagingPlaneGridSpacing(ConfiguredBaseModel):
"""
Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["grid_spacing"] = Field(
"grid_spacing",
json_schema_extra={
"linkml_meta": {"equals_string": "grid_spacing", "ifabsent": "string(grid_spacing)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for grid_spacing. The default value is 'meters'."""
)
value: Optional[Union[NDArray[Shape["2 x_y"], float], NDArray[Shape["3 x_y_z"], float]]] = (
Field(None)
)
class OpticalChannel(NWBContainer):
@ -453,7 +603,7 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[CorrectedImageStack]] = Field(
value: Optional[List[CorrectedImageStack]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "CorrectedImageStack"}]}}
)
name: str = Field(...)
@ -476,6 +626,15 @@ class CorrectedImageStack(NWBDataInterface):
...,
description="""Stores the x,y delta necessary to align each frame to the common coordinates, for example, to align each frame to a reference image.""",
)
original: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
# Model rebuild
@ -490,6 +649,9 @@ PlaneSegmentationImageMask.model_rebuild()
PlaneSegmentationPixelMask.model_rebuild()
PlaneSegmentationVoxelMask.model_rebuild()
ImagingPlane.model_rebuild()
ImagingPlaneManifold.model_rebuild()
ImagingPlaneOriginCoords.model_rebuild()
ImagingPlaneGridSpacing.model_rebuild()
OpticalChannel.model_rebuild()
MotionCorrection.model_rebuild()
CorrectedImageStack.model_rebuild()

View file

@ -135,7 +135,7 @@ class ImagingRetinotopyAxis1PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -167,7 +167,7 @@ class ImagingRetinotopyAxis1PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -199,7 +199,7 @@ class ImagingRetinotopyAxis2PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -231,7 +231,7 @@ class ImagingRetinotopyAxis2PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -268,7 +268,7 @@ class ImagingRetinotopyFocalDepthImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -294,7 +294,7 @@ class ImagingRetinotopySignMap(ConfiguredBaseModel):
description="""Number of rows and columns in the image. NOTE: row, column representation is equivalent to height, width.""",
)
field_of_view: Optional[float] = Field(None, description="""Size of viewing area, in meters.""")
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -330,7 +330,7 @@ class ImagingRetinotopyVasculatureImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}

View file

@ -60,6 +60,9 @@ from ...core.v2_4_0.core_nwb_ophys import (
PlaneSegmentationPixelMask,
PlaneSegmentationVoxelMask,
ImagingPlane,
ImagingPlaneManifold,
ImagingPlaneOriginCoords,
ImagingPlaneGridSpacing,
OpticalChannel,
MotionCorrection,
CorrectedImageStack,
@ -154,6 +157,7 @@ from ...core.v2_4_0.core_nwb_file import (
GeneralExtracellularEphys,
ExtracellularEphysElectrodes,
GeneralIntracellularEphys,
NWBFileIntervals,
LabMetaData,
Subject,
)

View file

@ -126,7 +126,7 @@ class TimeSeriesReferenceVectorData(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -150,7 +150,7 @@ class Image(NWBData):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -169,8 +169,14 @@ class ImageReferences(NWBData):
)
name: str = Field(...)
image: List[Image] = Field(
..., description="""Ordered dataset of references to Image objects."""
value: List[Image] = Field(
...,
description="""Ordered dataset of references to Image objects.""",
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "reference"}}
}
},
)
@ -275,7 +281,7 @@ class TimeSeriesData(ConfiguredBaseModel):
None,
description="""Optionally describe the continuity of the data. Can be \"continuous\", \"instantaneous\", or \"step\". For example, a voltage trace would be \"continuous\", because samples are recorded from a continuous process. An array of lick times would be \"instantaneous\", because the data represents distinct moments in time. Times of image presentations would be \"step\" because the picture remains the same until the next timepoint. This field is optional, but is useful in providing information about the underlying data. It may inform the way this data is interpreted, the way it is visualized, and what analysis methods are applicable.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], Any],
NDArray[Shape["* num_times, * num_dim2"], Any],
@ -327,7 +333,7 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True}
)
children: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
None,
json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
@ -354,7 +360,12 @@ class Images(NWBDataInterface):
None,
description="""Ordered dataset of references to Image objects stored in the parent group. Each Image object in the Images group should be stored once and only once, so the dataset should have the same length as the number of images.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)

View file

@ -131,7 +131,7 @@ class SpatialSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion' and add 'offset'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, 1 x"], float],
@ -150,7 +150,7 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[IntervalSeries]] = Field(
value: Optional[List[IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
)
name: str = Field(...)
@ -165,7 +165,7 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -180,7 +180,7 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -195,7 +195,7 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -210,7 +210,7 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -225,7 +225,7 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -240,7 +240,7 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)

View file

@ -16,6 +16,7 @@ from pydantic import (
ValidationInfo,
BeforeValidator,
)
from ...core.v2_5_0.core_nwb_device import Device
from ...core.v2_5_0.core_nwb_base import (
TimeSeries,
TimeSeriesStartingTime,
@ -120,7 +121,12 @@ class ElectricalSeries(TimeSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -187,7 +193,12 @@ class SpikeEventSeries(ElectricalSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -264,7 +275,12 @@ class FeatureExtraction(NWBDataInterface):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
@ -295,6 +311,15 @@ class EventDetection(NWBDataInterface):
description="""Timestamps of events, in seconds.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_events"}]}}},
)
source_electricalseries: Union[ElectricalSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ElectricalSeries"}, {"range": "string"}],
}
},
)
class EventWaveform(NWBDataInterface):
@ -306,7 +331,7 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[SpikeEventSeries]] = Field(
value: Optional[List[SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
)
name: str = Field(...)
@ -321,7 +346,7 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -336,7 +361,7 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -360,6 +385,15 @@ class ElectrodeGroup(NWBContainer):
position: Optional[ElectrodeGroupPosition] = Field(
None, description="""stereotaxic or common framework coordinates"""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ElectrodeGroupPosition(ConfiguredBaseModel):
@ -414,6 +448,15 @@ class ClusterWaveforms(NWBDataInterface):
}
},
)
clustering_interface: Union[Clustering, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Clustering"}, {"range": "string"}],
}
},
)
class Clustering(NWBDataInterface):

View file

@ -127,21 +127,36 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for tags.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
timeseries: Named[Optional[TimeSeriesReferenceVectorData]] = Field(
None,
description="""An index into a TimeSeries object.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
timeseries_index: Named[Optional[VectorIndex]] = Field(
None,
description="""Index for timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(

View file

@ -7,7 +7,6 @@ import sys
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator
import numpy as np
from ...core.v2_5_0.core_nwb_epoch import TimeIntervals
from ...core.v2_5_0.core_nwb_misc import Units
from ...core.v2_5_0.core_nwb_device import Device
from ...core.v2_5_0.core_nwb_ogen import OptogeneticStimulusSite
@ -24,6 +23,7 @@ from ...core.v2_5_0.core_nwb_icephys import (
RepetitionsTable,
ExperimentalConditionsTable,
)
from ...core.v2_5_0.core_nwb_epoch import TimeIntervals
from ...core.v2_5_0.core_nwb_base import (
NWBData,
NWBContainer,
@ -183,19 +183,9 @@ class NWBFile(NWBContainer):
...,
description="""Experimental metadata, including protocol, notes and description of hardware device(s). The metadata stored in this section should be used to describe the experiment. Metadata necessary for interpreting the data is stored with the data. General experimental metadata, including animal strain, experimental protocols, experimenter, devices, etc, are stored under 'general'. Core metadata (e.g., that required to interpret data fields) is stored with the data itself, and implicitly defined by the file specification (e.g., time is in seconds). The strategy used here for storing non-core metadata is to use free-form text fields, such as would appear in sentences or paragraphs from a Methods section. Metadata fields are text to enable them to be more general, for example to represent ranges instead of numerical values. Machine-readable metadata is stored as attributes to these free-form datasets. All entries in the below table are to be included when data is present. Unused groups (e.g., intracellular_ephys in an optophysiology experiment) should not be created unless there is data to store within them.""",
)
intervals: Optional[List[TimeIntervals]] = Field(
intervals: Optional[NWBFileIntervals] = Field(
None,
description="""Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.""",
json_schema_extra={
"linkml_meta": {
"any_of": [
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
{"range": "TimeIntervals"},
]
}
},
)
units: Optional[Units] = Field(None, description="""Data about sorted spike units.""")
@ -551,6 +541,35 @@ class GeneralIntracellularEphys(ConfiguredBaseModel):
)
class NWBFileIntervals(ConfiguredBaseModel):
"""
Experimental intervals, whether that be logically distinct sub-experiments having a particular scientific goal, trials (see trials subgroup) during an experiment, or epochs (see epochs subgroup) deriving from analysis of data.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.file"})
name: Literal["intervals"] = Field(
"intervals",
json_schema_extra={
"linkml_meta": {"equals_string": "intervals", "ifabsent": "string(intervals)"}
},
)
epochs: Optional[TimeIntervals] = Field(
None,
description="""Divisions in time marking experimental stages or sub-divisions of a single recording session.""",
)
trials: Optional[TimeIntervals] = Field(
None, description="""Repeated experimental events that have a logical grouping."""
)
invalid_times: Optional[TimeIntervals] = Field(
None, description="""Time intervals that should be removed from analysis."""
)
time_intervals: Optional[List[TimeIntervals]] = Field(
None,
description="""Optional additional table(s) for describing other experimental time intervals.""",
)
class LabMetaData(NWBContainer):
"""
Lab-specific meta-data.
@ -609,5 +628,6 @@ GeneralSourceScript.model_rebuild()
GeneralExtracellularEphys.model_rebuild()
ExtracellularEphysElectrodes.model_rebuild()
GeneralIntracellularEphys.model_rebuild()
NWBFileIntervals.model_rebuild()
LabMetaData.model_rebuild()
Subject.model_rebuild()

View file

@ -5,6 +5,7 @@ from enum import Enum
import re
import sys
import numpy as np
from ...core.v2_5_0.core_nwb_device import Device
from ...core.v2_5_0.core_nwb_base import (
TimeSeries,
TimeSeriesStartingTime,
@ -124,6 +125,15 @@ class PatchClampSeries(TimeSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -171,7 +181,7 @@ class PatchClampSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion' and add 'offset'.""",
)
array: Optional[NDArray[Shape["* num_times"], float]] = Field(
value: Optional[NDArray[Shape["* num_times"], float]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}}
)
@ -202,6 +212,15 @@ class CurrentClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -279,6 +298,15 @@ class IZeroClampSeries(CurrentClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -332,6 +360,15 @@ class CurrentClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -424,6 +461,15 @@ class VoltageClampSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -656,6 +702,15 @@ class VoltageClampStimulusSeries(PatchClampSeries):
None,
description="""Gain of the recording, in units Volt/Amp (v-clamp) or Volt/Volt (c-clamp).""",
)
electrode: Union[IntracellularElectrode, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "IntracellularElectrode"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -733,6 +788,15 @@ class IntracellularElectrode(NWBContainer):
slice: Optional[str] = Field(
None, description="""Information about slice used for recording."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class SweepTable(DynamicTable):
@ -761,7 +825,12 @@ class SweepTable(DynamicTable):
...,
description="""Index for series.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -828,7 +897,12 @@ class IntracellularStimuliTable(DynamicTable):
...,
description="""Column storing the reference to the recorded stimulus for the recording (rows).""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -862,7 +936,12 @@ class IntracellularResponsesTable(DynamicTable):
...,
description="""Column storing the reference to the recorded response for the recording (rows)""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -910,7 +989,7 @@ class IntracellularRecordingsTable(AlignedDynamicTable):
responses: IntracellularResponsesTable = Field(
..., description="""Table for storing intracellular response related metadata."""
)
children: Optional[List[DynamicTable]] = Field(
value: Optional[List[DynamicTable]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "DynamicTable"}]}}
)
colnames: Optional[str] = Field(
@ -953,7 +1032,12 @@ class SimultaneousRecordingsTable(DynamicTable):
...,
description="""Index dataset for the recordings column.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -993,7 +1077,7 @@ class SimultaneousRecordingsTableRecordings(DynamicTableRegion):
description: Optional[str] = Field(
None, description="""Description of what this table region points to."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -1029,7 +1113,12 @@ class SequentialRecordingsTable(DynamicTable):
...,
description="""Index dataset for the simultaneous_recordings column.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
stimulus_type: NDArray[Any, str] = Field(
@ -1081,7 +1170,7 @@ class SequentialRecordingsTableSimultaneousRecordings(DynamicTableRegion):
description: Optional[str] = Field(
None, description="""Description of what this table region points to."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -1114,7 +1203,12 @@ class RepetitionsTable(DynamicTable):
...,
description="""Index dataset for the sequential_recordings column.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -1157,7 +1251,7 @@ class RepetitionsTableSequentialRecordings(DynamicTableRegion):
description: Optional[str] = Field(
None, description="""Description of what this table region points to."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -1192,7 +1286,12 @@ class ExperimentalConditionsTable(DynamicTable):
...,
description="""Index dataset for the repetitions column.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -1232,7 +1331,7 @@ class ExperimentalConditionsTableRepetitions(DynamicTableRegion):
description: Optional[str] = Field(
None, description="""Description of what this table region points to."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -7,8 +7,15 @@ import sys
from typing import Any, ClassVar, List, Literal, Dict, Optional, Union
from pydantic import BaseModel, ConfigDict, Field, RootModel, field_validator
import numpy as np
from ...core.v2_5_0.core_nwb_device import Device
from numpydantic import NDArray, Shape
from ...core.v2_5_0.core_nwb_base import Image, TimeSeries, TimeSeriesStartingTime, TimeSeriesSync
from ...core.v2_5_0.core_nwb_base import (
Image,
TimeSeries,
TimeSeriesStartingTime,
TimeSeriesSync,
Images,
)
metamodel_version = "None"
version = "2.5.0"
@ -75,7 +82,7 @@ class GrayscaleImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -98,7 +105,7 @@ class RGBImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -121,7 +128,7 @@ class RGBAImage(Image):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -159,6 +166,15 @@ class ImageSeries(TimeSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -208,7 +224,7 @@ class ImageSeriesExternalFile(ConfiguredBaseModel):
None,
description="""Each external image may contain one or more consecutive frames of the full ImageSeries. This attribute serves as an index to indicate which frames each file contains, to faciliate random access. The 'starting_frame' attribute, hence, contains a list of frame numbers within the full ImageSeries of the first frame of each file listed in the parent 'external_file' dataset. Zero-based indexing is used (hence, the first element will always be zero). For example, if the 'external_file' dataset has three paths to files and the first file has 5 frames, the second file has 10 frames, and the third file has 20 frames, then this attribute will have values [0, 5, 15]. If there is a single external file that holds all of the frames of the ImageSeries (and so there is a single element in the 'external_file' dataset), then this attribute should have value [0].""",
)
array: Optional[NDArray[Shape["* num_files"], str]] = Field(
value: Optional[NDArray[Shape["* num_files"], str]] = Field(
None, json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_files"}]}}}
)
@ -223,6 +239,15 @@ class ImageMaskSeries(ImageSeries):
)
name: str = Field(...)
masked_imageseries: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
data: Union[
NDArray[Shape["* frame, * x, * y"], float], NDArray[Shape["* frame, * x, * y, * z"], float]
] = Field(
@ -242,6 +267,15 @@ class ImageMaskSeries(ImageSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -313,6 +347,15 @@ class OpticalSeries(ImageSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -360,6 +403,24 @@ class IndexSeries(TimeSeries):
description="""Index of the image (using zero-indexing) in the linked Images object.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
indexed_timeseries: Optional[Union[ImageSeries, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
indexed_images: Optional[Union[Images, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Images"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,

View file

@ -167,7 +167,7 @@ class AbstractFeatureSeriesData(ConfiguredBaseModel):
None,
description="""Since there can be different units for different features, store the units in 'feature_units'. The default value for this attribute is \"see 'feature_units'\".""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, * num_features"], float],
@ -287,13 +287,27 @@ class DecompositionSeries(TimeSeries):
None,
description="""DynamicTableRegion pointer to the channels that this decomposition series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
bands: DecompositionSeriesBands = Field(
...,
description="""Table for describing the bands that this series was generated from. There should be one row in this table for each band.""",
)
source_timeseries: Optional[Union[TimeSeries, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "TimeSeries"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -341,7 +355,7 @@ class DecompositionSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion'.""",
)
array: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
value: Optional[NDArray[Shape["* num_times, * num_channels, * num_bands"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {
@ -432,7 +446,12 @@ class Units(DynamicTable):
None,
description="""Index into the spike_times dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
spike_times: Optional[UnitsSpikeTimes] = Field(
@ -442,7 +461,12 @@ class Units(DynamicTable):
None,
description="""Index into the obs_intervals dataset.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
obs_intervals: Optional[NDArray[Shape["* num_intervals, 2 start_end"], float]] = Field(
@ -463,14 +487,24 @@ class Units(DynamicTable):
None,
description="""Index into electrodes.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrodes: Named[Optional[DynamicTableRegion]] = Field(
None,
description="""Electrode that each spike unit came from, specified using a DynamicTableRegion.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
electrode_group: Optional[List[ElectrodeGroup]] = Field(
@ -501,14 +535,24 @@ class Units(DynamicTable):
None,
description="""Index into the waveforms dataset. One value for every spike event. See 'waveforms' for more detail.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
waveforms_index_index: Named[Optional[VectorIndex]] = Field(
None,
description="""Index into the waveforms_index dataset. One value for every unit (row in the table). See 'waveforms' for more detail.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(
@ -548,7 +592,7 @@ class UnitsSpikeTimes(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],

View file

@ -14,6 +14,7 @@ from ...core.v2_5_0.core_nwb_base import (
TimeSeriesSync,
NWBContainer,
)
from ...core.v2_5_0.core_nwb_device import Device
metamodel_version = "None"
version = "2.5.0"
@ -81,6 +82,15 @@ class OptogeneticSeries(TimeSeries):
description="""Applied power for optogenetic stimulus, in watts.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_times"}]}}},
)
site: Union[OptogeneticStimulusSite, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "OptogeneticStimulusSite"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -129,6 +139,15 @@ class OptogeneticStimulusSite(NWBContainer):
...,
description="""Location of the stimulation site. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
# Model rebuild

View file

@ -21,8 +21,8 @@ from ...hdmf_common.v1_5_0.hdmf_common_table import (
VectorIndex,
VectorData,
)
from ...core.v2_5_0.core_nwb_device import Device
from numpydantic import NDArray, Shape
from ...core.v2_5_0.core_nwb_image import ImageSeries, ImageSeriesExternalFile
from ...core.v2_5_0.core_nwb_base import (
TimeSeriesStartingTime,
TimeSeriesSync,
@ -30,6 +30,7 @@ from ...core.v2_5_0.core_nwb_base import (
NWBDataInterface,
NWBContainer,
)
from ...core.v2_5_0.core_nwb_image import ImageSeries, ImageSeriesExternalFile
metamodel_version = "None"
version = "2.5.0"
@ -124,6 +125,15 @@ class TwoPhotonSeries(ImageSeries):
NDArray[Shape["2 width_height"], float], NDArray[Shape["3 width_height_depth"], float]
]
] = Field(None, description="""Width, height and depth of image, or imaged area, in meters.""")
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
data: Union[
NDArray[Shape["* frame, * x, * y"], float], NDArray[Shape["* frame, * x, * y, * z"], float]
] = Field(
@ -143,6 +153,15 @@ class TwoPhotonSeries(ImageSeries):
None,
description="""Format of image. If this is 'external', then the attribute 'external_file' contains the path information to the image files. If this is 'raw', then the raw (single-channel) binary data is stored in the 'data' dataset. If this attribute is not present, then the default format='raw' case is assumed.""",
)
device: Optional[Union[Device, str]] = Field(
None,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
comments: Optional[str] = Field(
None,
@ -192,7 +211,12 @@ class RoiResponseSeries(TimeSeries):
...,
description="""DynamicTableRegion referencing into an ROITable containing information on the ROIs stored in this timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
description: Optional[str] = Field(None, description="""Description of the time series.""")
@ -236,7 +260,7 @@ class DfOverF(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -251,7 +275,7 @@ class Fluorescence(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[RoiResponseSeries]] = Field(
value: Optional[List[RoiResponseSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "RoiResponseSeries"}]}}
)
name: str = Field(...)
@ -266,7 +290,7 @@ class ImageSegmentation(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[PlaneSegmentation]] = Field(
value: Optional[List[PlaneSegmentation]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "PlaneSegmentation"}]}}
)
name: str = Field(...)
@ -290,7 +314,12 @@ class PlaneSegmentation(DynamicTable):
None,
description="""Index into pixel_mask.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
pixel_mask: Optional[PlaneSegmentationPixelMask] = Field(
@ -301,7 +330,12 @@ class PlaneSegmentation(DynamicTable):
None,
description="""Index into voxel_mask.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
voxel_mask: Optional[PlaneSegmentationVoxelMask] = Field(
@ -313,6 +347,15 @@ class PlaneSegmentation(DynamicTable):
description="""Image stacks that the segmentation masks apply to.""",
json_schema_extra={"linkml_meta": {"any_of": [{"range": "ImageSeries"}]}},
)
imaging_plane: Union[ImagingPlane, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImagingPlane"}, {"range": "string"}],
}
},
)
colnames: Optional[str] = Field(
None,
description="""The names of the columns in this table. This should be used to specify an order to the columns.""",
@ -346,7 +389,7 @@ class PlaneSegmentationImageMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -375,7 +418,7 @@ class PlaneSegmentationPixelMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -405,7 +448,7 @@ class PlaneSegmentationVoxelMask(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -424,10 +467,117 @@ class ImagingPlane(NWBContainer):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[OpticalChannel]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "OpticalChannel"}]}}
)
name: str = Field(...)
description: Optional[str] = Field(None, description="""Description of the imaging plane.""")
excitation_lambda: float = Field(..., description="""Excitation wavelength, in nm.""")
imaging_rate: Optional[float] = Field(
None,
description="""Rate that images are acquired, in Hz. If the corresponding TimeSeries is present, the rate should be stored there instead.""",
)
indicator: str = Field(..., description="""Calcium indicator.""")
location: str = Field(
...,
description="""Location of the imaging plane. Specify the area, layer, comments on estimation of area/layer, stereotaxic coordinates if in vivo, etc. Use standard atlas names for anatomical regions when possible.""",
)
manifold: Optional[ImagingPlaneManifold] = Field(
None,
description="""DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.""",
)
origin_coords: Optional[ImagingPlaneOriginCoords] = Field(
None,
description="""Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).""",
)
grid_spacing: Optional[ImagingPlaneGridSpacing] = Field(
None,
description="""Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.""",
)
reference_frame: Optional[str] = Field(
None,
description="""Describes reference frame of origin_coords and grid_spacing. For example, this can be a text description of the anatomical location and orientation of the grid defined by origin_coords and grid_spacing or the vectors needed to transform or rotate the grid to a common anatomical axis (e.g., AP/DV/ML). This field is necessary to interpret origin_coords and grid_spacing. If origin_coords and grid_spacing are not present, then this field is not required. For example, if the microscope takes 10 x 10 x 2 images, where the first value of the data matrix (index (0, 0, 0)) corresponds to (-1.2, -0.6, -2) mm relative to bregma, the spacing between pixels is 0.2 mm in x, 0.2 mm in y and 0.5 mm in z, and larger numbers in x means more anterior, larger numbers in y means more rightward, and larger numbers in z means more ventral, then enter the following -- origin_coords = (-1.2, -0.6, -2) grid_spacing = (0.2, 0.2, 0.5) reference_frame = \"Origin coordinates are relative to bregma. First dimension corresponds to anterior-posterior axis (larger index = more anterior). Second dimension corresponds to medial-lateral axis (larger index = more rightward). Third dimension corresponds to dorsal-ventral axis (larger index = more ventral).\"""",
)
optical_channel: List[OpticalChannel] = Field(
..., description="""An optical channel used to record from an imaging plane."""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ImagingPlaneManifold(ConfiguredBaseModel):
"""
DEPRECATED Physical position of each pixel. 'xyz' represents the position of the pixel relative to the defined coordinate space. Deprecated in favor of origin_coords and grid_spacing.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["manifold"] = Field(
"manifold",
json_schema_extra={
"linkml_meta": {"equals_string": "manifold", "ifabsent": "string(manifold)"}
},
)
conversion: Optional[float] = Field(
None,
description="""Scalar to multiply each element in data to convert it to the specified 'unit'. If the data are stored in acquisition system units or other units that require a conversion to be interpretable, multiply the data by 'conversion' to convert the data to the specified 'unit'. e.g. if the data acquisition system stores values in this object as pixels from x = -500 to 499, y = -500 to 499 that correspond to a 2 m x 2 m range, then the 'conversion' multiplier to get from raw data acquisition pixel units to meters is 2/1000.""",
)
unit: Optional[str] = Field(
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'.""",
)
value: Optional[
Union[
NDArray[Shape["* height, * width, 3 x_y_z"], float],
NDArray[Shape["* height, * width, * depth, 3 x_y_z"], float],
]
] = Field(None)
class ImagingPlaneOriginCoords(ConfiguredBaseModel):
"""
Physical location of the first element of the imaging plane (0, 0) for 2-D data or (0, 0, 0) for 3-D data. See also reference_frame for what the physical location is relative to (e.g., bregma).
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["origin_coords"] = Field(
"origin_coords",
json_schema_extra={
"linkml_meta": {"equals_string": "origin_coords", "ifabsent": "string(origin_coords)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for origin_coords. The default value is 'meters'."""
)
value: Optional[Union[NDArray[Shape["2 x_y"], float], NDArray[Shape["3 x_y_z"], float]]] = (
Field(None)
)
class ImagingPlaneGridSpacing(ConfiguredBaseModel):
"""
Space between pixels in (x, y) or voxels in (x, y, z) directions, in the specified unit. Assumes imaging plane is a regular grid. See also reference_frame to interpret the grid.
"""
linkml_meta: ClassVar[LinkMLMeta] = LinkMLMeta({"from_schema": "core.nwb.ophys"})
name: Literal["grid_spacing"] = Field(
"grid_spacing",
json_schema_extra={
"linkml_meta": {"equals_string": "grid_spacing", "ifabsent": "string(grid_spacing)"}
},
)
unit: Optional[str] = Field(
None, description="""Measurement units for grid_spacing. The default value is 'meters'."""
)
value: Optional[Union[NDArray[Shape["2 x_y"], float], NDArray[Shape["3 x_y_z"], float]]] = (
Field(None)
)
class OpticalChannel(NWBContainer):
@ -453,7 +603,7 @@ class MotionCorrection(NWBDataInterface):
{"from_schema": "core.nwb.ophys", "tree_root": True}
)
children: Optional[List[CorrectedImageStack]] = Field(
value: Optional[List[CorrectedImageStack]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "CorrectedImageStack"}]}}
)
name: str = Field(...)
@ -476,6 +626,15 @@ class CorrectedImageStack(NWBDataInterface):
...,
description="""Stores the x,y delta necessary to align each frame to the common coordinates, for example, to align each frame to a reference image.""",
)
original: Union[ImageSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ImageSeries"}, {"range": "string"}],
}
},
)
# Model rebuild
@ -490,6 +649,9 @@ PlaneSegmentationImageMask.model_rebuild()
PlaneSegmentationPixelMask.model_rebuild()
PlaneSegmentationVoxelMask.model_rebuild()
ImagingPlane.model_rebuild()
ImagingPlaneManifold.model_rebuild()
ImagingPlaneOriginCoords.model_rebuild()
ImagingPlaneGridSpacing.model_rebuild()
OpticalChannel.model_rebuild()
MotionCorrection.model_rebuild()
CorrectedImageStack.model_rebuild()

View file

@ -135,7 +135,7 @@ class ImagingRetinotopyAxis1PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -167,7 +167,7 @@ class ImagingRetinotopyAxis1PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -199,7 +199,7 @@ class ImagingRetinotopyAxis2PhaseMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -231,7 +231,7 @@ class ImagingRetinotopyAxis2PowerMap(ConfiguredBaseModel):
unit: Optional[str] = Field(
None, description="""Unit that axis data is stored in (e.g., degrees)."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -268,7 +268,7 @@ class ImagingRetinotopyFocalDepthImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -294,7 +294,7 @@ class ImagingRetinotopySignMap(ConfiguredBaseModel):
description="""Number of rows and columns in the image. NOTE: row, column representation is equivalent to height, width.""",
)
field_of_view: Optional[float] = Field(None, description="""Size of viewing area, in meters.""")
array: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], float]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}
@ -330,7 +330,7 @@ class ImagingRetinotopyVasculatureImage(ConfiguredBaseModel):
format: Optional[str] = Field(
None, description="""Format of image. Right now only 'raw' is supported."""
)
array: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
value: Optional[NDArray[Shape["* num_rows, * num_cols"], int]] = Field(
None,
json_schema_extra={
"linkml_meta": {"array": {"dimensions": [{"alias": "num_rows"}, {"alias": "num_cols"}]}}

View file

@ -61,6 +61,9 @@ from ...core.v2_5_0.core_nwb_ophys import (
PlaneSegmentationPixelMask,
PlaneSegmentationVoxelMask,
ImagingPlane,
ImagingPlaneManifold,
ImagingPlaneOriginCoords,
ImagingPlaneGridSpacing,
OpticalChannel,
MotionCorrection,
CorrectedImageStack,
@ -155,6 +158,7 @@ from ...core.v2_5_0.core_nwb_file import (
GeneralExtracellularEphys,
ExtracellularEphysElectrodes,
GeneralIntracellularEphys,
NWBFileIntervals,
LabMetaData,
Subject,
)

View file

@ -126,7 +126,7 @@ class TimeSeriesReferenceVectorData(VectorData):
description: Optional[str] = Field(
None, description="""Description of what these vectors represent."""
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* dim0"], Any],
NDArray[Shape["* dim0, * dim1"], Any],
@ -150,7 +150,7 @@ class Image(NWBData):
None, description="""Pixel resolution of the image, in pixels per centimeter."""
)
description: Optional[str] = Field(None, description="""Description of the image.""")
array: Optional[
value: Optional[
Union[
NDArray[Shape["* x, * y"], float],
NDArray[Shape["* x, * y, 3 r_g_b"], float],
@ -169,8 +169,14 @@ class ImageReferences(NWBData):
)
name: str = Field(...)
image: List[Image] = Field(
..., description="""Ordered dataset of references to Image objects."""
value: List[Image] = Field(
...,
description="""Ordered dataset of references to Image objects.""",
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "reference"}}
}
},
)
@ -275,7 +281,7 @@ class TimeSeriesData(ConfiguredBaseModel):
None,
description="""Optionally describe the continuity of the data. Can be \"continuous\", \"instantaneous\", or \"step\". For example, a voltage trace would be \"continuous\", because samples are recorded from a continuous process. An array of lick times would be \"instantaneous\", because the data represents distinct moments in time. Times of image presentations would be \"step\" because the picture remains the same until the next timepoint. This field is optional, but is useful in providing information about the underlying data. It may inform the way this data is interpreted, the way it is visualized, and what analysis methods are applicable.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], Any],
NDArray[Shape["* num_times, * num_dim2"], Any],
@ -327,7 +333,7 @@ class ProcessingModule(NWBContainer):
{"from_schema": "core.nwb.base", "tree_root": True}
)
children: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
value: Optional[List[Union[DynamicTable, NWBDataInterface]]] = Field(
None,
json_schema_extra={
"linkml_meta": {"any_of": [{"range": "NWBDataInterface"}, {"range": "DynamicTable"}]}
@ -354,7 +360,12 @@ class Images(NWBDataInterface):
None,
description="""Ordered dataset of references to Image objects stored in the parent group. Each Image object in the Images group should be stored once and only once, so the dataset should have the same length as the number of images.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)

View file

@ -131,7 +131,7 @@ class SpatialSeriesData(ConfiguredBaseModel):
None,
description="""Base unit of measurement for working with the data. The default value is 'meters'. Actual stored values are not necessarily stored in these units. To access the data in these units, multiply 'data' by 'conversion' and add 'offset'.""",
)
array: Optional[
value: Optional[
Union[
NDArray[Shape["* num_times"], float],
NDArray[Shape["* num_times, 1 x"], float],
@ -150,7 +150,7 @@ class BehavioralEpochs(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[IntervalSeries]] = Field(
value: Optional[List[IntervalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "IntervalSeries"}]}}
)
name: str = Field(...)
@ -165,7 +165,7 @@ class BehavioralEvents(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -180,7 +180,7 @@ class BehavioralTimeSeries(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -195,7 +195,7 @@ class PupilTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[TimeSeries]] = Field(
value: Optional[List[TimeSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "TimeSeries"}]}}
)
name: str = Field(...)
@ -210,7 +210,7 @@ class EyeTracking(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -225,7 +225,7 @@ class CompassDirection(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)
@ -240,7 +240,7 @@ class Position(NWBDataInterface):
{"from_schema": "core.nwb.behavior", "tree_root": True}
)
children: Optional[List[SpatialSeries]] = Field(
value: Optional[List[SpatialSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpatialSeries"}]}}
)
name: str = Field(...)

View file

@ -16,6 +16,7 @@ from pydantic import (
ValidationInfo,
BeforeValidator,
)
from ...core.v2_6_0_alpha.core_nwb_device import Device
from ...core.v2_6_0_alpha.core_nwb_base import (
TimeSeries,
TimeSeriesStartingTime,
@ -120,7 +121,12 @@ class ElectricalSeries(TimeSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -187,7 +193,12 @@ class SpikeEventSeries(ElectricalSeries):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
channel_conversion: Optional[NDArray[Shape["* num_channels"], float]] = Field(
@ -264,7 +275,12 @@ class FeatureExtraction(NWBDataInterface):
...,
description="""DynamicTableRegion pointer to the electrodes that this time series was generated from.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
@ -295,6 +311,15 @@ class EventDetection(NWBDataInterface):
description="""Timestamps of events, in seconds.""",
json_schema_extra={"linkml_meta": {"array": {"dimensions": [{"alias": "num_events"}]}}},
)
source_electricalseries: Union[ElectricalSeries, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "ElectricalSeries"}, {"range": "string"}],
}
},
)
class EventWaveform(NWBDataInterface):
@ -306,7 +331,7 @@ class EventWaveform(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[SpikeEventSeries]] = Field(
value: Optional[List[SpikeEventSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "SpikeEventSeries"}]}}
)
name: str = Field(...)
@ -321,7 +346,7 @@ class FilteredEphys(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -336,7 +361,7 @@ class LFP(NWBDataInterface):
{"from_schema": "core.nwb.ecephys", "tree_root": True}
)
children: Optional[List[ElectricalSeries]] = Field(
value: Optional[List[ElectricalSeries]] = Field(
None, json_schema_extra={"linkml_meta": {"any_of": [{"range": "ElectricalSeries"}]}}
)
name: str = Field(...)
@ -360,6 +385,15 @@ class ElectrodeGroup(NWBContainer):
position: Optional[ElectrodeGroupPosition] = Field(
None, description="""stereotaxic or common framework coordinates"""
)
device: Union[Device, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Device"}, {"range": "string"}],
}
},
)
class ElectrodeGroupPosition(ConfiguredBaseModel):
@ -414,6 +448,15 @@ class ClusterWaveforms(NWBDataInterface):
}
},
)
clustering_interface: Union[Clustering, str] = Field(
...,
json_schema_extra={
"linkml_meta": {
"annotations": {"source_type": {"tag": "source_type", "value": "link"}},
"any_of": [{"range": "Clustering"}, {"range": "string"}],
}
},
)
class Clustering(NWBDataInterface):

View file

@ -127,21 +127,36 @@ class TimeIntervals(DynamicTable):
None,
description="""Index for tags.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
timeseries: Named[Optional[TimeSeriesReferenceVectorData]] = Field(
None,
description="""An index into a TimeSeries object.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
timeseries_index: Named[Optional[VectorIndex]] = Field(
None,
description="""Index for timeseries.""",
json_schema_extra={
"linkml_meta": {"annotations": {"named": {"tag": "named", "value": True}}}
"linkml_meta": {
"annotations": {
"named": {"tag": "named", "value": True},
"source_type": {"tag": "source_type", "value": "neurodata_type_inc"},
}
}
},
)
colnames: Optional[str] = Field(

Some files were not shown because too many files have changed in this diff Show more